From 96b50f52ec917e8a521c5f87ae85704d188ec9f6 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sun, 6 Apr 2025 21:10:07 +0200 Subject: [PATCH] Ensure webui "channel" is always of corresponding enum (#1334) The "channel" was just the string from the config file, which will never equal the enum unless via case-insensitive comparison --- .../graphql/mutations/InfoMutation.kt | 2 +- .../tachidesk/graphql/queries/InfoQuery.kt | 5 +- .../tachidesk/graphql/types/SettingsType.kt | 3 - .../graphql/types/WebUIUpdateType.kt | 73 ++++++++++++++++++- .../suwayomi/tachidesk/server/util/Browser.kt | 1 + .../server/util/WebInterfaceManager.kt | 71 +----------------- 6 files changed, 79 insertions(+), 76 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/InfoMutation.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/InfoMutation.kt index 7880929f..736ce4a9 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/InfoMutation.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/InfoMutation.kt @@ -7,10 +7,10 @@ import suwayomi.tachidesk.graphql.asDataFetcherResult import suwayomi.tachidesk.graphql.types.UpdateState.DOWNLOADING import suwayomi.tachidesk.graphql.types.UpdateState.ERROR import suwayomi.tachidesk.graphql.types.UpdateState.IDLE +import suwayomi.tachidesk.graphql.types.WebUIFlavor import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.util.WebInterfaceManager -import suwayomi.tachidesk.server.util.WebUIFlavor import java.util.concurrent.CompletableFuture import kotlin.time.Duration.Companion.seconds diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/InfoQuery.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/InfoQuery.kt index ed584323..f9471057 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/InfoQuery.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/InfoQuery.kt @@ -3,13 +3,14 @@ package suwayomi.tachidesk.graphql.queries import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated import suwayomi.tachidesk.global.impl.AppUpdate import suwayomi.tachidesk.graphql.types.AboutWebUI +import suwayomi.tachidesk.graphql.types.WebUIChannel +import suwayomi.tachidesk.graphql.types.WebUIFlavor import suwayomi.tachidesk.graphql.types.WebUIUpdateCheck import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.generated.BuildConfig import suwayomi.tachidesk.server.serverConfig import suwayomi.tachidesk.server.util.WebInterfaceManager -import suwayomi.tachidesk.server.util.WebUIFlavor import java.util.concurrent.CompletableFuture class InfoQuery { @@ -62,7 +63,7 @@ class InfoQuery { future { val (version, updateAvailable) = WebInterfaceManager.isUpdateAvailable(WebUIFlavor.current, raiseError = true) WebUIUpdateCheck( - channel = serverConfig.webUIChannel.value, + channel = WebUIChannel.from(serverConfig.webUIChannel.value), tag = version, updateAvailable, ) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/SettingsType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/SettingsType.kt index fa58aac5..1cde794c 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/SettingsType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/SettingsType.kt @@ -11,9 +11,6 @@ import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.server.ServerConfig import suwayomi.tachidesk.server.serverConfig -import suwayomi.tachidesk.server.util.WebUIChannel -import suwayomi.tachidesk.server.util.WebUIFlavor -import suwayomi.tachidesk.server.util.WebUIInterface interface Settings : Node { val ip: String? diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/WebUIUpdateType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/WebUIUpdateType.kt index 766a3170..b068f808 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/WebUIUpdateType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/WebUIUpdateType.kt @@ -1,18 +1,20 @@ package suwayomi.tachidesk.graphql.types +import suwayomi.tachidesk.server.serverConfig + data class AboutWebUI( - val channel: String, + val channel: WebUIChannel, val tag: String, ) data class WebUIUpdateCheck( - val channel: String, + val channel: WebUIChannel, val tag: String, val updateAvailable: Boolean, ) data class WebUIUpdateInfo( - val channel: String, + val channel: WebUIChannel, val tag: String, ) @@ -28,3 +30,68 @@ data class WebUIUpdateStatus( val state: UpdateState, val progress: Int, ) + +enum class WebUIInterface { + BROWSER, + ELECTRON, + ; + + companion object { + fun from(value: String): WebUIInterface = entries.find { it.name.lowercase() == value.lowercase() } ?: BROWSER + } +} + +enum class WebUIChannel { + BUNDLED, // the default webUI version bundled with the server release + STABLE, + PREVIEW, + ; + + companion object { + fun from(channel: String): WebUIChannel = entries.find { it.name.lowercase() == channel.lowercase() } ?: STABLE + + fun doesConfigChannelEqual(channel: WebUIChannel): Boolean = serverConfig.webUIChannel.value.equals(channel.name, true) + } +} + +enum class WebUIFlavor( + val uiName: String, + val repoUrl: String, + val versionMappingUrl: String, + val latestReleaseInfoUrl: String, + val baseFileName: String, +) { + WEBUI( + "WebUI", + "https://github.com/Suwayomi/Suwayomi-WebUI-preview", + "https://raw.githubusercontent.com/Suwayomi/Suwayomi-WebUI/master/versionToServerVersionMapping.json", + "https://api.github.com/repos/Suwayomi/Suwayomi-WebUI-preview/releases/latest", + "Suwayomi-WebUI", + ), + + VUI( + "VUI", + "https://github.com/Suwayomi/Suwayomi-VUI", + "https://raw.githubusercontent.com/Suwayomi/Suwayomi-VUI/main/versionToServerVersionMapping.json", + "https://api.github.com/repos/Suwayomi/Suwayomi-VUI/releases/latest", + "Suwayomi-VUI-Web", + ), + + CUSTOM( + "Custom", + "repoURL", + "versionMappingUrl", + "latestReleaseInfoURL", + "baseFileName", + ), + ; + + companion object { + val default: WebUIFlavor = WEBUI + + fun from(value: String): WebUIFlavor = entries.find { it.uiName == value } ?: default + + val current: WebUIFlavor + get() = from(serverConfig.webUIFlavor.value) + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/util/Browser.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/util/Browser.kt index 5fbf70a8..88a4b8bc 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/util/Browser.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/util/Browser.kt @@ -9,6 +9,7 @@ package suwayomi.tachidesk.server.util import dorkbox.desktop.Desktop import io.github.oshai.kotlinlogging.KotlinLogging +import suwayomi.tachidesk.graphql.types.WebUIInterface import suwayomi.tachidesk.server.serverConfig object Browser { diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/util/WebInterfaceManager.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/util/WebInterfaceManager.kt index 311583ec..959c2999 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/util/WebInterfaceManager.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/util/WebInterfaceManager.kt @@ -41,6 +41,8 @@ import suwayomi.tachidesk.graphql.types.UpdateState.DOWNLOADING import suwayomi.tachidesk.graphql.types.UpdateState.ERROR import suwayomi.tachidesk.graphql.types.UpdateState.FINISHED import suwayomi.tachidesk.graphql.types.UpdateState.IDLE +import suwayomi.tachidesk.graphql.types.WebUIChannel +import suwayomi.tachidesk.graphql.types.WebUIFlavor import suwayomi.tachidesk.graphql.types.WebUIUpdateInfo import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus import suwayomi.tachidesk.server.ApplicationDirs @@ -68,71 +70,6 @@ private fun ByteArray.toHex(): String = joinToString(separator = "") { eachByte class BundledWebUIMissing : Exception("No bundled webUI version found") -enum class WebUIInterface { - BROWSER, - ELECTRON, - ; - - companion object { - fun from(value: String): WebUIInterface = entries.find { it.name.lowercase() == value.lowercase() } ?: BROWSER - } -} - -enum class WebUIChannel { - BUNDLED, // the default webUI version bundled with the server release - STABLE, - PREVIEW, - ; - - companion object { - fun from(channel: String): WebUIChannel = entries.find { it.name.lowercase() == channel.lowercase() } ?: STABLE - - fun doesConfigChannelEqual(channel: WebUIChannel): Boolean = serverConfig.webUIChannel.value.equals(channel.name, true) - } -} - -enum class WebUIFlavor( - val uiName: String, - val repoUrl: String, - val versionMappingUrl: String, - val latestReleaseInfoUrl: String, - val baseFileName: String, -) { - WEBUI( - "WebUI", - "https://github.com/Suwayomi/Suwayomi-WebUI-preview", - "https://raw.githubusercontent.com/Suwayomi/Suwayomi-WebUI/master/versionToServerVersionMapping.json", - "https://api.github.com/repos/Suwayomi/Suwayomi-WebUI-preview/releases/latest", - "Suwayomi-WebUI", - ), - - VUI( - "VUI", - "https://github.com/Suwayomi/Suwayomi-VUI", - "https://raw.githubusercontent.com/Suwayomi/Suwayomi-VUI/main/versionToServerVersionMapping.json", - "https://api.github.com/repos/Suwayomi/Suwayomi-VUI/releases/latest", - "Suwayomi-VUI-Web", - ), - - CUSTOM( - "Custom", - "repoURL", - "versionMappingUrl", - "latestReleaseInfoURL", - "baseFileName", - ), - ; - - companion object { - val default: WebUIFlavor = WEBUI - - fun from(value: String): WebUIFlavor = entries.find { it.uiName == value } ?: default - - val current: WebUIFlavor - get() = from(serverConfig.webUIFlavor.value) - } -} - fun WebUIFlavor.isDefault(): Boolean = this == WebUIFlavor.default object WebInterfaceManager { @@ -188,7 +125,7 @@ object WebInterfaceManager { } return AboutWebUI( - channel = serverConfig.webUIChannel.value, + channel = WebUIChannel.from(serverConfig.webUIChannel.value), tag = currentVersion, ) } @@ -201,7 +138,7 @@ object WebInterfaceManager { WebUIUpdateStatus( info = WebUIUpdateInfo( - channel = serverConfig.webUIChannel.value, + channel = WebUIChannel.from(serverConfig.webUIChannel.value), tag = version, ), state,