/** * */ package fr.cedrik.email.pop3.commands; import java.io.IOException; import java.util.Iterator; import org.apache.commons.lang3.StringUtils; import fr.cedrik.email.MessagesMetaData; import fr.cedrik.email.pop3.Context; import fr.cedrik.email.pop3.POP3Command; import fr.cedrik.email.pop3.ResponseStatus; import fr.cedrik.email.pop3.State; import fr.cedrik.util.IteratorChain; /** * @author Cédrik LIME */ public class PASS extends BasePOP3Command implements POP3Command { public PASS() { } @Override public boolean isValid(Context context) { return context.state == State.AUTHORIZATION && StringUtils.isNotBlank(context.userName); } @Override public State nextState(Context context) { return (StringUtils.isBlank(context.userName) || StringUtils.isBlank(context.userPassword)) ? State.AUTHORIZATION : State.TRANSACTION; } @Override public Iterator<String> call(Context context) throws IOException { if (StringUtils.isBlank(context.inputArgs)) { return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("[AUTH] empty passwords are not allowed")); } if (StringUtils.isBlank(context.userName)) { return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("[SYS/TEMP] must call USER first")); } if (context.isLocked()) { logger.warn("An attempt was made to authenticate the locked user \"{}\"", context.userName); context.userName = null; return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("[AUTH] user is locked")); } context.userPassword = context.inputArgs; if (context.remoteSession.login(context.userName, context.userPassword)) { context.registerAuthSuccess(); context.state = nextState(context); String quotaMessage = ""; { MessagesMetaData<?> messages = context.remoteSession.getMessagesMetaData(0); if (messages.ignorequota == 0 && messages.sizelimit > 0) { if (messages.dbsize >= messages.sizelimit || messages.currentusage >= messages.sizelimit) { quotaMessage = ". WARNING WARNING: you have exceeded your quota! Run QUOTA command for more information."; } else if (messages.dbsize > messages.warning || messages.currentusage > messages.warning) { quotaMessage = ". WARNING: you are nearing your quota. Run QUOTA command for more information."; } } } return new IteratorChain<String>(ResponseStatus.POSITIVE.toString("welcome, " + context.userName + quotaMessage)); } else { context.registerAuthFailure(); context.userPassword = null; return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("[AUTH] invalid user or password")); } } }