aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/xmrvizzy/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java
blob: d9668100bb7f2d9fa0de1228aff9bdf243d9bdf1 (plain)
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
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;
        }
    }
}