You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ftpserver-users@mina.apache.org by Marc Esher <ma...@gmail.com> on 2010/05/22 18:47:29 UTC

Embedding ftpserver for unit test

Greetings all,
  Please pardon what is surely something very simple I'm missing. I
need to spin up an ftp server solely for the purpose of a unit test,
and Apache FtpServer seems like exactly what I need. Except... I'm
having a bit of trouble with the user's permissions and home
directory.

  The server starts fine, and I can log in with the user I'm creating,
but the I get a "550 no such directory" problem on login. As I said, I
know this is a complete "duh" thing, but I can't figure it out.

Here's my sample code:


FtpServerFactory factory = new FtpServerFactory();
		FtpServer server = factory.createServer();
		
		PropertiesUserManagerFactory userFactory = new PropertiesUserManagerFactory();
		File userFile = new File("bin/ftp/users.properties");
		File userHome = new File("bin/ftp/tmpHome/");
		userHome.mkdirs();
		userFactory.setFile(userFile);
		UserManager um = userFactory.createUserManager();
		
		BaseUser user = new BaseUser();
		user.setName("unittest");
		user.setPassword("unittest");
		user.setHomeDirectory(userHome.getAbsolutePath());//tried both
relative and full paths... no luck
		um.save(user);
		System.out.println(user.getHomeDirectory());
		
		
		factory.setUserManager(um);
		System.out.println( Arrays.toString(um.getAllUserNames())   );
		
		
		server.start();

The directory exists and has some other files and directories in
there. I thought that by logging in with a client (I'm using FileZill
and FireFTP) I'd land in the home directory I specified in
baseUser.setHomeDirectory().

I've tried passing relative and full paths to setHomeDirectory, each
with the same result.

Can anyone tell me the very simple thing I'm missing?  Again, this is
simply for a unit test, so I'm looking for the absolute minimum amount
of effort to get an ftp server running for a few seconds with a single
user to log in, CWD, and read some file attributes, and that's about
it.

Thanks so much!

Marc

Re: Embedding ftpserver for unit test

Posted by David Latorre <dv...@gmail.com>.
Thanks for the help, Andy!

Please note that the current recommended way of creating users is
using org.apache.ftpserver.usermanager.UserFactory if available, this
way you can create users in an OSGI environment.  I just updated the
ManagingUsers example :)


2010/5/23 Marc Esher <ma...@gmail.com>:
> Andy,
>  Thanks! Everything is working fine now.
>
> Regards,
>
> Marc
>
> On Sat, May 22, 2010 at 7:56 PM, Andy Thomson <a1...@gmail.com> wrote:
>> Marc,
>>
>> Tried out your code snippet, changed the user file to just
>> "user.properties" so that it would be relative to the where code was
>> actually run.  I tested with maven, so I created an empty file called
>> "user.properties" in the same directory as the pom.xml [project root]. I
>> made the user home to be "/tmp/bin/ftp/tmpHome".
>>
>> It worked.  The user home directory was in the /tmp directory. I set the
>> permissions to 777 on that tree, and wrote a file via ftp.
>>
>> I changed the user home directory to be a relative path, it also worked.
>> The user home directory was created in the project root.
>>
>> I am suspecting that your problem is that the user.properties did not
>> exist. Create it in a known location, just make it an empty file.
>>
>> Here is the code:
>>
>> public class FtpTest {
>>
>>    /**
>>     * @param args the command line arguments
>>     */
>>    public static void main(String[] args) throws FtpException {
>>
>>        FtpServerFactory serverFactory = new FtpServerFactory();
>>
>>        ListenerFactory factory = new ListenerFactory();
>>        factory.setPort(2221);
>>        serverFactory.addListener("default",
>>                                   factory.createListener());
>>
>>        FtpServer server = serverFactory.createServer();
>>
>>        PropertiesUserManagerFactory userFactory =
>>             new PropertiesUserManagerFactory();
>>        File userFile = new File("users.properties");
>>        File userHome = new File("tmp/ftp/tmpHome/");
>>        userHome.mkdirs();
>>        userFactory.setFile(userFile);
>>
>>        UserManager um = userFactory.createUserManager();
>>        BaseUser user = new BaseUser();
>>        user.setName("unittest");
>>        user.setPassword("unittest");
>>        user.setHomeDirectory(userHome.getAbsolutePath());
>>        um.save(user);
>>        System.out.println(user.getHomeDirectory());
>>        serverFactory.setUserManager(um);
>>        System.out.println(Arrays.toString(um.getAllUserNames()));
>>        server.start();
>>    }
>> }
>>
>> Andy
>>
>> On 05/22/2010 10:47 AM, Marc Esher wrote:
>>> Greetings all,
>>>   Please pardon what is surely something very simple I'm missing. I
>>> need to spin up an ftp server solely for the purpose of a unit test,
>>> and Apache FtpServer seems like exactly what I need. Except... I'm
>>> having a bit of trouble with the user's permissions and home
>>> directory.
>>>
>>>   The server starts fine, and I can log in with the user I'm creating,
>>> but the I get a "550 no such directory" problem on login. As I said, I
>>> know this is a complete "duh" thing, but I can't figure it out.
>>>
>>> Here's my sample code:
>>>
>>>
>>> FtpServerFactory factory = new FtpServerFactory();
>>>               FtpServer server = factory.createServer();
>>>
>>>               PropertiesUserManagerFactory userFactory = new PropertiesUserManagerFactory();
>>>               File userFile = new File("bin/ftp/users.properties");
>>>               File userHome = new File("bin/ftp/tmpHome/");
>>>               userHome.mkdirs();
>>>               userFactory.setFile(userFile);
>>>               UserManager um = userFactory.createUserManager();
>>>
>>>               BaseUser user = new BaseUser();
>>>               user.setName("unittest");
>>>               user.setPassword("unittest");
>>>               user.setHomeDirectory(userHome.getAbsolutePath());//tried both
>>> relative and full paths... no luck
>>>               um.save(user);
>>>               System.out.println(user.getHomeDirectory());
>>>
>>>
>>>               factory.setUserManager(um);
>>>               System.out.println( Arrays.toString(um.getAllUserNames())   );
>>>
>>>
>>>               server.start();
>>>
>>> The directory exists and has some other files and directories in
>>> there. I thought that by logging in with a client (I'm using FileZill
>>> and FireFTP) I'd land in the home directory I specified in
>>> baseUser.setHomeDirectory().
>>>
>>> I've tried passing relative and full paths to setHomeDirectory, each
>>> with the same result.
>>>
>>> Can anyone tell me the very simple thing I'm missing?  Again, this is
>>> simply for a unit test, so I'm looking for the absolute minimum amount
>>> of effort to get an ftp server running for a few seconds with a single
>>> user to log in, CWD, and read some file attributes, and that's about
>>> it.
>>>
>>> Thanks so much!
>>>
>>> Marc
>>>
>>
>

