package aQute.bnd.comm.tests;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import aQute.bnd.build.Workspace;
import aQute.bnd.deployer.repository.FixedIndexedRepo;
import aQute.bnd.http.HttpClient;
import aQute.bnd.jpm.Repository;
import aQute.bnd.service.repository.SearchableRepository.ResourceDescriptor;
import aQute.bnd.service.url.URLConnector;
import aQute.bnd.version.Version;
import aQute.http.testservers.HttpTestServer;
import aQute.http.testservers.Httpbin;
import aQute.lib.io.IO;
import aQute.libg.cryptography.SHA256;
import junit.framework.TestCase;
import sockslib.common.AuthenticationException;
import sockslib.common.Credentials;
import sockslib.common.methods.UsernamePasswordMethod;
import sockslib.server.Session;
import sockslib.server.SocksProxyServer;
import sockslib.server.SocksServerBuilder;
import sockslib.server.UsernamePasswordAuthenticator;
import sockslib.server.listener.CloseSessionException;
import sockslib.server.listener.SessionListener;
import sockslib.server.manager.MemoryBasedUserManager;
import sockslib.server.manager.User;
import sockslib.server.manager.UserManager;
import sockslib.server.msg.CommandMessage;
public class IndexedReposWithComms extends TestCase {
private static SocksProxyServer socks5Proxy;
private static File tmp = IO.getFile("generated/tmp");
public void testBasicWorkspace() throws Exception {
HttpTestServer ht = http();
try {
createSecureSocks5();
Workspace ws = Workspace.getWorkspace(aQute.lib.io.IO.getFile("workspaces/basic"));
assertNotNull(ws);
List<URLConnector> connectors = ws.getPlugins(URLConnector.class);
assertNotNull(connectors);
assertEquals(1, connectors.size());
assertTrue(connectors.get(0) instanceof HttpClient);
HttpClient hc = (HttpClient) connectors.get(0);
InputStream connect = hc.connect(new URL(ht.getBaseURI() + "/basic-auth/user/good"));
assertNotNull(connect);
aQute.lib.io.IO.copy(connect, System.out);
connect.close();
} catch (Exception e) {
e.printStackTrace();
fail(e.toString());
} finally {
ht.close();
}
}
/*
* Uses workspaces/indexed Sets up a FixedIndexedRepo to the local server.
*/
public void testIndexedRepo() throws IOException, Exception {
try (HttpTestServer ht = http();) {
createSecureSocks5();
Workspace ws = Workspace.getWorkspace(aQute.lib.io.IO.getFile("workspaces/indexed"));
assertNotNull(ws);
ws.setProperty("repo", ht.getBaseURI().toASCIIString() + "/index");
FixedIndexedRepo plugin = ws.getPlugin(FixedIndexedRepo.class);
assertTrue(ws.check());
assertNotNull(plugin);
List<String> list = plugin.list(null);
assertTrue(ws.check());
assertTrue(list.size() > 0);
}
}
/*
* Uses workspaces/indexed Sets up a FixedIndexedRepo to the local server.
*/
public void testIndexedRepoWithPassword() throws IOException, Exception {
try (HttpTestServer ht = https();) {
createSecureSocks5();
Workspace ws = Workspace.getWorkspace(aQute.lib.io.IO.getFile("workspaces/indexed"));
assertNotNull(ws);
ws.setProperty("-connection-settings", "${build}/settings-withpassword.xml");
ws.setProperty("repo", ht.getBaseURI().toASCIIString() + "/index-auth/user/good");
FixedIndexedRepo plugin = ws.getPlugin(FixedIndexedRepo.class);
assertTrue(ws.check());
assertNotNull(plugin);
List<String> list = plugin.list(null);
assertTrue(ws.check());
assertTrue(list.size() > 0);
}
}
public void testJpmRepoQuery() throws Exception {
try (HttpTestServer ht = http();) {
createSecureSocks5();
Workspace ws = Workspace.getWorkspace(aQute.lib.io.IO.getFile("workspaces/jpm"));
assertNotNull(ws);
ws.setProperty("repo", ht.getBaseURI().toASCIIString());
ws.setProperty("tmp", tmp.toURI().getPath());
ws.setProperty("-fixupmessages.jpmdeprecated", "aQute.bnd.jpm.Repository is deprecated");
Repository plugin = ws.getPlugin(Repository.class);
assertTrue(ws.check());
assertNotNull(plugin);
Set<ResourceDescriptor> query = plugin.query("bla");
assertTrue(ws.check());
assertTrue(query.size() > 0);
}
}
public void testJpmRepoDownload() throws Exception {
try (HttpTestServer ht = http();) {
createSecureSocks5();
Workspace ws = Workspace.getWorkspace(aQute.lib.io.IO.getFile("workspaces/jpm"));
assertNotNull(ws);
ws.setProperty("repo", ht.getBaseURI().toASCIIString());
ws.setProperty("tmp", tmp.toURI().getPath());
Repository plugin = ws.getPlugin(Repository.class);
ResourceDescriptor descriptor = plugin.getDescriptor("slf4j.simple", new Version("1.7.13"));
assertNotNull(descriptor);
File file = plugin.get("slf4j.simple", new Version("1.7.13"), null);
assertTrue(file.isFile());
byte[] digest = SHA256.digest(file).digest();
assertTrue(Arrays.equals(descriptor.sha256, digest));
}
}
private void createSecureSocks5() throws IOException, InterruptedException {
UserManager userManager = new MemoryBasedUserManager();
userManager.create(new User("proxyuser", "good"));
SocksServerBuilder builder = SocksServerBuilder.newSocks5ServerBuilder();
builder.setBindAddr(InetAddress.getLoopbackAddress());
builder.setBindPort(9090);
builder.setUserManager(userManager);
builder.addSocksMethods(new UsernamePasswordMethod(new UsernamePasswordAuthenticator() {
@Override
public void doAuthenticate(Credentials arg0, Session arg1) throws AuthenticationException {
System.out.println("Authenticating"); // does not get called?
super.doAuthenticate(arg0, arg1);
}
}));
socks5Proxy = builder.build();
socks5Proxy.getSessionManager().addSessionListener("abc", new SessionListener() {
@Override
public void onException(Session arg0, Exception arg1) {
System.err.println("Exception " + arg0 + " " + arg1);
arg1.printStackTrace();
}
@Override
public void onCommand(Session arg0, CommandMessage arg1) throws CloseSessionException {
System.err.println("Command " + arg0 + " " + arg1);
}
@Override
public void onClose(Session arg0) {
System.err.println("Close " + arg0);
}
@Override
public void onCreate(Session arg0) throws CloseSessionException {
System.err.println("Create " + arg0);
}
});
socks5Proxy.start();
}
public void setUp() {
IO.delete(tmp);
}
public void tearDown() {
if (socks5Proxy != null)
socks5Proxy.shutdown();
}
public static class HS extends Httpbin {
public HS(Config config) throws Exception {
super(config);
}
// jsonrpc/2.0/jpm
public void _jsonrpc$2f2$2e0$2fjpm(Request rq, Response rsp) throws IOException {
rsp.content = IO.read(IO.getFile("workspaces/jpm/cnf/programs.json"));
rsp.mimeType = "application/json";
}
}
HttpTestServer http() throws Exception, IOException {
HttpTestServer.Config config = new HttpTestServer.Config();
config.host = "localhost";
HttpTestServer ht = new HS(config);
ht.start();
return ht;
}
HttpTestServer https() throws Exception, IOException {
HttpTestServer.Config config = new HttpTestServer.Config();
config.host = "localhost";
config.https = true;
HttpTestServer ht = new HS(config);
ht.start();
return ht;
}
}