Merge branch 'release/5.0.8'

This commit is contained in:
Gravit 2019-09-10 05:40:19 +07:00
commit 3ee33b3207
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
76 changed files with 396 additions and 483 deletions

View file

@ -32,7 +32,6 @@ build:
- LaunchServer/*.jar - LaunchServer/*.jar
- ServerWrapper/*.jar - ServerWrapper/*.jar
- modules/*.jar - modules/*.jar
expire_in: 1 week
test: test:
stage: test stage: test
script: script:

View file

@ -177,7 +177,7 @@ task dumpClientLibs(type: Copy) {
from parent.childProjects.Launcher.tasks.dumpLibs.destinationDir from parent.childProjects.Launcher.tasks.dumpLibs.destinationDir
} }
build.dependsOn tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.dumpClientLibs, tasks.bundle, tasks.cleanjar assemble.dependsOn tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.dumpClientLibs, tasks.bundle, tasks.cleanjar
publishing { publishing {

View file

@ -38,7 +38,6 @@
import pro.gravit.launcher.hasher.HashedDir; import pro.gravit.launcher.hasher.HashedDir;
import pro.gravit.launcher.managers.ConfigManager; import pro.gravit.launcher.managers.ConfigManager;
import pro.gravit.launcher.managers.GarbageManager; import pro.gravit.launcher.managers.GarbageManager;
import pro.gravit.launcher.modules.LauncherModulesManager;
import pro.gravit.launcher.modules.events.ClosePhase; import pro.gravit.launcher.modules.events.ClosePhase;
import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.ClientProfile;
import pro.gravit.launchserver.auth.AuthProviderPair; import pro.gravit.launchserver.auth.AuthProviderPair;
@ -50,7 +49,10 @@
import pro.gravit.launchserver.binary.SimpleEXELauncherBinary; import pro.gravit.launchserver.binary.SimpleEXELauncherBinary;
import pro.gravit.launchserver.config.LaunchServerConfig; import pro.gravit.launchserver.config.LaunchServerConfig;
import pro.gravit.launchserver.config.LaunchServerRuntimeConfig; import pro.gravit.launchserver.config.LaunchServerRuntimeConfig;
import pro.gravit.launchserver.manangers.*; import pro.gravit.launchserver.manangers.CertificateManager;
import pro.gravit.launchserver.manangers.MirrorManager;
import pro.gravit.launchserver.manangers.ReconfigurableManager;
import pro.gravit.launchserver.manangers.SessionManager;
import pro.gravit.launchserver.manangers.hook.AuthHookManager; import pro.gravit.launchserver.manangers.hook.AuthHookManager;
import pro.gravit.launchserver.manangers.hook.BuildHookManager; import pro.gravit.launchserver.manangers.hook.BuildHookManager;
import pro.gravit.launchserver.modules.events.LaunchServerFullInitEvent; import pro.gravit.launchserver.modules.events.LaunchServerFullInitEvent;
@ -59,7 +61,9 @@
import pro.gravit.launchserver.modules.events.NewLaunchServerInstanceEvent; import pro.gravit.launchserver.modules.events.NewLaunchServerInstanceEvent;
import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager; import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager;
import pro.gravit.launchserver.socket.handlers.NettyServerSocketHandler; import pro.gravit.launchserver.socket.handlers.NettyServerSocketHandler;
import pro.gravit.utils.command.*; import pro.gravit.utils.command.Command;
import pro.gravit.utils.command.CommandHandler;
import pro.gravit.utils.command.SubCommand;
import pro.gravit.utils.helper.CommonHelper; import pro.gravit.utils.helper.CommonHelper;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.JVMHelper; import pro.gravit.utils.helper.JVMHelper;

View file

@ -1,14 +1,14 @@
package pro.gravit.launchserver; package pro.gravit.launchserver;
import java.nio.file.Path;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import pro.gravit.launchserver.config.LaunchServerConfig; import pro.gravit.launchserver.config.LaunchServerConfig;
import pro.gravit.launchserver.config.LaunchServerRuntimeConfig; import pro.gravit.launchserver.config.LaunchServerRuntimeConfig;
import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager; import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager;
import pro.gravit.utils.command.CommandHandler; import pro.gravit.utils.command.CommandHandler;
import java.nio.file.Path;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class LaunchServerBuilder { public class LaunchServerBuilder {
private LaunchServerConfig config; private LaunchServerConfig config;
private LaunchServerRuntimeConfig runtimeConfig; private LaunchServerRuntimeConfig runtimeConfig;

View file

@ -1,5 +1,15 @@
package pro.gravit.launchserver; package pro.gravit.launchserver;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.KeyPair;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.hwid.HWIDProvider; import pro.gravit.launcher.hwid.HWIDProvider;
import pro.gravit.launcher.modules.events.PreConfigPhase; import pro.gravit.launcher.modules.events.PreConfigPhase;
@ -24,16 +34,6 @@
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;
import pro.gravit.utils.helper.SecurityHelper; import pro.gravit.utils.helper.SecurityHelper;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.KeyPair;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class LaunchServerStarter { public class LaunchServerStarter {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
JVMHelper.checkStackTrace(LaunchServerStarter.class); JVMHelper.checkStackTrace(LaunchServerStarter.class);

View file

@ -1,9 +1,9 @@
package pro.gravit.launchserver; package pro.gravit.launchserver;
import pro.gravit.utils.command.Command;
import java.util.Map; import java.util.Map;
import pro.gravit.utils.command.Command;
/** /**
* Allows calling commands using the config command * Allows calling commands using the config command
*/ */

View file