Re: Embedding ftpserver for unit test

Posted by Marc Esher <ma...@gmail.com>.
Andy,
  Thanks! Everything is working fine now.

Regards,

Marc

On Sat, May 22, 2010 at 7:56 PM, Andy Thomson <a1...@gmail.com> wrote:
> Marc,
>
> Tried out your code snippet, changed the user file to just
> "user.properties" so that it would be relative to the where code was
> actually run.  I tested with maven, so I created an empty file called
> "user.properties" in the same directory as the pom.xml [project root]. I
> made the user home to be "/tmp/bin/ftp/tmpHome".
>
> It worked.  The user home directory was in the /tmp directory. I set the
> permissions to 777 on that tree, and wrote a file via ftp.
>
> I changed the user home directory to be a relative path, it also worked.
> The user home directory was created in the project root.
>
> I am suspecting that your problem is that the user.properties did not
> exist. Create it in a known location, just make it an empty file.
>
> Here is the code:
>
> public class FtpTest {
>
>    /**
>     * @param args the command line arguments
>     */
>    public static void main(String[] args) throws FtpException {
>
>        FtpServerFactory serverFactory = new FtpServerFactory();
>
>        ListenerFactory factory = new ListenerFactory();
>        factory.setPort(2221);
>        serverFactory.addListener("default",
>                                   factory.createListener());
>
>        FtpServer server = serverFactory.createServer();
>
>        PropertiesUserManagerFactory userFactory =
>             new PropertiesUserManagerFactory();
>        File userFile = new File("users.properties");
>        File userHome = new File("tmp/ftp/tmpHome/");
>        userHome.mkdirs();
>        userFactory.setFile(userFile);
>
>        UserManager um = userFactory.createUserManager();
>        BaseUser user = new BaseUser();
>        user.setName("unittest");
>        user.setPassword("unittest");
>        user.setHomeDirectory(userHome.getAbsolutePath());
>        um.save(user);
>        System.out.println(user.getHomeDirectory());
>        serverFactory.setUserManager(um);
>        System.out.println(Arrays.toString(um.getAllUserNames()));
>        server.start();
>    }
> }
>
> Andy
>
> On 05/22/2010 10:47 AM, Marc Esher wrote:
>> Greetings all,
>>   Please pardon what is surely something very simple I'm missing. I
>> need to spin up an ftp server solely for the purpose of a unit test,
>> and Apache FtpServer seems like exactly what I need. Except... I'm
>> having a bit of trouble with the user's permissions and home
>> directory.
>>
>>   The server starts fine, and I can log in with the user I'm creating,
>> but the I get a "550 no such directory" problem on login. As I said, I
>> know this is a complete "duh" thing, but I can't figure it out.
>>
>> Here's my sample code:
>>
>>
>> FtpServerFactory factory = new FtpServerFactory();
>>               FtpServer server = factory.createServer();
>>
>>               PropertiesUserManagerFactory userFactory = new PropertiesUserManagerFactory();
>>               File userFile = new File("bin/ftp/users.properties");
>>               File userHome = new File("bin/ftp/tmpHome/");
>>               userHome.mkdirs();
>>               userFactory.setFile(userFile);
>>               UserManager um = userFactory.createUserManager();
>>
>>               BaseUser user = new BaseUser();
>>               user.setName("unittest");
>>               user.setPassword("unittest");
>>               user.setHomeDirectory(userHome.getAbsolutePath());//tried both
>> relative and full paths... no luck
>>               um.save(user);
>>               System.out.println(user.getHomeDirectory());
>>
>>
>>               factory.setUserManager(um);
>>               System.out.println( Arrays.toString(um.getAllUserNames())   );
>>
>>
>>               server.start();
>>
>> The directory exists and has some other files and directories in
>> there. I thought that by logging in with a client (I'm using FileZill
>> and FireFTP) I'd land in the home directory I specified in
>> baseUser.setHomeDirectory().
>>
>> I've tried passing relative and full paths to setHomeDirectory, each
>> with the same result.
>>
>> Can anyone tell me the very simple thing I'm missing?  Again, this is
>> simply for a unit test, so I'm looking for the absolute minimum amount
>> of effort to get an ftp server running for a few seconds with a single
>> user to log in, CWD, and read some file attributes, and that's about
>> it.
>>
>> Thanks so much!
>>
>> Marc
>>
>

