From 7ad985feade65f4d0d21aad816b831c45f72c44c Mon Sep 17 00:00:00 2001 From: Max Dor Date: Sun, 30 Dec 2018 05:28:05 +0100 Subject: [PATCH] Continue structural port from Spring Boot to Undertow --- src/main/java/io/kamax/mxisd/HttpMxisd.java | 114 ++++++++++++ src/main/java/io/kamax/mxisd/Mxisd.java | 169 ++++++++---------- .../io/kamax/mxisd/MxisdStandaloneExec.java | 9 +- .../backend/exec/ExecDirectoryStore.java | 9 +- .../mxisd/backend/exec/ExecIdentityStore.java | 5 - .../mxisd/backend/exec/ExecProfileStore.java | 5 - .../backend/ldap/LdapDirectoryProvider.java | 9 +- .../backend/ldap/LdapProfileProvider.java | 5 - .../backend/ldap/LdapThreePidProvider.java | 5 - .../backend/memory/MemoryIdentityStore.java | 4 +- .../backend/rest/RestDirectoryProvider.java | 10 +- .../backend/rest/RestProfileProvider.java | 5 - .../backend/rest/RestThreePidProvider.java | 5 - .../mxisd/backend/sql/SqlProfileProvider.java | 5 - .../backend/sql/SqlThreePidProvider.java | 5 - .../generic/GenericSqlDirectoryProvider.java | 9 +- .../wordpress/WordpressDirectoryProvider.java | 9 +- .../wordpress/WordpressThreePidProvider.java | 5 - .../kamax/mxisd/config/InvitationConfig.java | 2 +- .../mxisd/config/threepid/ThreePidConfig.java | 6 +- .../threepid/connector/EmailSmtpConfig.java | 9 +- .../threepid/connector/PhoneTwilioConfig.java | 13 +- .../config/threepid/medium/EmailConfig.java | 32 +--- .../threepid/medium/EmailTemplateConfig.java | 7 +- .../medium/GenericTemplateConfig.java | 2 +- .../config/threepid/medium/PhoneConfig.java | 10 +- .../medium/PhoneSmsTemplateConfig.java | 7 +- .../notification/NotificationConfig.java | 8 + .../{spring => crypto}/CryptoFactory.java | 28 +-- .../mxisd/directory/DirectoryManager.java | 10 +- ...ryProvider.java => DirectoryProvider.java} | 4 +- .../mxisd/directory/DirectoryProviders.java | 6 +- .../mxisd/lookup/provider/BridgeFetcher.java | 5 +- .../lookup/provider/DnsLookupProvider.java | 5 - .../lookup/provider/ForwarderProvider.java | 10 +- .../lookup/provider/IThreePidProvider.java | 2 - .../RemoteLookupProviderSupplier.java | 35 ++++ .../RecursivePriorityLookupStrategy.java | 9 +- ...nHandler.java => NotificationHandler.java} | 2 +- .../NotificationHandlerSupplier.java | 29 +++ .../notification/NotificationHandlers.java | 6 +- .../notification/NotificationManager.java | 10 +- .../kamax/mxisd/profile/ProfileManager.java | 11 +- .../kamax/mxisd/profile/ProfileProvider.java | 2 - .../kamax/mxisd/session/SessionMananger.java | 2 +- ...dConnector.java => ThreePidConnector.java} | 2 +- .../email/BuiltInEmailConnectorSupplier.java | 44 +++++ ...mailConnector.java => EmailConnector.java} | 4 +- .../email/EmailConnectorSupplier.java | 31 ++++ .../connector/email/EmailSmtpConnector.java | 8 +- .../phone/BlackholePhoneConnector.java | 6 +- .../phone/BuiltInPhoneConnectorSupplier.java | 48 +++++ ...honeConnector.java => PhoneConnector.java} | 4 +- .../phone/PhoneConnectorSupplier.java | 31 ++++ .../phone/PhoneSmsTwilioConnector.java | 8 +- .../GenericTemplateNotificationGenerator.java | 4 +- .../NotificationGenerator.java} | 4 +- .../PlaceholderNotificationGenerator.java | 2 +- .../email/BuiltInEmailGeneratorSupplier.java | 51 ++++++ .../email/EmailGenerator.java} | 6 +- .../email/EmailGeneratorSupplier.java | 31 ++++ .../GenericEmailNotificationGenerator.java} | 14 +- .../phone/BuiltInPhoneGeneratorSupplier.java | 45 +++++ .../phone/PhoneGenerator.java} | 6 +- .../phone/PhoneGeneratorSupplier.java | 30 ++++ .../phone/SmsNotificationGenerator.java | 12 +- .../BuiltInNotificationHandlerSupplier.java | 131 ++++++++++++++ .../GenericNotificationHandler.java | 7 +- .../email/EmailRawNotificationHandler.java | 13 +- .../EmailSendGridNotificationHandler.java | 19 +- .../phone/PhoneNotificationHandler.java | 13 +- .../threepid/session/ThreePidSession.java | 2 +- ....kamax.mxisd.backend.IdentityStoreSupplier | 1 + ...d.notification.NotificationHandlerSupplier | 1 + ...pid.connector.email.EmailConnectorSupplier | 1 + ...pid.connector.phone.PhoneConnectorSupplier | 1 + ...pid.generator.email.EmailGeneratorSupplier | 1 + ...pid.generator.phone.PhoneGeneratorSupplier | 1 + src/main/resources/META-INF/spring.factories | 2 - .../io/kamax/mxisd/test/MxisdDefaultTest.java | 51 ++++++ .../java/io/kamax/mxisd/test/MxisdTest.java | 78 ++++++++ .../backend/exec/ExecDirectoryStoreTest.java | 1 - .../backend/exec/ExecIdentityStoreTest.java | 2 +- .../backend/exec/ExecProfileStoreTest.java | 1 - .../mxisd/test/backend/ldap/LdapAuthTest.java | 10 +- 85 files changed, 1019 insertions(+), 367 deletions(-) create mode 100644 src/main/java/io/kamax/mxisd/HttpMxisd.java rename src/main/java/io/kamax/mxisd/{spring => crypto}/CryptoFactory.java (66%) rename src/main/java/io/kamax/mxisd/directory/{IDirectoryProvider.java => DirectoryProvider.java} (93%) create mode 100644 src/main/java/io/kamax/mxisd/lookup/provider/RemoteLookupProviderSupplier.java rename src/main/java/io/kamax/mxisd/notification/{INotificationHandler.java => NotificationHandler.java} (96%) create mode 100644 src/main/java/io/kamax/mxisd/notification/NotificationHandlerSupplier.java rename src/main/java/io/kamax/mxisd/threepid/connector/{IThreePidConnector.java => ThreePidConnector.java} (95%) create mode 100644 src/main/java/io/kamax/mxisd/threepid/connector/email/BuiltInEmailConnectorSupplier.java rename src/main/java/io/kamax/mxisd/threepid/connector/email/{IEmailConnector.java => EmailConnector.java} (89%) create mode 100644 src/main/java/io/kamax/mxisd/threepid/connector/email/EmailConnectorSupplier.java create mode 100644 src/main/java/io/kamax/mxisd/threepid/connector/phone/BuiltInPhoneConnectorSupplier.java rename src/main/java/io/kamax/mxisd/threepid/connector/phone/{IPhoneConnector.java => PhoneConnector.java} (89%) create mode 100644 src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneConnectorSupplier.java rename src/main/java/io/kamax/mxisd/threepid/{notification => generator}/GenericTemplateNotificationGenerator.java (96%) rename src/main/java/io/kamax/mxisd/threepid/{notification/INotificationGenerator.java => generator/NotificationGenerator.java} (93%) rename src/main/java/io/kamax/mxisd/threepid/{notification => generator}/PlaceholderNotificationGenerator.java (99%) create mode 100644 src/main/java/io/kamax/mxisd/threepid/generator/email/BuiltInEmailGeneratorSupplier.java rename src/main/java/io/kamax/mxisd/threepid/{notification/email/IEmailNotificationGenerator.java => generator/email/EmailGenerator.java} (82%) create mode 100644 src/main/java/io/kamax/mxisd/threepid/generator/email/EmailGeneratorSupplier.java rename src/main/java/io/kamax/mxisd/threepid/{notification/email/EmailNotificationGenerator.java => generator/email/GenericEmailNotificationGenerator.java} (74%) create mode 100644 src/main/java/io/kamax/mxisd/threepid/generator/phone/BuiltInPhoneGeneratorSupplier.java rename src/main/java/io/kamax/mxisd/threepid/{notification/phone/IPhoneNotificationGenerator.java => generator/phone/PhoneGenerator.java} (81%) create mode 100644 src/main/java/io/kamax/mxisd/threepid/generator/phone/PhoneGeneratorSupplier.java rename src/main/java/io/kamax/mxisd/threepid/{notification => generator}/phone/SmsNotificationGenerator.java (80%) create mode 100644 src/main/java/io/kamax/mxisd/threepid/notification/BuiltInNotificationHandlerSupplier.java rename src/main/java/io/kamax/mxisd/threepid/{connector => notification}/email/EmailSendGridNotificationHandler.java (91%) create mode 100644 src/main/resources/META-INF/services/io.kamax.mxisd.notification.NotificationHandlerSupplier create mode 100644 src/main/resources/META-INF/services/io.kamax.mxisd.threepid.connector.email.EmailConnectorSupplier create mode 100644 src/main/resources/META-INF/services/io.kamax.mxisd.threepid.connector.phone.PhoneConnectorSupplier create mode 100644 src/main/resources/META-INF/services/io.kamax.mxisd.threepid.generator.email.EmailGeneratorSupplier create mode 100644 src/main/resources/META-INF/services/io.kamax.mxisd.threepid.generator.phone.PhoneGeneratorSupplier delete mode 100644 src/main/resources/META-INF/spring.factories create mode 100644 src/test/java/io/kamax/mxisd/test/MxisdDefaultTest.java create mode 100644 src/test/java/io/kamax/mxisd/test/MxisdTest.java diff --git a/src/main/java/io/kamax/mxisd/HttpMxisd.java b/src/main/java/io/kamax/mxisd/HttpMxisd.java new file mode 100644 index 0000000..77417e9 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/HttpMxisd.java @@ -0,0 +1,114 @@ +/* + * 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 . + */ + +package io.kamax.mxisd; + +import io.kamax.mxisd.config.MxisdConfig; +import io.kamax.mxisd.http.undertow.handler.SaneHandler; +import io.kamax.mxisd.http.undertow.handler.as.v1.AsNotFoundHandler; +import io.kamax.mxisd.http.undertow.handler.as.v1.AsTransactionHandler; +import io.kamax.mxisd.http.undertow.handler.auth.RestAuthHandler; +import io.kamax.mxisd.http.undertow.handler.auth.v1.LoginGetHandler; +import io.kamax.mxisd.http.undertow.handler.auth.v1.LoginHandler; +import io.kamax.mxisd.http.undertow.handler.auth.v1.LoginPostHandler; +import io.kamax.mxisd.http.undertow.handler.directory.v1.UserDirectorySearchHandler; +import io.kamax.mxisd.http.undertow.handler.identity.v1.*; +import io.kamax.mxisd.http.undertow.handler.profile.v1.InternalProfileHandler; +import io.kamax.mxisd.http.undertow.handler.profile.v1.ProfileHandler; +import io.kamax.mxisd.http.undertow.handler.status.StatusHandler; +import io.undertow.Handlers; +import io.undertow.Undertow; +import io.undertow.server.HttpHandler; + +public class HttpMxisd { + + // Core + private Mxisd m; + + // I/O + private Undertow httpSrv; + + public HttpMxisd(MxisdConfig cfg) { + m = new Mxisd(cfg); + } + + public void start() { + m.start(); + + HttpHandler asNotFoundHandler = SaneHandler.around(new AsNotFoundHandler(m.getAs())); + HttpHandler asTxnHandler = SaneHandler.around(new AsTransactionHandler(m.getAs())); + HttpHandler storeInvHandler = SaneHandler.around(new StoreInviteHandler(m.getConfig().getServer(), m.getInvitationManager(), m.getKeyManager())); + HttpHandler sessValidateHandler = SaneHandler.around(new SessionValidateHandler(m.getSession(), m.getConfig().getServer(), m.getConfig().getView())); + + httpSrv = Undertow.builder().addHttpListener(m.getConfig().getServer().getPort(), "0.0.0.0").setHandler(Handlers.routing() + + // Status endpoints + .get(StatusHandler.Path, SaneHandler.around(new StatusHandler())) + + // Authentication endpoints + .get(LoginHandler.Path, SaneHandler.around(new LoginGetHandler(m.getAuth(), m.getHttpClient()))) + .post(LoginHandler.Path, SaneHandler.around(new LoginPostHandler(m.getAuth()))) + .post(RestAuthHandler.Path, SaneHandler.around(new RestAuthHandler(m.getAuth()))) + + // Directory endpoints + .post(UserDirectorySearchHandler.Path, SaneHandler.around(new UserDirectorySearchHandler(m.getDirectory()))) + + // Key endpoints + .get(KeyGetHandler.Path, SaneHandler.around(new KeyGetHandler(m.getKeyManager()))) + .get(RegularKeyIsValidHandler.Path, SaneHandler.around(new RegularKeyIsValidHandler(m.getKeyManager()))) + .get(EphemeralKeyIsValidHandler.Path, SaneHandler.around(new EphemeralKeyIsValidHandler())) + + // Identity endpoints + .get(HelloHandler.Path, new HelloHandler()) + .get(SingleLookupHandler.Path, new SingleLookupHandler(m.getIdentity(), m.getSign())) + .post(BulkLookupHandler.Path, new BulkLookupHandler(m.getIdentity())) + .post(StoreInviteHandler.Path, storeInvHandler) + .post(SessionStartHandler.Path, SaneHandler.around(new SessionStartHandler(m.getSession()))) + .get(SessionValidateHandler.Path, sessValidateHandler) + .post(SessionValidateHandler.Path, sessValidateHandler) + .get(SessionTpidGetValidatedHandler.Path, SaneHandler.around(new SessionTpidGetValidatedHandler(m.getSession()))) + .post(SessionTpidBindHandler.Path, SaneHandler.around(new SessionTpidBindHandler(m.getSession(), m.getInvitationManager()))) + .get(RemoteIdentityAPIv1.SESSION_REQUEST_TOKEN, SaneHandler.around(new RemoteSessionStartHandler(m.getSession(), m.getConfig().getView()))) + .get(RemoteIdentityAPIv1.SESSION_CHECK, SaneHandler.around(new RemoteSessionCheckHandler(m.getSession(), m.getConfig().getView()))) + + // Profile endpoints + .get(ProfileHandler.Path, SaneHandler.around(new ProfileHandler(m.getProfile()))) + .get(InternalProfileHandler.Path, SaneHandler.around(new InternalProfileHandler(m.getProfile()))) + + // Application Service endpoints + .get("/_matrix/app/v1/users/**", asNotFoundHandler) + .get("/users/**", asNotFoundHandler) // Legacy endpoint + .get("/_matrix/app/v1/rooms/**", asNotFoundHandler) + .get("/rooms/**", asNotFoundHandler) // Legacy endpoint + .put(AsTransactionHandler.Path, asTxnHandler) + .put("/transactions/{" + AsTransactionHandler.ID + "}", asTxnHandler) // Legacy endpoint + + ).build(); + + httpSrv.start(); + } + + public void stop() { + httpSrv.stop(); + + m.stop(); + } + +} diff --git a/src/main/java/io/kamax/mxisd/Mxisd.java b/src/main/java/io/kamax/mxisd/Mxisd.java index d20ec29..cfbe37f 100644 --- a/src/main/java/io/kamax/mxisd/Mxisd.java +++ b/src/main/java/io/kamax/mxisd/Mxisd.java @@ -28,38 +28,26 @@ import io.kamax.mxisd.auth.AuthProviders; import io.kamax.mxisd.backend.IdentityStoreSupplier; import io.kamax.mxisd.backend.sql.synapse.Synapse; import io.kamax.mxisd.config.MxisdConfig; +import io.kamax.mxisd.crypto.CryptoFactory; import io.kamax.mxisd.directory.DirectoryManager; import io.kamax.mxisd.directory.DirectoryProviders; import io.kamax.mxisd.dns.ClientDnsOverwrite; import io.kamax.mxisd.dns.FederationDnsOverwrite; -import io.kamax.mxisd.http.undertow.handler.SaneHandler; -import io.kamax.mxisd.http.undertow.handler.as.v1.AsNotFoundHandler; -import io.kamax.mxisd.http.undertow.handler.as.v1.AsTransactionHandler; -import io.kamax.mxisd.http.undertow.handler.auth.RestAuthHandler; -import io.kamax.mxisd.http.undertow.handler.auth.v1.LoginGetHandler; -import io.kamax.mxisd.http.undertow.handler.auth.v1.LoginHandler; -import io.kamax.mxisd.http.undertow.handler.auth.v1.LoginPostHandler; -import io.kamax.mxisd.http.undertow.handler.directory.v1.UserDirectorySearchHandler; -import io.kamax.mxisd.http.undertow.handler.identity.v1.*; -import io.kamax.mxisd.http.undertow.handler.profile.v1.InternalProfileHandler; -import io.kamax.mxisd.http.undertow.handler.profile.v1.ProfileHandler; -import io.kamax.mxisd.http.undertow.handler.status.StatusHandler; import io.kamax.mxisd.invitation.InvitationManager; import io.kamax.mxisd.lookup.ThreePidProviders; +import io.kamax.mxisd.lookup.fetcher.IRemoteIdentityServerFetcher; import io.kamax.mxisd.lookup.provider.BridgeFetcher; import io.kamax.mxisd.lookup.provider.RemoteIdentityServerFetcher; import io.kamax.mxisd.lookup.strategy.LookupStrategy; import io.kamax.mxisd.lookup.strategy.RecursivePriorityLookupStrategy; +import io.kamax.mxisd.notification.NotificationHandlerSupplier; import io.kamax.mxisd.notification.NotificationHandlers; import io.kamax.mxisd.notification.NotificationManager; import io.kamax.mxisd.profile.ProfileManager; import io.kamax.mxisd.profile.ProfileProviders; import io.kamax.mxisd.session.SessionMananger; -import io.kamax.mxisd.spring.CryptoFactory; +import io.kamax.mxisd.storage.IStorage; import io.kamax.mxisd.storage.ormlite.OrmLiteSqliteStorage; -import io.undertow.Handlers; -import io.undertow.Undertow; -import io.undertow.server.HttpHandler; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; @@ -67,55 +55,58 @@ import java.util.ServiceLoader; public class Mxisd { - private MxisdConfig cfg; + protected MxisdConfig cfg; - private CloseableHttpClient httpClient; + protected CloseableHttpClient httpClient; + protected IRemoteIdentityServerFetcher srvFetcher; - private KeyManager keyMgr; - private SignatureManager signMgr; + protected IStorage store; + + protected KeyManager keyMgr; + protected SignatureManager signMgr; // Features - private AuthManager authMgr; - private DirectoryManager dirMgr; - private LookupStrategy idStrategy; - private InvitationManager invMgr; - private ProfileManager pMgr; - private AppSvcManager asHander; - private SessionMananger sessMgr; - - // I/O - private Undertow httpSrv; + protected AuthManager authMgr; + protected DirectoryManager dirMgr; + protected LookupStrategy idStrategy; + protected InvitationManager invMgr; + protected ProfileManager pMgr; + protected AppSvcManager asHander; + protected SessionMananger sessMgr; + protected NotificationManager notifMgr; public Mxisd(MxisdConfig cfg) { this.cfg = cfg.build(); } - private void build() { + protected void build() { httpClient = HttpClients.custom() .setUserAgent("mxisd") .setMaxConnPerRoute(Integer.MAX_VALUE) .setMaxConnTotal(Integer.MAX_VALUE) .build(); - OrmLiteSqliteStorage storage = new OrmLiteSqliteStorage(cfg); + srvFetcher = new RemoteIdentityServerFetcher(httpClient); + + store = new OrmLiteSqliteStorage(cfg); keyMgr = CryptoFactory.getKeyManager(cfg.getKey()); signMgr = CryptoFactory.getSignatureManager(keyMgr, cfg.getServer()); ClientDnsOverwrite clientDns = new ClientDnsOverwrite(cfg.getDns().getOverwrite()); FederationDnsOverwrite fedDns = new FederationDnsOverwrite(cfg.getDns().getOverwrite()); - pMgr = new ProfileManager(ProfileProviders.get(), clientDns, httpClient); - NotificationManager notifMgr = new NotificationManager(cfg.getNotification(), NotificationHandlers.get()); Synapse synapse = new Synapse(cfg.getSynapseSql()); - RemoteIdentityServerFetcher srvFetcher = new RemoteIdentityServerFetcher(httpClient); BridgeFetcher bridgeFetcher = new BridgeFetcher(cfg.getLookup().getRecursive().getBridge(), srvFetcher); - idStrategy = new RecursivePriorityLookupStrategy(cfg.getLookup(), ThreePidProviders.get(), bridgeFetcher); - invMgr = new InvitationManager(cfg.getInvite(), storage, idStrategy, signMgr, fedDns, notifMgr); - sessMgr = new SessionMananger(cfg.getSession(), cfg.getMatrix(), storage, notifMgr, httpClient); - - authMgr = new AuthManager(cfg, AuthProviders.get(), idStrategy, invMgr, clientDns, httpClient); - dirMgr = new DirectoryManager(cfg.getDirectory(), clientDns, httpClient, DirectoryProviders.get()); - asHander = new AppSvcManager(cfg, storage, pMgr, notifMgr, synapse); ServiceLoader.load(IdentityStoreSupplier.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); + pMgr = new ProfileManager(ProfileProviders.get(), clientDns, httpClient); + notifMgr = new NotificationManager(cfg.getNotification(), NotificationHandlers.get()); + sessMgr = new SessionMananger(cfg.getSession(), cfg.getMatrix(), store, notifMgr, httpClient); + invMgr = new InvitationManager(cfg.getInvite(), store, idStrategy, signMgr, fedDns, notifMgr); + authMgr = new AuthManager(cfg, AuthProviders.get(), idStrategy, invMgr, clientDns, httpClient); + dirMgr = new DirectoryManager(cfg.getDirectory(), clientDns, httpClient, DirectoryProviders.get()); + asHander = new AppSvcManager(cfg, store, pMgr, notifMgr, synapse); } public MxisdConfig getConfig() { @@ -126,68 +117,56 @@ public class Mxisd { return httpClient; } + public IRemoteIdentityServerFetcher getServerFetcher() { + return srvFetcher; + } + + public KeyManager getKeyManager() { + return keyMgr; + } + public InvitationManager getInvitationManager() { return invMgr; } + public LookupStrategy getIdentity() { + return idStrategy; + } + + public AuthManager getAuth() { + return authMgr; + } + + public SessionMananger getSession() { + return sessMgr; + } + + public DirectoryManager getDirectory() { + return dirMgr; + } + + public ProfileManager getProfile() { + return pMgr; + } + + public SignatureManager getSign() { + return signMgr; + } + + public AppSvcManager getAs() { + return asHander; + } + + public NotificationManager getNotif() { + return notifMgr; + } + public void start() { build(); - - HttpHandler asNotFoundHandler = SaneHandler.around(new AsNotFoundHandler(asHander)); - HttpHandler asTxnHandler = SaneHandler.around(new AsTransactionHandler(asHander)); - HttpHandler storeInvHandler = SaneHandler.around(new StoreInviteHandler(cfg.getServer(), invMgr, keyMgr)); - HttpHandler sessValidateHandler = SaneHandler.around(new SessionValidateHandler(sessMgr, cfg.getServer(), cfg.getView())); - - httpSrv = Undertow.builder().addHttpListener(cfg.getServer().getPort(), "0.0.0.0").setHandler(Handlers.routing() - - // Status endpoints - .get(StatusHandler.Path, SaneHandler.around(new StatusHandler())) - - // Authentication endpoints - .get(LoginHandler.Path, SaneHandler.around(new LoginGetHandler(authMgr, httpClient))) - .post(LoginHandler.Path, SaneHandler.around(new LoginPostHandler(authMgr))) - .post(RestAuthHandler.Path, SaneHandler.around(new RestAuthHandler(authMgr))) - - // Directory endpoints - .post(UserDirectorySearchHandler.Path, SaneHandler.around(new UserDirectorySearchHandler(dirMgr))) - - // Key endpoints - .get(KeyGetHandler.Path, SaneHandler.around(new KeyGetHandler(keyMgr))) - .get(RegularKeyIsValidHandler.Path, SaneHandler.around(new RegularKeyIsValidHandler(keyMgr))) - .get(EphemeralKeyIsValidHandler.Path, SaneHandler.around(new EphemeralKeyIsValidHandler())) - - // Identity endpoints - .get(HelloHandler.Path, new HelloHandler()) - .get(SingleLookupHandler.Path, new SingleLookupHandler(idStrategy, signMgr)) - .post(BulkLookupHandler.Path, new BulkLookupHandler(idStrategy)) - .post(StoreInviteHandler.Path, storeInvHandler) - .post(SessionStartHandler.Path, SaneHandler.around(new SessionStartHandler(sessMgr))) - .get(SessionValidateHandler.Path, sessValidateHandler) - .post(SessionValidateHandler.Path, sessValidateHandler) - .get(SessionTpidGetValidatedHandler.Path, SaneHandler.around(new SessionTpidGetValidatedHandler(sessMgr))) - .post(SessionTpidBindHandler.Path, SaneHandler.around(new SessionTpidBindHandler(sessMgr, invMgr))) - .get(RemoteIdentityAPIv1.SESSION_REQUEST_TOKEN, SaneHandler.around(new RemoteSessionStartHandler(sessMgr, cfg.getView()))) - .get(RemoteIdentityAPIv1.SESSION_CHECK, SaneHandler.around(new RemoteSessionCheckHandler(sessMgr, cfg.getView()))) - - // Profile endpoints - .get(ProfileHandler.Path, SaneHandler.around(new ProfileHandler(pMgr))) - .get(InternalProfileHandler.Path, SaneHandler.around(new InternalProfileHandler(pMgr))) - - // Application Service endpoints - .get("/_matrix/app/v1/users/**", asNotFoundHandler) - .get("/users/**", asNotFoundHandler) // Legacy endpoint - .get("/_matrix/app/v1/rooms/**", asNotFoundHandler) - .get("/rooms/**", asNotFoundHandler) // Legacy endpoint - .put(AsTransactionHandler.Path, asTxnHandler) - .put("/transactions/{" + AsTransactionHandler.ID + "}", asTxnHandler) // Legacy endpoint - - ).build(); - - httpSrv.start(); } public void stop() { - httpSrv.stop(); + // no-op } } diff --git a/src/main/java/io/kamax/mxisd/MxisdStandaloneExec.java b/src/main/java/io/kamax/mxisd/MxisdStandaloneExec.java index f75082d..826966b 100644 --- a/src/main/java/io/kamax/mxisd/MxisdStandaloneExec.java +++ b/src/main/java/io/kamax/mxisd/MxisdStandaloneExec.java @@ -28,8 +28,13 @@ import java.io.IOException; public class MxisdStandaloneExec { public static void main(String[] args) throws IOException { - MxisdConfig cfg = YamlConfigLoader.loadFromFile("mxisd.yaml"); // FIXME no hardcoding, make it configurable via Build, Env and CLI parameters - new Mxisd(cfg).start(); + // FIXME no hard-coding, make it configurable via Build, Env and CLI parameters + MxisdConfig cfg = YamlConfigLoader.loadFromFile("mxisd.yaml"); + HttpMxisd mxisd = new HttpMxisd(cfg); + + Runtime.getRuntime().addShutdownHook(new Thread(mxisd::stop)); + + mxisd.start(); } } diff --git a/src/main/java/io/kamax/mxisd/backend/exec/ExecDirectoryStore.java b/src/main/java/io/kamax/mxisd/backend/exec/ExecDirectoryStore.java index a5929cf..76c11c6 100644 --- a/src/main/java/io/kamax/mxisd/backend/exec/ExecDirectoryStore.java +++ b/src/main/java/io/kamax/mxisd/backend/exec/ExecDirectoryStore.java @@ -25,12 +25,12 @@ import io.kamax.matrix.json.GsonUtil; import io.kamax.mxisd.config.ExecConfig; import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.config.MxisdConfig; -import io.kamax.mxisd.directory.IDirectoryProvider; +import io.kamax.mxisd.directory.DirectoryProvider; import io.kamax.mxisd.http.io.UserDirectorySearchRequest; import io.kamax.mxisd.http.io.UserDirectorySearchResult; import org.apache.commons.lang3.StringUtils; -public class ExecDirectoryStore extends ExecStore implements IDirectoryProvider { +public class ExecDirectoryStore extends ExecStore implements DirectoryProvider { private ExecConfig.Directory cfg; private MatrixConfig mxCfg; @@ -44,11 +44,6 @@ public class ExecDirectoryStore extends ExecStore implements IDirectoryProvider this.mxCfg = mxCfg; } - @Override - public boolean isEnabled() { - return cfg.isEnabled(); - } - private UserDirectorySearchResult search(ExecConfig.Process cfg, UserDirectorySearchRequest request) { if (StringUtils.isEmpty(cfg.getCommand())) { return UserDirectorySearchResult.empty(); diff --git a/src/main/java/io/kamax/mxisd/backend/exec/ExecIdentityStore.java b/src/main/java/io/kamax/mxisd/backend/exec/ExecIdentityStore.java index d46a077..e23f4dc 100644 --- a/src/main/java/io/kamax/mxisd/backend/exec/ExecIdentityStore.java +++ b/src/main/java/io/kamax/mxisd/backend/exec/ExecIdentityStore.java @@ -63,11 +63,6 @@ public class ExecIdentityStore extends ExecStore implements IThreePidProvider { this.mxCfg = mxCfg; } - @Override - public boolean isEnabled() { - return cfg.isEnabled(); - } - @Override public boolean isLocal() { return true; diff --git a/src/main/java/io/kamax/mxisd/backend/exec/ExecProfileStore.java b/src/main/java/io/kamax/mxisd/backend/exec/ExecProfileStore.java index 3c30b43..c95c632 100644 --- a/src/main/java/io/kamax/mxisd/backend/exec/ExecProfileStore.java +++ b/src/main/java/io/kamax/mxisd/backend/exec/ExecProfileStore.java @@ -45,11 +45,6 @@ public class ExecProfileStore extends ExecStore implements ProfileProvider { this.cfg = cfg; } - @Override - public boolean isEnabled() { - return cfg.isEnabled(); - } - private Optional getFull(_MatrixID userId, ExecConfig.Process cfg) { Processor> p = new Processor<>(cfg); diff --git a/src/main/java/io/kamax/mxisd/backend/ldap/LdapDirectoryProvider.java b/src/main/java/io/kamax/mxisd/backend/ldap/LdapDirectoryProvider.java index cc897f0..66720ad 100644 --- a/src/main/java/io/kamax/mxisd/backend/ldap/LdapDirectoryProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/ldap/LdapDirectoryProvider.java @@ -22,7 +22,7 @@ package io.kamax.mxisd.backend.ldap; import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.config.ldap.LdapConfig; -import io.kamax.mxisd.directory.IDirectoryProvider; +import io.kamax.mxisd.directory.DirectoryProvider; import io.kamax.mxisd.exception.InternalServerError; import io.kamax.mxisd.http.io.UserDirectorySearchResult; import io.kamax.mxisd.util.GsonUtil; @@ -40,7 +40,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -public class LdapDirectoryProvider extends LdapBackend implements IDirectoryProvider { +public class LdapDirectoryProvider extends LdapBackend implements DirectoryProvider { private transient final Logger log = LoggerFactory.getLogger(LdapDirectoryProvider.class); @@ -48,11 +48,6 @@ public class LdapDirectoryProvider extends LdapBackend implements IDirectoryProv super(cfg, mxCfg); } - @Override - public boolean isEnabled() { - return getCfg().isEnabled(); - } - protected UserDirectorySearchResult search(String query, List attributes) { UserDirectorySearchResult result = new UserDirectorySearchResult(); result.setLimited(false); diff --git a/src/main/java/io/kamax/mxisd/backend/ldap/LdapProfileProvider.java b/src/main/java/io/kamax/mxisd/backend/ldap/LdapProfileProvider.java index 77fb675..b5f3b34 100644 --- a/src/main/java/io/kamax/mxisd/backend/ldap/LdapProfileProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/ldap/LdapProfileProvider.java @@ -51,11 +51,6 @@ public class LdapProfileProvider extends LdapBackend implements ProfileProvider super(cfg, mxCfg); } - @Override - public boolean isEnabled() { - return getCfg().isEnabled(); - } - @Override public Optional getDisplayName(_MatrixID userId) { String uid = buildUidFromMatrixId(userId); diff --git a/src/main/java/io/kamax/mxisd/backend/ldap/LdapThreePidProvider.java b/src/main/java/io/kamax/mxisd/backend/ldap/LdapThreePidProvider.java index 6f40dcf..c868f53 100644 --- a/src/main/java/io/kamax/mxisd/backend/ldap/LdapThreePidProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/ldap/LdapThreePidProvider.java @@ -51,11 +51,6 @@ public class LdapThreePidProvider extends LdapBackend implements IThreePidProvid super(cfg, mxCfg); } - @Override - public boolean isEnabled() { - return getCfg().isEnabled(); - } - @Override public boolean isLocal() { return true; 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 62eb5f7..dbebbd4 100644 --- a/src/main/java/io/kamax/mxisd/backend/memory/MemoryIdentityStore.java +++ b/src/main/java/io/kamax/mxisd/backend/memory/MemoryIdentityStore.java @@ -31,7 +31,7 @@ import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.config.memory.MemoryIdentityConfig; import io.kamax.mxisd.config.memory.MemoryStoreConfig; import io.kamax.mxisd.config.memory.MemoryThreePid; -import io.kamax.mxisd.directory.IDirectoryProvider; +import io.kamax.mxisd.directory.DirectoryProvider; import io.kamax.mxisd.http.io.UserDirectorySearchResult; import io.kamax.mxisd.lookup.SingleLookupReply; import io.kamax.mxisd.lookup.SingleLookupRequest; @@ -49,7 +49,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.function.Predicate; -public class MemoryIdentityStore implements AuthenticatorProvider, IDirectoryProvider, IThreePidProvider, ProfileProvider { +public class MemoryIdentityStore implements AuthenticatorProvider, DirectoryProvider, IThreePidProvider, ProfileProvider { private transient final Logger logger = LoggerFactory.getLogger(MemoryIdentityStore.class); diff --git a/src/main/java/io/kamax/mxisd/backend/rest/RestDirectoryProvider.java b/src/main/java/io/kamax/mxisd/backend/rest/RestDirectoryProvider.java index 8649ad2..f6be7e1 100644 --- a/src/main/java/io/kamax/mxisd/backend/rest/RestDirectoryProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/rest/RestDirectoryProvider.java @@ -23,19 +23,18 @@ package io.kamax.mxisd.backend.rest; import io.kamax.matrix.MatrixID; import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.config.rest.RestBackendConfig; -import io.kamax.mxisd.directory.IDirectoryProvider; +import io.kamax.mxisd.directory.DirectoryProvider; import io.kamax.mxisd.exception.InternalServerError; import io.kamax.mxisd.http.io.UserDirectorySearchRequest; import io.kamax.mxisd.http.io.UserDirectorySearchResult; import io.kamax.mxisd.util.RestClientUtils; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; import org.apache.http.client.methods.CloseableHttpResponse; import java.io.IOException; import java.nio.charset.StandardCharsets; -public class RestDirectoryProvider extends RestProvider implements IDirectoryProvider { +public class RestDirectoryProvider extends RestProvider implements DirectoryProvider { private MatrixConfig mxCfg; @@ -44,11 +43,6 @@ public class RestDirectoryProvider extends RestProvider implements IDirectoryPro this.mxCfg = mxCfg; } - @Override - public boolean isEnabled() { - return cfg.isEnabled() && StringUtils.isNotBlank(cfg.getEndpoints().getDirectory()); - } - private UserDirectorySearchResult search(String by, String query) { UserDirectorySearchRequest request = new UserDirectorySearchRequest(query); request.setBy(by); diff --git a/src/main/java/io/kamax/mxisd/backend/rest/RestProfileProvider.java b/src/main/java/io/kamax/mxisd/backend/rest/RestProfileProvider.java index a4bf1dd..64be7da 100644 --- a/src/main/java/io/kamax/mxisd/backend/rest/RestProfileProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/rest/RestProfileProvider.java @@ -55,11 +55,6 @@ public class RestProfileProvider extends RestProvider implements ProfileProvider super(cfg); } - @Override - public boolean isEnabled() { - return cfg.isEnabled() && cfg.getEndpoints().getProfile().isPresent(); - } - private Optional doRequest( _MatrixID userId, Function> endpoint, diff --git a/src/main/java/io/kamax/mxisd/backend/rest/RestThreePidProvider.java b/src/main/java/io/kamax/mxisd/backend/rest/RestThreePidProvider.java index fc9edbe..4e002f0 100644 --- a/src/main/java/io/kamax/mxisd/backend/rest/RestThreePidProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/rest/RestThreePidProvider.java @@ -62,11 +62,6 @@ public class RestThreePidProvider extends RestProvider implements IThreePidProvi } } - @Override - public boolean isEnabled() { - return cfg.isEnabled(); - } - @Override public boolean isLocal() { return true; diff --git a/src/main/java/io/kamax/mxisd/backend/sql/SqlProfileProvider.java b/src/main/java/io/kamax/mxisd/backend/sql/SqlProfileProvider.java index ebc17f7..bf208c1 100644 --- a/src/main/java/io/kamax/mxisd/backend/sql/SqlProfileProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/sql/SqlProfileProvider.java @@ -50,11 +50,6 @@ public abstract class SqlProfileProvider implements ProfileProvider { this.pool = new SqlConnectionPool(cfg); } - @Override - public boolean isEnabled() { - return cfg.isEnabled(); - } - @Override public Optional getDisplayName(_MatrixID user) { String stmtSql = cfg.getDisplayName().getQuery(); 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 879c0ac..2cabc3c 100644 --- a/src/main/java/io/kamax/mxisd/backend/sql/SqlThreePidProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/sql/SqlThreePidProvider.java @@ -54,11 +54,6 @@ public abstract class SqlThreePidProvider implements IThreePidProvider { this.mxCfg = mxCfg; } - @Override - public boolean isEnabled() { - return cfg.isEnabled(); - } - @Override public boolean isLocal() { return true; diff --git a/src/main/java/io/kamax/mxisd/backend/sql/generic/GenericSqlDirectoryProvider.java b/src/main/java/io/kamax/mxisd/backend/sql/generic/GenericSqlDirectoryProvider.java index fa47f5b..8ce98a0 100644 --- a/src/main/java/io/kamax/mxisd/backend/sql/generic/GenericSqlDirectoryProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/sql/generic/GenericSqlDirectoryProvider.java @@ -25,7 +25,7 @@ import io.kamax.mxisd.backend.sql.SqlConnectionPool; import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.config.sql.SqlConfig; import io.kamax.mxisd.config.sql.generic.GenericSqlProviderConfig; -import io.kamax.mxisd.directory.IDirectoryProvider; +import io.kamax.mxisd.directory.DirectoryProvider; import io.kamax.mxisd.exception.InternalServerError; import io.kamax.mxisd.http.io.UserDirectorySearchResult; import org.apache.commons.lang.StringUtils; @@ -40,7 +40,7 @@ import java.util.Optional; import static io.kamax.mxisd.http.io.UserDirectorySearchResult.Result; -public class GenericSqlDirectoryProvider implements IDirectoryProvider { +public class GenericSqlDirectoryProvider implements DirectoryProvider { private transient final Logger log = LoggerFactory.getLogger(GenericSqlDirectoryProvider.class); @@ -55,11 +55,6 @@ public class GenericSqlDirectoryProvider implements IDirectoryProvider { this.mxCfg = mxCfg; } - @Override - public boolean isEnabled() { - return cfg.getDirectory().isEnabled(); - } - protected void setParameters(PreparedStatement stmt, String searchTerm) throws SQLException { for (int i = 1; i <= stmt.getParameterMetaData().getParameterCount(); i++) { stmt.setString(i, searchTerm); diff --git a/src/main/java/io/kamax/mxisd/backend/wordpress/WordpressDirectoryProvider.java b/src/main/java/io/kamax/mxisd/backend/wordpress/WordpressDirectoryProvider.java index f681bcc..00c5900 100644 --- a/src/main/java/io/kamax/mxisd/backend/wordpress/WordpressDirectoryProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/wordpress/WordpressDirectoryProvider.java @@ -23,7 +23,7 @@ package io.kamax.mxisd.backend.wordpress; import io.kamax.matrix.MatrixID; import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.config.wordpress.WordpressConfig; -import io.kamax.mxisd.directory.IDirectoryProvider; +import io.kamax.mxisd.directory.DirectoryProvider; import io.kamax.mxisd.exception.InternalServerError; import io.kamax.mxisd.http.io.UserDirectorySearchResult; import org.slf4j.Logger; @@ -35,7 +35,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Optional; -public class WordpressDirectoryProvider implements IDirectoryProvider { +public class WordpressDirectoryProvider implements DirectoryProvider { private transient final Logger log = LoggerFactory.getLogger(WordpressDirectoryProvider.class); @@ -49,11 +49,6 @@ public class WordpressDirectoryProvider implements IDirectoryProvider { this.mxCfg = mxCfg; } - @Override - public boolean isEnabled() { - return wordpress.isEnabled(); - } - protected void setParameters(PreparedStatement stmt, String searchTerm) throws SQLException { for (int i = 1; i <= stmt.getParameterMetaData().getParameterCount(); i++) { stmt.setString(i, "%" + searchTerm + "%"); diff --git a/src/main/java/io/kamax/mxisd/backend/wordpress/WordpressThreePidProvider.java b/src/main/java/io/kamax/mxisd/backend/wordpress/WordpressThreePidProvider.java index 307eed0..6c43945 100644 --- a/src/main/java/io/kamax/mxisd/backend/wordpress/WordpressThreePidProvider.java +++ b/src/main/java/io/kamax/mxisd/backend/wordpress/WordpressThreePidProvider.java @@ -54,11 +54,6 @@ public class WordpressThreePidProvider implements IThreePidProvider { this.wordpress = wordpress; } - @Override - public boolean isEnabled() { - return wordpress.isEnabled(); - } - @Override public boolean isLocal() { return true; diff --git a/src/main/java/io/kamax/mxisd/config/InvitationConfig.java b/src/main/java/io/kamax/mxisd/config/InvitationConfig.java index 5849558..552f6ef 100644 --- a/src/main/java/io/kamax/mxisd/config/InvitationConfig.java +++ b/src/main/java/io/kamax/mxisd/config/InvitationConfig.java @@ -53,7 +53,7 @@ public class InvitationConfig { } - private Resolution resolution; + private Resolution resolution = new Resolution(); public Resolution getResolution() { return resolution; diff --git a/src/main/java/io/kamax/mxisd/config/threepid/ThreePidConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/ThreePidConfig.java index abb030f..33e6ef4 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/ThreePidConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/ThreePidConfig.java @@ -21,7 +21,10 @@ package io.kamax.mxisd.config.threepid; import com.google.gson.JsonObject; +import io.kamax.matrix.ThreePidMedium; +import io.kamax.matrix.json.GsonUtil; import io.kamax.mxisd.config.threepid.medium.EmailConfig; +import io.kamax.mxisd.config.threepid.medium.PhoneConfig; import java.util.HashMap; import java.util.Map; @@ -31,7 +34,8 @@ public class ThreePidConfig { private Map medium = new HashMap<>(); public ThreePidConfig() { - EmailConfig emailCfg = new EmailConfig(); + medium.put(ThreePidMedium.Email.getId(), GsonUtil.makeObj(new EmailConfig())); + medium.put(ThreePidMedium.PhoneNumber.getId(), GsonUtil.makeObj(new PhoneConfig())); } public Map getMedium() { 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 5620671..3d0a20b 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 @@ -24,13 +24,11 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; - public class EmailSmtpConfig { private transient final Logger log = LoggerFactory.getLogger(EmailSmtpConfig.class); - private String host; + private String host = ""; private int port = 587; private int tls = 1; private String login; @@ -76,14 +74,15 @@ public class EmailSmtpConfig { this.password = password; } - @PostConstruct - public void build() { + public EmailSmtpConfig build() { log.info("--- E-mail SMTP Connector config ---"); log.info("Host: {}", getHost()); log.info("Port: {}", getPort()); log.info("TLS Mode: {}", getTls()); log.info("Login: {}", getLogin()); log.info("Has password: {}", StringUtils.isNotBlank(getPassword())); + + return this; } } diff --git a/src/main/java/io/kamax/mxisd/config/threepid/connector/PhoneTwilioConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/connector/PhoneTwilioConfig.java index f162a9f..4d7d3c4 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/connector/PhoneTwilioConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/connector/PhoneTwilioConfig.java @@ -23,16 +23,12 @@ package io.kamax.mxisd.config.threepid.connector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; - public class PhoneTwilioConfig { - static final String NAMESPACE = "threepid.medium.msisdn.connectors.twilio"; - private transient final Logger log = LoggerFactory.getLogger(PhoneTwilioConfig.class); - private String accountSid; - private String authToken; + private String accountSid = ""; + private String authToken = ""; private String number; public String getAccountSid() { @@ -59,11 +55,12 @@ public class PhoneTwilioConfig { this.number = number; } - @PostConstruct - public void build() { + public PhoneTwilioConfig build() { log.info("--- Phone SMS Twilio connector config ---"); log.info("Account SID: {}", getAccountSid()); log.info("Sender number: {}", getNumber()); + + return this; } } 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 01906bc..1f969df 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,12 +20,8 @@ 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; +import io.kamax.mxisd.threepid.connector.email.EmailSmtpConnector; +import io.kamax.mxisd.threepid.generator.email.GenericEmailNotificationGenerator; public class EmailConfig extends MediumConfig { @@ -52,35 +48,15 @@ public class EmailConfig extends MediumConfig { } - private transient final Logger log = LoggerFactory.getLogger(EmailConfig.class); - private Identity identity = new Identity(); public EmailConfig() { - setConnector("smtp"); - setGenerator("template"); + setConnector(EmailSmtpConnector.ID); + setGenerator(GenericEmailNotificationGenerator.ID); } public Identity getIdentity() { return identity; } - @PostConstruct - public void build() { - log.info("--- E-mail config ---"); - - if (StringUtils.isBlank(getGenerator())) { - throw new ConfigurationException("generator"); - } - - if (StringUtils.isBlank(getConnector())) { - throw new ConfigurationException("connector"); - } - - 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 2ba8ca8..366263a 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 @@ -23,8 +23,6 @@ package io.kamax.mxisd.config.threepid.medium; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; - public class EmailTemplateConfig extends GenericTemplateConfig { private transient final Logger log = LoggerFactory.getLogger(EmailTemplateConfig.class); @@ -36,13 +34,14 @@ public class EmailTemplateConfig extends GenericTemplateConfig { getSession().getValidation().setRemote("classpath:threepids/email/validate-remote-template.eml"); } - @PostConstruct - public void build() { + public EmailTemplateConfig build() { log.info("--- E-mail Generator templates config ---"); log.info("Invite: {}", getName(getInvite())); log.info("Session validation:"); log.info("\tLocal: {}", getName(getSession().getValidation().getLocal())); log.info("\tRemote: {}", getName(getSession().getValidation().getRemote())); + + return this; } } diff --git a/src/main/java/io/kamax/mxisd/config/threepid/medium/GenericTemplateConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/medium/GenericTemplateConfig.java index ef15e03..d29f2cf 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/medium/GenericTemplateConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/medium/GenericTemplateConfig.java @@ -62,7 +62,7 @@ public class GenericTemplateConfig { } - private SessionValidation validation; + private SessionValidation validation = new SessionValidation(); public SessionValidation getValidation() { return validation; 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 8ac26b1..05d9ea6 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,16 +20,14 @@ package io.kamax.mxisd.config.threepid.medium; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import io.kamax.mxisd.threepid.connector.phone.PhoneSmsTwilioConnector; +import io.kamax.mxisd.threepid.generator.phone.SmsNotificationGenerator; public class PhoneConfig extends MediumConfig { - private transient final Logger log = LoggerFactory.getLogger(PhoneConfig.class); - public PhoneConfig() { - setConnector("twilio"); - setGenerator("template"); + setConnector(PhoneSmsTwilioConnector.ID); + setGenerator(SmsNotificationGenerator.ID); } } 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 5c799cd..3a347b7 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 @@ -23,8 +23,6 @@ package io.kamax.mxisd.config.threepid.medium; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; - public class PhoneSmsTemplateConfig extends GenericTemplateConfig { private transient final Logger log = LoggerFactory.getLogger(EmailTemplateConfig.class); @@ -36,13 +34,14 @@ public class PhoneSmsTemplateConfig extends GenericTemplateConfig { getSession().getValidation().setRemote("classpath:threepids/sms/validate-remote-template.txt"); } - @PostConstruct - public void build() { + public PhoneSmsTemplateConfig build() { log.info("--- SMS Generator templates config ---"); log.info("Invite: {}", getName(getInvite())); log.info("Session validation:"); log.info("\tLocal: {}", getName(getSession().getValidation().getLocal())); log.info("\tRemote: {}", getName(getSession().getValidation().getRemote())); + + return this; } } diff --git a/src/main/java/io/kamax/mxisd/config/threepid/notification/NotificationConfig.java b/src/main/java/io/kamax/mxisd/config/threepid/notification/NotificationConfig.java index 7684838..6bc557b 100644 --- a/src/main/java/io/kamax/mxisd/config/threepid/notification/NotificationConfig.java +++ b/src/main/java/io/kamax/mxisd/config/threepid/notification/NotificationConfig.java @@ -21,6 +21,9 @@ package io.kamax.mxisd.config.threepid.notification; import com.google.gson.JsonObject; +import io.kamax.matrix.ThreePidMedium; +import io.kamax.mxisd.threepid.notification.email.EmailRawNotificationHandler; +import io.kamax.mxisd.threepid.notification.phone.PhoneNotificationHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +38,11 @@ public class NotificationConfig { private Map handler = new HashMap<>(); private Map handlers = new HashMap<>(); + public NotificationConfig() { + handler.put(ThreePidMedium.Email.getId(), EmailRawNotificationHandler.ID); + handler.put(ThreePidMedium.PhoneNumber.getId(), PhoneNotificationHandler.ID); + } + public Map getHandler() { return handler; } diff --git a/src/main/java/io/kamax/mxisd/spring/CryptoFactory.java b/src/main/java/io/kamax/mxisd/crypto/CryptoFactory.java similarity index 66% rename from src/main/java/io/kamax/mxisd/spring/CryptoFactory.java rename to src/main/java/io/kamax/mxisd/crypto/CryptoFactory.java index 641b49d..d52c233 100644 --- a/src/main/java/io/kamax/mxisd/spring/CryptoFactory.java +++ b/src/main/java/io/kamax/mxisd/crypto/CryptoFactory.java @@ -18,14 +18,13 @@ * along with this program. If not, see . */ -package io.kamax.mxisd.spring; +package io.kamax.mxisd.crypto; -import io.kamax.matrix.crypto.KeyFileStore; -import io.kamax.matrix.crypto.KeyManager; -import io.kamax.matrix.crypto.SignatureManager; +import io.kamax.matrix.crypto.*; import io.kamax.mxisd.config.KeyConfig; import io.kamax.mxisd.config.ServerConfig; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import java.io.File; import java.io.IOException; @@ -33,16 +32,23 @@ import java.io.IOException; public class CryptoFactory { public static KeyManager getKeyManager(KeyConfig keyCfg) { - File keyStore = new File(keyCfg.getPath()); - if (!keyStore.exists()) { - try { - FileUtils.touch(keyStore); - } catch (IOException e) { - throw new RuntimeException(e); + _KeyStore store; + if (StringUtils.equals(":memory:", keyCfg.getPath())) { + store = new KeyMemoryStore(); + } else { + File keyStore = new File(keyCfg.getPath()); + if (!keyStore.exists()) { + try { + FileUtils.touch(keyStore); + } catch (IOException e) { + throw new RuntimeException(e); + } } + + store = new KeyFileStore(keyCfg.getPath()); } - return new KeyManager(new KeyFileStore(keyCfg.getPath())); + return new KeyManager(store); } public static SignatureManager getSignatureManager(KeyManager keyMgr, ServerConfig cfg) { diff --git a/src/main/java/io/kamax/mxisd/directory/DirectoryManager.java b/src/main/java/io/kamax/mxisd/directory/DirectoryManager.java index 872b5bc..6197692 100644 --- a/src/main/java/io/kamax/mxisd/directory/DirectoryManager.java +++ b/src/main/java/io/kamax/mxisd/directory/DirectoryManager.java @@ -43,8 +43,8 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.URI; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; public class DirectoryManager { @@ -53,13 +53,13 @@ public class DirectoryManager { private DirectoryConfig cfg; private ClientDnsOverwrite dns; private CloseableHttpClient client; - private List providers; + private List providers; - public DirectoryManager(DirectoryConfig cfg, ClientDnsOverwrite dns, CloseableHttpClient client, List providers) { + public DirectoryManager(DirectoryConfig cfg, ClientDnsOverwrite dns, CloseableHttpClient client, List providers) { this.cfg = cfg; this.dns = dns; this.client = client; - this.providers = providers.stream().filter(IDirectoryProvider::isEnabled).collect(Collectors.toList()); + this.providers = new ArrayList<>(providers); log.info("Directory providers:"); this.providers.forEach(p -> log.info("\t- {}", p.getClass().getName())); @@ -111,7 +111,7 @@ public class DirectoryManager { } } - for (IDirectoryProvider provider : providers) { + for (DirectoryProvider provider : providers) { log.info("Using Directory provider {}", provider.getClass().getSimpleName()); UserDirectorySearchResult resultProvider = provider.searchByDisplayName(query); log.info("Display name: found {} match(es) for '{}'", resultProvider.getResults().size(), query); diff --git a/src/main/java/io/kamax/mxisd/directory/IDirectoryProvider.java b/src/main/java/io/kamax/mxisd/directory/DirectoryProvider.java similarity index 93% rename from src/main/java/io/kamax/mxisd/directory/IDirectoryProvider.java rename to src/main/java/io/kamax/mxisd/directory/DirectoryProvider.java index c947009..1437278 100644 --- a/src/main/java/io/kamax/mxisd/directory/IDirectoryProvider.java +++ b/src/main/java/io/kamax/mxisd/directory/DirectoryProvider.java @@ -22,9 +22,7 @@ package io.kamax.mxisd.directory; import io.kamax.mxisd.http.io.UserDirectorySearchResult; -public interface IDirectoryProvider { - - boolean isEnabled(); +public interface DirectoryProvider { UserDirectorySearchResult searchByDisplayName(String query); diff --git a/src/main/java/io/kamax/mxisd/directory/DirectoryProviders.java b/src/main/java/io/kamax/mxisd/directory/DirectoryProviders.java index 9f45109..b2c42b8 100644 --- a/src/main/java/io/kamax/mxisd/directory/DirectoryProviders.java +++ b/src/main/java/io/kamax/mxisd/directory/DirectoryProviders.java @@ -27,13 +27,13 @@ import java.util.stream.Collectors; public class DirectoryProviders { - private static final List> suppliers = new ArrayList<>(); + private static final List> suppliers = new ArrayList<>(); - public static void register(Supplier supplier) { + public static void register(Supplier supplier) { suppliers.add(supplier); } - public static List get() { + public static List get() { return suppliers.stream().map(Supplier::get).collect(Collectors.toList()); } diff --git a/src/main/java/io/kamax/mxisd/lookup/provider/BridgeFetcher.java b/src/main/java/io/kamax/mxisd/lookup/provider/BridgeFetcher.java index 93dcde8..ee4322a 100644 --- a/src/main/java/io/kamax/mxisd/lookup/provider/BridgeFetcher.java +++ b/src/main/java/io/kamax/mxisd/lookup/provider/BridgeFetcher.java @@ -25,6 +25,7 @@ import io.kamax.mxisd.lookup.SingleLookupReply; import io.kamax.mxisd.lookup.SingleLookupRequest; import io.kamax.mxisd.lookup.ThreePidMapping; import io.kamax.mxisd.lookup.fetcher.IBridgeFetcher; +import io.kamax.mxisd.lookup.fetcher.IRemoteIdentityServerFetcher; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,9 +39,9 @@ public class BridgeFetcher implements IBridgeFetcher { private transient final Logger log = LoggerFactory.getLogger(BridgeFetcher.class); private RecursiveLookupBridgeConfig cfg; - private RemoteIdentityServerFetcher fetcher; + private IRemoteIdentityServerFetcher fetcher; - public BridgeFetcher(RecursiveLookupBridgeConfig cfg, RemoteIdentityServerFetcher fetcher) { + public BridgeFetcher(RecursiveLookupBridgeConfig cfg, IRemoteIdentityServerFetcher fetcher) { this.cfg = cfg; this.fetcher = fetcher; } diff --git a/src/main/java/io/kamax/mxisd/lookup/provider/DnsLookupProvider.java b/src/main/java/io/kamax/mxisd/lookup/provider/DnsLookupProvider.java index ed51e8f..25ae29c 100644 --- a/src/main/java/io/kamax/mxisd/lookup/provider/DnsLookupProvider.java +++ b/src/main/java/io/kamax/mxisd/lookup/provider/DnsLookupProvider.java @@ -47,11 +47,6 @@ class DnsLookupProvider implements IThreePidProvider { this.fetcher = fetcher; } - @Override - public boolean isEnabled() { - return true; - } - @Override public boolean isLocal() { return false; diff --git a/src/main/java/io/kamax/mxisd/lookup/provider/ForwarderProvider.java b/src/main/java/io/kamax/mxisd/lookup/provider/ForwarderProvider.java index 7d048d9..3b1c7ab 100644 --- a/src/main/java/io/kamax/mxisd/lookup/provider/ForwarderProvider.java +++ b/src/main/java/io/kamax/mxisd/lookup/provider/ForwarderProvider.java @@ -22,6 +22,7 @@ package io.kamax.mxisd.lookup.provider; import io.kamax.mxisd.config.ForwardConfig; import io.kamax.mxisd.config.MatrixConfig; +import io.kamax.mxisd.config.MxisdConfig; import io.kamax.mxisd.lookup.SingleLookupReply; import io.kamax.mxisd.lookup.SingleLookupRequest; import io.kamax.mxisd.lookup.ThreePidMapping; @@ -41,17 +42,16 @@ public class ForwarderProvider implements IThreePidProvider { private MatrixConfig mxCfg; private IRemoteIdentityServerFetcher fetcher; + public ForwarderProvider(MxisdConfig cfg, IRemoteIdentityServerFetcher fetcher) { + this(cfg.getForward(), cfg.getMatrix(), fetcher); + } + public ForwarderProvider(ForwardConfig cfg, MatrixConfig mxCfg, IRemoteIdentityServerFetcher fetcher) { this.cfg = cfg; this.mxCfg = mxCfg; this.fetcher = fetcher; } - @Override - public boolean isEnabled() { - return true; - } - @Override public boolean isLocal() { return false; diff --git a/src/main/java/io/kamax/mxisd/lookup/provider/IThreePidProvider.java b/src/main/java/io/kamax/mxisd/lookup/provider/IThreePidProvider.java index ed42cb4..8ec8760 100644 --- a/src/main/java/io/kamax/mxisd/lookup/provider/IThreePidProvider.java +++ b/src/main/java/io/kamax/mxisd/lookup/provider/IThreePidProvider.java @@ -29,8 +29,6 @@ import java.util.Optional; public interface IThreePidProvider { - boolean isEnabled(); - boolean isLocal(); /** diff --git a/src/main/java/io/kamax/mxisd/lookup/provider/RemoteLookupProviderSupplier.java b/src/main/java/io/kamax/mxisd/lookup/provider/RemoteLookupProviderSupplier.java new file mode 100644 index 0000000..d487a7d --- /dev/null +++ b/src/main/java/io/kamax/mxisd/lookup/provider/RemoteLookupProviderSupplier.java @@ -0,0 +1,35 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.lookup.provider; + +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.backend.IdentityStoreSupplier; +import io.kamax.mxisd.lookup.ThreePidProviders; + +public class RemoteLookupProviderSupplier implements IdentityStoreSupplier { + + @Override + public void accept(Mxisd mxisd) { + ThreePidProviders.register(() -> new DnsLookupProvider(mxisd.getConfig().getMatrix(), mxisd.getServerFetcher())); + ThreePidProviders.register(() -> new ForwarderProvider(mxisd.getConfig(), mxisd.getServerFetcher())); + } + +} diff --git a/src/main/java/io/kamax/mxisd/lookup/strategy/RecursivePriorityLookupStrategy.java b/src/main/java/io/kamax/mxisd/lookup/strategy/RecursivePriorityLookupStrategy.java index 387dc47..c9127f5 100644 --- a/src/main/java/io/kamax/mxisd/lookup/strategy/RecursivePriorityLookupStrategy.java +++ b/src/main/java/io/kamax/mxisd/lookup/strategy/RecursivePriorityLookupStrategy.java @@ -49,10 +49,7 @@ public class RecursivePriorityLookupStrategy implements LookupStrategy { public RecursivePriorityLookupStrategy(MxisdConfig.Lookup cfg, List providers, IBridgeFetcher bridge) { this.cfg = cfg; this.bridge = bridge; - this.providers = providers.stream().filter(p -> { - log.info("3PID Provider {} is enabled: {}", p.getClass().getSimpleName(), p.isEnabled()); - return p.isEnabled(); - }).collect(Collectors.toList()); + this.providers = new ArrayList<>(providers); try { log.info("Found {} providers", providers.size()); @@ -114,11 +111,11 @@ public class RecursivePriorityLookupStrategy implements LookupStrategy { @Override public List getLocalProviders() { - return providers.stream().filter(iThreePidProvider -> iThreePidProvider.isEnabled() && iThreePidProvider.isLocal()).collect(Collectors.toList()); + return providers.stream().filter(IThreePidProvider::isLocal).collect(Collectors.toList()); } public List getRemoteProviders() { - return providers.stream().filter(iThreePidProvider -> iThreePidProvider.isEnabled() && !iThreePidProvider.isLocal()).collect(Collectors.toList()); + return providers.stream().filter(iThreePidProvider -> !iThreePidProvider.isLocal()).collect(Collectors.toList()); } private static SingleLookupRequest build(String medium, String address) { diff --git a/src/main/java/io/kamax/mxisd/notification/INotificationHandler.java b/src/main/java/io/kamax/mxisd/notification/NotificationHandler.java similarity index 96% rename from src/main/java/io/kamax/mxisd/notification/INotificationHandler.java rename to src/main/java/io/kamax/mxisd/notification/NotificationHandler.java index ab34c56..a1418c5 100644 --- a/src/main/java/io/kamax/mxisd/notification/INotificationHandler.java +++ b/src/main/java/io/kamax/mxisd/notification/NotificationHandler.java @@ -24,7 +24,7 @@ import io.kamax.mxisd.as.IMatrixIdInvite; import io.kamax.mxisd.invitation.IThreePidInviteReply; import io.kamax.mxisd.threepid.session.IThreePidSession; -public interface INotificationHandler { +public interface NotificationHandler { String getId(); diff --git a/src/main/java/io/kamax/mxisd/notification/NotificationHandlerSupplier.java b/src/main/java/io/kamax/mxisd/notification/NotificationHandlerSupplier.java new file mode 100644 index 0000000..332475a --- /dev/null +++ b/src/main/java/io/kamax/mxisd/notification/NotificationHandlerSupplier.java @@ -0,0 +1,29 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.notification; + +import io.kamax.mxisd.Mxisd; + +import java.util.function.Consumer; + +public interface NotificationHandlerSupplier extends Consumer { + +} diff --git a/src/main/java/io/kamax/mxisd/notification/NotificationHandlers.java b/src/main/java/io/kamax/mxisd/notification/NotificationHandlers.java index 424ed5a..714d1b0 100644 --- a/src/main/java/io/kamax/mxisd/notification/NotificationHandlers.java +++ b/src/main/java/io/kamax/mxisd/notification/NotificationHandlers.java @@ -27,13 +27,13 @@ import java.util.stream.Collectors; public class NotificationHandlers { - private static final List> suppliers = new ArrayList<>(); + private static final List> suppliers = new ArrayList<>(); - public static void register(Supplier supplier) { + public static void register(Supplier supplier) { suppliers.add(supplier); } - public static List get() { + public static List get() { return suppliers.stream().map(Supplier::get).collect(Collectors.toList()); } diff --git a/src/main/java/io/kamax/mxisd/notification/NotificationManager.java b/src/main/java/io/kamax/mxisd/notification/NotificationManager.java index df00b3f..813dd3c 100644 --- a/src/main/java/io/kamax/mxisd/notification/NotificationManager.java +++ b/src/main/java/io/kamax/mxisd/notification/NotificationManager.java @@ -37,9 +37,9 @@ public class NotificationManager { private transient final Logger log = LoggerFactory.getLogger(NotificationManager.class); - private Map handlers; + private Map handlers; - public NotificationManager(NotificationConfig cfg, List handlers) { + public NotificationManager(NotificationConfig cfg, List handlers) { this.handlers = new HashMap<>(); handlers.forEach(h -> { log.info("Found handler {} for medium {}", h.getId(), h.getMedium()); @@ -53,8 +53,8 @@ public class NotificationManager { this.handlers.forEach((k, v) -> log.info("\tHandler for {}: {}", k, v.getId())); } - private INotificationHandler ensureMedium(String medium) { - INotificationHandler handler = handlers.get(medium); + private NotificationHandler ensureMedium(String medium) { + NotificationHandler handler = handlers.get(medium); if (handler == null) { throw new NotImplementedException(medium + " is not a supported 3PID medium type"); } @@ -77,7 +77,7 @@ public class NotificationManager { ensureMedium(session.getThreePid().getMedium()).sendForValidation(session); } - public void sendforRemoteValidation(IThreePidSession session) { + public void sendForRemoteValidation(IThreePidSession session) { ensureMedium(session.getThreePid().getMedium()).sendForRemoteValidation(session); } diff --git a/src/main/java/io/kamax/mxisd/profile/ProfileManager.java b/src/main/java/io/kamax/mxisd/profile/ProfileManager.java index 050ed80..c527d27 100644 --- a/src/main/java/io/kamax/mxisd/profile/ProfileManager.java +++ b/src/main/java/io/kamax/mxisd/profile/ProfileManager.java @@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; @@ -54,14 +55,10 @@ public class ProfileManager { public ProfileManager(List providers, ClientDnsOverwrite dns, CloseableHttpClient client) { this.dns = dns; this.client = client; + this.providers = new ArrayList<>(providers); - log.info("--- Profile providers ---"); - this.providers = providers.stream() - .filter(pp -> { - log.info("\t- {} - Is enabled? {}", pp.getClass().getSimpleName(), pp.isEnabled()); - return pp.isEnabled(); - }) - .collect(Collectors.toList()); + log.info("Profile Providers:"); + providers.forEach(p -> log.info("\t- {}", p.getClass().getSimpleName())); } public List getList(Function> function) { diff --git a/src/main/java/io/kamax/mxisd/profile/ProfileProvider.java b/src/main/java/io/kamax/mxisd/profile/ProfileProvider.java index 5b03ee7..63c33bc 100644 --- a/src/main/java/io/kamax/mxisd/profile/ProfileProvider.java +++ b/src/main/java/io/kamax/mxisd/profile/ProfileProvider.java @@ -28,8 +28,6 @@ import java.util.Optional; public interface ProfileProvider { - boolean isEnabled(); - Optional getDisplayName(_MatrixID userId); List<_ThreePid> getThreepids(_MatrixID userId); diff --git a/src/main/java/io/kamax/mxisd/session/SessionMananger.java b/src/main/java/io/kamax/mxisd/session/SessionMananger.java index 73e0c32..d9f5d9f 100644 --- a/src/main/java/io/kamax/mxisd/session/SessionMananger.java +++ b/src/main/java/io/kamax/mxisd/session/SessionMananger.java @@ -161,7 +161,7 @@ public class SessionMananger { notifMgr.sendForValidation(session); } else { log.info("Session {} for {}: sending remote-only validation notification", sessionId, tpid); - notifMgr.sendforRemoteValidation(session); + notifMgr.sendForRemoteValidation(session); } storage.insertThreePidSession(session.getDao()); diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/IThreePidConnector.java b/src/main/java/io/kamax/mxisd/threepid/connector/ThreePidConnector.java similarity index 95% rename from src/main/java/io/kamax/mxisd/threepid/connector/IThreePidConnector.java rename to src/main/java/io/kamax/mxisd/threepid/connector/ThreePidConnector.java index 0b4a7bc..7fd469d 100644 --- a/src/main/java/io/kamax/mxisd/threepid/connector/IThreePidConnector.java +++ b/src/main/java/io/kamax/mxisd/threepid/connector/ThreePidConnector.java @@ -20,7 +20,7 @@ package io.kamax.mxisd.threepid.connector; -public interface IThreePidConnector { +public interface ThreePidConnector { String getId(); diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/email/BuiltInEmailConnectorSupplier.java b/src/main/java/io/kamax/mxisd/threepid/connector/email/BuiltInEmailConnectorSupplier.java new file mode 100644 index 0000000..f2b6d99 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/connector/email/BuiltInEmailConnectorSupplier.java @@ -0,0 +1,44 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.connector.email; + +import com.google.gson.JsonObject; +import io.kamax.matrix.json.GsonUtil; +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.connector.EmailSmtpConfig; +import io.kamax.mxisd.config.threepid.medium.EmailConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.Optional; + +public class BuiltInEmailConnectorSupplier implements EmailConnectorSupplier { + + @Override + public Optional apply(EmailConfig cfg, Mxisd mxisd) { + if (StringUtils.equals(EmailSmtpConnector.ID, cfg.getConnector())) { + EmailSmtpConfig smtpCfg = GsonUtil.get().fromJson(cfg.getConnectors().getOrDefault(EmailSmtpConnector.ID, new JsonObject()), EmailSmtpConfig.class); + return Optional.of(new EmailSmtpConnector(smtpCfg)); + } + + return Optional.empty(); + } + +} diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/email/IEmailConnector.java b/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailConnector.java similarity index 89% rename from src/main/java/io/kamax/mxisd/threepid/connector/email/IEmailConnector.java rename to src/main/java/io/kamax/mxisd/threepid/connector/email/EmailConnector.java index 58f9b67..0041da4 100644 --- a/src/main/java/io/kamax/mxisd/threepid/connector/email/IEmailConnector.java +++ b/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailConnector.java @@ -21,9 +21,9 @@ package io.kamax.mxisd.threepid.connector.email; import io.kamax.matrix.ThreePidMedium; -import io.kamax.mxisd.threepid.connector.IThreePidConnector; +import io.kamax.mxisd.threepid.connector.ThreePidConnector; -public interface IEmailConnector extends IThreePidConnector { +public interface EmailConnector extends ThreePidConnector { @Override default String getMedium() { diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailConnectorSupplier.java b/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailConnectorSupplier.java new file mode 100644 index 0000000..37e814c --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailConnectorSupplier.java @@ -0,0 +1,31 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.connector.email; + +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.medium.EmailConfig; + +import java.util.Optional; +import java.util.function.BiFunction; + +public interface EmailConnectorSupplier extends BiFunction> { + +} diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailSmtpConnector.java b/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailSmtpConnector.java index e7c95dd..24d840f 100644 --- a/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailSmtpConnector.java +++ b/src/main/java/io/kamax/mxisd/threepid/connector/email/EmailSmtpConnector.java @@ -40,7 +40,9 @@ import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.Properties; -public class EmailSmtpConnector implements IEmailConnector { +public class EmailSmtpConnector implements EmailConnector { + + public static final String ID = "smtp"; private transient final Logger log = LoggerFactory.getLogger(EmailSmtpConnector.class); @@ -48,7 +50,7 @@ public class EmailSmtpConnector implements IEmailConnector { private Session session; public EmailSmtpConnector(EmailSmtpConfig cfg) { - this.cfg = cfg; + this.cfg = cfg.build(); Properties sCfg = new Properties(); sCfg.setProperty("mail.smtp.host", cfg.getHost()); @@ -68,7 +70,7 @@ public class EmailSmtpConnector implements IEmailConnector { @Override public String getId() { - return "smtp"; + return ID; } @Override diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/phone/BlackholePhoneConnector.java b/src/main/java/io/kamax/mxisd/threepid/connector/phone/BlackholePhoneConnector.java index 063001b..b9378cd 100644 --- a/src/main/java/io/kamax/mxisd/threepid/connector/phone/BlackholePhoneConnector.java +++ b/src/main/java/io/kamax/mxisd/threepid/connector/phone/BlackholePhoneConnector.java @@ -20,7 +20,9 @@ package io.kamax.mxisd.threepid.connector.phone; -public class BlackholePhoneConnector implements IPhoneConnector { +public class BlackholePhoneConnector implements PhoneConnector { + + public static final String ID = "none"; @Override public void send(String recipient, String content) { @@ -29,7 +31,7 @@ public class BlackholePhoneConnector implements IPhoneConnector { @Override public String getId() { - return "BLACKHOLE"; + return ID; } } diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/phone/BuiltInPhoneConnectorSupplier.java b/src/main/java/io/kamax/mxisd/threepid/connector/phone/BuiltInPhoneConnectorSupplier.java new file mode 100644 index 0000000..d00bcf6 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/connector/phone/BuiltInPhoneConnectorSupplier.java @@ -0,0 +1,48 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.connector.phone; + +import com.google.gson.JsonObject; +import io.kamax.matrix.json.GsonUtil; +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.connector.PhoneTwilioConfig; +import io.kamax.mxisd.config.threepid.medium.PhoneConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.Optional; + +public class BuiltInPhoneConnectorSupplier implements PhoneConnectorSupplier { + + @Override + public Optional apply(PhoneConfig cfg, Mxisd mxisd) { + if (StringUtils.equals(PhoneSmsTwilioConnector.ID, cfg.getConnector())) { + PhoneTwilioConfig cCfg = GsonUtil.get().fromJson(cfg.getConnectors().getOrDefault(PhoneSmsTwilioConnector.ID, new JsonObject()), PhoneTwilioConfig.class); + return Optional.of(new PhoneSmsTwilioConnector(cCfg)); + } + + if (StringUtils.equals(BlackholePhoneConnector.ID, cfg.getConnector())) { + return Optional.of(new BlackholePhoneConnector()); + } + + return Optional.empty(); + } + +} diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/phone/IPhoneConnector.java b/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneConnector.java similarity index 89% rename from src/main/java/io/kamax/mxisd/threepid/connector/phone/IPhoneConnector.java rename to src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneConnector.java index 4077bea..f9e262e 100644 --- a/src/main/java/io/kamax/mxisd/threepid/connector/phone/IPhoneConnector.java +++ b/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneConnector.java @@ -21,9 +21,9 @@ package io.kamax.mxisd.threepid.connector.phone; import io.kamax.matrix.ThreePidMedium; -import io.kamax.mxisd.threepid.connector.IThreePidConnector; +import io.kamax.mxisd.threepid.connector.ThreePidConnector; -public interface IPhoneConnector extends IThreePidConnector { +public interface PhoneConnector extends ThreePidConnector { @Override default String getMedium() { diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneConnectorSupplier.java b/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneConnectorSupplier.java new file mode 100644 index 0000000..df2caa3 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneConnectorSupplier.java @@ -0,0 +1,31 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.connector.phone; + +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.medium.PhoneConfig; + +import java.util.Optional; +import java.util.function.BiFunction; + +public interface PhoneConnectorSupplier extends BiFunction> { + +} diff --git a/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneSmsTwilioConnector.java b/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneSmsTwilioConnector.java index 9d2b713..42c190c 100644 --- a/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneSmsTwilioConnector.java +++ b/src/main/java/io/kamax/mxisd/threepid/connector/phone/PhoneSmsTwilioConnector.java @@ -29,14 +29,16 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class PhoneSmsTwilioConnector implements IPhoneConnector { +public class PhoneSmsTwilioConnector implements PhoneConnector { + + public static final String ID = "twilio"; private transient final Logger log = LoggerFactory.getLogger(PhoneSmsTwilioConnector.class); private PhoneTwilioConfig cfg; public PhoneSmsTwilioConnector(PhoneTwilioConfig cfg) { - this.cfg = cfg; + this.cfg = cfg.build(); Twilio.init(cfg.getAccountSid(), cfg.getAuthToken()); log.info("Twilio API has been initiated"); @@ -44,7 +46,7 @@ public class PhoneSmsTwilioConnector implements IPhoneConnector { @Override public String getId() { - return "twilio"; + return ID; } @Override diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/GenericTemplateNotificationGenerator.java b/src/main/java/io/kamax/mxisd/threepid/generator/GenericTemplateNotificationGenerator.java similarity index 96% rename from src/main/java/io/kamax/mxisd/threepid/notification/GenericTemplateNotificationGenerator.java rename to src/main/java/io/kamax/mxisd/threepid/generator/GenericTemplateNotificationGenerator.java index 2ea0057..a891024 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/GenericTemplateNotificationGenerator.java +++ b/src/main/java/io/kamax/mxisd/threepid/generator/GenericTemplateNotificationGenerator.java @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -package io.kamax.mxisd.threepid.notification; +package io.kamax.mxisd.threepid.generator; import io.kamax.mxisd.as.IMatrixIdInvite; import io.kamax.mxisd.config.MatrixConfig; @@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; -public abstract class GenericTemplateNotificationGenerator extends PlaceholderNotificationGenerator implements INotificationGenerator { +public abstract class GenericTemplateNotificationGenerator extends PlaceholderNotificationGenerator implements NotificationGenerator { private transient final Logger log = LoggerFactory.getLogger(GenericTemplateNotificationGenerator.class); diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/INotificationGenerator.java b/src/main/java/io/kamax/mxisd/threepid/generator/NotificationGenerator.java similarity index 93% rename from src/main/java/io/kamax/mxisd/threepid/notification/INotificationGenerator.java rename to src/main/java/io/kamax/mxisd/threepid/generator/NotificationGenerator.java index 2cbbec0..ddfcc3a 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/INotificationGenerator.java +++ b/src/main/java/io/kamax/mxisd/threepid/generator/NotificationGenerator.java @@ -18,13 +18,13 @@ * along with this program. If not, see . */ -package io.kamax.mxisd.threepid.notification; +package io.kamax.mxisd.threepid.generator; import io.kamax.mxisd.as.IMatrixIdInvite; import io.kamax.mxisd.invitation.IThreePidInviteReply; import io.kamax.mxisd.threepid.session.IThreePidSession; -public interface INotificationGenerator { +public interface NotificationGenerator { String getId(); diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/PlaceholderNotificationGenerator.java b/src/main/java/io/kamax/mxisd/threepid/generator/PlaceholderNotificationGenerator.java similarity index 99% rename from src/main/java/io/kamax/mxisd/threepid/notification/PlaceholderNotificationGenerator.java rename to src/main/java/io/kamax/mxisd/threepid/generator/PlaceholderNotificationGenerator.java index 1bd4f71..3371e44 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/PlaceholderNotificationGenerator.java +++ b/src/main/java/io/kamax/mxisd/threepid/generator/PlaceholderNotificationGenerator.java @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -package io.kamax.mxisd.threepid.notification; +package io.kamax.mxisd.threepid.generator; import io.kamax.matrix.ThreePid; import io.kamax.mxisd.as.IMatrixIdInvite; diff --git a/src/main/java/io/kamax/mxisd/threepid/generator/email/BuiltInEmailGeneratorSupplier.java b/src/main/java/io/kamax/mxisd/threepid/generator/email/BuiltInEmailGeneratorSupplier.java new file mode 100644 index 0000000..39f0767 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/generator/email/BuiltInEmailGeneratorSupplier.java @@ -0,0 +1,51 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.generator.email; + +import io.kamax.matrix.json.GsonUtil; +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.medium.EmailConfig; +import io.kamax.mxisd.config.threepid.medium.EmailTemplateConfig; +import org.apache.commons.lang.StringUtils; + +import java.util.Optional; + +public class BuiltInEmailGeneratorSupplier implements EmailGeneratorSupplier { + + private boolean processed = false; + private EmailGenerator obj; + + @Override + public Optional apply(EmailConfig emailConfig, Mxisd mxisd) { + if (!processed) { + if (StringUtils.equals(GenericEmailNotificationGenerator.ID, emailConfig.getGenerator())) { + EmailTemplateConfig cfg = Optional.ofNullable(emailConfig.getGenerators().get(GenericEmailNotificationGenerator.ID)) + .map(json -> GsonUtil.get().fromJson(json, EmailTemplateConfig.class)) + .orElseGet(EmailTemplateConfig::new); + obj = new GenericEmailNotificationGenerator(cfg, emailConfig, mxisd.getConfig().getMatrix(), mxisd.getConfig().getServer()); + } + } + + processed = true; + return Optional.ofNullable(obj); + } + +} diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/email/IEmailNotificationGenerator.java b/src/main/java/io/kamax/mxisd/threepid/generator/email/EmailGenerator.java similarity index 82% rename from src/main/java/io/kamax/mxisd/threepid/notification/email/IEmailNotificationGenerator.java rename to src/main/java/io/kamax/mxisd/threepid/generator/email/EmailGenerator.java index 50ff89a..b4dcb20 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/email/IEmailNotificationGenerator.java +++ b/src/main/java/io/kamax/mxisd/threepid/generator/email/EmailGenerator.java @@ -18,12 +18,12 @@ * along with this program. If not, see . */ -package io.kamax.mxisd.threepid.notification.email; +package io.kamax.mxisd.threepid.generator.email; import io.kamax.matrix.ThreePidMedium; -import io.kamax.mxisd.threepid.notification.INotificationGenerator; +import io.kamax.mxisd.threepid.generator.NotificationGenerator; -public interface IEmailNotificationGenerator extends INotificationGenerator { +public interface EmailGenerator extends NotificationGenerator { @Override default String getMedium() { diff --git a/src/main/java/io/kamax/mxisd/threepid/generator/email/EmailGeneratorSupplier.java b/src/main/java/io/kamax/mxisd/threepid/generator/email/EmailGeneratorSupplier.java new file mode 100644 index 0000000..4fbaf8a --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/generator/email/EmailGeneratorSupplier.java @@ -0,0 +1,31 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.generator.email; + +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.medium.EmailConfig; + +import java.util.Optional; +import java.util.function.BiFunction; + +public interface EmailGeneratorSupplier extends BiFunction> { + +} diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/email/EmailNotificationGenerator.java b/src/main/java/io/kamax/mxisd/threepid/generator/email/GenericEmailNotificationGenerator.java similarity index 74% rename from src/main/java/io/kamax/mxisd/threepid/notification/email/EmailNotificationGenerator.java rename to src/main/java/io/kamax/mxisd/threepid/generator/email/GenericEmailNotificationGenerator.java index 6549092..de474d1 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/email/EmailNotificationGenerator.java +++ b/src/main/java/io/kamax/mxisd/threepid/generator/email/GenericEmailNotificationGenerator.java @@ -18,27 +18,29 @@ * along with this program. If not, see . */ -package io.kamax.mxisd.threepid.notification.email; +package io.kamax.mxisd.threepid.generator.email; import io.kamax.matrix.ThreePid; import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.config.ServerConfig; import io.kamax.mxisd.config.threepid.medium.EmailConfig; import io.kamax.mxisd.config.threepid.medium.EmailTemplateConfig; -import io.kamax.mxisd.threepid.notification.GenericTemplateNotificationGenerator; +import io.kamax.mxisd.threepid.generator.GenericTemplateNotificationGenerator; -public class EmailNotificationGenerator extends GenericTemplateNotificationGenerator implements IEmailNotificationGenerator { +public class GenericEmailNotificationGenerator extends GenericTemplateNotificationGenerator implements EmailGenerator { + + public static final String ID = "template"; private EmailConfig cfg; - public EmailNotificationGenerator(EmailTemplateConfig templateCfg, EmailConfig cfg, MatrixConfig mxCfg, ServerConfig srvCfg) { - super(mxCfg, srvCfg, templateCfg); + public GenericEmailNotificationGenerator(EmailTemplateConfig templateCfg, EmailConfig cfg, MatrixConfig mxCfg, ServerConfig srvCfg) { + super(mxCfg, srvCfg, templateCfg.build()); this.cfg = cfg; } @Override public String getId() { - return "template"; + return ID; } @Override diff --git a/src/main/java/io/kamax/mxisd/threepid/generator/phone/BuiltInPhoneGeneratorSupplier.java b/src/main/java/io/kamax/mxisd/threepid/generator/phone/BuiltInPhoneGeneratorSupplier.java new file mode 100644 index 0000000..fac0c83 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/generator/phone/BuiltInPhoneGeneratorSupplier.java @@ -0,0 +1,45 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.generator.phone; + +import io.kamax.matrix.json.GsonUtil; +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.medium.PhoneConfig; +import io.kamax.mxisd.config.threepid.medium.PhoneSmsTemplateConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.Optional; + +public class BuiltInPhoneGeneratorSupplier implements PhoneGeneratorSupplier { + + @Override + public Optional apply(PhoneConfig cfg, Mxisd mxisd) { + if (StringUtils.equals(SmsNotificationGenerator.ID, cfg.getGenerator())) { + PhoneSmsTemplateConfig genCfg = Optional.ofNullable(cfg.getGenerators().get(SmsNotificationGenerator.ID)) + .map(json -> GsonUtil.get().fromJson(json, PhoneSmsTemplateConfig.class)) + .orElseGet(PhoneSmsTemplateConfig::new); + return Optional.of(new SmsNotificationGenerator(mxisd.getConfig().getMatrix(), mxisd.getConfig().getServer(), genCfg)); + } + + return Optional.empty(); + } + +} diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/phone/IPhoneNotificationGenerator.java b/src/main/java/io/kamax/mxisd/threepid/generator/phone/PhoneGenerator.java similarity index 81% rename from src/main/java/io/kamax/mxisd/threepid/notification/phone/IPhoneNotificationGenerator.java rename to src/main/java/io/kamax/mxisd/threepid/generator/phone/PhoneGenerator.java index 293d37f..341bb49 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/phone/IPhoneNotificationGenerator.java +++ b/src/main/java/io/kamax/mxisd/threepid/generator/phone/PhoneGenerator.java @@ -18,11 +18,11 @@ * along with this program. If not, see . */ -package io.kamax.mxisd.threepid.notification.phone; +package io.kamax.mxisd.threepid.generator.phone; -import io.kamax.mxisd.threepid.notification.INotificationGenerator; +import io.kamax.mxisd.threepid.generator.NotificationGenerator; -public interface IPhoneNotificationGenerator extends INotificationGenerator { +public interface PhoneGenerator extends NotificationGenerator { default String getMedium() { return "msisdn"; diff --git a/src/main/java/io/kamax/mxisd/threepid/generator/phone/PhoneGeneratorSupplier.java b/src/main/java/io/kamax/mxisd/threepid/generator/phone/PhoneGeneratorSupplier.java new file mode 100644 index 0000000..9c2ffbb --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/generator/phone/PhoneGeneratorSupplier.java @@ -0,0 +1,30 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.generator.phone; + +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.medium.PhoneConfig; + +import java.util.Optional; +import java.util.function.BiFunction; + +public interface PhoneGeneratorSupplier extends BiFunction> { +} diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/phone/SmsNotificationGenerator.java b/src/main/java/io/kamax/mxisd/threepid/generator/phone/SmsNotificationGenerator.java similarity index 80% rename from src/main/java/io/kamax/mxisd/threepid/notification/phone/SmsNotificationGenerator.java rename to src/main/java/io/kamax/mxisd/threepid/generator/phone/SmsNotificationGenerator.java index a5d14b2..c17db16 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/phone/SmsNotificationGenerator.java +++ b/src/main/java/io/kamax/mxisd/threepid/generator/phone/SmsNotificationGenerator.java @@ -18,22 +18,24 @@ * along with this program. If not, see . */ -package io.kamax.mxisd.threepid.notification.phone; +package io.kamax.mxisd.threepid.generator.phone; import io.kamax.mxisd.config.MatrixConfig; import io.kamax.mxisd.config.ServerConfig; import io.kamax.mxisd.config.threepid.medium.PhoneSmsTemplateConfig; -import io.kamax.mxisd.threepid.notification.GenericTemplateNotificationGenerator; +import io.kamax.mxisd.threepid.generator.GenericTemplateNotificationGenerator; -public class SmsNotificationGenerator extends GenericTemplateNotificationGenerator implements IPhoneNotificationGenerator { +public class SmsNotificationGenerator extends GenericTemplateNotificationGenerator implements PhoneGenerator { + + public static final String ID = "template"; public SmsNotificationGenerator(MatrixConfig mxCfg, ServerConfig srvCfg, PhoneSmsTemplateConfig cfg) { - super(mxCfg, srvCfg, cfg); + super(mxCfg, srvCfg, cfg.build()); } @Override public String getId() { - return "template"; + return ID; } } diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/BuiltInNotificationHandlerSupplier.java b/src/main/java/io/kamax/mxisd/threepid/notification/BuiltInNotificationHandlerSupplier.java new file mode 100644 index 0000000..92b4de6 --- /dev/null +++ b/src/main/java/io/kamax/mxisd/threepid/notification/BuiltInNotificationHandlerSupplier.java @@ -0,0 +1,131 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.threepid.notification; + +import com.google.gson.JsonObject; +import io.kamax.matrix.ThreePidMedium; +import io.kamax.matrix.json.GsonUtil; +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.threepid.connector.EmailSendGridConfig; +import io.kamax.mxisd.config.threepid.medium.EmailConfig; +import io.kamax.mxisd.config.threepid.medium.PhoneConfig; +import io.kamax.mxisd.exception.ConfigurationException; +import io.kamax.mxisd.notification.NotificationHandlerSupplier; +import io.kamax.mxisd.notification.NotificationHandlers; +import io.kamax.mxisd.threepid.connector.email.EmailConnector; +import io.kamax.mxisd.threepid.connector.email.EmailConnectorSupplier; +import io.kamax.mxisd.threepid.connector.phone.PhoneConnector; +import io.kamax.mxisd.threepid.connector.phone.PhoneConnectorSupplier; +import io.kamax.mxisd.threepid.generator.email.EmailGenerator; +import io.kamax.mxisd.threepid.generator.email.EmailGeneratorSupplier; +import io.kamax.mxisd.threepid.generator.phone.PhoneGenerator; +import io.kamax.mxisd.threepid.generator.phone.PhoneGeneratorSupplier; +import io.kamax.mxisd.threepid.notification.email.EmailRawNotificationHandler; +import io.kamax.mxisd.threepid.notification.email.EmailSendGridNotificationHandler; +import io.kamax.mxisd.threepid.notification.phone.PhoneNotificationHandler; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.ServiceLoader; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +public class BuiltInNotificationHandlerSupplier implements NotificationHandlerSupplier { + + @Override + public void accept(Mxisd mxisd) { + String emailHandler = mxisd.getConfig().getNotification().getHandler().get(ThreePidMedium.Email.getId()); + acceptEmail(emailHandler, mxisd); + + String phoneHandler = mxisd.getConfig().getNotification().getHandler().get(ThreePidMedium.PhoneNumber.getId()); + acceptPhone(phoneHandler, mxisd); + } + + private void acceptEmail(String handler, Mxisd mxisd) { + if (StringUtils.equals(EmailRawNotificationHandler.ID, handler)) { + JsonObject emailCfgJson = mxisd.getConfig().getThreepid().getMedium().get(ThreePidMedium.Email.getId()); + if (Objects.nonNull(emailCfgJson)) { + EmailConfig emailCfg = GsonUtil.get().fromJson(emailCfgJson, EmailConfig.class); + + if (org.apache.commons.lang.StringUtils.isBlank(emailCfg.getGenerator())) { + throw new ConfigurationException("notification.email.generator"); + } + + if (org.apache.commons.lang.StringUtils.isBlank(emailCfg.getConnector())) { + throw new ConfigurationException("notification.email.connector"); + } + + List generators = StreamSupport + .stream(ServiceLoader.load(EmailGeneratorSupplier.class).spliterator(), false) + .map(s -> s.apply(emailCfg, mxisd)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + + List connectors = StreamSupport + .stream(ServiceLoader.load(EmailConnectorSupplier.class).spliterator(), false) + .map(s -> s.apply(emailCfg, mxisd)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + + NotificationHandlers.register(() -> new EmailRawNotificationHandler(emailCfg, generators, connectors)); + } + } + + if (StringUtils.equals(EmailSendGridNotificationHandler.ID, handler)) { + JsonObject cfgJson = mxisd.getConfig().getNotification().getHandlers().get(EmailSendGridNotificationHandler.ID); + if (Objects.nonNull(cfgJson)) { + EmailSendGridConfig cfg = GsonUtil.get().fromJson(cfgJson, EmailSendGridConfig.class); + NotificationHandlers.register(() -> new EmailSendGridNotificationHandler(mxisd.getConfig(), cfg)); + } + } + + } + + private void acceptPhone(String handler, Mxisd mxisd) { + if (StringUtils.equals(PhoneNotificationHandler.ID, handler)) { + JsonObject cfgJson = mxisd.getConfig().getThreepid().getMedium().get(ThreePidMedium.PhoneNumber.getId()); + if (Objects.nonNull(cfgJson)) { + PhoneConfig cfg = GsonUtil.get().fromJson(cfgJson, PhoneConfig.class); + + List generators = StreamSupport + .stream(ServiceLoader.load(PhoneGeneratorSupplier.class).spliterator(), false) + .map(s -> s.apply(cfg, mxisd)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + + List connectors = StreamSupport + .stream(ServiceLoader.load(PhoneConnectorSupplier.class).spliterator(), false) + .map(s -> s.apply(cfg, mxisd)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + + NotificationHandlers.register(() -> new PhoneNotificationHandler(cfg, generators, connectors)); + } + } + } + +} diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/GenericNotificationHandler.java b/src/main/java/io/kamax/mxisd/threepid/notification/GenericNotificationHandler.java index 53dc919..fd3a5f2 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/GenericNotificationHandler.java +++ b/src/main/java/io/kamax/mxisd/threepid/notification/GenericNotificationHandler.java @@ -23,14 +23,15 @@ package io.kamax.mxisd.threepid.notification; import io.kamax.mxisd.as.IMatrixIdInvite; import io.kamax.mxisd.exception.ConfigurationException; import io.kamax.mxisd.invitation.IThreePidInviteReply; -import io.kamax.mxisd.notification.INotificationHandler; -import io.kamax.mxisd.threepid.connector.IThreePidConnector; +import io.kamax.mxisd.notification.NotificationHandler; +import io.kamax.mxisd.threepid.connector.ThreePidConnector; +import io.kamax.mxisd.threepid.generator.NotificationGenerator; import io.kamax.mxisd.threepid.session.IThreePidSession; import org.apache.commons.lang.StringUtils; import java.util.List; -public abstract class GenericNotificationHandler implements INotificationHandler { +public abstract class GenericNotificationHandler implements NotificationHandler { private A connector; private B generator; diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/email/EmailRawNotificationHandler.java b/src/main/java/io/kamax/mxisd/threepid/notification/email/EmailRawNotificationHandler.java index 99aeeb1..4bd801b 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/email/EmailRawNotificationHandler.java +++ b/src/main/java/io/kamax/mxisd/threepid/notification/email/EmailRawNotificationHandler.java @@ -22,23 +22,26 @@ package io.kamax.mxisd.threepid.notification.email; import io.kamax.matrix.ThreePidMedium; import io.kamax.mxisd.config.threepid.medium.EmailConfig; -import io.kamax.mxisd.threepid.connector.email.IEmailConnector; +import io.kamax.mxisd.threepid.connector.email.EmailConnector; +import io.kamax.mxisd.threepid.generator.email.EmailGenerator; import io.kamax.mxisd.threepid.notification.GenericNotificationHandler; import java.util.List; -public class EmailRawNotificationHandler extends GenericNotificationHandler { +public class EmailRawNotificationHandler extends GenericNotificationHandler { + + public static final String ID = "raw"; private EmailConfig cfg; - public EmailRawNotificationHandler(EmailConfig cfg, List generators, List connectors) { + public EmailRawNotificationHandler(EmailConfig cfg, List generators, List connectors) { this.cfg = cfg; process(connectors, generators); } @Override public String getId() { - return "raw"; + return ID; } @Override @@ -57,7 +60,7 @@ public class EmailRawNotificationHandler extends GenericNotificationHandler. */ -package io.kamax.mxisd.threepid.connector.email; +package io.kamax.mxisd.threepid.notification.email; import com.sendgrid.SendGrid; import com.sendgrid.SendGridException; import io.kamax.matrix.ThreePidMedium; import io.kamax.mxisd.as.IMatrixIdInvite; -import io.kamax.mxisd.config.MatrixConfig; -import io.kamax.mxisd.config.ServerConfig; +import io.kamax.mxisd.config.MxisdConfig; import io.kamax.mxisd.config.threepid.connector.EmailSendGridConfig; import io.kamax.mxisd.exception.FeatureNotAvailable; import io.kamax.mxisd.invitation.IThreePidInviteReply; -import io.kamax.mxisd.notification.INotificationHandler; -import io.kamax.mxisd.threepid.notification.PlaceholderNotificationGenerator; +import io.kamax.mxisd.notification.NotificationHandler; +import io.kamax.mxisd.threepid.generator.PlaceholderNotificationGenerator; import io.kamax.mxisd.threepid.session.IThreePidSession; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; @@ -45,22 +44,24 @@ import static com.sendgrid.SendGrid.Email; import static com.sendgrid.SendGrid.Response; import static io.kamax.mxisd.config.threepid.connector.EmailSendGridConfig.EmailTemplate; -public class EmailSendGridNotificationHandler extends PlaceholderNotificationGenerator implements INotificationHandler { +public class EmailSendGridNotificationHandler extends PlaceholderNotificationGenerator implements NotificationHandler { + + public static final String ID = "sendgrid"; private transient final Logger log = LoggerFactory.getLogger(EmailSendGridNotificationHandler.class); private EmailSendGridConfig cfg; private SendGrid sendgrid; - public EmailSendGridNotificationHandler(MatrixConfig mxCfg, ServerConfig srvCfg, EmailSendGridConfig cfg) { - super(mxCfg, srvCfg); + public EmailSendGridNotificationHandler(MxisdConfig mCfg, EmailSendGridConfig cfg) { + super(mCfg.getMatrix(), mCfg.getServer()); this.cfg = cfg; this.sendgrid = new SendGrid(cfg.getApi().getKey()); } @Override public String getId() { - return "sendgrid"; + return ID; } @Override diff --git a/src/main/java/io/kamax/mxisd/threepid/notification/phone/PhoneNotificationHandler.java b/src/main/java/io/kamax/mxisd/threepid/notification/phone/PhoneNotificationHandler.java index 7217ec3..9e89629 100644 --- a/src/main/java/io/kamax/mxisd/threepid/notification/phone/PhoneNotificationHandler.java +++ b/src/main/java/io/kamax/mxisd/threepid/notification/phone/PhoneNotificationHandler.java @@ -22,23 +22,26 @@ package io.kamax.mxisd.threepid.notification.phone; import io.kamax.matrix.ThreePidMedium; import io.kamax.mxisd.config.threepid.medium.PhoneConfig; -import io.kamax.mxisd.threepid.connector.phone.IPhoneConnector; +import io.kamax.mxisd.threepid.connector.phone.PhoneConnector; +import io.kamax.mxisd.threepid.generator.phone.PhoneGenerator; import io.kamax.mxisd.threepid.notification.GenericNotificationHandler; import java.util.List; -public class PhoneNotificationHandler extends GenericNotificationHandler { +public class PhoneNotificationHandler extends GenericNotificationHandler { + + public static final String ID = "raw"; private PhoneConfig cfg; - public PhoneNotificationHandler(PhoneConfig cfg, List connectors, List generators) { + public PhoneNotificationHandler(PhoneConfig cfg, List generators, List connectors) { this.cfg = cfg; process(connectors, generators); } @Override public String getId() { - return "raw"; + return ID; } @Override @@ -57,7 +60,7 @@ public class PhoneNotificationHandler extends GenericNotificationHandler. + */ + +package io.kamax.mxisd.test; + +import io.kamax.matrix.ThreePidMedium; +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.MxisdConfig; +import org.junit.Test; + +import static junit.framework.TestCase.*; + +public class MxisdDefaultTest { + + private final String domain = "localhost"; + + @Test + public void defaultConfig() { + MxisdConfig cfg = new MxisdConfig(); + cfg.getMatrix().setDomain(domain); + cfg.getKey().setPath(":memory:"); + cfg.getStorage().getProvider().getSqlite().setDatabase(":memory:"); + + Mxisd m = new Mxisd(cfg); + m.start(); + + assertNotNull(m.getConfig()); + assertEquals(domain, m.getConfig().getMatrix().getDomain()); + + assertTrue(m.getNotif().isMediumSupported(ThreePidMedium.Email.getId())); + assertTrue(m.getNotif().isMediumSupported(ThreePidMedium.PhoneNumber.getId())); + } + +} diff --git a/src/test/java/io/kamax/mxisd/test/MxisdTest.java b/src/test/java/io/kamax/mxisd/test/MxisdTest.java new file mode 100644 index 0000000..d7dd1ef --- /dev/null +++ b/src/test/java/io/kamax/mxisd/test/MxisdTest.java @@ -0,0 +1,78 @@ +/* + * 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 . + */ + +package io.kamax.mxisd.test; + +import io.kamax.mxisd.Mxisd; +import io.kamax.mxisd.config.MxisdConfig; +import io.kamax.mxisd.config.memory.MemoryIdentityConfig; +import io.kamax.mxisd.config.memory.MemoryThreePid; +import io.kamax.mxisd.lookup.SingleLookupReply; +import io.kamax.mxisd.lookup.SingleLookupRequest; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Optional; + +import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertEquals; + +public class MxisdTest { + + private Mxisd m; + + @Before + public void before() { + MxisdConfig cfg = new MxisdConfig(); + cfg.getMatrix().setDomain("localhost"); + cfg.getKey().setPath(":memory:"); + cfg.getStorage().getProvider().getSqlite().setDatabase(":memory:"); + + MemoryThreePid mem3pid = new MemoryThreePid(); + mem3pid.setMedium("email"); + mem3pid.setAddress("john@localhost"); + MemoryIdentityConfig memCfg = new MemoryIdentityConfig(); + memCfg.setUsername("john"); + memCfg.getThreepids().add(mem3pid); + cfg.getMemory().setEnabled(true); + cfg.getMemory().getIdentities().add(memCfg); + + m = new Mxisd(cfg); + m.start(); + } + + @After + public void after() { + m.stop(); + } + + @Test + public void singleLookup() { + SingleLookupRequest req = new SingleLookupRequest(); + req.setRecursive(false); + req.setType("email"); + req.setThreePid("john@localhost"); + Optional reply = m.getIdentity().find(req); + assertTrue(reply.isPresent()); + assertEquals("@john:localhost", reply.get().getMxid().getId()); + } + +} diff --git a/src/test/java/io/kamax/mxisd/test/backend/exec/ExecDirectoryStoreTest.java b/src/test/java/io/kamax/mxisd/test/backend/exec/ExecDirectoryStoreTest.java index f9e781a..45d6988 100644 --- a/src/test/java/io/kamax/mxisd/test/backend/exec/ExecDirectoryStoreTest.java +++ b/src/test/java/io/kamax/mxisd/test/backend/exec/ExecDirectoryStoreTest.java @@ -68,7 +68,6 @@ public class ExecDirectoryStoreTest extends ExecStoreTest { private ExecDirectoryStore getStore(ExecConfig.Directory cfg) { ExecDirectoryStore store = new ExecDirectoryStore(cfg, getMatrixCfg()); store.setExecutorSupplier(this::build); - assertTrue(store.isEnabled()); return store; } diff --git a/src/test/java/io/kamax/mxisd/test/backend/exec/ExecIdentityStoreTest.java b/src/test/java/io/kamax/mxisd/test/backend/exec/ExecIdentityStoreTest.java index 1ce96e1..0556499 100644 --- a/src/test/java/io/kamax/mxisd/test/backend/exec/ExecIdentityStoreTest.java +++ b/src/test/java/io/kamax/mxisd/test/backend/exec/ExecIdentityStoreTest.java @@ -75,7 +75,7 @@ public class ExecIdentityStoreTest extends ExecStoreTest { private ExecIdentityStore getStore(ExecConfig.Identity cfg) { ExecIdentityStore store = new ExecIdentityStore(cfg, getMatrixCfg()); store.setExecutorSupplier(this::build); - assertTrue(store.isEnabled()); + assertTrue(store.isLocal()); return store; } diff --git a/src/test/java/io/kamax/mxisd/test/backend/exec/ExecProfileStoreTest.java b/src/test/java/io/kamax/mxisd/test/backend/exec/ExecProfileStoreTest.java index 2019b93..0f138a9 100644 --- a/src/test/java/io/kamax/mxisd/test/backend/exec/ExecProfileStoreTest.java +++ b/src/test/java/io/kamax/mxisd/test/backend/exec/ExecProfileStoreTest.java @@ -84,7 +84,6 @@ public class ExecProfileStoreTest extends ExecStoreTest { private ExecProfileStore getStore(ExecConfig.Profile cfg) { ExecProfileStore store = new ExecProfileStore(cfg); store.setExecutorSupplier(this::build); - assertTrue(store.isEnabled()); return store; } diff --git a/src/test/java/io/kamax/mxisd/test/backend/ldap/LdapAuthTest.java b/src/test/java/io/kamax/mxisd/test/backend/ldap/LdapAuthTest.java index 8ed1c97..c6a1712 100644 --- a/src/test/java/io/kamax/mxisd/test/backend/ldap/LdapAuthTest.java +++ b/src/test/java/io/kamax/mxisd/test/backend/ldap/LdapAuthTest.java @@ -75,22 +75,22 @@ public class LdapAuthTest { @Test public void singleDn() { - MatrixConfig mxCfg = new MatrixConfig(); - mxCfg.setDomain(domain); - mxCfg.build(); - LdapConfig cfg = new GenericLdapConfig(); cfg.getConnection().setHost(host); cfg.getConnection().setPort(65001); cfg.getConnection().setBaseDn(dnList.get(0)); cfg.getConnection().setBindDn(mxisdCn); cfg.getConnection().setBindPassword(mxisdPw); + cfg.build(); LdapConfig.UID uid = new LdapConfig.UID(); uid.setType(idType); uid.setValue(idAttribute); cfg.getAttribute().setUid(uid); - cfg.build(); + + MatrixConfig mxCfg = new MatrixConfig(); + mxCfg.setDomain(domain); + mxCfg.build(); LdapAuthProvider p = new LdapAuthProvider(cfg, mxCfg); BackendAuthResult result = p.authenticate(MatrixID.from(userId, domain).valid(), userPw);