From 9681d76b15cc68f2f8246972ae8266522b92fefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= Date: Tue, 14 Jan 2020 22:33:17 +0100 Subject: Add query installation check --- .../mimuw/cloudatlas/agent/modules/GossipGirl.java | 2 -- .../edu/mimuw/cloudatlas/agent/modules/Qurnik.java | 3 +-- .../pl/edu/mimuw/cloudatlas/model/ValueQuery.java | 11 +++++++++++ .../mimuw/cloudatlas/querysigner/QueryData.java | 9 ++++++++- .../querysigner/QuerySignerApiImplementation.java | 22 +++++++++++++++++----- 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java index b6087e6..5137e0b 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java @@ -202,8 +202,6 @@ public class GossipGirl extends Module { state.gotQuery(message); Map queries = new HashMap(); ValueQuery vq = message.getQuery(); - ValueTime timestamp = state.getTheirQueryTimestamp(message.getName()); - vq.setTimestamp(timestamp.getValue()); queries.put(message.getName(), vq); UpdateQueriesMessage updateMessage = new UpdateQueriesMessage("", 0, queries); System.out.println("INFO: GossipGirl sending UpdateQueriesMessage"); diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Qurnik.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Qurnik.java index 9a544d9..c94a87d 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Qurnik.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Qurnik.java @@ -66,7 +66,6 @@ public class Qurnik extends Module { } private void executeAllQueries(ZMI zmi, List queries, PathName currentPath) throws InterruptedException { - System.out.println("INFO: Qurnik executing all queries " + queries); if(!zmi.getSons().isEmpty()) { for(ZMI son : zmi.getSons()) { Value sonName = son.getAttributes().getOrNull("name"); @@ -81,7 +80,7 @@ public class Qurnik extends Module { Interpreter interpreter = new Interpreter(zmi); AttributesMap newAttributes = new AttributesMap(); for (ValueQuery query : queries) { - if (query != null) { + if (query != null && query.isInstalled()) { try { List result = interpreter.interpretProgram(query.getQuery()); for(QueryResult r : result) { diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueQuery.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueQuery.java index f049603..95f826a 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueQuery.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueQuery.java @@ -20,6 +20,8 @@ public class ValueQuery extends Value { private byte[] signature; // Query signing timestamp private long timestamp; + // Query installation status + private boolean installed; /** * Constructs a new ValueQuery object. @@ -34,6 +36,7 @@ public class ValueQuery extends Value { } this.signature = null; this.timestamp = System.currentTimeMillis(); + this.installed = true; } public ValueQuery(String query, byte[] querySignature) throws Exception { @@ -44,6 +47,7 @@ public class ValueQuery extends Value { } this.signature = querySignature; this.timestamp = System.currentTimeMillis(); + this.installed = true; } public ValueQuery(QueryData queryData) throws Exception { @@ -54,6 +58,7 @@ public class ValueQuery extends Value { } this.signature = queryData.getSignature(); this.timestamp = System.currentTimeMillis(); + this.installed = queryData.isInstalled(); } public ValueQuery(String query, long timestamp) throws Exception { @@ -64,6 +69,7 @@ public class ValueQuery extends Value { } this.signature = null; this.timestamp = timestamp; + this.installed = true; } private ValueQuery() { @@ -71,6 +77,7 @@ public class ValueQuery extends Value { this.query = null; this.signature = null; this.timestamp = System.currentTimeMillis(); + this.installed = true; } public String getCode() { return code; } @@ -85,6 +92,10 @@ public class ValueQuery extends Value { public void setTimestamp(long timestamp) { this.timestamp = timestamp; } + public boolean isInstalled() { return installed; } + + public void setInstalled(boolean installed) { this.installed = installed; } + @Override public Type getType() { return TypePrimitive.QUERY; diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java index 7801a28..87b965c 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java @@ -10,10 +10,13 @@ public class QueryData implements Serializable { // Query signing timestamp private long timestamp; + private boolean installed; + public QueryData(String code, byte[] signature) { this.code = code; this.signature = signature; - this.timestamp = System.currentTimeMillis();; + this.timestamp = System.currentTimeMillis(); + this.installed = true; } public String getCode() { @@ -27,4 +30,8 @@ public class QueryData implements Serializable { public long getTimestamp() { return timestamp; } + + public boolean isInstalled() { return installed; } + + public void setInstalled(boolean installed) { this.installed = installed; } } diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java index 3ab2931..a6233d3 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java @@ -1,7 +1,6 @@ package pl.edu.mimuw.cloudatlas.querysigner; import pl.edu.mimuw.cloudatlas.ByteSerializer; -import pl.edu.mimuw.cloudatlas.model.ValueQuery; import pl.edu.mimuw.cloudatlas.querysignerapi.QuerySignerApi; import javax.crypto.BadPaddingException; @@ -20,7 +19,7 @@ public class QuerySignerApiImplementation implements QuerySignerApi { private final static String DIGEST_ALGORITHM = "SHA-256"; private PublicKey publicKey; private PrivateKey privateKey; - private Map queries; + private Map queries; private Set attribsSetByQueries; public QuerySignerApiImplementation(PublicKey publicKey, PrivateKey privateKey) { @@ -90,7 +89,10 @@ public class QuerySignerApiImplementation implements QuerySignerApi { byte[] serializedQuery = serializeQuery(queryName, queryCode, install); byte[] hashedQuery = cryptographicHash(serializedQuery); byte[] querySignature = encryptQuery(hashedQuery); - return new QueryData(queryCode, querySignature); + QueryData newQuery = new QueryData(queryCode, querySignature); + newQuery.setInstalled(install); + this.queries.put(queryName, newQuery); + return newQuery; } catch (Exception e) { e.printStackTrace(); throw new RemoteException(e.getLocalizedMessage()); @@ -99,7 +101,12 @@ public class QuerySignerApiImplementation implements QuerySignerApi { @Override public QueryData signInstallQuery(String queryName, String queryCode) throws RemoteException { - return signQuery(queryName, queryCode, true); + QueryUtils.validateQueryName(queryName); + if (this.queries.containsKey(queryName) && this.queries.get(queryName).isInstalled()) { + throw new RemoteException("Query already installed"); + } else { + return signQuery(queryName, queryCode, true); + } } public static void validateInstallQuery(String queryName, QueryData query, PublicKey publicKey) throws RemoteException,IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, QuerySigner.InvalidQueryException { @@ -120,7 +127,12 @@ public class QuerySignerApiImplementation implements QuerySignerApi { @Override public QueryData signUninstallQuery(String queryName) throws RemoteException { - return signQuery(queryName, "", false); + QueryUtils.validateQueryName(queryName); + if (this.queries.containsKey(queryName) && this.queries.get(queryName).isInstalled()) { + return signQuery(queryName, "", false); + } else { + throw new RemoteException("Query is not installed"); + } } public static void validateUninstallQuery(String queryName, QueryData query, PublicKey publicKey) throws RemoteException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, QuerySigner.InvalidQueryException, NoSuchPaddingException, InvalidKeyException { -- cgit v1.2.3