package com.l7tech.external.assertions.oauth2.introspection.server;

import com.l7tech.common.http.GenericHttpClient;
import com.l7tech.common.http.GenericHttpException;
import com.l7tech.common.http.GenericHttpRequest;
import com.l7tech.common.http.GenericHttpRequestParams;
import com.l7tech.common.http.GenericHttpResponse;
import com.l7tech.common.http.HttpMethod;
import com.l7tech.common.http.GenericHttpRequestParams.HttpVersion;
import com.l7tech.common.io.ByteLimitInputStream;
import com.l7tech.common.mime.ContentTypeHeader;
import com.l7tech.external.assertions.oauth2.introspection.config.OAuthIntrospectionResult;
import com.l7tech.external.assertions.oauth2.introspection.config.OAuthTokenIssuerConfig;
import com.l7tech.external.assertions.oauth2.introspection.util.Util;
import com.l7tech.gateway.common.audit.Audit;
import com.l7tech.objectmodel.FindException;
import com.l7tech.server.policy.variable.ServerVariables;
import com.l7tech.server.transport.http.SslClientTrustManager;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLContext;

public class OAuthOpaqueTokenIntrospector extends OAuthTokenIntrospector {
   private static final Logger c;
   protected static final int MAX_RESP_SIZE = 65536;
   protected final GenericHttpClient httpClient;
   protected final SslClientTrustManager sslClientTrustManager;
   private final AtomicReference<SSLContext> d;
   private final boolean e;
   private final Audit f;
   private static final String[] m;

   public OAuthOpaqueTokenIntrospector(OAuthTokenIssuerConfig param1, GenericHttpClient param2, SslClientTrustManager param3) {
      // $VF: Couldn't be decompiled
      // Please report this to the Vineflower issue tracker, at https://github.com/Vineflower/vineflower/issues with a copy of the class file (if you have the rights to distribute it!)
      // java.lang.RuntimeException: parsing failure!
      //   at org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper.parseGraph(DomHelper.java:211)
      //   at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:174)
      //
      // Bytecode:
      // 00: aload 0
      // 01: aload 1
      // 02: invokespecial com/l7tech/external/assertions/oauth2/introspection/server/OAuthTokenIntrospector.<init> (Lcom/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig;)V
      // 05: aload 0
      // 06: new java/util/concurrent/atomic/AtomicReference
      // 09: dup
      // 0a: invokespecial java/util/concurrent/atomic/AtomicReference.<init> ()V
      // 0d: putfield com/l7tech/external/assertions/oauth2/introspection/server/OAuthOpaqueTokenIntrospector.d Ljava/util/concurrent/atomic/AtomicReference;
      // 10: aload 0
      // 11: new com/l7tech/gateway/common/audit/LoggingAudit
      // 14: dup
      // 15: getstatic com/l7tech/external/assertions/oauth2/introspection/server/OAuthOpaqueTokenIntrospector.c Ljava/util/logging/Logger;
      // 18: invokespecial com/l7tech/gateway/common/audit/LoggingAudit.<init> (Ljava/util/logging/Logger;)V
      // 1b: putfield com/l7tech/external/assertions/oauth2/introspection/server/OAuthOpaqueTokenIntrospector.f Lcom/l7tech/gateway/common/audit/Audit;
      // 1e: aload 0
      // 1f: aload 2
      // 20: putfield com/l7tech/external/assertions/oauth2/introspection/server/OAuthOpaqueTokenIntrospector.httpClient Lcom/l7tech/common/http/GenericHttpClient;
      // 23: aload 0
      // 24: aload 3
      // 25: putfield com/l7tech/external/assertions/oauth2/introspection/server/OAuthOpaqueTokenIntrospector.sslClientTrustManager Lcom/l7tech/server/transport/http/SslClientTrustManager;
      // 28: aload 1
      // 29: getstatic com/l7tech/external/assertions/oauth2/introspection/server/OAuthOpaqueTokenIntrospector.m [Ljava/lang/String;
      // 2c: bipush 9
      // 2e: aaload
      // 2f: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getStringProperty (Ljava/lang/String;)Ljava/lang/String;
      // 32: astore 4
      // 34: aload 0
      // 35: aload 4
      // 37: invokestatic com/l7tech/external/assertions/oauth2/introspection/util/Util.isNotEmpty (Ljava/lang/String;)Z
      // 3a: ifeq 54
      // 3d: getstatic com/l7tech/server/policy/variable/ServerVariables.SINGLE_SECPASS_PATTERN Ljava/util/regex/Pattern;
      // 40: aload 4
      // 42: invokevirtual java/util/regex/Pattern.matcher (Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
      // 45: invokevirtual java/util/regex/Matcher.matches ()Z
      // 48: ifeq 54
      // 4b: goto 4f
      // 4e: athrow
      // 4f: bipush 1
      // 50: goto 55
      // 53: athrow
      // 54: bipush 0
      // 55: putfield com/l7tech/external/assertions/oauth2/introspection/server/OAuthOpaqueTokenIntrospector.e Z
      // 58: return
      // try (26 -> 35): 36 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // try (30 -> 39): 39 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
   }

