package ftp.service; import org.apache.commons.logging.LogFactory; import org.apache.ftpserver.ftplet.Authority; import org.apache.ftpserver.ftplet.AuthorizationRequest; import org.apache.ftpserver.ftplet.User; import org.apache.ftpserver.usermanager.impl.ConcurrentLoginPermission; import org.apache.ftpserver.usermanager.impl.TransferRatePermission; import org.apache.ftpserver.usermanager.impl.WritePermission; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @Entity @Table(name = "FTP_USER") public class FtpUser implements User { @Transient private List<Authority> adminAuthorities = Collections.singletonList(new WritePermission()); @Transient private List<Authority> anonAuthorities = Arrays.asList( new ConcurrentLoginPermission(20, 2), new TransferRatePermission(4800, 4800)); @Id private String username; private String workspace; // users in the same workspace will be able to share the same file system private boolean admin; private String password; private int maxIdleTime = 0; // no limit private boolean enabled; FtpUser() { } public FtpUser(String ws, String username, String password, boolean admin) { this(ws, username, password, admin, 0, true); } public FtpUser(String workspace, String username, String password, boolean admin, int maxIdleTime, boolean enabled) { this.username = username; this.workspace = workspace; this.admin = admin; this.password = password; this.maxIdleTime = maxIdleTime; this.enabled = enabled; } @Override public String toString() { final StringBuilder sb = new StringBuilder("FtpUser{"); sb.append("adminAuthorities=").append(adminAuthorities); sb.append(", anonAuthorities=").append(anonAuthorities); sb.append(", username='").append(username).append('\''); sb.append(", workspace='").append(workspace).append('\''); sb.append(", admin=").append(admin); sb.append(", password='").append(password).append('\''); sb.append(", maxIdleTime=").append(maxIdleTime); sb.append(", enabled=").append(enabled); sb.append('}'); return sb.toString(); } public String getWorkspace() { return workspace; } @Override public String getName() { return this.username; } @Override public String getPassword() { return this.password; } @Override public List<Authority> getAuthorities() { List<Authority> authorities = new ArrayList<>(); authorities.addAll(this.anonAuthorities); if (this.admin) { authorities.addAll(this.adminAuthorities); } return authorities; } @Override public List<Authority> getAuthorities(Class<? extends Authority> aClass) { return this.getAuthorities().stream() .filter(a -> a.getClass().equals(aClass)) .collect(Collectors.toList()); } @Override public AuthorizationRequest authorize(AuthorizationRequest authorizationRequest) { return this.getAuthorities() .stream() .filter(a -> a.canAuthorize(authorizationRequest)) .map(a -> a.authorize(authorizationRequest)) .filter(a -> a != null) .findFirst() .orElse(null); } @Override public int getMaxIdleTime() { return this.maxIdleTime; } @Override public boolean getEnabled() { return this.enabled; } @Override public String getHomeDirectory() { String homeDir = FtpUserManager.getHomeDirectory(this.username) .getAbsolutePath(); LogFactory.getLog(getClass()).info("home-directory: " + homeDir); return homeDir; } }