diff --git a/LaunchServer/source/auth/handler/AuthHandler.java b/LaunchServer/source/auth/handler/AuthHandler.java index 9749f65..ab32acc 100644 --- a/LaunchServer/source/auth/handler/AuthHandler.java +++ b/LaunchServer/source/auth/handler/AuthHandler.java @@ -24,6 +24,7 @@ registerHandler("mojang", MojangAuthHandler::new); registerHandler("authlib", AuthlibAuthHandler::new); registerHandler("minesocial", MineSocialAuthHandler::new); + registerHandler("elyby", ElyByAuthHandler::new); // Auth handler that doesn't do nothing :D registerHandler("binaryFile", BinaryFileAuthHandler::new); diff --git a/LaunchServer/source/auth/handler/ElyByAuthHandler.java b/LaunchServer/source/auth/handler/ElyByAuthHandler.java new file mode 100644 index 0000000..ab34096 --- /dev/null +++ b/LaunchServer/source/auth/handler/ElyByAuthHandler.java @@ -0,0 +1,111 @@ +package launchserver.auth.handler; + +import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonObject; +import launcher.helper.IOHelper; +import launcher.serialize.config.entry.BlockConfigEntry; +import launchserver.auth.provider.AuthProviderResult; +import launchserver.auth.provider.AuthlibAuthProviderResult; +import launchserver.helpers.HTTPRequestHelper; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class ElyByAuthHandler extends AuthHandler +{ + private static final java.net.URL URL_join, URL_hasJoin; + + static + { + try + { + URL_join = new URL("https://authserver.ely.by/session/join"); + URL_hasJoin = new URL("https://authserver.ely.by/session/hasJoined"); + } + catch (MalformedURLException e) + { + throw new InternalError(e); + } + } + + public final HashMap usernameToUUID = new HashMap<>(); + + ElyByAuthHandler(BlockConfigEntry block) + { + super(block); + } + + @Override + public UUID auth(AuthProviderResult authResult) { + if (authResult instanceof AuthlibAuthProviderResult) { + AuthlibAuthProviderResult result = (AuthlibAuthProviderResult) authResult; + usernameToUUID.put(result.username, result.uuid); + return result.uuid; + } + return null; + } + + @Override + public UUID checkServer(String username, String serverID) + { + JsonObject uuidResponse; + try { + URL uuidURL = new URL(URL_hasJoin + "?username=" + IOHelper.urlEncode(username) + "&serverId=" + IOHelper.urlEncode(serverID)); + uuidResponse = HTTPRequestHelper.makeAuthlibRequest(uuidURL, null, "ElyBy"); + } + catch (IOException e) + { + throw new IllegalArgumentException("Empty UUID response"); + } + if (uuidResponse.get("error") != null) + { + throw new IllegalArgumentException(String.valueOf(uuidResponse.get("errorMessage"))); + } + if (uuidResponse.get("id") == null) + { + throw new IllegalArgumentException("Empty UUID response"); + } + return UUID.fromString(uuidResponse.get("id").asString().replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5")); + } + + @Override + public void close() { + } + + @Override + public boolean joinServer(String username, String accessToken, String serverID) throws IOException { + JsonObject request = Json.object(). + add("accessToken", accessToken). + add("selectedProfile", usernameToUUID(username).toString().replace("-", "")). + add("serverId", serverID); + + int response = HTTPRequestHelper.authJoinRequest(URL_join, request, "ElyBy"); + + if (200 <= response && response < 300 ) + { + return true; + } + else + { + authError("Empty ElyBy Handler response"); + } + return false; + } + + @Override + public UUID usernameToUUID(String username) { + return usernameToUUID.get(username); + } + + @Override + public String uuidToUsername(UUID uuid) { + for (Map.Entry entry : usernameToUUID.entrySet()) { + if (entry.getValue().equals(uuid)) return entry.getKey(); + } + return null; + } +} diff --git a/LaunchServer/source/auth/handler/MineSocialAuthHandler.java b/LaunchServer/source/auth/handler/MineSocialAuthHandler.java index dc64f64..ab39544 100644 --- a/LaunchServer/source/auth/handler/MineSocialAuthHandler.java +++ b/LaunchServer/source/auth/handler/MineSocialAuthHandler.java @@ -5,7 +5,7 @@ import launcher.helper.IOHelper; import launcher.serialize.config.entry.BlockConfigEntry; import launchserver.auth.provider.AuthProviderResult; -import launchserver.auth.provider.MineSocialAuthProviderResult; +import launchserver.auth.provider.AuthlibAuthProviderResult; import launchserver.helpers.HTTPRequestHelper; import java.io.IOException; @@ -41,8 +41,8 @@ @Override public UUID auth(AuthProviderResult authResult) { - if (authResult instanceof MineSocialAuthProviderResult) { - MineSocialAuthProviderResult result = (MineSocialAuthProviderResult) authResult; + if (authResult instanceof AuthlibAuthProviderResult) { + AuthlibAuthProviderResult result = (AuthlibAuthProviderResult) authResult; usernameToUUID.put(result.username, result.uuid); return result.uuid; } diff --git a/LaunchServer/source/auth/handler/MojangAuthHandler.java b/LaunchServer/source/auth/handler/MojangAuthHandler.java index 1b27c08..f355cad 100644 --- a/LaunchServer/source/auth/handler/MojangAuthHandler.java +++ b/LaunchServer/source/auth/handler/MojangAuthHandler.java @@ -5,7 +5,7 @@ import launcher.helper.IOHelper; import launcher.serialize.config.entry.BlockConfigEntry; import launchserver.auth.provider.AuthProviderResult; -import launchserver.auth.provider.MojangAuthProviderResult; +import launchserver.auth.provider.AuthlibAuthProviderResult; import launchserver.helpers.HTTPRequestHelper; import java.io.IOException; @@ -41,8 +41,8 @@ @Override public UUID auth(AuthProviderResult authResult) { - if (authResult instanceof MojangAuthProviderResult) { - MojangAuthProviderResult result = (MojangAuthProviderResult) authResult; + if (authResult instanceof AuthlibAuthProviderResult) { + AuthlibAuthProviderResult result = (AuthlibAuthProviderResult) authResult; usernameToUUID.put(result.username, result.uuid); return result.uuid; } diff --git a/LaunchServer/source/auth/provider/AuthProvider.java b/LaunchServer/source/auth/provider/AuthProvider.java index 831ca36..d0bdbcd 100644 --- a/LaunchServer/source/auth/provider/AuthProvider.java +++ b/LaunchServer/source/auth/provider/AuthProvider.java @@ -25,6 +25,7 @@ registerProvider("mojang", MojangAuthProvider::new); registerProvider("authlib", AuthlibAuthProvider::new); registerProvider("minesocial", MineSocialAuthProvider::new); + registerProvider("elyby", ElyByAuthProvider::new); registerProvider("mysql", MySQLAuthProvider::new); registerProvider("mysql-bcrypt", MySQLBcryptAuthProvider::new); registerProvider("mysql-8", MySQL8AuthProvider::new); diff --git a/LaunchServer/source/auth/provider/ElyByAuthProvider.java b/LaunchServer/source/auth/provider/ElyByAuthProvider.java new file mode 100644 index 0000000..569da38 --- /dev/null +++ b/LaunchServer/source/auth/provider/ElyByAuthProvider.java @@ -0,0 +1,73 @@ +package launchserver.auth.provider; + +import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonObject; +import com.eclipsesource.json.JsonValue; +import launcher.serialize.config.entry.BlockConfigEntry; +import launchserver.helpers.HTTPRequestHelper; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.UUID; +import java.util.regex.Pattern; + +public class ElyByAuthProvider extends AuthProvider +{ + private static final Pattern UUID_REGEX = Pattern.compile("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})"); + private static final URL URL; + + static + { + try + { + URL = new URL("https://authserver.ely.by/auth/authenticate"); + } + catch (MalformedURLException e) + { + throw new InternalError(e); + } + } + + ElyByAuthProvider(BlockConfigEntry block) + { + super(block); + } + + @Override + public AuthProviderResult auth(String login, String password, String ip) throws Throwable + { + String clientToken = UUID.randomUUID().toString().replaceAll("-", ""); + // https://wiki.vg/Authentication#Payload + JsonObject request = Json.object(). + add("agent", Json.object().add("name", "Minecraft").add("version", 1)). + add("username", login).add("password", password).add("clientToken", clientToken); + + // Verify there's no error + JsonObject response = HTTPRequestHelper.makeAuthlibRequest(URL, request, "ElyBy"); + if (response == null) + { + authError("Empty ElyBy response"); + } + JsonValue errorMessage = response.get("errorMessage"); + if (errorMessage != null) + { + authError(errorMessage.asString()); + } + + // Parse JSON data + JsonObject selectedProfile = response.get("selectedProfile").asObject(); + String username = selectedProfile.get("name").asString(); + String accessToken = response.get("clientToken").asString(); + UUID uuid = UUID.fromString(UUID_REGEX.matcher(selectedProfile.get("id").asString()).replaceFirst("$1-$2-$3-$4-$5")); + String launcherToken = response.get("accessToken").asString(); + + // We're done + return new AuthlibAuthProviderResult(username, accessToken, uuid, launcherToken); + } + + @Override + public void close() + { + // Do nothing + } +} diff --git a/LaunchServer/source/auth/provider/MineSocialAuthProvider.java b/LaunchServer/source/auth/provider/MineSocialAuthProvider.java index 862a8d6..06775ac 100644 --- a/LaunchServer/source/auth/provider/MineSocialAuthProvider.java +++ b/LaunchServer/source/auth/provider/MineSocialAuthProvider.java @@ -3,20 +3,11 @@ import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; -import com.eclipsesource.json.WriterConfig; -import launcher.helper.IOHelper; -import launcher.helper.LogHelper; import launcher.serialize.config.entry.BlockConfigEntry; import launchserver.helpers.HTTPRequestHelper; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.util.UUID; import java.util.regex.Pattern; @@ -45,10 +36,11 @@ @Override public AuthProviderResult auth(String login, String password, String ip) throws Throwable { + String clientToken = UUID.randomUUID().toString().replaceAll("-", ""); // https://wiki.vg/Authentication#Payload JsonObject request = Json.object(). add("agent", Json.object().add("name", "Minecraft").add("version", 1)). - add("username", login).add("password", password); + add("username", login).add("password", password).add("clientToken", clientToken); // Verify there's no error JsonObject response = HTTPRequestHelper.makeAuthlibRequest(URL, request, "MineSocial"); @@ -70,7 +62,7 @@ String launcherToken = response.get("clientToken").asString(); // We're done - return new MineSocialAuthProviderResult(username, accessToken, uuid, launcherToken); + return new AuthlibAuthProviderResult(username, accessToken, uuid, launcherToken); } @Override diff --git a/LaunchServer/source/auth/provider/MineSocialAuthProviderResult.java b/LaunchServer/source/auth/provider/MineSocialAuthProviderResult.java deleted file mode 100644 index 70d7c63..0000000 --- a/LaunchServer/source/auth/provider/MineSocialAuthProviderResult.java +++ /dev/null @@ -1,16 +0,0 @@ -package launchserver.auth.provider; - -import java.util.UUID; - -public class MineSocialAuthProviderResult extends AuthProviderResult -{ - public final UUID uuid; - public final String launcherToken; - - MineSocialAuthProviderResult(String username, String accessToken, UUID uuid, String launcherToken) - { - super(username, accessToken); - this.uuid = uuid; - this.launcherToken = launcherToken; - } -} diff --git a/LaunchServer/source/auth/provider/MojangAuthProvider.java b/LaunchServer/source/auth/provider/MojangAuthProvider.java index 3e68d39..f0f1225 100644 --- a/LaunchServer/source/auth/provider/MojangAuthProvider.java +++ b/LaunchServer/source/auth/provider/MojangAuthProvider.java @@ -61,7 +61,7 @@ String launcherToken = response.get("accessToken").asString(); // We're done - return new MojangAuthProviderResult(username, accessToken, uuid, launcherToken); + return new AuthlibAuthProviderResult(username, accessToken, uuid, launcherToken); } @Override diff --git a/LaunchServer/source/auth/provider/MojangAuthProviderResult.java b/LaunchServer/source/auth/provider/MojangAuthProviderResult.java deleted file mode 100644 index 3f5d041..0000000 --- a/LaunchServer/source/auth/provider/MojangAuthProviderResult.java +++ /dev/null @@ -1,16 +0,0 @@ -package launchserver.auth.provider; - -import java.util.UUID; - -public final class MojangAuthProviderResult extends AuthProviderResult -{ - public final UUID uuid; - public final String launcherToken; - - MojangAuthProviderResult(String username, String accessToken, UUID uuid, String launcherToken) - { - super(username, accessToken); - this.uuid = uuid; - this.launcherToken = launcherToken; - } -} diff --git a/LaunchServer/source/texture/ElyByTextureProvider.java b/LaunchServer/source/texture/ElyByTextureProvider.java new file mode 100644 index 0000000..4bca71e --- /dev/null +++ b/LaunchServer/source/texture/ElyByTextureProvider.java @@ -0,0 +1,49 @@ +package launchserver.texture; + +import launcher.client.PlayerProfile.Texture; +import launcher.helper.LogHelper; +import launcher.serialize.config.entry.BlockConfigEntry; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.UUID; + +public class ElyByTextureProvider extends TextureProvider +{ + public ElyByTextureProvider(BlockConfigEntry block) + { + super(block); + } + + private static Texture getTexture(String url, boolean cloak) throws IOException + { + LogHelper.debug("Getting texture: '%s'", url); + try + { + return new Texture(url, cloak); + } + catch (FileNotFoundException ignored) + { + if (LogHelper.isDebugEnabled()) LogHelper.subDebug("Texture not set or not found! Maybe problem with you proxy!"); + return null; // Simply not found + } + } + + @Override + public void close() + { + // Do nothing + } + + @Override + public Texture getCloakTexture(UUID uuid, String username) throws IOException + { + return getTexture(String.format("http://skinsystem.ely.by/cloaks/%s.png", username), true); + } + + @Override + public Texture getSkinTexture(UUID uuid, String username) throws IOException + { + return getTexture(String.format("http://skinsystem.ely.by/skins/%s.png", username), false); + } +} diff --git a/LaunchServer/source/texture/TextureProvider.java b/LaunchServer/source/texture/TextureProvider.java index 12ae44f..b8892a0 100644 --- a/LaunchServer/source/texture/TextureProvider.java +++ b/LaunchServer/source/texture/TextureProvider.java @@ -22,6 +22,7 @@ registerProvider("delegate", DelegateTextureProvider::new); registerProvider("authlib", AuthlibTextureProvider::new); registerProvider("minesocial", MineSocialTextureProvider::new); + registerProvider("elyby", ElyByTextureProvider::new); // Auth providers that doesn't do nothing :D registerProvider("mojang", MojangTextureProvider::new); diff --git a/build/proguard.jar b/build/proguard.jar index 21d93ce..bec3fee 100644 --- a/build/proguard.jar +++ b/build/proguard.jar Binary files differ diff --git a/buildnumber b/buildnumber index 59b7234..672e1b2 100644 --- a/buildnumber +++ b/buildnumber @@ -1 +1 @@ -562, 12.06.2021 \ No newline at end of file +564, 19.07.2021 \ No newline at end of file