refactor URL stream handlers

This commit is contained in:
Bixilon 2021-08-02 15:41:02 +02:00
parent 854e0bcd8f
commit 6520edf786
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 59 additions and 40 deletions

View File

@ -24,6 +24,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
import de.bixilon.minosoft.util.logging.Log; import de.bixilon.minosoft.util.logging.Log;
import de.bixilon.minosoft.util.microsoft.MicrosoftOAuthUtils; import de.bixilon.minosoft.util.microsoft.MicrosoftOAuthUtils;
import de.bixilon.minosoft.util.task.time.TimeWorker; import de.bixilon.minosoft.util.task.time.TimeWorker;
import de.bixilon.minosoft.util.url.URLProtocolStreamHandlers;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.*; import java.io.*;
@ -288,7 +289,7 @@ public final class Util {
public static void initUtilClasses() { public static void initUtilClasses() {
forceClassInit(Log.class); forceClassInit(Log.class);
forceClassInit(ResourceURLHandler.class); forceClassInit(URLProtocolStreamHandlers.class);
forceClassInit(MicrosoftOAuthUtils.class); forceClassInit(MicrosoftOAuthUtils.class);
forceClassInit(TimeWorker.class); forceClassInit(TimeWorker.class);
} }

View File

@ -18,18 +18,19 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.asList import de.bixilon.minosoft.util.KUtil.asList
import de.bixilon.minosoft.util.KUtil.toLong import de.bixilon.minosoft.util.KUtil.toLong
import de.bixilon.minosoft.util.KUtil.unsafeCast 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.getJson
import de.bixilon.minosoft.util.http.HTTP2.postJson import de.bixilon.minosoft.util.http.HTTP2.postJson
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
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound 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.URLConnection
import java.net.URLStreamHandler
object MicrosoftOAuthUtils { object MicrosoftOAuthUtils {
val NULL_URL_CONNECTION: URLConnection = object : URLConnection(null) {
override fun connect() {}
}
fun loginToMicrosoftAccount(authorizationCode: String): MicrosoftAccount { fun loginToMicrosoftAccount(authorizationCode: String): MicrosoftAccount {
Log.log(LogMessageType.AUTHENTICATION, LogLevels.INFO) { "Logging into microsoft account..." } Log.log(LogMessageType.AUTHENTICATION, LogLevels.INFO) { "Logging into microsoft account..." }
@ -70,7 +71,7 @@ object MicrosoftOAuthUtils {
response.body!! response.body!!
if (response.statusCode != 200) { 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()) 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!" 2148916238 -> "This account is a child account!"
else -> response.body["Message"].unsafeCast() 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() return response.body["Token"].unsafeCast()
} }
@ -128,17 +129,14 @@ object MicrosoftOAuthUtils {
} }
init { init {
// ToDo URLProtocolStreamHandlers.PROTOCOLS["ms-xal-" + ProtocolDefinition.MICROSOFT_ACCOUNT_APPLICATION_ID] = LoginURLHandler
// URL.setURLStreamHandlerFactory { }
// if (it == "ms-xal-" + ProtocolDefinition.MICROSOFT_ACCOUNT_APPLICATION_ID) {
// return@setURLStreamHandlerFactory object : URLStreamHandler() { private object LoginURLHandler : URLStreamHandler() {
// override fun openConnection(url: URL): URLConnection {
// loginToMicrosoftAccount(Util.urlQueryToMap(url.query)["code"]!!) override fun openConnection(url: URL): URLConnection {
// return NULL_URL_CONNECTION loginToMicrosoftAccount(Util.urlQueryToMap(url.query)["code"]!!)
// } return URLProtocolStreamHandlers.NULL_URL_CONNECTION
// } }
// }
// return@setURLStreamHandlerFactory null
// }
} }
} }

View File

@ -11,7 +11,7 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft. * 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.Minosoft
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
@ -19,33 +19,15 @@ import java.io.InputStream
import java.net.URL import java.net.URL
import java.net.URLConnection import java.net.URLConnection
import java.net.URLStreamHandler import java.net.URLStreamHandler
import java.net.URLStreamHandlerFactory
object ResourceURLHandler { object ResourceURLHandler : URLStreamHandler() {
init {
URL.setURLStreamHandlerFactory(ResourceURLStreamHandlerFactory)
}
private object ResourceStreamHandler : URLStreamHandler() {
override fun openConnection(url: URL?): URLConnection { override fun openConnection(url: URL?): URLConnection {
return ResourceURLConnection(url) 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) { private class ResourceURLConnection(url: URL?) : URLConnection(url) {
override fun connect() { override fun connect() {
} }

View File

@ -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 <https://www.gnu.org/licenses/>.
*
* 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<String, URLStreamHandler> = 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() {}
}
}