1a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair/* 2a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Copyright 2008 the original author or authors. 3a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 4a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * you may not use this file except in compliance with the License. 6a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * You may obtain a copy of the License at 7a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 8a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * http://www.apache.org/licenses/LICENSE-2.0 9a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 10a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Unless required by applicable law or agreed to in writing, software 11a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * distributed under the License is distributed on an "AS IS" BASIS, 12a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * See the License for the specific language governing permissions and 14a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * limitations under the License. 15a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 16a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairpackage org.mockftpserver.fake; 17a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 18a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport org.mockftpserver.core.util.Assert; 19a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport org.mockftpserver.fake.filesystem.FileSystemEntry; 20a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport org.mockftpserver.fake.filesystem.Permissions; 21a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 22a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairimport java.util.List; 23a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 24a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair/** 25a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Represents a single user account on the server, including the username, password, home 26a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * directory, list of groups to which this user belongs, and default permissions applied to 27a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * newly-created files and directories. 28a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <p/> 29a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * The <code>username</code> and <code>homeDirectory</code> property must be non-null 30a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * and non-empty. The <code>homeDirectory</code> property must also match the name of an existing 31a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * directory within the file system configured for the <code>FakeFtpServer</code>. 32a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <p/> 33a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * The group name applied to newly created files/directories is determined by the <code>groups</code> property. 34a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * If null or empty, then the default group name ("users") is used. Otherwise, the first value in the 35a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <code>groups</code> List is used. The <code>groups</code> property defaults to an empty List. 36a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <p/> 37a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * The default value for <code>defaultPermissionsForNewFile</code> is read and write permissions for 38a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * all (user/group/world). The default value for <code>defaultPermissionsForNewDirectory</code> is read, 39a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * write and execute permissions for all (user/group/world). 40a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <p/> 41a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * The <code>isValidPassword()</code> method returns true if the specified password matches 42a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * the password value configured for this user account. This implementation uses the 43a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <code>isEquals()</code> method to compare passwords. 44a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <p/> 45a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * If you want to provide a custom comparison, for instance using encrypted passwords, you can 46a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * subclass this class and override the <code>comparePassword()</code> method to provide your own 47a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * custom implementation. 48a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <p/> 49a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * If the <code>passwordCheckedDuringValidation</code> property is set to false, then the password 50a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * value is ignored, and the <code>isValidPassword()</code> method just returns <code<true</code>. 51a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <p/> 52a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * The <code>accountRequiredForLogin</code> property defaults to false. If it is set to true, then 53a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * it is expected that the login for this account will require an ACCOUNT (ACCT) command after the 54a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * PASSWORD (PASS) command is completed. 55a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 56a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairpublic class UserAccount { 57a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 58a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public static final String DEFAULT_USER = "system"; 59a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public static final String DEFAULT_GROUP = "users"; 60a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public static final Permissions DEFAULT_PERMISSIONS_FOR_NEW_FILE = new Permissions("rw-rw-rw-"); 61a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public static final Permissions DEFAULT_PERMISSIONS_FOR_NEW_DIRECTORY = Permissions.ALL; 62a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 63a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private String username; 64a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private String password; 65a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private String homeDirectory; 66a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private List groups; 67a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private boolean passwordRequiredForLogin = true; 68a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private boolean passwordCheckedDuringValidation = true; 69a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private boolean accountRequiredForLogin = false; 70a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private Permissions defaultPermissionsForNewFile = DEFAULT_PERMISSIONS_FOR_NEW_FILE; 71a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair private Permissions defaultPermissionsForNewDirectory = DEFAULT_PERMISSIONS_FOR_NEW_DIRECTORY; 72a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 73a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 74a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 75a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Construct a new uninitialized instance. 76a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 77a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public UserAccount() { 78a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 79a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 80a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 81a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Construct a new initialized instance. 82a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 83a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param username - the user name 84a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param password - the password 85a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param homeDirectory - the home directory 86a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 87a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public UserAccount(String username, String password, String homeDirectory) { 88a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair setUsername(username); 89a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair setPassword(password); 90a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair setHomeDirectory(homeDirectory); 91a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 92a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 93a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public String getUsername() { 94a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return username; 95a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 96a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 97a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setUsername(String username) { 98a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.username = username; 99a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 100a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 101a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public String getPassword() { 102a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return password; 103a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 104a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 105a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setPassword(String password) { 106a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.password = password; 107a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 108a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 109a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public String getHomeDirectory() { 110a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return homeDirectory; 111a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 112a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 113a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setHomeDirectory(String homeDirectory) { 114a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.homeDirectory = homeDirectory; 115a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 116a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 117a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public List getGroups() { 118a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return groups; 119a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 120a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 121a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setGroups(List groups) { 122a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.groups = groups; 123a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 124a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 125a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public boolean isPasswordRequiredForLogin() { 126a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return passwordRequiredForLogin; 127a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 128a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 129a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setPasswordRequiredForLogin(boolean passwordRequiredForLogin) { 130a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.passwordRequiredForLogin = passwordRequiredForLogin; 131a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 132a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 133a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public boolean isPasswordCheckedDuringValidation() { 134a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return passwordCheckedDuringValidation; 135a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 136a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 137a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setPasswordCheckedDuringValidation(boolean passwordCheckedDuringValidation) { 138a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.passwordCheckedDuringValidation = passwordCheckedDuringValidation; 139a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 140a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 141a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public boolean isAccountRequiredForLogin() { 142a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return accountRequiredForLogin; 143a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 144a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 145a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setAccountRequiredForLogin(boolean accountRequiredForLogin) { 146a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.accountRequiredForLogin = accountRequiredForLogin; 147a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 148a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 149a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public Permissions getDefaultPermissionsForNewFile() { 150a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return defaultPermissionsForNewFile; 151a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 152a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 153a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setDefaultPermissionsForNewFile(Permissions defaultPermissionsForNewFile) { 154a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.defaultPermissionsForNewFile = defaultPermissionsForNewFile; 155a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 156a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 157a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public Permissions getDefaultPermissionsForNewDirectory() { 158a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return defaultPermissionsForNewDirectory; 159a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 160a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 161a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public void setDefaultPermissionsForNewDirectory(Permissions defaultPermissionsForNewDirectory) { 162a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.defaultPermissionsForNewDirectory = defaultPermissionsForNewDirectory; 163a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 164a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 165a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 166a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return the name of the primary group to which this user belongs. If this account has no associated 167a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * groups set, then this method returns the <code>DEFAULT_GROUP</code>. Otherwise, this method 168a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * returns the first group name in the <code>groups</code> list. 169a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 170a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return the name of the primary group for this user 171a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 172a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public String getPrimaryGroup() { 173a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return (groups == null || groups.isEmpty()) ? DEFAULT_GROUP : (String) groups.get(0); 174a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 175a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 176a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 177a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return true if the specified password is the correct, valid password for this user account. 178a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * This implementation uses standard (case-sensitive) String comparison. Subclasses can provide 179a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * custom comparison behavior, for instance using encrypted password values, by overriding this 180a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * method. 181a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 182a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param password - the password to compare against the configured value 183a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if the password is correct and valid 184a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @throws org.mockftpserver.core.util.AssertFailedException 185a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * - if the username property is null 186a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 187a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public boolean isValidPassword(String password) { 188a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair Assert.notNullOrEmpty(username, "username"); 189a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return !passwordCheckedDuringValidation || comparePassword(password); 190a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 191a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 192a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 193a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if this UserAccount object is valid; i.e. if the homeDirectory is non-null and non-empty. 194a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 195a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public boolean isValid() { 196a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return homeDirectory != null && homeDirectory.length() > 0; 197a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 198a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 199a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 200a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return the String representation of this object 201a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 202a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public String toString() { 203a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return "UserAccount[username=" + username + "; password=" + password + "; homeDirectory=" 204a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair + homeDirectory + "; passwordRequiredForLogin=" + passwordRequiredForLogin + "]"; 205a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 206a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 207a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 208a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return true if this user has read access to the file/directory represented by the specified FileSystemEntry object. 209a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 210a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param entry - the FileSystemEntry representing the file or directory 211a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if this use has read access 212a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 213a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public boolean canRead(FileSystemEntry entry) { 214a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair Permissions permissions = entry.getPermissions(); 215a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (permissions == null) { 216a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return true; 217a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 218a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 219a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (equalOrBothNull(username, entry.getOwner())) { 220a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canUserRead(); 221a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 222a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (groups != null && groups.contains(entry.getGroup())) { 223a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canGroupRead(); 224a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 225a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canWorldRead(); 226a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 227a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 228a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 229a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return true if this user has write access to the file/directory represented by the specified FileSystemEntry object. 230a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 231a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param entry - the FileSystemEntry representing the file or directory 232a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if this use has write access 233a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 234a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public boolean canWrite(FileSystemEntry entry) { 235a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair Permissions permissions = entry.getPermissions(); 236a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (permissions == null) { 237a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return true; 238a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 239a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 240a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (equalOrBothNull(username, entry.getOwner())) { 241a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canUserWrite(); 242a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 243a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (groups != null && groups.contains(entry.getGroup())) { 244a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canGroupWrite(); 245a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 246a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canWorldWrite(); 247a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 248a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 249a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 250a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return true if this user has execute access to the file/directory represented by the specified FileSystemEntry object. 251a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 252a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param entry - the FileSystemEntry representing the file or directory 253a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if this use has execute access 254a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 255a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public boolean canExecute(FileSystemEntry entry) { 256a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair Permissions permissions = entry.getPermissions(); 257a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (permissions == null) { 258a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return true; 259a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 260a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 261a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (equalOrBothNull(username, entry.getOwner())) { 262a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canUserExecute(); 263a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 264a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair if (groups != null && groups.contains(entry.getGroup())) { 265a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canGroupExecute(); 266a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 267a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return permissions.canWorldExecute(); 268a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 269a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 270a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 271a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return true if the specified password matches the password configured for this user account. 272a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * This implementation uses standard (case-sensitive) String comparison. Subclasses can provide 273a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * custom comparison behavior, for instance using encrypted password values, by overriding this 274a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * method. 275a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 276a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param password - the password to compare against the configured value 277a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if the passwords match 278a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 279a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair protected boolean comparePassword(String password) { 280a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return password != null && password.equals(this.password); 281a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 282a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 283a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 284a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return true only if both Strings are null or they are equal (have the same contents). 285a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 286a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param string1 - the first String 287a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param string2 - the second String 288a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if both are null or both are equal 289a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 290a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair protected boolean equalOrBothNull(String string1, String string2) { 291a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return (string1 == null && string2 == null) || (string1 != null && string1.equals(string2)); 292a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 293a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 294a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair}