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