in protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java [139:213]
private Response doMAILFilter(SMTPSession session, String argument) {
String sender = null;
if ((argument != null) && (argument.indexOf(":") > 0)) {
int colonIndex = argument.indexOf(":");
sender = argument.substring(colonIndex + 1);
argument = argument.substring(0, colonIndex);
}
if (session.getAttachment(SMTPSession.SENDER, State.Transaction).isPresent()) {
return SENDER_ALREADY_SPECIFIED;
} else if (!session.getAttachment(
SMTPSession.CURRENT_HELO_MODE, State.Connection).isPresent()
&& session.getConfiguration().useHeloEhloEnforcement()) {
return EHLO_HELO_NEEDED;
} else if (argument == null
|| !argument.toUpperCase(Locale.US).equals("FROM")
|| sender == null) {
return SYNTAX_ERROR_ARG;
} else {
sender = sender.trim();
// the next gt after the first lt ... AUTH may add more <>
int lastChar = sender.indexOf('>', sender.indexOf('<'));
// Check to see if any options are present and, if so, whether they
// are correctly formatted
// (separated from the closing angle bracket by a ' ').
if ((lastChar > 0) && (sender.length() > lastChar + 2)
&& (sender.charAt(lastChar + 1) == ' ')) {
String mailOptionString = sender.substring(lastChar + 2);
// Remove the options from the sender
sender = sender.substring(0, lastChar + 1);
StringTokenizer optionTokenizer = new StringTokenizer(
mailOptionString, " ");
while (optionTokenizer.hasMoreElements()) {
String mailOption = optionTokenizer.nextToken();
int equalIndex = mailOption.indexOf('=');
String mailOptionName = mailOption;
String mailOptionValue = "";
if (equalIndex > 0) {
mailOptionName = mailOption.substring(0, equalIndex)
.toUpperCase(Locale.US);
mailOptionValue = mailOption.substring(equalIndex + 1);
}
// Handle the SIZE extension keyword
if (paramHooks.containsKey(mailOptionName)) {
MailParametersHook hook = paramHooks.get(mailOptionName);
SMTPResponse res = calcDefaultSMTPResponse(hook.doMailParameter(session, mailOptionName, mailOptionValue));
if (res != null) {
return res;
}
} else {
// Unexpected option attached to the Mail command
LOGGER.debug("MAIL command had unrecognized/unexpected option {} with value {}", mailOptionName, mailOptionValue);
}
}
}
if (session.getConfiguration().useAddressBracketsEnforcement()
&& (!sender.startsWith("<") || !sender.endsWith(">"))) {
LOGGER.info("Error parsing sender address: {}: did not start and end with < >", sender);
return SYNTAX_ERROR;
}
try {
MaybeSender senderAddress = toMaybeSender(removeBrackets(sender));
// Store the senderAddress in session map
session.setAttachment(SMTPSession.SENDER, senderAddress, State.Transaction);
} catch (Exception pe) {
LOGGER.info("Error parsing sender address: {}", sender, pe);
return SYNTAX_ERROR_ADDRESS;
}
}
return null;
}