2018-09-17 10:07:32 +03:00
|
|
|
package ru.gravit.launcher;
|
|
|
|
|
|
|
|
import ru.gravit.launcher.serialize.HInput;
|
|
|
|
import ru.gravit.launcher.serialize.HOutput;
|
|
|
|
import ru.gravit.launcher.serialize.stream.StreamObject;
|
2018-12-06 05:29:34 +03:00
|
|
|
import ru.gravit.utils.helper.LogHelper;
|
|
|
|
import ru.gravit.utils.helper.SecurityHelper;
|
|
|
|
import ru.gravit.utils.helper.VerifyHelper;
|
2018-09-17 10:07:32 +03:00
|
|
|
|
2018-12-20 18:45:01 +03:00
|
|
|
import java.io.IOException;
|
|
|
|
import java.net.InetSocketAddress;
|
|
|
|
import java.security.interfaces.RSAPublicKey;
|
|
|
|
import java.security.spec.InvalidKeySpecException;
|
|
|
|
import java.util.*;
|
|
|
|
|
2018-09-17 10:07:32 +03:00
|
|
|
public final class LauncherConfig extends StreamObject {
|
|
|
|
@LauncherAPI
|
|
|
|
public static final String ADDRESS_OVERRIDE_PROPERTY = "launcher.addressOverride";
|
|
|
|
@LauncherAPI
|
|
|
|
public static final String ADDRESS_OVERRIDE = System.getProperty(ADDRESS_OVERRIDE_PROPERTY, null);
|
|
|
|
private static final AutogenConfig config = new AutogenConfig();
|
2018-09-22 17:33:00 +03:00
|
|
|
|
2018-10-13 11:01:10 +03:00
|
|
|
|
2018-09-22 17:33:00 +03:00
|
|
|
public static AutogenConfig getAutogenConfig() {
|
2018-09-17 10:07:32 +03:00
|
|
|
return config;
|
|
|
|
}
|
2018-09-22 17:33:00 +03:00
|
|
|
|
2018-09-17 10:07:32 +03:00
|
|
|
// Instance
|
|
|
|
@LauncherAPI
|
2018-11-06 14:57:19 +03:00
|
|
|
public InetSocketAddress address;
|
2018-09-17 10:07:32 +03:00
|
|
|
@LauncherAPI
|
2018-09-20 14:47:40 +03:00
|
|
|
public final String projectname;
|
2018-10-13 11:20:23 +03:00
|
|
|
public final int clientPort;
|
2018-10-08 16:57:29 +03:00
|
|
|
public String secretKeyClient;
|
2018-09-20 14:47:40 +03:00
|
|
|
@LauncherAPI
|
2018-09-17 10:07:32 +03:00
|
|
|
public final RSAPublicKey publicKey;
|
|
|
|
|
|
|
|
@LauncherAPI
|
|
|
|
public final Map<String, byte[]> runtime;
|
2018-09-22 17:33:00 +03:00
|
|
|
|
2018-10-20 12:33:02 +03:00
|
|
|
public final boolean isUsingWrapper;
|
|
|
|
public final boolean isDownloadJava;
|
2018-12-20 18:43:01 +03:00
|
|
|
public final boolean isWarningMissArchJava;
|
2018-10-20 12:33:02 +03:00
|
|
|
|
2018-09-17 10:07:32 +03:00
|
|
|
@LauncherAPI
|
|
|
|
public LauncherConfig(HInput input) throws IOException, InvalidKeySpecException {
|
|
|
|
String localAddress = config.address;
|
|
|
|
address = InetSocketAddress.createUnresolved(
|
|
|
|
ADDRESS_OVERRIDE == null ? localAddress : ADDRESS_OVERRIDE, config.port);
|
|
|
|
publicKey = SecurityHelper.toPublicRSAKey(input.readByteArray(SecurityHelper.CRYPTO_MAX_LENGTH));
|
2018-09-20 14:47:40 +03:00
|
|
|
projectname = config.projectname;
|
2018-10-13 11:20:23 +03:00
|
|
|
clientPort = config.clientPort;
|
2018-10-08 16:57:29 +03:00
|
|
|
secretKeyClient = config.secretKeyClient;
|
2018-10-20 12:33:02 +03:00
|
|
|
isDownloadJava = config.isDownloadJava;
|
|
|
|
isUsingWrapper = config.isUsingWrapper;
|
2018-12-20 18:43:01 +03:00
|
|
|
isWarningMissArchJava = config.isWarningMissArchJava;
|
2018-12-19 14:24:50 +03:00
|
|
|
LauncherEnvironment env;
|
2018-12-20 18:45:01 +03:00
|
|
|
if (config.env == 0) env = LauncherEnvironment.DEV;
|
|
|
|
else if (config.env == 1) env = LauncherEnvironment.DEBUG;
|
|
|
|
else if (config.env == 2) env = LauncherEnvironment.STD;
|
|
|
|
else if (config.env == 3) env = LauncherEnvironment.PROD;
|
2018-12-19 14:24:50 +03:00
|
|
|
else env = LauncherEnvironment.STD;
|
2019-01-15 06:48:20 +03:00
|
|
|
Launcher.applyLauncherEnv(env);
|
2018-09-17 10:07:32 +03:00
|
|
|
// Read signed runtime
|
|
|
|
int count = input.readLength(0);
|
|
|
|
Map<String, byte[]> localResources = new HashMap<>(count);
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
String name = input.readString(255);
|
|
|
|
VerifyHelper.putIfAbsent(localResources, name,
|
|
|
|
input.readByteArray(SecurityHelper.CRYPTO_MAX_LENGTH),
|
|
|
|
String.format("Duplicate runtime resource: '%s'", name));
|
|
|
|
}
|
|
|
|
runtime = Collections.unmodifiableMap(localResources);
|
|
|
|
|
|
|
|
// Print warning if address override is enabled
|
|
|
|
if (ADDRESS_OVERRIDE != null)
|
2018-09-22 17:33:00 +03:00
|
|
|
LogHelper.warning("Address override is enabled: '%s'", ADDRESS_OVERRIDE);
|
2018-09-17 10:07:32 +03:00
|
|
|
}
|
2018-09-22 17:33:00 +03:00
|
|
|
|
2018-09-17 10:07:32 +03:00
|
|
|
@LauncherAPI
|
2018-09-22 17:33:00 +03:00
|
|
|
public LauncherConfig(String address, int port, RSAPublicKey publicKey, Map<String, byte[]> runtime, String projectname) {
|
2018-09-20 14:47:40 +03:00
|
|
|
this.address = InetSocketAddress.createUnresolved(address, port);
|
|
|
|
this.publicKey = Objects.requireNonNull(publicKey, "publicKey");
|
|
|
|
this.runtime = Collections.unmodifiableMap(new HashMap<>(runtime));
|
|
|
|
this.projectname = projectname;
|
2018-10-13 11:20:23 +03:00
|
|
|
this.clientPort = 32148;
|
2018-10-20 12:33:02 +03:00
|
|
|
isUsingWrapper = true;
|
|
|
|
isDownloadJava = false;
|
2018-12-20 18:43:01 +03:00
|
|
|
isWarningMissArchJava = true;
|
2018-09-20 14:47:40 +03:00
|
|
|
}
|
2018-09-22 17:33:00 +03:00
|
|
|
|
2018-09-20 14:47:40 +03:00
|
|
|
@LauncherAPI
|
2018-09-17 10:07:32 +03:00
|
|
|
public LauncherConfig(String address, int port, RSAPublicKey publicKey, Map<String, byte[]> runtime) {
|
|
|
|
this.address = InetSocketAddress.createUnresolved(address, port);
|
|
|
|
this.publicKey = Objects.requireNonNull(publicKey, "publicKey");
|
|
|
|
this.runtime = Collections.unmodifiableMap(new HashMap<>(runtime));
|
2018-09-20 14:47:40 +03:00
|
|
|
this.projectname = "Minecraft";
|
2018-10-13 11:20:23 +03:00
|
|
|
this.clientPort = 32148;
|
2018-10-20 12:33:02 +03:00
|
|
|
isUsingWrapper = true;
|
|
|
|
isDownloadJava = false;
|
2018-12-20 18:43:01 +03:00
|
|
|
isWarningMissArchJava = true;
|
2018-09-17 10:07:32 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void write(HOutput output) throws IOException {
|
|
|
|
output.writeByteArray(publicKey.getEncoded(), SecurityHelper.CRYPTO_MAX_LENGTH);
|
|
|
|
|
|
|
|
// Write signed runtime
|
|
|
|
Set<Map.Entry<String, byte[]>> entrySet = runtime.entrySet();
|
|
|
|
output.writeLength(entrySet.size(), 0);
|
|
|
|
for (Map.Entry<String, byte[]> entry : runtime.entrySet()) {
|
|
|
|
output.writeString(entry.getKey(), 255);
|
|
|
|
output.writeByteArray(entry.getValue(), SecurityHelper.CRYPTO_MAX_LENGTH);
|
|
|
|
}
|
|
|
|
}
|
2018-12-19 14:24:50 +03:00
|
|
|
|
2018-12-20 18:45:01 +03:00
|
|
|
public enum LauncherEnvironment {
|
|
|
|
DEV, DEBUG, STD, PROD
|
2018-12-19 14:24:50 +03:00
|
|
|
}
|
2018-09-17 10:07:32 +03:00
|
|
|
}
|