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

import com.l7tech.gateway.common.audit.AssertionMessages;
import com.l7tech.message.Message;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.policy.assertion.PolicyAssertionException;
import com.l7tech.policy.assertion.credential.LoginCredentials;
import com.l7tech.policy.assertion.xmlsec.CreateSecurityContextToken;
import com.l7tech.security.wstrust.WsTrustConfig;
import com.l7tech.server.identity.AuthenticationResult;
import com.l7tech.server.message.AuthenticationContext;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.policy.assertion.AbstractMessageTargetableServerAssertion;
import com.l7tech.server.secureconversation.InboundSecureConversationContextManager;
import com.l7tech.server.secureconversation.SecureConversationSession;
import com.l7tech.server.secureconversation.SessionCreationException;
import com.l7tech.server.util.RstSoapMessageProcessor;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.HexUtils;
import com.l7tech.util.SoapConstants;
import com.l7tech.xml.soap.SoapUtil;
import java.io.IOException;
import java.util.Map;
import org.springframework.beans.factory.BeanFactory;

public class ServerCreateSecurityContextToken extends AbstractMessageTargetableServerAssertion<CreateSecurityContextToken> {
   private final InboundSecureConversationContextManager d;
   private static final String[] e;

   public ServerCreateSecurityContextToken(CreateSecurityContextToken var1, BeanFactory var2) {
      super(var1);
      this.d = (InboundSecureConversationContextManager)var2.getBean(e[16], InboundSecureConversationContextManager.class);
   }

   @Override
   protected AssertionStatus doCheckRequest(PolicyEnforcementContext var1, Message var2, String var3, AuthenticationContext var4) throws IOException, PolicyAssertionException {
      Map var5 = RstSoapMessageProcessor.getRstParameters(var2, true);

      try {
         if (var5.containsKey(e[22])) {
            this.logAndAudit(AssertionMessages.STS_INVALID_RST_REQUEST, (String)var5.get(e[3]));
            return AssertionStatus.BAD_REQUEST;
         }
      } catch (NumberFormatException var24) {
         throw a(var24);
      }

      AuthenticationResult var6 = var4.getLastAuthenticationResult();

      try {
         if (var6 == null) {
            this.logAndAudit(AssertionMessages.STS_AUTHENTICATION_FAILURE, e[13]);
            return AssertionStatus.AUTH_FAILED;
         }
      } catch (NumberFormatException var23) {
         throw a(var23);
      }

      LoginCredentials var7 = null;

      for (LoginCredentials var9 : var4.getCredentials()) {
         if (var6.matchesSecurityToken(var9.getSecurityToken())) {
            var7 = var9;
            break;
         }
      }

      try {
         if (var7 == null) {
            this.logAndAudit(AssertionMessages.STS_AUTHENTICATION_FAILURE, e[0]);
            return AssertionStatus.AUTH_FAILED;
         }
      } catch (NumberFormatException var22) {
         throw a(var22);
      }

      String[] var15 = e;
      String var25 = (String)var5.get(var15[11]);

      label100: {
         try {
            if (var25 != null && !var25.trim().isEmpty()) {
               break label100;
            }
         } catch (NumberFormatException var21) {
            throw a(var21);
         }

         var15 = e;
         String var26 = (String)var5.get(var15[23]);
         var25 = this.a(var26);
      }

      var15 = e;
      String var27 = (String)var5.get(var15[15]);

      label91: {
         try {
            if (var27 != null && !var27.trim().isEmpty()) {
               break label91;
            }
         } catch (NumberFormatException var20) {
            throw a(var20);
         }

         var27 = SoapConstants.WSU_NAMESPACE;
      }

      byte[] var10 = null;

      label133: {
         try {
            if (!Boolean.parseBoolean((String)var5.get(e[6])) || !Boolean.parseBoolean((String)var5.get(e[27]))) {
               break label133;
            }
         } catch (NumberFormatException var19) {
            throw a(var19);
         }

         var15 = e;
         String var11 = (String)var5.get(var15[4]);

         try {
            if (var11 == null || !var11.endsWith(var15[5])) {
               break label133;
            }
         } catch (NumberFormatException var18) {
            throw a(var18);
         }

         var15 = e;
         String var12 = (String)var5.get(var15[14]);
         var10 = HexUtils.decodeBase64(var12);
      }

      int var28 = this.assertion.getKeySize();
      var15 = e;
      if (Boolean.parseBoolean((String)var5.get(var15[24]))) {
         String var29 = (String)var5.get(var15[26]);

         try {
            int var13 = Integer.parseInt(var29);
            if (var13 > var28) {
               var28 = var13;
            }
         } catch (NumberFormatException var17) {
            var15 = e;
            this.logger.info(var15[25] + var29 + var15[20]);
         }
      }

      SecureConversationSession var30;
      try {
         var30 = this.d.createContextForUser(var6.getUser(), RstSoapMessageProcessor.getWsscNamespace(var5), this.a(), var10, var28);
      } catch (SessionCreationException var16) {
         this.logAndAudit(AssertionMessages.STS_TOKEN_ISSUE_ERROR, new String[]{ExceptionUtils.getMessage(var16)}, ExceptionUtils.getDebugException(var16));
         return AssertionStatus.FALSIFIED;
      }

      String var31 = this.a(var25, var27, var30.getIdentifier());
      String var14 = this.assertion.getVariablePrefix() + "." + CreateSecurityContextToken.VARIABLE_ISSUED_SCT;
      var1.setVariable(var14, var31);
      return AssertionStatus.NONE;
   }

