diff --git a/bungee/pom.xml b/bungee/pom.xml new file mode 100644 index 0000000..9a8047e --- /dev/null +++ b/bungee/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + com.alterdekim.xcraft.auth + xcraft-auth + 1.0-SNAPSHOT + + + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + + + + bungee + jar + + + + net.md-5 + bungeecord-api + ${bungee.api.version} + provided + + + com.alterdekim.xcraft.auth + common + 1.0-SNAPSHOT + compile + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + org.projectlombok + lombok + 1.18.36 + + + + + + maven-assembly-plugin + + + package + + single + + + + + + jar-with-dependencies + + + + + + \ No newline at end of file diff --git a/bungee/src/main/java/com/alterdekim/xcraft/auth/bungee/XCraft.java b/bungee/src/main/java/com/alterdekim/xcraft/auth/bungee/XCraft.java new file mode 100644 index 0000000..c2ed0b2 --- /dev/null +++ b/bungee/src/main/java/com/alterdekim/xcraft/auth/bungee/XCraft.java @@ -0,0 +1,84 @@ +package com.alterdekim.xcraft.auth.bungee; + +import com.alterdekim.xcraft.auth.SaltNic; +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; + +import static com.alterdekim.xcraft.auth.lib.Patcher.patchAuthLib; + +public class XCraft extends Plugin { + + private static SaltNic server = null; + + public static int SERVER_PORT = 8999; + public static int INTERNAL_PORT = 8999; + public static String PUBLIC_DOMAIN = "localhost"; + public static Boolean USE_HTTPS = false; + + @Override + public void onEnable() { + try { + Configuration config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(getDataFolder(), "config.yml")); + SERVER_PORT = config.getInt("public_port"); + INTERNAL_PORT = config.getInt("internal_port"); + PUBLIC_DOMAIN = config.getString("public_domain"); + USE_HTTPS = config.getBoolean("use_https"); + } catch (IOException e) { + getLogger().info("No config file present"); + makeConfig(); + } + if( server == null ) { + try { + getLogger().info("Starting SaltNic server..."); + server = new SaltNic(getLogger(), INTERNAL_PORT, USE_HTTPS, PUBLIC_DOMAIN, SERVER_PORT); + } catch (IOException e) { + getLogger().severe("Failed to start SaltNic server: " + e.getMessage()); + } + } + getLogger().info("Patching AuthLib URLs..."); + while(true) { + try { + patchAuthLib(getLogger(), INTERNAL_PORT); + getLogger().info("AuthLib URLs patched successfully!"); + return; + } catch (Exception e) { + e.printStackTrace(); + getLogger().severe("Failed to patch AuthLib: " + e.getMessage()); + } + } + } + + @Override + public void onDisable() { + if (server != null) { + server.stop(); + getLogger().info("SaltNic session server stopped."); + server = null; + } + } + + public void makeConfig() { + if (!getDataFolder().exists()) { + getDataFolder().mkdir(); + } + + File file = new File(getDataFolder(), "config.yml"); + + + if (!file.exists()) { + try (InputStream in = getResourceAsStream("config.yml")) { + Files.copy(in, file.toPath()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/bungee/src/main/resources/bungee.yml b/bungee/src/main/resources/bungee.yml new file mode 100644 index 0000000..167aa01 --- /dev/null +++ b/bungee/src/main/resources/bungee.yml @@ -0,0 +1,5 @@ +name: XCraftAuth +main: com.alterdekim.xcraft.auth.bungee.XCraft +version: 1.0 +author: Michael Wain +description: XCraft authentication system for Spigot \ No newline at end of file diff --git a/src/main/resources/config.yml b/bungee/src/main/resources/config.yml similarity index 100% rename from src/main/resources/config.yml rename to bungee/src/main/resources/config.yml diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..41d944a --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + com.alterdekim.xcraft.auth + xcraft-auth + 1.0-SNAPSHOT + + + common + jar + + + + org.nanohttpd + nanohttpd + 2.3.1 + + + org.mindrot + jbcrypt + 0.4 + + + com.jsoniter + jsoniter + 0.9.23 + + + org.mapdb + mapdb + 3.0.0 + + + org.projectlombok + lombok + 1.18.36 + provided + + + \ No newline at end of file diff --git a/src/main/java/com/alterdekim/xcraft/auth/PasswordHasher.java b/common/src/main/java/com/alterdekim/xcraft/auth/PasswordHasher.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/PasswordHasher.java rename to common/src/main/java/com/alterdekim/xcraft/auth/PasswordHasher.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/SaltNic.java b/common/src/main/java/com/alterdekim/xcraft/auth/SaltNic.java similarity index 97% rename from src/main/java/com/alterdekim/xcraft/auth/SaltNic.java rename to common/src/main/java/com/alterdekim/xcraft/auth/SaltNic.java index c8e7f63..fe75602 100644 --- a/src/main/java/com/alterdekim/xcraft/auth/SaltNic.java +++ b/common/src/main/java/com/alterdekim/xcraft/auth/SaltNic.java @@ -22,8 +22,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.logging.Logger; -import static com.alterdekim.xcraft.auth.XCraft.*; - public class SaltNic extends NanoHTTPD { private final Logger logger; @@ -36,13 +34,20 @@ public class SaltNic extends NanoHTTPD { private static final String CAPE_DIRECTORY = "plugins/XCraftAuth/capes"; private static final int MAX_FILE_SIZE = 1024 * 1024; - public SaltNic(Logger logger) throws IOException { - super(INTERNAL_PORT); + private final boolean USE_HTTPS; + private final String PUBLIC_DOMAIN; + private final int SERVER_PORT; + + public SaltNic(Logger logger, int internal_port, boolean use_https, String public_domain, int server_port) throws IOException { + super(internal_port); this.logger = logger; + this.USE_HTTPS = use_https; + this.PUBLIC_DOMAIN = public_domain; + this.SERVER_PORT = server_port; this.storage = new UserStorage(); this.sessions = new ConcurrentHashMap<>(); start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); - logger.info("SaltNic session server started on http://localhost:"+INTERNAL_PORT); + logger.info("SaltNic session server started on http://localhost:"+ internal_port); } @Override diff --git a/src/main/java/com/alterdekim/xcraft/auth/UserId.java b/common/src/main/java/com/alterdekim/xcraft/auth/UserId.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/UserId.java rename to common/src/main/java/com/alterdekim/xcraft/auth/UserId.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/database/User.java b/common/src/main/java/com/alterdekim/xcraft/auth/database/User.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/database/User.java rename to common/src/main/java/com/alterdekim/xcraft/auth/database/User.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/database/UserStorage.java b/common/src/main/java/com/alterdekim/xcraft/auth/database/UserStorage.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/database/UserStorage.java rename to common/src/main/java/com/alterdekim/xcraft/auth/database/UserStorage.java diff --git a/common/src/main/java/com/alterdekim/xcraft/auth/lib/Patcher.java b/common/src/main/java/com/alterdekim/xcraft/auth/lib/Patcher.java new file mode 100644 index 0000000..fbf9d0b --- /dev/null +++ b/common/src/main/java/com/alterdekim/xcraft/auth/lib/Patcher.java @@ -0,0 +1,28 @@ +package com.alterdekim.xcraft.auth.lib; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.util.logging.Logger; + +public class Patcher { + + public static void patchAuthLib(Logger logger, int internal_port) throws Exception { + Class clazz = Class.forName("com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService"); + modifyFinalField(clazz, "BASE_URL", "http://localhost:"+internal_port+"/api/", logger); + modifyFinalField(clazz, "JOIN_URL", new URL("http://localhost:"+internal_port+"/api/join"), logger); + modifyFinalField(clazz, "CHECK_URL", new URL("http://localhost:"+internal_port+"/api/hasJoined"), logger); + } + + private static void modifyFinalField(Class clazz, String fieldName, Object newValue, Logger logger) throws Exception { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + + field.set(null, newValue); + logger.info(fieldName + " patched to: " + newValue); + } +} diff --git a/src/main/java/com/alterdekim/xcraft/auth/request/JoinMinecraftServerRequest.java b/common/src/main/java/com/alterdekim/xcraft/auth/request/JoinMinecraftServerRequest.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/request/JoinMinecraftServerRequest.java rename to common/src/main/java/com/alterdekim/xcraft/auth/request/JoinMinecraftServerRequest.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/request/SignUpRequest.java b/common/src/main/java/com/alterdekim/xcraft/auth/request/SignUpRequest.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/request/SignUpRequest.java rename to common/src/main/java/com/alterdekim/xcraft/auth/request/SignUpRequest.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProfilePropertiesResponse.java b/common/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProfilePropertiesResponse.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProfilePropertiesResponse.java rename to common/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProfilePropertiesResponse.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProfileTexture.java b/common/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProfileTexture.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProfileTexture.java rename to common/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProfileTexture.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProperty.java b/common/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProperty.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProperty.java rename to common/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftProperty.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftTexturesPayload.java b/common/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftTexturesPayload.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/response/MinecraftTexturesPayload.java rename to common/src/main/java/com/alterdekim/xcraft/auth/response/MinecraftTexturesPayload.java diff --git a/src/main/java/com/alterdekim/xcraft/auth/response/SignUpResponse.java b/common/src/main/java/com/alterdekim/xcraft/auth/response/SignUpResponse.java similarity index 100% rename from src/main/java/com/alterdekim/xcraft/auth/response/SignUpResponse.java rename to common/src/main/java/com/alterdekim/xcraft/auth/response/SignUpResponse.java diff --git a/pom.xml b/pom.xml index 66abcc9..b2be1a6 100644 --- a/pom.xml +++ b/pom.xml @@ -7,89 +7,19 @@ com.alterdekim.xcraft.auth xcraft-auth 1.0-SNAPSHOT + pom + + + common + spigot + bungee + 1.8 1.8 UTF-8 + 1.12.2-R0.1-SNAPSHOT + 1.12-SNAPSHOT - - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - - - - org.spigotmc - spigot-api - 1.12.2-R0.1-SNAPSHOT - provided - - - org.nanohttpd - nanohttpd - 2.3.1 - - - org.mindrot - jbcrypt - 0.4 - - - com.jsoniter - jsoniter - 0.9.23 - - - org.projectlombok - lombok - 1.18.36 - provided - - - org.mapdb - mapdb - 3.0.0 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - - - org.projectlombok - lombok - 1.18.36 - - - - - - maven-assembly-plugin - - - package - - single - - - - - - jar-with-dependencies - - - - - \ No newline at end of file diff --git a/spigot/pom.xml b/spigot/pom.xml new file mode 100644 index 0000000..8a83a4e --- /dev/null +++ b/spigot/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + com.alterdekim.xcraft.auth + xcraft-auth + 1.0-SNAPSHOT + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + spigot + jar + + + + org.spigotmc + spigot-api + ${spigot.api.version} + provided + + + com.alterdekim.xcraft.auth + common + 1.0-SNAPSHOT + compile + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + org.projectlombok + lombok + 1.18.36 + + + + + + maven-assembly-plugin + + + package + + single + + + + + + jar-with-dependencies + + + + + + \ No newline at end of file diff --git a/src/main/java/com/alterdekim/xcraft/auth/XCraft.java b/spigot/src/main/java/com/alterdekim/xcraft/auth/spigot/XCraft.java similarity index 60% rename from src/main/java/com/alterdekim/xcraft/auth/XCraft.java rename to spigot/src/main/java/com/alterdekim/xcraft/auth/spigot/XCraft.java index 66fa104..f97f176 100644 --- a/src/main/java/com/alterdekim/xcraft/auth/XCraft.java +++ b/spigot/src/main/java/com/alterdekim/xcraft/auth/spigot/XCraft.java @@ -1,6 +1,7 @@ -package com.alterdekim.xcraft.auth; +package com.alterdekim.xcraft.auth.spigot; +import com.alterdekim.xcraft.auth.SaltNic; import org.bukkit.plugin.java.JavaPlugin; import java.io.IOException; @@ -8,6 +9,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.net.URL; +import static com.alterdekim.xcraft.auth.lib.Patcher.patchAuthLib; + public class XCraft extends JavaPlugin { private static SaltNic server = null; @@ -27,7 +30,7 @@ public class XCraft extends JavaPlugin { INTERNAL_PORT = getConfig().getInt("internal_port"); PUBLIC_DOMAIN = getConfig().getString("public_domain"); USE_HTTPS = getConfig().getBoolean("use_https"); - server = new SaltNic(getLogger()); + server = new SaltNic(getLogger(), INTERNAL_PORT, USE_HTTPS, PUBLIC_DOMAIN, SERVER_PORT); } catch (IOException e) { getLogger().severe("Failed to start SaltNic server: " + e.getMessage()); } @@ -35,7 +38,7 @@ public class XCraft extends JavaPlugin { getLogger().info("Patching AuthLib URLs..."); while(true) { try { - patchAuthLib(); + patchAuthLib(getLogger(), INTERNAL_PORT); getLogger().info("AuthLib URLs patched successfully!"); return; } catch (Exception e) { @@ -45,25 +48,6 @@ public class XCraft extends JavaPlugin { } } - private void patchAuthLib() throws Exception { - Class clazz = Class.forName("com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService"); - modifyFinalField(clazz, "BASE_URL", "http://localhost:"+INTERNAL_PORT+"/api/"); - modifyFinalField(clazz, "JOIN_URL", new URL("http://localhost:"+INTERNAL_PORT+"/api/join")); - modifyFinalField(clazz, "CHECK_URL", new URL("http://localhost:"+INTERNAL_PORT+"/api/hasJoined")); - } - - private void modifyFinalField(Class clazz, String fieldName, Object newValue) throws Exception { - Field field = clazz.getDeclaredField(fieldName); - field.setAccessible(true); - - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - - field.set(null, newValue); - getLogger().info(fieldName + " patched to: " + newValue); - } - @Override public void onDisable() { if (server != null) { diff --git a/spigot/src/main/resources/config.yml b/spigot/src/main/resources/config.yml new file mode 100644 index 0000000..65b2ac3 --- /dev/null +++ b/spigot/src/main/resources/config.yml @@ -0,0 +1,4 @@ +public_domain: "localhost" +public_port: 8999 +internal_port: 8999 +use_https: false \ No newline at end of file diff --git a/spigot/src/main/resources/plugin.yml b/spigot/src/main/resources/plugin.yml new file mode 100644 index 0000000..bbe5788 --- /dev/null +++ b/spigot/src/main/resources/plugin.yml @@ -0,0 +1,6 @@ +name: XCraftAuth +main: com.alterdekim.xcraft.auth.spigot.XCraft +version: 1.0 +author: Michael Wain +api-version: 1.12.2 +description: XCraft authentication system for Spigot \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml deleted file mode 100644 index 1ed9e45..0000000 --- a/src/main/resources/plugin.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: XCraftAuth -main: com.alterdekim.xcraft.auth.XCraft -version: 1.0 -author: Michael Wain -api-version: 1.12.2 -description: XCraft authentication system for Spigot \ No newline at end of file