/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.kerberos.KerberosClient
 *  com.l7tech.kerberos.KerberosConfig
 *  com.l7tech.kerberos.KerberosConfigException
 *  com.l7tech.kerberos.KerberosException
 *  com.l7tech.kerberos.KerberosGSSAPReqTicket
 *  com.l7tech.kerberos.KerberosServiceTicket
 *  com.l7tech.kerberos.KerberosTicketRepository$Key
 *  com.l7tech.kerberos.KerberosTicketRepository$KeyType
 *  com.l7tech.util.HexUtils
 *  org.jaaslounge.decoding.kerberos.KerberosEncData
 */
package com.l7tech.server.security.kerberos;

import com.l7tech.kerberos.KerberosClient;
import com.l7tech.kerberos.KerberosConfig;
import com.l7tech.kerberos.KerberosConfigException;
import com.l7tech.kerberos.KerberosException;
import com.l7tech.kerberos.KerberosGSSAPReqTicket;
import com.l7tech.kerberos.KerberosServiceTicket;
import com.l7tech.kerberos.KerberosTicketRepository;
import com.l7tech.util.HexUtils;
import java.net.URL;
import java.util.Collections;
import java.util.concurrent.CompletionException;
import java.util.logging.Logger;
import javax.security.auth.Subject;
import javax.security.auth.kerberos.KerberosKey;
import javax.security.auth.kerberos.KerberosPrincipal;
import javax.security.auth.kerberos.KerberosTicket;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSCredential;
import org.ietf.jgss.GSSException;
import org.ietf.jgss.GSSManager;
import org.ietf.jgss.GSSName;
import org.ietf.jgss.Oid;
import org.jaaslounge.decoding.kerberos.KerberosEncData;

