/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.common.mime.ContentTypeHeader
 *  com.l7tech.common.mime.NoSuchPartException
 *  com.l7tech.gateway.common.audit.AssertionMessages
 *  com.l7tech.gateway.common.audit.AuditDetailMessage
 *  com.l7tech.message.Message
 *  com.l7tech.message.MimeKnob
 *  com.l7tech.policy.assertion.AssertionStatus
 *  com.l7tech.policy.assertion.PolicyAssertionException
 *  com.l7tech.policy.assertion.SqlAttackAssertion
 *  com.l7tech.util.ExceptionUtils
 *  com.l7tech.util.IOUtils
 *  com.l7tech.util.TextUtils
 */
package com.l7tech.server.policy.assertion;

import com.l7tech.common.mime.ContentTypeHeader;
import com.l7tech.common.mime.NoSuchPartException;
import com.l7tech.gateway.common.audit.AssertionMessages;
import com.l7tech.gateway.common.audit.AuditDetailMessage;
import com.l7tech.message.Message;
import com.l7tech.message.MimeKnob;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.policy.assertion.PolicyAssertionException;
import com.l7tech.policy.assertion.SqlAttackAssertion;
import com.l7tech.server.message.AuthenticationContext;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.policy.assertion.AssertionStatusException;
import com.l7tech.server.policy.assertion.ServerInjectionThreatProtectionAssertion;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.IOUtils;
import com.l7tech.util.TextUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Pattern;

