MSC2140 Add hash configuration.

This commit is contained in:
Anatoly Sablin
2019-11-06 00:20:39 +03:00
parent 14ad4435bc
commit 8d346037b7
4 changed files with 42 additions and 14 deletions

View File

@@ -54,6 +54,7 @@ import io.kamax.mxisd.http.undertow.handler.identity.share.SignEd25519Handler;
import io.kamax.mxisd.http.undertow.handler.identity.share.StoreInviteHandler; import io.kamax.mxisd.http.undertow.handler.identity.share.StoreInviteHandler;
import io.kamax.mxisd.http.undertow.handler.identity.v1.*; import io.kamax.mxisd.http.undertow.handler.identity.v1.*;
import io.kamax.mxisd.http.undertow.handler.identity.v2.HashDetailsHandler; import io.kamax.mxisd.http.undertow.handler.identity.v2.HashDetailsHandler;
import io.kamax.mxisd.http.undertow.handler.identity.v2.HashLookupHandler;
import io.kamax.mxisd.http.undertow.handler.invite.v1.RoomInviteHandler; import io.kamax.mxisd.http.undertow.handler.invite.v1.RoomInviteHandler;
import io.kamax.mxisd.http.undertow.handler.profile.v1.InternalProfileHandler; import io.kamax.mxisd.http.undertow.handler.profile.v1.InternalProfileHandler;
import io.kamax.mxisd.http.undertow.handler.profile.v1.ProfileHandler; import io.kamax.mxisd.http.undertow.handler.profile.v1.ProfileHandler;

View File

