Add the hash lookup handler.
This commit is contained in:
@@ -199,7 +199,10 @@ public class HttpMxisd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void hashEndpoints(RoutingHandler routingHandler) {
|
private void hashEndpoints(RoutingHandler routingHandler) {
|
||||||
routingHandler.get(HashDetailsHandler.PATH, AuthorizationHandler.around(m.getAccMgr(), sane(new HashDetailsHandler(m.getHashManager()))));
|
routingHandler
|
||||||
|
.get(HashDetailsHandler.PATH, AuthorizationHandler.around(m.getAccMgr(), sane(new HashDetailsHandler(m.getHashManager()))));
|
||||||
|
routingHandler.post(HashLookupHandler.Path,
|
||||||
|
AuthorizationHandler.around(m.getAccMgr(), sane(new HashLookupHandler(m.getIdentity(), m.getHashManager()))));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addEndpoints(RoutingHandler routingHandler, HttpString method, boolean useAuthorization, ApiHandler... handlers) {
|
private void addEndpoints(RoutingHandler routingHandler, HttpString method, boolean useAuthorization, ApiHandler... handlers) {
|
||||||
|
@@ -119,7 +119,10 @@ public class Mxisd {
|
|||||||
ServiceLoader.load(IdentityStoreSupplier.class).iterator().forEachRemaining(p -> p.accept(this));
|
ServiceLoader.load(IdentityStoreSupplier.class).iterator().forEachRemaining(p -> p.accept(this));
|
||||||
ServiceLoader.load(NotificationHandlerSupplier.class).iterator().forEachRemaining(p -> p.accept(this));
|
ServiceLoader.load(NotificationHandlerSupplier.class).iterator().forEachRemaining(p -> p.accept(this));
|
||||||
|
|
||||||
idStrategy = new RecursivePriorityLookupStrategy(cfg.getLookup(), ThreePidProviders.get(), bridgeFetcher);
|
hashManager = new HashManager();
|
||||||
|
hashManager.init(cfg.getHashing(), ThreePidProviders.get());
|
||||||
|
|
||||||
|
idStrategy = new RecursivePriorityLookupStrategy(cfg.getLookup(), ThreePidProviders.get(), bridgeFetcher, hashManager);
|
||||||
pMgr = new ProfileManager(ProfileProviders.get(), clientDns, httpClient);
|
pMgr = new ProfileManager(ProfileProviders.get(), clientDns, httpClient);
|
||||||
notifMgr = new NotificationManager(cfg.getNotification(), NotificationHandlers.get());
|
notifMgr = new NotificationManager(cfg.getNotification(), NotificationHandlers.get());
|
||||||
sessMgr = new SessionManager(cfg, store, notifMgr, resolver, httpClient, signMgr);
|
sessMgr = new SessionManager(cfg, store, notifMgr, resolver, httpClient, signMgr);
|
||||||
@@ -129,9 +132,6 @@ public class Mxisd {
|
|||||||
regMgr = new RegistrationManager(cfg.getRegister(), httpClient, clientDns, invMgr);
|
regMgr = new RegistrationManager(cfg.getRegister(), httpClient, clientDns, invMgr);
|
||||||
asHander = new AppSvcManager(this);
|
asHander = new AppSvcManager(this);
|
||||||
accMgr = new AccountManager(store, resolver, getHttpClient(), cfg.getAccountConfig(), cfg.getMatrix());
|
accMgr = new AccountManager(store, resolver, getHttpClient(), cfg.getAccountConfig(), cfg.getMatrix());
|
||||||
|
|
||||||
hashManager = new HashManager();
|
|
||||||
hashManager.init(cfg.getHashing(), ThreePidProviders.get());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MxisdConfig getConfig() {
|
public MxisdConfig getConfig() {
|
||||||
|
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* mxisd - Matrix Identity Server Daemon
|
||||||
|
* Copyright (C) 2017 Kamax Sarl
|
||||||
|
*
|
||||||
|
* https://www.kamax.io/
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.kamax.mxisd.exception;
|
||||||
|
|
||||||
|
public class InvalidParamException extends RuntimeException {
|
||||||
|
|
||||||
|
public InvalidParamException() {
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* mxisd - Matrix Identity Server Daemon
|
||||||
|
* Copyright (C) 2017 Kamax Sarl
|
||||||
|
*
|
||||||
|
* https://www.kamax.io/
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.kamax.mxisd.exception;
|
||||||
|
|
||||||
|
public class InvalidPepperException extends RuntimeException {
|
||||||
|
|
||||||
|
public InvalidPepperException() {
|
||||||
|
}
|
||||||
|
}
|
@@ -11,6 +11,7 @@ import io.kamax.mxisd.lookup.provider.IThreePidProvider;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
@@ -1,13 +1,15 @@
|
|||||||
package io.kamax.mxisd.hash.storage;
|
package io.kamax.mxisd.hash.storage;
|
||||||
|
|
||||||
import io.kamax.mxisd.lookup.ThreePidMapping;
|
import io.kamax.mxisd.lookup.ThreePidMapping;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
public class EmptyStorage implements HashStorage {
|
public class EmptyStorage implements HashStorage {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<ThreePidMapping> find(Iterable<String> hashes) {
|
public Collection<Pair<String, ThreePidMapping>> find(Iterable<String> hashes) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,10 +1,13 @@
|
|||||||
package io.kamax.mxisd.hash.storage;
|
package io.kamax.mxisd.hash.storage;
|
||||||
|
|
||||||
import io.kamax.mxisd.lookup.ThreePidMapping;
|
import io.kamax.mxisd.lookup.ThreePidMapping;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
public interface HashStorage {
|
public interface HashStorage {
|
||||||
|
|
||||||
Iterable<ThreePidMapping> find(Iterable<String> hashes);
|
Collection<Pair<String, ThreePidMapping>> find(Iterable<String> hashes);
|
||||||
|
|
||||||
void add(ThreePidMapping pidMapping, String hash);
|
void add(ThreePidMapping pidMapping, String hash);
|
||||||
|
|
||||||
|
@@ -1,8 +1,10 @@
|
|||||||
package io.kamax.mxisd.hash.storage;
|
package io.kamax.mxisd.hash.storage;
|
||||||
|
|
||||||
import io.kamax.mxisd.lookup.ThreePidMapping;
|
import io.kamax.mxisd.lookup.ThreePidMapping;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@@ -12,12 +14,12 @@ public class InMemoryHashStorage implements HashStorage {
|
|||||||
private final Map<String, ThreePidMapping> mapping = new ConcurrentHashMap<>();
|
private final Map<String, ThreePidMapping> mapping = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<ThreePidMapping> find(Iterable<String> hashes) {
|
public Collection<Pair<String, ThreePidMapping>> find(Iterable<String> hashes) {
|
||||||
List<ThreePidMapping> result = new ArrayList<>();
|
List<Pair<String, ThreePidMapping>> result = new ArrayList<>();
|
||||||
for (String hash : hashes) {
|
for (String hash : hashes) {
|
||||||
ThreePidMapping pidMapping = mapping.get(hash);
|
ThreePidMapping pidMapping = mapping.get(hash);
|
||||||
if (pidMapping != null) {
|
if (pidMapping != null) {
|
||||||
result.add(pidMapping);
|
result.add(Pair.of(hash, pidMapping));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* mxisd - Matrix Identity Server Daemon
|
||||||
|
* Copyright (C) 2017 Kamax Sarl
|
||||||
|
*
|
||||||
|
* https://www.kamax.io/
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.kamax.mxisd.http.io.identity;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ClientHashLookupAnswer {
|
||||||
|
|
||||||
|
private Map<String, String> mappings = new HashMap<>();
|
||||||
|
|
||||||
|
public Map<String, String> getMappings() {
|
||||||
|
return mappings;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* mxisd - Matrix Identity Server Daemon
|
||||||
|
* Copyright (C) 2017 Kamax Sarl
|
||||||
|
*
|
||||||
|
* https://www.kamax.io/
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.kamax.mxisd.http.io.identity;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ClientHashLookupRequest {
|
||||||
|
|
||||||
|
private String algorithm;
|
||||||
|
private String pepper;
|
||||||
|
private List<String> addresses = new ArrayList<>();
|
||||||
|
|
||||||
|
public String getAlgorithm() {
|
||||||
|
return algorithm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAlgorithm(String algorithm) {
|
||||||
|
this.algorithm = algorithm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPepper() {
|
||||||
|
return pepper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPepper(String pepper) {
|
||||||
|
this.pepper = pepper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getAddresses() {
|
||||||
|
return addresses;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddresses(List<String> addresses) {
|
||||||
|
this.addresses = addresses;
|
||||||
|
}
|
||||||
|
}
|
@@ -87,6 +87,10 @@ public class SaneHandler extends BasicHttpHandler {
|
|||||||
respond(exchange, HttpStatus.SC_NOT_FOUND, "M_NOT_FOUND", e.getMessage());
|
respond(exchange, HttpStatus.SC_NOT_FOUND, "M_NOT_FOUND", e.getMessage());
|
||||||
} catch (NotImplementedException e) {
|
} catch (NotImplementedException e) {
|
||||||
respond(exchange, HttpStatus.SC_NOT_IMPLEMENTED, "M_NOT_IMPLEMENTED", e.getMessage());
|
respond(exchange, HttpStatus.SC_NOT_IMPLEMENTED, "M_NOT_IMPLEMENTED", e.getMessage());
|
||||||
|
} catch (InvalidPepperException e) {
|
||||||
|
respond(exchange, HttpStatus.SC_BAD_REQUEST, "M_INVALID_PEPPER", e.getMessage());
|
||||||
|
} catch (InvalidParamException e) {
|
||||||
|
respond(exchange, HttpStatus.SC_BAD_REQUEST, "M_INVALID_PARAM", e.getMessage());
|
||||||
} catch (FeatureNotAvailable e) {
|
} catch (FeatureNotAvailable e) {
|
||||||
if (StringUtils.isNotBlank(e.getInternalReason())) {
|
if (StringUtils.isNotBlank(e.getInternalReason())) {
|
||||||
log.error("Feature not available: {}", e.getInternalReason());
|
log.error("Feature not available: {}", e.getInternalReason());
|
||||||
|
@@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* mxisd - Matrix Identity Server Daemon
|
||||||
|
* Copyright (C) 2018 Kamax Sarl
|
||||||
|
*
|
||||||
|
* https://www.kamax.io/
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.kamax.mxisd.http.undertow.handler.identity.v1;
|
||||||
|
|
||||||
|
import io.kamax.mxisd.exception.InvalidParamException;
|
||||||
|
import io.kamax.mxisd.exception.InvalidPepperException;
|
||||||
|
import io.kamax.mxisd.hash.HashManager;
|
||||||
|
import io.kamax.mxisd.http.IsAPIv2;
|
||||||
|
import io.kamax.mxisd.http.io.identity.ClientHashLookupAnswer;
|
||||||
|
import io.kamax.mxisd.http.io.identity.ClientHashLookupRequest;
|
||||||
|
import io.kamax.mxisd.http.undertow.handler.ApiHandler;
|
||||||
|
import io.kamax.mxisd.http.undertow.handler.identity.share.LookupHandler;
|
||||||
|
import io.kamax.mxisd.lookup.BulkLookupRequest;
|
||||||
|
import io.kamax.mxisd.lookup.HashLookupRequest;
|
||||||
|
import io.kamax.mxisd.lookup.ThreePidMapping;
|
||||||
|
import io.kamax.mxisd.lookup.strategy.LookupStrategy;
|
||||||
|
import io.undertow.server.HttpServerExchange;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class HashLookupHandler extends LookupHandler implements ApiHandler {
|
||||||
|
|
||||||
|
public static final String Path = IsAPIv2.Base + "/lookup";
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(HashLookupHandler.class);
|
||||||
|
|
||||||
|
private LookupStrategy strategy;
|
||||||
|
private HashManager hashManager;
|
||||||
|
|
||||||
|
public HashLookupHandler(LookupStrategy strategy, HashManager hashManager) {
|
||||||
|
this.strategy = strategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleRequest(HttpServerExchange exchange) throws Exception {
|
||||||
|
ClientHashLookupRequest input = parseJsonTo(exchange, ClientHashLookupRequest.class);
|
||||||
|
HashLookupRequest lookupRequest = new HashLookupRequest();
|
||||||
|
setRequesterInfo(lookupRequest, exchange);
|
||||||
|
log.info("Got bulk lookup request from {} with client {} - Is recursive? {}",
|
||||||
|
lookupRequest.getRequester(), lookupRequest.getUserAgent(), lookupRequest.isRecursive());
|
||||||
|
|
||||||
|
if (!hashManager.getHashEngine().getPepper().equals(input.getPepper())) {
|
||||||
|
throw new InvalidPepperException();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (input.getAlgorithm()) {
|
||||||
|
case "none":
|
||||||
|
noneAlgorithm(exchange, lookupRequest, input);
|
||||||
|
break;
|
||||||
|
case "sha256":
|
||||||
|
sha256Algorithm(exchange, lookupRequest, input);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new InvalidParamException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void noneAlgorithm(HttpServerExchange exchange, HashLookupRequest request, ClientHashLookupRequest input) throws Exception {
|
||||||
|
BulkLookupRequest bulkLookupRequest = new BulkLookupRequest();
|
||||||
|
List<ThreePidMapping> mappings = new ArrayList<>();
|
||||||
|
for (String address : input.getAddresses()) {
|
||||||
|
String[] parts = address.split(" ");
|
||||||
|
ThreePidMapping mapping = new ThreePidMapping();
|
||||||
|
mapping.setMedium(parts[0]);
|
||||||
|
mapping.setValue(parts[1]);
|
||||||
|
mappings.add(mapping);
|
||||||
|
}
|
||||||
|
bulkLookupRequest.setMappings(mappings);
|
||||||
|
|
||||||
|
ClientHashLookupAnswer answer = new ClientHashLookupAnswer();
|
||||||
|
|
||||||
|
for (ThreePidMapping mapping : strategy.find(bulkLookupRequest).get()) {
|
||||||
|
answer.getMappings().put(mapping.getMedium() + " " + mapping.getValue(), mapping.getMxid());
|
||||||
|
}
|
||||||
|
log.info("Finished bulk lookup request from {}", request.getRequester());
|
||||||
|
|
||||||
|
respondJson(exchange, answer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sha256Algorithm(HttpServerExchange exchange, HashLookupRequest request, ClientHashLookupRequest input) {
|
||||||
|
ClientHashLookupAnswer answer = new ClientHashLookupAnswer();
|
||||||
|
for (Pair<String, ThreePidMapping> pair : hashManager.getHashStorage().find(request.getHashes())) {
|
||||||
|
answer.getMappings().put(pair.getKey(), pair.getValue().getMxid());
|
||||||
|
}
|
||||||
|
log.info("Finished bulk lookup request from {}", request.getRequester());
|
||||||
|
|
||||||
|
respondJson(exchange, answer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getHandlerPath() {
|
||||||
|
return "/bulk_lookup";
|
||||||
|
}
|
||||||
|
}
|
16
src/main/java/io/kamax/mxisd/lookup/HashLookupRequest.java
Normal file
16
src/main/java/io/kamax/mxisd/lookup/HashLookupRequest.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package io.kamax.mxisd.lookup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class HashLookupRequest extends ALookupRequest {
|
||||||
|
|
||||||
|
private List<String> hashes;
|
||||||
|
|
||||||
|
public List<String> getHashes() {
|
||||||
|
return hashes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHashes(List<String> hashes) {
|
||||||
|
this.hashes = hashes;
|
||||||
|
}
|
||||||
|
}
|
@@ -21,6 +21,7 @@
|
|||||||
package io.kamax.mxisd.lookup.strategy;
|
package io.kamax.mxisd.lookup.strategy;
|
||||||
|
|
||||||
import io.kamax.mxisd.lookup.BulkLookupRequest;
|
import io.kamax.mxisd.lookup.BulkLookupRequest;
|
||||||
|
import io.kamax.mxisd.lookup.HashLookupRequest;
|
||||||
import io.kamax.mxisd.lookup.SingleLookupReply;
|
import io.kamax.mxisd.lookup.SingleLookupReply;
|
||||||
import io.kamax.mxisd.lookup.SingleLookupRequest;
|
import io.kamax.mxisd.lookup.SingleLookupRequest;
|
||||||
import io.kamax.mxisd.lookup.ThreePidMapping;
|
import io.kamax.mxisd.lookup.ThreePidMapping;
|
||||||
@@ -46,4 +47,5 @@ public interface LookupStrategy {
|
|||||||
|
|
||||||
CompletableFuture<List<ThreePidMapping>> find(BulkLookupRequest requests);
|
CompletableFuture<List<ThreePidMapping>> find(BulkLookupRequest requests);
|
||||||
|
|
||||||
|
CompletableFuture<List<ThreePidMapping>> find(HashLookupRequest request);
|
||||||
}
|
}
|
||||||
|
@@ -25,10 +25,13 @@ import io.kamax.matrix.json.GsonUtil;
|
|||||||
import io.kamax.matrix.json.MatrixJson;
|
import io.kamax.matrix.json.MatrixJson;
|
||||||
import io.kamax.mxisd.config.MxisdConfig;
|
import io.kamax.mxisd.config.MxisdConfig;
|
||||||
import io.kamax.mxisd.exception.ConfigurationException;
|
import io.kamax.mxisd.exception.ConfigurationException;
|
||||||
|
import io.kamax.mxisd.hash.HashManager;
|
||||||
|
import io.kamax.mxisd.hash.storage.HashStorage;
|
||||||
import io.kamax.mxisd.lookup.*;
|
import io.kamax.mxisd.lookup.*;
|
||||||
import io.kamax.mxisd.lookup.fetcher.IBridgeFetcher;
|
import io.kamax.mxisd.lookup.fetcher.IBridgeFetcher;
|
||||||
import io.kamax.mxisd.lookup.provider.IThreePidProvider;
|
import io.kamax.mxisd.lookup.provider.IThreePidProvider;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -50,10 +53,14 @@ public class RecursivePriorityLookupStrategy implements LookupStrategy {
|
|||||||
|
|
||||||
private List<CIDRUtils> allowedCidr = new ArrayList<>();
|
private List<CIDRUtils> allowedCidr = new ArrayList<>();
|
||||||
|
|
||||||
public RecursivePriorityLookupStrategy(MxisdConfig.Lookup cfg, List<? extends IThreePidProvider> providers, IBridgeFetcher bridge) {
|
private HashManager hashManager;
|
||||||
|
|
||||||
|
public RecursivePriorityLookupStrategy(MxisdConfig.Lookup cfg, List<? extends IThreePidProvider> providers, IBridgeFetcher bridge,
|
||||||
|
HashManager hashManager) {
|
||||||
this.cfg = cfg;
|
this.cfg = cfg;
|
||||||
this.bridge = bridge;
|
this.bridge = bridge;
|
||||||
this.providers = new ArrayList<>(providers);
|
this.providers = new ArrayList<>(providers);
|
||||||
|
this.hashManager = hashManager;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
log.info("Found {} providers", providers.size());
|
log.info("Found {} providers", providers.size());
|
||||||
@@ -65,6 +72,8 @@ public class RecursivePriorityLookupStrategy implements LookupStrategy {
|
|||||||
log.info("{} is allowed for recursion", cidr);
|
log.info("{} is allowed for recursion", cidr);
|
||||||
allowedCidr.add(new CIDRUtils(cidr));
|
allowedCidr.add(new CIDRUtils(cidr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("Hash lookups enabled: {}", hashManager.getConfig().isEnabled());
|
||||||
} catch (UnknownHostException e) {
|
} catch (UnknownHostException e) {
|
||||||
throw new ConfigurationException("lookup.recursive.allowedCidrs", "Allowed CIDRs");
|
throw new ConfigurationException("lookup.recursive.allowedCidrs", "Allowed CIDRs");
|
||||||
}
|
}
|
||||||
@@ -154,20 +163,20 @@ public class RecursivePriorityLookupStrategy implements LookupStrategy {
|
|||||||
Optional<SingleLookupReply> lookupDataOpt = provider.find(request);
|
Optional<SingleLookupReply> lookupDataOpt = provider.find(request);
|
||||||
if (lookupDataOpt.isPresent()) {
|
if (lookupDataOpt.isPresent()) {
|
||||||
log.info("Found 3PID mapping: {medium: '{}', address: '{}', mxid: '{}'}",
|
log.info("Found 3PID mapping: {medium: '{}', address: '{}', mxid: '{}'}",
|
||||||
request.getType(), request.getThreePid(), lookupDataOpt.get().getMxid().getId());
|
request.getType(), request.getThreePid(), lookupDataOpt.get().getMxid().getId());
|
||||||
return lookupDataOpt;
|
return lookupDataOpt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
cfg.getRecursive().getBridge() != null &&
|
cfg.getRecursive().getBridge() != null &&
|
||||||
cfg.getRecursive().getBridge().getEnabled() &&
|
cfg.getRecursive().getBridge().getEnabled() &&
|
||||||
(!cfg.getRecursive().getBridge().getRecursiveOnly() || isAllowedForRecursive(request.getRequester()))
|
(!cfg.getRecursive().getBridge().getRecursiveOnly() || isAllowedForRecursive(request.getRequester()))
|
||||||
) {
|
) {
|
||||||
log.info("Using bridge failover for lookup");
|
log.info("Using bridge failover for lookup");
|
||||||
Optional<SingleLookupReply> lookupDataOpt = bridge.find(request);
|
Optional<SingleLookupReply> lookupDataOpt = bridge.find(request);
|
||||||
log.info("Found 3PID mapping: {medium: '{}', address: '{}', mxid: '{}'}",
|
log.info("Found 3PID mapping: {medium: '{}', address: '{}', mxid: '{}'}",
|
||||||
request.getThreePid(), request.getId(), lookupDataOpt.get().getMxid().getId());
|
request.getThreePid(), request.getId(), lookupDataOpt.get().getMxid().getId());
|
||||||
return lookupDataOpt;
|
return lookupDataOpt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,4 +239,12 @@ public class RecursivePriorityLookupStrategy implements LookupStrategy {
|
|||||||
return bulkLookupInProgress.remove(payloadId);
|
return bulkLookupInProgress.remove(payloadId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompletableFuture<List<ThreePidMapping>> find(HashLookupRequest request) {
|
||||||
|
HashStorage hashStorage = hashManager.getHashStorage();
|
||||||
|
CompletableFuture<List<ThreePidMapping>> result = new CompletableFuture<>();
|
||||||
|
result.complete(hashStorage.find(request.getHashes()).stream().map(Pair::getValue).collect(Collectors.toList()));
|
||||||
|
hashManager.getRotationStrategy().newRequest();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user