diff options
author | Nils Schwabe | 2014-04-23 15:00:19 +0200 |
---|---|---|
committer | Nils Schwabe | 2014-04-23 15:00:19 +0200 |
commit | ed9dca193a8ad68681393ea79c96bc84b6444639 (patch) | |
tree | 9533c1764de6864b8f8087995799d059072daf2c /src/main/java/org/openslx/imagemaster/server | |
parent | Fixed something (diff) | |
download | masterserver-ed9dca193a8ad68681393ea79c96bc84b6444639.tar.gz masterserver-ed9dca193a8ad68681393ea79c96bc84b6444639.tar.xz masterserver-ed9dca193a8ad68681393ea79c96bc84b6444639.zip |
Fix some issues with FtpCredentialsScheduler
Add some options to config file
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/server')
4 files changed, 137 insertions, 80 deletions
diff --git a/src/main/java/org/openslx/imagemaster/server/ApiServer.java b/src/main/java/org/openslx/imagemaster/server/ApiServer.java index df0aa3a..f4511fe 100644 --- a/src/main/java/org/openslx/imagemaster/server/ApiServer.java +++ b/src/main/java/org/openslx/imagemaster/server/ApiServer.java @@ -170,7 +170,7 @@ public class ApiServer { // process the image String username = Globals.ftpServer.getCredentialsFromSessionId(serverSessionId).username; - File userDirectory = new File(Globals.properties.getProperty(Globals.ftpBaseDir) + "/" + username); + File userDirectory = new File(Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username); File[] list = userDirectory.listFiles(); if (list.length != 1) return false; diff --git a/src/main/java/org/openslx/imagemaster/server/FtpCredentialsScheduler.java b/src/main/java/org/openslx/imagemaster/server/FtpCredentialsScheduler.java new file mode 100644 index 0000000..88e70f8 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/server/FtpCredentialsScheduler.java @@ -0,0 +1,62 @@ +package org.openslx.imagemaster.server; + +import java.io.File; +import java.util.Date; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import org.apache.log4j.Logger; +import org.openslx.imagemaster.Globals; +import org.openslx.imagemaster.thrift.iface.FtpCredentials; +import org.openslx.imagemaster.util.Util; + +public class FtpCredentialsScheduler extends TimerTask +{ + private static Logger log = Logger.getLogger( FtpCredentialsScheduler.class ); + + public static final long timeout = Long.valueOf( Globals.getPropertyInt( Globals.PropInt.FTPTIMEOUT ) ) * 60L * 1000L; // timeout in ms + + @Override + public void run() + { + // check all folders + for ( Map.Entry<String, FtpCredentials> entry : Globals.ftpServer.users.entrySet() ) { + String sessionId = entry.getKey(); + String username = entry.getValue().username; + File dir = new File( Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username ); + if ( !dir.exists() ) + continue; + File[] list = dir.listFiles(); + if ( list.length == 1 ) { + if ( ( new Date().getTime() - list[0].lastModified() ) >= timeout ) { + log.info(username + "'s files are too old. Deleting him and his folder."); + Util.deleteFolder( dir ); + Globals.ftpServer.removeUser( sessionId ); + } + } else if ( list.length > 1 ) { + log.info( username + " uploaded too many files. Deleting his account and his folder." ); + Util.deleteFolder( dir ); + Globals.ftpServer.removeUser( sessionId ); + } else { + // check the creation time of the user + if ( ( new Date().getTime() - Globals.ftpServer.timeouts.get( username ).getTime() ) >= timeout ) { + // remove user and his folder + Util.deleteFolder( dir ); + Globals.ftpServer.removeUser( sessionId ); + log.info( username + " did nothing for too long. Deleting him and his folder" ); + } + } + } + //TODO: remove image from process list + } + + public static void startScheduling() + { + Timer timer = new Timer(); + + // start timer now and fire every 60 seconds + timer.schedule( new FtpCredentialsScheduler(), 0, 60000 ); + } + +} diff --git a/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java b/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java index d1ec14f..5f5dd79 100644 --- a/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java +++ b/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java @@ -22,7 +22,9 @@ import org.openslx.imagemaster.Globals; import org.openslx.imagemaster.thrift.iface.FtpCredentials; import org.openslx.imagemaster.util.RandomString; -public class MasterFtpServer implements Runnable { +public class MasterFtpServer implements Runnable +{ + private static Logger log = Logger.getLogger( MasterFtpServer.class ); private FtpServer server; private UserManager userManager; @@ -30,96 +32,105 @@ public class MasterFtpServer implements Runnable { public final HashMap<String, FtpCredentials> users = new HashMap<>(); // key: ftpUsername, value: createTime public final HashMap<String, Date> timeouts = new HashMap<>(); - - public MasterFtpServer(int port, String adminUsername, String adminPassword, String ftproot) { + private boolean ini = false; + + public void init(int port) + { + if (ini) return; + FtpServerFactory serverFactory = new FtpServerFactory(); ListenerFactory factory = new ListenerFactory(); // set the port of the listener - factory.setPort(port); - + factory.setPort( port ); + // replace the default listener - serverFactory.addListener("default", factory.createListener()); - + serverFactory.addListener( "default", factory.createListener() ); + // create user manager - PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); - userManagerFactory.setFile(new File("src/main/properties/ftp.properties")); - userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor()); - userManager = userManagerFactory.createUserManager(); - + PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); + userManagerFactory.setFile( new File( "src/main/properties/ftp.properties" ) ); + userManagerFactory.setPasswordEncryptor( new SaltedPasswordEncryptor() ); + userManager = userManagerFactory.createUserManager(); + // create new admin user - //addUser(adminUsername, adminPassword, ftproot, true); - serverFactory.setUserManager(userManager); - + //addUser(adminUsername, adminPassword, ftproot, true); + serverFactory.setUserManager( userManager ); + // add the Ftplet HashMap<String, Ftplet> map = new HashMap<String, Ftplet>(); - map.put("Ftplet1", new MasterFtplet()); - serverFactory.setFtplets(map); - + map.put( "Ftplet1", new MasterFtplet() ); + serverFactory.setFtplets( map ); + // start the server server = serverFactory.createServer(); } - public FtpCredentials addUser(final String serverSessionId) { - // TODO: enable SSL - + public FtpCredentials addUser( final String serverSessionId ) + { + // TODO: enable SSL + FtpCredentials ftpCredentials = null; - - String generatedUser = RandomString.generate(10, false); - String generatedPass = RandomString.generate(16, true); - - String dir = Globals.properties.getProperty(Globals.ftpBaseDir) + "/" + + String generatedUser = RandomString.generate( 10, false ); + String generatedPass = RandomString.generate( 16, true ); + + String dir = Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + generatedUser + "/"; - - if (!new File(dir).mkdir()) { + + if ( !new File( dir ).mkdir() ) { return ftpCredentials; } - BaseUser user = new BaseUser(); - user.setName(generatedUser); - user.setPassword(generatedPass); - user.setHomeDirectory(dir); - - List<Authority> authorities = new ArrayList<Authority>(); - authorities.add(new WritePermission()); - user.setAuthorities(authorities); - - try { - userManager.save(user); - ftpCredentials = new FtpCredentials(generatedUser, generatedPass); - users.put(serverSessionId, ftpCredentials); - timeouts.put(ftpCredentials.username, new Date()); - } catch (FtpException e) { - } - - log.info("Generated user/pass: " + generatedUser + "\t" - + generatedPass + "\n with home dir: " + dir); - - return ftpCredentials; + BaseUser user = new BaseUser(); + user.setName( generatedUser ); + user.setPassword( generatedPass ); + user.setHomeDirectory( dir ); + + List<Authority> authorities = new ArrayList<Authority>(); + authorities.add( new WritePermission() ); + user.setAuthorities( authorities ); + + try { + userManager.save( user ); + ftpCredentials = new FtpCredentials( generatedUser, generatedPass ); + users.put( serverSessionId, ftpCredentials ); + timeouts.put( ftpCredentials.username, new Date() ); + } catch ( FtpException e ) { + } + + log.info( "Generated user/pass: " + generatedUser + "\t" + + generatedPass + "\n with home dir: " + dir ); + + return ftpCredentials; } - - public boolean removeUser(final String serverSessionId) { - if (!users.containsKey(serverSessionId)) return false; - + + public boolean removeUser( final String serverSessionId ) + { + if ( !users.containsKey( serverSessionId ) ) + return false; + try { - userManager.delete(users.get(serverSessionId).username); + userManager.delete( users.get( serverSessionId ).username ); // remove user from both maps - timeouts.remove(users.remove(serverSessionId).username); + timeouts.remove( users.remove( serverSessionId ).username ); return true; - } catch (FtpException e) { + } catch ( FtpException e ) { return false; } } - - public FtpCredentials getCredentialsFromSessionId(String serverSessionId) { - return users.get(serverSessionId); + + public FtpCredentials getCredentialsFromSessionId( String serverSessionId ) + { + return users.get( serverSessionId ); } @Override - public void run() { + public void run() + { try { log.info( "Starting FTP Sever" ); server.start(); - } catch (FtpException e1) { + } catch ( FtpException e1 ) { e1.printStackTrace(); } } diff --git a/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java b/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java index 479729d..559197c 100644 --- a/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java +++ b/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java @@ -9,17 +9,14 @@ import org.apache.ftpserver.ftplet.FtpSession; import org.apache.ftpserver.ftplet.Ftplet; import org.apache.ftpserver.ftplet.FtpletContext; import org.apache.ftpserver.ftplet.FtpletResult; -import org.apache.ftpserver.ftplet.UserManager; import org.apache.log4j.Logger; -import org.openslx.imagemaster.db.ImageProcessor; public class MasterFtplet implements Ftplet { private static Logger log = Logger.getLogger(Ftplet.class); - private UserManager userManager; @Override public void init(FtpletContext ftpletContext) throws FtpException { - userManager = ftpletContext.getUserManager(); + // not used } @Override @@ -39,20 +36,7 @@ public class MasterFtplet implements Ftplet { @Override public FtpletResult afterCommand(FtpSession session, FtpRequest request, FtpReply reply) throws FtpException, IOException { - if (session.getUser() != null) { - String username = session.getUser().getName(); - String command = request.getRequestLine(); - log.info(username + " is done with command: " + command); - if (request.getCommand().equals("STOR")) { - try { - userManager.delete(username); - } catch (FtpException e) { - } finally { - log.info("Stored file and deleted user: '" + username + "'"); - ImageProcessor.processImageAfterUpload(username, command.split(" ")[1]); - } - } - } + // not used return null; } |