@@ -3,6 +3,9 @@ package io.kamax.mxisd.config;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class HashingConfig { public class HashingConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(HashingConfig.class); private static final Logger LOGGER = LoggerFactory.getLogger(HashingConfig.class);
@@ -12,6 +15,7 @@ public class HashingConfig {
private RotationPolicyEnum rotationPolicy; private RotationPolicyEnum rotationPolicy;
private HashStorageEnum hashStorageType; private HashStorageEnum hashStorageType;
private long delay = 10; private long delay = 10;
private List<Algorithm> algorithms = new ArrayList<>();
public void build() { public void build() {
if (isEnabled()) { if (isEnabled()) {
@@ -27,6 +31,11 @@ public class HashingConfig {
} }
} }
public enum Algorithm {
NONE,
SHA256
}
public enum RotationPolicyEnum { public enum RotationPolicyEnum {
PER_REQUESTS, PER_REQUESTS,
PER_SECONDS PER_SECONDS
@@ -76,4 +85,12 @@ public class HashingConfig {
public void setDelay(long delay) { public void setDelay(long delay) {
this.delay = delay; this.delay = delay;
} }
public List<Algorithm> getAlgorithms() {
return algorithms;
}
public void setAlgorithms(List<Algorithm> algorithms) {
this.algorithms = algorithms;
}
} }

View File

@@ -2,6 +2,7 @@ package io.kamax.mxisd.http.undertow.handler.identity.v2;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import io.kamax.mxisd.config.HashingConfig;
import io.kamax.mxisd.hash.HashManager; import io.kamax.mxisd.hash.HashManager;
import io.kamax.mxisd.http.undertow.handler.BasicHttpHandler; import io.kamax.mxisd.http.undertow.handler.BasicHttpHandler;
import io.undertow.server.HttpServerExchange; import io.undertow.server.HttpServerExchange;
@@ -11,7 +12,6 @@ public class HashDetailsHandler extends BasicHttpHandler {
public static final String PATH = "/_matrix/identity/v2/hash_details"; public static final String PATH = "/_matrix/identity/v2/hash_details";
private final HashManager hashManager; private final HashManager hashManager;
private volatile JsonObject response = null;
public HashDetailsHandler(HashManager hashManager) { public HashDetailsHandler(HashManager hashManager) {
this.hashManager = hashManager; this.hashManager = hashManager;
@@ -23,20 +23,16 @@ public class HashDetailsHandler extends BasicHttpHandler {
} }
private JsonObject getResponse() { private JsonObject getResponse() {
if (response == null) { JsonObject response = new JsonObject();
synchronized (this) { response.addProperty("lookup_pepper", hashManager.getHashEngine().getPepper());
if (response == null) { JsonArray algorithms = new JsonArray();
response = new JsonObject(); HashingConfig config = hashManager.getConfig();
response.addProperty("lookup_pepper", hashManager.getHashEngine().getPepper()); if (config.isEnabled()) {
JsonArray algorithms = new JsonArray(); for (HashingConfig.Algorithm algorithm : config.getAlgorithms()) {
algorithms.add("none"); algorithms.add(algorithm.name().toLowerCase());
if (hashManager.getConfig().isEnabled()) {
algorithms.add("sha256");
}
response.add("algorithms", algorithms);
}
} }
} }
response.add("algorithms", algorithms);
return response; return response;
} }
} }

View File

@@ -18,8 +18,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.kamax.mxisd.http.undertow.handler.identity.v1; package io.kamax.mxisd.http.undertow.handler.identity.v2;
import io.kamax.mxisd.config.HashingConfig;
import io.kamax.mxisd.exception.InvalidParamException; import io.kamax.mxisd.exception.InvalidParamException;
import io.kamax.mxisd.exception.InvalidPepperException; import io.kamax.mxisd.exception.InvalidPepperException;
import io.kamax.mxisd.hash.HashManager; import io.kamax.mxisd.hash.HashManager;
@@ -51,6 +52,7 @@ public class HashLookupHandler extends LookupHandler implements ApiHandler {
public HashLookupHandler(LookupStrategy strategy, HashManager hashManager) { public HashLookupHandler(LookupStrategy strategy, HashManager hashManager) {
this.strategy = strategy; this.strategy = strategy;
this.hashManager = hashManager;
} }
@Override @Override
@@ -61,6 +63,10 @@ public class HashLookupHandler extends LookupHandler implements ApiHandler {
log.info("Got bulk lookup request from {} with client {} - Is recursive? {}", log.info("Got bulk lookup request from {} with client {} - Is recursive? {}",
lookupRequest.getRequester(), lookupRequest.getUserAgent(), lookupRequest.isRecursive()); lookupRequest.getRequester(), lookupRequest.getUserAgent(), lookupRequest.isRecursive());
if (!hashManager.getConfig().isEnabled()) {
throw new InvalidParamException();
}
if (!hashManager.getHashEngine().getPepper().equals(input.getPepper())) { if (!hashManager.getHashEngine().getPepper().equals(input.getPepper())) {
throw new InvalidPepperException(); throw new InvalidPepperException();
} }
@@ -78,6 +84,10 @@ public class HashLookupHandler extends LookupHandler implements ApiHandler {
} }
private void noneAlgorithm(HttpServerExchange exchange, HashLookupRequest request, ClientHashLookupRequest input) throws Exception { private void noneAlgorithm(HttpServerExchange exchange, HashLookupRequest request, ClientHashLookupRequest input) throws Exception {
if (!hashManager.getConfig().getAlgorithms().contains(HashingConfig.Algorithm.NONE)) {
throw new InvalidParamException();
}
BulkLookupRequest bulkLookupRequest = new BulkLookupRequest(); BulkLookupRequest bulkLookupRequest = new BulkLookupRequest();
List<ThreePidMapping> mappings = new ArrayList<>(); List<ThreePidMapping> mappings = new ArrayList<>();
for (String address : input.getAddresses()) { for (String address : input.getAddresses()) {
@@ -100,6 +110,10 @@ public class HashLookupHandler extends LookupHandler implements ApiHandler {
} }
private void sha256Algorithm(HttpServerExchange exchange, HashLookupRequest request, ClientHashLookupRequest input) { private void sha256Algorithm(HttpServerExchange exchange, HashLookupRequest request, ClientHashLookupRequest input) {
if (!hashManager.getConfig().getAlgorithms().contains(HashingConfig.Algorithm.SHA256)) {
throw new InvalidParamException();
}
ClientHashLookupAnswer answer = new ClientHashLookupAnswer(); ClientHashLookupAnswer answer = new ClientHashLookupAnswer();
for (Pair<String, ThreePidMapping> pair : hashManager.getHashStorage().find(request.getHashes())) { for (Pair<String, ThreePidMapping> pair : hashManager.getHashStorage().find(request.getHashes())) {
answer.getMappings().put(pair.getKey(), pair.getValue().getMxid()); answer.getMappings().put(pair.getKey(), pair.getValue().getMxid());