remove more Util functions, bump kutil to 1.3

This commit is contained in:
Bixilon 2021-12-29 19:17:33 +01:00
parent e3ee113b2b
commit 30da957baa
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
20 changed files with 72 additions and 192 deletions

View File

@ -457,7 +457,7 @@
<dependency> <dependency>
<groupId>de.bixilon</groupId> <groupId>de.bixilon</groupId>
<artifactId>kutil</artifactId> <artifactId>kutil</artifactId>
<version>1.1</version> <version>1.3</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -19,6 +19,7 @@ import de.bixilon.kutil.concurrent.worker.tasks.Task
import de.bixilon.kutil.file.watcher.FileWatcherService import de.bixilon.kutil.file.watcher.FileWatcherService
import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.os.OSUtil 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.file.ResourcesAssetsUtil
import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties
import de.bixilon.minosoft.config.profile.GlobalProfileManager 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.CommandLineArguments
import de.bixilon.minosoft.terminal.RunConfiguration import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.GitInfo import de.bixilon.minosoft.util.GitInfo
import de.bixilon.minosoft.util.KUtil
import de.bixilon.minosoft.util.RenderPolling import de.bixilon.minosoft.util.RenderPolling
import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.YggdrasilUtil import de.bixilon.minosoft.util.YggdrasilUtil
import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
@ -61,7 +62,7 @@ object Minosoft {
@JvmStatic @JvmStatic
fun main(args: Array<String>) { fun main(args: Array<String>) {
CommandLineArguments.parse(args) CommandLineArguments.parse(args)
Util.initUtilClasses() KUtil.initUtilClasses()
MINOSOFT_ASSETS_MANAGER.load(CountUpAndDownLatch(0)) MINOSOFT_ASSETS_MANAGER.load(CountUpAndDownLatch(0))
Log.log(LogMessageType.OTHER, LogLevels.INFO) { "Starting minosoft" } 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)) 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() }) taskWorker += Task(identifier = StartupTasks.LOAD_YGGDRASIL, executor = { YggdrasilUtil.load() })

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft.assets.minecraft
import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.JsonNode
import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.string.StringUtil.format
import de.bixilon.minosoft.assets.InvalidAssetException import de.bixilon.minosoft.assets.InvalidAssetException
import de.bixilon.minosoft.assets.util.FileAssetsUtil import de.bixilon.minosoft.assets.util.FileAssetsUtil
import de.bixilon.minosoft.assets.util.FileUtil 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.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.generalize import de.bixilon.minosoft.util.KUtil.generalize
import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.KUtil.toResourceLocation
import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.json.Jackson import de.bixilon.minosoft.util.json.Jackson
import org.kamranzafar.jtar.TarEntry import org.kamranzafar.jtar.TarEntry
import org.kamranzafar.jtar.TarHeader import org.kamranzafar.jtar.TarHeader
@ -62,7 +62,7 @@ class JarAssetsManager(
} else { } else {
var clientJar = FileUtil.safeReadFile(File(FileAssetsUtil.getPath(clientJarHash)), false)?.readZipArchive() var clientJar = FileUtil.safeReadFile(File(FileAssetsUtil.getPath(clientJarHash)), false)?.readZipArchive()
if (clientJar == null) { 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, "fullHash" to clientJarHash,
"filename" to "client.jar", "filename" to "client.jar",
)), false, FileAssetsUtil.HashTypes.SHA1) )), false, FileAssetsUtil.HashTypes.SHA1)

View File

