/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.common.io.CertUtils
 *  com.l7tech.gateway.common.audit.AssertionMessages
 *  com.l7tech.gateway.common.audit.AuditDetailMessage
 *  com.l7tech.message.Message
 *  com.l7tech.policy.assertion.AssertionStatus
 *  com.l7tech.policy.assertion.PolicyAssertionException
 *  com.l7tech.policy.assertion.credential.LoginCredentials
 *  com.l7tech.policy.assertion.xmlsec.RequireWssX509Cert
 *  com.l7tech.policy.variable.NoSuchVariableException
 *  com.l7tech.security.token.SecurityToken
 *  com.l7tech.security.token.SignedElement
 *  com.l7tech.security.token.X509SigningSecurityToken
 *  com.l7tech.security.token.XmlSecurityToken
 *  com.l7tech.security.xml.SecurityTokenResolver
 *  com.l7tech.security.xml.processor.ProcessorResult
 *  com.l7tech.security.xml.processor.X509BinarySecurityTokenImpl
 *  com.l7tech.util.ArrayUtils
 *  com.l7tech.util.CausedIOException
 *  com.l7tech.util.Config
 *  com.l7tech.util.ConfigFactory
 *  com.l7tech.util.ExceptionUtils
 *  com.l7tech.util.InvalidDocumentFormatException
 *  com.l7tech.xml.soap.SoapUtil
 *  org.springframework.beans.factory.BeanFactory
 */
package com.l7tech.server.policy.assertion.xmlsec;

