Bulletin Board Server configuration support.

Bulletin Board Server signature testing.
Bulletin_Board_Server_phase_1
Arbel Deutsch Peled 2015-11-28 23:59:56 +02:00
parent cbe3b5c765
commit 2ff34355e4
9 changed files with 125 additions and 59 deletions

View File

@ -1,6 +1,5 @@
package meerkat.bulletinboard.httpserver;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletConfig;
@ -16,7 +15,7 @@ import meerkat.protobuf.BulletinBoardAPI.*;
public class BulletinBoardHttpServer extends HttpServlet {
public final static File DEFAULT_MEERKAT_DB = new File("local-instances/meerkat.db");
public final static String DEFAULT_MEERKAT_DB = "local-instances/meerkat.db";
/**
* Auto-generated UID.

View File

@ -1,6 +1,5 @@
package meerkat.bulletinboard.sqlserver;
import java.io.File;
import java.util.Arrays;
import java.util.List;
@ -39,7 +38,7 @@ public abstract class BulletinBoardSQLServer implements BulletinBoardServer{
* 2. Call this procedure
*/
@Override
public void init(File meerkatDB) throws CommunicationException {
public void init(String meerkatDB) throws CommunicationException {
// TODO write signature reading part.
digest = new SHA256Digest();

View File

@ -1,6 +1,5 @@
package meerkat.bulletinboard.sqlserver;
import java.io.File;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@ -41,10 +40,10 @@ public class SQLiteBulletinBoardServer extends BulletinBoardSQLServer {
}
@Override
public void init(File meerkatDB) throws CommunicationException {
public void init(String meerkatDB) throws CommunicationException {
try{
String dbString = "jdbc:sqlite:" + meerkatDB.getPath();
String dbString = "jdbc:sqlite:" + meerkatDB;
connection = DriverManager.getConnection(dbString);
createSchema();

View File

@ -1,12 +1,14 @@
package meerkat.bulletinboard.webapp;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import meerkat.bulletinboard.BulletinBoardServer;
@ -18,26 +20,55 @@ import meerkat.protobuf.BulletinBoardAPI.BulletinBoardMessageList;
import meerkat.protobuf.BulletinBoardAPI.MessageFilterList;
import meerkat.rest.Constants;
import java.io.File;
@Path("/sqlserver")
public class BulletinBoardWebApp implements BulletinBoardServer {
public class BulletinBoardWebApp implements BulletinBoardServer, ServletContextListener{
private static final String BULLETIN_BOARD_ATTRIBUTE_NAME = "bulletinBoard";
@Context ServletContext servletContext;
BulletinBoardServer bulletinBoard;
@PostConstruct
/**
* This is the servlet init method.
*/
public void init(){
bulletinBoard = (BulletinBoardServer) servletContext.getAttribute(BULLETIN_BOARD_ATTRIBUTE_NAME);
}
/**
* This is the BulletinBoard init method.
*/
@Override
public void init(File meerkatDB) throws CommunicationException {
bulletinBoard = new SQLiteBulletinBoardServer();
public void init(String meerkatDB) throws CommunicationException {
bulletinBoard.init(meerkatDB);
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
String meerkatDB = servletContext.getInitParameter("meerkatdb");
String dbType = servletContext.getInitParameter("dbtype");
if (dbType.compareTo("SQLite") == 0){
bulletinBoard = new SQLiteBulletinBoardServer();
}
try {
init(meerkatDB);
servletContext.setAttribute(BULLETIN_BOARD_ATTRIBUTE_NAME, bulletinBoard);
} catch (CommunicationException e) {
System.err.println(e.getMessage());
}
}
@Path("postmessage")
@POST
@Consumes(Constants.MEDIATYPE_PROTOBUF)
@Produces(Constants.MEDIATYPE_PROTOBUF)
@Override
public BoolMsg postMessage(BulletinBoardMessage msg) throws CommunicationException {
init();
return bulletinBoard.postMessage(msg);
}
@ -47,13 +78,17 @@ public class BulletinBoardWebApp implements BulletinBoardServer {
@Produces(Constants.MEDIATYPE_PROTOBUF)
@Override
public BulletinBoardMessageList readMessages(MessageFilterList filterList) throws CommunicationException {
init();
return bulletinBoard.readMessages(filterList);
}
@Override
@PreDestroy
public void close() throws CommunicationException {
bulletinBoard.close();
public void close(){
try {
bulletinBoard.close();
} catch (CommunicationException e) {
System.err.println(e.getMessage());
}
}
@GET
@ -62,4 +97,11 @@ public class BulletinBoardWebApp implements BulletinBoardServer {
return "This BulletinBoard is up and running!\n Please consult the API documents to perform queries.";
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
bulletinBoard = (BulletinBoardServer) servletContext.getAttribute(BULLETIN_BOARD_ATTRIBUTE_NAME);
close();
}
}

View File

@ -14,4 +14,13 @@
<servlet-name>Jersey Hello World</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>meerkatdb</param-name>
<param-value>meerkatdb</param-value></context-param>
<context-param>
<param-name>dbtype</param-name>
<param-value>SQLite</param-value></context-param>
<listener>
<listener-class>meerkat.bulletinboard.webapp.BulletinBoardWebApp</listener-class>
</listener>
</web-app>

View File

@ -1,23 +0,0 @@
package meerkat.bulletinboard;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.junit.Test;
import meerkat.bulletinboard.sqlserver.SQLiteBulletinBoardServer;
public class BulletinBoardServerTest {
@Test
public void testAllServers() throws Exception {
GenericBulletinBoardServerTest bbst = new GenericBulletinBoardServerTest();
bbst.init(SQLiteBulletinBoardServer.class);
bbst.bulkTest();
bbst.close();
}
}

View File

@ -1,6 +1,5 @@
package meerkat.bulletinboard;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
@ -8,7 +7,6 @@ import java.security.InvalidKeyException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.SignatureException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
@ -28,36 +26,57 @@ import meerkat.protobuf.BulletinBoardAPI.UnsignedBulletinBoardMessage;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
public class GenericBulletinBoardServerTest {
private BulletinBoardServer bulletinBoardServer;
public abstract class GenericBulletinBoardServerTest {
protected BulletinBoardServer bulletinBoardServer;
private ECDSASignature signers[];
private Random random;
private static String KEYFILE_EXAMPLE = "/certs/enduser-certs/user1-key-with-password-secret.p12";
private static String KEYFILE_PASSWORD = "secret";
private static String KEYFILE_EXAMPLE3 = "/certs/enduser-certs/user3-key-with-password-shh.p12";
private static String KEYFILE_PASSWORD1 = "secret";
private static String KEYFILE_PASSWORD3 = "shh";
public static String CERT1_PEM_EXAMPLE = "/certs/enduser-certs/user1.crt";
public static String CERT3_PEM_EXAMPLE = "/certs/enduser-certs/user3.crt";
// private static String KEYFILE_EXAMPLE2 = "/certs/enduser-certs/user2-key.pem";
public void init(Class<?> cls) throws InstantiationException, IllegalAccessException, CertificateException, KeyStoreException, NoSuchAlgorithmException, IOException, UnrecoverableKeyException, CommunicationException{
bulletinBoardServer = (BulletinBoardServer) cls.newInstance();
bulletinBoardServer.init(File.createTempFile("meerkat-test", "db"));
/**
*
* @param cls
* @throws InstantiationException
* @throws IllegalAccessException
* @throws CertificateException
* @throws KeyStoreException
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws UnrecoverableKeyException
* @throws CommunicationException
*/
public void init(String meerkatDB) throws InstantiationException, IllegalAccessException, CertificateException, KeyStoreException, NoSuchAlgorithmException, IOException, UnrecoverableKeyException, CommunicationException{
bulletinBoardServer.init(meerkatDB);
signers = new ECDSASignature[2];
signers[0] = new ECDSASignature();
signers[1] = new ECDSASignature();
InputStream keyStream = getClass().getResourceAsStream(KEYFILE_EXAMPLE);
char[] password = KEYFILE_PASSWORD.toCharArray();
char[] password = KEYFILE_PASSWORD1.toCharArray();
KeyStore.Builder keyStore = signers[0].getPKCS12KeyStoreBuilder(keyStream, password);
signers[0].loadSigningCertificate(keyStore);
KeyStore.Builder keyStoreBuilder = signers[0].getPKCS12KeyStoreBuilder(keyStream, password);
signers[0].loadSigningCertificate(keyStoreBuilder);
signers[0].loadVerificationCertificates(getClass().getResourceAsStream(CERT1_PEM_EXAMPLE));
keyStream = getClass().getResourceAsStream(KEYFILE_EXAMPLE3);
password = KEYFILE_PASSWORD3.toCharArray();
keyStoreBuilder = signers[1].getPKCS12KeyStoreBuilder(keyStream, password);
signers[1].loadSigningCertificate(keyStoreBuilder);
signers[1].loadVerificationCertificates(getClass().getResourceAsStream(CERT3_PEM_EXAMPLE));
random = new Random(0); // We use insecure randomness in tests for repeatability
}
@ -122,6 +141,11 @@ public class GenericBulletinBoardServerTest {
if (i % 2 == 1){
signers[0].updateContent(msgBuilder.getMsg());
msgBuilder.addSig(signers[0].sign());
if (i % 4 == 1){
signers[1].updateContent(msgBuilder.getMsg());
msgBuilder.addSig(signers[1].sign());
}
}
// Post message.
@ -166,6 +190,20 @@ public class GenericBulletinBoardServerTest {
signers[0].initVerify(msg.getSig(0));
signers[0].updateContent(msg.getMsg());
assertTrue("Signature did not verify!", signers[0].verify());
if (msg.getEntryNum() % 4 == 1){
signers[1].initVerify(msg.getSig(1));
signers[1].updateContent(msg.getMsg());
assertTrue("Signature did not verify!", signers[1].verify());
assertThat(msg.getSigCount(), is(2));
}
else{
assertThat(msg.getSigCount(), is(1));
}
}
else{
assertThat(msg.getSigCount(), is(0));
}
}

View File

@ -22,7 +22,7 @@ import javax.ws.rs.core.Response;
public class SQLiteServerIntegrationTest {
private static String PROP_GETTY_URL = "gretty.httpBaseURI";
private static String DEFAULT_BASE_URL = "localhost:8081";
private static String DEFAULT_BASE_URL = "http://localhost:8081";
private static String BASE_URL = System.getProperty(PROP_GETTY_URL, DEFAULT_BASE_URL);
private static String SQL_SERVER_POST = "sqlserver/postmessage";
private static String SQL_SERVER_GET = "sqlserver/readmessages";
@ -32,6 +32,7 @@ public class SQLiteServerIntegrationTest {
@Before
public void setup() throws Exception {
System.err.println("Registering client");
client = ClientBuilder.newClient();
client.register(ProtobufMessageBodyReader.class);
client.register(ProtobufMessageBodyWriter.class);
@ -64,7 +65,11 @@ public class SQLiteServerIntegrationTest {
// Test writing mechanism
System.err.println("******** Testing: " + SQL_SERVER_POST);
System.err.println(BASE_URL);
System.err.println(SQL_SERVER_POST);
System.err.println(client.getConfiguration());
webTarget = client.target(BASE_URL).path(SQL_SERVER_POST);
System.err.println(webTarget.getUri());
msg = BulletinBoardMessage.newBuilder()
.setMsg(UnsignedBulletinBoardMessage.newBuilder()

View File

@ -3,8 +3,6 @@ package meerkat.bulletinboard;
import meerkat.comm.CommunicationException;
import meerkat.protobuf.BulletinBoardAPI.*;
import java.io.File;
/**
* Created by Arbel on 07/11/15.
*
@ -19,7 +17,7 @@ public interface BulletinBoardServer{
* It also establishes the connection to the DB.
* @throws CommunicationException on DB connection error.
*/
public void init(File meerkatDB) throws CommunicationException;
public void init(String meerkatDB) throws CommunicationException;
/**
* Post a message to bulletin board.