diff --git a/pom.xml b/pom.xml
index 5b6d266f1..32c40afc2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -457,7 +457,7 @@
de.bixilon
kutil
- 1.1
+ 1.3
diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.kt b/src/main/java/de/bixilon/minosoft/Minosoft.kt
index 7d863670e..86b52e837 100644
--- a/src/main/java/de/bixilon/minosoft/Minosoft.kt
+++ b/src/main/java/de/bixilon/minosoft/Minosoft.kt
@@ -19,6 +19,7 @@ import de.bixilon.kutil.concurrent.worker.tasks.Task
import de.bixilon.kutil.file.watcher.FileWatcherService
import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.os.OSUtil
+import de.bixilon.kutil.reflection.ReflectionUtil.forceInit
import de.bixilon.minosoft.assets.file.ResourcesAssetsUtil
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties
import de.bixilon.minosoft.config.profile.GlobalProfileManager
@@ -43,8 +44,8 @@ import de.bixilon.minosoft.terminal.CLI
import de.bixilon.minosoft.terminal.CommandLineArguments
import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.GitInfo
+import de.bixilon.minosoft.util.KUtil
import de.bixilon.minosoft.util.RenderPolling
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.YggdrasilUtil
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
@@ -61,7 +62,7 @@ object Minosoft {
@JvmStatic
fun main(args: Array) {
CommandLineArguments.parse(args)
- Util.initUtilClasses()
+ KUtil.initUtilClasses()
MINOSOFT_ASSETS_MANAGER.load(CountUpAndDownLatch(0))
Log.log(LogMessageType.OTHER, LogLevels.INFO) { "Starting minosoft" }
@@ -123,7 +124,7 @@ object Minosoft {
taskWorker += Task(identifier = StartupTasks.STARTUP_PROGRESS, executor = { StartingDialog(START_UP_LATCH).show() }, dependencies = arrayOf(StartupTasks.LOAD_LANGUAGE_FILES, StartupTasks.INITIALIZE_JAVAFX))
- Util.forceClassInit(Eros::class.java)
+ Eros::class.java.forceInit()
}
taskWorker += Task(identifier = StartupTasks.LOAD_YGGDRASIL, executor = { YggdrasilUtil.load() })
diff --git a/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt
index 3d8724603..9935354cc 100644
--- a/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt
+++ b/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt
@@ -15,6 +15,7 @@ package de.bixilon.minosoft.assets.minecraft
import com.fasterxml.jackson.databind.JsonNode
import de.bixilon.kutil.latch.CountUpAndDownLatch
+import de.bixilon.kutil.string.StringUtil.format
import de.bixilon.minosoft.assets.InvalidAssetException
import de.bixilon.minosoft.assets.util.FileAssetsUtil
import de.bixilon.minosoft.assets.util.FileUtil
@@ -26,7 +27,6 @@ import de.bixilon.minosoft.data.registries.versions.Version
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.generalize
import de.bixilon.minosoft.util.KUtil.toResourceLocation
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.json.Jackson
import org.kamranzafar.jtar.TarEntry
import org.kamranzafar.jtar.TarHeader
@@ -62,7 +62,7 @@ class JarAssetsManager(
} else {
var clientJar = FileUtil.safeReadFile(File(FileAssetsUtil.getPath(clientJarHash)), false)?.readZipArchive()
if (clientJar == null) {
- val downloaded = FileAssetsUtil.downloadAndGetAsset(Util.formatString(profile.source.launcherPackages, mapOf(
+ val downloaded = FileAssetsUtil.downloadAndGetAsset(profile.source.launcherPackages.format(mapOf(
"fullHash" to clientJarHash,
"filename" to "client.jar",
)), false, FileAssetsUtil.HashTypes.SHA1)
diff --git a/src/main/java/de/bixilon/minosoft/assets/minecraft/index/IndexAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/minecraft/index/IndexAssetsManager.kt
index fa3df17cd..cef3e993e 100644
--- a/src/main/java/de/bixilon/minosoft/assets/minecraft/index/IndexAssetsManager.kt
+++ b/src/main/java/de/bixilon/minosoft/assets/minecraft/index/IndexAssetsManager.kt
@@ -19,6 +19,7 @@ import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable
import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.primitive.LongUtil.toLong
+import de.bixilon.kutil.string.StringUtil.format
import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsManager
import de.bixilon.minosoft.assets.util.FileAssetsUtil
import de.bixilon.minosoft.assets.util.FileAssetsUtil.toAssetName
@@ -28,7 +29,6 @@ import de.bixilon.minosoft.config.StaticConfiguration
import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.json.Jackson
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
@@ -55,11 +55,10 @@ class IndexAssetsManager(
private set
private fun downloadAssetsIndex(): Map {
- return Jackson.MAPPER.readValue(FileAssetsUtil.downloadAndGetAsset(Util.formatString(profile.source.mojangPackages,
- mapOf(
- "fullHash" to indexHash,
- "filename" to "$assetsVersion.json",
- )), hashType = FileAssetsUtil.HashTypes.SHA1).second, Jackson.JSON_MAP_TYPE)
+ return Jackson.MAPPER.readValue(FileAssetsUtil.downloadAndGetAsset(profile.source.mojangPackages.format(mapOf(
+ "fullHash" to indexHash,
+ "filename" to "$assetsVersion.json",
+ )), hashType = FileAssetsUtil.HashTypes.SHA1).second, Jackson.JSON_MAP_TYPE)
}
fun verifyAsset(hash: String) {
@@ -67,11 +66,10 @@ class IndexAssetsManager(
if (FileAssetsUtil.verifyAsset(hash, file, verify, hashType = FileAssetsUtil.HashTypes.SHA1)) {
return
}
- val url = Util.formatString(profile.source.minecraftResources,
- mapOf(
- "hashPrefix" to hash.substring(0, 2),
- "fullHash" to hash,
- ))
+ val url = profile.source.minecraftResources.format(mapOf(
+ "hashPrefix" to hash.substring(0, 2),
+ "fullHash" to hash,
+ ))
Log.log(LogMessageType.ASSETS, LogLevels.VERBOSE) { "Downloading asset $url" }
val downloadedHash = FileAssetsUtil.downloadAsset(url, hashType = FileAssetsUtil.HashTypes.SHA1)
if (downloadedHash != hash) {
diff --git a/src/main/java/de/bixilon/minosoft/assets/util/FileAssetsUtil.kt b/src/main/java/de/bixilon/minosoft/assets/util/FileAssetsUtil.kt
index 154c9a170..7b9f541c4 100644
--- a/src/main/java/de/bixilon/minosoft/assets/util/FileAssetsUtil.kt
+++ b/src/main/java/de/bixilon/minosoft/assets/util/FileAssetsUtil.kt
@@ -15,11 +15,13 @@ package de.bixilon.minosoft.assets.util
import com.github.luben.zstd.ZstdInputStream
import com.github.luben.zstd.ZstdOutputStream
+import de.bixilon.kutil.array.ByteArrayUtil.toHex
import de.bixilon.kutil.hex.HexUtil.isHexString
+import de.bixilon.kutil.random.RandomStringUtil.randomString
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.terminal.RunConfiguration
-import de.bixilon.minosoft.util.Util
+import de.bixilon.minosoft.util.KUtil
import java.io.*
import java.net.URL
import java.nio.file.Files
@@ -47,7 +49,7 @@ object FileAssetsUtil {
fun saveAndGet(stream: InputStream, compress: Boolean = true, get: Boolean = true, hashType: HashTypes = HashTypes.SHA256): Pair {
var tempFile: File
do {
- tempFile = File(RunConfiguration.TEMPORARY_FOLDER + Util.generateRandomString(32))
+ tempFile = File(RunConfiguration.TEMPORARY_FOLDER + KUtil.RANDOM.randomString(32))
} while (tempFile.exists())
tempFile.parentFile.apply {
mkdirs()
@@ -80,7 +82,7 @@ object FileAssetsUtil {
}
}
output.close()
- val hash = Util.byteArrayToHexString(digest.digest())
+ val hash = digest.digest().toHex()
val file = File(getPath(hash))
if (file.exists()) {
@@ -157,7 +159,7 @@ object FileAssetsUtil {
}
digest.update(buffer, 0, length)
}
- val equals = hash == Util.byteArrayToHexString(digest.digest())
+ val equals = hash == digest.digest().toHex()
if (!equals) {
file.delete()
}
diff --git a/src/main/java/de/bixilon/minosoft/config/profile/GlobalProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/GlobalProfileManager.kt
index 460359beb..98cbbcdad 100644
--- a/src/main/java/de/bixilon/minosoft/config/profile/GlobalProfileManager.kt
+++ b/src/main/java/de/bixilon/minosoft/config/profile/GlobalProfileManager.kt
@@ -8,6 +8,7 @@ import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.concurrent.time.TimeWorker
import de.bixilon.kutil.concurrent.time.TimeWorkerTask
import de.bixilon.kutil.file.FileUtil
+import de.bixilon.kutil.file.FileUtil.read
import de.bixilon.minosoft.config.profile.profiles.Profile
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager
import de.bixilon.minosoft.config.profile.profiles.audio.AudioProfileManager
@@ -24,7 +25,6 @@ import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfileMan
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
import de.bixilon.minosoft.terminal.RunConfiguration
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.json.Jackson
import java.io.File
@@ -74,7 +74,7 @@ object GlobalProfileManager {
}
this.selectedProfiles.original.clear()
- this.selectedProfiles.original.putAll(Jackson.MAPPER.readValue(Util.readFile(file.path), SELECTED_PROFILES_TYPE))
+ this.selectedProfiles.original.putAll(Jackson.MAPPER.readValue(file.read(), SELECTED_PROFILES_TYPE))
} finally {
selectedProfiles.lock.unlock()
}
diff --git a/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt
index 610f891ac..c7eb35ed7 100644
--- a/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt
+++ b/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt
@@ -4,6 +4,7 @@ import com.google.common.collect.HashBiMap
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.exception.ExceptionUtil.tryCatch
import de.bixilon.kutil.file.FileUtil
+import de.bixilon.kutil.file.FileUtil.read
import de.bixilon.kutil.file.watcher.FileWatcher
import de.bixilon.kutil.file.watcher.FileWatcherService
import de.bixilon.kutil.primitive.IntUtil.toInt
@@ -16,7 +17,6 @@ import de.bixilon.minosoft.config.profile.profiles.Profile
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
import de.bixilon.minosoft.terminal.RunConfiguration
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.json.Jackson
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
@@ -238,7 +238,7 @@ interface ProfileManager {
fun readAndMigrate(path: String): Pair?> {
var saveFile = false
val json: MutableMap?
- val jsonString = tryCatch(FileNotFoundException::class.java) { Util.readFile(path) }
+ val jsonString = tryCatch(FileNotFoundException::class.java) { File(path).read() }
if (jsonString != null) {
json = Jackson.MAPPER.readValue(jsonString, Jackson.JSON_MAP_TYPE)!!
val version = json["version"]?.toInt() ?: throw IllegalArgumentException("Can not find version attribute in profile: $path")
diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/account/AccountProfile.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/account/AccountProfile.kt
index 861f312d7..189547039 100644
--- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/account/AccountProfile.kt
+++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/account/AccountProfile.kt
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.annotation.JsonProperty
import de.bixilon.kutil.cast.CastUtil.unsafeCast
+import de.bixilon.kutil.random.RandomStringUtil.randomString
import de.bixilon.minosoft.config.profile.ProfileManager
import de.bixilon.minosoft.config.profile.profiles.Profile
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.backingDelegate
@@ -11,7 +12,7 @@ import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.latestVersion
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.mapDelegate
import de.bixilon.minosoft.data.accounts.Account
-import de.bixilon.minosoft.util.Util
+import de.bixilon.minosoft.util.KUtil
/**
* Profile for accounts
@@ -33,7 +34,7 @@ class AccountProfile(
* This 128 length long string is generated randomly while the profile was created
* Will be sent to mojang when logging in/refreshing an account
*/
- var clientToken by delegate(Util.generateRandomString(128))
+ var clientToken by delegate(KUtil.RANDOM.randomString(128))
/**
* All accounts
diff --git a/src/main/java/de/bixilon/minosoft/data/player/properties/PlayerProperties.kt b/src/main/java/de/bixilon/minosoft/data/player/properties/PlayerProperties.kt
index 230527376..e28ac6a24 100644
--- a/src/main/java/de/bixilon/minosoft/data/player/properties/PlayerProperties.kt
+++ b/src/main/java/de/bixilon/minosoft/data/player/properties/PlayerProperties.kt
@@ -5,7 +5,6 @@ import de.bixilon.kutil.json.JsonUtil.toJsonList
import de.bixilon.kutil.uuid.UUIDUtil.trim
import de.bixilon.minosoft.assets.util.FileUtil.readJsonObject
import de.bixilon.minosoft.data.player.properties.textures.PlayerTextures
-import de.bixilon.minosoft.util.Util
import java.net.URL
import java.util.*
@@ -19,7 +18,7 @@ class PlayerProperties(
fun fetch(uuid: UUID): PlayerProperties {
- val url = Util.formatString(URL, mapOf("uuid" to uuid.trim()))
+ val url = URL.format(mapOf("uuid" to uuid.trim()))
val data = URL(url).openStream().readJsonObject()
var textures: PlayerTextures? = null
diff --git a/src/main/java/de/bixilon/minosoft/data/registries/ResourceLocation.kt b/src/main/java/de/bixilon/minosoft/data/registries/ResourceLocation.kt
index 1c94c81fc..cb605ac8d 100644
--- a/src/main/java/de/bixilon/minosoft/data/registries/ResourceLocation.kt
+++ b/src/main/java/de/bixilon/minosoft/data/registries/ResourceLocation.kt
@@ -12,9 +12,9 @@
*/
package de.bixilon.minosoft.data.registries
+import de.bixilon.kutil.string.StringUtil.isLowercase
import de.bixilon.minosoft.data.registries.registries.registry.Translatable
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
-import de.bixilon.minosoft.util.Util
import java.util.*
open class ResourceLocation(
@@ -77,7 +77,7 @@ open class ResourceLocation(
// if (!ProtocolDefinition.RESOURCE_LOCATION_PATTERN.matcher(resourceLocation).matches()) {
// throw new IllegalArgumentException(String.format("%s in not a valid resource location!", resourceLocation));
// }
- return if (Util.doesStringContainsUppercaseLetters(resourceLocation)) {
+ return if (!resourceLocation.isLowercase()) {
// just a string but wrapped into a resourceLocation (like old plugin channels MC|BRAND or ...)
LegacyResourceLocation(resourceLocation)
} else ResourceLocation(resourceLocation)
diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/RegistriesLoader.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/RegistriesLoader.kt
index f68bbfbec..31d791f7f 100644
--- a/src/main/java/de/bixilon/minosoft/data/registries/registries/RegistriesLoader.kt
+++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/RegistriesLoader.kt
@@ -1,12 +1,12 @@
package de.bixilon.minosoft.data.registries.registries
+import de.bixilon.kutil.string.StringUtil.format
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties
import de.bixilon.minosoft.assets.util.FileAssetsUtil
import de.bixilon.minosoft.assets.util.FileUtil
import de.bixilon.minosoft.assets.util.FileUtil.readMBFMap
import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile
import de.bixilon.minosoft.data.registries.versions.Version
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import java.io.ByteArrayInputStream
import java.io.File
@@ -33,12 +33,10 @@ object RegistriesLoader {
return FileUtil.readFile(file, false).readMBFMap().compoundCast() ?: throw IllegalStateException("Could not read pixlyzer data!")
}
- val savedHash = FileAssetsUtil.downloadAndGetAsset(Util.formatString(
- url,
- mapOf(
- "hashPrefix" to hash.substring(0, 2),
- "fullHash" to hash,
- )
+ val savedHash = FileAssetsUtil.downloadAndGetAsset(url.format(mapOf(
+ "hashPrefix" to hash.substring(0, 2),
+ "fullHash" to hash,
+ )
), false, hashType = FileAssetsUtil.HashTypes.SHA1)
if (savedHash.first != hash) {
throw IllegalStateException("Data mismatch, expected $hash, got ${savedHash.first}")
diff --git a/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt b/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt
index 0fdf89bd5..18af8309c 100644
--- a/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt
+++ b/src/main/java/de/bixilon/minosoft/data/text/TextComponent.kt
@@ -20,7 +20,6 @@ import de.bixilon.minosoft.gui.eros.dialog.ErosErrorReport.Companion.report
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.file
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.hyperlink
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
-import de.bixilon.minosoft.util.Util
import javafx.animation.Animation
import javafx.animation.KeyFrame
import javafx.animation.Timeline
@@ -147,7 +146,7 @@ open class TextComponent(
KeyFrame(Duration.millis(50.0), {
val chars = text.text.toCharArray()
for (i in chars.indices) {
- chars[i] = Util.getRandomChar(ProtocolDefinition.OBFUSCATED_CHARS)
+ chars[i] = ProtocolDefinition.OBFUSCATED_CHARS.random()
}
text.text = String(chars)
}),
diff --git a/src/main/java/de/bixilon/minosoft/data/text/events/ClickEvent.kt b/src/main/java/de/bixilon/minosoft/data/text/events/ClickEvent.kt
index b9aad1e32..419768410 100644
--- a/src/main/java/de/bixilon/minosoft/data/text/events/ClickEvent.kt
+++ b/src/main/java/de/bixilon/minosoft/data/text/events/ClickEvent.kt
@@ -14,7 +14,8 @@ package de.bixilon.minosoft.data.text.events
import de.bixilon.kutil.enums.EnumUtil
import de.bixilon.kutil.enums.ValuesEnum
-import de.bixilon.minosoft.util.Util
+import de.bixilon.kutil.url.URLUtil.checkWeb
+import de.bixilon.kutil.url.URLUtil.toURL
class ClickEvent {
val action: ClickEventActions
@@ -28,7 +29,7 @@ class ClickEvent {
return
}
if (action == ClickEventActions.OPEN_URL) {
- Util.checkURL(value.toString())
+ value.toString().toURL().checkWeb()
}
check(action != ClickEventActions.OPEN_CONFIRMATION) { "Can not use OPEN_CONFIRMATION in restricted mode!" }
check(action != ClickEventActions.OPEN_FILE) { "Can not use OPEN_FILE in restricted mode!" }
diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/crash/ErosCrashReport.kt b/src/main/java/de/bixilon/minosoft/gui/eros/crash/ErosCrashReport.kt
index f9c34ac5b..ae1f3d689 100644
--- a/src/main/java/de/bixilon/minosoft/gui/eros/crash/ErosCrashReport.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/eros/crash/ErosCrashReport.kt
@@ -19,6 +19,7 @@ import de.bixilon.kutil.exception.ExceptionUtil.toStackTrace
import de.bixilon.kutil.exception.ExceptionUtil.tryCatch
import de.bixilon.kutil.file.FileUtil.slashPath
import de.bixilon.kutil.file.watcher.FileWatcherService
+import de.bixilon.kutil.hash.HashUtil.sha1
import de.bixilon.kutil.os.OSUtil
import de.bixilon.kutil.time.TimeUtil
import de.bixilon.kutil.unit.UnitFormatter.formatBytes
@@ -33,7 +34,6 @@ import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.GitInfo
import de.bixilon.minosoft.util.ShutdownManager
import de.bixilon.minosoft.util.SystemInformation
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
@@ -225,7 +225,7 @@ ${exception?.toStackTrace() ?: ""}
${GitInfo.formatForCrashReport()}
""".trimIndent()
- val hash = Util.sha1(stack.toByteArray(StandardCharsets.UTF_8))
+ val hash = stack.toByteArray(StandardCharsets.UTF_8).sha1()
return """
$stack
diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/FaviconManager.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/FaviconManager.kt
index 0b576bd22..a0de04e24 100644
--- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/FaviconManager.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/FaviconManager.kt
@@ -1,10 +1,10 @@
package de.bixilon.minosoft.gui.eros.main.play.server.card
import com.github.luben.zstd.ZstdOutputStream
+import de.bixilon.kutil.hash.HashUtil.sha256
import de.bixilon.minosoft.assets.util.FileAssetsUtil
import de.bixilon.minosoft.assets.util.FileUtil
import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server
-import de.bixilon.minosoft.util.Util
import javafx.scene.image.Image
import java.io.File
import java.io.FileOutputStream
@@ -22,7 +22,7 @@ object FaviconManager {
return null
}
- fun Server.saveFavicon(favicon: ByteArray?, faviconHash: String = Util.sha256(favicon)) {
+ fun Server.saveFavicon(favicon: ByteArray?, faviconHash: String = favicon!!.sha256()) {
if (this.faviconHash == faviconHash) {
return
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/ScreenshotTaker.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/ScreenshotTaker.kt
index ba5e70fb0..1c020c4b7 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/ScreenshotTaker.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/ScreenshotTaker.kt
@@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.util
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable
+import de.bixilon.kutil.file.FileUtil.createParent
import de.bixilon.kutil.file.FileUtil.slashPath
import de.bixilon.kutil.time.TimeUtil
import de.bixilon.minosoft.data.text.BaseComponent
@@ -26,7 +27,6 @@ import de.bixilon.minosoft.data.text.events.HoverEvent
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.system.base.PixelTypes
import de.bixilon.minosoft.terminal.RunConfiguration
-import de.bixilon.minosoft.util.Util
import glm_.vec2.Vec2i
import java.awt.image.BufferedImage
import java.io.File
@@ -68,7 +68,7 @@ class ScreenshotTaker(
}
val file = File(path)
- Util.createParentFolderIfNotExist(file)
+ file.createParent()
ImageIO.write(bufferedImage, "png", file)
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ResourcepackRequestS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ResourcepackRequestS2CP.kt
index 90b4c86fa..b2d7f5117 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ResourcepackRequestS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ResourcepackRequestS2CP.kt
@@ -12,6 +12,8 @@
*/
package de.bixilon.minosoft.protocol.packets.s2c.play
+import de.bixilon.kutil.url.URLUtil.checkWeb
+import de.bixilon.kutil.url.URLUtil.toURL
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.modding.event.events.ResourcePackRequestEvent
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
@@ -19,13 +21,12 @@ import de.bixilon.minosoft.protocol.packets.c2s.play.ResourcePackStatusC2SP
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
class ResourcepackRequestS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
- val url: String = Util.checkURL(buffer.readString())
+ val url: String = buffer.readString().apply { toURL().checkWeb() }
val hash: String = buffer.readString()
val forced = if (buffer.versionId >= ProtocolVersions.V_20W45A) {
buffer.readBoolean()
diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/LANServerListener.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/LANServerListener.kt
index ccc129ae0..d244fb1d4 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/protocol/LANServerListener.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/LANServerListener.kt
@@ -14,6 +14,7 @@ package de.bixilon.minosoft.protocol.protocol
import com.google.common.collect.HashBiMap
import de.bixilon.kutil.latch.CountUpAndDownLatch
+import de.bixilon.kutil.string.StringUtil.getBetween
import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatch
import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server
import de.bixilon.minosoft.config.profile.profiles.other.OtherProfileManager
@@ -22,7 +23,6 @@ import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.gui.eros.main.play.server.type.types.LANServerType
import de.bixilon.minosoft.modding.event.events.LANServerDiscoverEvent
import de.bixilon.minosoft.modding.event.master.GlobalEventMaster
-import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
@@ -120,14 +120,14 @@ object LANServerListener {
for (mustContain in BROADCAST_MUST_CONTAIN) {
require(broadcast.contains(mustContain)) { "Broadcast is invalid!" }
}
- var rawAddress = Util.getStringBetween(broadcast, PORT_START_STRING, PORT_END_STRING)
+ var rawAddress = broadcast.getBetween(PORT_START_STRING, PORT_END_STRING)
if (rawAddress.contains(":")) {
// weird, just extract the port
rawAddress = rawAddress.split(":").toTypedArray()[1]
}
val port = rawAddress.toInt()
require(!(port < 0 || port > 65535)) { "Invalid port: $port" }
- val motd = Util.getStringBetween(broadcast, MOTD_START_STRING, MOTD_END_STRING)
+ val motd = broadcast.getBetween(MOTD_START_STRING, MOTD_END_STRING)
return Server(address = address.hostAddress + ":" + rawAddress, name = BaseComponent("LAN: #${SERVERS.size}: ", ChatComponent.of(motd)))
}
diff --git a/src/main/java/de/bixilon/minosoft/util/KUtil.kt b/src/main/java/de/bixilon/minosoft/util/KUtil.kt
index 8438cafbb..7924c6601 100644
--- a/src/main/java/de/bixilon/minosoft/util/KUtil.kt
+++ b/src/main/java/de/bixilon/minosoft/util/KUtil.kt
@@ -17,7 +17,9 @@ import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.collections.CollectionUtil.synchronizedListOf
import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf
import de.bixilon.kutil.collections.CollectionUtil.synchronizedSetOf
+import de.bixilon.kutil.concurrent.time.TimeWorker
import de.bixilon.kutil.primitive.BooleanUtil.decide
+import de.bixilon.kutil.reflection.ReflectionUtil.forceInit
import de.bixilon.kutil.reflection.ReflectionUtil.realName
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.inventory.ItemStack
@@ -29,7 +31,10 @@ import de.bixilon.minosoft.data.text.TextComponent
import de.bixilon.minosoft.data.text.TextFormattable
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
+import de.bixilon.minosoft.util.account.microsoft.MicrosoftOAuthUtils
import de.bixilon.minosoft.util.json.Jackson
+import de.bixilon.minosoft.util.logging.Log
+import de.bixilon.minosoft.util.url.URLProtocolStreamHandlers
import glm_.vec2.Vec2t
import glm_.vec3.Vec3t
import glm_.vec4.Vec4t
@@ -38,6 +43,7 @@ import java.util.*
object KUtil {
+ val RANDOM = Random()
fun bitSetOf(long: Long): BitSet {
return BitSet.valueOf(longArrayOf(long))
@@ -229,4 +235,13 @@ object KUtil {
userName = StringBuffer("nobody")
groupName = StringBuffer("nobody")
}
+
+
+ fun initUtilClasses() {
+ Log::class.java.forceInit()
+ URLProtocolStreamHandlers::class.java.forceInit()
+ MicrosoftOAuthUtils::class.java.forceInit()
+ TimeWorker::class.java.forceInit()
+ ShutdownManager::class.java.forceInit()
+ }
}
diff --git a/src/main/java/de/bixilon/minosoft/util/Util.java b/src/main/java/de/bixilon/minosoft/util/Util.java
index a4c34c020..9fedb519f 100644
--- a/src/main/java/de/bixilon/minosoft/util/Util.java
+++ b/src/main/java/de/bixilon/minosoft/util/Util.java
@@ -17,25 +17,22 @@ import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonReader;
-import de.bixilon.kutil.concurrent.time.TimeWorker;
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection;
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
-import de.bixilon.minosoft.util.account.microsoft.MicrosoftOAuthUtils;
-import de.bixilon.minosoft.util.logging.Log;
-import de.bixilon.minosoft.util.url.URLProtocolStreamHandlers;
import org.jetbrains.annotations.NotNull;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
-import java.util.zip.*;
+import java.util.zip.DataFormatException;
+import java.util.zip.Deflater;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.Inflater;
@Deprecated(forRemoval = true)
public final class Util {
@@ -115,61 +112,6 @@ public final class Util {
return ret;
}
- public static String sha1(byte[] data) {
- ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
- try {
- return sha1(inputStream);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- public static String sha256(byte[] data) {
- ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
- try {
- return sha256(inputStream);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- public static String sha1(InputStream inputStream) throws IOException {
- try {
- return hash(MessageDigest.getInstance("SHA-1"), inputStream);
- } catch (NoSuchAlgorithmException | FileNotFoundException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
-
- private static String hash(MessageDigest digest, InputStream inputStream) throws IOException {
- byte[] buffer = new byte[ProtocolDefinition.DEFAULT_BUFFER_SIZE];
- int length;
- while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {
- digest.update(buffer, 0, length);
- }
- return byteArrayToHexString(digest.digest());
- }
-
- public static String sha256(InputStream inputStream) throws IOException {
- try {
- return hash(MessageDigest.getInstance("SHA-256"), inputStream);
- } catch (NoSuchAlgorithmException | FileNotFoundException e) {
- e.printStackTrace();
- throw new RuntimeException(e);
- }
- }
-
- public static String byteArrayToHexString(byte[] b) {
- StringBuilder result = new StringBuilder();
- for (byte value : b) {
- result.append(Integer.toString((value & 0xff) + 0x100, 16).substring(1));
- }
- return result.toString();
- }
-
public static String readReader(BufferedReader reader, boolean closeStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
String line;
@@ -186,52 +128,6 @@ public final class Util {
return stringBuilder.toString();
}
- public static InputStreamReader getInputSteamFromZip(String fileName, ZipFile zipFile) throws IOException {
- return new InputStreamReader(zipFile.getInputStream(zipFile.getEntry(fileName)));
- }
-
- public static String readFile(String fileName) throws IOException {
- FileReader reader = new FileReader(fileName);
- return readReader(new BufferedReader(reader), true);
- }
-
- public static void copyStream(InputStream inputStream, OutputStream output) throws IOException {
- byte[] buffer = new byte[ProtocolDefinition.DEFAULT_BUFFER_SIZE];
- int length;
- while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {
- output.write(buffer, 0, length);
- }
- inputStream.close();
- output.close();
- }
-
-
- public static boolean createParentFolderIfNotExist(File file) {
- return file.getParentFile().mkdirs();
- }
-
- @NotNull
- public static String generateRandomString(int length) {
- StringBuilder sb = new StringBuilder(length);
- for (int i = 0; i < length; i++) {
- sb.append(getRandomChar(RANDOM_STRING_CHARS));
- }
- return sb.toString();
- }
-
- public static char getRandomChar(char[] chars) {
- return chars[(RANDOM.nextInt(chars.length))];
- }
-
- public static String getStringBetween(String search, String first, String second) {
- String result = search.substring(search.indexOf(first) + first.length());
- return result.substring(0, result.indexOf(second));
- }
-
- public static boolean doesStringContainsUppercaseLetters(String string) {
- return !string.toLowerCase().equals(string);
- }
-
public static int getJsonReaderPosition(JsonReader jsonReader) {
try {
return JSON_READER_POS_FIELD.getInt(jsonReader) - JSON_READER_LINE_START_FIELD.getInt(jsonReader) + 1;
@@ -240,29 +136,6 @@ public final class Util {
}
}
- public static String checkURL(String url) {
- if (!url.startsWith("http://") && !url.startsWith("https://")) {
- throw new IllegalArgumentException("Not a valid url:" + url);
- }
- return url;
- }
-
- public static void forceClassInit(Class clazz) {
- try {
- Class.forName(clazz.getName(), true, clazz.getClassLoader());
- } catch (ClassNotFoundException exception) {
- throw new RuntimeException(exception);
- }
- }
-
- public static void initUtilClasses() {
- forceClassInit(Log.class);
- forceClassInit(URLProtocolStreamHandlers.class);
- forceClassInit(MicrosoftOAuthUtils.class);
- forceClassInit(TimeWorker.class);
- forceClassInit(ShutdownManager.class);
- }
-
public static Map urlQueryToMap(String query) {
Map map = new HashMap<>();
for (String parameter : query.split("&")) {
@@ -289,14 +162,6 @@ public final class Util {
return builder.toString();
}
- public static String formatString(String string, Map format) {
- String output = string;
- for (Map.Entry entry : format.entrySet()) {
- output = output.replace("${" + entry.getKey() + "}", entry.getValue().toString());
- }
- return output;
- }
-
@NotNull
@Deprecated
public static JsonObject readJsonFromStream(@NotNull InputStream stream, boolean close) throws IOException {