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 0000000..ae22000
--- /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 5ba270b..2ce3cbb 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 @@ package io.kamax.mxisd.directory;
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 class DirectoryManager {
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 (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());
+ 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 2022e0d..45d9b49 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