This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/syncope.git
commit 9e817338a875a56633650f641ef9014d2f3a5bc6 Author: Francesco Chicchiriccò <ilgro...@apache.org> AuthorDate: Fri Dec 9 14:22:52 2022 +0100 Prefer spring-boot-starter-mail over custom conf --- .../syncope/core/logic/IdMLogicTestContext.java | 8 ++ core/idrepo/logic/pom.xml | 5 ++ .../syncope/core/logic/IdRepoLogicTestContext.java | 8 ++ core/provisioning-java/pom.xml | 13 ++-- .../provisioning/java/ProvisioningContext.java | 85 --------------------- .../provisioning/java/ProvisioningProperties.java | 87 ---------------------- .../provisioning/java/ProvisioningTestContext.java | 8 ++ core/starter/src/main/resources/core.properties | 20 +++-- .../src/main/resources/core-embedded.properties | 4 +- .../syncope/fit/core/NotificationITCase.java | 3 +- .../reference-guide/configuration/email.adoc | 59 +++++---------- 11 files changed, 67 insertions(+), 233 deletions(-) diff --git a/core/idm/logic/src/test/java/org/apache/syncope/core/logic/IdMLogicTestContext.java b/core/idm/logic/src/test/java/org/apache/syncope/core/logic/IdMLogicTestContext.java index f29b633844..9102a808b5 100644 --- a/core/idm/logic/src/test/java/org/apache/syncope/core/logic/IdMLogicTestContext.java +++ b/core/idm/logic/src/test/java/org/apache/syncope/core/logic/IdMLogicTestContext.java @@ -18,6 +18,8 @@ */ package org.apache.syncope.core.logic; +import static org.mockito.Mockito.mock; + import org.apache.syncope.common.keymaster.client.api.ConfParamOps; import org.apache.syncope.common.keymaster.client.api.DomainOps; import org.apache.syncope.common.keymaster.client.api.ServiceOps; @@ -36,6 +38,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; +import org.springframework.mail.javamail.JavaMailSender; @PropertySource("classpath:core-test.properties") @Import({ IdRepoLogicContext.class, IdMLogicContext.class, SecurityContext.class, @@ -53,6 +56,11 @@ public class IdMLogicTestContext { return new TestInitializer(domainLoader, domainHolder, contentLoader, ctx); } + @Bean + public JavaMailSender javaMailSender() { + return mock(JavaMailSender.class); + } + @Bean public ImplementationLookup implementationLookup() { return new DummyImplementationLookup(); diff --git a/core/idrepo/logic/pom.xml b/core/idrepo/logic/pom.xml index acc2852ac1..ddc1abe2ab 100644 --- a/core/idrepo/logic/pom.xml +++ b/core/idrepo/logic/pom.xml @@ -100,6 +100,11 @@ under the License. <artifactId>spring-test</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> diff --git a/core/idrepo/logic/src/test/java/org/apache/syncope/core/logic/IdRepoLogicTestContext.java b/core/idrepo/logic/src/test/java/org/apache/syncope/core/logic/IdRepoLogicTestContext.java index d647b7ca82..ed654e422e 100644 --- a/core/idrepo/logic/src/test/java/org/apache/syncope/core/logic/IdRepoLogicTestContext.java +++ b/core/idrepo/logic/src/test/java/org/apache/syncope/core/logic/IdRepoLogicTestContext.java @@ -18,6 +18,8 @@ */ package org.apache.syncope.core.logic; +import static org.mockito.Mockito.mock; + import org.apache.syncope.common.keymaster.client.api.ConfParamOps; import org.apache.syncope.common.keymaster.client.api.DomainOps; import org.apache.syncope.common.keymaster.client.api.ServiceOps; @@ -36,6 +38,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; +import org.springframework.mail.javamail.JavaMailSender; @PropertySource("classpath:core-test.properties") @Import({ IdRepoLogicContext.class, IdRepoLogicContext.class, SecurityContext.class, @@ -53,6 +56,11 @@ public class IdRepoLogicTestContext { return new TestInitializer(domainLoader, domainHolder, contentLoader, ctx); } + @Bean + public JavaMailSender javaMailSender() { + return mock(JavaMailSender.class); + } + @Bean public ImplementationLookup implementationLookup() { return new DummyImplementationLookup(); diff --git a/core/provisioning-java/pom.xml b/core/provisioning-java/pom.xml index 96aca892fa..fda5ce3d61 100644 --- a/core/provisioning-java/pom.xml +++ b/core/provisioning-java/pom.xml @@ -45,9 +45,10 @@ under the License. </dependency> <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-context-support</artifactId> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> </dependency> + <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> @@ -146,13 +147,13 @@ under the License. <scope>test</scope> </dependency> <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter</artifactId> + <groupId>org.mockito</groupId> + <artifactId>mockito-junit-jupiter</artifactId> <scope>test</scope> </dependency> <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-junit-jupiter</artifactId> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> <scope>test</scope> </dependency> </dependencies> diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java index 88b8a961e4..24d3945af2 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java @@ -18,22 +18,14 @@ */ package org.apache.syncope.core.provisioning.java; -import java.io.IOException; -import java.io.PrintStream; import java.nio.charset.StandardCharsets; import java.util.Properties; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import javax.annotation.Resource; -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.Transport; -import javax.naming.NamingException; import javax.sql.DataSource; -import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.keymaster.client.api.ConfParamOps; -import org.apache.syncope.common.lib.LogOutputStream; import org.apache.syncope.core.persistence.api.DomainHolder; import org.apache.syncope.core.persistence.api.attrvalue.validation.PlainAttrValidationManager; import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO; @@ -184,8 +176,6 @@ import org.apache.syncope.core.spring.security.jws.AccessTokenJWSSigner; import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter; import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter; import org.apache.syncope.core.workflow.api.UserWorkflowAdapter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -200,9 +190,7 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.support.TaskExecutorAdapter; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; -import org.springframework.jndi.JndiObjectFactoryBean; import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -214,8 +202,6 @@ import org.springframework.transaction.PlatformTransactionManager; @Configuration(proxyBeanMethods = false) public class ProvisioningContext { - private static final Logger LOG = LoggerFactory.getLogger(ProvisioningContext.class); - @Resource(name = "MasterDataSource") private DataSource masterDataSource; @@ -381,77 +367,6 @@ public class ProvisioningContext { return new JobStatusUpdater(jobStatusDAO, entityFactory); } - @ConditionalOnMissingBean - @Bean - public JavaMailSender mailSender(final ProvisioningProperties provisioningProperties) - throws IllegalArgumentException, IOException { - - JavaMailSenderImpl mailSender = new JavaMailSenderImpl() { - - @Override - protected Transport connectTransport() throws MessagingException { - // ensure that no auth means no auth - if (StringUtils.isBlank(getUsername())) { - Transport transport = getTransport(getSession()); - transport.connect(getHost(), getPort(), null, null); - return transport; - } - - return super.connectTransport(); - } - }; - mailSender.setDefaultEncoding(provisioningProperties.getSmtp().getDefaultEncoding()); - mailSender.setHost(provisioningProperties.getSmtp().getHost()); - mailSender.setPort(provisioningProperties.getSmtp().getPort()); - mailSender.setUsername(provisioningProperties.getSmtp().getUsername()); - mailSender.setPassword(provisioningProperties.getSmtp().getPassword()); - mailSender.setProtocol(provisioningProperties.getSmtp().getProtocol()); - - if (LOG.isDebugEnabled()) { - LOG.debug("[Mail] host:port = {}:{}", mailSender.getHost(), mailSender.getPort()); - LOG.debug("[Mail] protocol = {}", mailSender.getProtocol()); - LOG.debug("[Mail] username = {}", mailSender.getUsername()); - LOG.debug("[Mail] default encoding = {}", mailSender.getDefaultEncoding()); - } - - JndiObjectFactoryBean mailSession = new JndiObjectFactoryBean(); - mailSession.setJndiName("mail/syncopeNotification"); - try { - mailSession.afterPropertiesSet(); - } catch (NamingException e) { - LOG.debug("While looking up JNDI for mail session", e); - } - - Session session = (Session) mailSession.getObject(); - if (session == null) { - Properties javaMailProperties = mailSender.getJavaMailProperties(); - - provisioningProperties.getSmtp().getJavamailProperties(). - forEach((key, value) -> javaMailProperties.setProperty(key, value)); - - if (StringUtils.isNotBlank(mailSender.getUsername())) { - javaMailProperties.setProperty("mail.smtp.auth", "true"); - } - - if (LOG.isDebugEnabled()) { - mailSender.getJavaMailProperties(). - forEach((key, value) -> LOG.debug("[Mail] property: {} = {}", key, value)); - } - - if (provisioningProperties.getSmtp().isDebug()) { - session = mailSender.getSession(); - session.setDebug(true); - try (LogOutputStream los = new LogOutputStream(LOG)) { - session.setDebugOut(new PrintStream(los)); - } - } - } else { - mailSender.setSession(session); - } - - return mailSender; - } - @ConditionalOnMissingBean @Bean public ConnectorManager connectorManager( diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningProperties.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningProperties.java index 7375f3da7e..9eea8ace4c 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningProperties.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningProperties.java @@ -19,9 +19,7 @@ package org.apache.syncope.core.provisioning.java; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.quartz.impl.jdbcjobstore.DriverDelegate; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -91,85 +89,6 @@ public class ProvisioningProperties { } } - public static class SMTPProperties { - - private String host; - - private int port = 25; - - private String username; - - private String password; - - private String protocol = "smtp"; - - private String defaultEncoding = "UTF-8"; - - private boolean debug = false; - - private final Map<String, String> javamailProperties = new HashMap<>(); - - public String getHost() { - return host; - } - - public void setHost(final String host) { - this.host = host; - } - - public int getPort() { - return port; - } - - public void setPort(final int port) { - this.port = port; - } - - public String getUsername() { - return username; - } - - public void setUsername(final String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(final String password) { - this.password = password; - } - - public String getProtocol() { - return protocol; - } - - public void setProtocol(final String protocol) { - this.protocol = protocol; - } - - public String getDefaultEncoding() { - return defaultEncoding; - } - - public void setDefaultEncoding(final String defaultEncoding) { - this.defaultEncoding = defaultEncoding; - } - - public boolean isDebug() { - return debug; - } - - public void setDebug(final boolean debug) { - this.debug = debug; - } - - public Map<String, String> getJavamailProperties() { - return javamailProperties; - } - } - private final ExecutorProperties asyncConnectorFacadeExecutor = new ExecutorProperties(); private final ExecutorProperties propagationTaskExecutorAsyncExecutor = new ExecutorProperties(); @@ -180,8 +99,6 @@ public class ProvisioningProperties { private final QuartzProperties quartz = new QuartzProperties(); - private final SMTPProperties smtp = new SMTPProperties(); - public String getVirAttrCacheSpec() { return virAttrCacheSpec; } @@ -205,8 +122,4 @@ public class ProvisioningProperties { public QuartzProperties getQuartz() { return quartz; } - - public SMTPProperties getSmtp() { - return smtp; - } } diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ProvisioningTestContext.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ProvisioningTestContext.java index 5794382682..ce03a87c27 100644 --- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ProvisioningTestContext.java +++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ProvisioningTestContext.java @@ -18,6 +18,8 @@ */ package org.apache.syncope.core.provisioning.java; +import static org.mockito.Mockito.mock; + import org.apache.syncope.common.keymaster.client.api.ConfParamOps; import org.apache.syncope.common.keymaster.client.api.DomainOps; import org.apache.syncope.core.persistence.api.DomainHolder; @@ -34,6 +36,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; +import org.springframework.mail.javamail.JavaMailSender; @PropertySource("classpath:core-test.properties") @Import({ ProvisioningContext.class, SecurityContext.class, @@ -51,6 +54,11 @@ public class ProvisioningTestContext { return new TestInitializer(domainLoader, domainHolder, contentLoader, ctx); } + @Bean + public JavaMailSender javaMailSender() { + return mock(JavaMailSender.class); + } + @Bean public ImplementationLookup implementationLookup() { return new DummyImplementationLookup(); diff --git a/core/starter/src/main/resources/core.properties b/core/starter/src/main/resources/core.properties index 19b4ffaa7c..a24df7d357 100644 --- a/core/starter/src/main/resources/core.properties +++ b/core/starter/src/main/resources/core.properties @@ -73,17 +73,15 @@ provisioning.quartz.delegate=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate provisioning.quartz.sql=tables_postgres.sql provisioning.quartz.disableInstance=false -provisioning.smtp.host=none.syncope.apache.org -provisioning.smtp.port=25 -provisioning.smtp.username= -provisioning.smtp.password= -provisioning.smtp.protocol=smtp -provisioning.smtp.defaultEncoding=UTF-8 -provisioning.smtp.debug=false -# Add more properties starting with mail.smtp.* from -# https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html#properties -provisioning.smtp.javamailProperties[mail.smtp.connectiontimeout]=3000 -provisioning.smtp.javamailProperties[mail.smtp.starttls.enable]=false +######### +# Email # +######### +spring.mail.host=none.syncope.apache.org +spring.mail.port=25 +spring.mail.username= +spring.mail.password= +spring.mail.properties.mail.smtp.auth=false +spring.mail.properties.mail.smtp.starttls.enable=false ############ # Security # diff --git a/fit/core-reference/src/main/resources/core-embedded.properties b/fit/core-reference/src/main/resources/core-embedded.properties index d0d0fc45f2..e090f38c8b 100644 --- a/fit/core-reference/src/main/resources/core-embedded.properties +++ b/fit/core-reference/src/main/resources/core-embedded.properties @@ -71,5 +71,5 @@ provisioning.quartz.waitForJobsToCompleteOnShutdown=false provisioning.connIdLocation=${connid.location},\ connid://${testconnectorserver.key}@localhost:${testconnectorserver.port} -provisioning.smtp.host=localhost -provisioning.smtp.port=${testmail.smtpport} +spring.mail.host=localhost +spring.mail.port=${testmail.smtpport} diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationITCase.java index b713b9dfbc..4cff58885b 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/NotificationITCase.java @@ -58,8 +58,7 @@ public class NotificationITCase extends AbstractITCase { @Test public void read() { - NotificationTO notificationTO = NOTIFICATION_SERVICE.read( - "9e2b911c-25de-4c77-bcea-b86ed9451050"); + NotificationTO notificationTO = NOTIFICATION_SERVICE.read("9e2b911c-25de-4c77-bcea-b86ed9451050"); assertNotNull(notificationTO); } diff --git a/src/main/asciidoc/reference-guide/configuration/email.adoc b/src/main/asciidoc/reference-guide/configuration/email.adoc index 03de6a9b2e..b10cf92dbd 100644 --- a/src/main/asciidoc/reference-guide/configuration/email.adoc +++ b/src/main/asciidoc/reference-guide/configuration/email.adoc @@ -21,59 +21,38 @@ The `core.properties` file holds the configuration options to enable the effective delivery of <<notifications,notification>> e-mails: -* `provisioning.smtp.host` - the mail server host, typically an SMTP host; -* `provisioning.smtp.port` - the mail server port; -* `provisioning.smtp.username` - (optional) the username for the account at the mail host; -* `provisioning.smtp.password` - (optional) the password for the account at the mail host; -* `provisioning.smtp.protocol` - the message transport protocol: `smtp` (default) and `smtps` are supported; -* `provisioning.smtp.defaultEncoding` - the default encoding to use for MIME messages; -* `provisioning.smtp.debug` - when `true`, enable the debugging of email processing including the handshake, authentication, delivery - and disconnection; in order for this setting to be effective, it is also required to add the following elements to the -`log4j2.xml` configuration file: -[source,xml] -<asyncLogger name="org.apache.syncope.core.provisioning.java.job.notification" - additivity="false" level="DEBUG"> - <appender-ref ref="mainFile"/> - <appender-ref ref="main"/> -</asyncLogger> -<asyncLogger name="javax.mail" additivity="false" level="DEBUG"> - <appender-ref ref="mainFile"/> - <appender-ref ref="main"/> -</asyncLogger> -* `provisioning.smtp.javamailProperties[provisioning.smtp.javamailProperties[mail.smtp.starttls.enable]]` - when `true`, enable the use of the `STARTTLS` command to switch the connection to a +* `spring.mail.host` - the mail server host, typically an SMTP host; +* `spring.mail.port` - the mail server port; +* `spring.mail.username` - (optional) the username for the account at the mail host; +* `spring.mail.password` - (optional) the password for the account at the mail host; +* `spring.mail.properties.mail.smtp.auth` - when `true`, the configured `username` and `password` are sent to SMTP server; +* `spring.mail.properties.mail.smtp.starttls.enable` - when `true`, enable the use of the `STARTTLS` command to switch the connection to a TLS-protected connection before issuing any login commands; -* `provisioning.smtp.javamailProperties[provisioning.smtp.javamailProperties[mail.smtp.connectiontimeout]]` - the connection timeout value in milliseconds, to the mail host; All the https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html#properties[JavaMail(TM) properties^] -are available for usage. +are available for usage with prefix `spring.mail.properties.`. .Basic configuration, no authentication ==== .... -provisioning.smtp.host=your.local.smtp.server -provisioning.smtp.port=25 -provisioning.smtp.username= -provisioning.smtp.password= -provisioning.smtp.protocol=smtp -provisioning.smtp.defaultEncoding=UTF-8 -provisioning.smtp.debug=false -provisioning.smtp.javamailProperties[mail.smtp.connectiontimeout]=3000 -provisioning.smtp.javamailProperties[mail.smtp.starttls.enable]=false +spring.mail.host=your.local.smtp.server +spring.mail.port=25 +spring.mail.username= +spring.mail.password= +spring.mail.properties.mail.smtp.auth=false +spring.mail.properties.mail.smtp.starttls.enable=false .... ==== .STARTTLS configuration, with authentication ==== .... -provisioning.smtp.host=smtp.gmail.com -provisioning.smtp.port=587 -provisioning.smtp.username=your_usern...@gmail.com -provisioning.smtp.password=your_password -provisioning.smtp.protocol=smtp -provisioning.smtp.defaultEncoding=UTF-8 -provisioning.smtp.debug=false -provisioning.smtp.javamailProperties[mail.smtp.connectiontimeout]=3000 -provisioning.smtp.javamailProperties[mail.smtp.starttls.enable]=true +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=your_usern...@gmail.com +spring.mail.password=your_password +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true .... ====