14bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair/*
24bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Copyright 2007 the original author or authors.
34bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
44bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Licensed under the Apache License, Version 2.0 (the "License");
54bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * you may not use this file except in compliance with the License.
64bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * You may obtain a copy of the License at
74bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
84bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *      http://www.apache.org/licenses/LICENSE-2.0
94bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
104bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Unless required by applicable law or agreed to in writing, software
114bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * distributed under the License is distributed on an "AS IS" BASIS,
124bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * See the License for the specific language governing permissions and
144bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * limitations under the License.
154bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */
164bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairpackage org.mockftpserver.stub.command;
174bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
184bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.util.ArrayList;
194bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.util.List;
204bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
214bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.command.Command;
224bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.command.CommandHandler;
234bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.command.InvocationRecord;
244bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.command.ReplyCodes;
254bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.session.Session;
264bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
274bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair/**
284bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * CommandHandler for the USER command. The <code>passwordRequired</code> property defaults to true,
294bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * indicating that a password is required following the user name. If true, this command handler
304bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * returns a reply of 331. If false, return a reply of 230.
314bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * <p>
324bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Each invocation record stored by this CommandHandler includes the following data element key/values:
334bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * <ul>
344bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *    <li>{@link #USERNAME_KEY} ("username") - the user name submitted on the invocation (the first command parameter)
354bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * </ul>
364bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
374bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @version $Revision$ - $Date$
384bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
394bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @author Chris Mair
404bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */
414bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairpublic final class UserCommandHandler extends AbstractStubCommandHandler implements CommandHandler {
424bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
434bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public static final String USERNAME_KEY = "username";
444bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
454bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    private boolean passwordRequired = true;
464bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    private List usernames = new ArrayList();
474bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
484bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
494bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Constructor.
504bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
514bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public UserCommandHandler() {
524bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        // Do not initialize replyCode -- will be set dynamically
534bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
544bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
554bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
564bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @see org.mockftpserver.core.command.CommandHandler#handleCommand(Command, Session, InvocationRecord)
574bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
584bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
594bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        usernames.add(command.getRequiredString(0));
604bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        invocationRecord.set(USERNAME_KEY, command.getRequiredString(0));
614bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
624bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        // Only use dynamic reply code if the replyCode property was NOT explicitly set
634bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        if (replyCode == 0) {
644bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair            int code = (passwordRequired) ? ReplyCodes.USER_NEED_PASSWORD_OK : ReplyCodes.USER_LOGGED_IN_OK;
654bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair            sendReply(session, code, replyMessageKey, replyText, null);
664bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        }
674bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        else {
684bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair            sendReply(session);
694bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        }
704bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
714bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
724bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
734bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Return true if a password is required at login. See {@link #setPasswordRequired(boolean)}.
744bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @return the passwordRequired flag
754bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
764bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public boolean isPasswordRequired() {
774bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        return passwordRequired;
784bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
794bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
804bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
814bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Set true to indicate that a password is required. If true, this command handler returns a reply
824bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * of 331. If false, return a reply of 230.
834bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @param passwordRequired - is a password required for login
844bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
854bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public void setPasswordRequired(boolean passwordRequired) {
864bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        this.passwordRequired = passwordRequired;
874bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
884bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
894bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair}
90