1 package org.apache.maven.wagon.providers.ssh;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.mina.core.session.IoSession;
23 import org.apache.sshd.SshServer;
24 import org.apache.sshd.common.Session;
25 import org.apache.sshd.common.session.AbstractSession;
26 import org.apache.sshd.server.Command;
27 import org.apache.sshd.server.CommandFactory;
28 import org.apache.sshd.server.FileSystemFactory;
29 import org.apache.sshd.server.FileSystemView;
30 import org.apache.sshd.server.PasswordAuthenticator;
31 import org.apache.sshd.server.SshFile;
32 import org.apache.sshd.server.auth.UserAuthPassword;
33 import org.apache.sshd.server.auth.UserAuthPublicKey;
34 import org.apache.sshd.server.filesystem.NativeSshFile;
35 import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider;
36 import org.apache.sshd.server.session.SessionFactory;
37 import org.apache.sshd.server.shell.ProcessShellFactory;
38 import org.codehaus.plexus.util.FileUtils;
39
40 import java.io.File;
41 import java.io.IOException;
42 import java.util.ArrayList;
43 import java.util.Arrays;
44 import java.util.List;
45
46
47
48
49 public class SshServerEmbedded
50 {
51 private String wagonProtocol;
52
53 private int port;
54
55 private SshServer sshd;
56
57 private List<String> sshKeysResources = new ArrayList<String>();
58
59 private TestPublickeyAuthenticator publickeyAuthenticator;
60
61 TestPasswordAuthenticator passwordAuthenticator = new TestPasswordAuthenticator();
62
63 private boolean keyAuthz;
64
65
66
67
68
69
70 public SshServerEmbedded( String wagonProtocol, List<String> sshKeysResources, boolean keyAuthz )
71 {
72 this.wagonProtocol = wagonProtocol;
73
74 this.sshKeysResources = sshKeysResources;
75
76 this.sshd = SshServer.setUpDefaultServer();
77
78
79
80 this.keyAuthz = keyAuthz;
81
82 publickeyAuthenticator = new TestPublickeyAuthenticator( this.keyAuthz );
83 }
84
85
86
87
88 public int start()
89 throws IOException
90 {
91 sshd.setPort( 0 );
92
93 sshd.setUserAuthFactories( Arrays.asList( new UserAuthPublicKey.Factory(), new UserAuthPassword.Factory() ) );
94
95 sshd.setPublickeyAuthenticator( this.publickeyAuthenticator );
96
97 sshd.setPasswordAuthenticator( this.passwordAuthenticator );
98
99 sshd.setUserAuthFactories( Arrays.asList( new UserAuthPublicKey.Factory(), new UserAuthPassword.Factory() ) );
100
101
102
103
104 File path = new File( "target/keys" );
105 path.mkdirs();
106 path = new File( path, "simple.key" );
107 path.delete();
108
109 PEMGeneratorHostKeyProvider provider = new PEMGeneratorHostKeyProvider();
110 provider.setAlgorithm( "RSA" );
111 provider.setKeySize( 1024 );
112 provider.setPath( path.getPath() );
113
114 sshd.setKeyPairProvider( provider );
115 SessionFactory sessionFactory = new SessionFactory()
116 {
117 @Override
118 protected AbstractSession doCreateSession( IoSession ioSession )
119 throws Exception
120 {
121 return super.doCreateSession( ioSession );
122 }
123 };
124 sshd.setSessionFactory( sessionFactory );
125
126
127
128 final ProcessShellFactory processShellFactory =
129 new ProcessShellFactory( new String[]{ "/bin/sh", "-i", "-l" } );
130 sshd.setShellFactory( processShellFactory );
131
132 CommandFactory delegateCommandFactory = new CommandFactory()
133 {
134 public Command createCommand( String command )
135 {
136 return new ShellCommand( command );
137 }
138 };
139
140 ScpCommandFactory commandFactory = new ScpCommandFactory( delegateCommandFactory );
141 sshd.setCommandFactory( commandFactory );
142
143 FileSystemFactory fileSystemFactory = new FileSystemFactory()
144 {
145 public FileSystemView createFileSystemView( Session session )
146 throws IOException
147 {
148 return new FileSystemView()
149 {
150 public SshFile getFile( String file )
151 {
152 file = file.replace( "\\", "" );
153 file = file.replace( "\"", "" );
154 File f = new File( FileUtils.normalize( file ) );
155
156 return new SshServerEmbedded.TestSshFile( f.getAbsolutePath(), f,
157 System.getProperty( "user.name" ) );
158 }
159
160 public SshFile getFile( SshFile baseDir, String file )
161 {
162 file = file.replace( "\\", "" );
163 file = file.replace( "\"", "" );
164 File f = new File( FileUtils.normalize( file ) );
165 return new SshServerEmbedded.TestSshFile( f.getAbsolutePath(), f,
166 System.getProperty( "user.name" ) );
167 }
168 };
169 }
170 };
171 sshd.setNioWorkers( 0 );
172
173 sshd.setFileSystemFactory( fileSystemFactory );
174 sshd.start();
175 this.port = sshd.getPort();
176 return this.port;
177 }
178
179
180 public void stop()
181 throws InterruptedException
182 {
183 sshd.stop( Boolean.getBoolean( "sshd.stopImmediatly" ) );
184 }
185
186 public int getPort()
187 {
188 return port;
189 }
190
191 public PasswordAuthenticator getPasswordAuthenticator()
192 {
193 return passwordAuthenticator;
194 }
195
196
197
198 public static class TestSshFile
199 extends NativeSshFile
200 {
201 public TestSshFile( String fileName, File file, String userName )
202 {
203
204 super( FileUtils.normalize( fileName ), file, userName );
205 }
206 }
207
208 }