package com.l7tech.policy.assertion.xmlsec;

import com.l7tech.objectmodel.EntityHeader;
import com.l7tech.objectmodel.EntityType;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.migration.Migration;
import com.l7tech.objectmodel.migration.MigrationMappingSelection;
import com.l7tech.objectmodel.migration.PropertyResolver;
import com.l7tech.policy.assertion.AssertionMetadata;
import com.l7tech.policy.assertion.AssertionNodeNameFactory;
import com.l7tech.policy.assertion.DefaultAssertionMetadata;
import com.l7tech.policy.assertion.IdentityTarget;
import com.l7tech.policy.assertion.MessageTargetableAssertion;
import com.l7tech.policy.assertion.PrivateKeyable;
import com.l7tech.policy.assertion.PrivateKeyableSupport;
import com.l7tech.policy.assertion.RequestIdentityTargetable;
import com.l7tech.policy.assertion.TargetMessageType;
import com.l7tech.policy.assertion.UsesEntities;
import com.l7tech.policy.assertion.UsesVariables;
import com.l7tech.policy.assertion.annotation.RequiresSOAP;
import com.l7tech.policy.wsp.WspSensitive;
import com.l7tech.search.Dependency;
import com.l7tech.security.token.SecurityTokenType;
import com.l7tech.security.xml.KeyReference;
import com.l7tech.util.GoidUpgradeMapper;

