/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.gateway.common.audit.AssertionMessages
 *  com.l7tech.gateway.common.audit.Audit
 *  com.l7tech.gateway.common.audit.AuditDetailMessage
 *  com.l7tech.message.Message
 *  com.l7tech.message.SecurityKnob
 *  com.l7tech.policy.assertion.AssertionStatus
 *  com.l7tech.policy.assertion.PolicyAssertionException
 *  com.l7tech.policy.assertion.xmlsec.AddWssUsernameToken
 *  com.l7tech.policy.assertion.xmlsec.XmlSecurityRecipientContext
 *  com.l7tech.security.token.UsernameToken
 *  com.l7tech.security.token.UsernameTokenImpl
 *  com.l7tech.security.xml.decorator.DecorationRequirements
 *  com.l7tech.util.CausedIOException
 *  com.l7tech.util.HexUtils
 *  com.l7tech.util.ISO8601Date
 */
package com.l7tech.server.policy.assertion.xmlsec;

import com.l7tech.gateway.common.audit.AssertionMessages;
import com.l7tech.gateway.common.audit.Audit;
import com.l7tech.gateway.common.audit.AuditDetailMessage;
import com.l7tech.message.Message;
import com.l7tech.message.SecurityKnob;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.policy.assertion.PolicyAssertionException;
import com.l7tech.policy.assertion.xmlsec.AddWssUsernameToken;
import com.l7tech.policy.assertion.xmlsec.XmlSecurityRecipientContext;
import com.l7tech.security.token.UsernameToken;
import com.l7tech.security.token.UsernameTokenImpl;
import com.l7tech.security.xml.decorator.DecorationRequirements;
import com.l7tech.server.message.AuthenticationContext;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.policy.assertion.ServerAssertion;
import com.l7tech.server.policy.assertion.xmlsec.AddWssEncryptionContext;
import com.l7tech.server.policy.assertion.xmlsec.AddWssEncryptionSupport;
import com.l7tech.server.policy.assertion.xmlsec.ServerAddWssEncryption;
import com.l7tech.server.policy.variable.ExpandVariables;
import com.l7tech.util.CausedIOException;
import com.l7tech.util.HexUtils;
import com.l7tech.util.ISO8601Date;
import java.io.IOException;
import java.util.Date;
import org.xml.sax.SAXException;

