package com.l7tech.identity.internal;

import com.l7tech.common.io.NonCloseableOutputStream;
import com.l7tech.identity.IdentityProviderConfigManager;
import com.l7tech.identity.PersistentUser;
import com.l7tech.identity.User;
import com.l7tech.util.Charsets;
import com.l7tech.util.PoolByteArrayOutputStream;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Lob;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OrderBy;
import jakarta.persistence.Table;
import jakarta.xml.bind.annotation.XmlRootElement;
import java.beans.XMLEncoder;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.annotations.Proxy;

@XmlRootElement
@Entity
@Proxy(lazy = false)
@Table(name = "internal_user")
public class InternalUser extends PersistentUser {
   public static final String PROPERTIES_KEY_SSH_USER_PUBLIC_KEY;
   private static final long serialVersionUID = 5056935403670495223L;
   private static final Charset PROPERTIES_ENCODING;
   private long expiration = -1L;
   protected String hashedPassword;
   private String httpDigest;
   private List<PasswordChangeRecord> passwordChangesHistory;
   private long passwordExpiry;
   private boolean changePassword;
   private boolean enabled = true;
   private transient String xmlProperties;
   private Map<String, String> properties;
   private static final String[] c;

   public InternalUser() {
      this(null);
   }

   public InternalUser(String var1) {
      super(IdentityProviderConfigManager.INTERNALPROVIDER_SPECIAL_GOID, var1);
   }

   @Override
   public void copyFrom(User var1) {
      InternalUser var2 = (InternalUser)var1;
      this.setGoid(var2.getGoid());
      this.setName(var2.getName());
      this.setProviderId(var2.getProviderId());
      this.setLogin(var2.getLogin());
      this.setDepartment(var2.getDepartment());
      this.setDescription(var2.getDescription());
      this.setEmail(var2.getEmail());
      this.setFirstName(var2.getFirstName());
      this.setLastName(var2.getLastName());
      this.setExpiration(var2.getExpiration());
      this.setHashedPassword(var2.getHashedPassword());
      this.setSubjectDn(var2.getSubjectDn());
      this.setPasswordChangesHistory(var2.getPasswordChangesHistory());
      this.setPasswordExpiry(var2.getPasswordExpiry());
      this.setChangePassword(var2.isChangePassword());
      this.setEnabled(var2.isEnabled());
      this.setHttpDigest(var2.getHttpDigest());
      this.setXmlProperties(var2.getXmlProperties());
   }

   public void setHashedPassword(String var1) {
      this.hashedPassword = var1;
   }

   @Column(name = "password", nullable = false, length = 256)
   public String getHashedPassword() {
      return this.hashedPassword;
   }

   @Column(name = "digest", nullable = true, length = 32)
   public String getHttpDigest() {
      return this.httpDigest;
   }

   public void setHttpDigest(String var1) {
      this.httpDigest = var1;
   }

   @Column(name = "description", length = 255)
   @Override
   public String getDescription() {
      return super.getDescription();
   }

   @Column(nullable = false)
   public long getExpiration() {
      return this.expiration;
   }