public class ServerSqlAttackAssertion
extends ServerInjectionThreatProtectionAssertion<SqlAttackAssertion> {
    private static final String[] d;

    public ServerSqlAttackAssertion(SqlAttackAssertion sqlAttackAssertion) {
        super(sqlAttackAssertion);
    }

    @Override
    protected AssertionStatus doCheckRequest(PolicyEnforcementContext policyEnforcementContext, Message message, String string, AuthenticationContext authenticationContext) throws IOException, PolicyAssertionException {
        return this.applyThreatProtection(policyEnforcementContext, message, string);
    }

    @Override
    protected AssertionStatus scanBody(Message message, String string) throws IOException {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_SCANNING_BODY_TEXT, string);
        ContentTypeHeader contentTypeHeader = message.getMimeKnob().getOuterContentType();
        String[] stringArray = d;
        String string2 = string + stringArray[0];
        MimeKnob mimeKnob = message.getMimeKnob();
        try {
            byte[] byArray = IOUtils.slurpStream((InputStream)mimeKnob.getEntireMessageBodyAsInputStream());
            String string3 = new String(byArray, contentTypeHeader.getEncoding());
            StringBuilder stringBuilder = new StringBuilder();
            String string4 = this.scan(string3, stringBuilder);
            if (string4 != null) {
                this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_DETECTED, string2, stringBuilder.toString(), string4);
                return this.getBadMessageStatus();
            }
        }
        catch (NoSuchPartException noSuchPartException) {
            this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_CANNOT_PARSE, new String[]{string2, d[2]}, ExceptionUtils.getDebugException((Throwable)noSuchPartException));
            return this.getBadMessageStatus();
        }
        return AssertionStatus.NONE;
    }

    @Override
    protected String scan(String string, StringBuilder stringBuilder) {
        String string2 = null;
        int n2 = -1;
        for (String string3 : ((SqlAttackAssertion)this.assertion).getProtections()) {
            int n3;
            StringBuilder stringBuilder2;
            block8: {
                Pattern pattern = SqlAttackAssertion.getProtectionPattern((String)string3);
                try {
                    if (null == pattern) {
                        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_UNRECOGNIZED_PROTECTION, string3);
                        throw new AssertionStatusException(AssertionStatus.FAILED, d[4]);
                    }
                }
                catch (AssertionStatusException assertionStatusException) {
                    throw ServerSqlAttackAssertion.a(assertionStatusException);
                }
                stringBuilder2 = new StringBuilder();
                n3 = TextUtils.scanAndRecordMatch((String)string, (Pattern)pattern, (StringBuilder)stringBuilder2);
                try {
                    try {
                        if (n3 == -1) continue;
                        if (n2 == -1) break block8;
                    }
                    catch (AssertionStatusException assertionStatusException) {
                        throw ServerSqlAttackAssertion.a(assertionStatusException);
                    }
                    if (n3 >= n2) continue;
                }
                catch (AssertionStatusException assertionStatusException) {
                    throw ServerSqlAttackAssertion.a(assertionStatusException);
                }
            }
            n2 = n3;
            stringBuilder.setLength(0);
            stringBuilder.append((CharSequence)stringBuilder2);
            string2 = string3;
        }
        return string2;
    }

    @Override
    protected void logAndAuditRequestAlreadyRouted() {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_ALREADY_ROUTED);
    }

    @Override
    protected void logAndAuditResponseNotRouted() {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_SKIP_RESPONSE_NOT_ROUTED);
    }

    @Override
    protected void logAndAuditMessageNotHttp() {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_NOT_HTTP);
    }

    @Override
    protected void logAndAuditScanningUrlPath() {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_SCANNING_URL_PATH);
    }

    @Override
    protected void logAndAuditAttackDetectedInUrlPath(StringBuilder stringBuilder, String string, String string2) {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_DETECTED_PATH, d[1], string, stringBuilder.toString(), string2);
    }

    @Override
    protected void logAndAuditScanningUrlQueryString() {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_SCANNING_URL_QUERY_STRING);
    }

    @Override
    protected void logAndAuditAttackDetectedInQueryParameter(StringBuilder stringBuilder, String string, String string2) {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_DETECTED_PARAM, d[3], string, stringBuilder.toString(), string2);
    }

    @Override
    protected void logAndAuditAttackRejected() {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_REJECTED, ((SqlAttackAssertion)this.assertion).getTargetName());
    }

    @Override
    protected void logAndAuditCannotParse(String string, String string2) {
        this.logAndAudit((AuditDetailMessage)AssertionMessages.SQLATTACK_CANNOT_PARSE, string, string2);
    }

    private static AssertionStatusException a(AssertionStatusException assertionStatusException) {
        return assertionStatusException;
    }

    /*
     * Unable to fully structure code
     */
    static {
        block10: {
            block9: {
                var5 = new String[5];
                var3_1 = 0;
                var2_2 = "vsV\u007f\u0005\u0004&3>Qc\u0012\u001c\u000b\u0004{By\u0013\u00165vKa@\u0004\"{Kx";
                var4_3 = "vsV\u007f\u0005\u0004&3>Qc\u0012\u001c\u000b\u0004{By\u0013\u00165vKa@\u0004\"{Kx".length();
                var1_4 = 13;
                var0_5 = -1;
lbl7:
                // 2 sources

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

                while (true) {
                    var5[var3_1++] = ServerSqlAttackAssertion.d(v0, ServerSqlAttackAssertion.a(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    var2_2 = "j\u0015,\u0017}x[\u0018%\u000f. m\u001e/\u0007{dHV\u0019'\u0007|+_J\u001f)\u0007{\u007fFW\u001e}\u0012y\u007f[]\u00023L";
                    var4_3 = "j\u0015,\u0017}x[\u0018%\u000f. m\u001e/\u0007{dHV\u0019'\u0007|+_J\u001f)\u0007{\u007fFW\u001e}\u0012y\u007f[]\u00023L".length();
                    var1_4 = 11;
                    var0_5 = -1;
lbl22:
                    // 2 sources

                    while (true) {
                        v0 = 65;
                        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++] = ServerSqlAttackAssertion.d(v0, ServerSqlAttackAssertion.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;
            }
        }
        ServerSqlAttackAssertion.d = var5;
    }

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

    /*
     * Handled impossible loop by duplicating code
     * Enabled aggressive block sorting
     */
    private static String d(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 -> 121;
                    case 1 -> 49;
                    case 2 -> 28;
                    case 3 -> 35;
                    case 4 -> 89;
                    case 5 -> 74;
                    default -> 110;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }
}