Re: Embedding ftpserver for unit test

Posted by Andy Thomson <a1...@gmail.com>.
Marc,

Tried out your code snippet, changed the user file to just
"user.properties" so that it would be relative to the where code was
actually run.  I tested with maven, so I created an empty file called
"user.properties" in the same directory as the pom.xml [project root]. I
made the user home to be "/tmp/bin/ftp/tmpHome".

It worked.  The user home directory was in the /tmp directory. I set the
permissions to 777 on that tree, and wrote a file via ftp.

I changed the user home directory to be a relative path, it also worked.
The user home directory was created in the project root.

I am suspecting that your problem is that the user.properties did not
exist. Create it in a known location, just make it an empty file.

Here is the code:

public class FtpTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FtpException {

        FtpServerFactory serverFactory = new FtpServerFactory();

        ListenerFactory factory = new ListenerFactory();
        factory.setPort(2221);
        serverFactory.addListener("default",
                                   factory.createListener());

        FtpServer server = serverFactory.createServer();

        PropertiesUserManagerFactory userFactory =
             new PropertiesUserManagerFactory();
        File userFile = new File("users.properties");
        File userHome = new File("tmp/ftp/tmpHome/");
        userHome.mkdirs();
        userFactory.setFile(userFile);

        UserManager um = userFactory.createUserManager();
        BaseUser user = new BaseUser();
        user.setName("unittest");
        user.setPassword("unittest");
        user.setHomeDirectory(userHome.getAbsolutePath());
        um.save(user);
        System.out.println(user.getHomeDirectory());
        serverFactory.setUserManager(um);
        System.out.println(Arrays.toString(um.getAllUserNames()));
        server.start();
    }
}

Andy

On 05/22/2010 10:47 AM, Marc Esher wrote:
> Greetings all,
>   Please pardon what is surely something very simple I'm missing. I
> need to spin up an ftp server solely for the purpose of a unit test,
> and Apache FtpServer seems like exactly what I need. Except... I'm
> having a bit of trouble with the user's permissions and home
> directory.
> 
>   The server starts fine, and I can log in with the user I'm creating,
> but the I get a "550 no such directory" problem on login. As I said, I
> know this is a complete "duh" thing, but I can't figure it out.
> 
> Here's my sample code:
> 
> 
> FtpServerFactory factory = new FtpServerFactory();
> 		FtpServer server = factory.createServer();
> 		
> 		PropertiesUserManagerFactory userFactory = new PropertiesUserManagerFactory();
> 		File userFile = new File("bin/ftp/users.properties");
> 		File userHome = new File("bin/ftp/tmpHome/");
> 		userHome.mkdirs();
> 		userFactory.setFile(userFile);
> 		UserManager um = userFactory.createUserManager();
> 		
> 		BaseUser user = new BaseUser();
> 		user.setName("unittest");
> 		user.setPassword("unittest");
> 		user.setHomeDirectory(userHome.getAbsolutePath());//tried both
> relative and full paths... no luck
> 		um.save(user);
> 		System.out.println(user.getHomeDirectory());
> 		
> 		
> 		factory.setUserManager(um);
> 		System.out.println( Arrays.toString(um.getAllUserNames())   );
> 		
> 		
> 		server.start();
> 
> The directory exists and has some other files and directories in
> there. I thought that by logging in with a client (I'm using FileZill
> and FireFTP) I'd land in the home directory I specified in
> baseUser.setHomeDirectory().
> 
> I've tried passing relative and full paths to setHomeDirectory, each
> with the same result.
> 
> Can anyone tell me the very simple thing I'm missing?  Again, this is
> simply for a unit test, so I'm looking for the absolute minimum amount
> of effort to get an ftp server running for a few seconds with a single
> user to log in, CWD, and read some file attributes, and that's about
> it.
> 
> Thanks so much!
> 
> Marc
>