@ -19,6 +19,7 @@ import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable
import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.primitive.LongUtil.toLong 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.minecraft.MinecraftAssetsManager
import de.bixilon.minosoft.assets.util.FileAssetsUtil import de.bixilon.minosoft.assets.util.FileAssetsUtil
import de.bixilon.minosoft.assets.util.FileAssetsUtil.toAssetName 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.config.profile.profiles.resources.ResourcesProfile
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition 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.json.Jackson
import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
@ -55,8 +55,7 @@ class IndexAssetsManager(
private set private set
private fun downloadAssetsIndex(): Map<String, Any> { private fun downloadAssetsIndex(): Map<String, Any> {
return Jackson.MAPPER.readValue(FileAssetsUtil.downloadAndGetAsset(Util.formatString(profile.source.mojangPackages, return Jackson.MAPPER.readValue(FileAssetsUtil.downloadAndGetAsset(profile.source.mojangPackages.format(mapOf(
mapOf(
"fullHash" to indexHash, "fullHash" to indexHash,
"filename" to "$assetsVersion.json", "filename" to "$assetsVersion.json",
)), hashType = FileAssetsUtil.HashTypes.SHA1).second, Jackson.JSON_MAP_TYPE) )), hashType = FileAssetsUtil.HashTypes.SHA1).second, Jackson.JSON_MAP_TYPE)
@ -67,8 +66,7 @@ class IndexAssetsManager(
if (FileAssetsUtil.verifyAsset(hash, file, verify, hashType = FileAssetsUtil.HashTypes.SHA1)) { if (FileAssetsUtil.verifyAsset(hash, file, verify, hashType = FileAssetsUtil.HashTypes.SHA1)) {
return return
} }
val url = Util.formatString(profile.source.minecraftResources, val url = profile.source.minecraftResources.format(mapOf(
mapOf(
"hashPrefix" to hash.substring(0, 2), "hashPrefix" to hash.substring(0, 2),
"fullHash" to hash, "fullHash" to hash,
)) ))

View File

@ -15,11 +15,13 @@ package de.bixilon.minosoft.assets.util
import com.github.luben.zstd.ZstdInputStream import com.github.luben.zstd.ZstdInputStream
import com.github.luben.zstd.ZstdOutputStream import com.github.luben.zstd.ZstdOutputStream
import de.bixilon.kutil.array.ByteArrayUtil.toHex
import de.bixilon.kutil.hex.HexUtil.isHexString 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.data.registries.ResourceLocation
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.terminal.RunConfiguration import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.Util import de.bixilon.minosoft.util.KUtil
import java.io.* import java.io.*
import java.net.URL import java.net.URL
import java.nio.file.Files 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<String, ByteArray> { fun saveAndGet(stream: InputStream, compress: Boolean = true, get: Boolean = true, hashType: HashTypes = HashTypes.SHA256): Pair<String, ByteArray> {
var tempFile: File var tempFile: File
do { do {
tempFile = File(RunConfiguration.TEMPORARY_FOLDER + Util.generateRandomString(32)) tempFile = File(RunConfiguration.TEMPORARY_FOLDER + KUtil.RANDOM.randomString(32))
} while (tempFile.exists()) } while (tempFile.exists())
tempFile.parentFile.apply { tempFile.parentFile.apply {
mkdirs() mkdirs()
@ -80,7 +82,7 @@ object FileAssetsUtil {
} }
} }
output.close() output.close()
val hash = Util.byteArrayToHexString(digest.digest()) val hash = digest.digest().toHex()
val file = File(getPath(hash)) val file = File(getPath(hash))
if (file.exists()) { if (file.exists()) {
@ -157,7 +159,7 @@ object FileAssetsUtil {
} }
digest.update(buffer, 0, length) digest.update(buffer, 0, length)
} }
val equals = hash == Util.byteArrayToHexString(digest.digest()) val equals = hash == digest.digest().toHex()
if (!equals) { if (!equals) {
file.delete() file.delete()
} }

View File

@ -8,6 +8,7 @@ import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.concurrent.time.TimeWorker import de.bixilon.kutil.concurrent.time.TimeWorker
import de.bixilon.kutil.concurrent.time.TimeWorkerTask import de.bixilon.kutil.concurrent.time.TimeWorkerTask
import de.bixilon.kutil.file.FileUtil 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.Profile
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager
import de.bixilon.minosoft.config.profile.profiles.audio.AudioProfileManager 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.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
import de.bixilon.minosoft.terminal.RunConfiguration import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.json.Jackson import de.bixilon.minosoft.util.json.Jackson
import java.io.File import java.io.File
@ -74,7 +74,7 @@ object GlobalProfileManager {
} }
this.selectedProfiles.original.clear() 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 { } finally {
selectedProfiles.lock.unlock() selectedProfiles.lock.unlock()
} }

View File

@ -4,6 +4,7 @@ import com.google.common.collect.HashBiMap
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.exception.ExceptionUtil.tryCatch import de.bixilon.kutil.exception.ExceptionUtil.tryCatch
import de.bixilon.kutil.file.FileUtil 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.FileWatcher
import de.bixilon.kutil.file.watcher.FileWatcherService import de.bixilon.kutil.file.watcher.FileWatcherService
import de.bixilon.kutil.primitive.IntUtil.toInt 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.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
import de.bixilon.minosoft.terminal.RunConfiguration import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.json.Jackson import de.bixilon.minosoft.util.json.Jackson
import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
@ -238,7 +238,7 @@ interface ProfileManager<T : Profile> {
fun readAndMigrate(path: String): Pair<Boolean, MutableMap<String, Any?>?> { fun readAndMigrate(path: String): Pair<Boolean, MutableMap<String, Any?>?> {
var saveFile = false var saveFile = false
val json: MutableMap<String, Any?>? val json: MutableMap<String, Any?>?
val jsonString = tryCatch(FileNotFoundException::class.java) { Util.readFile(path) } val jsonString = tryCatch(FileNotFoundException::class.java) { File(path).read() }
if (jsonString != null) { if (jsonString != null) {
json = Jackson.MAPPER.readValue(jsonString, Jackson.JSON_MAP_TYPE)!! json = Jackson.MAPPER.readValue(jsonString, Jackson.JSON_MAP_TYPE)!!
val version = json["version"]?.toInt() ?: throw IllegalArgumentException("Can not find version attribute in profile: $path") val version = json["version"]?.toInt() ?: throw IllegalArgumentException("Can not find version attribute in profile: $path")

View File

@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import de.bixilon.kutil.cast.CastUtil.unsafeCast 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.ProfileManager
import de.bixilon.minosoft.config.profile.profiles.Profile import de.bixilon.minosoft.config.profile.profiles.Profile
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.backingDelegate 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.latestVersion
import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.mapDelegate import de.bixilon.minosoft.config.profile.profiles.account.AccountProfileManager.mapDelegate
import de.bixilon.minosoft.data.accounts.Account import de.bixilon.minosoft.data.accounts.Account
import de.bixilon.minosoft.util.Util import de.bixilon.minosoft.util.KUtil
/** /**
* Profile for accounts * Profile for accounts
@ -33,7 +34,7 @@ class AccountProfile(
* This 128 length long string is generated randomly while the profile was created * This 128 length long string is generated randomly while the profile was created
* Will be sent to mojang when logging in/refreshing an account * 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 * All accounts

View File

@ -5,7 +5,6 @@ import de.bixilon.kutil.json.JsonUtil.toJsonList
import de.bixilon.kutil.uuid.UUIDUtil.trim import de.bixilon.kutil.uuid.UUIDUtil.trim
import de.bixilon.minosoft.assets.util.FileUtil.readJsonObject import de.bixilon.minosoft.assets.util.FileUtil.readJsonObject
import de.bixilon.minosoft.data.player.properties.textures.PlayerTextures import de.bixilon.minosoft.data.player.properties.textures.PlayerTextures
import de.bixilon.minosoft.util.Util
import java.net.URL import java.net.URL
import java.util.* import java.util.*
@ -19,7 +18,7 @@ class PlayerProperties(
fun fetch(uuid: UUID): 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() val data = URL(url).openStream().readJsonObject()
var textures: PlayerTextures? = null var textures: PlayerTextures? = null

View File

@ -12,9 +12,9 @@
*/ */
package de.bixilon.minosoft.data.registries 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.data.registries.registries.registry.Translatable
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.Util
import java.util.* import java.util.*
open class ResourceLocation( open class ResourceLocation(
@ -77,7 +77,7 @@ open class ResourceLocation(
// if (!ProtocolDefinition.RESOURCE_LOCATION_PATTERN.matcher(resourceLocation).matches()) { // if (!ProtocolDefinition.RESOURCE_LOCATION_PATTERN.matcher(resourceLocation).matches()) {
// throw new IllegalArgumentException(String.format("%s in not a valid resource location!", resourceLocation)); // 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 ...) // just a string but wrapped into a resourceLocation (like old plugin channels MC|BRAND or ...)
LegacyResourceLocation(resourceLocation) LegacyResourceLocation(resourceLocation)
} else ResourceLocation(resourceLocation) } else ResourceLocation(resourceLocation)

View File

@ -1,12 +1,12 @@
package de.bixilon.minosoft.data.registries.registries 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.properties.version.AssetsVersionProperties
import de.bixilon.minosoft.assets.util.FileAssetsUtil import de.bixilon.minosoft.assets.util.FileAssetsUtil
import de.bixilon.minosoft.assets.util.FileUtil import de.bixilon.minosoft.assets.util.FileUtil
import de.bixilon.minosoft.assets.util.FileUtil.readMBFMap import de.bixilon.minosoft.assets.util.FileUtil.readMBFMap
import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile import de.bixilon.minosoft.config.profile.profiles.resources.ResourcesProfile
import de.bixilon.minosoft.data.registries.versions.Version import de.bixilon.minosoft.data.registries.versions.Version
import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.File import java.io.File
@ -33,9 +33,7 @@ object RegistriesLoader {
return FileUtil.readFile(file, false).readMBFMap().compoundCast() ?: throw IllegalStateException("Could not read pixlyzer data!") return FileUtil.readFile(file, false).readMBFMap().compoundCast() ?: throw IllegalStateException("Could not read pixlyzer data!")
} }
val savedHash = FileAssetsUtil.downloadAndGetAsset(Util.formatString( val savedHash = FileAssetsUtil.downloadAndGetAsset(url.format(mapOf(
url,
mapOf(
"hashPrefix" to hash.substring(0, 2), "hashPrefix" to hash.substring(0, 2),
"fullHash" to hash, "fullHash" to hash,
) )

View File

@ -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.file
import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.hyperlink import de.bixilon.minosoft.gui.eros.util.JavaFXUtil.hyperlink
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.Util
import javafx.animation.Animation import javafx.animation.Animation
import javafx.animation.KeyFrame import javafx.animation.KeyFrame
import javafx.animation.Timeline import javafx.animation.Timeline
@ -147,7 +146,7 @@ open class TextComponent(
KeyFrame(Duration.millis(50.0), { KeyFrame(Duration.millis(50.0), {
val chars = text.text.toCharArray() val chars = text.text.toCharArray()
for (i in chars.indices) { for (i in chars.indices) {
chars[i] = Util.getRandomChar(ProtocolDefinition.OBFUSCATED_CHARS) chars[i] = ProtocolDefinition.OBFUSCATED_CHARS.random()
} }
text.text = String(chars) text.text = String(chars)
}), }),

View File

@ -14,7 +14,8 @@ package de.bixilon.minosoft.data.text.events
import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.EnumUtil
import de.bixilon.kutil.enums.ValuesEnum 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 { class ClickEvent {
val action: ClickEventActions val action: ClickEventActions
@ -28,7 +29,7 @@ class ClickEvent {
return return
} }
if (action == ClickEventActions.OPEN_URL) { 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_CONFIRMATION) { "Can not use OPEN_CONFIRMATION in restricted mode!" }
check(action != ClickEventActions.OPEN_FILE) { "Can not use OPEN_FILE in restricted mode!" } check(action != ClickEventActions.OPEN_FILE) { "Can not use OPEN_FILE in restricted mode!" }

View File

@ -19,6 +19,7 @@ import de.bixilon.kutil.exception.ExceptionUtil.toStackTrace
import de.bixilon.kutil.exception.ExceptionUtil.tryCatch import de.bixilon.kutil.exception.ExceptionUtil.tryCatch
import de.bixilon.kutil.file.FileUtil.slashPath import de.bixilon.kutil.file.FileUtil.slashPath
import de.bixilon.kutil.file.watcher.FileWatcherService import de.bixilon.kutil.file.watcher.FileWatcherService
import de.bixilon.kutil.hash.HashUtil.sha1
import de.bixilon.kutil.os.OSUtil import de.bixilon.kutil.os.OSUtil
import de.bixilon.kutil.time.TimeUtil import de.bixilon.kutil.time.TimeUtil
import de.bixilon.kutil.unit.UnitFormatter.formatBytes 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.GitInfo
import de.bixilon.minosoft.util.ShutdownManager import de.bixilon.minosoft.util.ShutdownManager
import de.bixilon.minosoft.util.SystemInformation 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.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType import de.bixilon.minosoft.util.logging.LogMessageType
@ -225,7 +225,7 @@ ${exception?.toStackTrace() ?: ""}
${GitInfo.formatForCrashReport()} ${GitInfo.formatForCrashReport()}
""".trimIndent() """.trimIndent()
val hash = Util.sha1(stack.toByteArray(StandardCharsets.UTF_8)) val hash = stack.toByteArray(StandardCharsets.UTF_8).sha1()
return """ return """
$stack $stack

View File

@ -1,10 +1,10 @@
package de.bixilon.minosoft.gui.eros.main.play.server.card package de.bixilon.minosoft.gui.eros.main.play.server.card
import com.github.luben.zstd.ZstdOutputStream 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.FileAssetsUtil
import de.bixilon.minosoft.assets.util.FileUtil import de.bixilon.minosoft.assets.util.FileUtil
import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server
import de.bixilon.minosoft.util.Util
import javafx.scene.image.Image import javafx.scene.image.Image
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
@ -22,7 +22,7 @@ object FaviconManager {
return null 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) { if (this.faviconHash == faviconHash) {
return return
} }

View File

@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.util
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPool import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable 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.file.FileUtil.slashPath
import de.bixilon.kutil.time.TimeUtil import de.bixilon.kutil.time.TimeUtil
import de.bixilon.minosoft.data.text.BaseComponent 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.RenderWindow
import de.bixilon.minosoft.gui.rendering.system.base.PixelTypes import de.bixilon.minosoft.gui.rendering.system.base.PixelTypes
import de.bixilon.minosoft.terminal.RunConfiguration import de.bixilon.minosoft.terminal.RunConfiguration
import de.bixilon.minosoft.util.Util
import glm_.vec2.Vec2i import glm_.vec2.Vec2i
import java.awt.image.BufferedImage import java.awt.image.BufferedImage
import java.io.File import java.io.File
@ -68,7 +68,7 @@ class ScreenshotTaker(
} }
val file = File(path) val file = File(path)
Util.createParentFolderIfNotExist(file) file.createParent()
ImageIO.write(bufferedImage, "png", file) ImageIO.write(bufferedImage, "png", file)

View File

@ -12,6 +12,8 @@
*/ */
package de.bixilon.minosoft.protocol.packets.s2c.play 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.data.text.ChatComponent
import de.bixilon.minosoft.modding.event.events.ResourcePackRequestEvent import de.bixilon.minosoft.modding.event.events.ResourcePackRequestEvent
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection 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.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions 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.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType import de.bixilon.minosoft.util.logging.LogMessageType
class ResourcepackRequestS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { 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 hash: String = buffer.readString()
val forced = if (buffer.versionId >= ProtocolVersions.V_20W45A) { val forced = if (buffer.versionId >= ProtocolVersions.V_20W45A) {
buffer.readBoolean() buffer.readBoolean()

View File

@ -14,6 +14,7 @@ package de.bixilon.minosoft.protocol.protocol
import com.google.common.collect.HashBiMap import com.google.common.collect.HashBiMap
import de.bixilon.kutil.latch.CountUpAndDownLatch 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.delegate.watcher.SimpleProfileDelegateWatcher.Companion.profileWatch
import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.Server
import de.bixilon.minosoft.config.profile.profiles.other.OtherProfileManager 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.gui.eros.main.play.server.type.types.LANServerType
import de.bixilon.minosoft.modding.event.events.LANServerDiscoverEvent import de.bixilon.minosoft.modding.event.events.LANServerDiscoverEvent
import de.bixilon.minosoft.modding.event.master.GlobalEventMaster 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.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType import de.bixilon.minosoft.util.logging.LogMessageType
@ -120,14 +120,14 @@ object LANServerListener {
for (mustContain in BROADCAST_MUST_CONTAIN) { for (mustContain in BROADCAST_MUST_CONTAIN) {
require(broadcast.contains(mustContain)) { "Broadcast is invalid!" } 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(":")) { if (rawAddress.contains(":")) {
// weird, just extract the port // weird, just extract the port
rawAddress = rawAddress.split(":").toTypedArray()[1] rawAddress = rawAddress.split(":").toTypedArray()[1]
} }
val port = rawAddress.toInt() val port = rawAddress.toInt()
require(!(port < 0 || port > 65535)) { "Invalid port: $port" } 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))) return Server(address = address.hostAddress + ":" + rawAddress, name = BaseComponent("LAN: #${SERVERS.size}: ", ChatComponent.of(motd)))
} }

View File

@ -17,7 +17,9 @@ import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.collections.CollectionUtil.synchronizedListOf import de.bixilon.kutil.collections.CollectionUtil.synchronizedListOf
import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf
import de.bixilon.kutil.collections.CollectionUtil.synchronizedSetOf 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.primitive.BooleanUtil.decide
import de.bixilon.kutil.reflection.ReflectionUtil.forceInit
import de.bixilon.kutil.reflection.ReflectionUtil.realName import de.bixilon.kutil.reflection.ReflectionUtil.realName
import de.bixilon.minosoft.data.entities.entities.Entity import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.inventory.ItemStack 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.data.text.TextFormattable
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition 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.json.Jackson
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.url.URLProtocolStreamHandlers
import glm_.vec2.Vec2t import glm_.vec2.Vec2t
import glm_.vec3.Vec3t import glm_.vec3.Vec3t
import glm_.vec4.Vec4t import glm_.vec4.Vec4t
@ -38,6 +43,7 @@ import java.util.*
object KUtil { object KUtil {
val RANDOM = Random()
fun bitSetOf(long: Long): BitSet { fun bitSetOf(long: Long): BitSet {
return BitSet.valueOf(longArrayOf(long)) return BitSet.valueOf(longArrayOf(long))
@ -229,4 +235,13 @@ object KUtil {
userName = StringBuffer("nobody") userName = StringBuffer("nobody")
groupName = 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()
}
} }

View File

@ -17,25 +17,22 @@ import com.google.gson.Gson;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import com.google.gson.stream.JsonReader; 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.network.connection.play.PlayConnection;
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer; import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; 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 org.jetbrains.annotations.NotNull;
import java.io.*; import java.io.*;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Random; 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) @Deprecated(forRemoval = true)
public final class Util { public final class Util {
@ -115,61 +112,6 @@ public final class Util {
return ret; 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 { public static String readReader(BufferedReader reader, boolean closeStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
String line; String line;
@ -186,52 +128,6 @@ public final class Util {
return stringBuilder.toString(); 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) { public static int getJsonReaderPosition(JsonReader jsonReader) {
try { try {
return JSON_READER_POS_FIELD.getInt(jsonReader) - JSON_READER_LINE_START_FIELD.getInt(jsonReader) + 1; 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 <T> void forceClassInit(Class<T> 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<String, String> urlQueryToMap(String query) { public static Map<String, String> urlQueryToMap(String query) {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
for (String parameter : query.split("&")) { for (String parameter : query.split("&")) {
@ -289,14 +162,6 @@ public final class Util {
return builder.toString(); return builder.toString();
} }
public static String formatString(String string, Map<String, Object> format) {
String output = string;
for (Map.Entry<String, Object> entry : format.entrySet()) {
output = output.replace("${" + entry.getKey() + "}", entry.getValue().toString());
}
return output;
}
@NotNull @NotNull
@Deprecated @Deprecated
public static JsonObject readJsonFromStream(@NotNull InputStream stream, boolean close) throws IOException { public static JsonObject readJsonFromStream(@NotNull InputStream stream, boolean close) throws IOException {