diff --git a/.idea/misc.xml b/.idea/misc.xml index 915a7a2..2c03559 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -28,7 +28,7 @@ - + \ No newline at end of file diff --git a/app/desktop/build.gradle.kts b/app/desktop/build.gradle.kts index 2142c3f..0a3362a 100644 --- a/app/desktop/build.gradle.kts +++ b/app/desktop/build.gradle.kts @@ -20,6 +20,10 @@ kotlin { } val nonWindowsMain by creating { dependsOn(commonMain.get()) + dependencies { + implementation(libs.ktor.server.netty) + implementation(libs.ktor.server.cors) + } } named("jvmMain") { @@ -34,8 +38,6 @@ kotlin { implementation(project.dependencies.compose.materialIconsExtended) implementation(project.dependencies.compose.material3) implementation(libs.logback) - implementation(libs.ktor.server.netty) - implementation(libs.ktor.server.cors) } } } diff --git a/app/desktop/src/commonMain/kotlin/AuthorizationScreen.kt b/app/desktop/src/commonMain/kotlin/AuthorizationScreen.kt index 2d88a87..c56c3d8 100644 --- a/app/desktop/src/commonMain/kotlin/AuthorizationScreen.kt +++ b/app/desktop/src/commonMain/kotlin/AuthorizationScreen.kt @@ -21,25 +21,14 @@ import dev.schlaubi.tonbrett.app.api.getUrl import dev.schlaubi.tonbrett.client.href import dev.schlaubi.tonbrett.common.Route import io.ktor.http.* -import kotlin.system.exitProcess @Composable -fun AuthorizationScreen(uwp: Boolean, alreadyWaiting: Boolean, onAuth: () -> Unit) { +fun AuthorizationScreen(alreadyWaiting: Boolean, onAuth: () -> Unit) { var waiting by remember { mutableStateOf(alreadyWaiting) } if (waiting) { SideEffect { - val protocol = if (uwp) { - Route.Auth.Type.PROTOCOL - } else { - Route.Auth.Type.APP - } - - launchUri(href(Route.Auth(protocol), URLBuilder(getUrl())).build().toURI()) - if (uwp) { - exitProcess(0) - } else { - startAuthorizationServer(onAuth) - } + launchUri(href(Route.Auth(loginType), URLBuilder(getUrl())).build().toURI()) + prepareAuthentication(onAuth) } } Column( diff --git a/app/desktop/src/commonMain/kotlin/Main.kt b/app/desktop/src/commonMain/kotlin/Main.kt index 88ea376..033ef1b 100644 --- a/app/desktop/src/commonMain/kotlin/Main.kt +++ b/app/desktop/src/commonMain/kotlin/Main.kt @@ -22,42 +22,16 @@ import androidx.compose.ui.window.* import cafe.adriel.lyricist.LocalStrings import dev.schlaubi.tonbrett.app.* import dev.schlaubi.tonbrett.app.api.ProvideContext -import io.ktor.http.* import io.ktor.serialization.* import mu.KotlinLogging import java.net.URI -import kotlin.io.path.absolutePathString import java.awt.Window as AWTWindow private val LOG = KotlinLogging.logger { } -fun main(args: Array) { - val argsString = args.joinToString(" ") - if (argsString.startsWith("tonbrett://login")) { - try { - LOG.info { "Launched App with $argsString saving token now" } - val token = Url(argsString).parameters["token"]!! - setToken(token) - } catch (e: Exception) { - e.printStackTrace() - Thread.sleep(50000) - } - startApplication(isUwp) - } else { - main(reAuthorize = false, uwp = isUwp) { startApplication(isUwp) } - } -} +fun main(array: Array) = start(array) -fun main(reAuthorize: Boolean, uwp: Boolean = false, onAuth: () -> Unit) { - val token = runCatching { getToken() }.getOrNull() - if (reAuthorize || token == null) { - startApplication(uwp, true) - } else { - startApplication(uwp) - } -} - -fun startApplication(uwp: Boolean, forAuth: Boolean = false) = application { +fun startApplication(forAuth: Boolean = false) = application { val sessionExpired = remember { mutableStateOf(false) } var needsUpdate by remember { mutableStateOf(false) } val exceptionHandler = ExceptionHandlerFactory { @@ -84,14 +58,13 @@ fun startApplication(uwp: Boolean, forAuth: Boolean = false) = application { } } } else { - startActualApplication(uwp, forAuth, exceptionHandler, sessionExpired) + startActualApplication(forAuth, exceptionHandler, sessionExpired) } } @OptIn(ExperimentalComposeUiApi::class) @Composable private fun ApplicationScope.startActualApplication( - uwp: Boolean, forAuth: Boolean, exceptionHandler: ExceptionHandlerFactory, sessionExpired: MutableState ) { @@ -110,10 +83,7 @@ private fun ApplicationScope.startActualApplication( } if (needsAuth) { - AuthorizationScreen(uwp, !firstAuth) { - context.resetApi() - needsAuth = false - } + AuthorizationScreen(!firstAuth) { needsAuth = false } } else { context.resetApi() ProvideContext(context) { diff --git a/app/desktop/src/commonMain/kotlin/NativeUtil.kt b/app/desktop/src/commonMain/kotlin/NativeUtil.kt index 825834e..943f32a 100644 --- a/app/desktop/src/commonMain/kotlin/NativeUtil.kt +++ b/app/desktop/src/commonMain/kotlin/NativeUtil.kt @@ -3,18 +3,3 @@ package dev.schlaubi.tonbrett.app.desktop import java.net.URI import java.nio.file.Path -/** - * Whether the current platform is UWP. - */ -expect val isUwp: Boolean - -/** - * Tries to launch the URI using the UWP `Launcher`. - * - * @param uri the [URI] to launch - */ -expect fun launchUri(uri: URI) - -expect fun getToken(): String - -expect fun setToken(token: String) diff --git a/app/desktop/src/commonMain/kotlin/Platform.kt b/app/desktop/src/commonMain/kotlin/Platform.kt new file mode 100644 index 0000000..533c2ef --- /dev/null +++ b/app/desktop/src/commonMain/kotlin/Platform.kt @@ -0,0 +1,25 @@ +@file:JvmName("Platform") +package dev.schlaubi.tonbrett.app.desktop + +import dev.schlaubi.tonbrett.common.Route +import java.net.URI + +expect val loginType: Route.Auth.Type + +/** + * Runs any preparation steps for authentication + */ +expect fun prepareAuthentication(onAuth: () -> Unit) + +expect fun start(args: Array) + +/** + * Tries to launch the URI using the UWP `Launcher`. + * + * @param uri the [URI] to launch + */ +expect fun launchUri(uri: URI) + +expect fun getToken(): String + +expect fun setToken(token: String) \ No newline at end of file diff --git a/app/desktop/src/commonMain/kotlin/AuthorizationServer.kt b/app/desktop/src/nonWindowsMain/kotlin/AuthorizationServer.kt similarity index 97% rename from app/desktop/src/commonMain/kotlin/AuthorizationServer.kt rename to app/desktop/src/nonWindowsMain/kotlin/AuthorizationServer.kt index 4301e71..a2c3261 100644 --- a/app/desktop/src/commonMain/kotlin/AuthorizationServer.kt +++ b/app/desktop/src/nonWindowsMain/kotlin/AuthorizationServer.kt @@ -30,7 +30,7 @@ fun Application.authModule(onAuth: () -> Unit, scope: CoroutineScope) { post("login") { val token = call.parameters["token"] ?: throw BadRequestException("Missing token") - //saveConfig(Config(token)) + saveConfig(Config(token)) call.respond(HttpStatusCode.Accepted) // This stops the server, see stopServerOnCancellation above scope.cancel() diff --git a/app/desktop/src/nonWindowsMain/kotlin/NativeUtil.kt b/app/desktop/src/nonWindowsMain/kotlin/Platform.kt similarity index 75% rename from app/desktop/src/nonWindowsMain/kotlin/NativeUtil.kt rename to app/desktop/src/nonWindowsMain/kotlin/Platform.kt index fdc28c0..c1ef4ac 100644 --- a/app/desktop/src/nonWindowsMain/kotlin/NativeUtil.kt +++ b/app/desktop/src/nonWindowsMain/kotlin/Platform.kt @@ -1,12 +1,20 @@ package dev.schlaubi.tonbrett.app.desktop +import dev.schlaubi.tonbrett.common.Route import java.awt.Desktop import java.net.URI import java.nio.file.Path import kotlin.io.path.Path import kotlin.io.path.div -actual val isUwp = false +actual val loginType = Route.Auth.Type.APP + +actual fun start(args: Array) { + val needsAuth = runCatching { getToken() }.isFailure + startApplication(needsAuth) +} + +actual fun prepareAuthentication(onAuth: () -> Unit) = startAuthorizationServer(onAuth) actual fun launchUri(uri: URI) { val desktop = Desktop.getDesktop() diff --git a/app/desktop/src/windowsMain/kotlin/NativeUtil.kt b/app/desktop/src/windowsMain/kotlin/Platform.kt similarity index 62% rename from app/desktop/src/windowsMain/kotlin/NativeUtil.kt rename to app/desktop/src/windowsMain/kotlin/Platform.kt index b919158..e7f7e18 100644 --- a/app/desktop/src/windowsMain/kotlin/NativeUtil.kt +++ b/app/desktop/src/windowsMain/kotlin/Platform.kt @@ -2,12 +2,38 @@ package dev.schlaubi.tonbrett.app.desktop import dev.schlaubi.tonbrett.app.desktop.uwp_helper.StringResult import dev.schlaubi.tonbrett.app.desktop.uwp_helper.UwpHelper.* +import dev.schlaubi.tonbrett.common.Route +import io.ktor.http.* +import mu.KotlinLogging import java.lang.foreign.Arena import java.lang.foreign.MemorySegment import java.lang.foreign.SegmentAllocator import java.net.URI +import kotlin.system.exitProcess -actual val isUwp = true +private val LOG = KotlinLogging.logger { } + +actual val loginType = Route.Auth.Type.PROTOCOL + +actual fun prepareAuthentication(onAuth: () -> Unit): Unit = exitProcess(0) + +actual fun start(args: Array) { + val argsString = args.joinToString(" ") + if (argsString.startsWith("tonbrett://login")) { + try { + LOG.info { "Launched App with $argsString saving token now" } + val token = Url(argsString).parameters["token"]!! + setToken(token) + } catch (e: Exception) { + e.printStackTrace() + Thread.sleep(50000) + } + startApplication() + } else { + val needsAuth = runCatching { getToken() }.isFailure + startApplication(needsAuth) + } +} actual fun launchUri(uri: URI): Unit = Arena.openConfined().use { arena -> val url = arena.allocateUtf8String(uri.toString()) diff --git a/app/desktop/uwp_helper/build.gradle.kts b/app/desktop/uwp_helper/build.gradle.kts index 4db2baa..1493b20 100644 --- a/app/desktop/uwp_helper/build.gradle.kts +++ b/app/desktop/uwp_helper/build.gradle.kts @@ -31,7 +31,7 @@ tasks { rootProject.file("jextract-20/bin/jextract.bat").absolutePath } else { if (OSUtils.IS_WINDOWS) { - "C:\\Users\\micha\\.jdks\\jextract-20\\bin\\jextract.bat" + "jextract.bat" } else { "jextract" } diff --git a/build.gradle.kts b/build.gradle.kts index a919736..219b48d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ plugins { allprojects { group = "dev.schlaubi.tonbrett" - version = "1.14.25" + version = "1.14.26" repositories { mavenCentral()