fix(multiplayer): allow updating cato at server.

This commit is contained in:
huanghongxun
2021-12-19 20:29:51 +08:00
parent c2c52e8747
commit d129bd3e6b

View File

@@ -25,9 +25,11 @@ import org.jackhuang.hmcl.event.EventManager;
import org.jackhuang.hmcl.launch.StreamPump;
import org.jackhuang.hmcl.task.FileDownloadTask;
import org.jackhuang.hmcl.task.Task;
import org.jackhuang.hmcl.ui.FXUtils;
import org.jackhuang.hmcl.util.Lang;
import org.jackhuang.hmcl.util.StringUtils;
import org.jackhuang.hmcl.util.io.ChecksumMismatchException;
import org.jackhuang.hmcl.util.io.HttpRequest;
import org.jackhuang.hmcl.util.io.NetworkUtils;
import org.jackhuang.hmcl.util.platform.Architecture;
import org.jackhuang.hmcl.util.platform.CommandBuilder;
@@ -60,54 +62,51 @@ import static org.jackhuang.hmcl.util.Pair.pair;
*/
public final class MultiplayerManager {
static final String CATO_VERSION = "1.2.0-202112171527";
private static final String CATO_DOWNLOAD_URL = "https://gitcode.net/huanghongxun1/ioi_bin/-/raw/c7b7d8c61b66c297a6460f744dc14487c3ec2289/client/";
private static final String CATO_DOWNLOAD_URL = "https://gitcode.net/huanghongxun1/ioi_bin/-/raw/3.5.3/client/";
private static final String CATO_HASH_URL = CATO_DOWNLOAD_URL + "cato-all-files.sha1";
private static final String CATO_PATH = getCatoPath();
public static final int CATO_AGREEMENT_VERSION = 2;
private static final String REMOTE_ADDRESS = "127.0.0.1";
private static final String LOCAL_ADDRESS = "0.0.0.0";
private static final Map<String, String> HASH = mapOf(
pair("cato-client-darwin-amd64", "03c22a68f37654fea60761a1fcb5deb122ea69b8"),
pair("cato-client-darwin-arm64", "f79b80437a4b13dde72718dacc80c0469491ad48"),
pair("cato-client-freebsd-amd64", "6b244259e3887f5878a87b0a3fcdd5eec9a90a46"),
pair("cato-client-freebsd-arm64", "5529f6eacc5a47f9b6e41841531b5bbd911f74e5"),
pair("cato-client-freebsd-arm7", "f4b32ecadf82538965f969306e783fa7a7ce86a9"),
pair("cato-client-freebsd-i386", "24e27e63e9efe657de23f36f5217232d3c704de3"),
pair("cato-client-js.wasm", "3f5d13513b97e750d6cabce9b0c418e7187ad5c7"),
pair("cato-client-linux-amd64", "a3f6611ca9e602821faf909d9c6ec243236fed47"),
pair("cato-client-linux-arm64", "d04602c1b041f727a2429530e102392f596cc458"),
pair("cato-client-linux-arm7", "0924b8d71e62cc80ff7c09a6e1c6aa5b5ea9d77f"),
pair("cato-client-linux-i386", "fa426104d4cb0f028bbde5b8e6dddfa9169befd3"),
pair("cato-client-linux-mips", "1d8f2710df9e708ef9cc422336cf3fe9e48674e9"),
pair("cato-client-linux-mips64", "73ceb1c4e5374766a358d09fcb82a799fb65e846"),
pair("cato-client-linux-mips64le", "9d3af8504d049cb502b85fb0d87b9919881e029f"),
pair("cato-client-linux-mipsle", "0e771bde5a16fb03c952c6de06e4a65efe23ce83"),
pair("cato-client-linux-ppc64", "1199b67ec24afdb4dee2fe4e5f4eeeef8ac3e1e3"),
pair("cato-client-linux-ppc64le", "107f6d23685eb98ea961c7e7556d1956c364da32"),
pair("cato-client-openbsd-amd64", "606493c36521996b1ce41cd980a775db791b783f"),
pair("cato-client-openbsd-arm64", "4c1b2d89e88669452d174607bc65ed3897420868"),
pair("cato-client-openbsd-arm7", "a51860b41c4d3634d84fcec578f6ed15f8a49401"),
pair("cato-client-openbsd-i386", "9ac8f86b7ceb15564424fbd578867fae93b5cb47"),
pair("cato-client-windows-amd64.exe", "57c5166b4c02046ea73d0321481f379db8b103d3"),
pair("cato-client-windows-arm64.exe", "d6b9025f1a2a1202256546cfb38ed7d863f5bb57"),
pair("cato-client-windows-i386.exe", "45959f36c061ae7cd4294575053920fc43a85516")
);
private static CompletableFuture<Map<String, String>> HASH;
private MultiplayerManager() {
}
private static CompletableFuture<Map<String, String>> getCatoHash() {
FXUtils.checkFxUserThread();
if (HASH == null) {
HASH = CompletableFuture.supplyAsync(wrap(() -> {
String hashList = HttpRequest.GET(CATO_HASH_URL).getString();
Map<String, String> hashes = new HashMap<>();
for (String line : hashList.split("\n")) {
String[] items = line.trim().split(" ");
if (items.length == 2 && items[0].length() == 40) {
hashes.put(items[1], items[0]);
} else {
LOG.warning("Failed to parse cato hash file, hash line " + line);
}
}
return hashes;
}));
}
return HASH;
}
public static Task<Void> downloadCato() {
return new FileDownloadTask(
return Task.fromCompletableFuture(getCatoHash()).thenComposeAsync(catoHashes ->
new FileDownloadTask(
NetworkUtils.toURL(CATO_DOWNLOAD_URL + getCatoFileName()),
getCatoExecutable().toFile(),
new FileDownloadTask.IntegrityCheck("SHA-1", HASH.get(getCatoFileName()))
catoHashes.get(getCatoFileName()) == null ? null : new FileDownloadTask.IntegrityCheck("SHA-1", catoHashes.get(getCatoFileName()))
).thenRunAsync(() -> {
if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
Set<PosixFilePermission> perm = Files.getPosixFilePermissions(getCatoExecutable());
perm.add(PosixFilePermission.OWNER_EXECUTE);
Files.setPosixFilePermissions(getCatoExecutable(), perm);
}
});
}));
}
public static Path getCatoExecutable() {
@@ -115,7 +114,7 @@ public final class MultiplayerManager {
}
private static CompletableFuture<CatoSession> startCato(String token, State state) {
return CompletableFuture.completedFuture(null).thenApplyAsync(wrap(unused -> {
return getCatoHash().thenApplyAsync(wrap(catoHashes -> {
Path exe = getCatoExecutable();
if (!Files.isRegularFile(exe)) {
throw new CatoNotExistsException(exe);
@@ -126,7 +125,10 @@ public final class MultiplayerManager {
}
try {
ChecksumMismatchException.verifyChecksum(exe, "SHA-1", HASH.get(getCatoFileName()));
String hash = catoHashes.get(getCatoFileName());
if (hash != null) {
ChecksumMismatchException.verifyChecksum(exe, "SHA-1", hash);
}
} catch (IOException e) {
Files.deleteIfExists(exe);
throw e;