blob: 8e3a84c0e7338cfb5c84db80f70e4ac24caa128d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2020 SAP AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Lazar Kirchev, SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.console.ssh;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.felix.service.command.CommandProcessor;
import org.apache.felix.service.command.CommandSession;
import org.apache.sshd.server.Environment;
import org.apache.sshd.server.channel.ChannelSession;
import org.easymock.EasyMock;
import org.eclipse.equinox.console.common.ConsoleInputStream;
import org.eclipse.equinox.console.storage.DigestUtil;
import org.eclipse.equinox.console.storage.SecureUserStore;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
public class SshShellTests {
private static final int TEST_CONTENT = 100;
private static final String USER_STORE_FILE_NAME = "org.eclipse.equinox.console.jaas.file";
private static final String DEFAULT_USER_STORAGE = "osgi.console.ssh.useDefaultSecureStorage";
private static final String USER_STORE_NAME = SshShellTests.class.getName() + "_store";
private static final String HOST = "localhost";
private static final String GOGO_SHELL_COMMAND = "gosh --login --noshutdown";
private static final String TERM_PROPERTY = "TERM";
private static final String XTERM = "XTERM";
private static final String USERNAME = "username";
private static final String PASSWORD = "password";
private static final String TRUE = "true";
@Before
public void init() throws Exception {
clean();
initStore();
}
@Test
public void testSshConnection() throws Exception {
SshShell shell = null;
try (ServerSocket servSocket = new ServerSocket(0);
Socket socketClient = new Socket(HOST, servSocket.getLocalPort());
Socket socketServer = servSocket.accept()) {
try (CommandSession session = EasyMock.createMock(CommandSession.class)) {
EasyMock.makeThreadSafe(session, true);
EasyMock.expect(session.put((String) EasyMock.anyObject(), EasyMock.anyObject()))
.andReturn(EasyMock.anyObject());
EasyMock.expect(session.execute(GOGO_SHELL_COMMAND)).andReturn(null);
session.close();
EasyMock.expectLastCall();
EasyMock.replay(session);
CommandProcessor processor = EasyMock.createMock(CommandProcessor.class);
EasyMock.expect(processor.createSession((ConsoleInputStream) EasyMock.anyObject(),
(PrintStream) EasyMock.anyObject(), (PrintStream) EasyMock.anyObject())).andReturn(session);
EasyMock.replay(processor);
BundleContext context = EasyMock.createMock(BundleContext.class);
EasyMock.makeThreadSafe(context, true);
EasyMock.expect(context.getProperty(DEFAULT_USER_STORAGE)).andReturn(TRUE);
EasyMock.replay(context);
Map<String, String> environment = new HashMap<>();
environment.put(TERM_PROPERTY, XTERM);
Environment env = EasyMock.createMock(Environment.class);
EasyMock.expect(env.getEnv()).andReturn(environment);
EasyMock.replay(env);
List<CommandProcessor> processors = new ArrayList<>();
processors.add(processor);
shell = new SshShell(processors, context);
shell.setInputStream(socketServer.getInputStream());
shell.setOutputStream(socketServer.getOutputStream());
shell.start(new ChannelSession(), env);
}
try (OutputStream outClient = socketClient.getOutputStream()) {
outClient.write(TEST_CONTENT);
outClient.write('\n');
outClient.flush();
try (InputStream input = socketClient.getInputStream()) {
int in = input.read();
Assert.assertTrue(
"Server received [" + in + "] instead of " + TEST_CONTENT + " from the ssh client.",
in == TEST_CONTENT);
}
}
}
}
@After
public void cleanUp() {
clean();
}
private void initStore() throws Exception {
System.setProperty(USER_STORE_FILE_NAME, USER_STORE_NAME);
SecureUserStore.initStorage();
SecureUserStore.putUser(USERNAME, DigestUtil.encrypt(PASSWORD), null);
}
private void clean() {
System.setProperty(USER_STORE_FILE_NAME, "");
File file = new File(USER_STORE_NAME);
if (file.exists()) {
file.delete();
}
}
}