1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
package me.xmrvizzy.skyblocker.mixin;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import me.xmrvizzy.skyblocker.utils.Utils;
import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import java.util.Base64;
import java.util.Map;
@Mixin(value = YggdrasilServicesKeyInfo.class, remap = false)
public class YggdrasilServicesKeyInfoMixin {
@Shadow
@Final
private static Logger LOGGER;
@Unique
private static final Map<String, String> REPLACEMENT_MAP = Map.of();
@Unique
private static final IntList ERRONEUS_SIGNATURE_HASHES = new IntArrayList();
@WrapOperation(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false)
private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature, Operation<byte[]> decode) {
try {
return decode.call(decoder, signature);
} catch (IllegalArgumentException e) {
try {
return decode.call(decoder, signature.replaceAll("[^A-Za-z0-9+/=]", ""));
} catch (IllegalArgumentException e2) {
if (Utils.isOnSkyblock()) {
if (REPLACEMENT_MAP.containsKey(signature)) {
return decode.call(decoder, REPLACEMENT_MAP.get(signature));
}
int signatureHashCode = signature.hashCode();
if (!ERRONEUS_SIGNATURE_HASHES.contains(signatureHashCode)) {
ERRONEUS_SIGNATURE_HASHES.add(signatureHashCode);
LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode base64 string No.{}: {}", ERRONEUS_SIGNATURE_HASHES.size() - 1, signature);
} else {
LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode the base64 string No.{} again", ERRONEUS_SIGNATURE_HASHES.indexOf(signatureHashCode));
}
}
}
throw e;
}
}
@WrapOperation(method = "validateProperty", remap = false, at = @At(value = "INVOKE", target = "org/slf4j/Logger.error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
private void skyblocker$dontLogFailedSignatureValidation(Logger logger, String message, Object property, Object exception, Operation<Void> operation) {
if (!Utils.isOnHypixel()) operation.call(logger, message, property, exception);
}
}
|