From 6520edf7862d60a434c61e5feca45f593f84704b Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 2 Aug 2021 15:41:02 +0200 Subject: [PATCH] refactor URL stream handlers --- .../java/de/bixilon/minosoft/util/Util.java | 3 +- .../util/microsoft/MicrosoftOAuthUtils.kt | 32 ++++++++-------- .../util/{ => url}/ResourceURLHandler.kt | 26 ++----------- .../util/url/URLProtocolStreamHandlers.kt | 38 +++++++++++++++++++ 4 files changed, 59 insertions(+), 40 deletions(-) rename src/main/java/de/bixilon/minosoft/util/{ => url}/ResourceURLHandler.kt (65%) create mode 100644 src/main/java/de/bixilon/minosoft/util/url/URLProtocolStreamHandlers.kt diff --git a/src/main/java/de/bixilon/minosoft/util/Util.java b/src/main/java/de/bixilon/minosoft/util/Util.java index 441884ec6..fae3040a3 100644 --- a/src/main/java/de/bixilon/minosoft/util/Util.java +++ b/src/main/java/de/bixilon/minosoft/util/Util.java @@ -24,6 +24,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; import de.bixilon.minosoft.util.logging.Log; import de.bixilon.minosoft.util.microsoft.MicrosoftOAuthUtils; import de.bixilon.minosoft.util.task.time.TimeWorker; +import de.bixilon.minosoft.util.url.URLProtocolStreamHandlers; import org.jetbrains.annotations.NotNull; import java.io.*; @@ -288,7 +289,7 @@ public final class Util { public static void initUtilClasses() { forceClassInit(Log.class); - forceClassInit(ResourceURLHandler.class); + forceClassInit(URLProtocolStreamHandlers.class); forceClassInit(MicrosoftOAuthUtils.class); forceClassInit(TimeWorker.class); } diff --git a/src/main/java/de/bixilon/minosoft/util/microsoft/MicrosoftOAuthUtils.kt b/src/main/java/de/bixilon/minosoft/util/microsoft/MicrosoftOAuthUtils.kt index 738ca7543..a946633bc 100644 --- a/src/main/java/de/bixilon/minosoft/util/microsoft/MicrosoftOAuthUtils.kt +++ b/src/main/java/de/bixilon/minosoft/util/microsoft/MicrosoftOAuthUtils.kt @@ -18,18 +18,19 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.KUtil.asList import de.bixilon.minosoft.util.KUtil.toLong import de.bixilon.minosoft.util.KUtil.unsafeCast +import de.bixilon.minosoft.util.Util import de.bixilon.minosoft.util.http.HTTP2.getJson import de.bixilon.minosoft.util.http.HTTP2.postJson import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound +import de.bixilon.minosoft.util.url.URLProtocolStreamHandlers +import java.net.URL import java.net.URLConnection +import java.net.URLStreamHandler object MicrosoftOAuthUtils { - val NULL_URL_CONNECTION: URLConnection = object : URLConnection(null) { - override fun connect() {} - } fun loginToMicrosoftAccount(authorizationCode: String): MicrosoftAccount { Log.log(LogMessageType.AUTHENTICATION, LogLevels.INFO) { "Logging into microsoft account..." } @@ -70,7 +71,7 @@ object MicrosoftOAuthUtils { response.body!! if (response.statusCode != 200) { - throw LoginException(response.statusCode, "Could not get authenticate against xbox live ", response.body.toString()) + throw LoginException(response.statusCode, "Could not authenticate with xbox live token", response.body.toString()) } return Pair(response.body["Token"].unsafeCast(), response.body["DisplayClaims"].asCompound()["xui"].asList()[0].asCompound()["uhs"].unsafeCast()) } @@ -92,7 +93,7 @@ object MicrosoftOAuthUtils { 2148916238 -> "This account is a child account!" else -> response.body["Message"].unsafeCast() } - throw LoginException(response.statusCode, "Could not get authenticate against XSTS token ", errorMessage) + throw LoginException(response.statusCode, "Could not get xsts token ", errorMessage) } return response.body["Token"].unsafeCast() } @@ -128,17 +129,14 @@ object MicrosoftOAuthUtils { } init { - // ToDo -// URL.setURLStreamHandlerFactory { -// if (it == "ms-xal-" + ProtocolDefinition.MICROSOFT_ACCOUNT_APPLICATION_ID) { -// return@setURLStreamHandlerFactory object : URLStreamHandler() { -// override fun openConnection(url: URL): URLConnection { -// loginToMicrosoftAccount(Util.urlQueryToMap(url.query)["code"]!!) -// return NULL_URL_CONNECTION -// } -// } -// } -// return@setURLStreamHandlerFactory null -// } + URLProtocolStreamHandlers.PROTOCOLS["ms-xal-" + ProtocolDefinition.MICROSOFT_ACCOUNT_APPLICATION_ID] = LoginURLHandler + } + + private object LoginURLHandler : URLStreamHandler() { + + override fun openConnection(url: URL): URLConnection { + loginToMicrosoftAccount(Util.urlQueryToMap(url.query)["code"]!!) + return URLProtocolStreamHandlers.NULL_URL_CONNECTION + } } } diff --git a/src/main/java/de/bixilon/minosoft/util/ResourceURLHandler.kt b/src/main/java/de/bixilon/minosoft/util/url/ResourceURLHandler.kt similarity index 65% rename from src/main/java/de/bixilon/minosoft/util/ResourceURLHandler.kt rename to src/main/java/de/bixilon/minosoft/util/url/ResourceURLHandler.kt index cf8dc617a..7f57963c4 100644 --- a/src/main/java/de/bixilon/minosoft/util/ResourceURLHandler.kt +++ b/src/main/java/de/bixilon/minosoft/util/url/ResourceURLHandler.kt @@ -11,7 +11,7 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.util +package de.bixilon.minosoft.util.url import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.registries.ResourceLocation @@ -19,33 +19,15 @@ import java.io.InputStream import java.net.URL import java.net.URLConnection import java.net.URLStreamHandler -import java.net.URLStreamHandlerFactory -object ResourceURLHandler { +object ResourceURLHandler : URLStreamHandler() { - init { - URL.setURLStreamHandlerFactory(ResourceURLStreamHandlerFactory) + override fun openConnection(url: URL?): URLConnection { + return ResourceURLConnection(url) } - private object ResourceStreamHandler : URLStreamHandler() { - override fun openConnection(url: URL?): URLConnection { - return ResourceURLConnection(url) - } - } - - - private object ResourceURLStreamHandlerFactory : URLStreamHandlerFactory { - - override fun createURLStreamHandler(protocol: String): URLStreamHandler? { - if (protocol == "resource") { - return ResourceStreamHandler - } - return null - } - } - private class ResourceURLConnection(url: URL?) : URLConnection(url) { override fun connect() { } diff --git a/src/main/java/de/bixilon/minosoft/util/url/URLProtocolStreamHandlers.kt b/src/main/java/de/bixilon/minosoft/util/url/URLProtocolStreamHandlers.kt new file mode 100644 index 000000000..ec3a4d131 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/util/url/URLProtocolStreamHandlers.kt @@ -0,0 +1,38 @@ +/* + * Minosoft + * Copyright (C) 2021 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.util.url + +import java.net.URL +import java.net.URLConnection +import java.net.URLStreamHandler +import java.net.URLStreamHandlerFactory + +object URLProtocolStreamHandlers : URLStreamHandlerFactory { + val PROTOCOLS: MutableMap = mutableMapOf( + "resource" to ResourceURLHandler, + ) + + init { + URL.setURLStreamHandlerFactory(this) + } + + override fun createURLStreamHandler(protocol: String?): URLStreamHandler? { + return PROTOCOLS[protocol] + } + + + val NULL_URL_CONNECTION: URLConnection = object : URLConnection(null) { + override fun connect() {} + } +}