mirror of
https://github.com/packwiz/packwiz-installer.git
synced 2025-11-01 11:14:31 +01:00
Significant rewrite to use 4koma, OkHttp, PackwizPath; fixing several issues
Github release plugin, Kotlin, Okio and OkHttp updated Toml4j removed and replaced with 4koma - improves null safety, immutability, TOML compliance kotlin-result removed (I don't think it was used anyway) SpaceSafeURI replaced with PackwizPath which handles special characters much better (fixes #5) Fixed directory traversal issues Hashing system rewritten for better type safety and cleaner code Download mode changed to use an enum Request system completely rewritten; now uses OkHttp for HTTP requests (fixes #36, fixes #5) Added request interceptor which retries requests (fixes #4) Removed: support for extracting packs from zip files (and Github zipballs) Cleaner exceptions; more improvements pending (in particular showing request failure causes) Improved speed of cancelling in-progress downloads Better support for installing from local files (no file: URI required; though it is still supported) Various code cleanup changes
This commit is contained in:
@@ -2,17 +2,23 @@
|
||||
|
||||
package link.infra.packwiz.installer
|
||||
|
||||
import link.infra.packwiz.installer.metadata.SpaceSafeURI
|
||||
import link.infra.packwiz.installer.target.Side
|
||||
import link.infra.packwiz.installer.target.path.HttpUrlPath
|
||||
import link.infra.packwiz.installer.target.path.PackwizFilePath
|
||||
import link.infra.packwiz.installer.ui.cli.CLIHandler
|
||||
import link.infra.packwiz.installer.ui.gui.GUIHandler
|
||||
import link.infra.packwiz.installer.ui.wrap
|
||||
import link.infra.packwiz.installer.util.Log
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||
import okio.Path.Companion.toOkioPath
|
||||
import okio.Path.Companion.toPath
|
||||
import org.apache.commons.cli.DefaultParser
|
||||
import org.apache.commons.cli.Options
|
||||
import org.apache.commons.cli.ParseException
|
||||
import java.awt.EventQueue
|
||||
import java.awt.GraphicsEnvironment
|
||||
import java.net.URISyntaxException
|
||||
import java.net.URI
|
||||
import java.nio.file.Paths
|
||||
import javax.swing.JOptionPane
|
||||
import javax.swing.UIManager
|
||||
import kotlin.system.exitProcess
|
||||
@@ -66,21 +72,41 @@ class Main(args: Array<String>) {
|
||||
|
||||
ui.show()
|
||||
|
||||
val uOptions = try {
|
||||
UpdateManager.Options.construct(
|
||||
downloadURI = SpaceSafeURI(unparsedArgs[0]),
|
||||
side = cmd.getOptionValue("side")?.let((Side)::from),
|
||||
packFolder = cmd.getOptionValue("pack-folder"),
|
||||
multimcFolder = cmd.getOptionValue("multimc-folder"),
|
||||
manifestFile = cmd.getOptionValue("meta-file")
|
||||
)
|
||||
} catch (e: URISyntaxException) {
|
||||
ui.showErrorAndExit("Failed to read pack.toml URI", e)
|
||||
val packFileRaw = unparsedArgs[0]
|
||||
|
||||
val packFile = when {
|
||||
// HTTP(s) URLs
|
||||
Regex("^https?://", RegexOption.IGNORE_CASE).containsMatchIn(packFileRaw) -> ui.wrap("Invalid HTTP/HTTPS URL for pack file: $packFileRaw") {
|
||||
HttpUrlPath(packFileRaw.toHttpUrl().resolve(".")!!, packFileRaw.toHttpUrl().pathSegments.last())
|
||||
}
|
||||
// File URIs (uses same logic as old packwiz-installer, for backwards compat)
|
||||
Regex("^file:", RegexOption.IGNORE_CASE).containsMatchIn(packFileRaw) -> {
|
||||
ui.wrap("Failed to parse file path for pack file: $packFileRaw") {
|
||||
val path = Paths.get(URI(packFileRaw)).toOkioPath()
|
||||
PackwizFilePath(path.parent ?: ui.showErrorAndExit("Invalid pack file path: $packFileRaw"), path.name)
|
||||
}
|
||||
}
|
||||
// Other URIs (unsupported)
|
||||
Regex("^[a-z][a-z\\d+\\-.]*://", RegexOption.IGNORE_CASE).containsMatchIn(packFileRaw) -> ui.showErrorAndExit("Unsupported scheme for pack file: $packFileRaw")
|
||||
// None of the above matches -> interpret as file path
|
||||
else -> PackwizFilePath(packFileRaw.toPath().parent ?: ui.showErrorAndExit("Invalid pack file path: $packFileRaw"), packFileRaw.toPath().name)
|
||||
}
|
||||
val side = cmd.getOptionValue("side")?.let {
|
||||
Side.from(it) ?: ui.showErrorAndExit("Unknown side name: $it")
|
||||
} ?: Side.CLIENT
|
||||
val packFolder = ui.wrap("Invalid pack folder path") {
|
||||
cmd.getOptionValue("pack-folder")?.let{ PackwizFilePath(it.toPath()) } ?: PackwizFilePath(".".toPath())
|
||||
}
|
||||
val multimcFolder = ui.wrap("Invalid MultiMC folder path") {
|
||||
cmd.getOptionValue("multimc-folder")?.let{ PackwizFilePath(it.toPath()) } ?: PackwizFilePath("..".toPath())
|
||||
}
|
||||
val manifestFile = ui.wrap("Invalid manifest file path") {
|
||||
packFolder / (cmd.getOptionValue("meta-file") ?: "manifest.json")
|
||||
}
|
||||
|
||||
// Start update process!
|
||||
try {
|
||||
UpdateManager(uOptions, ui)
|
||||
UpdateManager(UpdateManager.Options(packFile, manifestFile, packFolder, multimcFolder, side), ui)
|
||||
} catch (e: Exception) {
|
||||
ui.showErrorAndExit("Update process failed", e)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user