/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.common.http.GenericHttpClientFactory
 *  com.l7tech.common.http.GenericHttpException
 *  com.l7tech.common.http.GenericHttpHeader
 *  com.l7tech.common.http.GenericHttpRequestParams
 *  com.l7tech.common.http.HttpHeader
 *  com.l7tech.common.http.SimpleHttpClient
 *  com.l7tech.common.mime.ContentTypeHeader
 *  com.l7tech.gateway.common.audit.AssertionMessages
 *  com.l7tech.gateway.common.audit.AuditDetailMessage
 *  com.l7tech.message.Message
 *  com.l7tech.message.SecurityKnob
 *  com.l7tech.message.XmlKnob
 *  com.l7tech.policy.assertion.AssertionStatus
 *  com.l7tech.policy.assertion.PolicyAssertionException
 *  com.l7tech.policy.assertion.credential.CredentialFormat
 *  com.l7tech.policy.assertion.credential.LoginCredentials
 *  com.l7tech.policy.assertion.credential.WsTrustCredentialExchange
 *  com.l7tech.security.token.SecurityToken
 *  com.l7tech.security.token.UsernameToken
 *  com.l7tech.security.token.UsernameTokenImpl
 *  com.l7tech.security.token.XmlSecurityToken
 *  com.l7tech.security.wstrust.TokenServiceClient
 *  com.l7tech.security.wstrust.WsTrustConfigException
 *  com.l7tech.security.wstrust.WsTrustConfigFactory
 *  com.l7tech.security.xml.SecurityTokenResolver
 *  com.l7tech.security.xml.decorator.DecorationRequirements
 *  com.l7tech.security.xml.decorator.WssDecoratorImpl
 *  com.l7tech.security.xml.processor.WssProcessor
 *  com.l7tech.security.xml.processor.WssProcessorImpl
 *  com.l7tech.util.InvalidDocumentFormatException
 *  com.l7tech.util.SoapConstants
 *  com.l7tech.xml.saml.SamlAssertion
 *  org.springframework.context.ApplicationContext
 */
package com.l7tech.server.policy.assertion.credential;

