package com.airlock.iam.login.application.service.kerberos;

import java.security.PrivilegedExceptionAction;
import java.util.Arrays;
import java.util.Optional;
import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSCredential;
import org.ietf.jgss.GSSManager;

public class KerberosValidateAction implements PrivilegedExceptionAction<String> {
   private final byte[] inToken;
   private byte[] outToken;
   private GSSContext context;

   public KerberosValidateAction(Optional<GSSContext> context, byte[] inToken) {
      this.context = context.orElse(null);
      this.inToken = Arrays.copyOf(inToken, inToken.length);
   }

   public byte[] getOutputToken() {
      return this.outToken;
   }

   public GSSContext getContext() {
      return this.context;
   }

   public String run() throws Exception {
      if (this.context == null) {
         this.context = GSSManager.getInstance().createContext((GSSCredential)null);
      }

      this.outToken = this.context.acceptSecContext(this.inToken, 0, this.inToken.length);
      if (this.context.isEstablished()) {
         String user = this.context.getSrcName().toString();
         this.context.dispose();
         return user;
      } else {
         return null;
      }
   }
}
