package com.l7tech.common.http.prov.apache;

import com.l7tech.ntlm.protocol.AuthenticationManagerException;
import com.l7tech.ntlm.protocol.NtlmAuthenticationClient;
import com.l7tech.ntlm.protocol.NtlmCredential;
import com.l7tech.ntlm.protocol.NtlmAuthenticationProvider.State;
import com.l7tech.util.HexUtils;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.Principal;
import java.util.HashMap;
import java.util.logging.Logger;
import org.apache.commons.lang3.StringUtils;
import org.apache.hc.client5.http.auth.AuthChallenge;
import org.apache.hc.client5.http.auth.AuthScheme;
import org.apache.hc.client5.http.auth.AuthScope;
import org.apache.hc.client5.http.auth.AuthenticationException;
import org.apache.hc.client5.http.auth.Credentials;
import org.apache.hc.client5.http.auth.CredentialsProvider;
import org.apache.hc.client5.http.auth.NTCredentials;
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.HttpRequest;
import org.apache.hc.core5.http.protocol.HttpContext;
import org.apache.hc.core5.util.Args;

public class Ntlm2AuthScheme implements AuthScheme {
   public static Logger logger;
   public static final String NTLM;
   private static String a;
   private static String b;
   private NtlmAuthenticationClient c;
   private String d = null;
   private NTCredentials e;
   private static final String[] f;

   public static void setNegotiateFlags(String var0) {
      a = var0;
   }

   public Ntlm2AuthScheme() {
      HashMap var1 = new HashMap();
      if (b != null) {
         String[] var2 = f;
         var1.put(var2[9], b);
      }

      if (a != null && a.length() > 0) {
         var1.put(f[1], a);
      }

      this.c = new NtlmAuthenticationClient(var1);
   }

   protected void parseChallenge(String var1) {
      if (!StringUtils.isBlank(var1)) {
         this.d = var1;
         this.c.getNtlmAuthenticationState().setState(State.CHALLENGE);
      } else {
         this.d = "";
         if (this.c.getNtlmAuthenticationState().getState() != State.NEGOTIATE) {
            this.c.getNtlmAuthenticationState().setState(State.FAILED);
         }
      }
   }

   public void processChallenge(AuthChallenge var1, HttpContext var2) {
      Args.notNull(var1, f[4]);
      this.parseChallenge(var1.getValue());
   }

   public boolean isChallengeComplete() {
      return this.c.getNtlmAuthenticationState().getState() == State.COMPLETE || this.c.getNtlmAuthenticationState().getState() == State.FAILED;
   }

   public String getRealm() {
      return null;
   }

   public String getName() {
      return f[0];
   }

   public boolean isConnectionBased() {
      return true;
   }

   public boolean isResponseReady(HttpHost var1, CredentialsProvider var2, HttpContext var3) {
      String[] var6 = f;
      Args.notNull(var1, var6[3]);
      Args.notNull(var2, var6[5]);
      AuthScope var4 = new AuthScope(var1, null, this.getName());
      Credentials var5 = var2.getCredentials(var4, var3);
      if (var5 instanceof NTCredentials) {
         this.e = (NTCredentials)var5;
         return true;
      } else {
         return false;
      }
   }

   public Principal getPrincipal() {
      return null;
   }

   public String generateAuthResponse(HttpHost var1, HttpRequest var2, HttpContext var3) throws AuthenticationException {
      try {
         if (this.e == null) {
            throw new AuthenticationException(f[8]);
         }
      } catch (Exception var7) {
         throw a(var7);
      }

      try {
         byte[] var4 = HexUtils.decodeBase64(this.d);
         var4 = this.c.requestAuthentication(var4, this.a(this.e));
         String var5 = HexUtils.encodeBase64(var4, true);
         return f[2] + var5;
      } catch (Exception var6) {
         throw new AuthenticationException(var6.getMessage());
      }
   }

   private NtlmCredential a(Credentials var1) throws AuthenticationException, AuthenticationManagerException {
      if (var1 instanceof NTCredentials var3) {
         return new NtlmCredential(var3.getWorkstation(), var3.getDomain(), var3.getUserName(), new String(var3.getPassword()));
      } else if (var1 instanceof UsernamePasswordCredentials var2) {
         return new NtlmCredential(var2.getUserName(), new String(var2.getPassword()));
      } else {
         throw new AuthenticationException(f[6]);
      }
   }

   static {
      String[] var5 = new String[10];
      int var3 = 0;
      String var2 = "a\u0005=\u0007\u0005I=\u0010-l\u0005a\u0005=\u0007?\tn$\u0005\"?c.\\%\rn$\u0005\"\\c C=\u0014$xn\u0013l#\u0014.ze5F0\u001d9Oy.Y8\u0015/m5j)\u0001/|\u007f$Kq?\u001e\\y$K4\u001f>vj-\\q\u001e8?^2J#\u001f+rn\u0011N\"\u0002=py%l#\u0014.ze5F0\u001d9\u0004A%\u001d'";
      int var4 = "a\u0005=\u0007\u0005I=\u0010-l\u0005a\u0005=\u0007?\tn$\u0005\"?c.\\%\rn$\u0005\"\\c C=\u0014$xn\u0013l#\u0014.ze5F0\u001d9Oy.Y8\u0015/m5j)\u0001/|\u007f$Kq?\u001e\\y$K4\u001f>vj-\\q\u001e8?^2J#\u001f+rn\u0011N\"\u0002=py%l#\u0014.ze5F0\u001d9\u0004A%\u001d'"
         .length();
      char var1 = 4;
      int var11 = -1;

      label44:
      while (true) {
         byte var10000 = 124;
         String var10001 = var2.substring(++var11, var11 + var1);
         byte var10002 = -1;

         while (true) {
            String var12 = a(var10000, a(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var12;
                  if ((var11 += var1) >= var4) {
                     f = var5;
                     NTLM = f[7];
                     logger = Logger.getLogger(Ntlm2AuthScheme.class.getName());
                     a = null;
                     InetAddress var6 = null;
                     String var7 = null;

                     try {
                        var6 = InetAddress.getLocalHost();
                     } catch (UnknownHostException var9) {
                     }

                     if (var6 != null) {
                        var7 = var6.getHostName();
                        int var8 = var7.indexOf(46);
                        if (var8 > 0) {
                           var7 = var7.substring(0, var8);
                        }

                        if (var7.length() > 15) {
                           var7 = var7.substring(0, 15);
                        }
                     }

                     b = var7;
                     return;
                  }

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

                  var2 = "n\n^&ba*E0\n,qh=\u00000\u001110e8A7\u0012$rh+\u0011H1\r1>j+T<\u0017*c* A3\u001b";
                  var4 = "n\n^&ba*E0\n,qh=\u00000\u001110e8A7\u0012$rh+\u0011H1\r1>j+T<\u0017*c* A3\u001b".length();
                  var1 = 28;
                  var11 = -1;
            }

            var10000 = 115;
            var10001 = var2.substring(++var11, var11 + var1);
            var10002 = 0;
         }
      }
   }

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

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

      return var10000;
   }

   private static String a(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 -> 83;
            case 1 -> 45;
            case 2 -> 13;
            case 3 -> 54;
            case 4 -> 99;
            case 5 -> 119;
            default -> 61;
         });
      }

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