import com.l7tech.common.http.GenericHttpClientFactory;
import com.l7tech.common.http.GenericHttpException;
import com.l7tech.common.http.GenericHttpHeader;
import com.l7tech.common.http.GenericHttpRequestParams;
import com.l7tech.common.http.HttpHeader;
import com.l7tech.common.http.SimpleHttpClient;
import com.l7tech.common.mime.ContentTypeHeader;
import com.l7tech.gateway.common.audit.AssertionMessages;
import com.l7tech.gateway.common.audit.AuditDetailMessage;
import com.l7tech.message.Message;
import com.l7tech.message.SecurityKnob;
import com.l7tech.message.XmlKnob;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.policy.assertion.PolicyAssertionException;
import com.l7tech.policy.assertion.credential.CredentialFormat;
import com.l7tech.policy.assertion.credential.LoginCredentials;
import com.l7tech.policy.assertion.credential.WsTrustCredentialExchange;
import com.l7tech.security.token.SecurityToken;
import com.l7tech.security.token.UsernameToken;
import com.l7tech.security.token.UsernameTokenImpl;
import com.l7tech.security.token.XmlSecurityToken;
import com.l7tech.security.wstrust.TokenServiceClient;
import com.l7tech.security.wstrust.WsTrustConfigException;
import com.l7tech.security.wstrust.WsTrustConfigFactory;
import com.l7tech.security.xml.SecurityTokenResolver;
import com.l7tech.security.xml.decorator.DecorationRequirements;
import com.l7tech.security.xml.decorator.WssDecoratorImpl;
import com.l7tech.security.xml.processor.WssProcessor;
import com.l7tech.security.xml.processor.WssProcessorImpl;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.policy.assertion.credential.AbstractServerCachedSecurityTokenAssertion;
import com.l7tech.util.InvalidDocumentFormatException;
import com.l7tech.util.SoapConstants;
import com.l7tech.xml.saml.SamlAssertion;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.springframework.context.ApplicationContext;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class ServerWsTrustCredentialExchange
extends AbstractServerCachedSecurityTokenAssertion<WsTrustCredentialExchange> {
    private static final String g;
    private final SimpleHttpClient h;
    private final URL i;
    private final WssProcessor j = new WssProcessorImpl();
    private final SecurityTokenResolver k;
    private static final String[] l;

    public ServerWsTrustCredentialExchange(WsTrustCredentialExchange wsTrustCredentialExchange, ApplicationContext applicationContext) {
        super(wsTrustCredentialExchange, g);
        String[] stringArray = l;
        this.h = new SimpleHttpClient(((GenericHttpClientFactory)applicationContext.getBean(stringArray[3], GenericHttpClientFactory.class)).createHttpClient());
        try {
            if (wsTrustCredentialExchange.getTokenServiceUrl() != null) {
                this.i = new URL(wsTrustCredentialExchange.getTokenServiceUrl());
            } else {
                this.i = null;
                stringArray = l;
                this.logger.warning(stringArray[4]);
            }
        }
        catch (MalformedURLException malformedURLException) {
            stringArray = l;
            throw (IllegalArgumentException)new IllegalArgumentException(stringArray[1]).initCause(malformedURLException);
        }
        this.k = (SecurityTokenResolver)applicationContext.getBean(l[5]);
    }

    /*
     * Could not resolve type clashes
     * Unable to fully structure code
     */
    @Override
    public AssertionStatus checkRequest(PolicyEnforcementContext var1_1) throws IOException, PolicyAssertionException {
        block49: {
            var2_2 = (XmlKnob)var1_1.getRequest().getKnob(XmlKnob.class);
            try {
                if (var2_2 == null) {
                    this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_NON_XML_MESSAGE);
                    return AssertionStatus.FAILED;
                }
            }
            catch (Exception v0) {
                throw ServerWsTrustCredentialExchange.a(v0);
            }
            var3_3 = (SecurityKnob)var1_1.getRequest().getKnob(SecurityKnob.class);
            var4_4 = null;
            var5_5 = null;
            if (var3_3 == null || (var6_6 = var3_3.getProcessorResult()) == null) break block49;
            var7_7 /* !! */  = var6_6.getXmlSecurityTokens();
            for (XmlSecurityToken var11_20 : var7_7 /* !! */ ) {
                block42: {
                    if (var11_20 instanceof SamlAssertion) ** GOTO lbl22
                    try {
                        block50: {
                            if (!(var11_20 instanceof UsernameToken)) continue;
                            break block50;
                            catch (Exception v1) {
                                throw ServerWsTrustCredentialExchange.a(v1);
                            }
                        }
                        if (var4_4 != null) break block42;
                    }
                    catch (Exception v2) {
                        throw ServerWsTrustCredentialExchange.a(v2);
                    }
                    var4_4 = var11_20;
                    var5_5 = var11_20.asElement();
                    continue;
                }
                this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_MULTI_TOKENS);
                return AssertionStatus.FAILED;
            }
        }
        if (var4_4 == null && (var6_6 = var1_1.getAuthenticationContext(var1_1.getRequest()).getLastCredentials()) != null) {
            var7_7 /* !! */  = var6_6.getPayload();
            if (var7_7 /* !! */  instanceof XmlSecurityToken) {
                var4_4 = (XmlSecurityToken)var7_7 /* !! */ ;
            } else if (var6_6.getFormat() == CredentialFormat.CLEARTEXT) {
                var4_4 = new UsernameTokenImpl(var6_6.getLogin(), var6_6.getCredentials());
            }
        }
        try {
            if (var4_4 == null) {
                this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_NO_SUITABLE_CREDENTIALS);
                return AssertionStatus.FAILED;
            }
        }
        catch (Exception v3) {
            throw ServerWsTrustCredentialExchange.a(v3);
        }
        var6_6 = super.getCachedSecurityToken(var1_1.getCache());
        try {
            block48: {
                block47: {
                    block46: {
                        block52: {
                            block43: {
                                block45: {
                                    block44: {
                                        if (var6_6 != null) break block43;
                                        try {
                                            block51: {
                                                if (((WsTrustCredentialExchange)this.assertion).getWsTrustNamespace() != null) break block44;
                                                break block51;
                                                catch (Exception v4) {
                                                    throw ServerWsTrustCredentialExchange.a(v4);
                                                }
                                            }
                                            v5 = WsTrustConfigFactory.getDefaultWsTrustConfig();
                                            break block45;
                                        }
                                        catch (Exception v6) {
                                            throw ServerWsTrustCredentialExchange.a(v6);
                                        }
                                    }
                                    v5 = WsTrustConfigFactory.getWsTrustConfigForNamespaceUri((String)((WsTrustCredentialExchange)this.assertion).getWsTrustNamespace());
                                }
                                var10_18 = v5;
                                var11_20 = new TokenServiceClient(var10_18);
                                var8_12 /* !! */  = var11_20.createRequestSecurityTokenMessage(null, ((WsTrustCredentialExchange)this.assertion).getRequestType(), var4_4, ((WsTrustCredentialExchange)this.assertion).getAppliesTo(), ((WsTrustCredentialExchange)this.assertion).getIssuer());
                                var9_14 = new GenericHttpRequestParams(this.i);
                                var9_14.setContentType(ContentTypeHeader.XML_DEFAULT);
                                var9_14.setExtraHeaders(new HttpHeader[]{new GenericHttpHeader(SoapConstants.SOAPACTION, ServerWsTrustCredentialExchange.l[2])});
                                var12_22 = this.h.postXml(var9_14, (Document)var8_12 /* !! */ );
                                var13_23 = var12_22.getStatus();
                                if (var13_23 != 200) {
                                    this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_RSTR_STATUS_NON_200);
                                    return AssertionStatus.AUTH_REQUIRED;
                                }
                                var14_24 = var12_22.getDocument();
                                var7_7 /* !! */  = var11_20.parseUnsignedRequestSecurityTokenResponse(var14_24);
                                break block52;
                            }
                            var7_7 /* !! */  = var6_6;
                        }
                        var8_12 /* !! */  = var2_2.getDocumentWritable();
                        try {
                            if (var5_5 != null) break block46;
                            this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_ORIGINAL_TOKEN_NOT_XML);
                            break block47;
                        }
                        catch (Exception v7) {
                            throw ServerWsTrustCredentialExchange.a(v7);
                        }
                    }
                    var9_15 = var5_5.getParentNode();
                    try {
                        var9_15.removeChild(var5_5);
                        if (var9_15.getFirstChild() == null) {
                            var9_15.getParentNode().removeChild(var9_15);
                        }
                    }
                    catch (Exception v8) {
                        throw ServerWsTrustCredentialExchange.a(v8);
                    }
                }
                var9_16 = new DecorationRequirements();
                var10_19 = new WssDecoratorImpl();
                var9_16.setSecurityHeaderReusable(true);
                if (var3_3 == null) break block48;
                var11_20 = var3_3.getProcessorResult();
                if (var11_20 == null) break block48;
                try {
                    block53: {
                        if (var11_20.getTimestamp() == null) break block48;
                        break block53;
                        catch (Exception v9) {
                            throw ServerWsTrustCredentialExchange.a(v9);
                        }
                    }
                    var9_16.setIncludeTimestamp(false);
                }
                catch (Exception v10) {
                    throw ServerWsTrustCredentialExchange.a(v10);
                }
            }
            if (var7_7 /* !! */  instanceof SamlAssertion) {
                var11_20 = (SamlAssertion)var7_7 /* !! */ ;
                this.setCachedSecurityToken(var1_1.getCache(), (SecurityToken)var11_20, this.getSamlAssertionExpiry((SamlAssertion)var11_20));
                var1_1.getAuthenticationContext(var1_1.getRequest()).addCredentials(LoginCredentials.makeLoginCredentials((SecurityToken)var11_20, ((WsTrustCredentialExchange)this.assertion).getClass()));
                var9_16.setSenderSamlToken((SamlAssertion)var11_20, false);
            } else if (var7_7 /* !! */  instanceof UsernameToken) {
                var11_20 = (UsernameToken)var7_7 /* !! */ ;
                this.setCachedSecurityToken(var1_1.getCache(), (SecurityToken)var11_20, this.getUsernameTokenExpiry((UsernameToken)var11_20));
                var9_16.setUsernameTokenCredentials((UsernameToken)new UsernameTokenImpl(var11_20.getUsername(), var11_20.getPassword()));
            } else {
                this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_RSTR_BAD_TYPE);
                return AssertionStatus.AUTH_REQUIRED;
            }
            this.addCacheInvalidator(var1_1);
            try {
                var10_19.decorateMessage(new Message((Document)var8_12 /* !! */ ), var9_16);
                var2_2.setDocument((Document)var8_12 /* !! */ );
                var11_20 = var1_1.getRequest();
                try {
                    v11 = var3_3 != null ? var3_3 : var11_20.getSecurityKnob();
                }
                catch (Exception v12) {
                    throw ServerWsTrustCredentialExchange.a(v12);
                }
                var12_22 = v11;
                var12_22.setProcessorResult(this.j.undecorateMessage((Message)var11_20, null, this.k));
                return AssertionStatus.NONE;
            }
            catch (Exception var11_21) {
                this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_DECORATION_FAILED, null, var11_21);
                return AssertionStatus.FAILED;
            }
        }
        catch (GenericHttpException var7_8) {
            this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_SERVER_HTTP_FAILED, null, var7_8);
            return AssertionStatus.FAILED;
        }
        catch (SAXException var7_9) {
            this.logAndAudit((AuditDetailMessage)AssertionMessages.HTTPROUTE_ERROR_READING_RESPONSE, null, var7_9);
            return AssertionStatus.FAILED;
        }
        catch (InvalidDocumentFormatException var7_10) {
            this.logAndAudit((AuditDetailMessage)AssertionMessages.HTTPROUTE_ERROR_READING_RESPONSE, null, var7_10);
            return AssertionStatus.FAILED;
        }
        catch (WsTrustConfigException var7_11) {
            this.logAndAudit((AuditDetailMessage)AssertionMessages.WSTRUST_NOT_SUPPORTED, new String[]{((WsTrustCredentialExchange)this.assertion).getWsTrustNamespace()});
            return AssertionStatus.FAILED;
        }
    }

    /*
     * Unable to fully structure code
     */
    static {
        block10: {
            block9: {
                var5 = new String[6];
                var3_1 = 0;
                var2_2 = "Maw_km\u001c6[YvBF\"\u0017Z\u0018dOQq\u0006\u0015oG\u0003wp\u0016FL4{qN\u0002A\u0017\u0018\u0002[Wz{Qn+ALdmOk\u0006[LRO@v\fGA";
                var4_3 = "Maw_km\u001c6[YvBF\"\u0017Z\u0018dOQq\u0006\u0015oG\u0003wp\u0016FL4{qN\u0002A\u0017\u0018\u0002[Wz{Qn+ALdmOk\u0006[LRO@v\fGA".length();
                var1_4 = 6;
                var0_5 = -1;
lbl7:
                // 2 sources

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

                while (true) {
                    var5[var3_1++] = ServerWsTrustCredentialExchange.c(v0, ServerWsTrustCredentialExchange.b(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    var2_2 = "V;2\u0010!b0g&/\u001c,'CW\u0006\u0015U&1Cl!5\u0019tb\u0002q'<\u0007;+\flt0\u0006o,\fly?\u0000!!\u0017k;7\u0014#\u0015q1:\u0000=+\u0017{\u00006\u001e*,1g'6\u00199'\u0011";
                    var4_3 = "V;2\u0010!b0g&/\u001c,'CW\u0006\u0015U&1Cl!5\u0019tb\u0002q'<\u0007;+\flt0\u0006o,\fly?\u0000!!\u0017k;7\u0014#\u0015q1:\u0000=+\u0017{\u00006\u001e*,1g'6\u00199'\u0011".length();
                    var1_4 = 54;
                    var0_5 = -1;
lbl22:
                    // 2 sources

                    while (true) {
                        v0 = 48;
                        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++] = ServerWsTrustCredentialExchange.c(v0, ServerWsTrustCredentialExchange.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;
            }
        }
        ServerWsTrustCredentialExchange.l = var5;
        ServerWsTrustCredentialExchange.g = ServerWsTrustCredentialExchange.class.getName() + ServerWsTrustCredentialExchange.l[0];
    }

    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] ^ 0x53);
        }
        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 -> 50;
                    case 1 -> 100;
                    case 2 -> 105;
                    case 3 -> 69;
                    case 4 -> 127;
                    case 5 -> 114;
                    default -> 83;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }
}