   @Override
   public OAuthIntrospectionResult introspect(String var1) {
      return (OAuthIntrospectionResult)this.cache.get(var1, this::introspectOpaqueToken);
   }

   protected OAuthIntrospectionResult introspectOpaqueToken(String var1) {
      String[] var8 = m;
      c.log(Level.INFO, var8[14], this.issuerConfig.getName());

      String var2;
      try {
         GenericHttpRequest var3 = this.a(var1);

         OAuthIntrospectionResult var7;
         try {
            GenericHttpResponse var4 = var3.getResponse();

            try {
               int var5 = var4.getStatus();
               String var6 = this.readHttpResponse(var4);

               try {
                  c.log(Level.FINE, var8[8], new Object[]{this.issuerConfig.getName(), var5, var6});
                  if (var5 != 200) {
                     throw new OAuth2IntrospectionRuntimeException(var8[4]);
                  }
               } catch (Throwable var12) {
                  throw var12;
               }

               try {
                  if (!var4.getContentType().isJson()) {
                     throw new OAuth2IntrospectionRuntimeException(m[12]);
                  }
               } catch (Throwable var13) {
                  throw var13;
               }

               var7 = new OAuthIntrospectionResult(var1, var6, false);
            } catch (Throwable var14) {
               if (var4 != null) {
                  try {
                     var4.close();
                  } catch (Throwable var10) {
                     var14.addSuppressed(var10);
                  }
               }

               throw var14;
            }

            try {
               if (var4 != null) {
                  var4.close();
               }
            } catch (Throwable var15) {
               throw var15;
            }
         } catch (Throwable var16) {
            if (var3 != null) {
               try {
                  var3.close();
               } catch (Throwable var9) {
                  var16.addSuppressed(var9);
               }
            }

            throw var16;
         }

         try {
            if (var3 != null) {
               var3.close();
            }

            return var7;
         } catch (Throwable var11) {
            throw var11;
         }
      } catch (OAuth2IntrospectionRuntimeException var17) {
         var2 = var17.getMessage();
         var8 = m;
         c.log(Level.WARNING, var8[2], new Object[]{this.issuerConfig.getName(), var17.getDetailedMessage()});
      } catch (Exception var18) {
         var8 = m;
         var2 = var8[5];
         c.log(Level.WARNING, var8[16], new Object[]{this.issuerConfig.getName(), ExceptionUtils.getMessageWithCause(var18)});
      }

      return OAuthIntrospectionResult.newErrorResult(var1, m[1], var2);
   }

   private GenericHttpRequest a(String var1) throws MalformedURLException, GenericHttpException, URISyntaxException {
      GenericHttpRequest var2 = this.createHttpRequest(HttpMethod.POST, this.issuerConfig.getIntrospectionEndpoint(), var1x -> {
         var1x.setContentType(ContentTypeHeader.APPLICATION_X_WWW_FORM_URLENCODED);
         var1x.setSslContext(this.getSSLContext());
         String[] var4 = m;
         String var2x = this.issuerConfig.getStringProperty(var4[6]);
         String var3x = this.issuerConfig.getStringProperty(var4[17]);

         try {
            if (Util.isNotEmpty(var3x)) {
               var1x.setPreemptiveAuthentication(true);
               var1x.setPasswordAuthentication(new PasswordAuthentication(var2x, this.getExpandedSecret(var3x).toCharArray()));
            }
         } catch (OAuth2IntrospectionRuntimeException var5) {
            throw var5;
         }
      });
      String[][] var10001 = new String[2][];
      String[] var10004 = new String[2];
      String[] var3 = m;
      var10004[0] = var3[15];
      var10004[1] = var1;
      var10001[0] = var10004;
      var10001[1] = new String[]{var3[3], var3[10]};
      var2.addParameters(Arrays.asList(var10001));
      return var2;
   }