public class ServerAddWssUsernameToken
extends ServerAddWssEncryption<AddWssUsernameToken> {
    private final String[] d;
    private static final String e = ServerAddWssUsernameToken.c(98, ServerAddWssUsernameToken.a("if\u000b\u007fX:}"));

    public ServerAddWssUsernameToken(AddWssUsernameToken addWssUsernameToken) {
        super(addWssUsernameToken);
        this.d = addWssUsernameToken.getVariablesUsed();
    }

    @Override
    protected AssertionStatus doCheckRequest(PolicyEnforcementContext policyEnforcementContext, Message message, String string, AuthenticationContext authenticationContext) throws IOException, PolicyAssertionException {
        String string2;
        try {
            string2 = ((AddWssUsernameToken)this.assertion).isIncludePassword() ? ((AddWssUsernameToken)this.assertion).getPassword() : null;
        }
        catch (IOException iOException) {
            throw ServerAddWssUsernameToken.a(iOException);
        }
        String string3 = string2;
        return ServerAddWssUsernameToken.a(this.addWssEncryptionSupport, policyEnforcementContext, message, string, ((AddWssUsernameToken)this.assertion).getRecipientContext(), ((AddWssUsernameToken)this.assertion).getUsername(), string3, this.d, ((AddWssUsernameToken)this.assertion).isIncludeCreated(), ((AddWssUsernameToken)this.assertion).isEncrypt(), ((AddWssUsernameToken)this.assertion).isIncludeNonce(), ((AddWssUsernameToken)this.assertion).isDigest(), this);
    }

    static AssertionStatus a(AddWssEncryptionSupport addWssEncryptionSupport, PolicyEnforcementContext policyEnforcementContext, Message message, String string, XmlSecurityRecipientContext xmlSecurityRecipientContext, String string2, String string3, String[] stringArray, boolean bl2, boolean bl3, boolean bl4, boolean bl5, ServerAssertion serverAssertion) throws IOException, PolicyAssertionException {
        String string4;
        UsernameTokenImpl usernameTokenImpl;
        UsernameTokenImpl usernameTokenImpl2;
        DecorationRequirements decorationRequirements;
        String string5;
        Object object;
        String string6;
        String string7;
        Audit audit = addWssEncryptionSupport.getAuditor();
        try {
            if (!message.isSoap()) {
                audit.logAndAudit((AuditDetailMessage)AssertionMessages.ADD_WSS_USERNAME_NOT_SOAP, new String[]{string});
                return AssertionStatus.NOT_APPLICABLE;
            }
        }
        catch (AddWssEncryptionSupport.MultipleTokensException multipleTokensException) {
            throw ServerAddWssUsernameToken.a(multipleTokensException);
        }
        catch (SAXException sAXException) {
            throw new CausedIOException((Throwable)sAXException);
        }
        SecurityKnob securityKnob = message.getSecurityKnob();
        DecorationRequirements decorationRequirements2 = securityKnob.getAlternateDecorationRequirements(xmlSecurityRecipientContext);
        try {
            string7 = string2 == null ? null : ExpandVariables.process(string2, policyEnforcementContext.getVariableMap(stringArray, audit), audit);
        }
        catch (SAXException sAXException) {
            throw ServerAddWssUsernameToken.a(sAXException);
        }
        String string8 = string7;
        try {
            String string9 = string6 = string3 == null ? null : ExpandVariables.process(string3, policyEnforcementContext.getVariableMap(stringArray, audit), audit);
        }
        catch (SAXException sAXException) {
            throw ServerAddWssUsernameToken.a(sAXException);
        }
        if (bl2) {
            object = ISO8601Date.format((Date)new Date());
            string5 = ((String)object).replaceAll(e, "Z");
        } else {
            string5 = "";
        }
        if (bl3) {
            try {
                object = addWssEncryptionSupport.buildEncryptionContext(policyEnforcementContext);
                DecorationRequirements decorationRequirements3 = message.getSecurityKnob().getAlternateDecorationRequirements(((AddWssEncryptionContext)object).getRecipientContext());
                addWssEncryptionSupport.applyDecorationRequirements(policyEnforcementContext, decorationRequirements3, (AddWssEncryptionContext)object, serverAssertion);
            }
            catch (AddWssEncryptionSupport.MultipleTokensException multipleTokensException) {
                audit.logAndAudit((AuditDetailMessage)AssertionMessages.ADD_WSS_USERNAME_MORE_THAN_ONE_TOKEN);
                return AssertionStatus.BAD_REQUEST;
            }
            decorationRequirements2.setEncryptUsernameToken(true);
            decorationRequirements2.setSignUsernameToken(true);
            decorationRequirements2.setSignTimestamp(true);
            decorationRequirements2.setUseDerivedKeys(true);
        }
        try {
            UsernameTokenImpl usernameTokenImpl3;
            decorationRequirements = decorationRequirements2;
            usernameTokenImpl2 = usernameTokenImpl3;
            usernameTokenImpl = usernameTokenImpl3;
            string4 = string8 != null ? string8 : null;
        }
        catch (SAXException sAXException) {
            throw ServerAddWssUsernameToken.a(sAXException);
        }
        usernameTokenImpl2(string4, string6 != null ? string6.toCharArray() : null, string5, bl4 ? HexUtils.randomBytes((int)16) : null, bl5);
        decorationRequirements.setUsernameTokenCredentials((UsernameToken)usernameTokenImpl);
        return AssertionStatus.NONE;
    }

    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] ^ 0x3B);
        }
        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 -> 87;
                    case 1 -> 42;
                    case 2 -> 53;
                    case 3 -> 121;
                    case 4 -> 17;
                    case 5 -> 2;
                    default -> 59;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }
}

