Compare commits

..

1 commit

Author SHA1 Message Date
Antoni
8c453c6506
Merge 0e1691ee4c into 2d046f7d7b 2025-06-14 18:36:14 +03:00
4 changed files with 16 additions and 70 deletions

View file

@ -2,8 +2,6 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import pro.gravit.launcher.base.config.JsonConfigurable;
import pro.gravit.launcher.base.config.SimpleConfigurable;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.SecurityHelper;
@ -11,33 +9,23 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class LocalUpdatesProvider extends UpdatesProvider {
private transient final Logger logger = LogManager.getLogger();
public String updatesDir = "updates";
public String binaryName = "Launcher";
public String buildSecretsFile = "build-secrets.json";
public Map<UpdateVariant, String> urls = new HashMap<>(Map.of(
UpdateVariant.JAR, "http://localhost:9274/Launcher.jar",
UpdateVariant.EXE, "http://localhost:9274/Launcher.exe"
));
public transient JsonConfigurable<BuildSecretsInfo> buildSecretsJson;
private final transient Map<UpdateVariant, byte[]> hashMap = new HashMap<>();
@Override
public void init(LaunchServer server) {
super.init(server);
buildSecretsJson = new SimpleConfigurable<>(BuildSecretsInfo.class, Path.of(buildSecretsFile));
if(server.env == LaunchServer.LaunchServerEnv.TEST) {
return;
}
try {
buildSecretsJson.generateConfigIfNotExists();
buildSecretsJson.loadConfig();
} catch (Exception e) {
buildSecretsJson.setConfig(buildSecretsJson.getDefaultConfig());
}
try {
sync(UpdateVariant.JAR);
sync(UpdateVariant.EXE);
@ -47,13 +35,11 @@ public void init(LaunchServer server) {
}
@Override
public void pushUpdate(List<UpdateUploadInfo> files) throws IOException {
for(var e : files) {
IOHelper.copy(e.path(), getUpdate(e.variant()));
buildSecretsJson.getConfig().secrets().put(e.variant(), e.secrets());
sync(e.variant());
public void pushUpdate(Map<UpdateVariant, Path> files) throws IOException {
for(var e : files.entrySet()) {
IOHelper.copy(e.getValue(), getUpdate(e.getKey()));
sync(e.getKey());
}
buildSecretsJson.saveConfig();
}
public void sync(UpdateVariant variant) throws IOException {
@ -83,32 +69,14 @@ public Path getUpdate(UpdateVariant variant) {
}
@Override
public UpdateInfo checkUpdates(UpdateVariant variant, BuildSecretsCheck buildSecretsCheck) {
public UpdateInfo checkUpdates(UpdateVariant variant, byte[] digest) {
byte[] hash = hashMap.get(variant);
if (hash == null) {
return null; // We dont have this file
}
if(checkSecureHash(buildSecretsCheck.secureHash(), buildSecretsCheck.secureSalt(), buildSecretsJson.getConfig().secrets().get(variant).secureToken()) && Arrays.equals(buildSecretsCheck.digest(), hash)) {
if(Arrays.equals(digest, hash)) {
return null; // Launcher already updated
}
return new UpdateInfo(urls.get(variant));
}
public static final class BuildSecretsInfo {
private Map<UpdateVariant, BuildSecrets> secrets = new HashMap<>();
public BuildSecretsInfo(Map<UpdateVariant, BuildSecrets> secrets) {
this.secrets = secrets;
}
public BuildSecretsInfo() {
}
public Map<UpdateVariant, BuildSecrets> secrets() {
return secrets;
}
}
}

View file

@ -2,14 +2,10 @@
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.utils.ProviderMap;
import pro.gravit.utils.helper.SecurityHelper;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
import java.util.Map;
public abstract class UpdatesProvider {
@ -29,16 +25,8 @@ public void init(LaunchServer server) {
this.server = server;
}
public abstract void pushUpdate(List<UpdateUploadInfo> files) throws IOException;
public abstract UpdateInfo checkUpdates(UpdateVariant variant, BuildSecretsCheck buildSecretsCheck);
protected boolean checkSecureHash(String secureHash, String secureSalt, String privateSecureToken) {
if (secureHash == null || secureSalt == null) return false;
byte[] normal_hash = SecurityHelper.digest(SecurityHelper.DigestAlgorithm.SHA256,
privateSecureToken.concat(".").concat(secureSalt));
byte[] launcher_hash = Base64.getDecoder().decode(secureHash);
return Arrays.equals(normal_hash, launcher_hash);
}
public abstract void pushUpdate(Map<UpdateVariant, Path> files) throws IOException;
public abstract UpdateInfo checkUpdates(UpdateVariant variant, byte[] digest);
public void close() {
}
@ -50,16 +38,4 @@ public enum UpdateVariant {
public record UpdateInfo(String url) {
}
public record UpdateUploadInfo(Path path, UpdateVariant variant, BuildSecrets secrets) {
}
public record BuildSecrets(String secureToken, byte[] digest) {
}
public record BuildSecretsCheck(String secureHash, String secureSalt, byte[] digest) {
}
}

View file

@ -39,8 +39,7 @@ public void build() throws IOException {
}
long time_end = System.currentTimeMillis();
if(thisPath != null) {
// TODO fix me
server.config.updatesProvider.pushUpdate(List.of(new UpdatesProvider.UpdateUploadInfo(thisPath, getVariant(), new UpdatesProvider.BuildSecrets(server.runtime.clientCheckSecret, null))));
server.config.updatesProvider.pushUpdate(Map.of(getVariant(), thisPath));
} else {
logger.warn("Missing {} binary file", getVariant());
}

View file

@ -49,7 +49,10 @@ public void execute(ChannelHandlerContext ctx, Client client) {
variant = UpdatesProvider.UpdateVariant.EXE;
}
byte[] hashToCheck = bytes;
UpdatesProvider.UpdateInfo info = server.config.updatesProvider.checkUpdates(variant, new UpdatesProvider.BuildSecretsCheck(secureHash, secureSalt, hashToCheck));
if(!checkSecure(secureHash, secureSalt)) {
hashToCheck = null; // Always need update
}
UpdatesProvider.UpdateInfo info = server.config.updatesProvider.checkUpdates(variant, hashToCheck);
if (info != null) {
sendResult(new LauncherRequestEvent(true, info.url()));
} else {