@ -1,16 +1,17 @@
package pro.gravit.launchserver.auth; package pro.gravit.launchserver.auth;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.postgresql.ds.PGSimpleDataSource;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;
import pro.gravit.utils.helper.VerifyHelper; import pro.gravit.utils.helper.VerifyHelper;
import org.postgresql.ds.PGSimpleDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public final class PostgreSQLSourceConfig implements AutoCloseable { public final class PostgreSQLSourceConfig implements AutoCloseable {
public static final int TIMEOUT = VerifyHelper.verifyInt( public static final int TIMEOUT = VerifyHelper.verifyInt(
Integer.parseUnsignedInt(System.getProperty("launcher.postgresql.idleTimeout", Integer.toString(5000))), Integer.parseUnsignedInt(System.getProperty("launcher.postgresql.idleTimeout", Integer.toString(5000))),

View file

@ -15,7 +15,11 @@
import pro.gravit.launchserver.auth.provider.AuthProviderResult; import pro.gravit.launchserver.auth.provider.AuthProviderResult;
import pro.gravit.utils.command.Command; import pro.gravit.utils.command.Command;
import pro.gravit.utils.command.SubCommand; import pro.gravit.utils.command.SubCommand;
import pro.gravit.utils.helper.*; import pro.gravit.utils.helper.CommonHelper;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper;
import pro.gravit.utils.helper.SecurityHelper;
import pro.gravit.utils.helper.VerifyHelper;
public abstract class CachedAuthHandler extends AuthHandler implements NeedGarbageCollection, Reconfigurable { public abstract class CachedAuthHandler extends AuthHandler implements NeedGarbageCollection, Reconfigurable {
public static final class Entry { public static final class Entry {

View file

@ -1,13 +1,16 @@
package pro.gravit.launchserver.auth.handler; package pro.gravit.launchserver.auth.handler;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;
import org.postgresql.util.PGobject; import org.postgresql.util.PGobject;
import pro.gravit.launchserver.auth.PostgreSQLSourceConfig; import pro.gravit.launchserver.auth.PostgreSQLSourceConfig;
import java.io.IOException;
import java.sql.*;
import java.util.UUID;
public final class PostgreSQLAuthHandler extends CachedAuthHandler { public final class PostgreSQLAuthHandler extends CachedAuthHandler {
private PostgreSQLSourceConfig postgreSQLHolder; private PostgreSQLSourceConfig postgreSQLHolder;
private String uuidColumn; private String uuidColumn;

View file

@ -12,8 +12,8 @@
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import pro.gravit.launcher.hwid.HWID;
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.hwid.HWID;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;

View file

@ -9,7 +9,13 @@
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.binary.tasks.*; import pro.gravit.launchserver.binary.tasks.AdditionalFixesApplyTask;
import pro.gravit.launchserver.binary.tasks.AttachJarsTask;
import pro.gravit.launchserver.binary.tasks.CompressBuildTask;
import pro.gravit.launchserver.binary.tasks.LauncherBuildTask;
import pro.gravit.launchserver.binary.tasks.MainBuildTask;
import pro.gravit.launchserver.binary.tasks.PrepareBuildTask;
import pro.gravit.launchserver.binary.tasks.ProGuardBuildTask;
import pro.gravit.utils.helper.CommonHelper; import pro.gravit.utils.helper.CommonHelper;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;

View file

@ -2,6 +2,7 @@
import org.objectweb.asm.ClassWriter; import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnList;
@ -12,15 +13,10 @@
import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TypeInsnNode; import org.objectweb.asm.tree.TypeInsnNode;
import org.objectweb.asm.tree.VarInsnNode; import org.objectweb.asm.tree.VarInsnNode;
import org.objectweb.asm.Type;
import pro.gravit.launcher.AutogenConfig; import pro.gravit.launcher.AutogenConfig;
import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.LauncherConfig; import pro.gravit.launcher.LauncherConfig;
import pro.gravit.launcher.modules.LauncherModule; import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.LauncherModulesManager;
import pro.gravit.launcher.modules.Module;
import pro.gravit.launcher.modules.ModulesManager;
import pro.gravit.launchserver.asm.ClassMetadataReader; import pro.gravit.launchserver.asm.ClassMetadataReader;
import pro.gravit.launchserver.asm.SafeClassWriter; import pro.gravit.launchserver.asm.SafeClassWriter;
@ -66,36 +62,33 @@ public String getZipEntryPath() {
} }
public void setAddress(String address) { public void setAddress(String address) {
constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); setStringField("address", address);
constructor.instructions.add(new LdcInsnNode(address));
constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, "address", stringDesc));
} }
public void setProjectName(String name) { public void setProjectName(String name) {
constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); setStringField("projectname", name);
constructor.instructions.add(new LdcInsnNode(name));
constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, "projectname", stringDesc));
} }
public void setSecretKey(String key) { public void setSecretKey(String key) {
constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); setStringField("secretKeyClient", key);
constructor.instructions.add(new LdcInsnNode(key));
constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, "secretKeyClient", stringDesc));
} }
public void setOemUnlockKey(String key) { public void setOemUnlockKey(String key) {
setStringField("oemUnlockKey", key);
}
private void setStringField(String name, String value)
{
constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
constructor.instructions.add(new LdcInsnNode(key)); constructor.instructions.add(new LdcInsnNode(value));
constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, "oemUnlockKey", stringDesc)); constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, name, stringDesc));
} }
public void setGuardType(String key) { public void setGuardType(String key) {
constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); setStringField("guardType", key);
constructor.instructions.add(new LdcInsnNode(key));
constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, "guardType", stringDesc));
} }
public void push(final int value) { private void push(final int value) {
if (value >= -1 && value <= 5) if (value >= -1 && value <= 5)
constructor.instructions.add(new InsnNode(Opcodes.ICONST_0 + value)); constructor.instructions.add(new InsnNode(Opcodes.ICONST_0 + value));
else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE)
@ -129,15 +122,25 @@ public void setEnv(LauncherConfig.LauncherEnvironment env) {
} }
public void setClientPort(int port) { public void setClientPort(int port) {
setIntegerField("clientPort", port);
}
public void setIntegerField(String name, int value)
{
constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
push(port); push(value);
constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, "clientPort", Type.INT_TYPE.getInternalName())); constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, name, Type.INT_TYPE.getInternalName()));
} }
public void setWarningMissArchJava(boolean b) { public void setWarningMissArchJava(boolean b) {
setBooleanField("isWarningMissArchJava", b);
}
private void setBooleanField(String name, boolean b)
{
constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); constructor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
constructor.instructions.add(new InsnNode(b ? Opcodes.ICONST_1 : Opcodes.ICONST_0)); constructor.instructions.add(new InsnNode(b ? Opcodes.ICONST_1 : Opcodes.ICONST_0));
constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, "isWarningMissArchJava", Type.BOOLEAN_TYPE.getInternalName())); constructor.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, autoGenConfigName, name, Type.BOOLEAN_TYPE.getInternalName()));
} }
public void setGuardLicense(String name, String key, String encryptKey) { public void setGuardLicense(String name, String key, String encryptKey) {

View file

@ -19,11 +19,12 @@ public class ProguardConf {
private static final String chars = "1aAbBcC2dDeEfF3gGhHiI4jJkKl5mMnNoO6pPqQrR7sStT8uUvV9wWxX0yYzZ"; private static final String chars = "1aAbBcC2dDeEfF3gGhHiI4jJkKl5mMnNoO6pPqQrR7sStT8uUvV9wWxX0yYzZ";
private static String generateString(SecureRandom rand, String lowString, String upString, int il) { private static String generateString(SecureRandom rand, String lowString, String upString, int il) {
StringBuilder sb = new StringBuilder(il + lowString.length()); StringBuilder sb = new StringBuilder(Math.max(il, lowString.length()));
for (int i = 0; i < lowString.length(); ++i) { for (int i = 0; i < lowString.length(); ++i) {
sb.append(rand.nextBoolean() ? lowString.charAt(i) : upString.charAt(i)); sb.append(rand.nextBoolean() ? lowString.charAt(i) : upString.charAt(i));
} }
for (int i = 0; i < il - 1; i++) sb.append(chars.charAt(rand.nextInt(chars.length()))); int toI = il - lowString.length();
for (int i = 0; i < toI; i++) sb.append(chars.charAt(rand.nextInt(chars.length())));
return sb.toString(); return sb.toString();
} }
@ -74,7 +75,7 @@ public void genWords(boolean force) throws IOException {
String projectName = srv.config.projectName.replaceAll("\\W", ""); String projectName = srv.config.projectName.replaceAll("\\W", "");
String lowName = projectName.toLowerCase(); String lowName = projectName.toLowerCase();
String upName = projectName.toUpperCase(); String upName = projectName.toUpperCase();
for (int i = 0; i < Short.MAX_VALUE; i++) out.println(generateString(rand, lowName, upName, 3)); for (int i = 0; i < Short.MAX_VALUE; i++) out.println(generateString(rand, lowName, upName, 14));
} }
} }

View file

@ -1,13 +1,13 @@
package pro.gravit.launchserver.binary; package pro.gravit.launchserver.binary;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.file.Path; import java.nio.file.Path;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper;
public class SimpleEXELauncherBinary extends LauncherBinary { public class SimpleEXELauncherBinary extends LauncherBinary {
public Path exeTemplate; public Path exeTemplate;
public SimpleEXELauncherBinary(LaunchServer server) { public SimpleEXELauncherBinary(LaunchServer server) {

View file

@ -1,8 +1,5 @@
package pro.gravit.launchserver.binary.tasks; package pro.gravit.launchserver.binary.tasks;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.IOHelper;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.zip.Deflater; import java.util.zip.Deflater;
@ -10,6 +7,9 @@
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.IOHelper;
public class CompressBuildTask implements LauncherBuildTask { public class CompressBuildTask implements LauncherBuildTask {
public transient final LaunchServer server; public transient final LaunchServer server;

View file

@ -1,9 +1,9 @@
package pro.gravit.launchserver.command; package pro.gravit.launchserver.command;
import pro.gravit.launchserver.LaunchServer;
import java.util.Map; import java.util.Map;
import pro.gravit.launchserver.LaunchServer;
public abstract class Command extends pro.gravit.utils.command.Command { public abstract class Command extends pro.gravit.utils.command.Command {

View file

@ -28,7 +28,13 @@
import pro.gravit.launchserver.command.install.MultiCommand; import pro.gravit.launchserver.command.install.MultiCommand;
import pro.gravit.launchserver.command.modules.LoadModuleCommand; import pro.gravit.launchserver.command.modules.LoadModuleCommand;
import pro.gravit.launchserver.command.modules.ModulesCommand; import pro.gravit.launchserver.command.modules.ModulesCommand;
import pro.gravit.launchserver.command.service.*; import pro.gravit.launchserver.command.service.ClientsCommand;
import pro.gravit.launchserver.command.service.ComponentCommand;
import pro.gravit.launchserver.command.service.ConfigCommand;
import pro.gravit.launchserver.command.service.GetModulusCommand;
import pro.gravit.launchserver.command.service.GetPermissionsCommand;
import pro.gravit.launchserver.command.service.GivePermissionsCommand;
import pro.gravit.launchserver.command.service.ServerStatusCommand;
import pro.gravit.utils.command.BaseCommandCategory; import pro.gravit.utils.command.BaseCommandCategory;
import pro.gravit.utils.command.basic.ClearCommand; import pro.gravit.utils.command.basic.ClearCommand;
import pro.gravit.utils.command.basic.DebugCommand; import pro.gravit.utils.command.basic.DebugCommand;

View file

@ -1,6 +1,5 @@
package pro.gravit.launchserver.command.modules; package pro.gravit.launchserver.command.modules;
import java.net.URI;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;

View file

@ -1,8 +1,5 @@
package pro.gravit.launchserver.components; package pro.gravit.launchserver.components;
import java.util.ArrayList;
import java.util.List;
import pro.gravit.launcher.NeedGarbageCollection; import pro.gravit.launcher.NeedGarbageCollection;
import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.socket.Client; import pro.gravit.launchserver.socket.Client;

View file

@ -1,5 +1,11 @@
package pro.gravit.launchserver.config; package pro.gravit.launchserver.config;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import io.netty.channel.epoll.Epoll; import io.netty.channel.epoll.Epoll;
import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LogLevel;
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
@ -24,12 +30,6 @@
import pro.gravit.utils.helper.JVMHelper; import pro.gravit.utils.helper.JVMHelper;
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public final class LaunchServerConfig { public final class LaunchServerConfig {
private transient LaunchServer server = null; private transient LaunchServer server = null;

View file

@ -30,6 +30,7 @@ public class User {
private long id; private long id;
@Column(unique = true) @Column(unique = true)
public String username; public String username;
public String email;
@Column(unique = true) @Column(unique = true)
public UUID uuid; public UUID uuid;
@Column(name = "password") @Column(name = "password")
@ -66,8 +67,6 @@ public boolean verifyPassword(String password)
return false; return false;
} }
byte[] enpassword = digest.digest(password.concat(password_salt).getBytes(StandardCharsets.UTF_8)); byte[] enpassword = digest.digest(password.concat(password_salt).getBytes(StandardCharsets.UTF_8));
LogHelper.info(Arrays.toString(enpassword));
LogHelper.info(Arrays.toString(this.password));
return Arrays.equals(enpassword, this.password); return Arrays.equals(enpassword, this.password);
} }
public ClientPermissions getPermissions() public ClientPermissions getPermissions()

View file

@ -1,6 +1,9 @@
package pro.gravit.launchserver.dao.provider; package pro.gravit.launchserver.dao.provider;
import java.nio.file.Paths;
import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Configuration;
import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.dao.User; import pro.gravit.launchserver.dao.User;
import pro.gravit.launchserver.dao.UserHWID; import pro.gravit.launchserver.dao.UserHWID;
@ -8,13 +11,12 @@
import pro.gravit.launchserver.dao.impl.HibernateUserDAOImpl; import pro.gravit.launchserver.dao.impl.HibernateUserDAOImpl;
import pro.gravit.utils.helper.CommonHelper; import pro.gravit.utils.helper.CommonHelper;
import java.nio.file.Paths;
public class HibernateDaoProvider extends DaoProvider { public class HibernateDaoProvider extends DaoProvider {
public String driver; public String driver;
public String url; public String url;
public String username; public String username;
public String password; public String password;
public String dialect;
public String pool_size; public String pool_size;
public String hibernateConfig; public String hibernateConfig;
public boolean parallelHibernateInit; public boolean parallelHibernateInit;
@ -30,6 +32,8 @@ public void init(LaunchServer server) {
.setProperty("hibernate.connection.username", username) .setProperty("hibernate.connection.username", username)
.setProperty("hibernate.connection.password", password) .setProperty("hibernate.connection.password", password)
.setProperty("hibernate.connection.pool_size", pool_size); .setProperty("hibernate.connection.pool_size", pool_size);
if(dialect != null)
cfg.setProperty("hibernate.dialect", dialect);
if(hibernateConfig != null) if(hibernateConfig != null)
cfg.configure(Paths.get(hibernateConfig).toFile()); cfg.configure(Paths.get(hibernateConfig).toFile());
userDAO = new HibernateUserDAOImpl(cfg.buildSessionFactory()); userDAO = new HibernateUserDAOImpl(cfg.buildSessionFactory());

View file

@ -1,43 +0,0 @@
package pro.gravit.launchserver.modules;
import pro.gravit.launcher.modules.Module;
import pro.gravit.launcher.modules.ModuleContext;
import pro.gravit.utils.Version;
public class CoreModule implements Module {
@Override
public void close() {
// nothing to do
}
@Override
public String getName() {
return "LaunchServer";
}
@Override
public Version getVersion() {
return Version.getVersion();
}
@Override
public int getPriority() {
return 0;
}
@Override
public void init(ModuleContext context) {
// nothing to do
}
@Override
public void postInit(ModuleContext context) {
// nothing to do
}
@Override
public void preInit(ModuleContext context) {
// nothing to do
}
}

View file

@ -1,35 +0,0 @@
package pro.gravit.launchserver.modules;
import pro.gravit.launcher.managers.SimpleModulesConfigManager;
import pro.gravit.launcher.modules.ModuleContext;
import pro.gravit.launcher.modules.ModulesConfigManager;
import pro.gravit.launcher.modules.ModulesManager;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.PublicURLClassLoader;
public class LaunchServerModuleContext implements ModuleContext {
public final LaunchServer launchServer;
public final PublicURLClassLoader classloader;
public final SimpleModulesConfigManager modulesConfigManager;
public LaunchServerModuleContext(LaunchServer server, PublicURLClassLoader classloader, SimpleModulesConfigManager modulesConfigManager) {
launchServer = server;
this.classloader = classloader;
this.modulesConfigManager = modulesConfigManager;
}
@Override
public Type getType() {
return Type.LAUNCHSERVER;
}
@Override
public ModulesManager getModulesManager() {
return null;
}
@Override
public ModulesConfigManager getModulesConfigManager() {
return modulesConfigManager;
}
}

View file

@ -1,43 +0,0 @@
package pro.gravit.launchserver.modules;
import pro.gravit.launcher.modules.Module;
import pro.gravit.launcher.modules.ModuleContext;
import pro.gravit.utils.Version;
public class SimpleModule implements Module {
@Override
public void close() {
// on stop
}
@Override
public String getName() {
return "SimpleModule";
}
@Override
public Version getVersion() {
return new Version(1, 0, 0, 0, Version.Type.UNKNOWN);
}
@Override
public int getPriority() {
return 0;
}
@Override
public void init(ModuleContext context) {
}
@Override
public void postInit(ModuleContext context) {
}
@Override
public void preInit(ModuleContext context) {
}
}

View file

@ -1,6 +1,5 @@
package pro.gravit.launchserver.modules.events; package pro.gravit.launchserver.modules.events;
import pro.gravit.launcher.modules.events.InitPhase;
import pro.gravit.launcher.modules.events.PostInitPhase; import pro.gravit.launcher.modules.events.PostInitPhase;
import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.LaunchServer;

View file

@ -5,7 +5,6 @@
import pro.gravit.launcher.modules.LauncherModuleInfo; import pro.gravit.launcher.modules.LauncherModuleInfo;
import pro.gravit.launcher.modules.events.InitPhase; import pro.gravit.launcher.modules.events.InitPhase;
import pro.gravit.utils.Version; import pro.gravit.utils.Version;
import pro.gravit.utils.helper.LogHelper;
public class LaunchServerCoreModule extends LauncherModule { public class LaunchServerCoreModule extends LauncherModule {
public LaunchServerCoreModule() { public LaunchServerCoreModule() {

View file

@ -1,14 +1,14 @@
package pro.gravit.launchserver.modules.impl; package pro.gravit.launchserver.modules.impl;
import java.nio.file.Path;
import java.util.Arrays;
import pro.gravit.launcher.modules.LauncherModule; import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.LauncherModuleInfo; import pro.gravit.launcher.modules.LauncherModuleInfo;
import pro.gravit.launcher.modules.impl.SimpleModuleManager; import pro.gravit.launcher.modules.impl.SimpleModuleManager;
import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;
import java.nio.file.Path;
import java.util.Arrays;
public class LaunchServerModulesManager extends SimpleModuleManager { public class LaunchServerModulesManager extends SimpleModuleManager {
public LaunchServerCoreModule coreModule; public LaunchServerCoreModule coreModule;
public LaunchServerModulesManager(Path modulesDir, Path configDir) { public LaunchServerModulesManager(Path modulesDir, Path configDir) {

View file

@ -1,7 +1,6 @@
package pro.gravit.launchserver.socket; package pro.gravit.launchserver.socket;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.HashMap;
import com.google.gson.Gson; import com.google.gson.Gson;
@ -21,14 +20,7 @@
import pro.gravit.launchserver.socket.response.WebSocketServerResponse; import pro.gravit.launchserver.socket.response.WebSocketServerResponse;
import pro.gravit.launchserver.socket.response.admin.AddLogListenerResponse; import pro.gravit.launchserver.socket.response.admin.AddLogListenerResponse;
import pro.gravit.launchserver.socket.response.admin.ExecCommandResponse; import pro.gravit.launchserver.socket.response.admin.ExecCommandResponse;
import pro.gravit.launchserver.socket.response.auth.AuthResponse; import pro.gravit.launchserver.socket.response.auth.*;
import pro.gravit.launchserver.socket.response.auth.CheckServerResponse;
import pro.gravit.launchserver.socket.response.auth.GetAvailabilityAuthResponse;
import pro.gravit.launchserver.socket.response.auth.JoinServerResponse;
import pro.gravit.launchserver.socket.response.auth.ProfilesResponse;
import pro.gravit.launchserver.socket.response.auth.RegisterResponse;
import pro.gravit.launchserver.socket.response.auth.RestoreSessionResponse;
import pro.gravit.launchserver.socket.response.auth.SetProfileResponse;
import pro.gravit.launchserver.socket.response.profile.BatchProfileByUsername; import pro.gravit.launchserver.socket.response.profile.BatchProfileByUsername;
import pro.gravit.launchserver.socket.response.profile.ProfileByUUIDResponse; import pro.gravit.launchserver.socket.response.profile.ProfileByUUIDResponse;
import pro.gravit.launchserver.socket.response.profile.ProfileByUsername; import pro.gravit.launchserver.socket.response.profile.ProfileByUsername;
@ -42,7 +34,6 @@
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;
@SuppressWarnings("rawtypes")
public class WebSocketService { public class WebSocketService {
public final ChannelGroup channels; public final ChannelGroup channels;
public static ProviderMap<WebSocketServerResponse> providers = new ProviderMap<>(); public static ProviderMap<WebSocketServerResponse> providers = new ProviderMap<>();
@ -132,6 +123,7 @@ public static void registerResponses() {
providers.register("verifySecureToken", VerifySecureTokenResponse.class); providers.register("verifySecureToken", VerifySecureTokenResponse.class);
providers.register("getAvailabilityAuth", GetAvailabilityAuthResponse.class); providers.register("getAvailabilityAuth", GetAvailabilityAuthResponse.class);
providers.register("register", RegisterResponse.class); providers.register("register", RegisterResponse.class);
providers.register("setPassword", SetPasswordResponse.class);
} }
public void sendObject(ChannelHandlerContext ctx, Object obj) { public void sendObject(ChannelHandlerContext ctx, Object obj) {

View file

@ -9,9 +9,9 @@
import javax.crypto.IllegalBlockSizeException; import javax.crypto.IllegalBlockSizeException;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import pro.gravit.launcher.events.request.AuthRequestEvent;
import pro.gravit.launcher.hwid.HWID; import pro.gravit.launcher.hwid.HWID;
import pro.gravit.launcher.hwid.OshiHWID; import pro.gravit.launcher.hwid.OshiHWID;
import pro.gravit.launcher.events.request.AuthRequestEvent;
import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.ClientProfile;
import pro.gravit.launchserver.auth.AuthException; import pro.gravit.launchserver.auth.AuthException;
import pro.gravit.launchserver.auth.AuthProviderPair; import pro.gravit.launchserver.auth.AuthProviderPair;

View file

@ -1,19 +1,20 @@
package pro.gravit.launchserver.socket.response.auth; package pro.gravit.launchserver.socket.response.auth;
import io.netty.channel.ChannelHandlerContext;
import pro.gravit.launchserver.dao.User;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.SimpleResponse;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.Arrays; import java.util.Arrays;
import java.util.UUID; import java.util.UUID;
import io.netty.channel.ChannelHandlerContext;
import pro.gravit.launchserver.dao.User;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.SimpleResponse;
public class RegisterResponse extends SimpleResponse { public class RegisterResponse extends SimpleResponse {
public String login; public String login;
public String password; public String password;
public String email;
public byte[] verifyHash; public byte[] verifyHash;
@Override @Override
public void execute(ChannelHandlerContext ctx, Client client) throws Exception public void execute(ChannelHandlerContext ctx, Client client) throws Exception
@ -32,6 +33,7 @@ public void execute(ChannelHandlerContext ctx, Client client) throws Exception
} }
User user = new User(); User user = new User();
user.username = login; user.username = login;
user.email = email;
user.setPassword(password); user.setPassword(password);
user.uuid = UUID.randomUUID(); user.uuid = UUID.randomUUID();
server.config.dao.userService.saveUser(user); server.config.dao.userService.saveUser(user);

View file

@ -0,0 +1,55 @@
package pro.gravit.launchserver.socket.response.auth;
import io.netty.channel.ChannelHandlerContext;
import pro.gravit.launcher.events.request.SetPasswordRequestEvent;
import pro.gravit.launchserver.dao.User;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.launchserver.socket.response.SimpleResponse;
public class SetPasswordResponse extends SimpleResponse {
public String oldPassword;
public String newPassword;
public String username;
@Override
public String getType() {
return "setPassword";
}
@Override
public void execute(ChannelHandlerContext ctx, Client client) throws Exception {
if(( oldPassword == null && username == null ) || newPassword == null)
{
sendError("Request invalid");
return;
}
if(!client.isAuth)
{
sendError("You not authorized");
return;
}
if(username != null && !client.permissions.canAdmin)
{
sendError("You not admin");
return;
}
if(username != null)
{
User user = server.config.dao.userService.findUserByUsername(username);
user.setPassword(newPassword);
sendResult(new SetPasswordRequestEvent());
}
else
{
User user = server.config.dao.userService.findUserByUsername(client.username);
if(user.verifyPassword(oldPassword))
{
user.setPassword(newPassword);
sendResult(new SetPasswordRequestEvent());
}
else
{
sendError("Old password incorrect");
}
}
}
}

View file

@ -1,23 +1,23 @@
package pro.gravit.launchserver; package pro.gravit.launchserver;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.managers.SimpleModulesConfigManager;
import pro.gravit.launchserver.config.LaunchServerConfig;
import pro.gravit.launchserver.config.LaunchServerRuntimeConfig;
import pro.gravit.launchserver.manangers.LaunchServerGsonManager;
import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager;
import pro.gravit.utils.command.StdCommandHandler;
import pro.gravit.utils.helper.SecurityHelper;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.security.KeyPair; import java.security.KeyPair;
import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey; import java.security.interfaces.RSAPublicKey;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import pro.gravit.launcher.Launcher;
import pro.gravit.launchserver.config.LaunchServerConfig;
import pro.gravit.launchserver.config.LaunchServerRuntimeConfig;
import pro.gravit.launchserver.manangers.LaunchServerGsonManager;
import pro.gravit.launchserver.modules.impl.LaunchServerModulesManager;
import pro.gravit.utils.command.StdCommandHandler;
import pro.gravit.utils.helper.SecurityHelper;
public class StartLaunchServerTest { public class StartLaunchServerTest {
@TempDir @TempDir
public static Path modulesDir; public static Path modulesDir;
@ -30,7 +30,6 @@ public class StartLaunchServerTest {
public static void prepare() throws Exception public static void prepare() throws Exception
{ {
LaunchServerModulesManager modulesManager = new LaunchServerModulesManager(modulesDir, configDir); LaunchServerModulesManager modulesManager = new LaunchServerModulesManager(modulesDir, configDir);
SimpleModulesConfigManager configManager = new SimpleModulesConfigManager(configDir);
LaunchServerConfig config = LaunchServerConfig.getDefault(LaunchServer.LaunchServerEnv.TEST); LaunchServerConfig config = LaunchServerConfig.getDefault(LaunchServer.LaunchServerEnv.TEST);
Launcher.gsonManager = new LaunchServerGsonManager(modulesManager); Launcher.gsonManager = new LaunchServerGsonManager(modulesManager);
Launcher.gsonManager.initGson(); Launcher.gsonManager.initGson();

View file

@ -66,7 +66,7 @@ task dumpLibs(type: Copy) {
} }
build.dependsOn tasks.genRuntimeJS, tasks.dumpLibs, tasks.shadowJar assemble.dependsOn tasks.genRuntimeJS, tasks.dumpLibs, tasks.shadowJar
publishing { publishing {
publications { publications {

View file

@ -4,12 +4,20 @@ var config = {
title: "GravitLauncher", // Заголовок окна title: "GravitLauncher", // Заголовок окна
icons: ["favicon.png"], // Путь/Пути до иконки окна icons: ["favicon.png"], // Путь/Пути до иконки окна
//*** Меню авторизации ***// links: [
linkText: "GravitLauncher", // Текст ссылки //*** Ссылки ***//
linkURL: new java.net.URL("https://gravit.pro"), // Ссылка {
id: "link",
text: "GravitLauncher",
url: "https://gravit.pro",
},
//*** Меню выбора серверов ***// {
discord: new java.net.URL("https://discord.gg/aJK6nMN"), // Ссылка id: "discord",
text: "",
url: "https://discord.gg/aJK6nMN",
}
],
//*** Стандартные настройки клиента ***// //*** Стандартные настройки клиента ***//
autoEnterDefault: false, // Автоматический вход на выбранный сервер autoEnterDefault: false, // Автоматический вход на выбранный сервер

View file

@ -37,7 +37,6 @@ function initLoginScene() {
bar = pane; bar = pane;
loginPane.lookup("#close").setOnAction(function(event) { javafx.application.Platform.exit() }); loginPane.lookup("#close").setOnAction(function(event) { javafx.application.Platform.exit() });
loginPane.lookup("#hide").setOnAction(function(event) { stage.setIconified(true) }); loginPane.lookup("#hide").setOnAction(function(event) { stage.setIconified(true) });
loginPane.lookup("#discord").setOnAction(function() { openURL(config.discord); });
var pane = loginPane.lookup("#authPane"); var pane = loginPane.lookup("#authPane");
authPane = pane; authPane = pane;
@ -63,13 +62,23 @@ function initLoginScene() {
savePasswordBox = pane.lookup("#rememberchb"); savePasswordBox = pane.lookup("#rememberchb");
savePasswordBox.setSelected(settings.login === null || settings.rsaPassword !== null); savePasswordBox.setSelected(settings.login === null || settings.rsaPassword !== null);
var link = pane.lookup("#link");
link.setText(config.linkText);
link.setOnAction(function(event) app.getHostServices().showDocument(config.linkURL.toURI()));
authOptions = pane.lookup("#authOptions"); authOptions = pane.lookup("#authOptions");
pane.lookup("#goAuth").setOnAction(goAuth); pane.lookup("#goAuth").setOnAction(goAuth);
var pane = loginPane;
config.links.forEach(function(link) {
var el = pane.lookup("#link_" + link.id);
if (el === null) return;
el.setOnAction(function() {
openURL(new java.net.URL(link.url));
});
if (link.text === "") return;
el.setText(link.text);
});
} }
/* ======== init Menu window======== */ /* ======== init Menu window======== */
@ -88,7 +97,6 @@ function initMenuScene() {
bar = pane; bar = pane;
pane.lookup("#close").setOnAction(function(event) { javafx.application.Platform.exit() }); pane.lookup("#close").setOnAction(function(event) { javafx.application.Platform.exit() });
pane.lookup("#hide").setOnAction(function(event) { stage.setIconified(true) }); pane.lookup("#hide").setOnAction(function(event) { stage.setIconified(true) });
pane.lookup("#discord").setOnAction(function() { openURL(config.discord); });
pane.lookup("#settings").setOnAction(goSettings); pane.lookup("#settings").setOnAction(goSettings);
pane.lookup("#goConsole").setOnAction(goConsole); pane.lookup("#goConsole").setOnAction(goConsole);
@ -112,6 +120,19 @@ function initMenuScene() {
setCurrentScene(loginScene); setCurrentScene(loginScene);
}); });
var pane = menuPane;
config.links.forEach(function(link) {
var el = pane.lookup("#link_" + link.id);
if (el === null) return;
el.setOnAction(function() {
openURL(new java.net.URL(link.url));
});
if (link.text === "") return;
el.setText(link.text);
});
} }
/* ======== init Console window======== */ /* ======== init Console window======== */

View file

@ -32,7 +32,7 @@
<String fx:value="combologin-popup" /> <String fx:value="combologin-popup" />
</styleClass> </styleClass>
</ComboBox> </ComboBox>
<Hyperlink id="link" fx:id="link" layoutX="94.0" layoutY="422.0" prefHeight="19.0" prefWidth="81.0" textAlignment="CENTER" /> <Hyperlink id="link_link" fx:id="link" layoutX="94.0" layoutY="422.0" prefHeight="19.0" prefWidth="81.0" textAlignment="CENTER" />
</children> </children>
</Pane> </Pane>
<Pane fx:id="news" prefHeight="432.0" prefWidth="423.0" styleClass="news" /> <Pane fx:id="news" prefHeight="432.0" prefWidth="423.0" styleClass="news" />
@ -57,7 +57,7 @@
</image> </image>
</ImageView> </ImageView>
</graphic></Button> </graphic></Button>
<Button id="discord" alignment="CENTER" contentDisplay="CENTER" layoutY="370.0" minHeight="-Infinity" minWidth="-Infinity" text="" textAlignment="CENTER"> <Button id="link_discord" alignment="CENTER" contentDisplay="CENTER" layoutY="370.0" minHeight="-Infinity" minWidth="-Infinity" text="" textAlignment="CENTER">
<graphic> <graphic>
<ImageView> <ImageView>
<image> <image>

View file

@ -94,7 +94,7 @@
</image> </image>
</ImageView> </ImageView>
</graphic></Button> </graphic></Button>
<Button id="discord" alignment="CENTER" contentDisplay="CENTER" layoutY="380.0" minHeight="-Infinity" minWidth="-Infinity" text="" textAlignment="CENTER"> <Button id="link_discord" alignment="CENTER" contentDisplay="CENTER" layoutY="380.0" minHeight="-Infinity" minWidth="-Infinity" text="" textAlignment="CENTER">
<graphic> <graphic>
<ImageView> <ImageView>
<image> <image>

View file

@ -129,7 +129,7 @@ #hide,
#back, #back,
#goConsole, #goConsole,
#settings, #settings,
#discord { #link_discord {
-fx-background-position: center; -fx-background-position: center;
-fx-background-radius: 0; -fx-background-radius: 0;
-fx-pref-width: 46px; -fx-pref-width: 46px;
@ -218,7 +218,7 @@ .text-input {
} }
/** Hyperlink **/ /** Hyperlink **/
#link { #link_link {
-fx-font-weight: bold; -fx-font-weight: bold;
-fx-font-size: 7pt; -fx-font-size: 7pt;
-fx-opacity: 0.5; -fx-opacity: 0.5;
@ -227,8 +227,8 @@ #link {
-fx-pref-height: 17px; -fx-pref-height: 17px;
} }
#link:hover, #link_link:hover,
#link:pressed { #link_link:pressed {
-fx-opacity: 0.8; -fx-opacity: 0.8;
} }

View file

@ -16,9 +16,7 @@
import pro.gravit.launcher.managers.ClientGsonManager; import pro.gravit.launcher.managers.ClientGsonManager;
import pro.gravit.launcher.managers.ClientHookManager; import pro.gravit.launcher.managers.ClientHookManager;
import pro.gravit.launcher.managers.ConsoleManager; import pro.gravit.launcher.managers.ConsoleManager;
import pro.gravit.launcher.modules.LauncherModulesManager;
import pro.gravit.launcher.modules.events.PreConfigPhase; import pro.gravit.launcher.modules.events.PreConfigPhase;
import pro.gravit.launcher.modules.impl.SimpleModuleManager;
import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.Request;
import pro.gravit.launcher.request.RequestException; import pro.gravit.launcher.request.RequestException;
import pro.gravit.launcher.request.auth.RestoreSessionRequest; import pro.gravit.launcher.request.auth.RestoreSessionRequest;
@ -113,13 +111,13 @@ public void start(String... args) throws Throwable {
} }
}; };
} }
LauncherGuardManager.initGuard(false);
if(UpdateRequest.getController() == null) UpdateRequest.setController(new LauncherUpdateController()); if(UpdateRequest.getController() == null) UpdateRequest.setController(new LauncherUpdateController());
Objects.requireNonNull(args, "args"); Objects.requireNonNull(args, "args");
if (started.getAndSet(true)) if (started.getAndSet(true))
throw new IllegalStateException("Launcher has been already started"); throw new IllegalStateException("Launcher has been already started");
LauncherEngine.modulesManager.invokeEvent(new ClientEngineInitPhase(this)); LauncherEngine.modulesManager.invokeEvent(new ClientEngineInitPhase(this));
runtimeProvider.preLoad(); runtimeProvider.preLoad();
LauncherGuardManager.initGuard(false);
FunctionalBridge.getHWID = CommonHelper.newThread("GetHWID Thread", true, FunctionalBridge::getHWID); FunctionalBridge.getHWID = CommonHelper.newThread("GetHWID Thread", true, FunctionalBridge::getHWID);
FunctionalBridge.getHWID.start(); FunctionalBridge.getHWID.start();
LogHelper.debug("Dir: %s", DirBridge.dir); LogHelper.debug("Dir: %s", DirBridge.dir);

View file

@ -1,11 +1,11 @@
package pro.gravit.launcher.client; package pro.gravit.launcher.client;
import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.impl.SimpleModuleManager;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.impl.SimpleModuleManager;
public class ClientModuleManager extends SimpleModuleManager { public class ClientModuleManager extends SimpleModuleManager {
public ClientModuleManager() { public ClientModuleManager() {
super(null, null); super(null, null);

View file

@ -6,19 +6,19 @@
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import pro.gravit.launcher.hwid.HWID;
import pro.gravit.launcher.LauncherAPI; import pro.gravit.launcher.LauncherAPI;
import pro.gravit.launcher.events.request.AuthRequestEvent; import pro.gravit.launcher.events.request.AuthRequestEvent;
import pro.gravit.launcher.guard.LauncherGuardManager; import pro.gravit.launcher.guard.LauncherGuardManager;
import pro.gravit.launcher.hasher.FileNameMatcher; import pro.gravit.launcher.hasher.FileNameMatcher;
import pro.gravit.launcher.hasher.HashedDir; import pro.gravit.launcher.hasher.HashedDir;
import pro.gravit.launcher.hwid.HWID;
import pro.gravit.launcher.hwid.OshiHWIDProvider; import pro.gravit.launcher.hwid.OshiHWIDProvider;
import pro.gravit.launcher.managers.ConsoleManager; import pro.gravit.launcher.managers.ConsoleManager;
import pro.gravit.launcher.managers.HasherManager; import pro.gravit.launcher.managers.HasherManager;
import pro.gravit.launcher.managers.HasherStore; import pro.gravit.launcher.managers.HasherStore;
import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.Request;
import pro.gravit.utils.helper.LogHelper;
import pro.gravit.utils.Version; import pro.gravit.utils.Version;
import pro.gravit.utils.helper.LogHelper;
public class FunctionalBridge { public class FunctionalBridge {
@LauncherAPI @LauncherAPI

View file

@ -11,7 +11,12 @@
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
import javax.script.ScriptException; import javax.script.ScriptException;
import pro.gravit.launcher.*; import pro.gravit.launcher.JSApplication;
import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.LauncherAPI;
import pro.gravit.launcher.LauncherConfig;
import pro.gravit.launcher.LauncherEngine;
import pro.gravit.launcher.NewLauncherSettings;
import pro.gravit.launcher.client.ClientLauncher; import pro.gravit.launcher.client.ClientLauncher;
import pro.gravit.launcher.client.DirBridge; import pro.gravit.launcher.client.DirBridge;
import pro.gravit.launcher.client.FunctionalBridge; import pro.gravit.launcher.client.FunctionalBridge;

View file

@ -11,7 +11,6 @@
import java.util.regex.Pattern; import java.util.regex.Pattern;
import pro.gravit.launcher.managers.GsonManager; import pro.gravit.launcher.managers.GsonManager;
import pro.gravit.launcher.modules.ModulesManager;
import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.ClientProfile;
import pro.gravit.launcher.serialize.HInput; import pro.gravit.launcher.serialize.HInput;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;

View file

@ -8,9 +8,15 @@
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.concurrent.*; import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
@ -22,7 +28,10 @@
import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy; import org.apache.http.impl.client.LaxRedirectStrategy;
import pro.gravit.utils.helper.*; import pro.gravit.utils.helper.CommonHelper;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper;
import pro.gravit.utils.helper.VerifyHelper;
public class ListDownloader { public class ListDownloader {
private static final AtomicInteger COUNTER_THR = new AtomicInteger(0); private static final AtomicInteger COUNTER_THR = new AtomicInteger(0);

View file

@ -1,12 +1,15 @@
package pro.gravit.launcher.events; package pro.gravit.launcher.events;
import pro.gravit.launcher.LauncherNetworkAPI;
public class ExceptionEvent extends RequestEvent { public class ExceptionEvent extends RequestEvent {
public ExceptionEvent(Exception e) { public ExceptionEvent(Exception e) {
this.message = e.getMessage(); this.message = e.getMessage();
this.clazz = e.getClass().getName(); this.clazz = e.getClass().getName();
} }
@LauncherNetworkAPI
public final String message; public final String message;
@LauncherNetworkAPI
public final String clazz; public final String clazz;
@Override @Override

View file

@ -2,8 +2,16 @@
import java.util.UUID; import java.util.UUID;
import pro.gravit.launcher.LauncherNetworkAPI;
import pro.gravit.launcher.request.WebSocketEvent; import pro.gravit.launcher.request.WebSocketEvent;
/**
* The class of all request events sent by the server to the client
*/
public abstract class RequestEvent implements WebSocketEvent { public abstract class RequestEvent implements WebSocketEvent {
/**
* UUID sent in request
*/
@LauncherNetworkAPI
public UUID requestUUID; public UUID requestUUID;
} }

View file

@ -1,7 +1,10 @@
package pro.gravit.launcher.events; package pro.gravit.launcher.events;
import pro.gravit.launcher.LauncherNetworkAPI;
//Используется, что бы послать короткое сообщение, которое вмещается в int //Используется, что бы послать короткое сообщение, которое вмещается в int
public class SignalEvent { public class SignalEvent {
@LauncherNetworkAPI
public int signal; public int signal;
public SignalEvent(int signal) { public SignalEvent(int signal) {

View file

@ -0,0 +1,10 @@
package pro.gravit.launcher.events.request;
import pro.gravit.launcher.events.RequestEvent;
public class SetPasswordRequestEvent extends RequestEvent {
@Override
public String getType() {
return "setPassword";
}
}

View file

@ -6,6 +6,7 @@
public abstract class LauncherModule { public abstract class LauncherModule {
private LauncherModulesContext context; private LauncherModulesContext context;
@SuppressWarnings("rawtypes")
private Map<Class<? extends Event>, EventHandler> eventMap = new HashMap<>(); private Map<Class<? extends Event>, EventHandler> eventMap = new HashMap<>();
protected LauncherModulesManager modulesManager; protected LauncherModulesManager modulesManager;
protected final LauncherModuleInfo moduleInfo; protected final LauncherModuleInfo moduleInfo;
@ -27,16 +28,28 @@ public LauncherModuleInfo getModuleInfo() {
/** /**
* Module initialization status at the current time * Module initialization status at the current time
* CREATED - Module status immediately after loading
* INIT - The state of the module during the execution of the method init()
* FINISH - Status of the module after initialization
*/ */
public enum InitStatus public enum InitStatus
{ {
/**
* When creating an object
*/
CREATED(false), CREATED(false),
/**
* After setting the context
*/
PRE_INIT_WAIT(true), PRE_INIT_WAIT(true),
/**
* During the pre-initialization phase
*/
PRE_INIT(false), PRE_INIT(false),
/**
* Awaiting initialization phase
*/
INIT_WAIT(true), INIT_WAIT(true),
/**
* During the initialization phase
*/
INIT(false), INIT(false),
FINISH(true); FINISH(true);
@ -95,13 +108,13 @@ public void setContext(LauncherModulesContext context)
/** /**
* This method is called before initializing all modules and resolving dependencies. * This method is called before initializing all modules and resolving dependencies.
* <b>You can</b>: * <b>You can</b>:
* Use to Module Manager * - Use to Module Manager
* Add custom modules not described in the manifest * - Add custom modules not described in the manifest
* Change information about your module or modules you control * - Change information about your module or modules you control
* <b>You can not</b>: * <b>You can not</b>:
* Use your dependencies * - Use your dependencies
* Use API Launcher, LaunchServer, ServerWrapper * - Use Launcher, LaunchServer, ServerWrapper API
* Change the names of any modules * - Change the names of any modules
*/ */
public void preInitAction() { public void preInitAction() {
//NOP //NOP
@ -118,14 +131,14 @@ public LauncherModule preInit()
/** /**
* Basic module initialization method * Basic module initialization method
* <b>You can</b>: * <b>You can</b>:
* Subscribe to events * - Subscribe to events
* Use your dependencies * - Use your dependencies
* Use provided initContext * - Use provided initContext
* Receive modules and access the modules internal methods * - Receive modules and access the modules internal methods
* <b>You can not</b>: * <b>You can not</b>:
* Modify module description, dependencies * - Modify module description, dependencies
* Add modules * - Add modules
* Read configuration * - Read configuration
* @param initContext <b>null</b> on module initialization during boot or startup * @param initContext <b>null</b> on module initialization during boot or startup
* Not <b>null</b> during module initialization while running * Not <b>null</b> during module initialization while running
*/ */
@ -154,7 +167,7 @@ protected <T extends Event> boolean registerEvent(EventHandler<T> handle, Class<
public final <T extends Event> void callEvent(T event) public final <T extends Event> void callEvent(T event)
{ {
Class<? extends Event> tClass = event.getClass(); Class<? extends Event> tClass = event.getClass();
for(Map.Entry<Class<? extends Event>, EventHandler> e : eventMap.entrySet()) for(@SuppressWarnings("rawtypes") Map.Entry<Class<? extends Event>, EventHandler> e : eventMap.entrySet())
{ {
if(e.getKey().isAssignableFrom(tClass)) if(e.getKey().isAssignableFrom(tClass))

View file

@ -7,13 +7,16 @@ public class LauncherModuleInfo {
public final Version version; public final Version version;
public final int priority; public final int priority;
public final String[] dependencies; public final String[] dependencies;
/**
* Alternative module names
*/
public final String[] providers; public final String[] providers;
public LauncherModuleInfo(String name, Version version) { public LauncherModuleInfo(String name, Version version) {
this.name = name; this.name = name;
this.version = version; this.version = version;
this.priority = 0; this.priority = 0;
this.dependencies = new String[]{}; this.dependencies = new String[0];
providers = new String[0]; providers = new String[0];
} }
@ -21,7 +24,7 @@ public LauncherModuleInfo(String name) {
this.name = name; this.name = name;
this.version = new Version(1,0,0); this.version = new Version(1,0,0);
this.priority = 0; this.priority = 0;
this.dependencies = new String[]{}; this.dependencies = new String[0];
providers = new String[0]; providers = new String[0];
} }

View file

@ -1,12 +1,12 @@
package pro.gravit.launcher.modules; package pro.gravit.launcher.modules;
import pro.gravit.utils.Version;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
import pro.gravit.utils.Version;
public interface LauncherModulesManager { public interface LauncherModulesManager {
LauncherModule loadModule(LauncherModule module); LauncherModule loadModule(LauncherModule module);
@ -23,6 +23,7 @@ default <T extends LauncherModule> boolean containsModule(Class<? extends T> cl
return getModule(clazz) != null; return getModule(clazz) != null;
} }
ClassLoader getModuleClassLoader(); ClassLoader getModuleClassLoader();
ModulesConfigManager getConfigManager();
<T extends LauncherModule> T getModule(Class<? extends T> clazz); <T extends LauncherModule> T getModule(Class<? extends T> clazz);
<T> T getModuleByInterface(Class<T> clazz); <T> T getModuleByInterface(Class<T> clazz);
<T> List<T> getModulesByInterface(Class<T> clazz); <T> List<T> getModulesByInterface(Class<T> clazz);

View file

@ -1,22 +0,0 @@
package pro.gravit.launcher.modules;
import pro.gravit.utils.Version;
@Deprecated
public interface Module extends AutoCloseable {
String getName();
Version getVersion();
int getPriority();
void init(ModuleContext context);
void postInit(ModuleContext context);
void preInit(ModuleContext context);
default void finish(ModuleContext context) {
// NOP
}
}

View file

@ -1,13 +0,0 @@
package pro.gravit.launcher.modules;
@Deprecated
public interface ModuleContext {
enum Type {
SERVER, CLIENT, LAUNCHSERVER
}
Type getType();
ModulesManager getModulesManager();
ModulesConfigManager getModulesConfigManager();
}

View file

@ -1,25 +0,0 @@
package pro.gravit.launcher.modules;
import java.net.URL;
@Deprecated
public interface ModulesManager extends AutoCloseable {
void initModules();
void load(Module module);
void loadModule(URL jarpath) throws Exception;
void loadModule(URL jarpath, String classname) throws Exception;
void postInitModules();
void preInitModules();
void finishModules();
void printModules();
void sort();
void registerModule(Module module);
}

View file

@ -1,6 +1,7 @@
package pro.gravit.launcher.modules.events; package pro.gravit.launcher.modules.events;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import pro.gravit.launcher.modules.LauncherModule; import pro.gravit.launcher.modules.LauncherModule;
public class PreGsonPhase extends LauncherModule.Event { public class PreGsonPhase extends LauncherModule.Event {

View file

@ -1,12 +1,5 @@
package pro.gravit.launcher.modules.impl; package pro.gravit.launcher.modules.impl;
import pro.gravit.launcher.managers.SimpleModulesConfigManager;
import pro.gravit.launcher.modules.*;
import pro.gravit.utils.PublicURLClassLoader;
import pro.gravit.utils.Version;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.nio.file.FileVisitResult; import java.nio.file.FileVisitResult;
@ -20,6 +13,17 @@
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import pro.gravit.launcher.managers.SimpleModulesConfigManager;
import pro.gravit.launcher.modules.LauncherInitContext;
import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.LauncherModuleInfo;
import pro.gravit.launcher.modules.LauncherModulesManager;
import pro.gravit.launcher.modules.ModulesConfigManager;
import pro.gravit.utils.PublicURLClassLoader;
import pro.gravit.utils.Version;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper;
public class SimpleModuleManager implements LauncherModulesManager { public class SimpleModuleManager implements LauncherModulesManager {
protected final List<LauncherModule> modules = new ArrayList<>(); protected final List<LauncherModule> modules = new ArrayList<>();
protected final List<String> moduleNames = new ArrayList<>(); protected final List<String> moduleNames = new ArrayList<>();
@ -219,4 +223,9 @@ public <T extends LauncherModule.Event> void invokeEvent(T event) {
if(event.isCancel()) return; if(event.isCancel()) return;
} }
} }
@Override
public ModulesConfigManager getConfigManager() {
return modulesConfigManager;
}
} }

View file

@ -2,6 +2,9 @@
import pro.gravit.utils.TypeSerializeInterface; import pro.gravit.utils.TypeSerializeInterface;
/**
* The interface of all events sent by the server to the client
*/
public interface WebSocketEvent extends TypeSerializeInterface { public interface WebSocketEvent extends TypeSerializeInterface {
String getType(); String getType();
} }

View file

@ -12,25 +12,7 @@
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.events.ExceptionEvent; import pro.gravit.launcher.events.ExceptionEvent;
import pro.gravit.launcher.events.request.AuthRequestEvent; import pro.gravit.launcher.events.request.*;
import pro.gravit.launcher.events.request.BatchProfileByUsernameRequestEvent;
import pro.gravit.launcher.events.request.CheckServerRequestEvent;
import pro.gravit.launcher.events.request.ErrorRequestEvent;
import pro.gravit.launcher.events.request.ExecCommandRequestEvent;
import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent;
import pro.gravit.launcher.events.request.GetSecureTokenRequestEvent;
import pro.gravit.launcher.events.request.JoinServerRequestEvent;
import pro.gravit.launcher.events.request.LauncherRequestEvent;
import pro.gravit.launcher.events.request.LogEvent;
import pro.gravit.launcher.events.request.ProfileByUUIDRequestEvent;
import pro.gravit.launcher.events.request.ProfileByUsernameRequestEvent;
import pro.gravit.launcher.events.request.ProfilesRequestEvent;
import pro.gravit.launcher.events.request.RegisterRequestEvent;
import pro.gravit.launcher.events.request.RestoreSessionRequestEvent;
import pro.gravit.launcher.events.request.SetProfileRequestEvent;
import pro.gravit.launcher.events.request.UpdateListRequestEvent;
import pro.gravit.launcher.events.request.UpdateRequestEvent;
import pro.gravit.launcher.events.request.VerifySecureTokenRequestEvent;
import pro.gravit.launcher.hasher.HashedEntry; import pro.gravit.launcher.hasher.HashedEntry;
import pro.gravit.launcher.hasher.HashedEntryAdapter; import pro.gravit.launcher.hasher.HashedEntryAdapter;
import pro.gravit.launcher.request.WebSocketEvent; import pro.gravit.launcher.request.WebSocketEvent;
@ -126,6 +108,7 @@ public void registerResults() {
results.register("getAvailabilityAuth", GetAvailabilityAuthRequestEvent.class); results.register("getAvailabilityAuth", GetAvailabilityAuthRequestEvent.class);
results.register("exception", ExceptionEvent.class); results.register("exception", ExceptionEvent.class);
results.register("register", RegisterRequestEvent.class); results.register("register", RegisterRequestEvent.class);
results.register("setpassword", SetPasswordRequestEvent.class);
} }
public void registerHandler(EventHandler eventHandler) { public void registerHandler(EventHandler eventHandler) {

View file

@ -7,6 +7,7 @@
import javax.net.ssl.SSLException; import javax.net.ssl.SSLException;
import pro.gravit.launcher.events.ExceptionEvent;
import pro.gravit.launcher.events.request.ErrorRequestEvent; import pro.gravit.launcher.events.request.ErrorRequestEvent;
import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.Request;
import pro.gravit.launcher.request.RequestException; import pro.gravit.launcher.request.RequestException;
@ -67,6 +68,10 @@ public WebSocketEvent get() throws InterruptedException, ExecutionException {
ErrorRequestEvent errorRequestEvent = (ErrorRequestEvent) event.result; ErrorRequestEvent errorRequestEvent = (ErrorRequestEvent) event.result;
throw new ExecutionException(new RequestException(errorRequestEvent.error)); throw new ExecutionException(new RequestException(errorRequestEvent.error));
} }
if (event.result.getType().equals("exception")) {
ExceptionEvent error = (ExceptionEvent) event.result;
throw new ExecutionException(new RequestException(String.format("LaunchServer fatal error: %s: %s", error.clazz, error.message)));
}
return result; return result;
} }
@ -80,10 +85,14 @@ public WebSocketEvent get(long timeout, TimeUnit unit) throws InterruptedExcepti
} }
WebSocketEvent result = event.result; WebSocketEvent result = event.result;
waitEventHandler.requests.remove(event); waitEventHandler.requests.remove(event);
if (event.result.getType().equals("error") || event.result.getType().equals("exception")) { if (event.result.getType().equals("error")) {
ErrorRequestEvent errorRequestEvent = (ErrorRequestEvent) event.result; ErrorRequestEvent errorRequestEvent = (ErrorRequestEvent) event.result;
throw new ExecutionException(new RequestException(errorRequestEvent.error)); throw new ExecutionException(new RequestException(errorRequestEvent.error));
} }
if (event.result.getType().equals("exception")) {
ExceptionEvent error = (ExceptionEvent) event.result;
throw new ExecutionException(new RequestException(String.format("LaunchServer fatal error: %s: %s", error.clazz, error.message)));
}
return result; return result;
} }
} }

View file

@ -1,17 +1,24 @@
package pro.gravit.launcher; package pro.gravit.launcher;
import java.nio.file.Path;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import pro.gravit.launcher.impl.*;
import pro.gravit.launcher.impl.Cyclic2DependModule;
import pro.gravit.launcher.impl.CyclicDependModule;
import pro.gravit.launcher.impl.Depend1Module;
import pro.gravit.launcher.impl.Depend2Module;
import pro.gravit.launcher.impl.Depend3Module;
import pro.gravit.launcher.impl.MainModule;
import pro.gravit.launcher.impl.TestModule;
import pro.gravit.launcher.impl.event.CancelEvent; import pro.gravit.launcher.impl.event.CancelEvent;
import pro.gravit.launcher.impl.event.NormalEvent; import pro.gravit.launcher.impl.event.NormalEvent;
import pro.gravit.launcher.modules.LauncherModule; import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.impl.SimpleModuleManager; import pro.gravit.launcher.modules.impl.SimpleModuleManager;
import java.nio.file.Path;
public class ModulesTest { public class ModulesTest {
@TempDir @TempDir
public static Path configDir; public static Path configDir;

View file

@ -1,6 +1,7 @@
package pro.gravit.launcher.impl; package pro.gravit.launcher.impl;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import pro.gravit.launcher.modules.LauncherInitContext; import pro.gravit.launcher.modules.LauncherInitContext;
import pro.gravit.launcher.modules.LauncherModule; import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.LauncherModuleInfo; import pro.gravit.launcher.modules.LauncherModuleInfo;

View file

@ -1,6 +1,5 @@
package pro.gravit.launcher.impl; package pro.gravit.launcher.impl;
import pro.gravit.launcher.ModulesTest;
import pro.gravit.launcher.modules.LauncherInitContext; import pro.gravit.launcher.modules.LauncherInitContext;
import pro.gravit.launcher.modules.LauncherModule; import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.LauncherModuleInfo; import pro.gravit.launcher.modules.LauncherModuleInfo;

View file

@ -1,6 +1,5 @@
package pro.gravit.launcher.impl; package pro.gravit.launcher.impl;
import pro.gravit.launcher.ModulesTest;
import pro.gravit.launcher.modules.LauncherInitContext; import pro.gravit.launcher.modules.LauncherInitContext;
import pro.gravit.launcher.modules.LauncherModule; import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.LauncherModuleInfo; import pro.gravit.launcher.modules.LauncherModuleInfo;

View file

@ -1,7 +1,7 @@
package pro.gravit.launcher.impl; package pro.gravit.launcher.impl;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import pro.gravit.launcher.ModulesTest;
import pro.gravit.launcher.modules.LauncherInitContext; import pro.gravit.launcher.modules.LauncherInitContext;
import pro.gravit.launcher.modules.LauncherModule; import pro.gravit.launcher.modules.LauncherModule;
import pro.gravit.launcher.modules.LauncherModuleInfo; import pro.gravit.launcher.modules.LauncherModuleInfo;

View file

@ -22,7 +22,7 @@ public final class Version {
public final Type release; public final Type release;
public static final int MAJOR = 5; public static final int MAJOR = 5;
public static final int MINOR = 0; public static final int MINOR = 0;
public static final int PATCH = 7; public static final int PATCH = 8;
public static final int BUILD = 1; public static final int BUILD = 1;
public static final Version.Type RELEASE = Type.STABLE; public static final Version.Type RELEASE = Type.STABLE;

View file

@ -1,8 +1,14 @@
package pro.gravit.utils.command; package pro.gravit.utils.command;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.jline.reader.Candidate; import org.jline.reader.Candidate;
import pro.gravit.utils.helper.VerifyHelper; import pro.gravit.utils.helper.VerifyHelper;
public abstract class Command { public abstract class Command {

View file

@ -32,9 +32,6 @@ public Category(CommandCategory category, String name, String description) {
public void eval(String line, boolean bell) { public void eval(String line, boolean bell) {
LogHelper.info("Command '%s'", line); LogHelper.info("Command '%s'", line);
// Parse line to tokens
String[] args;
try { try {
evalNative(line, bell); evalNative(line, bell);
} catch (Exception e) { } catch (Exception e) {

View file

@ -2,8 +2,9 @@
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import pro.gravit.utils.helper.JVMHelper;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.JVMHelper;
public class StdCommandHandler extends CommandHandler { public class StdCommandHandler extends CommandHandler {
private final BufferedReader reader; private final BufferedReader reader;

View file

@ -3,9 +3,14 @@
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import pro.gravit.launcher.impl.Test2Command; import pro.gravit.launcher.impl.Test2Command;
import pro.gravit.launcher.impl.TestCommand; import pro.gravit.launcher.impl.TestCommand;
import pro.gravit.utils.command.*; import pro.gravit.utils.command.BaseCommandCategory;
import pro.gravit.utils.command.Command;
import pro.gravit.utils.command.CommandException;
import pro.gravit.utils.command.CommandHandler;
import pro.gravit.utils.command.StdCommandHandler;
public class CommandHandlerTest { public class CommandHandlerTest {

View file

@ -1,10 +1,12 @@
package pro.gravit.launcher; package pro.gravit.launcher;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import pro.gravit.utils.ProviderMap; import pro.gravit.utils.ProviderMap;
import pro.gravit.utils.UniversalJsonAdapter; import pro.gravit.utils.UniversalJsonAdapter;

View file

@ -95,5 +95,4 @@ pack project(':LauncherAuthlib')
sign publishing.publications.serverwrapperapi sign publishing.publications.serverwrapperapi
} }
build.dependsOn tasks.shadowJar assemble.dependsOn tasks.shadowJar

View file

@ -1,9 +1,9 @@
package pro.gravit.launcher.server; package pro.gravit.launcher.server;
import pro.gravit.launcher.modules.impl.SimpleModuleManager;
import java.nio.file.Path; import java.nio.file.Path;
import pro.gravit.launcher.modules.impl.SimpleModuleManager;
public class ServerWrapperModulesManager extends SimpleModuleManager { public class ServerWrapperModulesManager extends SimpleModuleManager {
public ServerWrapperModulesManager(Path modulesDir, Path configDir) { public ServerWrapperModulesManager(Path modulesDir, Path configDir) {
super(modulesDir, configDir); super(modulesDir, configDir);

View file

@ -4,7 +4,7 @@
id 'signing' id 'signing'
} }
group = 'pro.gravit.launcher' group = 'pro.gravit.launcher'
version = '5.0.7' version = '5.0.8'
configure(subprojects.findAll { it.name != 'modules' }) { configure(subprojects.findAll { it.name != 'modules' }) {
apply plugin: 'idea' apply plugin: 'idea'

View file

@ -1,80 +0,0 @@
<?php
//Секретный ключ. Внимание! должен совпадать с ключем в лаунчсервере. Пожалуйста, смените его, иначе это ставит под угрозу проект.
$secretkey = '12345678';
//Настройки связи с базой данных
$link = mysqli_connect(
'localhost', // Хост
'root', // Пользователь
'', // Пароль
'test' // База данных
);
// Настройка таблицы
$settings = [
'table' => "dle_users", // Название таблицы
'usernameColumn' => "name", // Столбец с именами пользователей
'uuidColumn' => "uuid", // Столбец с uuid
'accessTokenColumn' => "accessToken", // Столбец с accessToken
'ServerIDColumn' => "serverID" // Столбец с serverID
];
// Не трогать
// Можно повредить скрипт
$AuthHandler = [
'type' => filter_input(INPUT_GET, 'type', FILTER_SANITIZE_STRING),
'username' => filter_input(INPUT_GET, 'username', FILTER_SANITIZE_STRING),
'uuid' => filter_input(INPUT_GET, 'uuid', FILTER_SANITIZE_STRING),
'accessToken' => filter_input(INPUT_GET, 'accessToken', FILTER_SANITIZE_STRING),
'ServerID' => filter_input(INPUT_GET, 'ServerID', FILTER_SANITIZE_STRING),
'secretKey' => filter_input(INPUT_GET, 'secretKey', FILTER_SANITIZE_STRING)
];
if (!isset($AuthHandler['secretKey'])) {
die('Не указан ключ!');
}
if ($secretkey != $AuthHandler['secretKey']) {
die('Неверный ключ!');
}
if(!$link) {
die('Ошибка подключения к базе данных');
}
if(isset($AuthHandler['type'])) {
if($AuthHandler['type'] == "FetchByUUID") {
if(isset($AuthHandler['uuid'])) {
$result = mysqli_query($link, 'SELECT '.$settings['usernameColumn'].','.$settings['accessTokenColumn'].','.$settings['serverID'].' FROM '.$settings['table'].' WHERE '.$settings['uuidColumn'].'="'.$AuthHandler['uuid'].'" LIMIT 1') or die($link->error);
$row = $result->fetch_assoc();
mysqli_free_result($result);
mysqli_close($link);
die($row[$settings['usernameColumn']] + ':' + $row[$settings['accessTokenColumn']] + ':' + $row[$settings['serverID']]);
}
if($AuthHandler['type'] == "FetchByUsername") {
if(isset($AuthHandler['uuid'])) {
$result = mysqli_query($link, 'SELECT '.$settings['uuidColumn'].','.$settings['accessTokenColumn'].','.$settings['serverID'].' FROM '.$settings['table'].' WHERE '.$settings['usernameColumn'].'="'.$AuthHandler['username'].'" LIMIT 1') or die($link->error);
$row = $result->fetch_assoc();
mysqli_free_result($result);
mysqli_close($link);
die($row[$settings['uuidColumn']] + ':' + $row[$settings['accessTokenColumn']] + ':' + $row[$settings['serverID']]);
}
// Обновление строк
if($AuthHandler['type'] == "SetAccessTokenAndUUID") {
$result = mysqli_query($link, 'UPDATE '.$settings['table'].' SET '.$settings['accessTokenColumn'].'="'.$AuthHandler['accessToken'].'" WHERE '.$settings['usernameColumn'].'="'.$AuthHandler['username'].'"') or die($link->error);
$result1 = mysqli_query($link, 'UPDATE '.$settings['table'].' SET '.$settings['uuidColumn'].'="'.$AuthHandler['uuid'].'" WHERE '.$settings['usernameColumn'].'="'.$AuthHandler['username'].'"') or die($link->error);
mysqli_close($link);
die('OK');
}
if($AuthHandler['type'] == "SetServerID") {
$result = mysqli_query($link, 'UPDATE '.$settings['table'].' SET '.$settings['ServerIDColumn'].'="'.$AuthHandler['serverID'].'" WHERE '.$settings['uuidColumn'].'="'.$AuthHandler['uuid'].'"') or die($link->error);
mysqli_close($link);
die('OK');
}
die('FAIL!');
} else {
die('Type not set!');
}
?>

@ -1 +1 @@
Subproject commit 1d8b759f6fdda6e9ae6306886a75d8ddd1e5c159 Subproject commit 88bd03c38a2681e997a305e376eb63e446c99a7f