public class KerberosRoutingClient
extends KerberosClient {
    private static final Logger a;
    private static final String[] r;

    public KerberosServiceTicket getKerberosServiceTicket(String string, KerberosServiceTicket kerberosServiceTicket) throws KerberosException {
        KerberosServiceTicket kerberosServiceTicket2;
        try {
            try {
                if (!KerberosConfig.hasKeytab()) {
                    throw new KerberosConfigException(r[1]);
                }
            }
            catch (SecurityException securityException) {
                throw KerberosRoutingClient.a(securityException);
            }
            KerberosTicketRepository.Key key = ticketCache.generateKey(string, KerberosTicketRepository.KeyType.DELEGATED, kerberosServiceTicket.getClientPrincipalName(), null);
            KerberosTicket kerberosTicket = kerberosServiceTicket.getDelegatedKerberosTicket();
            try {
                if (kerberosTicket == null) {
                    a.finer(r[4] + HexUtils.encodeBase64((byte[])kerberosServiceTicket.getGSSAPReqTicket().toByteArray(), (boolean)true));
                    throw new KerberosException(r[5]);
                }
            }
            catch (SecurityException securityException) {
                throw KerberosRoutingClient.a(securityException);
            }
            try {
                Oid oid = KerberosRoutingClient.getKerberos5Oid();
                GSSManager gSSManager = GSSManager.getInstance();
                GSSName gSSName = gSSManager.createName(kerberosServiceTicket.getClientPrincipalName(), GSSName.NT_USER_NAME, oid);
                Subject subject = new Subject(false, Collections.singleton(new KerberosPrincipal(kerberosServiceTicket.getClientPrincipalName())), Collections.EMPTY_SET, Collections.singleton(kerberosTicket));
                kerberosServiceTicket2 = Subject.callAs(subject, () -> {
                    KerberosServiceTicket kerberosServiceTicket;
                    GSSContext gSSContext = null;
                    GSSCredential gSSCredential = null;
                    try {
                        gSSCredential = gSSManager.createCredential(gSSName, 0, oid, 1);
                        GSSName gSSName2 = gSSManager.createName(string, GSSName.NT_HOSTBASED_SERVICE, oid);
                        gSSContext = gSSManager.createContext(gSSName2, oid, gSSCredential, this.getKerberosTicketLifetime());
                        gSSContext.requestMutualAuth(false);
                        gSSContext.requestConf(true);
                        gSSContext.requestCredDeleg(true);
                        byte[] byArray = gSSContext.initSecContext(new byte[0], 0, 0);
                        KerberosTicket kerberosTicket = this.getTicket(subject.getPrivateCredentials(), gSSName2, gSSManager);
                        KerberosGSSAPReqTicket kerberosGSSAPReqTicket = new KerberosGSSAPReqTicket(byArray);
                        KerberosEncData kerberosEncData = null;
                        try {
                            kerberosServiceTicket = KerberosRoutingClient.getKeys(subject.getPrivateCredentials());
                            kerberosEncData = this.getKerberosAuthorizationData((KerberosKey[])kerberosServiceTicket, kerberosGSSAPReqTicket);
                        }
                        catch (IllegalStateException illegalStateException) {
                            // empty catch block
                        }
                        kerberosServiceTicket = new KerberosServiceTicket(kerberosTicket.getClient().getName(), string, kerberosTicket.getSessionKey().getEncoded(), System.currentTimeMillis() + (long)gSSContext.getLifetime() * 1000L, kerberosGSSAPReqTicket, null, kerberosEncData);
                    }
                    catch (Throwable throwable) {
                        try {
                            if (gSSContext != null) {
                                gSSContext.dispose();
                            }
                        }
                        catch (IllegalStateException illegalStateException) {
                            throw KerberosRoutingClient.a(illegalStateException);
                        }
                        try {
                            if (gSSCredential != null) {
                                gSSCredential.dispose();
                            }
                        }
                        catch (IllegalStateException illegalStateException) {
                            throw KerberosRoutingClient.a(illegalStateException);
                        }
                        throw throwable;
                    }
                    try {
                        if (gSSContext != null) {
                            gSSContext.dispose();
                        }
                    }
                    catch (IllegalStateException illegalStateException) {
                        throw KerberosRoutingClient.a(illegalStateException);
                    }
                    try {
                        if (gSSCredential != null) {
                            gSSCredential.dispose();
                        }
                    }
                    catch (IllegalStateException illegalStateException) {
                        throw KerberosRoutingClient.a(illegalStateException);
                    }
                    return kerberosServiceTicket;
                });
            }
            catch (SecurityException securityException) {
                String[] stringArray = r;
                throw new KerberosConfigException(stringArray[8], (Throwable)securityException);
            }
            try {
                if (kerberosServiceTicket2 != null) {
                    ticketCache.add(key, kerberosTicket, null, null, kerberosServiceTicket2);
                }
            }
            catch (SecurityException securityException) {
                throw KerberosRoutingClient.a(securityException);
            }
        }
        catch (GSSException gSSException) {
            String[] stringArray = r;
            throw new KerberosConfigException(stringArray[2], (Throwable)gSSException);
        }
        catch (CompletionException completionException) {
            Throwable throwable = completionException.getCause();
            try {
                if (throwable instanceof KerberosException) {
                    throw (KerberosException)throwable;
                }
            }
            catch (SecurityException securityException) {
                throw KerberosRoutingClient.a(securityException);
            }
            throw new KerberosException(r[3], throwable);
        }
        return kerberosServiceTicket2;
    }

    /*
     * Loose catch block
     */
    public KerberosServiceTicket getKerberosServiceTicket(URL uRL, String string, String string2) throws KerberosException {
        KerberosServiceTicket kerberosServiceTicket;
        block21: {
            LoginContext loginContext = null;
            KerberosTicketRepository.Key key = null;
            Subject subject = null;
            try {
                Subject subject2;
                try {
                    if (!KerberosConfig.hasKeytab()) {
                        throw new KerberosConfigException(r[6]);
                    }
                }
                catch (LoginException loginException) {
                    throw KerberosRoutingClient.a(loginException);
                }
                Oid oid = KerberosRoutingClient.getKerberos5Oid();
                GSSManager gSSManager = GSSManager.getInstance();
                GSSName gSSName = gSSManager.createName(string, GSSName.NT_USER_NAME, oid);
                String string3 = KerberosRoutingClient.getGSSServiceName((URL)uRL);
                key = ticketCache.generateKey(string3, KerberosTicketRepository.KeyType.CREDENTIAL, string, string2);
                subject = ticketCache.getSubject(key);
                if (subject == null) {
                    loginContext = this.loginGatewayConfiguredSubject(LOGIN_CONTEXT_OUT_CONFIG_ACCT, string, string2);
                    subject2 = this.kerberosSubject;
                } else {
                    subject2 = subject;
                }
                kerberosServiceTicket = Subject.callAs(subject2, () -> {
                    KerberosServiceTicket kerberosServiceTicket;
                    GSSContext gSSContext = null;
                    GSSCredential gSSCredential = null;
                    try {
                        gSSCredential = gSSManager.createCredential(gSSName, 0, oid, 1);
                        GSSName gSSName2 = gSSManager.createName(string3, GSSName.NT_HOSTBASED_SERVICE, oid);
                        gSSContext = gSSManager.createContext(gSSName2, oid, gSSCredential, this.getKerberosTicketLifetime());
                        gSSContext.requestMutualAuth(false);
                        gSSContext.requestConf(true);
                        gSSContext.requestCredDeleg(true);
                        byte[] byArray = gSSContext.initSecContext(new byte[0], 0, 0);
                        KerberosTicket kerberosTicket = this.getTicket(subject2.getPrivateCredentials(), gSSName2, gSSManager);
                        KerberosGSSAPReqTicket kerberosGSSAPReqTicket = new KerberosGSSAPReqTicket(byArray);
                        kerberosServiceTicket = new KerberosServiceTicket(kerberosTicket.getClient().getName(), string, kerberosTicket.getSessionKey().getEncoded(), System.currentTimeMillis() + (long)gSSContext.getLifetime() * 1000L, kerberosGSSAPReqTicket, null);
                    }
                    catch (Throwable throwable) {
                        try {
                            if (gSSContext != null) {
                                gSSContext.dispose();
                            }
                        }
                        catch (Exception exception) {
                            throw KerberosRoutingClient.a(exception);
                        }
                        try {
                            if (gSSCredential != null) {
                                gSSCredential.dispose();
                            }
                        }
                        catch (Exception exception) {
                            throw KerberosRoutingClient.a(exception);
                        }
                        throw throwable;
                    }
                    try {
                        if (gSSContext != null) {
                            gSSContext.dispose();
                        }
                    }
                    catch (Exception exception) {
                        throw KerberosRoutingClient.a(exception);
                    }
                    try {
                        if (gSSCredential != null) {
                            gSSCredential.dispose();
                        }
                    }
                    catch (Exception exception) {
                        throw KerberosRoutingClient.a(exception);
                    }
                    return kerberosServiceTicket;
                });
                if (kerberosServiceTicket == null) break block21;
                try {
                    block23: {
                        if (subject != null) break block21;
                        break block23;
                        catch (LoginException loginException) {
                            throw KerberosRoutingClient.a(loginException);
                        }
                    }
                    ticketCache.add(key, this.kerberosSubject, loginContext, kerberosServiceTicket);
                }
                catch (LoginException loginException) {
                    throw KerberosRoutingClient.a(loginException);
                }
            }
            catch (LoginException loginException) {
                String[] stringArray = r;
                throw new KerberosConfigException(stringArray[0], (Throwable)loginException);
            }
            catch (SecurityException securityException) {
                String[] stringArray = r;
                throw new KerberosConfigException(stringArray[10], (Throwable)securityException);
            }
            catch (GSSException gSSException) {
                String[] stringArray = r;
                throw new KerberosConfigException(stringArray[9], (Throwable)gSSException);
            }
            catch (CompletionException completionException) {
                block22: {
                    try {
                        try {
                            if (subject == null || key == null) break block22;
                        }
                        catch (LoginException loginException) {
                            throw KerberosRoutingClient.a(loginException);
                        }
                        ticketCache.remove(key);
                    }
                    catch (LoginException loginException) {
                        throw KerberosRoutingClient.a(loginException);
                    }
                }
                Throwable throwable = completionException.getCause();
                try {
                    if (throwable instanceof KerberosException) {
                        throw (KerberosException)throwable;
                    }
                }
                catch (LoginException loginException) {
                    throw KerberosRoutingClient.a(loginException);
                }
                throw new KerberosException(r[7], throwable);
            }
        }
        return kerberosServiceTicket;
    }

    /*
     * Unable to fully structure code
     */
    static {
        block10: {
            block9: {
                var5 = new String[11];
                var3_1 = 0;
                var2_2 = "?Y\u0001\u0001^P6\u001eX@\u000f]R\u007f\u0004\u0017\u0015\u0010[[qJP\u0001\u0017WBw\u0013\u0017\u0003\f\\S\u007f\rB\u0012\u0006V\u0015w\tT\u000f\u0016\\A8#$X@(WLb\u000bU@KyPd\bR\u0012\fA\u0015x\u0005C@\u0000][p\u0003P\u0015\u0011WQ?'/E\u0012\f@\u0015u\u0018R\u0001\u0017[[qJ|\u0005\u0011PPd\u0005D@0WG`\u0003T\u0005Cf\\u\u0001R\u0014M&/E\u0012\f@\u0015u\u0018R\u0001\u0017[[qJ|\u0005\u0011PPd\u0005D@0WG`\u0003T\u0005Cf\\u\u0001R\u0014\u001a!R\u0012\u0001WGy\u0019\u00174\nQ^s\u001e\u0017H\u0001SFs\\\u0003IY\u0012$)E\u0005\u0007W[b\u0003V\f\u0010\u0012Sy\u0018\u0017\u0004\u0006^Pq\u000bC\t\f\\\u0015x\u0005C@\u0005]@x\u000e#$X@(WLb\u000bU@KyPd\bR\u0012\fA\u0015x\u0005C@\u0000][p\u0003P\u0015\u0011WQ?&/E\u0012\f@\u0015u\u0018R\u0001\u0017[[qJ|\u0005\u0011PPd\u0005D@0WG`\u0003T\u0005Cf\\u\u0001R\u0014\u001d!R\u0012\u0001WGy\u0019\u0017\u0003\f\\S\u007f\rB\u0012\u0002F\\y\u0004\u0017\u0005\u0011@ZdD";
                var4_3 = "?Y\u0001\u0001^P6\u001eX@\u000f]R\u007f\u0004\u0017\u0015\u0010[[qJP\u0001\u0017WBw\u0013\u0017\u0003\f\\S\u007f\rB\u0012\u0006V\u0015w\tT\u000f\u0016\\A8#$X@(WLb\u000bU@KyPd\bR\u0012\fA\u0015x\u0005C@\u0000][p\u0003P\u0015\u0011WQ?'/E\u0012\f@\u0015u\u0018R\u0001\u0017[[qJ|\u0005\u0011PPd\u0005D@0WG`\u0003T\u0005Cf\\u\u0001R\u0014M&/E\u0012\f@\u0015u\u0018R\u0001\u0017[[qJ|\u0005\u0011PPd\u0005D@0WG`\u0003T\u0005Cf\\u\u0001R\u0014\u001a!R\u0012\u0001WGy\u0019\u00174\nQ^s\u001e\u0017H\u0001SFs\\\u0003IY\u0012$)E\u0005\u0007W[b\u0003V\f\u0010\u0012Sy\u0018\u0017\u0004\u0006^Pq\u000bC\t\f\\\u0015x\u0005C@\u0005]@x\u000e#$X@(WLb\u000bU@KyPd\bR\u0012\fA\u0015x\u0005C@\u0000][p\u0003P\u0015\u0011WQ?&/E\u0012\f@\u0015u\u0018R\u0001\u0017[[qJ|\u0005\u0011PPd\u0005D@0WG`\u0003T\u0005Cf\\u\u0001R\u0014\u001d!R\u0012\u0001WGy\u0019\u0017\u0003\f\\S\u007f\rB\u0012\u0002F\\y\u0004\u0017\u0005\u0011@ZdD".length();
                var1_4 = 49;
                var0_5 = -1;
lbl7:
                // 2 sources

                while (true) {
                    v0 = 37;
                    v1 = ++var0_5;
                    v2 = var2_2.substring(v1, v1 + var1_4);
                    v3 = -1;
                    break block9;
                    break;
                }
lbl13:
                // 1 sources

                while (true) {
                    var5[var3_1++] = KerberosRoutingClient.a(v0, KerberosRoutingClient.b(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    var2_2 = "\u001ap'9u @-g4\"nnD\u007fI0$eeQ0qu\u0005brU6a0vSi@4g!x\u001d\u0014g'4brL,\"69ifJ8w'7siL1\"0$uoQq";
                    var4_3 = "\u001ap'9u @-g4\"nnD\u007fI0$eeQ0qu\u0005brU6a0vSi@4g!x\u001d\u0014g'4brL,\"69ifJ8w'7siL1\"0$uoQq".length();
                    var1_4 = 39;
                    var0_5 = -1;
lbl22:
                    // 2 sources

                    while (true) {
                        v0 = 16;
                        v4 = ++var0_5;
                        v2 = var2_2.substring(v4, v4 + var1_4);
                        v3 = 0;
                        break block9;
                        break;
                    }
                    break;
                }
lbl28:
                // 1 sources

                while (true) {
                    var5[var3_1++] = KerberosRoutingClient.a(v0, KerberosRoutingClient.b(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    break block10;
                    break;
                }
            }
            switch (v3) {
                default: {
                    ** continue;
                }
                ** case 0:
lbl39:
                // 1 sources

                ** continue;
            }
        }
        KerberosRoutingClient.r = var5;
        KerberosRoutingClient.a = Logger.getLogger(KerberosRoutingClient.class.getName());
    }

    private static Exception a(Exception exception) {
        return exception;
    }

    private static char[] b(String string) {
        char[] cArray = string.toCharArray();
        if (cArray.length < 2) {
            cArray = cArray;
            cArray[0] = (char)(cArray[0] ^ 0x33);
        }
        return cArray;
    }

    /*
     * Handled impossible loop by duplicating code
     * Enabled aggressive block sorting
     */
    private static String a(int n2, char[] cArray) {
        char[] cArray2;
        block11: {
            int n3;
            int n4;
            int n5;
            block10: {
                n5 = n2;
                cArray2 = cArray;
                n4 = cArray.length;
                n3 = 0;
                if (!true) break block10;
                n4 = n4;
                if (n4 <= n3) break block11;
            }
            do {
                n5 = n5;
                cArray2 = cArray2;
                int n6 = n3;
                cArray2[n6] = (char)(cArray2[n6] ^ (n5 ^ (switch (n3 % 7) {
                    case 0 -> 79;
                    case 1 -> 18;
                    case 2 -> 69;
                    case 3 -> 70;
                    case 4 -> 23;
                    case 5 -> 16;
                    default -> 51;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }
}

