package com.l7tech.server.security.kerberos;

import com.l7tech.policy.assertion.credential.LoginCredentials;
import com.l7tech.security.xml.processor.SecurityContext;
import com.l7tech.security.xml.processor.SecurityContextFinder;
import com.l7tech.util.ConfigFactory;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Logger;

public class KerberosSessionContextManager implements SecurityContextFinder {
   private Map<String, KerberosSession> a = new HashMap<>();
   private static final Logger b;
   private static final long c;
   private static final long d;
   private static final long e = 300000L;
   private long f = System.currentTimeMillis();
   private final ReadWriteLock g = new ReentrantReadWriteLock(false);
   private static final String[] h;

   public SecurityContext getSecurityContext(String var1) {
      return this.getSession(var1);
   }

   public KerberosSession getSession(String var1) {
      this.a();
      KerberosSession var2 = null;
      this.g.readLock().lock();

      try {
         var2 = this.a.get(var1);
      } finally {
         this.g.readLock().unlock();
      }

      if (var2 != null && var2.getExpiration() <= System.currentTimeMillis()) {
         var2 = null;
         this.g.writeLock().lock();

         try {
            this.a.remove(var1);
         } finally {
            this.g.writeLock().unlock();
         }
      }

      return var2;
   }

   public KerberosSession createSession(String var1, long var2, LoginCredentials var4, byte[] var5) throws KerberosSessionContextManager.DuplicateSessionException {
      long var10000;
      label16: {
         try {
            if (var2 > 0L) {
               var10000 = var2;
               break label16;
            }
         } catch (KerberosSessionContextManager.DuplicateSessionException var9) {
            throw a(var9);
         }

         var10000 = System.currentTimeMillis() + c;
      }

      long var6 = var10000;
      var6 = Math.min(var6, d);
      KerberosSession var8 = new KerberosSession(var1, var5, System.currentTimeMillis(), var6, var4);
      this.a(var8);
      return var8;
   }

   private void a(KerberosSession var1) throws KerberosSessionContextManager.DuplicateSessionException {
      this.g.writeLock().lock();

      try {
         KerberosSession var2 = this.a.get(var1.getIdentifier());

         try {
            if (var2 != null) {
               throw new KerberosSessionContextManager.DuplicateSessionException(h[2] + var1.getIdentifier());
            }
         } catch (KerberosSessionContextManager.DuplicateSessionException var6) {
            throw a(var6);
         }

         this.a.put(var1.getIdentifier(), var1);
         b.fine(h[5] + var1.getIdentifier());
      } finally {
         this.g.writeLock().unlock();
      }
   }

   private void a() {
      long var1 = System.currentTimeMillis();
      this.g.readLock().lock();

      long var3;
      try {
         var3 = this.f;
      } finally {
         this.g.readLock().unlock();
      }

      if (var1 - var3 > 300000L) {
         this.g.writeLock().lock();

         try {
            String[] var9 = h;
            b.finest(var9[4]);
            Collection var5 = this.a.values();
            Iterator var6 = var5.iterator();

            while (var6.hasNext()) {
               KerberosSession var7 = (KerberosSession)var6.next();
               if (var7.getExpiration() <= var1) {
                  b.fine(h[0] + var7.getIdentifier());
                  var6.remove();
               }
            }

            this.f = var1;
         } finally {
            this.g.writeLock().unlock();
         }
      }
   }

   static {
      String[] var5 = new String[6];
      int var3 = 0;
      String var2 = "xWt\u0018l\u0007J[\u0012k\u0018k\u001dMS\\8\u0019m\u000b\u0004H]8\u0018`\u001eMNK\"]:_]uStYPYQpSk\u000bVJWjSk\u000bGI@q\ta@OY@z\u0018j\u0001W\u0012A}\u000ek\u0007KRv}\u001by\u001bHHvm\u000fy\u001aMS\\\u001foWk\u000eq\u0001J\u001cSt\u000f}\u000f@E\u0012}\u0005q\u001dPO\u0012o\u0014l\u0006\u0004UV8:_]uStYPYQpSk\u000bVJWjSk\u000bGI@q\ta@OY@z\u0018j\u0001W\u0012A}\u000ek\u0007KR\u007fy\u0005q\u0003QQvm\u000fy\u001aMS\\";
      int var4 = "xWt\u0018l\u0007J[\u0012k\u0018k\u001dMS\\8\u0019m\u000b\u0004H]8\u0018`\u001eMNK\"]:_]uStYPYQpSk\u000bVJWjSk\u000bGI@q\ta@OY@z\u0018j\u0001W\u0012A}\u000ek\u0007KRv}\u001by\u001bHHvm\u000fy\u001aMS\\\u001foWk\u000eq\u0001J\u001cSt\u000f}\u000f@E\u0012}\u0005q\u001dPO\u0012o\u0014l\u0006\u0004UV8:_]uStYPYQpSk\u000bVJWjSk\u000bGI@q\ta@OY@z\u0018j\u0001W\u0012A}\u000ek\u0007KR\u007fy\u0005q\u0003QQvm\u000fy\u001aMS\\"
         .length();
      char var1 = ' ';
      int var7 = -1;

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

         while (true) {
            String var9 = a(var10000, a(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var9;
                  if ((var7 += var1) >= var4) {
                     h = var5;
                     b = Logger.getLogger(KerberosSessionContextManager.class.getName());
                     String[] var8 = h;
                     c = ConfigFactory.getLongProperty(var8[1], 7200000L);
                     d = ConfigFactory.getLongProperty(var8[3], 36000000L);
                     return;
                  }

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

                  var2 = "\b-\ni\u0004p=,e\te\u001d9635\u0006x\n}s8 \u001cy\u0006v=8\u001f\u0018$\u0019o\u000b98.7\ro\u001dv k6\ny\u001cp<%e\fe\u0001m631O";
                  var4 = "\b-\ni\u0004p=,e\te\u001d9635\u0006x\n}s8 \u001cy\u0006v=8\u001f\u0018$\u0019o\u000b98.7\ro\u001dv k6\ny\u001cp<%e\fe\u0001m631O"
                     .length();
                  var1 = 29;
                  var7 = -1;
            }

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

   private static KerberosSessionContextManager.DuplicateSessionException a(KerberosSessionContextManager.DuplicateSessionException var0) {
      return var0;
   }

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

      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 -> 122;
            case 1 -> 116;
            case 2 -> 94;
            case 3 -> 59;
            case 4 -> 94;
            case 5 -> 40;
            default -> 98;
         });
      }

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

   public static class DuplicateSessionException extends Exception {
      static final long serialVersionUID = -7267197914857527881L;

      public DuplicateSessionException(String var1) {
         super(var1);
      }

      public DuplicateSessionException(String var1, Throwable var2) {
         super(var1, var2);
      }
   }
}
