package org.mailster.smtp.core.auth;
import java.util.List;
import org.mailster.smtp.core.SMTPContext;
/**
* The interface that enables challenge-response communication necessary for SMTP AUTH.<p>
* Since the authentication process can be stateful, an instance of this class can be stateful too.<br>
* Do not share a single instance of this interface if you don't explicitly need to do so.
*
* @author Marco Trevisan <mrctrevisan@yahoo.it>
* @author De Oliveira Edouard <doe_wanted@yahoo.fr>
*/
public interface AuthenticationHandler
{
/**
* If your handler supports RFC 2554 at some degree, then it must return all the supported mechanisms here. <br>
* The order you use to populate the list will be preserved in the output of the EHLO command. <br>
* If your handler does not support RFC 2554 at all, return an empty list.
*
* @return the supported authentication mechanisms as List.
*/
public List<String> getAuthenticationMechanisms();
/**
* Initially called using an input string in the RFC2554 form: "AUTH <mechanism> [initial-response]". <br>
* This method must provide the correct reply (by filling the <code>response</code> parameter) at each <code>clientInput</code>.
* <p>
* Depending on the authentication mechanism, the handshaking process may require
* many request-response passes. This method will return <code>true</code> only when the authentication process is finished <br>
*
* @return <code>true</code> if the authentication process is finished, <code>false</code> otherwise.
* @param clientInput The client's input.
* @param response a buffer filled with your response to the client input.
* @param ctx the connection context filled with the credential of the user if authentication succeeds.
* @throws LoginFailedException if authentication fails.
*/
public boolean auth(String clientInput, StringBuilder response, SMTPContext ctx)
throws LoginFailedException;
/**
* Since a so-designed handler has its own state, it seems reasonable to enable resetting
* its state. This can be done, for example, after a "*" client response during the AUTH command
* processing.
*/
public void resetState();
}