1/* 2 * Copyright 2008 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package org.mockftpserver.fake.command 17 18import org.mockftpserver.core.command.Command 19import org.mockftpserver.core.command.CommandHandler 20import org.mockftpserver.core.command.CommandNames 21import org.mockftpserver.core.command.ReplyCodes 22import org.mockftpserver.core.session.SessionKeys 23import org.mockftpserver.fake.UserAccount 24 25/** 26 * Tests for PassCommandHandler 27 * 28 * @version $Revision$ - $Date$ 29 * 30 * @author Chris Mair 31 */ 32class PassCommandHandlerTest extends AbstractFakeCommandHandlerTest { 33 34 def USERNAME = "user123" 35 def PASSWORD = "password123" 36 def HOME_DIRECTORY = "/" 37 UserAccount userAccount 38 39 boolean testNotLoggedIn = false 40 41 void testHandleCommand_UserExists_PasswordCorrect() { 42 serverConfiguration.userAccounts[USERNAME] = userAccount 43 handleCommand([PASSWORD]) 44 assertSessionReply(ReplyCodes.PASS_OK, 'pass') 45 assertUserAccountInSession(true) 46 assertCurrentDirectory(HOME_DIRECTORY) 47 } 48 49 void testHandleCommand_UserExists_PasswordCorrect_AccountRequired() { 50 serverConfiguration.userAccounts[USERNAME] = userAccount 51 userAccount.accountRequiredForLogin = true 52 handleCommand([PASSWORD]) 53 assertSessionReply(ReplyCodes.PASS_NEED_ACCOUNT, 'pass.needAccount') 54 assertUserAccountInSession(true) 55 assertCurrentDirectory(HOME_DIRECTORY) 56 } 57 58 void testHandleCommand_UserExists_PasswordIncorrect() { 59 serverConfiguration.userAccounts[USERNAME] = userAccount 60 handleCommand(["wrong"]) 61 assertSessionReply(ReplyCodes.PASS_LOG_IN_FAILED, 'pass.loginFailed') 62 assertUserAccountInSession(false) 63 assertCurrentDirectory(null) 64 } 65 66 void testHandleCommand_UserExists_PasswordWrongButIgnored() { 67 userAccount.passwordCheckedDuringValidation = false 68 serverConfiguration.userAccounts[USERNAME] = userAccount 69 handleCommand(["wrong"]) 70 assertSessionReply(ReplyCodes.PASS_OK, 'pass') 71 assertUserAccountInSession(true) 72 assertCurrentDirectory(HOME_DIRECTORY) 73 } 74 75 void testHandleCommand_UserExists_HomeDirectoryNotDefinedForUserAccount() { 76 userAccount.homeDirectory = '' 77 serverConfiguration.userAccounts[USERNAME] = userAccount 78 handleCommand([PASSWORD]) 79 assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.userAccountNotValid") 80 assertUserAccountInSession(false) 81 assertCurrentDirectory(null) 82 } 83 84 void testHandleCommand_UserExists_HomeDirectoryDoesNotExist() { 85 userAccount.homeDirectory = '/abc/def' 86 serverConfiguration.userAccounts[USERNAME] = userAccount 87 handleCommand([PASSWORD]) 88 assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.homeDirectoryNotValid") 89 assertUserAccountInSession(false) 90 assertCurrentDirectory(null) 91 } 92 93 void testHandleCommand_UserDoesNotExist() { 94 handleCommand([PASSWORD]) 95 assertSessionReply(ReplyCodes.USER_ACCOUNT_NOT_VALID, "login.userAccountNotValid") 96 assertUserAccountInSession(false) 97 assertCurrentDirectory(null) 98 } 99 100 void testHandleCommand_UsernameNotSetInSession() { 101 session.removeAttribute(SessionKeys.USERNAME) 102 testHandleCommand_MissingRequiredSessionAttribute() 103 assertUserAccountInSession(false) 104 assertCurrentDirectory(null) 105 } 106 107 void testHandleCommand_MissingPasswordParameter() { 108 testHandleCommand_MissingRequiredParameter([]) 109 assertUserAccountInSession(false) 110 assertCurrentDirectory(null) 111 } 112 113 //------------------------------------------------------------------------- 114 // Abstract and Overridden Methods 115 //------------------------------------------------------------------------- 116 117 void setUp() { 118 super.setUp() 119 120 createDirectory(HOME_DIRECTORY) 121 122 userAccount = new UserAccount(USERNAME, PASSWORD, HOME_DIRECTORY) 123 124 session.setAttribute(SessionKeys.USERNAME, USERNAME) 125 session.removeAttribute(SessionKeys.USER_ACCOUNT) 126 } 127 128 CommandHandler createCommandHandler() { 129 new PassCommandHandler() 130 } 131 132 Command createValidCommand() { 133 return new Command(CommandNames.PASS, [PASSWORD]) 134 } 135 136 //------------------------------------------------------------------------- 137 // Helper Methods 138 //------------------------------------------------------------------------- 139 140 /** 141 * Assert that the UserAccount object is in the session, depending on the value of isUserAccountInSession. 142 * @param isUserAccountInSession - true if the UserAccount is expected in the session; false if it is not expected 143 */ 144 private void assertUserAccountInSession(boolean isUserAccountInSession) { 145 def expectedValue = isUserAccountInSession ? userAccount : null 146 assert session.getAttribute(SessionKeys.USER_ACCOUNT) == expectedValue 147 } 148 149 /** 150 * Assert that the current directory is set in the session, but only if currentDirectory is not null. 151 * @param currentDirectory - the curent directory expected in the session; null if it is not expected 152 */ 153 private void assertCurrentDirectory(String currentDirectory) { 154 assert session.getAttribute(SessionKeys.CURRENT_DIRECTORY) == currentDirectory 155 } 156}