package org.mailster.smtp.core.commands.impl;
import java.io.IOException;
import org.apache.mina.core.session.IoSession;
import org.mailster.smtp.SMTPServerConfig;
import org.mailster.smtp.core.SMTPContext;
import org.mailster.smtp.core.SMTPState;
import org.mailster.smtp.core.auth.AuthenticationHandler;
import org.mailster.smtp.core.auth.impl.DummyAuthenticationHandler;
import org.mailster.smtp.core.commands.AbstractCommand;
/**
* The EHLO command implementation.
*
* @author Ian McFarland <ian@neo.com>
* @author Jon Stevens
* @author De Oliveira Edouard <doe_wanted@yahoo.fr>
*/
public class EhloCommand extends AbstractCommand
{
public EhloCommand()
{
super("EHLO", "The EHLO command posts the client hostname info to the server.\n"+
"This extended version of the HELO command will return hints about\n"+
"the extended commands available on the local server"
, "<hostname>\n hostname = your hostname");
}
@Override
public boolean isAuthRequired()
{
return false;
}
public void execute(String commandString, IoSession ioSession, SMTPContext ctx)
throws IOException
{
String[] args = getArgs(commandString);
if (args.length < 2)
{
sendResponse(ioSession, "501 Syntax: EHLO hostname");
return;
}
// postfix returns...
// 250-server.host.name
// 250-PIPELINING
// 250-SIZE 10240000
// 250-ETRN
// 250 8BITMIME
SMTPState smtpState = ctx.getSMTPState();
StringBuilder response = new StringBuilder();
if (!smtpState.getHasSeenHelo())
{
SMTPServerConfig cfg = ctx.getSMTPServerConfig();
smtpState.setHasSeenHelo(true);
response.append("250-");
response.append(cfg.getHostName());
response.append("\r\n");
response.append("250-8BITMIME\r\n");
if (cfg.isTLSSupported() &&
getCommandHandler().containsCommand("STARTTLS"))
{
response.append("250-STARTTLS\r\n");
}
if (getCommandHandler().containsCommand(AuthCommand.VERB))
{
getEhloString(ctx.getAuthenticationHandler(), response);
}
response.append("250 Ok");
}
else
{
String remoteHost = args[1];
response.append("503 ");
response.append(remoteHost);
response.append(" Duplicate EHLO");
}
sendResponse(ioSession, response.toString());
}
private void getEhloString(AuthenticationHandler handler, StringBuilder sb)
{
if (!(handler instanceof DummyAuthenticationHandler))
{
sb.append("250-").append(AuthCommand.VERB).append(' ');
getTokenizedString(sb, handler.getAuthenticationMechanisms(), " ");
sb.append("\r\n");
}
}
}