   protected String readHttpResponse(GenericHttpResponse var1) throws IOException {
      InputStream var2 = var1.getInputStream();

      String var6;
      try {
         byte[] var3 = IOUtils.slurpStream(new ByteLimitInputStream(var2, 1024, 65536L));
         ContentTypeHeader var4 = var1.getContentType();

         Charset var10000;
         label40: {
            try {
               if (var4 == null) {
                  var10000 = ContentTypeHeader.DEFAULT_HTTP_ENCODING;
                  break label40;
               }
            } catch (Throwable var9) {
               throw var9;
            }

            var10000 = var4.getEncoding();
         }

         Charset var5 = var10000;
         var6 = new String(var3, var5);
      } catch (Throwable var10) {
         if (var2 != null) {
            try {
               var2.close();
            } catch (Throwable var7) {
               var10.addSuppressed(var7);
            }
         }

         throw var10;
      }

      try {
         if (var2 != null) {
            var2.close();
         }

         return var6;
      } catch (Throwable var8) {
         throw var8;
      }
   }

   public static URL createURL(String var0) throws MalformedURLException {
      try {
         return new URI(var0).toURL();
      } catch (URISyntaxException | IllegalArgumentException var2) {
         throw new MalformedURLException(var2.getMessage());
      }
   }

   protected GenericHttpRequest createHttpRequest(HttpMethod var1, String var2, Consumer<GenericHttpRequestParams> var3) throws MalformedURLException, GenericHttpException {
      URL var4 = createURL(var2);
      GenericHttpRequestParams var5 = new GenericHttpRequestParams(var4);
      var5.setHttpVersion(HttpVersion.HTTP_VERSION_1_1);
      var3.accept(var5);
      return this.httpClient.createRequest(var1, var5);
   }

   protected SSLContext getSSLContext() {
      SSLContext var1 = this.d.get();

      try {
         if (var1 != null) {
            return var1;
         }
      } catch (OAuth2IntrospectionRuntimeException var2) {
         throw var2;
      }

      return this.getOrCreateSSLContext();
   }

   protected synchronized SSLContext getOrCreateSSLContext() {
      SSLContext var1 = this.d.get();
      if (var1 == null) {
         try {
            var1 = this.createSSLContext(this.sslClientTrustManager);
            this.d.set(var1);
         } catch (Exception var3) {
            c.log(Level.WARNING, ExceptionUtils.getDebugException(var3), () -> m[11] + ExceptionUtils.getMessageWithCause(var3));
            throw new IllegalStateException(m[13]);
         }
      }

      return var1;
   }

   protected String getExpandedSecret(String var1) {
      FindException var2;
      try {
         if (!this.e) {
            return var1;
         }

         try {
            return ServerVariables.expandSinglePasswordOnlyVariable(this.f, var1);
         } catch (FindException var3) {
            var2 = var3;
         }
      } catch (OAuth2IntrospectionRuntimeException var4) {
         throw var4;
      }

      c.log(Level.WARNING, ExceptionUtils.getDebugException(var2), () -> m[0] + ExceptionUtils.getMessageWithCause(var2));
      throw new IllegalStateException(m[7]);
   }

