From aba89218e6027279903ea47a67baa3e8e036c419 Mon Sep 17 00:00:00 2001 From: Domenico Sibilio Date: Mon, 1 Aug 2022 09:30:56 +0200 Subject: [PATCH] ACS-3347 Upgrade to Java 17 (#1253) * Addressing JDK-8189366, JDK-8212114, JDK-8208487, changes to default legacy Locale ISO Code conversions and changes to JVM arguments to allow illegal reflective access --- .travis.yml | 2 +- amps/ags/pom.xml | 4 + packaging/docker-alfresco/Dockerfile | 4 +- packaging/tests/tas-integration/pom.xml | 2 + packaging/tests/tas-restapi/pom.xml | 2 + .../AbstractMailActionExecuterTest.java | 1850 ++++++++--------- .../LocalTransformServiceRegistryTest.java | 47 +- .../alfresco/repo/imap/ImapMessageTest.java | 2 +- .../tools/ContentFilterLanguagesMapTest.java | 92 +- 9 files changed, 975 insertions(+), 1030 deletions(-) diff --git a/.travis.yml b/.travis.yml index 684a95daa2..87e81c2be4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ --- dist: focal language: java -jdk: openjdk11 +jdk: openjdk17 services: - docker diff --git a/amps/ags/pom.xml b/amps/ags/pom.xml index be184ae692..cadb40a99d 100644 --- a/amps/ags/pom.xml +++ b/amps/ags/pom.xml @@ -30,16 +30,20 @@ maven-surefire-plugin + --illegal-access=permit + --add-opens=java.base/java.lang=ALL-UNNAMED maven-failsafe-plugin + --illegal-access=permit + --add-opens=java.base/java.lang=ALL-UNNAMED diff --git a/packaging/docker-alfresco/Dockerfile b/packaging/docker-alfresco/Dockerfile index 6553c392a4..14a4a98db8 100644 --- a/packaging/docker-alfresco/Dockerfile +++ b/packaging/docker-alfresco/Dockerfile @@ -1,6 +1,6 @@ -# Fetch image based on Tomcat 9.0, Java 11 and Centos 7 +# Fetch image based on Tomcat 9.0, Java 17 and Rocky Linux 8 # More infos about this image: https://github.com/Alfresco/alfresco-docker-base-tomcat -FROM alfresco/alfresco-base-tomcat:tomcat9-jre11-rockylinux8-202205140719 +FROM alfresco/alfresco-base-tomcat:tomcat9-jre17-rockylinux8-202205140719 # Set default docker_context. ARG resource_path=target diff --git a/packaging/tests/tas-integration/pom.xml b/packaging/tests/tas-integration/pom.xml index d38e74199b..0c880992c8 100644 --- a/packaging/tests/tas-integration/pom.xml +++ b/packaging/tests/tas-integration/pom.xml @@ -106,8 +106,10 @@ ${suiteXmlFile} + --illegal-access=warn + --add-opens=java.base/java.lang=ALL-UNNAMED diff --git a/packaging/tests/tas-restapi/pom.xml b/packaging/tests/tas-restapi/pom.xml index 00004f4b86..e6eb4c819f 100644 --- a/packaging/tests/tas-restapi/pom.xml +++ b/packaging/tests/tas-restapi/pom.xml @@ -78,8 +78,10 @@ ${suiteXmlFile} + --illegal-access=warn + --add-opens=java.base/java.lang=ALL-UNNAMED diff --git a/repository/src/test/java/org/alfresco/repo/action/executer/AbstractMailActionExecuterTest.java b/repository/src/test/java/org/alfresco/repo/action/executer/AbstractMailActionExecuterTest.java index 7a029439fd..272048e132 100644 --- a/repository/src/test/java/org/alfresco/repo/action/executer/AbstractMailActionExecuterTest.java +++ b/repository/src/test/java/org/alfresco/repo/action/executer/AbstractMailActionExecuterTest.java @@ -1,954 +1,896 @@ -/* - * #%L - * Alfresco Repository - * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ -package org.alfresco.repo.action.executer; - -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import javax.mail.Address; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMessage.RecipientType; - -import org.alfresco.model.ContentModel; -import org.alfresco.repo.management.subsystems.ApplicationContextFactory; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; -import org.alfresco.repo.tenant.TenantService; -import org.alfresco.repo.tenant.TenantUtil; -import org.alfresco.repo.tenant.TenantUtil.TenantRunAsWork; -import org.alfresco.repo.transaction.RetryingTransactionHelper; -import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; -import org.alfresco.service.cmr.action.Action; -import org.alfresco.service.cmr.action.ActionService; -import org.alfresco.service.cmr.preference.PreferenceService; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.security.AuthorityService; -import org.alfresco.service.cmr.security.AuthorityType; -import org.alfresco.service.cmr.security.PermissionService; -import org.alfresco.service.cmr.security.PersonService; -import org.alfresco.service.namespace.QName; -import org.alfresco.service.transaction.TransactionService; -import org.alfresco.util.Pair; -import org.alfresco.util.PropertyMap; -import org.alfresco.util.test.junitrules.AlfrescoPerson; -import org.alfresco.util.test.junitrules.ApplicationContextInit; -import org.junit.Assert; -import org.junit.Test; -import org.springframework.context.ApplicationContext; - -/** - * Provides tests for the MailActionExecuter class. Most of this logic was in MailActionExecuterTest. - * Cloud code now includes extra tests and different rule config. - * Unfortunately this is messy due to the extensive use of static variables and Junit rules annotations. - * This class contains most of the test code, child classes actually setup the ClassRules and test fixtures, of - * particular importance is the static setupRuleChain() method in the child classes. The name is just a convention because - * it can't actually be enforced. The setupRuleChain() actually creates the users, as well as ordering the rules. - * You will see the AlfrescoPerson variables below are initialized as null, the assumption is that the child classes will - * create these users before they are needed (in the setupRuleChain() method), again this can't be enforced :(. - * - */ -public abstract class AbstractMailActionExecuterTest -{ - - // Rule to initialise the default Alfresco spring configuration - public static ApplicationContextInit APP_CONTEXT_INIT = new ApplicationContextInit(); - - // Rules to create test users, these are actually created in the setupRuleChain() method of child classes. - public static AlfrescoPerson BRITISH_USER = null; - public static AlfrescoPerson FRENCH_USER = null; - public static AlfrescoPerson AUSTRALIAN_USER = null; - public static AlfrescoPerson EXTERNAL_USER = null; - - private static String ALFRESCO_EE_USER = "plainUser"; - - protected static TransactionService TRANSACTION_SERVICE; - protected static ActionService ACTION_SERVICE; - protected static MailActionExecuter ACTION_EXECUTER; - protected static PreferenceService PREFERENCE_SERVICE; - protected static PersonService PERSON_SERVICE; - protected static AuthorityService AUTHORITY_SERVICE; - protected static NodeService NODE_SERVICE; - protected static PermissionService PERMISSION_SERVICE; - - protected static boolean WAS_IN_TEST_MODE; - - public static void setupTests(ApplicationContext appCtx) - { - TRANSACTION_SERVICE = appCtx.getBean("TransactionService", TransactionService.class); - ACTION_SERVICE = appCtx.getBean("ActionService", ActionService.class); - ACTION_EXECUTER = appCtx.getBean("OutboundSMTP", ApplicationContextFactory.class).getApplicationContext().getBean("mail", MailActionExecuter.class); - PREFERENCE_SERVICE = appCtx.getBean("PreferenceService", PreferenceService.class); - PERSON_SERVICE = appCtx.getBean("PersonService", PersonService.class); - NODE_SERVICE = appCtx.getBean("NodeService", NodeService.class); - AUTHORITY_SERVICE = appCtx.getBean("AuthorityService", AuthorityService.class); - PERMISSION_SERVICE = appCtx.getBean("PermissionService", PermissionService.class); - - WAS_IN_TEST_MODE = ACTION_EXECUTER.isTestMode(); - ACTION_EXECUTER.setTestMode(true); - - AuthenticationUtil.setRunAsUserSystem(); - - Map properties = new HashMap(1); - properties.put(ContentModel.PROP_USERNAME, ALFRESCO_EE_USER); - properties.put(ContentModel.PROP_EMAIL, "testemail@testdomain.com"); - PERSON_SERVICE.createPerson(properties, null); - - // All these test users are in the same tenant - either they're enterprise where there's only one, - // or they're cloud, where they have the same email domain - final String tenantId = getUsersHomeTenant(FRENCH_USER.getUsername()); - TenantUtil.runAsSystemTenant(new TenantRunAsWork() - { - @Override - public Object doWork() throws Exception - { - final Map preferences = new HashMap(); - - preferences.put("locale", "fr"); - PREFERENCE_SERVICE.setPreferences(FRENCH_USER.getUsername(), preferences); - - preferences.clear(); - preferences.put("locale", "en_GB"); - PREFERENCE_SERVICE.setPreferences(BRITISH_USER.getUsername(), preferences); - - preferences.clear(); - preferences.put("locale", "en_AU"); - PREFERENCE_SERVICE.setPreferences(AUSTRALIAN_USER.getUsername(), preferences); - - return null; - } - }, tenantId); - } - - private static String getUsersHomeTenant(String userName) - { - boolean thisIsCloud = false; - try - { - thisIsCloud = (Class.forName("org.alfresco.module.org_alfresco_module_cloud.registration.RegistrationService") != null); - } - catch (ClassNotFoundException ignoreIfThrown) - { - // Intentionally empty - } - - String result = TenantService.DEFAULT_DOMAIN; - - // Even if we get email address-style user names in an enterprise system, those are not to be given home tenants. - if (thisIsCloud) - { - String[] elems = userName.split("@"); - result = elems[1]; - } - - return result; - - } - - public static void tearDownTests() - { - ACTION_EXECUTER.setTestMode(WAS_IN_TEST_MODE); - PERSON_SERVICE.deletePerson(ALFRESCO_EE_USER); - } - - @Test - public void testUnknownRecipientUnknownSender() throws IOException, MessagingException - { - // PARAM_TO variant - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.bodyelse@example.com"); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); - - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, (Serializable) getModel()); - - ACTION_SERVICE.executeAction(mailAction, null); - - MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); - Assert.assertNotNull(message); - Assert.assertEquals("Hello Jan 1, 1970", (String) message.getContent()); - } - - @Test - public void testUnknownRecipientUnknownSender_ToMany() throws IOException, MessagingException - { - // PARAM_TO_MANY variant - this code path currently has separate validation FIXME fix this. - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, "some.bodyelse@example.com"); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); - - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, (Serializable) getModel()); - - ACTION_SERVICE.executeAction(mailAction, null); - - MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); - Assert.assertNotNull(message); - Assert.assertEquals("Hello Jan 1, 1970", (String) message.getContent()); - } - - private Serializable getModel() - { - Map model = new HashMap(); - - model.put("epoch", new Date(0)); - return (Serializable) model; - } - - @Test - public void testFrenchRecipient() throws IOException, MessagingException - { - String from = "some.body@example.com"; - Serializable recipients = (Serializable) Arrays.asList(FRENCH_USER.getUsername()); - String subject = ""; - String template = "alfresco/templates/mail/test.txt.ftl"; - - MimeMessage message = sendMessage(from, recipients, subject, template); - - Assert.assertNotNull(message); - Assert.assertEquals("Bonjour 1 janv. 1970", (String) message.getContent()); - } - - @Test - public void testHTMLDetection() throws IOException, MessagingException - { - String from = "some.body@example.com"; - Serializable recipients = (Serializable) Arrays.asList(FRENCH_USER.getUsername()); - String subject = ""; - - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, recipients); - - // First with plain text - String text = "This is plain text\nOnly\nBut it mentions HTML and "; - - MimeMessage message = sendMessage(from, subject, null, text, mailAction); - - Assert.assertNotNull(message); - Assert.assertEquals(text, (String) message.getContent()); - Assert.assertEquals("text/plain", // Ignore charset - message.getDataHandler().getContentType().substring(0, 10)); - - // HTML opening tag - text = "HTML emails are great"; - message = sendMessage(from, subject, null, text, mailAction); - - Assert.assertNotNull(message); - Assert.assertEquals(text, (String) message.getContent()); - Assert.assertEquals("text/html", // Ignore charset - message.getDataHandler().getContentType().substring(0, 9)); - - // HTML Doctype - text = "\n\nMore complex HTML"; - message = sendMessage(from, subject, null, text, mailAction); - - Assert.assertNotNull(message); - Assert.assertEquals(text, (String) message.getContent()); - Assert.assertEquals("text/html", // Ignore charset - message.getDataHandler().getContentType().substring(0, 9)); - } - - protected MimeMessage sendMessage(String from, Serializable recipients, String subject, String template) - { - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, recipients); - - return sendMessage(from, subject, template, mailAction); - } - - protected MimeMessage sendMessage(String from, String subject, String template, final Action mailAction) - { - return sendMessage(from, subject, template, null, mailAction); - } - protected MimeMessage sendMessage(String from, String subject, String template, String bodyText, final Action mailAction) - { - if (from != null) - { - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, from); - } - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, subject); - if (template != null) - { - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, template); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); - } - else - { - mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, bodyText); - } - - RetryingTransactionHelper txHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class); - - return txHelper.doInTransaction(new RetryingTransactionCallback() - { - @Override - public MimeMessage execute() throws Throwable - { - ACTION_SERVICE.executeAction(mailAction, null); - - return ACTION_EXECUTER.retrieveLastTestMessage(); - } - }, true); - } - - protected MimeMessage sendMessage(String from, String to, String subject, String template) - { - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO, to); - return sendMessage(from, subject, template, mailAction); - } - - /** - * Test for ALF-19231 - */ - @Test - public void testSendMailActionForUserNameAsRecipient() throws IOException, MessagingException - { - String from = BRITISH_USER.getUsername(); - Serializable recipients = (Serializable) Arrays.asList(ALFRESCO_EE_USER); - String subject = "Testing"; - String template = "alfresco/templates/mail/test.txt.ftl"; - - MimeMessage message = sendMessage(from, recipients, subject, template); - - Assert.assertNotNull(message); - Assert.assertEquals("Hello 1 Jan 1970", (String) message.getContent()); - } - - @Test - public void testUnknowRecipientAustralianSender() throws IOException, MessagingException - { - String from = AUSTRALIAN_USER.getUsername(); - String to = "some.body@example.com"; - String subject = "Testing"; - String template = "alfresco/templates/mail/test.txt.ftl"; - - MimeMessage message = sendMessage(from, to, subject, template); - - Assert.assertNotNull(message); - Assert.assertEquals("G'Day 1 Jan. 1970", (String) message.getContent()); - } - - @Test - public void testSendingTestMessageWithNoCurrentUser() - { - try - { - // run with no current user - AuthenticationUtil.clearCurrentSecurityContext(); - - final Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.body@eaxmple.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "This is a test message."); - - TRANSACTION_SERVICE.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() - { - @Override - public Void execute() throws Throwable - { - ACTION_EXECUTER.executeImpl(mailAction, null); - return null; - } - }); - } - finally - { - // restore system user as current user - AuthenticationUtil.setRunAsUserSystem(); - } - } - - @Test - public void testPrepareEmailForDisabledUsers() throws MessagingException - { - String groupName = null; - final String USER1 = "test_user1"; - final String USER2 = "test_user2"; - try - { - createUser(USER1, null); - NodeRef userNode = createUser(USER2, null); - groupName = AUTHORITY_SERVICE.createAuthority(AuthorityType.GROUP, "testgroup1"); - AUTHORITY_SERVICE.addAuthority(groupName, USER1); - AUTHORITY_SERVICE.addAuthority(groupName, USER2); - NODE_SERVICE.addAspect(userNode, ContentModel.ASPECT_PERSON_DISABLED, null); - final Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, groupName); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "Testing"); - - RetryingTransactionHelper txHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class); - - MimeMessage mm = txHelper.doInTransaction(new RetryingTransactionCallback() - { - @Override - public MimeMessage execute() throws Throwable - { - return ACTION_EXECUTER.prepareEmail(mailAction, null, null, null).getMimeMessage(); - } - }, true); - - Address[] addresses = mm.getRecipients(Message.RecipientType.TO); - Assert.assertEquals(1, addresses.length); - Assert.assertEquals(USER1 + "@email.com", addresses[0].toString()); - } - finally - { - if (groupName != null) - { - AUTHORITY_SERVICE.deleteAuthority(groupName, true); - } - PERSON_SERVICE.deletePerson(USER1); - PERSON_SERVICE.deletePerson(USER2); - } - } - - @Test - public void testPrepareEmailSubjectParams() - { - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.bodyelse@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Test Subject Params"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); - Pair recipient = new Pair("test", Locale.ENGLISH); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT_PARAMS, new Object[] {"Test", "Subject", "Params", "Object", "Array"}); - Assert.assertNotNull("We should support Object[] value for PARAM_SUBJECT_PARAMS", ACTION_EXECUTER.prepareEmail(mailAction, null, recipient, null)); - - ArrayList params = new ArrayList(); - params.add("Test"); - params.add("Subject"); - params.add("Params"); - params.add("ArrayList"); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT_PARAMS, params); - Assert.assertNotNull("We should support List value for PARAM_SUBJECT_PARAMS", ACTION_EXECUTER.prepareEmail(mailAction, null, recipient, null)); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT_PARAMS, "Test Subject Params Single String"); - Assert.assertNotNull("We should support String value for PARAM_SUBJECT_PARAMS", ACTION_EXECUTER.prepareEmail(mailAction, null, recipient, null)); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT_PARAMS, null); - Assert.assertNotNull("We should support null value for PARAM_SUBJECT_PARAMS", ACTION_EXECUTER.prepareEmail(mailAction, null, recipient, null)); - } - - /** - * Creates a test user with the specified username and optionally custom email. - * - * @param userName String - * @param email Optional, if not specified assigned to userName + "@email.com" - * @return NodeRef - */ - private NodeRef createUser(String userName, String email) - { - PropertyMap personProps = new PropertyMap(); - personProps.put(ContentModel.PROP_USERNAME, userName); - personProps.put(ContentModel.PROP_FIRSTNAME, userName); - personProps.put(ContentModel.PROP_LASTNAME, userName); - if (email != null) - { - personProps.put(ContentModel.PROP_EMAIL, email); - } - else - { - personProps.put(ContentModel.PROP_EMAIL, userName + "@email.com"); - } - - return PERSON_SERVICE.createPerson(personProps); - } - - /** - * Test for MNT-10874 - * @throws Exception - */ - @Test - public void testUserWithNonExistingTenant() throws Exception - { - final String USER_WITH_NON_EXISTING_TENANT = "test_user_non_tenant@non_existing_tenant.com"; - - try - { - createUser(USER_WITH_NON_EXISTING_TENANT, USER_WITH_NON_EXISTING_TENANT); - - final Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO, USER_WITH_NON_EXISTING_TENANT); - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "This is a test message."); - - // run as non admin and non system - AuthenticationUtil.setFullyAuthenticatedUser(BRITISH_USER.getUsername()); - TRANSACTION_SERVICE.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() - { - @Override - public Void execute() throws Throwable - { - ACTION_EXECUTER.executeImpl(mailAction, null); - return null; - } - }); - } - finally - { - // restore system user as current user - AuthenticationUtil.setRunAsUserSystem(); - // tidy up - PERSON_SERVICE.deletePerson(USER_WITH_NON_EXISTING_TENANT); - AuthenticationUtil.clearCurrentSecurityContext(); - } - } - - /** - * Test for MNT-11488 - * @throws IOException - * @throws MessagingException - */ - @Test - public void testSendingToMultipleUsers() throws IOException, MessagingException - { - final String USER_1 = "recipient1"; - final String USER_2 = "recipient2"; - final String[] recipientsArray = { USER_1 + "@email.com", USER_2 + "@email.com" }; - final List recipientsResult = new ArrayList(Arrays.asList(recipientsArray)) ; - - try - { - createUser(USER_1, null); - createUser(USER_2, null); - ArrayList recipients = new ArrayList(2); - recipients.add(USER_1); - recipients.add(USER_2); - - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "sender@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, recipients); - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, (Serializable) getModel()); - - ACTION_EXECUTER.resetTestSentCount(); - - ACTION_SERVICE.executeAction(mailAction, null); - - MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); - Assert.assertNotNull(message); - Assert.assertEquals("One email should be sent", 1, ACTION_EXECUTER.getTestSentCount()); - Assert.assertEquals("All recipients should receive single message", 2, message.getAllRecipients().length); - - Assert.assertTrue("Both users should receive message", recipientsResult.contains(((InternetAddress) message.getAllRecipients()[0]).getAddress())); - Assert.assertTrue("Both users should receive message", recipientsResult.contains(((InternetAddress) message.getAllRecipients()[1]).getAddress())); - } - finally - { - // tidy up - PERSON_SERVICE.deletePerson(USER_1); - PERSON_SERVICE.deletePerson(USER_2); - } - } - - /** - * Test for CC / BCC - * @throws Exception - */ - @Test - public void testSendingToCarbonCopy() throws IOException, MessagingException - { - // PARAM_TO variant - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.bodyelse@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_CC, "some.carbon@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_BCC, "some.blindcarbon@example.com"); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing CARBON COPY"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); - - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, (Serializable) getModel()); - - ACTION_SERVICE.executeAction(mailAction, null); - - MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); - Assert.assertNotNull(message); - Address[] all = message.getAllRecipients(); - Address[] ccs = message.getRecipients(RecipientType.CC); - Address[] bccs = message.getRecipients(RecipientType.BCC); - Assert.assertEquals(3, all.length); - Assert.assertEquals(1, ccs.length); - Assert.assertEquals(1, bccs.length); - Assert.assertTrue(ccs[0].toString().contains("some.carbon")); - Assert.assertTrue(bccs[0].toString().contains("some.blindcarbon")); - } - - /** - * Test for MNT-11079 - */ - @Test - public void testSendingToUserWithMailAlikeName() throws IOException, MessagingException - { - final String USER_1 = "user1@namelookslikeemail"; - final String USER_1_EMAIL = "user1@trueemail.com"; - - try - { - createUser(USER_1, USER_1_EMAIL); - - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, USER_1); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); - - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, (Serializable) getModel()); - - ACTION_SERVICE.executeAction(mailAction, null); - - MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); - Assert.assertNotNull(message); - Assert.assertEquals("Hello Jan 1, 1970", (String) message.getContent()); - Assert.assertEquals(1, message.getAllRecipients().length); - javax.mail.internet.InternetAddress address = (InternetAddress) message.getAllRecipients()[0]; - Assert.assertEquals(USER_1_EMAIL, address.getAddress()); - } - finally - { - // tidy up - PERSON_SERVICE.deletePerson(USER_1); - } - } - - /** - * Test for MNT-12464 - * @throws Exception - */ - @Test - public void testMultipleIdenticalEmailsToUser() throws Exception - { - final String USER_1 = "user12464_1"; - final String USER_2 = "user12464_2"; - final String USER_3 = "user12464_3"; - final String USER_6 = "user12464_6"; - - final String USER_4_USERNAME = "user12464_4@mnt12464mail.com"; - final String USER_5_USERNAME = "user12464_5@mnt12464mail.com"; - - String[] users = new String[] { USER_1, USER_2, USER_3, USER_4_USERNAME, USER_5_USERNAME }; - - final String GROUP_1_SHORT_NAME = "mnt12464group1"; - final String GROUP_1 = "GROUP_" + GROUP_1_SHORT_NAME; - final String GROUP_2_SHORT_NAME = "mnt12464group2"; - final String GROUP_2 = "GROUP_" + GROUP_2_SHORT_NAME; - - try - { - createUser(USER_1, null); - createUser(USER_2, null); - createUser(USER_3, null); - AUTHORITY_SERVICE.createAuthority(AuthorityType.GROUP, GROUP_1_SHORT_NAME); - AUTHORITY_SERVICE.createAuthority(AuthorityType.GROUP, GROUP_2_SHORT_NAME); - AUTHORITY_SERVICE.addAuthority(GROUP_1, USER_1); - AUTHORITY_SERVICE.addAuthority(GROUP_1, USER_2); - AUTHORITY_SERVICE.addAuthority(GROUP_2, USER_1); - AUTHORITY_SERVICE.addAuthority(GROUP_2, USER_2); - AUTHORITY_SERVICE.addAuthority(GROUP_2, USER_3); - - // these persons should be without emails - PropertyMap personProps = new PropertyMap(); - personProps.put(ContentModel.PROP_USERNAME, USER_4_USERNAME); - personProps.put(ContentModel.PROP_FIRSTNAME, USER_4_USERNAME); - personProps.put(ContentModel.PROP_LASTNAME, USER_4_USERNAME); - PERSON_SERVICE.createPerson(personProps); - AUTHORITY_SERVICE.addAuthority(GROUP_1, USER_4_USERNAME); - AUTHORITY_SERVICE.addAuthority(GROUP_2, USER_4_USERNAME); - - personProps = new PropertyMap(); - personProps.put(ContentModel.PROP_USERNAME, USER_5_USERNAME); - personProps.put(ContentModel.PROP_FIRSTNAME, USER_5_USERNAME); - personProps.put(ContentModel.PROP_LASTNAME, USER_5_USERNAME); - PERSON_SERVICE.createPerson(personProps); - - Action mailAction1 = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction1.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - ArrayList toMany1 = new ArrayList(); - toMany1.add(USER_1); - toMany1.add(GROUP_1); - toMany1.add(USER_2); - toMany1.add(GROUP_2); - toMany1.add(USER_3); - toMany1.add(USER_4_USERNAME); - toMany1.add(USER_5_USERNAME); - mailAction1.setParameterValue(MailActionExecuter.PARAM_TO_MANY, toMany1); - mailAction1.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing MNT-12464"); - mailAction1.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); - mailAction1.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, (Serializable) getModel()); - - ACTION_EXECUTER.resetTestSentCount(); - ACTION_SERVICE.executeAction(mailAction1, null); - - Assert.assertEquals("Must be received one letter on each recipient", users.length, ACTION_EXECUTER.getTestSentCount()); - - // testing for GROUP_EVERYONE - - ACTION_EXECUTER.resetTestSentCount(); - everyoneSending(); - int before = ACTION_EXECUTER.getTestSentCount(); - // create one additional user - NodeRef user6 = createUser(USER_6, null); - PERMISSION_SERVICE.setInheritParentPermissions(user6, false); - PERMISSION_SERVICE.deletePermissions(user6); - - // USER_6 not exist for USER_1, but he will be added to recipients - int after = AuthenticationUtil.runAs(new RunAsWork() - { - @Override - public Integer doWork() throws Exception - { - ACTION_EXECUTER.resetTestSentCount(); - everyoneSending(); - return ACTION_EXECUTER.getTestSentCount(); - } - }, USER_1); - - Assert.assertEquals("One additional user was created, quantity of recipients GROUP_EVERYONE must be +1 user", 1, after - before); - } - finally - { - PERSON_SERVICE.deletePerson(USER_1); - PERSON_SERVICE.deletePerson(USER_2); - PERSON_SERVICE.deletePerson(USER_3); - PERSON_SERVICE.deletePerson(USER_4_USERNAME); - PERSON_SERVICE.deletePerson(USER_5_USERNAME); - PERSON_SERVICE.deletePerson(USER_6); - AUTHORITY_SERVICE.deleteAuthority(GROUP_1); - AUTHORITY_SERVICE.deleteAuthority(GROUP_2); - } - } - - private void everyoneSending() - { - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - ArrayList toMany = new ArrayList(); - toMany.add(PERMISSION_SERVICE.getAllAuthorities()); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, toMany); - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing MNT-12464"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, (Serializable) getModel()); - - ACTION_EXECUTER.resetTestSentCount(); - - ACTION_SERVICE.executeAction(mailAction, null); - } - - /** - * ACE-2564 - */ - @Test - public void testSendEmailByExternalUser() throws IOException, MessagingException - { - final Serializable recipients = (Serializable) Arrays.asList(BRITISH_USER.getUsername()); - final String subject = ""; - final String template = "alfresco/templates/mail/test.txt.ftl"; - AuthenticationUtil.pushAuthentication(); - AuthenticationUtil.setFullyAuthenticatedUser(EXTERNAL_USER.getUsername()); - MimeMessage message = null; - - - try - { - - // these persons should be without emails - // testing for GROUP_EVERYONE - - final String tenantId = getUsersHomeTenant(BRITISH_USER.getUsername()); - - // USER_6 not exist for USER_1, but he will be added to recipients - message = TenantUtil.runAsTenant(new TenantRunAsWork() - { - @Override - public MimeMessage doWork() throws Exception - { - return sendMessage(null, recipients, subject, template); - } - }, tenantId); - - Assert.assertNotNull(message); - Assert.assertEquals("Hello 1 Jan 1970", (String) message.getContent()); - } - finally - { - AuthenticationUtil.popAuthentication(); - } - } - - /** - * Test for MNT-17970 - * @throws IOException - * @throws MessagingException - */ - @Test - public void testGetToUsersWhenSendingToGroup() throws IOException, MessagingException - { - String groupName = null; - final String USER1 = "test_user1"; - final String USER2 = "test_user2"; - try - { - // Create users and add them to a group - createUser(USER1, null); - createUser(USER2, null); - groupName = AUTHORITY_SERVICE.createAuthority(AuthorityType.GROUP, "testgroup1"); - AUTHORITY_SERVICE.addAuthority(groupName, USER1); - AUTHORITY_SERVICE.addAuthority(groupName, USER2); - - // Create mail - final Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, groupName); - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "Testing"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/testSentTo.txt.ftl"); - - RetryingTransactionHelper txHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class); - - // Send mail - MimeMessage message = txHelper.doInTransaction(new RetryingTransactionCallback() - { - @Override - public MimeMessage execute() throws Throwable - { - ACTION_EXECUTER.executeImpl(mailAction, null); - return ACTION_EXECUTER.retrieveLastTestMessage(); - } - }, true); - - // Check that both users are displayed in message body - String recipients = USER1 + "@email.com" + "," + USER2 + "@email.com"; - Assert.assertNotNull(message); - Assert.assertEquals("This email was sent to " + recipients, (String) message.getContent()); - } - finally - { - if (groupName != null) - { - AUTHORITY_SERVICE.deleteAuthority(groupName, true); - } - PERSON_SERVICE.deletePerson(USER1); - PERSON_SERVICE.deletePerson(USER2); - } - } - - /** - * ALF-21948 - */ - @Test - public void testSendingToArrayOfCarbonCopyAndBlindCarbonCopyUsers() throws MessagingException - { - Map params = new HashMap(); - String[] ccArray = { "cc_user1@example.com", "cc_user2@example.com" }; - String[] bccArray = { "bcc_user3@example.com", "bcc_user4@example.com", "bcc_user5@example.com" }; - params.put(MailActionExecuter.PARAM_FROM, "sender@email.com"); - params.put(MailActionExecuter.PARAM_TO, "test@email.com"); - params.put(MailActionExecuter.PARAM_CC, ccArray); - params.put(MailActionExecuter.PARAM_BCC, bccArray); - - params.put(MailActionExecuter.PARAM_TEXT, "Mail body here"); - params.put(MailActionExecuter.PARAM_SUBJECT, "Subject text"); - - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME, params); - ACTION_EXECUTER.resetTestSentCount(); - - ACTION_SERVICE.executeAction(mailAction, null); - MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); - Assert.assertNotNull(message); - - Address[] all = message.getAllRecipients(); - Address[] ccs = message.getRecipients(RecipientType.CC); - Address[] bccs = message.getRecipients(RecipientType.BCC); - Assert.assertEquals(6, all.length); - Assert.assertEquals(2, ccs.length); - Assert.assertEquals(3, bccs.length); - Assert.assertTrue(ccs[0].toString().contains("cc_user1") && ccs[1].toString().contains("cc_user2")); - Assert.assertTrue(bccs[0].toString().contains("bcc_user3") && bccs[1].toString().contains("bcc_user4") - && bccs[2].toString().contains("bcc_user5")); - } - - /** - * ALF-21948 - */ - @Test - public void testSendingToListOfCarbonCopyAndBlindCarbonCopyUsers() throws MessagingException - { - List ccList = new ArrayList(); - ccList.add("cc_user1@example.com"); - ccList.add("cc_user2@example.com"); - - List bccList = new ArrayList(); - bccList.add("bcc_user3@example.com"); - bccList.add("bcc_user4@example.com"); - bccList.add("bcc_user5@example.com"); - - Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); - mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.bodyelse@example.com"); - mailAction.setParameterValue(MailActionExecuter.PARAM_CC, (Serializable) ccList); - mailAction.setParameterValue(MailActionExecuter.PARAM_BCC, (Serializable) bccList); - - mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing (BLIND) CARBON COPY"); - mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "mail body here"); - - ACTION_EXECUTER.resetTestSentCount(); - ACTION_SERVICE.executeAction(mailAction, null); - MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); - Assert.assertNotNull(message); - - Address[] all = message.getAllRecipients(); - Address[] ccs = message.getRecipients(RecipientType.CC); - Address[] bccs = message.getRecipients(RecipientType.BCC); - Assert.assertEquals(6, all.length); - Assert.assertEquals(2, ccs.length); - Assert.assertEquals(3, bccs.length); - Assert.assertTrue(ccs[0].toString().contains("cc_user1") && ccs[1].toString().contains("cc_user2")); - Assert.assertTrue(bccs[0].toString().contains("bcc_user3") && bccs[1].toString().contains("bcc_user4") - && bccs[2].toString().contains("bcc_user5")); - } - -} +/* + * #%L + * Alfresco Repository + * %% + * Copyright (C) 2005 - 2022 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.repo.action.executer; + +import javax.mail.Address; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMessage.RecipientType; +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.management.subsystems.ApplicationContextFactory; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.tenant.TenantService; +import org.alfresco.repo.tenant.TenantUtil; +import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.preference.PreferenceService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.security.AuthorityService; +import org.alfresco.service.cmr.security.AuthorityType; +import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.service.namespace.QName; +import org.alfresco.service.transaction.TransactionService; +import org.alfresco.util.Pair; +import org.alfresco.util.PropertyMap; +import org.alfresco.util.test.junitrules.AlfrescoPerson; +import org.alfresco.util.test.junitrules.ApplicationContextInit; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.context.ApplicationContext; + +/** + * Provides tests for the MailActionExecuter class. Most of this logic was in MailActionExecuterTest. + * Cloud code now includes extra tests and different rule config. + * Unfortunately this is messy due to the extensive use of static variables and Junit rules annotations. + * This class contains most of the test code, child classes actually set up the ClassRules and test fixtures, of + * particular importance is the static setupRuleChain() method in the child classes. The name is just a convention because + * it can't actually be enforced. The setupRuleChain() actually creates the users, as well as ordering the rules. + * You will see the AlfrescoPerson variables below are initialized as null, the assumption is that the child classes will + * create these users before they are needed (in the setupRuleChain() method), again this can't be enforced :(. + * + */ +public abstract class AbstractMailActionExecuterTest +{ + + // Rule to initialise the default Alfresco spring configuration + public static ApplicationContextInit APP_CONTEXT_INIT = new ApplicationContextInit(); + + // Rules to create test users, these are actually created in the setupRuleChain() method of child classes. + public static AlfrescoPerson BRITISH_USER = null; + public static AlfrescoPerson FRENCH_USER = null; + public static AlfrescoPerson AUSTRALIAN_USER = null; + public static AlfrescoPerson EXTERNAL_USER = null; + + private static final String ALFRESCO_EE_USER = "plainUser"; + + protected static TransactionService TRANSACTION_SERVICE; + protected static ActionService ACTION_SERVICE; + protected static MailActionExecuter ACTION_EXECUTER; + protected static PreferenceService PREFERENCE_SERVICE; + protected static PersonService PERSON_SERVICE; + protected static AuthorityService AUTHORITY_SERVICE; + protected static NodeService NODE_SERVICE; + protected static PermissionService PERMISSION_SERVICE; + + protected static boolean WAS_IN_TEST_MODE; + + public static void setupTests(ApplicationContext appCtx) + { + TRANSACTION_SERVICE = appCtx.getBean("TransactionService", TransactionService.class); + ACTION_SERVICE = appCtx.getBean("ActionService", ActionService.class); + ACTION_EXECUTER = appCtx.getBean("OutboundSMTP", ApplicationContextFactory.class).getApplicationContext().getBean("mail", MailActionExecuter.class); + PREFERENCE_SERVICE = appCtx.getBean("PreferenceService", PreferenceService.class); + PERSON_SERVICE = appCtx.getBean("PersonService", PersonService.class); + NODE_SERVICE = appCtx.getBean("NodeService", NodeService.class); + AUTHORITY_SERVICE = appCtx.getBean("AuthorityService", AuthorityService.class); + PERMISSION_SERVICE = appCtx.getBean("PermissionService", PermissionService.class); + + WAS_IN_TEST_MODE = ACTION_EXECUTER.isTestMode(); + ACTION_EXECUTER.setTestMode(true); + + AuthenticationUtil.setRunAsUserSystem(); + + Map properties = new HashMap<>(1); + properties.put(ContentModel.PROP_USERNAME, ALFRESCO_EE_USER); + properties.put(ContentModel.PROP_EMAIL, "testemail@testdomain.com"); + PERSON_SERVICE.createPerson(properties, null); + + // All these test users are in the same tenant - either they're enterprise where there's only one, + // or they're cloud, where they have the same email domain + final String tenantId = getUsersHomeTenant(FRENCH_USER.getUsername()); + TenantUtil.runAsSystemTenant(() -> { + final Map preferences = new HashMap<>(); + + preferences.put("locale", "fr"); + PREFERENCE_SERVICE.setPreferences(FRENCH_USER.getUsername(), preferences); + + preferences.clear(); + preferences.put("locale", "en_GB"); + PREFERENCE_SERVICE.setPreferences(BRITISH_USER.getUsername(), preferences); + + preferences.clear(); + preferences.put("locale", "en_AU"); + PREFERENCE_SERVICE.setPreferences(AUSTRALIAN_USER.getUsername(), preferences); + + return null; + }, tenantId); + } + + private static String getUsersHomeTenant(String userName) + { + boolean thisIsCloud = false; + try + { + thisIsCloud = (Class.forName("org.alfresco.module.org_alfresco_module_cloud.registration.RegistrationService") != null); + } + catch (ClassNotFoundException ignoreIfThrown) + { + // Intentionally empty + } + + String result = TenantService.DEFAULT_DOMAIN; + + // Even if we get email address-style usernames in an enterprise system, those are not to be given home tenants. + if (thisIsCloud) + { + String[] elems = userName.split("@"); + result = elems[1]; + } + + return result; + + } + + public static void tearDownTests() + { + ACTION_EXECUTER.setTestMode(WAS_IN_TEST_MODE); + PERSON_SERVICE.deletePerson(ALFRESCO_EE_USER); + } + + @Test + public void testUnknownRecipientUnknownSender() throws IOException, MessagingException + { + // PARAM_TO variant + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.bodyelse@example.com"); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); + + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + + ACTION_SERVICE.executeAction(mailAction, null); + + MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); + Assert.assertNotNull(message); + Assert.assertEquals("Hello Jan 1, 1970", message.getContent()); + } + + @Test + public void testUnknownRecipientUnknownSender_ToMany() throws IOException, MessagingException + { + // PARAM_TO_MANY variant - this code path currently has separate validation FIXME fix this. + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, "some.bodyelse@example.com"); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); + + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + + ACTION_SERVICE.executeAction(mailAction, null); + + MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); + Assert.assertNotNull(message); + Assert.assertEquals("Hello Jan 1, 1970", message.getContent()); + } + + private Serializable getModel() + { + Map model = new HashMap<>(); + + model.put("epoch", new Date(0)); + return (Serializable) model; + } + + @Test + public void testFrenchRecipient() throws IOException, MessagingException + { + String from = "some.body@example.com"; + Serializable recipients = (Serializable) Arrays.asList(FRENCH_USER.getUsername()); + String subject = ""; + String template = "alfresco/templates/mail/test.txt.ftl"; + + MimeMessage message = sendMessage(from, recipients, subject, template); + + Assert.assertNotNull(message); + Assert.assertEquals("Bonjour 1 janv. 1970", message.getContent()); + } + + @Test + public void testHTMLDetection() throws IOException, MessagingException + { + String from = "some.body@example.com"; + Serializable recipients = (Serializable) Arrays.asList(FRENCH_USER.getUsername()); + String subject = ""; + + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, recipients); + + // First with plain text + String text = "This is plain text\nOnly\nBut it mentions HTML and "; + + MimeMessage message = sendMessage(from, subject, null, text, mailAction); + + Assert.assertNotNull(message); + Assert.assertEquals(text, message.getContent()); + Assert.assertEquals("text/plain", // Ignore charset + message.getDataHandler().getContentType().substring(0, 10)); + + // HTML opening tag + text = "HTML emails are great"; + message = sendMessage(from, subject, null, text, mailAction); + + Assert.assertNotNull(message); + Assert.assertEquals(text, message.getContent()); + Assert.assertEquals("text/html", // Ignore charset + message.getDataHandler().getContentType().substring(0, 9)); + + // HTML Doctype + text = "\n\nMore complex HTML"; + message = sendMessage(from, subject, null, text, mailAction); + + Assert.assertNotNull(message); + Assert.assertEquals(text, message.getContent()); + Assert.assertEquals("text/html", // Ignore charset + message.getDataHandler().getContentType().substring(0, 9)); + } + + protected MimeMessage sendMessage(String from, Serializable recipients, String subject, String template) + { + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, recipients); + + return sendMessage(from, subject, template, mailAction); + } + + protected MimeMessage sendMessage(String from, String subject, String template, final Action mailAction) + { + return sendMessage(from, subject, template, null, mailAction); + } + protected MimeMessage sendMessage(String from, String subject, String template, String bodyText, final Action mailAction) + { + if (from != null) + { + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, from); + } + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, subject); + if (template != null) + { + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, template); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + } + else + { + mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, bodyText); + } + + RetryingTransactionHelper txHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class); + + return txHelper.doInTransaction(() -> { + ACTION_SERVICE.executeAction(mailAction, null); + return ACTION_EXECUTER.retrieveLastTestMessage(); + }, true); + } + + protected MimeMessage sendMessage(String from, String to, String subject, String template) + { + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO, to); + return sendMessage(from, subject, template, mailAction); + } + + /** + * Test for ALF-19231 + */ + @Test + public void testSendMailActionForUserNameAsRecipient() throws IOException, MessagingException + { + String from = BRITISH_USER.getUsername(); + Serializable recipients = (Serializable) Arrays.asList(ALFRESCO_EE_USER); + String subject = "Testing"; + String template = "alfresco/templates/mail/test.txt.ftl"; + + MimeMessage message = sendMessage(from, recipients, subject, template); + + Assert.assertNotNull(message); + Assert.assertEquals("Hello 1 Jan 1970", message.getContent()); + } + + @Test + public void testUnknownRecipientAustralianSender() throws IOException, MessagingException + { + String from = AUSTRALIAN_USER.getUsername(); + String to = "some.body@example.com"; + String subject = "Testing"; + String template = "alfresco/templates/mail/test.txt.ftl"; + + MimeMessage message = sendMessage(from, to, subject, template); + + Assert.assertNotNull(message); + Assert.assertEquals("G'Day 1 Jan 1970", message.getContent()); + } + + @Test + public void testSendingTestMessageWithNoCurrentUser() + { + try + { + // run with no current user + AuthenticationUtil.clearCurrentSecurityContext(); + + final Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.body@eaxmple.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "This is a test message."); + + TRANSACTION_SERVICE.getRetryingTransactionHelper().doInTransaction( + (RetryingTransactionCallback) () -> { + ACTION_EXECUTER.executeImpl(mailAction, null); + return null; + }); + } + finally + { + // restore system user as current user + AuthenticationUtil.setRunAsUserSystem(); + } + } + + @Test + public void testPrepareEmailForDisabledUsers() throws MessagingException + { + String groupName = null; + final String USER1 = "test_user1"; + final String USER2 = "test_user2"; + try + { + createUser(USER1, null); + NodeRef userNode = createUser(USER2, null); + groupName = AUTHORITY_SERVICE.createAuthority(AuthorityType.GROUP, "testgroup1"); + AUTHORITY_SERVICE.addAuthority(groupName, USER1); + AUTHORITY_SERVICE.addAuthority(groupName, USER2); + NODE_SERVICE.addAspect(userNode, ContentModel.ASPECT_PERSON_DISABLED, null); + final Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, groupName); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "Testing"); + + RetryingTransactionHelper txHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class); + + MimeMessage mm = txHelper.doInTransaction( + () -> ACTION_EXECUTER.prepareEmail(mailAction, null, null, null).getMimeMessage(), true); + + Address[] addresses = mm.getRecipients(Message.RecipientType.TO); + Assert.assertEquals(1, addresses.length); + Assert.assertEquals(USER1 + "@email.com", addresses[0].toString()); + } + finally + { + if (groupName != null) + { + AUTHORITY_SERVICE.deleteAuthority(groupName, true); + } + PERSON_SERVICE.deletePerson(USER1); + PERSON_SERVICE.deletePerson(USER2); + } + } + + @Test + public void testPrepareEmailSubjectParams() + { + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.bodyelse@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Test Subject Params"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + Pair recipient = new Pair<>("test", Locale.ENGLISH); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT_PARAMS, new Object[] {"Test", "Subject", "Params", "Object", "Array"}); + Assert.assertNotNull("We should support Object[] value for PARAM_SUBJECT_PARAMS", ACTION_EXECUTER.prepareEmail(mailAction, null, recipient, null)); + + ArrayList params = new ArrayList<>(); + params.add("Test"); + params.add("Subject"); + params.add("Params"); + params.add("ArrayList"); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT_PARAMS, params); + Assert.assertNotNull("We should support List value for PARAM_SUBJECT_PARAMS", ACTION_EXECUTER.prepareEmail(mailAction, null, recipient, null)); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT_PARAMS, "Test Subject Params Single String"); + Assert.assertNotNull("We should support String value for PARAM_SUBJECT_PARAMS", ACTION_EXECUTER.prepareEmail(mailAction, null, recipient, null)); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT_PARAMS, null); + Assert.assertNotNull("We should support null value for PARAM_SUBJECT_PARAMS", ACTION_EXECUTER.prepareEmail(mailAction, null, recipient, null)); + } + + /** + * Creates a test user with the specified username and optionally custom email. + * + * @param userName String + * @param email Optional, if not specified assigned to userName + "@email.com" + * @return NodeRef + */ + private NodeRef createUser(String userName, String email) + { + PropertyMap personProps = new PropertyMap(); + personProps.put(ContentModel.PROP_USERNAME, userName); + personProps.put(ContentModel.PROP_FIRSTNAME, userName); + personProps.put(ContentModel.PROP_LASTNAME, userName); + personProps.put(ContentModel.PROP_EMAIL, Objects.requireNonNullElseGet(email, () -> userName + "@email.com")); + + return PERSON_SERVICE.createPerson(personProps); + } + + /** + * Test for MNT-10874 + */ + @Test + public void testUserWithNonExistingTenant() + { + final String USER_WITH_NON_EXISTING_TENANT = "test_user_non_tenant@non_existing_tenant.com"; + + try + { + createUser(USER_WITH_NON_EXISTING_TENANT, USER_WITH_NON_EXISTING_TENANT); + + final Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO, USER_WITH_NON_EXISTING_TENANT); + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "This is a test message."); + + // run as non admin and non system + AuthenticationUtil.setFullyAuthenticatedUser(BRITISH_USER.getUsername()); + TRANSACTION_SERVICE.getRetryingTransactionHelper().doInTransaction( + (RetryingTransactionCallback) () -> { + ACTION_EXECUTER.executeImpl(mailAction, null); + return null; + }); + } + finally + { + // restore system user as current user + AuthenticationUtil.setRunAsUserSystem(); + // tidy up + PERSON_SERVICE.deletePerson(USER_WITH_NON_EXISTING_TENANT); + AuthenticationUtil.clearCurrentSecurityContext(); + } + } + + /** + * Test for MNT-11488 + * @throws MessagingException + */ + @Test + public void testSendingToMultipleUsers() throws MessagingException + { + final String USER_1 = "recipient1"; + final String USER_2 = "recipient2"; + final String[] recipientsArray = { USER_1 + "@email.com", USER_2 + "@email.com" }; + final List recipientsResult = new ArrayList<>(Arrays.asList(recipientsArray)) ; + + try + { + createUser(USER_1, null); + createUser(USER_2, null); + ArrayList recipients = new ArrayList<>(2); + recipients.add(USER_1); + recipients.add(USER_2); + + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "sender@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, recipients); + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + + ACTION_EXECUTER.resetTestSentCount(); + + ACTION_SERVICE.executeAction(mailAction, null); + + MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); + Assert.assertNotNull(message); + Assert.assertEquals("One email should be sent", 1, ACTION_EXECUTER.getTestSentCount()); + Assert.assertEquals("All recipients should receive single message", 2, message.getAllRecipients().length); + + Assert.assertTrue("Both users should receive message", recipientsResult.contains(((InternetAddress) message.getAllRecipients()[0]).getAddress())); + Assert.assertTrue("Both users should receive message", recipientsResult.contains(((InternetAddress) message.getAllRecipients()[1]).getAddress())); + } + finally + { + // tidy up + PERSON_SERVICE.deletePerson(USER_1); + PERSON_SERVICE.deletePerson(USER_2); + } + } + + /** + * Test for CC / BCC + * @throws MessagingException + */ + @Test + public void testSendingToCarbonCopy() throws MessagingException + { + // PARAM_TO variant + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.bodyelse@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_CC, "some.carbon@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_BCC, "some.blindcarbon@example.com"); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing CARBON COPY"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); + + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + + ACTION_SERVICE.executeAction(mailAction, null); + + MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); + Assert.assertNotNull(message); + Address[] all = message.getAllRecipients(); + Address[] ccs = message.getRecipients(RecipientType.CC); + Address[] bccs = message.getRecipients(RecipientType.BCC); + Assert.assertEquals(3, all.length); + Assert.assertEquals(1, ccs.length); + Assert.assertEquals(1, bccs.length); + Assert.assertTrue(ccs[0].toString().contains("some.carbon")); + Assert.assertTrue(bccs[0].toString().contains("some.blindcarbon")); + } + + /** + * Test for MNT-11079 + */ + @Test + public void testSendingToUserWithMailAlikeName() throws IOException, MessagingException + { + final String USER_1 = "user1@namelookslikeemail"; + final String USER_1_EMAIL = "user1@trueemail.com"; + + try + { + createUser(USER_1, USER_1_EMAIL); + + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, USER_1); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); + + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + + ACTION_SERVICE.executeAction(mailAction, null); + + MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); + Assert.assertNotNull(message); + Assert.assertEquals("Hello Jan 1, 1970", message.getContent()); + Assert.assertEquals(1, message.getAllRecipients().length); + javax.mail.internet.InternetAddress address = (InternetAddress) message.getAllRecipients()[0]; + Assert.assertEquals(USER_1_EMAIL, address.getAddress()); + } + finally + { + // tidy up + PERSON_SERVICE.deletePerson(USER_1); + } + } + + /** + * Test for MNT-12464 + */ + @Test + public void testMultipleIdenticalEmailsToUser() + { + final String USER_1 = "user12464_1"; + final String USER_2 = "user12464_2"; + final String USER_3 = "user12464_3"; + final String USER_6 = "user12464_6"; + + final String USER_4_USERNAME = "user12464_4@mnt12464mail.com"; + final String USER_5_USERNAME = "user12464_5@mnt12464mail.com"; + + String[] users = new String[] { USER_1, USER_2, USER_3, USER_4_USERNAME, USER_5_USERNAME }; + + final String GROUP_1_SHORT_NAME = "mnt12464group1"; + final String GROUP_1 = "GROUP_" + GROUP_1_SHORT_NAME; + final String GROUP_2_SHORT_NAME = "mnt12464group2"; + final String GROUP_2 = "GROUP_" + GROUP_2_SHORT_NAME; + + try + { + createUser(USER_1, null); + createUser(USER_2, null); + createUser(USER_3, null); + AUTHORITY_SERVICE.createAuthority(AuthorityType.GROUP, GROUP_1_SHORT_NAME); + AUTHORITY_SERVICE.createAuthority(AuthorityType.GROUP, GROUP_2_SHORT_NAME); + AUTHORITY_SERVICE.addAuthority(GROUP_1, USER_1); + AUTHORITY_SERVICE.addAuthority(GROUP_1, USER_2); + AUTHORITY_SERVICE.addAuthority(GROUP_2, USER_1); + AUTHORITY_SERVICE.addAuthority(GROUP_2, USER_2); + AUTHORITY_SERVICE.addAuthority(GROUP_2, USER_3); + + // these persons should be without emails + PropertyMap personProps = new PropertyMap(); + personProps.put(ContentModel.PROP_USERNAME, USER_4_USERNAME); + personProps.put(ContentModel.PROP_FIRSTNAME, USER_4_USERNAME); + personProps.put(ContentModel.PROP_LASTNAME, USER_4_USERNAME); + PERSON_SERVICE.createPerson(personProps); + AUTHORITY_SERVICE.addAuthority(GROUP_1, USER_4_USERNAME); + AUTHORITY_SERVICE.addAuthority(GROUP_2, USER_4_USERNAME); + + personProps = new PropertyMap(); + personProps.put(ContentModel.PROP_USERNAME, USER_5_USERNAME); + personProps.put(ContentModel.PROP_FIRSTNAME, USER_5_USERNAME); + personProps.put(ContentModel.PROP_LASTNAME, USER_5_USERNAME); + PERSON_SERVICE.createPerson(personProps); + + Action mailAction1 = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction1.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + ArrayList toMany1 = new ArrayList<>(); + toMany1.add(USER_1); + toMany1.add(GROUP_1); + toMany1.add(USER_2); + toMany1.add(GROUP_2); + toMany1.add(USER_3); + toMany1.add(USER_4_USERNAME); + toMany1.add(USER_5_USERNAME); + mailAction1.setParameterValue(MailActionExecuter.PARAM_TO_MANY, toMany1); + mailAction1.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing MNT-12464"); + mailAction1.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); + mailAction1.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + + ACTION_EXECUTER.resetTestSentCount(); + ACTION_SERVICE.executeAction(mailAction1, null); + + Assert.assertEquals("Must be received one letter on each recipient", users.length, ACTION_EXECUTER.getTestSentCount()); + + // testing for GROUP_EVERYONE + + ACTION_EXECUTER.resetTestSentCount(); + everyoneSending(); + int before = ACTION_EXECUTER.getTestSentCount(); + // create one additional user + NodeRef user6 = createUser(USER_6, null); + PERMISSION_SERVICE.setInheritParentPermissions(user6, false); + PERMISSION_SERVICE.deletePermissions(user6); + + // USER_6 not exist for USER_1, but he will be added to recipients + int after = AuthenticationUtil.runAs(() -> { + ACTION_EXECUTER.resetTestSentCount(); + everyoneSending(); + return ACTION_EXECUTER.getTestSentCount(); + }, USER_1); + + Assert.assertEquals("One additional user was created, quantity of recipients GROUP_EVERYONE must be +1 user", 1, after - before); + } + finally + { + PERSON_SERVICE.deletePerson(USER_1); + PERSON_SERVICE.deletePerson(USER_2); + PERSON_SERVICE.deletePerson(USER_3); + PERSON_SERVICE.deletePerson(USER_4_USERNAME); + PERSON_SERVICE.deletePerson(USER_5_USERNAME); + PERSON_SERVICE.deletePerson(USER_6); + AUTHORITY_SERVICE.deleteAuthority(GROUP_1); + AUTHORITY_SERVICE.deleteAuthority(GROUP_2); + } + } + + private void everyoneSending() + { + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + ArrayList toMany = new ArrayList<>(); + toMany.add(PERMISSION_SERVICE.getAllAuthorities()); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, toMany); + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing MNT-12464"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/test.txt.ftl"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE_MODEL, getModel()); + + ACTION_EXECUTER.resetTestSentCount(); + + ACTION_SERVICE.executeAction(mailAction, null); + } + + /** + * ACE-2564 + */ + @Test + public void testSendEmailByExternalUser() throws IOException, MessagingException + { + final Serializable recipients = (Serializable) Arrays.asList(BRITISH_USER.getUsername()); + final String subject = ""; + final String template = "alfresco/templates/mail/test.txt.ftl"; + AuthenticationUtil.pushAuthentication(); + AuthenticationUtil.setFullyAuthenticatedUser(EXTERNAL_USER.getUsername()); + + try + { + // these people should be without emails + // testing for GROUP_EVERYONE + final String tenantId = getUsersHomeTenant(BRITISH_USER.getUsername()); + + // USER_6 not exist for USER_1, but he will be added to recipients + MimeMessage message = TenantUtil.runAsTenant(() -> sendMessage(null, recipients, subject, template), tenantId); + + Assert.assertNotNull(message); + Assert.assertEquals("Hello 1 Jan 1970", message.getContent()); + } + finally + { + AuthenticationUtil.popAuthentication(); + } + } + + /** + * Test for MNT-17970 + * @throws IOException + * @throws MessagingException + */ + @Test + public void testGetToUsersWhenSendingToGroup() throws IOException, MessagingException + { + String groupName = null; + final String USER1 = "test_user1"; + final String USER2 = "test_user2"; + try + { + // Create users and add them to a group + createUser(USER1, null); + createUser(USER2, null); + groupName = AUTHORITY_SERVICE.createAuthority(AuthorityType.GROUP, "testgroup1"); + AUTHORITY_SERVICE.addAuthority(groupName, USER1); + AUTHORITY_SERVICE.addAuthority(groupName, USER2); + + // Create mail + final Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO_MANY, groupName); + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "Testing"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEMPLATE, "alfresco/templates/mail/testSentTo.txt.ftl"); + + RetryingTransactionHelper txHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class); + + // Send mail + MimeMessage message = txHelper.doInTransaction(() -> { + ACTION_EXECUTER.executeImpl(mailAction, null); + return ACTION_EXECUTER.retrieveLastTestMessage(); + }, true); + + // Check that both users are displayed in message body + String recipients = USER1 + "@email.com" + "," + USER2 + "@email.com"; + Assert.assertNotNull(message); + Assert.assertEquals("This email was sent to " + recipients, message.getContent()); + } + finally + { + if (groupName != null) + { + AUTHORITY_SERVICE.deleteAuthority(groupName, true); + } + PERSON_SERVICE.deletePerson(USER1); + PERSON_SERVICE.deletePerson(USER2); + } + } + + /** + * ALF-21948 + */ + @Test + public void testSendingToArrayOfCarbonCopyAndBlindCarbonCopyUsers() throws MessagingException + { + Map params = new HashMap<>(); + String[] ccArray = { "cc_user1@example.com", "cc_user2@example.com" }; + String[] bccArray = { "bcc_user3@example.com", "bcc_user4@example.com", "bcc_user5@example.com" }; + params.put(MailActionExecuter.PARAM_FROM, "sender@email.com"); + params.put(MailActionExecuter.PARAM_TO, "test@email.com"); + params.put(MailActionExecuter.PARAM_CC, ccArray); + params.put(MailActionExecuter.PARAM_BCC, bccArray); + + params.put(MailActionExecuter.PARAM_TEXT, "Mail body here"); + params.put(MailActionExecuter.PARAM_SUBJECT, "Subject text"); + + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME, params); + ACTION_EXECUTER.resetTestSentCount(); + + ACTION_SERVICE.executeAction(mailAction, null); + MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); + Assert.assertNotNull(message); + + Address[] all = message.getAllRecipients(); + Address[] ccs = message.getRecipients(RecipientType.CC); + Address[] bccs = message.getRecipients(RecipientType.BCC); + Assert.assertEquals(6, all.length); + Assert.assertEquals(2, ccs.length); + Assert.assertEquals(3, bccs.length); + Assert.assertTrue(ccs[0].toString().contains("cc_user1") && ccs[1].toString().contains("cc_user2")); + Assert.assertTrue(bccs[0].toString().contains("bcc_user3") && bccs[1].toString().contains("bcc_user4") + && bccs[2].toString().contains("bcc_user5")); + } + + /** + * ALF-21948 + */ + @Test + public void testSendingToListOfCarbonCopyAndBlindCarbonCopyUsers() throws MessagingException + { + List ccList = new ArrayList<>(); + ccList.add("cc_user1@example.com"); + ccList.add("cc_user2@example.com"); + + List bccList = new ArrayList<>(); + bccList.add("bcc_user3@example.com"); + bccList.add("bcc_user4@example.com"); + bccList.add("bcc_user5@example.com"); + + Action mailAction = ACTION_SERVICE.createAction(MailActionExecuter.NAME); + mailAction.setParameterValue(MailActionExecuter.PARAM_FROM, "some.body@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TO, "some.bodyelse@example.com"); + mailAction.setParameterValue(MailActionExecuter.PARAM_CC, (Serializable) ccList); + mailAction.setParameterValue(MailActionExecuter.PARAM_BCC, (Serializable) bccList); + + mailAction.setParameterValue(MailActionExecuter.PARAM_SUBJECT, "Testing (BLIND) CARBON COPY"); + mailAction.setParameterValue(MailActionExecuter.PARAM_TEXT, "mail body here"); + + ACTION_EXECUTER.resetTestSentCount(); + ACTION_SERVICE.executeAction(mailAction, null); + MimeMessage message = ACTION_EXECUTER.retrieveLastTestMessage(); + Assert.assertNotNull(message); + + Address[] all = message.getAllRecipients(); + Address[] ccs = message.getRecipients(RecipientType.CC); + Address[] bccs = message.getRecipients(RecipientType.BCC); + Assert.assertEquals(6, all.length); + Assert.assertEquals(2, ccs.length); + Assert.assertEquals(3, bccs.length); + Assert.assertTrue(ccs[0].toString().contains("cc_user1") && ccs[1].toString().contains("cc_user2")); + Assert.assertTrue(bccs[0].toString().contains("bcc_user3") && bccs[1].toString().contains("bcc_user4") + && bccs[2].toString().contains("bcc_user5")); + } + +} diff --git a/repository/src/test/java/org/alfresco/repo/content/transform/LocalTransformServiceRegistryTest.java b/repository/src/test/java/org/alfresco/repo/content/transform/LocalTransformServiceRegistryTest.java index 43947bce6a..57902596c3 100644 --- a/repository/src/test/java/org/alfresco/repo/content/transform/LocalTransformServiceRegistryTest.java +++ b/repository/src/test/java/org/alfresco/repo/content/transform/LocalTransformServiceRegistryTest.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2021 Alfresco Software Limited + * Copyright (C) 2005 - 2022 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -25,44 +25,39 @@ */ package org.alfresco.repo.content.transform; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import java.io.IOException; -import java.util.Properties; -import java.util.StringJoiner; - import static org.alfresco.repo.content.transform.LocalTransformServiceRegistry.LOCAL_TRANSFORMER; import static org.alfresco.repo.content.transform.LocalTransformServiceRegistry.URL; import static org.junit.Assert.assertEquals; +import java.util.Properties; +import java.util.StringJoiner; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) public class LocalTransformServiceRegistryTest { @Spy - private Properties properties = new Properties(); - + private Properties properties; @InjectMocks - LocalTransformServiceRegistry registry = new LocalTransformServiceRegistry(); - - @Rule - public MockitoRule initRule = MockitoJUnit.rule(); + private LocalTransformServiceRegistry registry; @Test - public void testGetTEngineUrlsSortedByName() throws IOException + public void testGetTEngineUrlsSortedByName() { - properties.put(LOCAL_TRANSFORMER+"aa"+URL, "aa"); - properties.put(LOCAL_TRANSFORMER+"engine1"+URL, "http_xxxx1"); - properties.put(LOCAL_TRANSFORMER+"engine3"+URL, "http3"); - properties.put(LOCAL_TRANSFORMER+"engine2"+URL, "http_xx2"); - properties.put(LOCAL_TRANSFORMER+"bb"+URL, "bb"); - properties.put(LOCAL_TRANSFORMER+"b"+URL, "b"); + properties.put(LOCAL_TRANSFORMER + "aa" + URL, "aa"); + properties.put(LOCAL_TRANSFORMER + "engine1" + URL, "http_xxxx1"); + properties.put(LOCAL_TRANSFORMER + "engine3" + URL, "http3"); + properties.put(LOCAL_TRANSFORMER + "engine2" + URL, "http_xx2"); + properties.put(LOCAL_TRANSFORMER + "bb" + URL, "bb"); + properties.put(LOCAL_TRANSFORMER + "b" + URL, "b"); StringJoiner orderEngineConfigRead = new StringJoiner(","); - registry.getTEngineUrlsSortedByName().forEach(name -> orderEngineConfigRead.add(name)); + registry.getTEngineUrlsSortedByName().forEach(orderEngineConfigRead::add); assertEquals("aa,b,bb,http_xxxx1,http_xx2,http3", orderEngineConfigRead.toString()); } } diff --git a/repository/src/test/java/org/alfresco/repo/imap/ImapMessageTest.java b/repository/src/test/java/org/alfresco/repo/imap/ImapMessageTest.java index 7d1b9de47c..5431829451 100644 --- a/repository/src/test/java/org/alfresco/repo/imap/ImapMessageTest.java +++ b/repository/src/test/java/org/alfresco/repo/imap/ImapMessageTest.java @@ -455,7 +455,7 @@ public class ImapMessageTest extends TestCase }; // UID SEARCH SINCE Response[] ret = (Response[]) folder.doCommand(uid_search_since); - assertEquals("java.net.SocketException: Connection reset", ret[0].getException().toString()); + assertEquals("java.io.IOException: Connection dropped by server?", ret[0].getException().toString()); } catch (MessagingException e) { diff --git a/repository/src/test/java/org/alfresco/repo/model/ml/tools/ContentFilterLanguagesMapTest.java b/repository/src/test/java/org/alfresco/repo/model/ml/tools/ContentFilterLanguagesMapTest.java index 10a1db7f3b..42743d2649 100644 --- a/repository/src/test/java/org/alfresco/repo/model/ml/tools/ContentFilterLanguagesMapTest.java +++ b/repository/src/test/java/org/alfresco/repo/model/ml/tools/ContentFilterLanguagesMapTest.java @@ -1,28 +1,28 @@ -/* - * #%L - * Alfresco Repository - * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ +/* + * #%L + * Alfresco Repository + * %% + * Copyright (C) 2005 - 2022 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ package org.alfresco.repo.model.ml.tools; import java.util.ArrayList; @@ -45,7 +45,7 @@ import org.junit.experimental.categories.Category; public class ContentFilterLanguagesMapTest extends AbstractMultilingualTestCases { - public void testGetFilterLanguages() throws Exception + public void testGetFilterLanguages() { // get the list of content filter languages List lggs = contentFilterLanguagesService.getFilterLanguages(); @@ -57,7 +57,7 @@ public class ContentFilterLanguagesMapTest extends AbstractMultilingualTestCases try { lggs.add("NEW LOCALE"); - assertTrue("Add a value to the content filter language list is not permit, this list would be read only", false); + fail("Add a value to the content filter language list is not permit, this list would be read only"); } catch (Exception e) { @@ -67,7 +67,7 @@ public class ContentFilterLanguagesMapTest extends AbstractMultilingualTestCases try { lggs.remove(0); - assertTrue("Remove a value to the content filter language list is not permit, this list would be read only", false); + fail("Remove a value to the content filter language list is not permit, this list would be read only"); } catch (Exception e) { @@ -76,7 +76,7 @@ public class ContentFilterLanguagesMapTest extends AbstractMultilingualTestCases } @SuppressWarnings("unchecked") - public void testGetMissingLanguages() throws Exception + public void testGetMissingLanguages() { List lggs = contentFilterLanguagesService.getFilterLanguages(); @@ -97,7 +97,7 @@ public class ContentFilterLanguagesMapTest extends AbstractMultilingualTestCases assertEquals("Language list returned with the empty parameter corrupted", missingLggsEmpty.size(), lggs.size()); // get missing languages with a two locale list - List param = new ArrayList(); + List param = new ArrayList<>(); param.add(0, lggs.get(0)); param.add(1, lggs.get(1)); List missingLggsOk = contentFilterLanguagesService.getMissingLanguages(param); @@ -123,29 +123,29 @@ public class ContentFilterLanguagesMapTest extends AbstractMultilingualTestCases assertFalse("Language found : " + param.get(2), missingLggsWrong.contains(param.get(2))); } - public void testISOCodeConvertions() throws Exception + public void testISOCodeConversions() { // New ISO code list String[] newCode = {"he", "id", "yi"}; String[] oldCode = {"iw", "in", "ji"}; - Locale loc0 = new Locale(newCode[0]); - Locale loc1 = new Locale(newCode[1]); - Locale loc2 = new Locale(newCode[2]); + Locale loc0 = new Locale(oldCode[0]); + Locale loc1 = new Locale(oldCode[1]); + Locale loc2 = new Locale(oldCode[2]); - // Ensure that java.util.Locale has converted the new ISO code into new iso code - assertEquals("java.util.Locale Convertion not correct for " + newCode[0], oldCode[0], loc0.getLanguage()); - assertEquals("java.util.Locale Convertion not correct for " + newCode[1], oldCode[1], loc1.getLanguage()); - assertEquals("java.util.Locale Convertion not correct for " + newCode[2], oldCode[2], loc2.getLanguage()); + // Ensure that java.util.Locale has converted the old ISO code into new ISO code + // This conversion can be avoided by setting the java.locale.useOldISOCodes=true system property + assertEquals("java.util.Locale Conversion not correct for " + oldCode[0], newCode[0], loc0.getLanguage()); + assertEquals("java.util.Locale Conversion not correct for " + oldCode[1], newCode[1], loc1.getLanguage()); + assertEquals("java.util.Locale Conversion not correct for " + oldCode[2], newCode[2], loc2.getLanguage()); - // Ensure that the convertion is correcte - assertEquals("Convertion of new ISO codes not correct for " + newCode[0], oldCode[0], contentFilterLanguagesService.convertToOldISOCode(newCode[0])); - assertEquals("Convertion of new ISO codes not correct for " + newCode[1], oldCode[1], contentFilterLanguagesService.convertToOldISOCode(newCode[1])); - assertEquals("Convertion of new ISO codes not correct for " + newCode[2], oldCode[2], contentFilterLanguagesService.convertToOldISOCode(newCode[2])); + // Ensure that the conversion is correct + assertEquals("Conversion of new ISO codes not correct for " + newCode[0], oldCode[0], contentFilterLanguagesService.convertToOldISOCode(newCode[0])); + assertEquals("Conversion of new ISO codes not correct for " + newCode[1], oldCode[1], contentFilterLanguagesService.convertToOldISOCode(newCode[1])); + assertEquals("Conversion of new ISO codes not correct for " + newCode[2], oldCode[2], contentFilterLanguagesService.convertToOldISOCode(newCode[2])); - - assertEquals("Convertion of old ISO codes not correct for " + oldCode[0], newCode[0], contentFilterLanguagesService.convertToNewISOCode(oldCode[0])); - assertEquals("Convertion of old ISO codes not correct for " + oldCode[1], newCode[1], contentFilterLanguagesService.convertToNewISOCode(oldCode[1])); - assertEquals("Convertion of old ISO codes not correct for " + oldCode[2], newCode[2], contentFilterLanguagesService.convertToNewISOCode(oldCode[2])); + assertEquals("Conversion of old ISO codes not correct for " + oldCode[0], newCode[0], contentFilterLanguagesService.convertToNewISOCode(oldCode[0])); + assertEquals("Conversion of old ISO codes not correct for " + oldCode[1], newCode[1], contentFilterLanguagesService.convertToNewISOCode(oldCode[1])); + assertEquals("Conversion of old ISO codes not correct for " + oldCode[2], newCode[2], contentFilterLanguagesService.convertToNewISOCode(oldCode[2])); } }