Launcher/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java

130 lines
4.5 KiB
Java
Raw Normal View History

2018-09-17 10:07:32 +03:00
package ru.gravit.launcher;
import java.io.IOException;
import java.net.URL;
import java.nio.file.NoSuchFileException;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import java.util.UUID;
2018-09-25 17:06:13 +03:00
import java.util.concurrent.atomic.AtomicBoolean;
2018-09-17 10:07:32 +03:00
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern;
import ru.gravit.launcher.modules.ModulesManagerInterface;
2018-09-25 16:21:08 +03:00
import ru.gravit.launcher.profiles.ClientProfile;
import ru.gravit.launcher.serialize.HInput;
import ru.gravit.utils.Version;
2018-09-17 10:20:34 +03:00
import ru.gravit.utils.helper.IOHelper;
2018-10-12 13:04:17 +03:00
import ru.gravit.utils.helper.JVMHelper;
2018-09-17 10:20:34 +03:00
import ru.gravit.utils.helper.SecurityHelper;
2018-09-17 10:07:32 +03:00
public final class Launcher {
2018-09-25 17:06:13 +03:00
// Authlib constants
@LauncherAPI
public static final String SKIN_URL_PROPERTY = "skinURL";
@LauncherAPI
public static final String SKIN_DIGEST_PROPERTY = "skinDigest";
@LauncherAPI
public static final String CLOAK_URL_PROPERTY = "cloakURL";
@LauncherAPI
public static final String CLOAK_DIGEST_PROPERTY = "cloakDigest";
// Used to determine from clientside is launched from launcher
public static final AtomicBoolean LAUNCHED = new AtomicBoolean(false);
2018-09-17 10:07:32 +03:00
private static final AtomicReference<LauncherConfig> CONFIG = new AtomicReference<>();
@LauncherAPI
public static ModulesManagerInterface modulesManager = null;
@LauncherAPI
public static final int PROTOCOL_MAGIC_LEGACY = 0x724724_00 + 24;
@LauncherAPI
public static final int PROTOCOL_MAGIC = 0xA205B064; // e = 2.718281828
// Constants
@LauncherAPI
public static final String RUNTIME_DIR = "runtime";
@LauncherAPI
public static final String GUARD_DIR = "guard";
@LauncherAPI
2018-09-17 10:07:32 +03:00
public static final String CONFIG_FILE = "config.bin";
@LauncherAPI
2018-09-25 16:21:08 +03:00
public static ClientProfile profile;
@LauncherAPI
2018-09-17 10:07:32 +03:00
public static final String INIT_SCRIPT_FILE = "init.js";
2018-09-19 15:03:52 +03:00
@LauncherAPI
public static final String API_SCRIPT_FILE = "engine/api.js";
public static final String CONFIG_SCRIPT_FILE = "config.js";
2018-09-17 10:07:32 +03:00
private static final Pattern UUID_PATTERN = Pattern.compile("-", Pattern.LITERAL);
public static int MAJOR = 4;
2018-11-27 14:19:09 +03:00
public static int MINOR = 1;
public static int PATCH = 0;
2018-12-19 13:55:20 +03:00
public static int BUILD = 3;
2018-11-27 14:19:09 +03:00
public static Version.Type RELEASE = Version.Type.DEV;
2018-09-17 10:07:32 +03:00
@LauncherAPI
public static LauncherConfig getConfig() {
LauncherConfig config = CONFIG.get();
if (config == null) {
try (HInput input = new HInput(IOHelper.newInput(IOHelper.getResourceURL(CONFIG_FILE)))) {
config = new LauncherConfig(input);
} catch (IOException | InvalidKeySpecException e) {
throw new SecurityException(e);
}
CONFIG.set(config);
}
return config;
}
2018-11-08 15:30:16 +03:00
@LauncherAPI
2018-11-08 15:30:16 +03:00
public static void setConfig(LauncherConfig cfg) {
CONFIG.set(cfg);
}
2018-09-17 10:07:32 +03:00
@LauncherAPI
public static URL getResourceURL(String name) throws IOException {
2018-10-26 20:23:27 +03:00
LauncherConfig config = getConfig();
byte[] validDigest = config.runtime.get(name);
if (validDigest == null)
throw new NoSuchFileException(name);
2018-09-17 10:07:32 +03:00
// Resolve URL and verify digest
URL url = IOHelper.getResourceURL(RUNTIME_DIR + '/' + name);
2018-10-26 20:23:27 +03:00
if (!Arrays.equals(validDigest, SecurityHelper.digest(SecurityHelper.DigestAlgorithm.MD5, url)))
throw new NoSuchFileException(name); // Digest mismatch
2018-09-17 10:07:32 +03:00
// Return verified URL
return url;
}
2018-11-08 15:30:16 +03:00
public static URL getResourceURL(String name, String prefix) throws IOException {
LauncherConfig config = getConfig();
byte[] validDigest = config.runtime.get(name);
if (validDigest == null)
throw new NoSuchFileException(name);
// Resolve URL and verify digest
URL url = IOHelper.getResourceURL(prefix + '/' + name);
if (!Arrays.equals(validDigest, SecurityHelper.digest(SecurityHelper.DigestAlgorithm.MD5, url)))
throw new NoSuchFileException(name); // Digest mismatch
// Return verified URL
return url;
}
2018-09-17 10:07:32 +03:00
@LauncherAPI
public static String toHash(UUID uuid) {
return UUID_PATTERN.matcher(uuid.toString()).replaceAll("");
}
public static Version getVersion() {
2018-09-22 17:33:00 +03:00
return new Version(MAJOR, MINOR, PATCH, BUILD, RELEASE);
}
2018-10-12 13:04:17 +03:00
public static final boolean useAvanguard = true;
public static boolean isUsingAvanguard() {
return JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE && useAvanguard;
}
2018-09-17 10:07:32 +03:00
}