   static {
      String[] var5 = new String[18];
      int var3 = 0;
      String var2 = "ilC7~\u001aOB}^-bNO^{Ux{RC@{\u0011=tJKBzX6k\u001a^D{\u0011+iYXIj\u0011=tJXImB1cT\u0010\f\u000eEpE=~TK@AT*~UXLilC7~\u001aOB}^-bNO^{Ux{RC@{\u00111bNXCmA=oNCBy\u0011,d_\nc_D,d\u001a^CuT66\u001aC_mD=~\u0007Q\u001cc\u001dxo[__{\f#=G\u000fXqZ=be^UnT\u0007dSDX.ilC7~\u001aXImA7bIO\fxC7a\u001a^D{\u00111bNXCmA=oNCCp\u0011=b^ZCw_,?oqD4h\u001aDCj\u00111bNXCmA=oN\nXvTxxUAIp\u0011-\u007fSDK>E0i\u001aCBjC7\u007fJOOjX7b\u001aOBzA7eT^\tOrX=bNuEz,ypP:`_\nXq\u0011=z[FY\u007fE=,NBI>E7g_D\f{_<|UCBj\u0011+iYXIjIepE*cIZI}E=h\u001a^CuT6,HO_n^6\u007f_\nJl^5,NBI>X+\u007fOO^#Jhq\u0000\n_jP,yI\u0017W/Lt,HO_n^6\u007f_\u0017W,L\rOrX=bNu_{R*iN\fM}R=\u007fIuXqZ=bJilC7~\u001aOB}^-bNO^{Ux{RC@{\u0011(~_ZMlX6k\u001a^D{\u0011\u000b_viCpE=tN\nJqCxxUAIp\u00111bNXCmA=oNCCp\u000bx$epG9`SN\fj^3iT\nEpE*cIZI}E1cT\n^{B(cTYIFypP:`_\nXq\u0011(~_ZMlTxxRO\fMb\u0014,YEBjT x\u001aLCl\u0011,d_\nXqZ=b\u001aCBjC7\u007fJOOjX7b\u001aOBzA7eT^6epE*cIZI}E1b]\nM>E7g_D\fkB1b]\nXvTxeIYY{Cew\nW\u000b9BxiTN\\qX6x\u0005XqZ=b";
      int var4 = "ilC7~\u001aOB}^-bNO^{Ux{RC@{\u0011=tJKBzX6k\u001a^D{\u0011+iYXIj\u0011=tJXImB1cT\u0010\f\u000eEpE=~TK@AT*~UXLilC7~\u001aOB}^-bNO^{Ux{RC@{\u00111bNXCmA=oNCBy\u0011,d_\nc_D,d\u001a^CuT66\u001aC_mD=~\u0007Q\u001cc\u001dxo[__{\f#=G\u000fXqZ=be^UnT\u0007dSDX.ilC7~\u001aXImA7bIO\fxC7a\u001a^D{\u00111bNXCmA=oNCCp\u0011=b^ZCw_,?oqD4h\u001aDCj\u00111bNXCmA=oN\nXvTxxUAIp\u0011-\u007fSDK>E0i\u001aCBjC7\u007fJOOjX7b\u001aOBzA7eT^\tOrX=bNuEz,ypP:`_\nXq\u0011=z[FY\u007fE=,NBI>E7g_D\f{_<|UCBj\u0011+iYXIjIepE*cIZI}E=h\u001a^CuT6,HO_n^6\u007f_\nJl^5,NBI>X+\u007fOO^#Jhq\u0000\n_jP,yI\u0017W/Lt,HO_n^6\u007f_\u0017W,L\rOrX=bNu_{R*iN\fM}R=\u007fIuXqZ=bJilC7~\u001aOB}^-bNO^{Ux{RC@{\u0011(~_ZMlX6k\u001a^D{\u0011\u000b_viCpE=tN\nJqCxxUAIp\u00111bNXCmA=oNCCp\u000bx$epG9`SN\fj^3iT\nEpE*cIZI}E1cT\n^{B(cTYIFypP:`_\nXq\u0011(~_ZMlTxxRO\fMb\u0014,YEBjT x\u001aLCl\u0011,d_\nXqZ=b\u001aCBjC7\u007fJOOjX7b\u001aOBzA7eT^6epE*cIZI}E1b]\nM>E7g_D\fkB1b]\nXvTxeIYY{Cew\nW\u000b9BxiTN\\qX6x\u0005XqZ=b"
         .length();
      char var1 = '9';
      int var7 = -1;

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

         while (true) {
            String var12 = b(c(var10000));
            switch (var10001) {
               case 0:
                  var5[var3++] = var12;
                  if ((var7 += var1) >= var4) {
                     m = var5;
                     c = Logger.getLogger(OAuthOpaqueTokenIntrospector.class.getName());
                     return;
                  }

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

                  var2 = "ilC7~\u001aOB}^-bNO^{Ux{RC@{\u00111bNXCmA=oNCBy\u0011,d_\nc_D,d\u001a^CuT66\u001aC_mD=~\u0007Q\u001cc\u001dxo[__{\f#=G\rOrX=bNu_{R*iN";
                  var4 = "ilC7~\u001aOB}^-bNO^{Ux{RC@{\u00111bNXCmA=oNCBy\u0011,d_\nc_D,d\u001a^CuT66\u001aC_mD=~\u0007Q\u001cc\u001dxo[__{\f#=G\rOrX=bNu_{R*iN"
                     .length();
                  var1 = 'L';
                  var7 = -1;
            }

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

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

      return var10000;
   }

   private static String b(char[] var0) {
      int var10002 = var0.length;
      char[] var10001 = var0;
      int var10000 = var10002;

      for (int var1 = 0; var10000 > var1; var1++) {
         var10001[var1] = (char)(var10001[var1] ^ switch (var1 % 7) {
            case 0 -> 44;
            case 1 -> 30;
            case 2 -> 49;
            case 3 -> 88;
            case 4 -> 12;
            case 5 -> 58;
            default -> 42;
         });
      }

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