From 83fafdcfeba95998ecd45063397d6489a488e210 Mon Sep 17 00:00:00 2001 From: Maxime Dor Date: Mon, 6 Nov 2017 11:16:22 +0100 Subject: [PATCH] Add config option to disable HS lookup for directory searches --- .../kamax/mxisd/config/DirectoryConfig.java | 59 +++++++++++++++++ .../mxisd/directory/DirectoryManager.java | 65 ++++++++++--------- src/main/resources/application.yaml | 4 ++ 3 files changed, 99 insertions(+), 29 deletions(-) create mode 100644 src/main/java/io/kamax/mxisd/config/DirectoryConfig.java diff --git a/src/main/java/io/kamax/mxisd/config/DirectoryConfig.java b/src/main/java/io/kamax/mxisd/config/DirectoryConfig.java new file mode 100644 index 00000000..ae220000 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/config/DirectoryConfig.java @@ -0,0 +1,59 @@ +/* + * mxisd - Matrix Identity Server Daemon + * Copyright (C) 2017 Maxime Dor + * + * https://max.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 . + */ + +package io.kamax.mxisd.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties("directory") +public class DirectoryConfig { + + private final transient Logger log = LoggerFactory.getLogger(DnsOverwriteConfig.class); + + public static class Exclude { + + private boolean homeserver; + + public boolean getHomeserver() { + return homeserver; + } + + public Exclude setHomeserver(boolean homeserver) { + this.homeserver = homeserver; + return this; + } + + } + + private Exclude exclude = new Exclude(); + + public Exclude getExclude() { + return exclude; + } + + public void setExclude(Exclude exclude) { + this.exclude = exclude; + } + +} diff --git a/src/main/java/io/kamax/mxisd/directory/DirectoryManager.java b/src/main/java/io/kamax/mxisd/directory/DirectoryManager.java index 5ba270b3..2ce3cbb8 100644 --- a/src/main/java/io/kamax/mxisd/directory/DirectoryManager.java +++ b/src/main/java/io/kamax/mxisd/directory/DirectoryManager.java @@ -23,6 +23,7 @@ import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import io.kamax.matrix.MatrixErrorInfo; +import io.kamax.mxisd.config.DirectoryConfig; import io.kamax.mxisd.controller.directory.v1.io.UserDirectorySearchRequest; import io.kamax.mxisd.controller.directory.v1.io.UserDirectorySearchResult; import io.kamax.mxisd.dns.ClientDnsOverwrite; @@ -54,6 +55,7 @@ public class DirectoryManager { private Logger log = LoggerFactory.getLogger(DirectoryManager.class); + private DirectoryConfig cfg; private List providers; private ClientDnsOverwrite dns; @@ -61,7 +63,8 @@ public class DirectoryManager { private Gson gson; @Autowired - public DirectoryManager(List providers, ClientDnsOverwrite dns) { + public DirectoryManager(DirectoryConfig cfg, List providers, ClientDnsOverwrite dns) { + this.cfg = cfg; this.dns = dns; this.client = HttpClients.custom().setUserAgent("mxisd").build(); //FIXME centralize this.gson = GsonUtil.build(); @@ -76,37 +79,41 @@ public UserDirectorySearchResult search(URI target, String accessToken, String q log.info("Original request URL: {}", target); UserDirectorySearchResult result = new UserDirectorySearchResult(); - URIBuilder builder = dns.transform(target); - log.info("Querying HS at {}", builder); - builder.setParameter("access_token", accessToken); - HttpPost req = RestClientUtils.post( - builder.toString(), - new UserDirectorySearchRequest(query)); - try (CloseableHttpResponse res = client.execute(req)) { - int status = res.getStatusLine().getStatusCode(); - Charset charset = ContentType.getOrDefault(res.getEntity()).getCharset(); - String body = IOUtils.toString(res.getEntity().getContent(), charset); - - if (status != 200) { - MatrixErrorInfo info = gson.fromJson(body, MatrixErrorInfo.class); - if (StringUtils.equals("M_UNRECOGNIZED", info.getErrcode())) { // FIXME no hardcoding, use Enum - log.warn("Homeserver does not support Directory feature, skipping"); - } else { - log.error("Homeserver returned an error while performing directory search"); - throw new MatrixException(status, info.getErrcode(), info.getError()); + if (cfg.getExclude().getHomeserver()) { + log.info("Skipping HS directory data, disabled in config"); + } else { + URIBuilder builder = dns.transform(target); + log.info("Querying HS at {}", builder); + builder.setParameter("access_token", accessToken); + HttpPost req = RestClientUtils.post( + builder.toString(), + new UserDirectorySearchRequest(query)); + try (CloseableHttpResponse res = client.execute(req)) { + int status = res.getStatusLine().getStatusCode(); + Charset charset = ContentType.getOrDefault(res.getEntity()).getCharset(); + String body = IOUtils.toString(res.getEntity().getContent(), charset); + + if (status != 200) { + MatrixErrorInfo info = gson.fromJson(body, MatrixErrorInfo.class); + if (StringUtils.equals("M_UNRECOGNIZED", info.getErrcode())) { // FIXME no hardcoding, use Enum + log.warn("Homeserver does not support Directory feature, skipping"); + } else { + log.error("Homeserver returned an error while performing directory search"); + throw new MatrixException(status, info.getErrcode(), info.getError()); + } } - } - UserDirectorySearchResult resultHs = gson.fromJson(body, UserDirectorySearchResult.class); - log.info("Found {} match(es) in HS for '{}'", resultHs.getResults().size(), query); - result.getResults().addAll(resultHs.getResults()); - if (resultHs.isLimited()) { - result.setLimited(true); + UserDirectorySearchResult resultHs = gson.fromJson(body, UserDirectorySearchResult.class); + log.info("Found {} match(es) in HS for '{}'", resultHs.getResults().size(), query); + result.getResults().addAll(resultHs.getResults()); + if (resultHs.isLimited()) { + result.setLimited(true); + } + } catch (JsonSyntaxException e) { + throw new InternalServerError("Invalid JSON reply from the HS: " + e.getMessage()); + } catch (IOException e) { + throw new InternalServerError("Unable to query the HS: I/O error: " + e.getMessage()); } - } catch (JsonSyntaxException e) { - throw new InternalServerError("Invalid JSON reply from the HS: " + e.getMessage()); - } catch (IOException e) { - throw new InternalServerError("Unable to query the HS: I/O error: " + e.getMessage()); } for (IDirectoryProvider provider : providers) { diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 2022e0dd..45d9b49a 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -227,6 +227,10 @@ view: storage: backend: 'sqlite' +directory: + exclude: + homeserver: false + --- spring: profiles: systemd