@RequiresSOAP
public class AddWssSecurityToken
   extends MessageTargetableAssertion
   implements WssDecorationConfig,
   PrivateKeyable,
   SecurityHeaderAddressable,
   RequestIdentityTargetable,
   UsesVariables,
   UsesEntities {
   public static final SecurityTokenType[] SUPPORTED_TOKEN_TYPES;
   private String keyReference = KeyReference.BST.getName();
   private boolean protectTokens = true;
   private SecurityTokenType tokenType = SecurityTokenType.WSS_USERNAME;
   private XmlSecurityRecipientContext recipientContext = XmlSecurityRecipientContext.getLocalRecipient();
   private IdentityTarget identityTarget;
   private boolean includePassword;
   private final PrivateKeyableSupport privatekeyableSupport = new PrivateKeyableSupport();
   private String digestAlgorithmName;
   private boolean useLastGatheredCredentials = true;
   private boolean includeNonce = true;
   private boolean includeCreated = true;
   private boolean digest = false;
   private boolean encrypt = false;
   private String username;
   private String password;
   private String wsscSessionVariable;
   private boolean omitSecurityContextToken = false;
   private String samlAssertionVariable;
   static final String baseName;
   static final String baseNameSigned;
   static final AssertionNodeNameFactory policyNameFactory;
   static final long serialVersionUID = 1186357825160287539L;
   private static final String[] b;

   public AddWssSecurityToken() {
      super(TargetMessageType.RESPONSE, true);
   }

   public SecurityTokenType getTokenType() {
      return this.tokenType;
   }

   public void setTokenType(SecurityTokenType var1) {
      this.tokenType = var1;
   }

   @Override
   public XmlSecurityRecipientContext getRecipientContext() {
      return this.recipientContext;
   }

   @Override
   public void setRecipientContext(XmlSecurityRecipientContext var1) {
      if (var1 == null) {
         var1 = XmlSecurityRecipientContext.getLocalRecipient();
      }

      this.recipientContext = var1;
   }

   @Override
   public String getKeyReference() {
      return this.keyReference;
   }

   @Override
   public void setKeyReference(String var1) {
      this.keyReference = var1;
   }

   public boolean isIncludePassword() {
      return this.includePassword;
   }

   public void setIncludePassword(boolean var1) {
      this.includePassword = var1;
   }

   @Override
   public boolean isProtectTokens() {
      return this.protectTokens;
   }

   @Override
   public void setProtectTokens(boolean var1) {
      this.protectTokens = var1;
   }

   @Override
   public boolean isUsingProtectTokens() {
      return true;
   }

   @Override
   public String getDigestAlgorithmName() {
      return this.digestAlgorithmName;
   }

   @Override
   public void setDigestAlgorithmName(String var1) {
      this.digestAlgorithmName = var1;
   }

   @Override
   public String getKeyAlias() {
      return this.privatekeyableSupport.getKeyAlias();
   }

   @Override
   public void setKeyAlias(String var1) {
      this.privatekeyableSupport.setKeyAlias(var1);
   }

   @Migration(mapName = MigrationMappingSelection.REQUIRED, export = false, resolver = PropertyResolver.Type.SSGKEY)
   @Override
   public Goid getNonDefaultKeystoreId() {
      return this.privatekeyableSupport.getNonDefaultKeystoreId();
   }

   @Override
   public void setNonDefaultKeystoreId(Goid var1) {
      this.privatekeyableSupport.setNonDefaultKeystoreId(var1);
   }

   @Deprecated
   public void setNonDefaultKeystoreId(long var1) {
      this.privatekeyableSupport.setNonDefaultKeystoreId(GoidUpgradeMapper.mapOid(EntityType.SSG_KEYSTORE, var1));
   }

   @Override
   public boolean isUsesDefaultKeyStore() {
      return this.privatekeyableSupport.isUsesDefaultKeyStore();
   }

   @Override
   public void setUsesDefaultKeyStore(boolean var1) {
      this.privatekeyableSupport.setUsesDefaultKeyStore(var1);
   }

   @Override
   public IdentityTarget getIdentityTarget() {
      return this.identityTarget;
   }

   @Override
   public void setIdentityTarget(IdentityTarget var1) {
      this.identityTarget = var1;
   }

   public boolean isIncludeNonce() {
      return this.includeNonce;
   }

   public void setIncludeNonce(boolean var1) {
      this.includeNonce = var1;
   }

   public boolean isIncludeCreated() {
      return this.includeCreated;
   }

   public void setIncludeCreated(boolean var1) {
      this.includeCreated = var1;
   }

   public boolean isDigest() {
      return this.digest;
   }

   public void setDigest(boolean var1) {
      this.digest = var1;
   }

   public boolean isEncrypt() {
      return this.encrypt;
   }

   public void setEncrypt(boolean var1) {
      this.encrypt = var1;
   }

   public String getUsername() {
      return this.username;
   }

   public void setUsername(String var1) {
      this.username = var1;
   }

   @WspSensitive
   @Dependency(methodReturnType = Dependency.MethodReturnType.VARIABLE, type = Dependency.DependencyType.SECURE_PASSWORD)
   public String getPassword() {
      return this.password;
   }

   public void setPassword(String var1) {
      this.password = var1;
   }

   public boolean isUseLastGatheredCredentials() {
      return this.useLastGatheredCredentials;
   }

   public void setUseLastGatheredCredentials(boolean var1) {
      this.useLastGatheredCredentials = var1;
   }

   public String getWsscSessionVariable() {
      return this.wsscSessionVariable;
   }

   public void setWsscSessionVariable(String var1) {
      this.wsscSessionVariable = var1;
   }

   public boolean isOmitSecurityContextToken() {
      return this.omitSecurityContextToken;
   }

   public void setOmitSecurityContextToken(boolean var1) {
      this.omitSecurityContextToken = var1;
   }

   public String getSamlAssertionVariable() {
      return this.samlAssertionVariable;
   }

   public void setSamlAssertionVariable(String var1) {
      this.samlAssertionVariable = var1;
   }

   @Migration(mapName = MigrationMappingSelection.REQUIRED, export = false, resolver = PropertyResolver.Type.USERGROUP)
   @Override
   public EntityHeader[] getEntitiesUsed() {
      return this.identityTarget != null ? this.identityTarget.getEntitiesUsed() : new EntityHeader[0];
   }

   @Override
   public void replaceEntity(EntityHeader var1, EntityHeader var2) {
      if (this.identityTarget != null) {
         this.identityTarget.replaceEntity(var1, var2);
      }
   }

   @Override
   protected MessageTargetableAssertion.VariablesUsed doGetVariablesUsed() {
      return super.doGetVariablesUsed().withExpressions(this.username, this.password).withVariables(this.wsscSessionVariable, this.samlAssertionVariable);
   }

   @Override
   public AssertionMetadata meta() {
      DefaultAssertionMetadata var1 = super.defaultMeta();
      String[] var2 = b;
      var1.put(var2[2], var2[14]);
      var1.put(var2[13], var2[5]);
      var1.put(var2[15], new String[]{var2[0]});
      var1.put(var2[12], 60000);
      var1.put(var2[18], var2[19]);
      var1.put(var2[6], new String[]{var2[9]});
      var1.put(var2[21], policyNameFactory);
      var1.put(var2[16], var2[20]);
      var1.put(var2[8], var2[17]);
      var1.put(var2[11], var2[1]);
      var1.put(var2[7], var2[3]);
      return var1;
   }

   static {
      String[] var5 = new String[22];
      int var3 = 0;
      String var2 = "~\u0003Ft\u0017Q{t\u0007^^(e\u0001G\b\u001e\u0005zc\rB\b\u0011]`u\u0001FB]@ku\u0001_U\u0011W})/HH\u0007F?0@MN\u0014\u000fv\u000fFB\u0006FkH\u0001NB<Scc;e\u0001G\t\u001e\u0005zc\rB\t\u0002]bo\rS\t\u0004Sbo\nKS\u001d@ Q\u001dYc\u0017Qat\u000f^N\u001d\\Ou\u001dOU\u0006[ah8KK\u001bVor\u0001X\u0019G\nN\u0007![ih\u000bN\u0007!Wms\u001cCS\u000b\u0012Zi\u0005OIýG\nN\u0007\u0013\u0012YUCyB\u0011G|o\u001aS\u0007\u0001Wms\u001cCS\u000b\u0012zi\u0005OIRFa&\u001aBBR_ku\u001dK@\u0017\u001c.&:BN\u0001\u0012mg\u0000\nE\u0017\u0012o&;YB\u0000\\ok\u000b~H\u0019W`*NK\u0007!sCJNkT\u0001W|r\u0007EI^\u0012ohNoI\u0011@wv\u001aOC9Ww*NEURS.Q=\u0007t\u0017Q{t\u000biH\u001cDkt\u001dKS\u001b]`&\u001dOT\u0001[ah@\u0016W]\fZn\u000b\nS\u001dYkhN]N\u001e^.d\u000b\nF\u0016VkbN^HRFfcN^F\u0000UkrNGB\u0001Aoa\u000b\nP\u001aW`&\u001aBBRAke\u001bXN\u0006K.t\u000b[R\u001b@kk\u000bDS\u0001\u0012ot\u000b\nI\u0017Jz&\u000fZW\u001e[kbN^HR[z(\u000ev\u000fFB\u0006Fk@\u0001FC\u0017@}\u0018v\u0001FN\u0011KXg\u0002CC\u0013Fat-FF\u0001A`g\u0003O\u0014v\u001cEW\u0017@zo\u000bYf\u0011Fgi\u0000dF\u001fW\u000b~\u0003Ft\u0017Q{t\u0007^^\u0012G\nN\u0007!Wms\u001cCS\u000b\u0012Zi\u0005OI\u0014v\u001cEW\u0017@zo\u000bYf\u0011Fgi\u0000cD\u001d\\\u0017v\u000fFB\u0006FkH\u0001NB!]|r>XN\u001d@gr\u0017\u000bb\u000bYD\u0000[~r\u0007EI\u0012G\nN\u0007!Wms\u001cCS\u000b\u0012Zi\u0005OI\u000ev\u000fFB\u0006Fk@\u0001FC\u0017@}\u0019v\u001cEW\u0017@zo\u000bYb\u0016[zi\u001ciK\u0013A}h\u000fGB\u0019U\u000bIR\u0000[z\u007fN~H\u0019W`&>XH\u0002W|r\u0007OT\u000fv\u000fFB\u0006FkH\u0001NB;Qah.e\u0001G\b\u001e\u0005zc\rB\b\u0011]`u\u0001FB]@ku\u0001_U\u0011W})\u0016GK\u0017\\mt\u0017ZS\u001b]`(\tCA";
      int var4 = "~\u0003Ft\u0017Q{t\u0007^^(e\u0001G\b\u001e\u0005zc\rB\b\u0011]`u\u0001FB]@ku\u0001_U\u0011W})/HH\u0007F?0@MN\u0014\u000fv\u000fFB\u0006FkH\u0001NB<Scc;e\u0001G\t\u001e\u0005zc\rB\t\u0002]bo\rS\t\u0004Sbo\nKS\u001d@ Q\u001dYc\u0017Qat\u000f^N\u001d\\Ou\u001dOU\u0006[ah8KK\u001bVor\u0001X\u0019G\nN\u0007![ih\u000bN\u0007!Wms\u001cCS\u000b\u0012Zi\u0005OIýG\nN\u0007\u0013\u0012YUCyB\u0011G|o\u001aS\u0007\u0001Wms\u001cCS\u000b\u0012zi\u0005OIRFa&\u001aBBR_ku\u001dK@\u0017\u001c.&:BN\u0001\u0012mg\u0000\nE\u0017\u0012o&;YB\u0000\\ok\u000b~H\u0019W`*NK\u0007!sCJNkT\u0001W|r\u0007EI^\u0012ohNoI\u0011@wv\u001aOC9Ww*NEURS.Q=\u0007t\u0017Q{t\u000biH\u001cDkt\u001dKS\u001b]`&\u001dOT\u0001[ah@\u0016W]\fZn\u000b\nS\u001dYkhN]N\u001e^.d\u000b\nF\u0016VkbN^HRFfcN^F\u0000UkrNGB\u0001Aoa\u000b\nP\u001aW`&\u001aBBRAke\u001bXN\u0006K.t\u000b[R\u001b@kk\u000bDS\u0001\u0012ot\u000b\nI\u0017Jz&\u000fZW\u001e[kbN^HR[z(\u000ev\u000fFB\u0006Fk@\u0001FC\u0017@}\u0018v\u0001FN\u0011KXg\u0002CC\u0013Fat-FF\u0001A`g\u0003O\u0014v\u001cEW\u0017@zo\u000bYf\u0011Fgi\u0000dF\u001fW\u000b~\u0003Ft\u0017Q{t\u0007^^\u0012G\nN\u0007!Wms\u001cCS\u000b\u0012Zi\u0005OI\u0014v\u001cEW\u0017@zo\u000bYf\u0011Fgi\u0000cD\u001d\\\u0017v\u000fFB\u0006FkH\u0001NB!]|r>XN\u001d@gr\u0017\u000bb\u000bYD\u0000[~r\u0007EI\u0012G\nN\u0007!Wms\u001cCS\u000b\u0012Zi\u0005OI\u000ev\u000fFB\u0006Fk@\u0001FC\u0017@}\u0019v\u001cEW\u0017@zo\u000bYb\u0016[zi\u001ciK\u0013A}h\u000fGB\u0019U\u000bIR\u0000[z\u007fN~H\u0019W`&>XH\u0002W|r\u0007OT\u000fv\u000fFB\u0006FkH\u0001NB;Qah.e\u0001G\b\u001e\u0005zc\rB\b\u0011]`u\u0001FB]@ku\u0001_U\u0011W})\u0016GK\u0017\\mt\u0017ZS\u001b]`(\tCA"
         .length();
      char var1 = 11;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 59;
         String var10001 = var2.substring(++var7, var7 + var1);
         byte var10002 = -1;

         while (true) {
            String var8 = b(var10000, b(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     b = var5;
                     String[] var9 = b;
                     baseName = b[10];
                     baseNameSigned = var9[4];
                     SUPPORTED_TOKEN_TYPES = new SecurityTokenType[]{
                        SecurityTokenType.WSS_USERNAME, SecurityTokenType.WSSC_CONTEXT, SecurityTokenType.SAML_ASSERTION, SecurityTokenType.WSS_ENCRYPTEDKEY
                     };
                     policyNameFactory = new a();
                     return;
                  }

                  var1 = var2.charAt(var7);
                  break;
               default:
                  var5[var3++] = var8;
                  if ((var7 += var1) < var4) {
                     var1 = var2.charAt(var7);
                     continue label24;
                  }

                  var2 = "\u0019};uby\u0006\u001fq>um!\u001c\t}:> >\u0013\u0014w:( \u000f\u0016\u001eE%(]+\u0011\u000f`?/w\u001a\u001d\u0011w8\u001fg/\u001e\u0015u\u0015\n}:2m7<\u0015v3\u0015o#\u0017<s5/a<\u000b";
                  var4 = "\u0019};uby\u0006\u001fq>um!\u001c\t}:> >\u0013\u0014w:( \u000f\u0016\u001eE%(]+\u0011\u000f`?/w\u001a\u001d\u0011w8\u001fg/\u001e\u0015u\u0015\n}:2m7<\u0015v3\u0015o#\u0017<s5/a<\u000b"
                     .length();
                  var1 = '3';
                  var7 = -1;
            }

            var10000 = 71;
            var10001 = var2.substring(++var7, var7 + var1);
            var10002 = 0;
         }
      }
   }

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

      return var10000;
   }

   private static String b(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 -> 61;
            case 1 -> 85;
            case 2 -> 17;
            case 3 -> 28;
            case 4 -> 73;
            case 5 -> 9;
            default -> 53;
         });
      }

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