mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-12-23 09:01:08 +03:00
[FEATURE][EXP] Автогенерация конфига, нужен тест!!!
This commit is contained in:
parent
0cab4f254e
commit
d9e5e3d350
3 changed files with 32 additions and 8 deletions
|
@ -5,9 +5,11 @@
|
||||||
import pro.gravit.launcher.AutogenConfig;
|
import pro.gravit.launcher.AutogenConfig;
|
||||||
import pro.gravit.launcher.Launcher;
|
import pro.gravit.launcher.Launcher;
|
||||||
import pro.gravit.launcher.LauncherConfig;
|
import pro.gravit.launcher.LauncherConfig;
|
||||||
|
import pro.gravit.launcher.SecureAutogenConfig;
|
||||||
import pro.gravit.launcher.serialize.HOutput;
|
import pro.gravit.launcher.serialize.HOutput;
|
||||||
import pro.gravit.launchserver.LaunchServer;
|
import pro.gravit.launchserver.LaunchServer;
|
||||||
import pro.gravit.launchserver.asm.ClassMetadataReader;
|
import pro.gravit.launchserver.asm.ClassMetadataReader;
|
||||||
|
import pro.gravit.launchserver.asm.ConfigGenerator;
|
||||||
import pro.gravit.launchserver.binary.BuildContext;
|
import pro.gravit.launchserver.binary.BuildContext;
|
||||||
import pro.gravit.launchserver.binary.LauncherConfigurator;
|
import pro.gravit.launchserver.binary.LauncherConfigurator;
|
||||||
import pro.gravit.utils.helper.IOHelper;
|
import pro.gravit.utils.helper.IOHelper;
|
||||||
|
@ -20,10 +22,13 @@
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.SimpleFileVisitor;
|
import java.nio.file.SimpleFileVisitor;
|
||||||
import java.nio.file.attribute.BasicFileAttributes;
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
|
import java.security.cert.CertificateEncodingException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipException;
|
import java.util.zip.ZipException;
|
||||||
import java.util.zip.ZipInputStream;
|
import java.util.zip.ZipInputStream;
|
||||||
|
@ -120,6 +125,9 @@ public Path process(Path inputJar) throws IOException {
|
||||||
ClassNode cn = new ClassNode();
|
ClassNode cn = new ClassNode();
|
||||||
new ClassReader(IOHelper.getResourceBytes(AutogenConfig.class.getName().replace('.', '/').concat(".class"))).accept(cn, 0);
|
new ClassReader(IOHelper.getResourceBytes(AutogenConfig.class.getName().replace('.', '/').concat(".class"))).accept(cn, 0);
|
||||||
LauncherConfigurator launcherConfigurator = new LauncherConfigurator(cn);
|
LauncherConfigurator launcherConfigurator = new LauncherConfigurator(cn);
|
||||||
|
ClassNode cn1 = new ClassNode();
|
||||||
|
new ClassReader(IOHelper.getResourceBytes(SecureAutogenConfig.class.getName().replace('.', '/').concat(".class"))).accept(cn, 0);
|
||||||
|
ConfigGenerator secureConfigurator = new ConfigGenerator(cn1);
|
||||||
BuildContext context = new BuildContext(output, launcherConfigurator, this);
|
BuildContext context = new BuildContext(output, launcherConfigurator, this);
|
||||||
server.buildHookManager.hook(context);
|
server.buildHookManager.hook(context);
|
||||||
launcherConfigurator.setStringField("address", server.config.netty.address);
|
launcherConfigurator.setStringField("address", server.config.netty.address);
|
||||||
|
@ -130,6 +138,14 @@ public Path process(Path inputJar) throws IOException {
|
||||||
launcherConfigurator.setBooleanField("isWarningMissArchJava", server.config.launcher.warningMissArchJava);
|
launcherConfigurator.setBooleanField("isWarningMissArchJava", server.config.launcher.warningMissArchJava);
|
||||||
launcherConfigurator.setEnv(server.config.env);
|
launcherConfigurator.setEnv(server.config.env);
|
||||||
launcherConfigurator.setStringField("passwordEncryptKey", server.runtime.passwordEncryptKey);
|
launcherConfigurator.setStringField("passwordEncryptKey", server.runtime.passwordEncryptKey);
|
||||||
|
secureConfigurator.setByteArrayListField("certificates", Arrays.stream(server.certificateManager.trustManager.getTrusted()).map(e -> {
|
||||||
|
try {
|
||||||
|
return e.getEncoded();
|
||||||
|
} catch (CertificateEncodingException e2) {
|
||||||
|
LogHelper.error(e2);
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
}).collect(Collectors.toList()));
|
||||||
String launcherSalt = SecurityHelper.randomStringToken();
|
String launcherSalt = SecurityHelper.randomStringToken();
|
||||||
byte[] launcherSecureHash = SecurityHelper.digest(SecurityHelper.DigestAlgorithm.SHA256,
|
byte[] launcherSecureHash = SecurityHelper.digest(SecurityHelper.DigestAlgorithm.SHA256,
|
||||||
server.runtime.clientCheckSecret.concat(".").concat(launcherSalt));
|
server.runtime.clientCheckSecret.concat(".").concat(launcherSalt));
|
||||||
|
@ -148,11 +164,12 @@ public Path process(Path inputJar) throws IOException {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
String zPath = launcherConfigurator.getZipEntryPath();
|
String zPath = launcherConfigurator.getZipEntryPath();
|
||||||
|
String sPath = secureConfigurator.getZipEntryPath();
|
||||||
try (ZipInputStream input = new ZipInputStream(IOHelper.newInput(inputJar))) {
|
try (ZipInputStream input = new ZipInputStream(IOHelper.newInput(inputJar))) {
|
||||||
ZipEntry e = input.getNextEntry();
|
ZipEntry e = input.getNextEntry();
|
||||||
while (e != null) {
|
while (e != null) {
|
||||||
String filename = e.getName();
|
String filename = e.getName();
|
||||||
if (server.buildHookManager.isContainsBlacklist(filename) || e.isDirectory() || zPath.equals(filename)) {
|
if (server.buildHookManager.isContainsBlacklist(filename) || e.isDirectory() || zPath.equals(filename) || sPath.equals(filename)) {
|
||||||
e = input.getNextEntry();
|
e = input.getNextEntry();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,17 @@
|
||||||
package pro.gravit.launcher;
|
package pro.gravit.launcher;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class SecureAutogenConfig {
|
public class SecureAutogenConfig {
|
||||||
public final byte[][] certificates;
|
public static final Charset KEY_CHARSET = StandardCharsets.US_ASCII; // ? Какая из них, но выбрать надо однозачно проверить методом тыка!!!
|
||||||
|
public final List<byte[]> certificates;
|
||||||
|
|
||||||
public SecureAutogenConfig() {
|
public SecureAutogenConfig() {
|
||||||
//Пока не реализован SecureLauncherConfigurator
|
//Пока не реализован SecureLauncherConfigurator
|
||||||
certificates = new byte[][]{
|
certificates = Arrays.asList(
|
||||||
("-----BEGIN CERTIFICATE-----\n" +
|
("-----BEGIN CERTIFICATE-----\n" +
|
||||||
"MIIFyjCCA7KgAwIBAgIRALnsjNjfvOTXfla3fX1fNEUwDQYJKoZIhvcNAQELBQAw\n" +
|
"MIIFyjCCA7KgAwIBAgIRALnsjNjfvOTXfla3fX1fNEUwDQYJKoZIhvcNAQELBQAw\n" +
|
||||||
"WTELMAkGA1UEBhMCUlUxFzAVBgNVBAoTDkdyYXZpdFRydXN0IENBMRAwDgYDVQQL\n" +
|
"WTELMAkGA1UEBhMCUlUxFzAVBgNVBAoTDkdyYXZpdFRydXN0IENBMRAwDgYDVQQL\n" +
|
||||||
|
@ -40,8 +44,6 @@ public SecureAutogenConfig() {
|
||||||
"OATWgSKH0qTkleE/v7k+USs0a+KV8wmC5wwliqH+uLO++yIP/9bjDctyLulQX5Ee\n" +
|
"OATWgSKH0qTkleE/v7k+USs0a+KV8wmC5wwliqH+uLO++yIP/9bjDctyLulQX5Ee\n" +
|
||||||
"+EhD7tb1R/yyWY4uhkzlsr3N2Kl34aQAEBMn8Z1mHsyyu1FcbEaNLU8jcS3pHPVM\n" +
|
"+EhD7tb1R/yyWY4uhkzlsr3N2Kl34aQAEBMn8Z1mHsyyu1FcbEaNLU8jcS3pHPVM\n" +
|
||||||
"gQRn3m1iDnQlFciAMxW0pW6mW/4xKYzhXk5BTSolnqMVylxHgWXuBwdDDQQVnQ==\n" +
|
"gQRn3m1iDnQlFciAMxW0pW6mW/4xKYzhXk5BTSolnqMVylxHgWXuBwdDDQQVnQ==\n" +
|
||||||
"-----END CERTIFICATE-----").getBytes(StandardCharsets.US_ASCII)
|
"-----END CERTIFICATE-----").getBytes(KEY_CHARSET));
|
||||||
// ? Какая из них, но выбрать надо однозачно
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,9 +26,9 @@ public LauncherTrustManager(X509Certificate[] trustSigners) {
|
||||||
this.trustSigners = trustSigners;
|
this.trustSigners = trustSigners;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LauncherTrustManager(byte[][] encodedCertificate) throws CertificateException {
|
public LauncherTrustManager(List<byte[]> encodedCertificate) throws CertificateException {
|
||||||
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
|
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
|
||||||
trustSigners = Arrays.stream(encodedCertificate).map((cert) -> {
|
trustSigners = encodedCertificate.stream().map((cert) -> {
|
||||||
try (InputStream input = new ByteArrayInputStream(cert)) {
|
try (InputStream input = new ByteArrayInputStream(cert)) {
|
||||||
return (X509Certificate) certFactory.generateCertificate(input);
|
return (X509Certificate) certFactory.generateCertificate(input);
|
||||||
} catch (IOException | CertificateException e) {
|
} catch (IOException | CertificateException e) {
|
||||||
|
@ -82,4 +82,9 @@ public boolean isTrusted(X509Certificate certificate) throws CertificateEncoding
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public X509Certificate[] getTrusted() {
|
||||||
|
return Arrays.copyOf(trustSigners, trustSigners.length); // AntiModify orig array!!!
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue