summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/ftp
diff options
context:
space:
mode:
authorNils Schwabe2014-06-16 17:42:51 +0200
committerNils Schwabe2014-06-16 17:42:51 +0200
commit09a0f7f6184b680c7e208104d7e8fcacde27a00d (patch)
treeb0ce867cdcb9319e9b69da1419f8c7b427442854 /src/main/java/org/openslx/imagemaster/ftp
parentStarted to implement download of images (diff)
downloadmasterserver-09a0f7f6184b680c7e208104d7e8fcacde27a00d.tar.gz
masterserver-09a0f7f6184b680c7e208104d7e8fcacde27a00d.tar.xz
masterserver-09a0f7f6184b680c7e208104d7e8fcacde27a00d.zip
Add FtpUsers are now in sync with DB
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/ftp')
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java4
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java72
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java42
3 files changed, 90 insertions, 28 deletions
diff --git a/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java b/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java
index 8359e5a..20772ff 100644
--- a/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java
+++ b/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java
@@ -6,10 +6,8 @@ import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
-import org.openslx.imagemaster.App;
import org.openslx.imagemaster.Globals;
import org.openslx.imagemaster.Globals.PropInt;
-import org.openslx.imagemaster.db.DbFtpUser;
import org.openslx.imagemaster.db.DbImage;
import org.openslx.imagemaster.db.DbUser;
import org.openslx.imagemaster.thrift.iface.ImageData;
@@ -45,8 +43,6 @@ public class ImageProcessor
DbImage.delete( dbImage.UUID );
log.info( "Deleted dbimage from db: " + dbImage.UUID + " due to timeout");
} else {
- // re add users to ftpserver
- App.ftpServer.addUser( dbImage.ftpUser, DbFtpUser.getUserByName( dbImage.ftpUser ).password, MasterFtpServer.Mode.UPLOADING, "" );
log.info( "Added user '" + dbImage.ftpUser + "' to list again." );
// add image to process list again
diff --git a/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java
index f8b8ca1..8ed64d6 100644
--- a/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java
+++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java
@@ -1,6 +1,7 @@
package org.openslx.imagemaster.ftp;
import java.io.File;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -23,6 +24,7 @@ import org.apache.ftpserver.usermanager.impl.WritePermission;
import org.apache.log4j.Logger;
import org.openslx.imagemaster.Globals;
import org.openslx.imagemaster.Globals.PropString;
+import org.openslx.imagemaster.db.DbFtpUser;
import org.openslx.imagemaster.thrift.iface.FtpCredentials;
import org.openslx.imagemaster.util.RandomString;
import org.openslx.imagemaster.util.Util;
@@ -40,7 +42,18 @@ public class MasterFtpServer implements Runnable
public enum Mode
{
- UPLOADING, DOWNLOADING
+ UPLOADING, DOWNLOADING;
+
+ @Override
+ public String toString() {
+ if (this == UPLOADING) {
+ return "uploading";
+ } else if (this == DOWNLOADING) {
+ return "downloading";
+ } else {
+ return "";
+ }
+ }
}
/**
@@ -54,12 +67,14 @@ public class MasterFtpServer implements Runnable
private final Long createTime;
private final Mode mode;
private final String fileName;
+ private final String serverSessionId;
- public Infos(Long createTime, Mode mode, String fileName)
+ public Infos(Long createTime, Mode mode, String fileName, String serverSessionId)
{
this.createTime = createTime;
this.mode = mode;
this.fileName = fileName;
+ this.serverSessionId = serverSessionId;
}
public Long getCreateTime()
@@ -76,6 +91,10 @@ public class MasterFtpServer implements Runnable
{
return this.fileName;
}
+
+ public String getServerSessionId() {
+ return this.serverSessionId;
+ }
}
public void init( int port )
@@ -125,9 +144,10 @@ public class MasterFtpServer implements Runnable
* @param password
* @param mode
* @param fileName the filename of the file, that is allowed to access (if downloading)
+ * @param add user to db
* @return
*/
- public boolean addUser( String username, String password, Mode mode, String fileName)
+ public boolean addUser( String serverSessionId, String username, String password, Mode mode, String fileName, boolean toDb)
{
String dir = Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username + "/";
@@ -154,8 +174,9 @@ public class MasterFtpServer implements Runnable
try {
userManager.save( user );
synchronized ( users ) {
- users.put( username, new Infos( System.currentTimeMillis(), mode, file) );
-
+ users.put( username, new Infos( System.currentTimeMillis(), mode, file, serverSessionId) );
+ if (toDb)
+ DbFtpUser.addUser( new DbFtpUser( username, password, mode.toString(), fileName, serverSessionId, new Timestamp(System.currentTimeMillis()) ) );
}
} catch ( FtpException e ) {
return false;
@@ -171,8 +192,6 @@ public class MasterFtpServer implements Runnable
String generatedUser = RandomString.generate( 10, false );
String generatedPass = RandomString.generate( 16, true );
- String dir = Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/"
- + generatedUser + "/";
BaseUser user = new BaseUser();
user.setName( generatedUser );
@@ -180,29 +199,32 @@ public class MasterFtpServer implements Runnable
List<Authority> authorities = new ArrayList<Authority>();
String file = "";
+ String dir = "";
if (mode == Mode.UPLOADING) {
- // uploading satellite needs a folder
+ // generate the home dir
+ dir = Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + generatedUser + "/";
if ( !new File( dir ).mkdir() ) {
return null;
}
- user.setHomeDirectory( dir );
// uploading satellite is allowed to write
authorities.add( new WritePermission() );
} else if (mode == Mode.DOWNLOADING) {
// the downloading satellite may access the whole dir, but this is restricted in MasterFtplet
- user.setHomeDirectory( Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) );
+ dir = Globals.getPropertyString( Globals.PropString.FTPBASEDIR );
// downloading satellite is only allowed to read
file = fileName;
}
+ user.setHomeDirectory( dir );
user.setAuthorities( authorities );
try {
userManager.save( user );
ftpCredentials = new FtpCredentials( generatedUser, generatedPass );
synchronized ( users ) {
- users.put( ftpCredentials.username, new Infos( System.currentTimeMillis(), mode, file) );
+ users.put( ftpCredentials.username, new Infos( System.currentTimeMillis(), mode, file, serverSessionId) );
+ DbFtpUser.addUser( new DbFtpUser( generatedUser, generatedPass, mode.toString(), fileName, serverSessionId, new Timestamp(System.currentTimeMillis()) ) );
}
} catch ( FtpException e ) {
// TODO: handle this
@@ -235,6 +257,7 @@ public class MasterFtpServer implements Runnable
// remove user from map (cache)
synchronized ( users ) {
users.remove( username );
+ DbFtpUser.removeUserByName( username );
}
// remove his home dir
File dir = new File( Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username );
@@ -256,4 +279,31 @@ public class MasterFtpServer implements Runnable
e1.printStackTrace();
}
}
+
+ public void addDbFtpUsers()
+ {
+ List<DbFtpUser> list = DbFtpUser.getAllUsers();
+ Iterator<DbFtpUser> iter = list.iterator();
+
+ int n = 0;
+
+ while (iter.hasNext()) {
+ DbFtpUser user = iter.next();
+ Mode mode;
+ if ( user.mode.equalsIgnoreCase( "downloading" ) ) {
+ mode = Mode.DOWNLOADING;
+ } else {
+ mode = Mode.UPLOADING;
+ }
+ // don't readd user if it timeouted
+ if ( (System.currentTimeMillis() - user.timestamp.getTime()) < FtpCredentialsScheduler.timeout ) {
+ this.addUser( user.sessionId, user.username, user.password, mode, user.filename, false );
+ n++;
+ } else {
+ DbFtpUser.removeUserByName( user.username );
+ }
+ }
+
+ log.info( "Added " + n + " FTP users from DB." );
+ }
}
diff --git a/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java
index 31d39dc..ce4a2e6 100644
--- a/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java
+++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java
@@ -1,6 +1,9 @@
package org.openslx.imagemaster.ftp;
import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.FtpReply;
@@ -9,13 +12,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.User;
import org.apache.log4j.Logger;
import org.openslx.imagemaster.App;
+import org.openslx.imagemaster.ftp.MasterFtpServer.Infos;
+import org.openslx.imagemaster.serversession.ServerSessionManager;
public class MasterFtplet implements Ftplet
{
- private static Logger log = Logger.getLogger( Ftplet.class );
+ private static Logger log = Logger.getLogger( MasterFtplet.class );
@Override
public void init( FtpletContext ftpletContext ) throws FtpException
@@ -34,26 +38,36 @@ public class MasterFtplet implements Ftplet
throws FtpException, IOException
{
if ( session.getUser() != null ) {
- log.info( session.getUser().getName() + " issued command: " + request.getRequestLine() );
// check if masterserver is still knowing this user
if (App.ftpServer.users.containsKey( session.getUser().getName() )) {
MasterFtpServer.Infos infos = App.ftpServer.users.get( session.getUser().getName() );
- if (infos.getMode() == MasterFtpServer.Mode.DOWNLOADING) {
- if (request.getCommand() == "RETR") {
+ if (infos.getMode() == MasterFtpServer.Mode.DOWNLOADING) { // filter the downloading clients
+ if (request.getCommand().equals("RETR")) {
// check if user is getting the right file
- if (infos.getFileName() != request.getArgument()) {
- throw new FtpException( "550 File unavailable." );
+ if (!infos.getFileName().equals(request.getArgument())) {
+ // the client tries to retrieve a file, that he is not allowed to get
+ String organization = ServerSessionManager.getSession( App.ftpServer.users.get( session.getUser().getName() ).getServerSessionId() ).getOrganization();
+ log.info( "A user from organization '" + organization + "' tried to download a file (" + request.getArgument() + "), that he was not allowed to." );
+ throw new FtpException( "550 File unavailable." ); // after the exception, the client will be automatically be disconnected
}
+ } else if ( request.getCommand().equals( "MLSD" ) // list dirs
+ || request.getCommand().equals( "NSLT" ) // list files
+ || request.getCommand().equals( "CWD" ) // change working dir
+ ) {
+
+ // TODO: block all other commands except login and retrieve
+ return FtpletResult.DISCONNECT; // disconnect the client on wrong command
}
- // TODO: block all other commands except login and retrieve
}
} else {
// user is not valid anymore
throw new FtpException( "430 Invalid username or password." ); // ERROR CODE 430 --> invalid username or password
+ // after the exception, the client will be automatically be disconnected
}
}
- return null;
+
+ return FtpletResult.DEFAULT;
}
@Override
@@ -61,7 +75,7 @@ public class MasterFtplet implements Ftplet
FtpReply reply ) throws FtpException, IOException
{
// not used
- return null;
+ return FtpletResult.DEFAULT;
}
@Override
@@ -71,15 +85,17 @@ public class MasterFtplet implements Ftplet
if (session.getUser() != null) {
log.info( session.getUser().getName() + " connected" );
}
- return null;
+ return FtpletResult.DEFAULT;
}
@Override
public FtpletResult onDisconnect( FtpSession session ) throws FtpException,
IOException
{
- // not used
- return null;
+ if (session.getUser() != null) {
+ log.info( session.getUser().getName() + " disconnected" );
+ }
+ return FtpletResult.DEFAULT;
}
}