   private String a(String var1) {
      return WsTrustConfig.deriveWsSecureConversationNamespace(var1);
   }

   private String a(String var1, String var2, String var3) {
      StringBuilder var10000 = new StringBuilder();
      String[] var5 = e;
      StringBuilder var4 = var10000.append(var5[18])
         .append(var5[9])
         .append(SoapUtil.generateUniqueId(var5[12], 1))
         .append(var5[19])
         .append(var5[17])
         .append(var1)
         .append(var5[7])
         .append(var5[21])
         .append(var2)
         .append(var5[8])
         .append(var5[2])
         .append(var3)
         .append(var5[1])
         .append(var5[10]);
      return var4.toString();
   }

   private long a() {
      try {
         if (this.assertion.isUseSystemDefaultSessionDuration()) {
            return this.d.getDefaultSessionDuration();
         }
      } catch (NumberFormatException var1) {
         throw a(var1);
      }

      return this.assertion.getLifetime();
   }

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

   static {
      String[] var5 = new String[28];
      int var3 = 0;
      String var2 = "Q&n.3 \u000e{5g9v \u0015ftm%# \u001e22d8v:\u0012wtj?\"&\u001f| b)7:\u001fvt~93<T\u0012.{|95t3v1e>?(\u0013w&5@\u0011\u001bh|95t3v1e>?(\u0013w&5\rb5y9? \u001dM1y89<\u0012p=e+$7%a1h83:%f-{/\u0005\\;e)3\u0013z5x\u00153 \u000e`;{3\t+\u0016w9n$\"\u00020t\u00030j\u0001\be'~p\u001f*G0\u001b.{|95t)w7~8?:\u0003Q;e>36\u000eF;`/8p e'T93-\u000f`1T)9 \fw&x+\"'\u0015|\u000be+;+\tb5h/\u0014A1h?$'\u000ek\u0017d$\"+\u0002f\u0000d!3 CF<nj\"/\bu1\u007fj;+\ta5l/v*\u0015w'+$9:Zq;e>7'\u001425e3v/\u000ff<n$\"'\u0019s b%8n\u0013|2d8;/\u000e{;ed\rp=e+$7%a1h83:\u0016e'T?\"'\u0016{ b/%\u0011\u0014s9n9&/\u0019w'{:i%# \u001eA1h?$+9}:}/$=\u001bf=d$\u0015!\u0014f1s>\u001b/\u0014s3n8\u000bj9g$%t\ra76h\u001a.#x)l\u001d\u001fq!y#\"79}:\u007f/.:.}?n$v\u00020t\u00025z\u000bj9g$%t\ra!6h\rb5y9? \u001dM1y89<\u0012e'T>$;\tf\u000be+;+\tb5h/\fz5x\u0015=+\u0003M'b03\u001b[3e%$'\u0014utb$ /\u0016{0+!37Za=q/vi";
      int var4 = "Q&n.3 \u000e{5g9v \u0015ftm%# \u001e22d8v:\u0012wtj?\"&\u001f| b)7:\u001fvt~93<T\u0012.{|95t3v1e>?(\u0013w&5@\u0011\u001bh|95t3v1e>?(\u0013w&5\rb5y9? \u001dM1y89<\u0012p=e+$7%a1h83:%f-{/\u0005\\;e)3\u0013z5x\u00153 \u000e`;{3\t+\u0016w9n$\"\u00020t\u00030j\u0001\be'~p\u001f*G0\u001b.{|95t)w7~8?:\u0003Q;e>36\u000eF;`/8p e'T93-\u000f`1T)9 \fw&x+\"'\u0015|\u000be+;+\tb5h/\u0014A1h?$'\u000ek\u0017d$\"+\u0002f\u0000d!3 CF<nj\"/\bu1\u007fj;+\ta5l/v*\u0015w'+$9:Zq;e>7'\u001425e3v/\u000ff<n$\"'\u0019s b%8n\u0013|2d8;/\u000e{;ed\rp=e+$7%a1h83:\u0016e'T?\"'\u0016{ b/%\u0011\u0014s9n9&/\u0019w'{:i%# \u001eA1h?$+9}:}/$=\u001bf=d$\u0015!\u0014f1s>\u001b/\u0014s3n8\u000bj9g$%t\ra76h\u001a.#x)l\u001d\u001fq!y#\"79}:\u007f/.:.}?n$v\u00020t\u00025z\u000bj9g$%t\ra!6h\rb5y9? \u001dM1y89<\u0012e'T>$;\tf\u000be+;+\tb5h/\fz5x\u0015=+\u0003M'b03\u001b[3e%$'\u0014utb$ /\u0016{0+!37Za=q/vi"
         .length();
      char var1 = '1';
      int var7 = -1;

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

         while (true) {
            String var8 = c(var10000, b(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     e = var5;
                     return;
                  }

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

                  var2 = "\u0001I\nm]_x\u000f\u0019\u0002M\u0000mL_l\u000b^\nm]Sa\u0018I\u0007mKZg\u0007I\u001dF";
                  var4 = "\u0001I\nm]_x\u000f\u0019\u0002M\u0000mL_l\u000b^\nm]Sa\u0018I\u0007mKZg\u0007I\u001dF".length();
                  var1 = '\b';
                  var7 = -1;
            }

            var10000 = 114;
            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] ^ 112);
      }

      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 -> 24;
            case 1 -> 94;
            case 2 -> 1;
            case 3 -> 64;
            case 4 -> 92;
            case 5 -> 68;
            default -> 112;
         });
      }

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