Hi Guillaume,

That will fix it because @BeforeClass is a static method which forces the 
instance to be static which forces the map to be a singleton in the jvm and 
thus resolves the issue.

The problem, though, is that newing up a new SshServer.java instance is not 
safe to do multiple times, which seems like a problem to me because some 
internal state there is either static or is not getting cleaned out and 
containing stale references to objects that should have since been cleaned up 
(i.e. PasswordAuthenticator instances).

I stated in an earlier email that a hack-workaround for me is to make the 
private final ConcurrentMap instance static.  This indeed allows the test cases 
to pass, but it can have unwanted side-effects, and forces me to only have a 
single instance of the SftpServer running in any JVM unless I want to deal with 
this shared static map (which I don't).

Maybe we see things differently, but it seems to me that the SshServer ought to 
be able to be new'd up and gc'd and new'd up again without side effects?

Regards,
Davis

-----Original Message-----
From: Guillaume Nodet [mailto:[email protected]] 
Sent: Wednesday, September 14, 2011 1:00 PM
To: [email protected]
Subject: Re: SFTP/SSHD passwordauthenticator test case

I wonder if the problem is in your test which may create multiple SftpServer
somehow ?
Could you move the creation in the beforeClass method ?

On Wed, Sep 14, 2011 at 18:29, Davis Ford <[email protected]> wrote:

>  Here's a follow up to my last email with a demo class / test case that
> illustrates the failure.****
>
> ** **
>
> Add this code to the apache-sshd/sshd-core project under
> src/test/java/com/example****
>
> ** **
>
> When you run the test the first case passes.  It spins up a new Sshd/SFTP
> server and connects to it with the JSch client, and authenticates just fine
> with the user/pass obtained via the ConcurrentHashMap.****
>
> ** **
>
> The second test case fails.  It tries to connect multiple sessions with
> different user/pass combos.  You'll see the following printed on
> system.err.println =>****
>
> ** **
>
> First, we create a new session for foo=bar:****
>
> CREATE-SESSION: SftpServer identity:1190000432, authMap identity:822056113,
> authMap:{foo=bar}, user:foo, pass:bar****
>
> Then we authenticate -- works ok, you'll see foo=bar is in the map****
>
> AUTHENTICATE: SftpServer identity:1526115339, authMap identity:2023306452,
> authMap:{foo=bar}, user:foo, pass:bar****
>
> Now, we create a new session for foo2=bar2, note that it prints the
> contents of the map after this call and it contains foo2=bar2****
>
> CREATE-SESSION: SftpServer identity:1190000432, authMap identity:822056113,
> authMap:{foo2=bar2, foo=bar}, user:foo2, pass:bar2****
>
> Then we try to authenticate, but it fails.  foo2=bar2 is not in the map,
> and the identity hashcode is different.****
>
> AUTHENTICATE: SftpServer identity:1526115339, authMap identity:2023306452,
> authMap:{foo=bar}, user:foo2, pass:bar2****
>
> ** **
>
> Note that the identity hashcodes change between calls to createSession( )
> in the test, and authenticate( ) coming in from apache-sshd.  If you look at
> the code, you'll see that I don't manipulate the ConcurrentMap anywhere in
> the code or the test case other than adding an entry to it, and it is a
> private final instance variable.****
>
> ** **
>
> So, why doesn't this work?  Something in the mina code is using a stale
> instance of the SftpServer.java class it seems?****
>
> ** **
>
> Any ideas?****
>
> ** **
>
> Regards,
> Davis****
>



-- 
------------------------
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com

Reply via email to