diff --git a/src/main/java/io/kamax/mxisd/backend/memory/MemoryIdentityStore.java b/src/main/java/io/kamax/mxisd/backend/memory/MemoryIdentityStore.java index dbebbd4..da53475 100644 --- a/src/main/java/io/kamax/mxisd/backend/memory/MemoryIdentityStore.java +++ b/src/main/java/io/kamax/mxisd/backend/memory/MemoryIdentityStore.java @@ -48,6 +48,7 @@ import java.util.List; import java.util.Optional; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; public class MemoryIdentityStore implements AuthenticatorProvider, DirectoryProvider, IThreePidProvider, ProfileProvider { @@ -171,4 +172,11 @@ public class MemoryIdentityStore implements AuthenticatorProvider, DirectoryProv }).orElseGet(BackendAuthResult::failure); } + @Override + public Iterable populateHashes() { + return cfg.getIdentities().stream() + .map(mic -> mic.getThreepids().stream().map(mtp -> new ThreePidMapping(mtp.getMedium(), mtp.getAddress(), mic.getUsername()))) + .flatMap(s -> s).collect( + Collectors.toList()); + } } diff --git a/src/main/java/io/kamax/mxisd/backend/sql/SqlThreePidProvider.java b/src/main/java/io/kamax/mxisd/backend/sql/SqlThreePidProvider.java index 2cabc3c..c70a042 100644 --- a/src/main/java/io/kamax/mxisd/backend/sql/SqlThreePidProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/sql/SqlThreePidProvider.java @@ -36,6 +36,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -104,4 +105,27 @@ public abstract class SqlThreePidProvider implements IThreePidProvider { return new ArrayList<>(); } + @Override + public Iterable populateHashes() { + if (StringUtils.isBlank(cfg.getLookup().getQuery())) { + log.warn("Lookup query not configured, skip."); + return Collections.emptyList(); + } + + List result = new ArrayList<>(); + try (Connection connection = pool.get()) { + PreparedStatement statement = connection.prepareStatement(cfg.getLookup().getQuery()); + try (ResultSet resultSet = statement.executeQuery()) { + while (resultSet.next()) { + String mxid = resultSet.getString("mxid"); + String medium = resultSet.getString("medium"); + String address = resultSet.getString("address"); + result.add(new ThreePidMapping(medium, address, mxid)); + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return result; + } } diff --git a/src/main/java/io/kamax/mxisd/config/sql/SqlConfig.java b/src/main/java/io/kamax/mxisd/config/sql/SqlConfig.java index 6eb5ed3..44b2d57 100644 --- a/src/main/java/io/kamax/mxisd/config/sql/SqlConfig.java +++ b/src/main/java/io/kamax/mxisd/config/sql/SqlConfig.java @@ -124,6 +124,18 @@ public abstract class SqlConfig { } + public static class Lookup { + private String query; + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } + } + public static class Identity { private Boolean enabled; @@ -264,6 +276,7 @@ public abstract class SqlConfig { private Directory directory = new Directory(); private Identity identity = new Identity(); private Profile profile = new Profile(); + private Lookup lookup = new Lookup(); public boolean isEnabled() { return enabled; @@ -321,6 +334,14 @@ public abstract class SqlConfig { this.profile = profile; } + public Lookup getLookup() { + return lookup; + } + + public void setLookup(Lookup lookup) { + this.lookup = lookup; + } + protected abstract String getProviderName(); public void build() { @@ -354,6 +375,7 @@ public abstract class SqlConfig { log.info("Identity type: {}", getIdentity().getType()); log.info("3PID mapping query: {}", getIdentity().getQuery()); log.info("Identity medium queries: {}", GsonUtil.build().toJson(getIdentity().getMedium())); + log.info("Lookup query: {}", getLookup().getQuery()); log.info("Profile:"); log.info(" Enabled: {}", getProfile().isEnabled()); if (getProfile().isEnabled()) {