package com.l7tech.server.policy.assertion.xmlsec;

import com.l7tech.gateway.common.audit.AssertionMessages;
import com.l7tech.gateway.common.audit.Audit;
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.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.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;

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

   @Override
   protected AssertionStatus doCheckRequest(PolicyEnforcementContext var1, Message var2, String var3, AuthenticationContext var4) throws IOException, PolicyAssertionException {
      String var10000;
      label16: {
         try {
            if (this.assertion.isIncludePassword()) {
               var10000 = this.assertion.getPassword();
               break label16;
            }
         } catch (IOException var6) {
            throw a(var6);
         }

         var10000 = null;
      }

      String var5 = var10000;
      return a(
         this.addWssEncryptionSupport,
         var1,
         var2,
         var3,
         this.assertion.getRecipientContext(),
         this.assertion.getUsername(),
         var5,
         this.d,
         this.assertion.isIncludeCreated(),
         this.assertion.isEncrypt(),
         this.assertion.isIncludeNonce(),
         this.assertion.isDigest(),
         this
      );
   }

   static AssertionStatus a(
      AddWssEncryptionSupport var0,
      PolicyEnforcementContext var1,
      Message var2,
      String var3,
      XmlSecurityRecipientContext var4,
      String var5,
      String var6,
      String[] var7,
      boolean var8,
      boolean var9,
      boolean var10,
      boolean var11,
      ServerAssertion var12
   ) throws IOException, PolicyAssertionException {
      Audit var13 = var0.getAuditor();

      try {
         try {
            if (!var2.isSoap()) {
               var13.logAndAudit(AssertionMessages.ADD_WSS_USERNAME_NOT_SOAP, new String[]{var3});
               return AssertionStatus.NOT_APPLICABLE;
            }
         } catch (SAXException var25) {
            throw new CausedIOException(var25);
         }
      } catch (AddWssEncryptionSupport.MultipleTokensException var26) {
         throw a(var26);
      }

      SecurityKnob var27 = var2.getSecurityKnob();
      DecorationRequirements var15 = var27.getAlternateDecorationRequirements(var4);

      String var10000;
      label78: {
         try {
            if (var5 == null) {
               var10000 = null;
               break label78;
            }
         } catch (SAXException var24) {
            throw a(var24);
         }

         var10000 = ExpandVariables.process(var5, var1.getVariableMap(var7, var13), var13);
      }

      String var16 = var10000;

      label70: {
         try {
            if (var6 == null) {
               var10000 = null;
               break label70;
            }
         } catch (SAXException var23) {
            throw a(var23);
         }

         var10000 = ExpandVariables.process(var6, var1.getVariableMap(var7, var13), var13);
      }

      String var17 = var10000;
      String var18;
      if (var8) {
         String var19 = ISO8601Date.format(new Date());
         var18 = var19.replaceAll(e, "Z");
      } else {
         var18 = "";
      }

      if (var9) {
         try {
            AddWssEncryptionContext var28 = var0.buildEncryptionContext(var1);
            DecorationRequirements var20 = var2.getSecurityKnob().getAlternateDecorationRequirements(var28.getRecipientContext());
            var0.applyDecorationRequirements(var1, var20, var28, var12);
         } catch (AddWssEncryptionSupport.MultipleTokensException var21) {
            var13.logAndAudit(AssertionMessages.ADD_WSS_USERNAME_MORE_THAN_ONE_TOKEN);
            return AssertionStatus.BAD_REQUEST;
         }

         var15.setEncryptUsernameToken(true);
         var15.setSignUsernameToken(true);
         var15.setSignTimestamp(true);
         var15.setUseDerivedKeys(true);
      }

      UsernameTokenImpl var10001;
      UsernameTokenImpl var10002;
      String var10003;
      label62: {
         try {
            var30 = var15;
            var10001 = new UsernameTokenImpl;
            var10002 = var10001;
            if (var16 != null) {
               var10003 = var16;
               break label62;
            }
         } catch (SAXException var22) {
            throw a(var22);
         }

         var10003 = null;
      }

      var10002./* $VF: Unable to resugar constructor */<init>(
         var10003, var17 != null ? var17.toCharArray() : null, var18, var10 ? HexUtils.randomBytes(16) : null, var11
      );
      var30.setUsernameTokenCredentials(var10001);
      return AssertionStatus.NONE;
   }

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

   static {
      String var10002 = c(98, a("if\u000b\u007fX:}"));
      byte var10001 = -1;
      e = var10002;
   }

   private static char[] a(String var0) {
      char[] var10000 = var0.toCharArray();
      if (var10000.length < 2) {
         var10000[0] = (char)(var10000[0] ^ 59);
      }

      return var10000;
   }

   private static String c(int var0, char[] var1) {
      int var10003 = var1.length;
      int var10002 = var0;
      char[] var10001 = var1;
      int var10000 = var10003;

      for (int var2 = 0; var10000 > var2; var2++) {
         var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
            case 0 -> 87;
            case 1 -> 42;
            case 2 -> 53;
            case 3 -> 121;
            case 4 -> 17;
            case 5 -> 2;
            default -> 59;
         });
      }

      return new String(var10001).intern();
   }
}