   public void setExpiration(long var1) {
      this.expiration = var1;
   }

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "internalUser", orphanRemoval = true)
   @OrderBy("lastChanged ASC")
   public List<PasswordChangeRecord> getPasswordChangesHistory() {
      return this.passwordChangesHistory;
   }

   @Column(name = "password_expiry")
   public long getPasswordExpiry() {
      return this.passwordExpiry;
   }

   public void setPasswordExpiry(long var1) {
      this.passwordExpiry = var1;
   }

   @Column(name = "enabled")
   public boolean isEnabled() {
      return this.enabled;
   }

   public void setEnabled(boolean var1) {
      this.enabled = var1;
   }

   @Column(name = "change_password")
   public boolean isChangePassword() {
      return this.changePassword;
   }

   public void setChangePassword(boolean var1) {
      this.changePassword = var1;
   }

   public void setPasswordChangesHistory(List<PasswordChangeRecord> var1) {
      if (this.passwordChangesHistory != null) {
         for (PasswordChangeRecord var3 : var1) {
            try {
               if (!this.passwordChangesHistory.contains(var3)) {
                  this.passwordChangesHistory.add(var3);
               }
            } catch (IllegalStateException var4) {
               throw var4;
            }
         }
      } else {
         this.changePasswordChangesHistory(var1);
      }
   }

   public void changePasswordChangesHistory(List<PasswordChangeRecord> var1) {
      this.passwordChangesHistory = var1;
   }

   @Override
   public boolean equals(Object param1) {
      // $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: if_acmpne 08
      // 05: bipush 1
      // 06: ireturn
      // 07: athrow
      // 08: aload 1
      // 09: ifnull 1b
      // 0c: aload 0
      // 0d: invokevirtual java/lang/Object.getClass ()Ljava/lang/Class;
      // 10: aload 1
      // 11: invokevirtual java/lang/Object.getClass ()Ljava/lang/Class;
      // 14: if_acmpeq 1e
      // 17: goto 1b
      // 1a: athrow
      // 1b: bipush 0
      // 1c: ireturn
      // 1d: athrow
      // 1e: aload 0
      // 1f: aload 1
      // 20: invokespecial com/l7tech/identity/PersistentUser.equals (Ljava/lang/Object;)Z
      // 23: ifne 29
      // 26: bipush 0
      // 27: ireturn
      // 28: athrow
      // 29: aload 1
      // 2a: checkcast com/l7tech/identity/internal/InternalUser
      // 2d: astore 2
      // 2e: aload 0
      // 2f: getfield com/l7tech/identity/internal/InternalUser.expiration J
      // 32: aload 2
      // 33: getfield com/l7tech/identity/internal/InternalUser.expiration J
      // 36: lcmp
      // 37: ifne 73
      // 3a: aload 0
      // 3b: getfield com/l7tech/identity/internal/InternalUser.passwordExpiry J
      // 3e: aload 2
      // 3f: getfield com/l7tech/identity/internal/InternalUser.passwordExpiry J
      // 42: lcmp
      // 43: ifne 73
      // 46: goto 4a
      // 49: athrow
      // 4a: aload 0
      // 4b: getfield com/l7tech/identity/internal/InternalUser.changePassword Z
      // 4e: aload 2
      // 4f: getfield com/l7tech/identity/internal/InternalUser.changePassword Z
      // 52: if_icmpne 73
      // 55: goto 59
      // 58: athrow
      // 59: aload 0
      // 5a: getfield com/l7tech/identity/internal/InternalUser.hashedPassword Ljava/lang/String;
      // 5d: ifnull 73
      // 60: goto 64
      // 63: athrow
      // 64: aload 0
      // 65: getfield com/l7tech/identity/internal/InternalUser.hashedPassword Ljava/lang/String;
      // 68: aload 2
      // 69: getfield com/l7tech/identity/internal/InternalUser.hashedPassword Ljava/lang/String;
      // 6c: invokevirtual java/lang/String.equals (Ljava/lang/Object;)Z
      // 6f: goto 8f
      // 72: athrow
      // 73: aload 2
      // 74: getfield com/l7tech/identity/internal/InternalUser.hashedPassword Ljava/lang/String;
      // 77: ifnonnull 8e
      // 7a: aload 0
      // 7b: getfield com/l7tech/identity/internal/InternalUser.enabled Z
      // 7e: aload 2
      // 7f: getfield com/l7tech/identity/internal/InternalUser.enabled Z
      // 82: if_icmpne 8e
      // 85: goto 89
      // 88: athrow
      // 89: bipush 1
      // 8a: goto 8f
      // 8d: athrow
      // 8e: bipush 0
      // 8f: ireturn
      // try (0 -> 5): 5 java/lang/IllegalStateException
      // try (6 -> 13): 14 java/lang/IllegalStateException
      // try (8 -> 17): 17 java/lang/IllegalStateException
      // try (18 -> 24): 24 java/lang/IllegalStateException
      // try (28 -> 40): 41 java/lang/IllegalStateException
      // try (34 -> 47): 48 java/lang/IllegalStateException
      // try (42 -> 52): 53 java/lang/IllegalStateException
      // try (49 -> 60): 60 java/lang/IllegalStateException
      // try (61 -> 69): 70 java/lang/IllegalStateException
      // try (64 -> 73): 73 java/lang/IllegalStateException
   }

   @Override
   public int hashCode() {
      int var1 = super.hashCode();

      int var10000;
      int var10001;
      label31: {
         try {
            var10000 = 31 * var1;
            if (this.hashedPassword != null) {
               var10001 = this.hashedPassword.hashCode();
               break label31;
            }
         } catch (IllegalStateException var3) {
            throw var3;
         }

         var10001 = 0;
      }

      var1 = var10000 + var10001;
      var1 = 31 * var1 + (int)(this.expiration ^ this.expiration >>> 32);
      var1 = 31 * var1 + (int)(this.passwordExpiry ^ this.passwordExpiry >>> 32);

      label23: {
         try {
            var10000 = 31 * var1;
            if (this.passwordChangesHistory != null) {
               var10001 = this.passwordChangesHistory.hashCode();
               break label23;
            }
         } catch (IllegalStateException var2) {
            throw var2;
         }

         var10001 = 0;
      }

      var1 = var10000 + var10001;
      var1 = 31 * var1 + Boolean.valueOf(this.changePassword).hashCode();
      return 31 * var1 + Boolean.valueOf(this.enabled).hashCode();
   }

   public void addPasswordChange(String var1) {
      try {
         if (this.hashedPassword == null) {
            throw new IllegalStateException(c[2]);
         }
      } catch (IllegalStateException var3) {
         throw var3;
      }

      try {
         if (this.hashedPassword.equals(var1)) {
            throw new IllegalArgumentException(c[0]);
         }
      } catch (IllegalStateException var4) {
         throw var4;
      }

      PasswordChangeRecord var2 = new PasswordChangeRecord(this, System.currentTimeMillis(), var1);
      this.passwordChangesHistory.add(var2);
      this.changePassword = false;
   }

   @Column(name = "properties", length = Integer.MAX_VALUE)
   @Lob
   public String getXmlProperties() {
      if (this.xmlProperties == null) {
         Map var1 = this.properties;

         try {
            if (var1 == null) {
               return null;
            }
         } catch (IllegalStateException var8) {
            throw var8;
         }

         PoolByteArrayOutputStream var2 = new PoolByteArrayOutputStream();

         try {
            XMLEncoder var3 = new XMLEncoder(new NonCloseableOutputStream(var2));
            var3.writeObject(var1);
            var3.close();
            this.xmlProperties = var2.toString(PROPERTIES_ENCODING);
         } finally {
            var2.close();
         }
      }

      return this.xmlProperties;
   }

   public void setXmlProperties(String param1) {
      // $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 1
      // 01: ifnull 15
      // 04: aload 1
      // 05: aload 0
      // 06: getfield com/l7tech/identity/internal/InternalUser.xmlProperties Ljava/lang/String;
      // 09: invokevirtual java/lang/String.equals (Ljava/lang/Object;)Z
      // 0c: ifeq 15
      // 0f: goto 13
      // 12: athrow
      // 13: return
      // 14: athrow
      // 15: aload 0
      // 16: aload 1
      // 17: putfield com/l7tech/identity/internal/InternalUser.xmlProperties Ljava/lang/String;
      // 1a: aload 1
      // 1b: ifnull 4d
      // 1e: aload 1
      // 1f: invokevirtual java/lang/String.length ()I
      // 22: ifle 4d
      // 25: goto 29
      // 28: athrow
      // 29: new com/l7tech/util/SafeXMLDecoderBuilder
      // 2c: dup
      // 2d: new java/io/ByteArrayInputStream
      // 30: dup
      // 31: aload 1
      // 32: getstatic com/l7tech/identity/internal/InternalUser.PROPERTIES_ENCODING Ljava/nio/charset/Charset;
      // 35: invokevirtual java/lang/String.getBytes (Ljava/nio/charset/Charset;)[B
      // 38: invokespecial java/io/ByteArrayInputStream.<init> ([B)V
      // 3b: invokespecial com/l7tech/util/SafeXMLDecoderBuilder.<init> (Ljava/io/InputStream;)V
      // 3e: invokevirtual com/l7tech/util/SafeXMLDecoderBuilder.build ()Lcom/l7tech/util/SafeXMLDecoder;
      // 41: astore 2
      // 42: aload 0
      // 43: aload 2
      // 44: invokevirtual com/l7tech/util/SafeXMLDecoder.readObject ()Ljava/lang/Object;
      // 47: checkcast java/util/Map
      // 4a: putfield com/l7tech/identity/internal/InternalUser.properties Ljava/util/Map;
      // 4d: return
      // try (0 -> 7): 8 java/lang/IllegalStateException
      // try (2 -> 10): 10 java/lang/IllegalStateException
      // try (11 -> 19): 20 java/lang/IllegalStateException
   }

   public String getProperty(String var1) {
      String var2 = null;
      Map var3 = this.properties;
      if (var3 != null) {
         var2 = (String)var3.get(var1);
      }

      return var2;
   }

   public void setProperty(String var1, String var2) {
      Map var3 = this.properties;
      if (var3 == null) {
         var3 = new HashMap();
         this.properties = var3;
      }

      var3.put(var1, var2);
      this.xmlProperties = null;
   }

   static {
      String[] var5 = new String[3];
      int var3 = 0;
      String var2 = ")6\u001f@{\u0001N\u000b3\u0015\u000euU\u001e\u000b$\u0002Y{\u0007\nJ4\u0019Oz\u0012\u000bJ%\u0014M{\u0007\nJ1\u001e\\4\u0000\u001d\u000f%\u0002\u000ew\u0000\u001c\u00182\u001fZ4\u0005\u000f\u0019$\u0006Af\u0011@\u00109$\u0019{g\u0010\u001c:\"\u0013B}\u0016%\u000f.>)6\u001f@{\u0001N\u00192\u0005\u000ed\u0014\u001d\u0019 \u001e\\pU\u0006\u0003$\u0005Af\fN\b2\u0017Af\u0010N\u001f$\u0014\\4\u001d\u000f\u0019w\u0010\u000e|\u0014\u001d\u00022\u0015\u000ed\u0014\u001d\u0019 \u001e\\p[";
      int var4 = ")6\u001f@{\u0001N\u000b3\u0015\u000euU\u001e\u000b$\u0002Y{\u0007\nJ4\u0019Oz\u0012\u000bJ%\u0014M{\u0007\nJ1\u001e\\4\u0000\u001d\u000f%\u0002\u000ew\u0000\u001c\u00182\u001fZ4\u0005\u000f\u0019$\u0006Af\u0011@\u00109$\u0019{g\u0010\u001c:\"\u0013B}\u0016%\u000f.>)6\u001f@{\u0001N\u00192\u0005\u000ed\u0014\u001d\u0019 \u001e\\pU\u0006\u0003$\u0005Af\fN\b2\u0017Af\u0010N\u001f$\u0014\\4\u001d\u000f\u0019w\u0010\u000e|\u0014\u001d\u00022\u0015\u000ed\u0014\u001d\u0019 \u001e\\p["
         .length();
      char var1 = '?';
      int var0 = -1;

      while (true) {
         String var10002 = b(c(var2.substring(++var0, var0 + var1)));
         byte var10001 = -1;
         var5[var3++] = var10002;
         if ((var0 += var1) >= var4) {
            c = var5;
            PROPERTIES_KEY_SSH_USER_PUBLIC_KEY = c[1];
            PROPERTIES_ENCODING = Charsets.UTF8;
            return;
         }

         var1 = var2.charAt(var0);
      }
   }

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

      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 -> 106;
            case 1 -> 87;
            case 2 -> 113;
            case 3 -> 46;
            case 4 -> 20;
            case 5 -> 117;
            default -> 110;
         });
      }

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