import com.l7tech.common.io.CertUtils;
import com.l7tech.gateway.common.audit.AssertionMessages;
import com.l7tech.gateway.common.audit.AuditDetailMessage;
import com.l7tech.message.Message;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.policy.assertion.PolicyAssertionException;
import com.l7tech.policy.assertion.credential.LoginCredentials;
import com.l7tech.policy.assertion.xmlsec.RequireWssX509Cert;
import com.l7tech.policy.variable.NoSuchVariableException;
import com.l7tech.security.token.SecurityToken;
import com.l7tech.security.token.SignedElement;
import com.l7tech.security.token.X509SigningSecurityToken;
import com.l7tech.security.token.XmlSecurityToken;
import com.l7tech.security.xml.SecurityTokenResolver;
import com.l7tech.security.xml.processor.ProcessorResult;
import com.l7tech.security.xml.processor.X509BinarySecurityTokenImpl;
import com.l7tech.server.message.AuthenticationContext;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.policy.assertion.AbstractMessageTargetableServerAssertion;
import com.l7tech.server.util.WSSecurityProcessorUtils;
import com.l7tech.util.ArrayUtils;
import com.l7tech.util.CausedIOException;
import com.l7tech.util.Config;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.InvalidDocumentFormatException;
import com.l7tech.xml.soap.SoapUtil;
import java.io.IOException;
import java.security.cert.X509Certificate;
import org.springframework.beans.factory.BeanFactory;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class ServerRequireWssX509Cert
extends AbstractMessageTargetableServerAssertion<RequireWssX509Cert> {
    private static final boolean d;
    private final Config e;
    private final SecurityTokenResolver f;
    private static final String[] g;

    public ServerRequireWssX509Cert(RequireWssX509Cert requireWssX509Cert, BeanFactory beanFactory) {
        super(requireWssX509Cert);
        String[] stringArray = g;
        this.e = (Config)beanFactory.getBean(stringArray[4], Config.class);
        this.f = (SecurityTokenResolver)beanFactory.getBean(stringArray[2], SecurityTokenResolver.class);
    }

    @Override
    public AssertionStatus checkRequest(PolicyEnforcementContext policyEnforcementContext) throws IOException, PolicyAssertionException {
        try {
            if (!((RequireWssX509Cert)this.assertion).getRecipientContext().localRecipient()) {
                this.logAndAudit((AuditDetailMessage)AssertionMessages.WSS_X509_FOR_ANOTHER_USER);
                return AssertionStatus.NONE;
            }
        }
        catch (IOException iOException) {
            throw ServerRequireWssX509Cert.a(iOException);
        }
        return super.checkRequest(policyEnforcementContext);
    }

    /*
     * Loose catch block
     */
    @Override
    protected AssertionStatus doCheckRequest(PolicyEnforcementContext policyEnforcementContext, Message message, String string, AuthenticationContext authenticationContext) throws IOException, PolicyAssertionException {
        Object object;
        Element[] elementArray;
        ProcessorResult processorResult;
        block36: {
            block37: {
                block35: {
                    try {
                        if (!message.isSoap()) {
                            this.logAndAudit((AuditDetailMessage)AssertionMessages.WSS_X509_NON_SOAP, string);
                            return this.getBadMessageStatus();
                        }
                    }
                    catch (NoSuchVariableException noSuchVariableException) {
                        throw ServerRequireWssX509Cert.a((Exception)((Object)noSuchVariableException));
                    }
                    try {
                        block34: {
                            try {
                                if (!this.isRequest() || this.e.getBooleanProperty(g[3], true)) break block34;
                            }
                            catch (SAXException sAXException) {
                                throw ServerRequireWssX509Cert.a(sAXException);
                            }
                            processorResult = message.getSecurityKnob().getProcessorResult();
                            break block35;
                        }
                        processorResult = WSSecurityProcessorUtils.getWssResults(message, string, this.f, this.getAudit());
                    }
                    catch (SAXException sAXException) {
                        throw new CausedIOException((Throwable)sAXException);
                    }
                }
                if (processorResult != null) break block36;
                try {
                    block39: {
                        this.logAndAudit((AuditDetailMessage)AssertionMessages.WSS_X509_NO_WSS_LEVEL_SECURITY, string);
                        if (!this.isRequest()) break block37;
                        break block39;
                        catch (SAXException sAXException) {
                            throw ServerRequireWssX509Cert.a(sAXException);
                        }
                    }
                    policyEnforcementContext.setRequestPolicyViolated();
                    policyEnforcementContext.setAuthenticationMissing();
                }
                catch (SAXException sAXException) {
                    throw ServerRequireWssX509Cert.a(sAXException);
                }
            }
            return AssertionStatus.FALSIFIED;
        }
        AssertionStatus assertionStatus = processorResult.getXmlSecurityTokens();
        if (assertionStatus == null) {
            AssertionStatus assertionStatus2 = this.a(policyEnforcementContext);
            this.logAndAudit((AuditDetailMessage)AssertionMessages.WSS_X509_NO_TOKEN, string, assertionStatus2.getMessage());
            return assertionStatus2;
        }
        Element[] elementArray2 = null;
        if (((RequireWssX509Cert)this.assertion).getSignatureElementVariable() != null) {
            elementArray2 = new Element[]{};
            try {
                elementArray = policyEnforcementContext.getVariable(((RequireWssX509Cert)this.assertion).getSignatureElementVariable());
                if (elementArray instanceof Element) {
                    elementArray2 = new Element[]{(Element)elementArray};
                } else if (elementArray instanceof Element[]) {
                    elementArray2 = elementArray;
                }
            }
            catch (NoSuchVariableException noSuchVariableException) {
                // empty catch block
            }
        }
        elementArray = null;
        if (((RequireWssX509Cert)this.assertion).getSignatureReferenceElementVariable() != null) {
            elementArray = new Element[]{};
            try {
                object = policyEnforcementContext.getVariable(((RequireWssX509Cert)this.assertion).getSignatureReferenceElementVariable());
                if (object instanceof Element) {
                    elementArray = new Element[]{(Element)object};
                } else if (object instanceof Element[]) {
                    elementArray = (Element[])object;
                }
            }
            catch (NoSuchVariableException noSuchVariableException) {
                // empty catch block
            }
        }
        object = null;
        for (XmlSecurityToken xmlSecurityToken : assertionStatus) {
            if (!this.a(xmlSecurityToken)) continue;
            X509SigningSecurityToken x509SigningSecurityToken = (X509SigningSecurityToken)xmlSecurityToken;
            try {
                X509Certificate x509Certificate;
                block38: {
                    try {
                        if (!x509SigningSecurityToken.isPossessionProved() || !this.a(elementArray2, elementArray, x509SigningSecurityToken)) continue;
                    }
                    catch (SAXException sAXException) {
                        throw ServerRequireWssX509Cert.a(sAXException);
                    }
                    x509Certificate = x509SigningSecurityToken.getMessageSigningCertificate();
                    if (object == null) break block38;
                    try {
                        block40: {
                            if (object == x509SigningSecurityToken.getSignedElements()[0].getSignatureElement()) break block38;
                            break block40;
                            catch (SAXException sAXException) {
                                throw ServerRequireWssX509Cert.a(sAXException);
                            }
                        }
                        if (((RequireWssX509Cert)this.assertion).isAllowMultipleSignatures()) break block38;
                    }
                    catch (SAXException sAXException) {
                        throw ServerRequireWssX509Cert.a(sAXException);
                    }
                    this.logAndAudit((AuditDetailMessage)AssertionMessages.WSS_X509_TOO_MANY_VALID_SIG, string);
                    return this.getBadMessageStatus();
                }
                object = x509SigningSecurityToken.getSignedElements()[0].getSignatureElement();
                String string2 = CertUtils.extractFirstCommonNameFromCertificate((X509Certificate)x509Certificate);
                authenticationContext.addCredentials(LoginCredentials.makeLoginCredentials((SecurityToken)x509SigningSecurityToken, ((RequireWssX509Cert)this.assertion).getClass()));
                this.logAndAudit((AuditDetailMessage)AssertionMessages.WSS_X509_CERT_LOADED, string2);
            }
            catch (InvalidDocumentFormatException invalidDocumentFormatException) {
                this.logAndAudit((AuditDetailMessage)AssertionMessages.EXCEPTION_WARNING_WITH_MORE_INFO, new String[]{g[0] + ExceptionUtils.getMessage((Throwable)invalidDocumentFormatException)}, ExceptionUtils.getDebugException((Throwable)invalidDocumentFormatException));
                return this.getBadMessageStatus();
            }
        }
        if (object == null) {
            AssertionStatus assertionStatus3 = this.a(policyEnforcementContext);
            this.logAndAudit((AuditDetailMessage)AssertionMessages.WSS_X509_NO_PROVEN_CERT, string, assertionStatus3.getMessage());
            return assertionStatus3;
        }
        return AssertionStatus.NONE;
    }

    private boolean a(XmlSecurityToken xmlSecurityToken) {
        if (d) {
            return xmlSecurityToken instanceof X509BinarySecurityTokenImpl;
        }
        return xmlSecurityToken instanceof X509SigningSecurityToken;
    }

    private AssertionStatus a(PolicyEnforcementContext policyEnforcementContext) {
        AssertionStatus assertionStatus;
        if (this.isRequest()) {
            assertionStatus = AssertionStatus.AUTH_REQUIRED;
            policyEnforcementContext.setAuthenticationMissing();
        } else {
            assertionStatus = AssertionStatus.FALSIFIED;
        }
        return assertionStatus;
    }

    private boolean a(Element[] elementArray, Element[] elementArray2, X509SigningSecurityToken x509SigningSecurityToken) throws InvalidDocumentFormatException {
        boolean bl2;
        block11: {
            block10: {
                bl2 = false;
                try {
                    if (elementArray != null || elementArray2 != null) break block10;
                }
                catch (InvalidDocumentFormatException invalidDocumentFormatException) {
                    throw ServerRequireWssX509Cert.a((Exception)((Object)invalidDocumentFormatException));
                }
                bl2 = true;
                break block11;
            }
            SignedElement[] signedElementArray = x509SigningSecurityToken.getSignedElements();
            if (signedElementArray.length > 0) {
                block12: {
                    Element element;
                    block13: {
                        element = signedElementArray[0].getSignatureElement();
                        try {
                            try {
                                try {
                                    if (element == null || !this.a(elementArray2, signedElementArray)) break block11;
                                }
                                catch (InvalidDocumentFormatException invalidDocumentFormatException) {
                                    throw ServerRequireWssX509Cert.a((Exception)((Object)invalidDocumentFormatException));
                                }
                                if (elementArray == null) break block12;
                            }
                            catch (InvalidDocumentFormatException invalidDocumentFormatException) {
                                throw ServerRequireWssX509Cert.a((Exception)((Object)invalidDocumentFormatException));
                            }
                            if (!ArrayUtils.contains((Object[])elementArray, (Object)element)) break block13;
                        }
                        catch (InvalidDocumentFormatException invalidDocumentFormatException) {
                            throw ServerRequireWssX509Cert.a((Exception)((Object)invalidDocumentFormatException));
                        }
                        bl2 = true;
                        break block11;
                    }
                    for (Element element2 : elementArray) {
                        if (!element.isEqualNode(element2)) continue;
                        bl2 = true;
                        break block11;
                    }
                    break block11;
                }
                bl2 = true;
            }
        }
        return bl2;
    }

    private boolean a(Element[] elementArray, SignedElement[] signedElementArray) throws InvalidDocumentFormatException {
        boolean bl2;
        block10: {
            block7: {
                boolean bl3;
                block9: {
                    block8: {
                        try {
                            try {
                                if (elementArray == null) break block7;
                                if (elementArray.length <= 0) break block8;
                            }
                            catch (InvalidDocumentFormatException invalidDocumentFormatException) {
                                throw ServerRequireWssX509Cert.a((Exception)((Object)invalidDocumentFormatException));
                            }
                            bl3 = true;
                            break block9;
                        }
                        catch (InvalidDocumentFormatException invalidDocumentFormatException) {
                            throw ServerRequireWssX509Cert.a((Exception)((Object)invalidDocumentFormatException));
                        }
                    }
                    bl3 = false;
                }
                boolean bl4 = bl3;
                for (Element element : elementArray) {
                    String string = SoapUtil.getElementWsuId((Element)element);
                    try {
                        if (string != null && this.a(signedElementArray, string)) continue;
                    }
                    catch (InvalidDocumentFormatException invalidDocumentFormatException) {
                        throw ServerRequireWssX509Cert.a((Exception)((Object)invalidDocumentFormatException));
                    }
                    bl4 = false;
                    break;
                }
                bl2 = bl4;
                break block10;
            }
            bl2 = true;
        }
        return bl2;
    }

    private boolean a(SignedElement[] signedElementArray, String string) throws InvalidDocumentFormatException {
        boolean bl2 = false;
        for (SignedElement signedElement : signedElementArray) {
            String string2;
            Element element = signedElement.asElement();
            if (element == null || !string.equals(string2 = SoapUtil.getElementWsuId((Element)element))) continue;
            bl2 = true;
            break;
        }
        return bl2;
    }

    /*
     * Unable to fully structure code
     */
    static {
        block10: {
            block9: {
                var5 = new String[5];
                var3_1 = 0;
                var2_2 = "i\u0004\r$\u007fI\u001cH\u0005L%{I_WJ\u001f#pYNU\u001e\u0015fgCWY\u0004\u001f|3B_\u0005\u0001h\u007f\u001bHY\t\u0004h`INJ\u000f\u001ehcCPU\t\u0015hr_OY\u0018\u0018/|B\u0012D\u0007\u00005vO\u0012D_\\\u007f@XNU\t\u0018\u0012|GYR>\u00156voTY\t\u0007\u0015O\u000f\u000f3aEHE>\u0003-vBnY\u0019\u0003*eIN";
                var4_3 = "i\u0004\r$\u007fI\u001cH\u0005L%{I_WJ\u001f#pYNU\u001e\u0015fgCWY\u0004\u001f|3B_\u0005\u0001h\u007f\u001bHY\t\u0004h`INJ\u000f\u001ehcCPU\t\u0015hr_OY\u0018\u0018/|B\u0012D\u0007\u00005vO\u0012D_\\\u007f@XNU\t\u0018\u0012|GYR>\u00156voTY\t\u0007\u0015O\u000f\u000f3aEHE>\u0003-vBnY\u0019\u0003*eIN".length();
                var1_4 = 33;
                var0_5 = -1;
lbl7:
                // 2 sources

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

                while (true) {
                    var5[var3_1++] = ServerRequireWssX509Cert.c(v0, ServerRequireWssX509Cert.a(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    var2_2 = "p\"$SXehd4$\u000eGe)b?6\u001fDrCb72\u000fZrcU4&\bMdsW#8\u001eMdtn?0\ft4%\u000bMeDh?1\u0014O";
                    var4_3 = "p\"$SXehd4$\u000eGe)b?6\u001fDrCb72\u000fZrcU4&\bMdsW#8\u001eMdtn?0\ft4%\u000bMeDh?1\u0014O".length();
                    var1_4 = 45;
                    var0_5 = -1;
lbl22:
                    // 2 sources

                    while (true) {
                        v0 = 33;
                        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++] = ServerRequireWssX509Cert.c(v0, ServerRequireWssX509Cert.a(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;
            }
        }
        ServerRequireWssX509Cert.g = var5;
        ServerRequireWssX509Cert.d = ConfigFactory.getBooleanProperty((String)ServerRequireWssX509Cert.g[1], (boolean)true);
    }

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

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

    /*
     * Handled impossible loop by duplicating code
     * Enabled aggressive block sorting
     */
    private static String c(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 -> 38;
                    case 1 -> 112;
                    case 2 -> 118;
                    case 3 -> 92;
                    case 4 -> 9;
                    case 5 -> 54;
                    default -> 38;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }
}

