diff --git a/build.gradle b/build.gradle index b5699a7..022f115 100644 --- a/build.gradle +++ b/build.gradle @@ -64,7 +64,7 @@ String gitVersion() { commandLine = ['git', 'describe', '--tags', '--always', '--dirty'] standardOutput = out } - return out.toString().replace(System.lineSeparator(), ''); + return out.toString().replace(System.lineSeparator(), '') } buildscript { @@ -84,6 +84,9 @@ repositories { } dependencies { + // Logging + compile 'org.slf4j:slf4j-simple:1.7.25' + // Easy file management compile 'commons-io:commons-io:2.5' @@ -93,6 +96,9 @@ dependencies { // Matrix Java SDK compile 'io.kamax:matrix-java-sdk:0.0.14-8-g0e57ec6' + // ORMLite + compile 'com.j256.ormlite:ormlite-jdbc:5.0' + // ed25519 handling compile 'net.i2p.crypto:eddsa:0.1.0' @@ -115,9 +121,6 @@ dependencies { // Google Firebase Authentication backend compile 'com.google.firebase:firebase-admin:5.3.0' - // ORMLite - compile 'com.j256.ormlite:ormlite-jdbc:5.0' - // Connection Pool compile 'com.mchange:c3p0:0.9.5.2' @@ -153,21 +156,10 @@ shadowJar { version = null } -processResources { +task debBuild(dependsOn: shadowJar) { doLast { - copy { - from('build/resources/main/application.yaml') { - rename 'application.yaml', 'mxisd.yaml' - } - into 'build/resources/main' - } - } -} - -task buildDeb(dependsOn: build) { - doLast { - def v = mxisdVersion() - println "Version for package: ${v}" + String debVersion = mxisdVersion() + println "Version for package: ${debVersion}" mkdir distDir mkdir debBuildBasePath mkdir "${debBuildBasePath}/DEBIAN" @@ -193,13 +185,13 @@ task buildDeb(dependsOn: build) { into debBuildConfPath } - ant.replaceregexp( + ant.replaceregexp( // FIXME adapt to new config format file: "${debBuildConfPath}/${debConfFileName}", match: "key.path:(.*)", replace: "key.path: '${debDataPath}/signing.key'" ) - ant.replaceregexp( + ant.replaceregexp( // FIXME adapt to new config format file: "${debBuildConfPath}/${debConfFileName}", match: "storage.provider.sqlite.database:(.*)", replace: "storage.provider.sqlite.database: '${debDataPath}/mxisd.db'" @@ -213,7 +205,7 @@ task buildDeb(dependsOn: build) { ant.replace( file: "${debBuildDebianPath}/control", token: 'Version: 0', - value: "Version: ${v}" + value: "Version: ${debVersion}" ) ant.replace( @@ -249,7 +241,7 @@ task buildDeb(dependsOn: build) { } } -task dockerBuild(type: Exec, dependsOn: build) { +task dockerBuild(type: Exec, dependsOn: shadowJar) { commandLine 'docker', 'build', '-t', dockerImageTag, project.rootDir doLast { diff --git a/src/docker/start.sh b/src/docker/start.sh index 11040f0..0d7acf5 100755 --- a/src/docker/start.sh +++ b/src/docker/start.sh @@ -22,4 +22,4 @@ if [[ -n "$CONF_FILE_PATH" ]] && [ ! -f "$CONF_FILE_PATH" ]; then echo fi -exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.config.location=/etc/mxisd/ -Dspring.config.name=mxisd -jar /mxisd.jar +exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /mxisd.jar diff --git a/src/main/java/io/kamax/mxisd/config/InvitationConfig.java b/src/main/java/io/kamax/mxisd/config/InvitationConfig.java index 388e580..5849558 100644 --- a/src/main/java/io/kamax/mxisd/config/InvitationConfig.java +++ b/src/main/java/io/kamax/mxisd/config/InvitationConfig.java @@ -32,8 +32,8 @@ public class InvitationConfig { public static class Resolution { - private boolean recursive; - private long timer; + private boolean recursive = true; + private long timer = 1; public boolean isRecursive() { return recursive; diff --git a/src/main/java/io/kamax/mxisd/config/MatrixConfig.java b/src/main/java/io/kamax/mxisd/config/MatrixConfig.java index 13894b7..b5dd4ef 100644 --- a/src/main/java/io/kamax/mxisd/config/MatrixConfig.java +++ b/src/main/java/io/kamax/mxisd/config/MatrixConfig.java @@ -20,13 +20,14 @@ package io.kamax.mxisd.config; -import com.google.gson.Gson; +import io.kamax.matrix.json.GsonUtil; import io.kamax.mxisd.exception.ConfigurationException; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -34,8 +35,13 @@ import java.util.Map; public class MatrixConfig { public static class Identity { + private Map> servers = new HashMap<>(); + public Identity() { + servers.put("matrix-org", Collections.singletonList("https://matrix.org")); + } + public Map> getServers() { return servers; } @@ -51,6 +57,7 @@ public class MatrixConfig { return servers.get(label); } + } private transient final Logger log = LoggerFactory.getLogger(MatrixConfig.class); @@ -93,7 +100,7 @@ public class MatrixConfig { log.info("Domain: {}", getDomain()); log.info("Identity:"); - log.info("\tServers: {}", new Gson().toJson(identity.getServers())); + log.info("\tServers: {}", GsonUtil.get().toJson(identity.getServers())); } } diff --git a/src/main/java/io/kamax/mxisd/config/MxisdConfig.java b/src/main/java/io/kamax/mxisd/config/MxisdConfig.java index f1a10ea..787171e 100644 --- a/src/main/java/io/kamax/mxisd/config/MxisdConfig.java +++ b/src/main/java/io/kamax/mxisd/config/MxisdConfig.java @@ -20,22 +20,19 @@ package io.kamax.mxisd.config; -import com.google.gson.JsonObject; import io.kamax.mxisd.config.ldap.generic.GenericLdapConfig; import io.kamax.mxisd.config.ldap.netiq.NetIqLdapConfig; import io.kamax.mxisd.config.memory.MemoryStoreConfig; import io.kamax.mxisd.config.rest.RestBackendConfig; import io.kamax.mxisd.config.sql.generic.GenericSqlProviderConfig; import io.kamax.mxisd.config.sql.synapse.SynapseSqlProviderConfig; +import io.kamax.mxisd.config.threepid.ThreePidConfig; import io.kamax.mxisd.config.threepid.notification.NotificationConfig; import io.kamax.mxisd.config.wordpress.WordpressConfig; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.HashMap; -import java.util.Map; - public class MxisdConfig { private static final Logger log = LoggerFactory.getLogger(MxisdConfig.class); @@ -52,6 +49,10 @@ public class MxisdConfig { this.overwrite = overwrite; } + public void build() { + overwrite.build(); + } + } public static class Lookup { @@ -82,20 +83,6 @@ public class MxisdConfig { } - public static class Threepid { - - private Map medium = new HashMap<>(); - - public Map getMedium() { - return medium; - } - - public void setMedium(Map medium) { - this.medium = medium; - } - - } - private AuthenticationConfig auth = new AuthenticationConfig(); private DirectoryConfig directory = new DirectoryConfig(); private Dns dns = new Dns(); @@ -116,6 +103,7 @@ public class MxisdConfig { private RestBackendConfig rest = new RestBackendConfig(); private GenericSqlProviderConfig sql = new GenericSqlProviderConfig(); private SynapseSqlProviderConfig synapseSql = new SynapseSqlProviderConfig(); + private ThreePidConfig threepid = new ThreePidConfig(); private ViewConfig view = new ViewConfig(); private WordpressConfig wordpress = new WordpressConfig(); @@ -279,6 +267,14 @@ public class MxisdConfig { this.synapseSql = synapseSql; } + public ThreePidConfig getThreepid() { + return threepid; + } + + public void setThreepid(ThreePidConfig threepid) { + this.threepid = threepid; + } + public ViewConfig getView() { return view; } @@ -320,6 +316,7 @@ public class MxisdConfig { getSql().build(); getStorage().build(); getSynapseSql().build(); + getThreepid().build(); getView().build(); getWordpress().build(); diff --git a/src/main/java/io/kamax/mxisd/config/RecursiveLookupBridgeConfig.java b/src/main/java/io/kamax/mxisd/config/RecursiveLookupBridgeConfig.java index 358c25a..54956e4 100644 --- a/src/main/java/io/kamax/mxisd/config/RecursiveLookupBridgeConfig.java +++ b/src/main/java/io/kamax/mxisd/config/RecursiveLookupBridgeConfig.java @@ -32,7 +32,7 @@ public class RecursiveLookupBridgeConfig { private transient final Logger log = LoggerFactory.getLogger(RecursiveLookupBridgeConfig.class); private boolean enabled; - private boolean recursiveOnly; + private boolean recursiveOnly = true; private String server; private Map mappings = new HashMap<>(); diff --git a/src/main/java/io/kamax/mxisd/config/RecursiveLookupConfig.java b/src/main/java/io/kamax/mxisd/config/RecursiveLookupConfig.java index a7915d2..7f2cb6f 100644 --- a/src/main/java/io/kamax/mxisd/config/RecursiveLookupConfig.java +++ b/src/main/java/io/kamax/mxisd/config/RecursiveLookupConfig.java @@ -25,10 +25,18 @@ import java.util.List; public class RecursiveLookupConfig { - private boolean enabled; + private boolean enabled = true; private List allowedCidr = new ArrayList<>(); private RecursiveLookupBridgeConfig bridge = new RecursiveLookupBridgeConfig(); + public RecursiveLookupConfig() { + allowedCidr.add("127.0.0.0/8"); + allowedCidr.add("10.0.0.0/8"); + allowedCidr.add("172.16.0.0/12"); + allowedCidr.add("192.168.0.0/16"); + allowedCidr.add("::1/128"); + } + public boolean isEnabled() { return enabled; } @@ -54,7 +62,7 @@ public class RecursiveLookupConfig { } public void build() { - // no-op + bridge.build(); } } diff --git a/src/main/java/io/kamax/mxisd/config/SessionConfig.java b/src/main/java/io/kamax/mxisd/config/SessionConfig.java index 78f3a2b..f96569e 100644 --- a/src/main/java/io/kamax/mxisd/config/SessionConfig.java +++ b/src/main/java/io/kamax/mxisd/config/SessionConfig.java @@ -20,7 +20,7 @@ package io.kamax.mxisd.config; -import com.google.gson.Gson; +import io.kamax.matrix.json.GsonUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -127,6 +127,19 @@ public class SessionConfig { } + public Policy() { + validation.enabled = true; + validation.forLocal.enabled = true; + validation.forLocal.toLocal = true; + validation.forLocal.toRemote.enabled = true; + validation.forLocal.toRemote.server = "matrix-org"; + + validation.forRemote.enabled = true; + validation.forRemote.toLocal = false; + validation.forRemote.toRemote.enabled = true; + validation.forRemote.toRemote.server = "matrix-org"; + } + private PolicyTemplate validation = new PolicyTemplate(); public PolicyTemplate getValidation() { @@ -152,7 +165,7 @@ public class SessionConfig { @PostConstruct public void build() { log.info("--- Session config ---"); - log.info("Global Policy: {}", new Gson().toJson(policy)); + log.info("Global Policy: {}", GsonUtil.get().toJson(policy)); } } diff --git a/src/main/java/io/kamax/mxisd/config/ViewConfig.java b/src/main/java/io/kamax/mxisd/config/ViewConfig.java index 39330d5..f50d5e0 100644 --- a/src/main/java/io/kamax/mxisd/config/ViewConfig.java +++ b/src/main/java/io/kamax/mxisd/config/ViewConfig.java @@ -96,6 +96,20 @@ public class ViewConfig { private Local localRemote = new Local(); private Remote remote = new Remote(); + public Session() { + local.onTokenSubmit.success = "session/local/tokenSubmitSuccess"; + local.onTokenSubmit.failure = "session/local/tokenSubmitFailure"; + + localRemote.onTokenSubmit.success = "session/localRemote/tokenSubmitSuccess"; + localRemote.onTokenSubmit.failure = "session/local/tokenSubmitFailure"; + + remote.onRequest.success = "session/remote/requestSuccess"; + remote.onRequest.failure = "session/remote/requestFailure"; + + remote.onCheck.success = "session/remote/checkSuccess"; + remote.onCheck.failure = "session/remote/checkFailure"; + } + public Local getLocal() { return local; } diff --git a/src/main/java/io/kamax/mxisd/config/ldap/LdapConfig.java b/src/main/java/io/kamax/mxisd/config/ldap/LdapConfig.java index 3522318..cca2e92 100644 --- a/src/main/java/io/kamax/mxisd/config/ldap/LdapConfig.java +++ b/src/main/java/io/kamax/mxisd/config/ldap/LdapConfig.java @@ -59,9 +59,30 @@ public abstract class LdapConfig { public static class Attribute { private UID uid; - private String name; + private String name = "displayName"; private Map> threepid = new HashMap<>(); + public Attribute() { + uid = new UID(); + uid.setType("uid"); + uid.setValue("saMAccountName"); + + threepid.put("email", Arrays.asList( + "mailPrimaryAddress", + "mail", + "otherMailbox" + )); + + threepid.put("msisdn", Arrays.asList( + "telephoneNumber", + "mobile", + "homePhone", + "otherTelephone", + "otherMobile", + "otherHomePhone" + )); + } + public UID getUid() { return uid; } @@ -104,9 +125,9 @@ public abstract class LdapConfig { public static class Connection { - private boolean tls; + private boolean tls = false; private String host; - private int port; + private int port = 389; private String bindDn; private String bindPassword; private String baseDn; @@ -212,7 +233,7 @@ public abstract class LdapConfig { public static class Identity { private String filter; - private String token; + private String token = "%3pid"; private Map medium = new HashMap<>(); public String getFilter() { diff --git a/src/main/java/io/kamax/mxisd/config/rest/RestBackendConfig.java b/src/main/java/io/kamax/mxisd/config/rest/RestBackendConfig.java index f69e7b3..b3a0469 100644 --- a/src/main/java/io/kamax/mxisd/config/rest/RestBackendConfig.java +++ b/src/main/java/io/kamax/mxisd/config/rest/RestBackendConfig.java @@ -35,8 +35,8 @@ public class RestBackendConfig { public static class IdentityEndpoints { - private String single; - private String bulk; + private String single = "/_mxisd/backend/api/v1/identity/lookup/single"; + private String bulk = "/_mxisd/backend/api/v1/identity/lookup/bulk"; public String getSingle() { return single; @@ -58,9 +58,9 @@ public class RestBackendConfig { public static class ProfileEndpoints { - private String displayName; - private String threepids; - private String roles; + private String displayName = "/_mxisd/backend/api/v1/profile/displayName"; + private String threepids = "/_mxisd/backend/api/v1/profile/threepids"; + private String roles = "/_mxisd/backend/api/v1/profile/roles"; public String getDisplayName() { return displayName; @@ -90,8 +90,8 @@ public class RestBackendConfig { public static class Endpoints { - private String auth; - private String directory; + private String auth = "/_mxisd/backend/api/v1/auth/login"; + private String directory = "/_mxisd/backend/api/v1/directory/user/search"; private IdentityEndpoints identity = new IdentityEndpoints(); private ProfileEndpoints profile; 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 106876b..24265c9 100644 --- a/src/main/java/io/kamax/mxisd/config/sql/SqlConfig.java +++ b/src/main/java/io/kamax/mxisd/config/sql/SqlConfig.java @@ -97,6 +97,14 @@ public abstract class SqlConfig { private Boolean enabled; private Type query = new Type(); + public Directory() { + query.getName().setType("localpart"); + query.getName().setType("SELECT 1"); + + query.getThreepid().setType("localpart"); + query.getThreepid().setType("SELECT 1"); + } + public Boolean isEnabled() { return enabled; } @@ -118,8 +126,8 @@ public abstract class SqlConfig { public static class Identity { private Boolean enabled; - private String type; - private String query; + private String type = "mxid"; + private String query = "SELECT user_id AS uid FROM user_threepids WHERE medium = ? AND address = ?"; private Map medium = new HashMap<>(); public Boolean isEnabled() { @@ -172,7 +180,7 @@ public abstract class SqlConfig { public static class ProfileThreepids { - private String query; + private String query = "SELECT medium, address FROM user_threepids WHERE user_id = ?"; public String getQuery() { return query; @@ -217,7 +225,7 @@ public abstract class SqlConfig { } private boolean enabled; - private String type; + private String type = "sqlite"; private String connection; private Auth auth = new Auth(); private Directory directory = new Directory(); diff --git a/src/main/java/io/kamax/mxisd/config/threepid/ThreePidConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/ThreePidConfig.java new file mode 100644 index 0000000..abb030f --- /dev/null +++ b/src/main/java/io/kamax/mxisd/config/threepid/ThreePidConfig.java @@ -0,0 +1,49 @@ +/* + * mxisd - Matrix Identity Server Daemon + * Copyright (C) 2018 Kamax Sàrl + * + * 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 . + */ + +package io.kamax.mxisd.config.threepid; + +import com.google.gson.JsonObject; +import io.kamax.mxisd.config.threepid.medium.EmailConfig; + +import java.util.HashMap; +import java.util.Map; + +public class ThreePidConfig { + + private Map medium = new HashMap<>(); + + public ThreePidConfig() { + EmailConfig emailCfg = new EmailConfig(); + } + + public Map getMedium() { + return medium; + } + + public void setMedium(Map medium) { + this.medium = medium; + } + + public void build() { + // no-op + } + +} diff --git a/src/main/java/io/kamax/mxisd/config/threepid/connector/EmailSmtpConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/connector/EmailSmtpConfig.java index 332800b..5620671 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/connector/EmailSmtpConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/connector/EmailSmtpConfig.java @@ -31,8 +31,8 @@ public class EmailSmtpConfig { private transient final Logger log = LoggerFactory.getLogger(EmailSmtpConfig.class); private String host; - private int port; - private int tls; + private int port = 587; + private int tls = 1; private String login; private String password; diff --git a/src/main/java/io/kamax/mxisd/config/threepid/medium/EmailConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/medium/EmailConfig.java index e923f28..01906bc 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/medium/EmailConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/medium/EmailConfig.java @@ -20,18 +20,17 @@ package io.kamax.mxisd.config.threepid.medium; -import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.exception.ConfigurationException; import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.WordUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; -public class EmailConfig { +public class EmailConfig extends MediumConfig { public static class Identity { + private String from; private String name; @@ -55,36 +54,17 @@ public class EmailConfig { private transient final Logger log = LoggerFactory.getLogger(EmailConfig.class); - private String generator; - private String connector; - - private MatrixConfig mxCfg; private Identity identity = new Identity(); - public EmailConfig(MatrixConfig mxCfg) { - this.mxCfg = mxCfg; + public EmailConfig() { + setConnector("smtp"); + setGenerator("template"); } public Identity getIdentity() { return identity; } - public String getGenerator() { - return generator; - } - - public void setGenerator(String generator) { - this.generator = generator; - } - - public String getConnector() { - return connector; - } - - public void setConnector(String connector) { - this.connector = connector; - } - @PostConstruct public void build() { log.info("--- E-mail config ---"); @@ -97,12 +77,8 @@ public class EmailConfig { throw new ConfigurationException("connector"); } - log.info("From: {}", identity.getFrom()); - - if (StringUtils.isBlank(identity.getName())) { - identity.setName(WordUtils.capitalize(mxCfg.getDomain()) + " Identity Server"); - } - log.info("Name: {}", identity.getName()); + log.info("From: {}", getIdentity().getFrom()); + log.info("Name: {}", getIdentity().getName()); log.info("Generator: {}", getGenerator()); log.info("Connector: {}", getConnector()); } diff --git a/src/main/java/io/kamax/mxisd/config/threepid/medium/EmailTemplateConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/medium/EmailTemplateConfig.java index e91af08..2ba8ca8 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/medium/EmailTemplateConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/medium/EmailTemplateConfig.java @@ -29,6 +29,13 @@ public class EmailTemplateConfig extends GenericTemplateConfig { private transient final Logger log = LoggerFactory.getLogger(EmailTemplateConfig.class); + public EmailTemplateConfig() { + setInvite("classpath:threepids/email/invite-template.eml"); + getGeneric().put("matrixId", "classpath:threepids/email/mxid-template.eml"); + getSession().getValidation().setLocal("classpath:threepids/email/validate-local-template.eml"); + getSession().getValidation().setRemote("classpath:threepids/email/validate-remote-template.eml"); + } + @PostConstruct public void build() { log.info("--- E-mail Generator templates config ---"); diff --git a/src/main/java/io/kamax/mxisd/config/threepid/medium/MediumConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/medium/MediumConfig.java new file mode 100644 index 0000000..a9e4f13 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/config/threepid/medium/MediumConfig.java @@ -0,0 +1,67 @@ +/* + * mxisd - Matrix Identity Server Daemon + * Copyright (C) 2018 Kamax Sàrl + * + * 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 . + */ + +package io.kamax.mxisd.config.threepid.medium; + +import com.google.gson.JsonObject; + +import java.util.HashMap; +import java.util.Map; + +public class MediumConfig { + + private String connector; + private Map connectors = new HashMap<>(); + private String generator; + private Map generators = new HashMap<>(); + + public String getConnector() { + return connector; + } + + public void setConnector(String connector) { + this.connector = connector; + } + + public Map getConnectors() { + return connectors; + } + + public void setConnectors(Map connectors) { + this.connectors = connectors; + } + + public String getGenerator() { + return generator; + } + + public void setGenerator(String generator) { + this.generator = generator; + } + + public Map getGenerators() { + return generators; + } + + public void setGenerators(Map generators) { + this.generators = generators; + } + +} diff --git a/src/main/java/io/kamax/mxisd/config/threepid/medium/PhoneConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/medium/PhoneConfig.java index dc6f1d4..8ac26b1 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/medium/PhoneConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/medium/PhoneConfig.java @@ -20,50 +20,16 @@ package io.kamax.mxisd.config.threepid.medium; -import io.kamax.mxisd.exception.ConfigurationException; -import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; - -public class PhoneConfig { +public class PhoneConfig extends MediumConfig { private transient final Logger log = LoggerFactory.getLogger(PhoneConfig.class); - private String generator; - private String connector; - - public String getGenerator() { - return generator; - } - - public void setGenerator(String generator) { - this.generator = generator; - } - - public String getConnector() { - return connector; - } - - public void setConnector(String connector) { - this.connector = connector; - } - - @PostConstruct - public void build() { - log.info("--- Phone config ---"); - - if (StringUtils.isBlank(getGenerator())) { - throw new ConfigurationException("generator"); - } - - if (StringUtils.isBlank(getConnector())) { - throw new ConfigurationException("connector"); - } - - log.info("Generator: {}", getGenerator()); - log.info("Connector: {}", getConnector()); + public PhoneConfig() { + setConnector("twilio"); + setGenerator("template"); } } diff --git a/src/main/java/io/kamax/mxisd/config/threepid/medium/PhoneSmsTemplateConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/medium/PhoneSmsTemplateConfig.java index 91b417c..5c799cd 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/medium/PhoneSmsTemplateConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/medium/PhoneSmsTemplateConfig.java @@ -29,6 +29,13 @@ public class PhoneSmsTemplateConfig extends GenericTemplateConfig { private transient final Logger log = LoggerFactory.getLogger(EmailTemplateConfig.class); + public PhoneSmsTemplateConfig() { + setInvite("classpath:threepids/sms/invite-template.txt"); + getGeneric().put("matrixId", "classpath:threepids/email/mxid-template.eml"); + getSession().getValidation().setLocal("classpath:threepids/sms/validate-local-template.txt"); + getSession().getValidation().setRemote("classpath:threepids/sms/validate-remote-template.txt"); + } + @PostConstruct public void build() { log.info("--- SMS Generator templates config ---"); diff --git a/src/main/java/io/kamax/mxisd/config/wordpress/WordpressConfig.java b/src/main/java/io/kamax/mxisd/config/wordpress/WordpressConfig.java index 4776ba5..3c71a20 100644 --- a/src/main/java/io/kamax/mxisd/config/wordpress/WordpressConfig.java +++ b/src/main/java/io/kamax/mxisd/config/wordpress/WordpressConfig.java @@ -24,6 +24,7 @@ import io.kamax.mxisd.exception.ConfigurationException; import org.apache.commons.lang.StringUtils; import javax.annotation.PostConstruct; +import java.util.HashMap; import java.util.Map; public class WordpressConfig { @@ -76,8 +77,14 @@ public class WordpressConfig { public static class Query { - private Map threepid; - private Map directory; + private Map threepid = new HashMap<>(); + private Map directory = new HashMap<>(); + + public Query() { + threepid.put("email", "SELECT user_login as uid FROM %TABLE_PREFIX%users WHERE user_email = ?"); + directory.put("name", "SELECT DISTINCT user_login, display_name FROM %TABLE_PREFIX%users u LEFT JOIN %TABLE_PREFIX%usermeta m ON m.user_id = u.id WHERE u.display_name LIKE ? OR (m.meta_key = 'nickname' AND m.meta_value = ?) OR (m.meta_key = 'first_name' AND m.meta_value = ?) OR (m.meta_key = 'last_name' AND m.meta_value = ?)"); + directory.put("threepid", "SELECT DISTINCT user_login, display_name FROM %TABLE_PREFIX%users WHERE user_email LIKE ?"); + } public Map getThreepid() { return threepid; @@ -95,13 +102,17 @@ public class WordpressConfig { this.directory = directory; } + public void build() { + // FIXME replace table prefix + } + } public static class Sql { - private String type; + private String type = "mysql"; private String connection; - private String tablePrefix; + private String tablePrefix = "wp_"; private Query query; public String getType() { diff --git a/src/main/java/io/kamax/mxisd/invitation/InvitationManager.java b/src/main/java/io/kamax/mxisd/invitation/InvitationManager.java index 8574e3f..6cc8fb4 100644 --- a/src/main/java/io/kamax/mxisd/invitation/InvitationManager.java +++ b/src/main/java/io/kamax/mxisd/invitation/InvitationManager.java @@ -20,11 +20,11 @@ package io.kamax.mxisd.invitation; -import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.kamax.matrix.MatrixID; import io.kamax.matrix.crypto.SignatureManager; +import io.kamax.matrix.json.GsonUtil; import io.kamax.mxisd.config.InvitationConfig; import io.kamax.mxisd.dns.FederationDnsOverwrite; import io.kamax.mxisd.exception.BadRequestException; @@ -51,8 +51,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xbill.DNS.*; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import java.io.IOException; @@ -76,28 +74,29 @@ public class InvitationManager { private NotificationManager notifMgr; private CloseableHttpClient client; - private Gson gson; private Timer refreshTimer; private Map invitations = new ConcurrentHashMap<>(); - public InvitationManager(InvitationConfig cfg, IStorage storage, LookupStrategy lookupMgr, SignatureManager signMgr, FederationDnsOverwrite dns, NotificationManager notifMgr) { + public InvitationManager( + InvitationConfig cfg, + IStorage storage, + LookupStrategy lookupMgr, + SignatureManager signMgr, + FederationDnsOverwrite dns, + NotificationManager notifMgr + ) { this.cfg = cfg; this.storage = storage; this.lookupMgr = lookupMgr; this.signMgr = signMgr; this.dns = dns; this.notifMgr = notifMgr; - } - - @PostConstruct - private void postConstruct() { - gson = new Gson(); log.info("Loading saved invites"); Collection ioList = storage.getInvites(); ioList.forEach(io -> { - log.info("Processing invite {}", gson.toJson(io)); + log.info("Processing invite {}", GsonUtil.get().toJson(io)); ThreePidInvite invite = new ThreePidInvite( MatrixID.asAcceptable(io.getSender()), io.getMedium(), @@ -133,12 +132,11 @@ public class InvitationManager { } } }, 5000L, TimeUnit.MILLISECONDS.convert(cfg.getResolution().getTimer(), TimeUnit.MINUTES)); - } - @PreDestroy - private void preDestroy() { - refreshTimer.cancel(); - ForkJoinPool.commonPool().awaitQuiescence(1, TimeUnit.MINUTES); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + refreshTimer.cancel(); + ForkJoinPool.commonPool().awaitQuiescence(1, TimeUnit.MINUTES); + })); } private String getId(IThreePidInvite invite) { diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 5b9ad51..5136d5c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,12 +1,3 @@ -# DO NOT USE THIS FILE AS-IS FOR YOUR INITIAL CONFIGURATION -# ONLY TAKE THE SPECIFIC SECTION YOU WANT TO CONFIGURE -# -# For more information about configuration, visit https://github.com/kamax-matrix/mxisd/blob/master/docs/configure.md - -spring: - main: - banner-mode: 'off' - logging: level: org: @@ -19,285 +10,6 @@ logging: pattern: console: '%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:%5p} [%15.15t] %35.35logger{34} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}' -server: - port: 8090 - -matrix: - domain: '' - identity: - servers: - matrix-org: - - 'https://matrix.org' - listener: - url: '' - localpart: '' - token: - as: '' - hs: '' - -lookup: - recursive: - enabled: true - allowedCidr: - - '127.0.0.0/8' - - '10.0.0.0/8' - - '172.16.0.0/12' - - '192.168.0.0/16' - - '::1/128' - - bridge: - enabled: false - recursiveOnly: true - -rest: - endpoints: - auth: '/_mxisd/backend/api/v1/auth/login' - directory: '/_mxisd/backend/api/v1/directory/user/search' - identity: - single: '/_mxisd/backend/api/v1/identity/lookup/single' - bulk: '/_mxisd/backend/api/v1/identity/lookup/bulk' - profile: - displayName: '/_mxisd/backend/api/v1/profile/displayName' - threepids: '/_mxisd/backend/api/v1/profile/threepids' - roles: '/_mxisd/backend/api/v1/profile/roles' - -ldap: - enabled: false - filter: '' - connection: - host: '' - tls: false - port: 389 - bindDn: '' - bindPassword: '' - baseDn: '' - attribute: - uid: - type: 'uid' - value: 'userPrincipalName' - name: 'displayName' - threepid: - email: - - 'mailPrimaryAddress' - - 'mail' - - 'otherMailbox' - msisdn: - - 'telephoneNumber' - - 'mobile' - - 'homePhone' - - 'otherTelephone' - - 'otherMobile' - - 'otherHomePhone' - auth: - filter: '' - directory: - attribute: - other: [] - filter: '' - identity: - filter: '' - token: '%3pid' - medium: - email: '' - msisdn: '' - -netiq: - enabled: false - filter: '' - connection: - host: '' - tls: false - port: 389 - bindDn: '' - bindPassword: '' - baseDn: '' - attribute: - uid: - type: 'uid' - value: 'userPrincipalName' - name: 'displayName' - threepid: - email: - - 'mailPrimaryAddress' - - 'mail' - - 'otherMailbox' - msisdn: - - 'telephoneNumber' - - 'mobile' - - 'homePhone' - - 'otherTelephone' - - 'otherMobile' - - 'otherHomePhone' - auth: - filter: '' - directory: - attribute: - other: [] - filter: '' - identity: - filter: '' - token: '%3pid' - medium: - email: '' - msisdn: '' - -firebase: - enabled: false - -sql: - enabled: false - type: 'sqlite' - connection: '' - auth: - enabled: false - directory: - enabled: false - query: - name: - type: 'localpart' - value: 'SELECT 1' - threepid: - type: 'localpart' - value: 'SELECT 1' - identity: - type: 'mxid' - query: 'SELECT user_id AS uid FROM user_threepids WHERE medium = ? AND address = ?' - profile: - threepid: - query: 'SELECT medium, address FROM user_threepids WHERE user_id = ?' - -wordpress: - enabled: false - sql: - type: 'mysql' - tablePrefix: 'wp_' - query: - threepid: - email: 'SELECT user_login as uid FROM ${wordpress.sql.tablePrefix}users WHERE user_email = ?' - directory: - name: "SELECT DISTINCT user_login, display_name FROM ${wordpress.sql.tablePrefix}users u LEFT JOIN ${wordpress.sql.tablePrefix}usermeta m ON m.user_id = u.id WHERE u.display_name LIKE ? OR (m.meta_key = 'nickname' AND m.meta_value = ?) OR (m.meta_key = 'first_name' AND m.meta_value = ?) OR (m.meta_key = 'last_name' AND m.meta_value = ?);" - threepid: 'SELECT DISTINCT user_login, display_name FROM ${wordpress.sql.tablePrefix}users WHERE user_email LIKE ?' - -forward: - servers: [] - -threepid: - medium: - email: - identity: - from: '' - name: '' - connector: 'smtp' - generator: 'template' - connectors: - smtp: - host: '' - port: 587 - tls: 1 - login: '' - password: '' - generators: - template: - invite: 'classpath:threepids/email/invite-template.eml' - generic: - matrixId: 'classpath:threepids/email/mxid-template.eml' - session: - validation: - local: 'classpath:threepids/email/validate-local-template.eml' - remote: 'classpath:threepids/email/validate-remote-template.eml' - - msisdn: - connector: 'twilio' - generator: 'template' - connectors: - twilio: - accountSid: '' - authToken: '' - number: '' - generators: - template: - invite: 'classpath:threepids/sms/invite-template.txt' - session: - validation: - local: 'classpath:threepids/sms/validate-local-template.txt' - remote: 'classpath:threepids/sms/validate-remote-template.txt' - -session: - policy: - validation: - enabled: true - forLocal: - enabled: true - toLocal: true - toRemote: - enabled: true - server: 'matrix-org' - forRemote: - enabled: true - toLocal: false - toRemote: - enabled: true - server: 'matrix-org' - -notification: - # handler: - # 3PID-medium: 'handlerId' - handlers: - sendgrid: - api: - key: '' - identity: - from: '' - name: '' - templates: - invite: - subject: '' - body: - text: '' - html: '' - session: - validation: - local: - subject: '' - body: - text: '' - html: '' - remote: - subject: '' - body: - text: '' - html: '' - -view: - session: - local: - onTokenSubmit: - success: 'session/local/tokenSubmitSuccess' - failure: 'session/local/tokenSubmitFailure' - localRemote: - onTokenSubmit: - success: 'session/localRemote/tokenSubmitSuccess' - failure: 'session/local/tokenSubmitFailure' - remote: - onRequest: - success: 'session/remote/requestSuccess' - failure: 'session/remote/requestFailure' - onCheck: - success: 'session/remote/checkSuccess' - failure: 'session/remote/checkFailure' - -invite: - resolution: - recursive: true - timer: 1 - -storage: - backend: 'sqlite' - -directory: - exclude: - homeserver: false - --- spring: profiles: systemd