From 8dc0041e17fa25d0911e54420ea925c17fff649b Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 13 Nov 2023 16:19:15 +0100 Subject: [PATCH] Remove mail for anonymous user --- gradle/changelog/anon_mail.yaml | 2 + .../src/main/java/sonia/scm/SCMContext.java | 2 +- .../user/AnonymousUserEmailUpdateStep.java | 64 +++++++++++++++ .../AnonymousUserEmailUpdateStepTest.java | 78 +++++++++++++++++++ 4 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 gradle/changelog/anon_mail.yaml create mode 100644 scm-webapp/src/main/java/sonia/scm/update/user/AnonymousUserEmailUpdateStep.java create mode 100644 scm-webapp/src/test/java/sonia/scm/update/user/AnonymousUserEmailUpdateStepTest.java diff --git a/gradle/changelog/anon_mail.yaml b/gradle/changelog/anon_mail.yaml new file mode 100644 index 0000000000..65c8e7e0da --- /dev/null +++ b/gradle/changelog/anon_mail.yaml @@ -0,0 +1,2 @@ +- type: changed + description: Remove mail for anonymous user diff --git a/scm-core/src/main/java/sonia/scm/SCMContext.java b/scm-core/src/main/java/sonia/scm/SCMContext.java index fbe07b13c4..569a3a2115 100644 --- a/scm-core/src/main/java/sonia/scm/SCMContext.java +++ b/scm-core/src/main/java/sonia/scm/SCMContext.java @@ -56,7 +56,7 @@ public final class SCMContext { public static final User ANONYMOUS = new User( USER_ANONYMOUS, "SCM Anonymous", - "scm-anonymous@scm-manager.org", + "", CipherUtil.getInstance().encode("__not_necessary_password__"), "xml", true diff --git a/scm-webapp/src/main/java/sonia/scm/update/user/AnonymousUserEmailUpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/user/AnonymousUserEmailUpdateStep.java new file mode 100644 index 0000000000..87813c254d --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/update/user/AnonymousUserEmailUpdateStep.java @@ -0,0 +1,64 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.update.user; + +import sonia.scm.SCMContext; +import sonia.scm.migration.UpdateStep; +import sonia.scm.plugin.Extension; +import sonia.scm.user.User; +import sonia.scm.user.xml.XmlUserDAO; +import sonia.scm.version.Version; + +import javax.inject.Inject; + +@Extension +public class AnonymousUserEmailUpdateStep implements UpdateStep { + + private final XmlUserDAO userDAO; + + @Inject + public AnonymousUserEmailUpdateStep(XmlUserDAO userDAO) { + this.userDAO = userDAO; + } + + @Override + public void doUpdate() throws Exception { + User anonymous = userDAO.get(SCMContext.USER_ANONYMOUS); + if (anonymous != null && "scm-anonymous@scm-manager.org".equals(anonymous.getMail())) { + anonymous.setMail(""); + userDAO.modify(anonymous); + } + } + + @Override + public Version getTargetVersion() { + return Version.parse("2.48.0"); + } + + @Override + public String getAffectedDataType() { + return "sonia.scm.user.xml"; + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/update/user/AnonymousUserEmailUpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/user/AnonymousUserEmailUpdateStepTest.java new file mode 100644 index 0000000000..387eaf409a --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/update/user/AnonymousUserEmailUpdateStepTest.java @@ -0,0 +1,78 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.update.user; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import sonia.scm.SCMContext; +import sonia.scm.user.User; +import sonia.scm.user.xml.XmlUserDAO; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class AnonymousUserEmailUpdateStepTest { + + @Mock + XmlUserDAO userDAO; + + @InjectMocks + AnonymousUserEmailUpdateStep updateStep; + + @Test + void shouldDoNothingIfNoAnonymousUser() throws Exception { + updateStep.doUpdate(); + + verify(userDAO, never()).modify(any()); + } + + @Test + void shouldDoNothingIfAnonymousUserMailWasChanged() throws Exception { + User anonymous = new User(SCMContext.USER_ANONYMOUS); + when(userDAO.get("_anonymous")).thenReturn(anonymous); + + updateStep.doUpdate(); + + verify(userDAO, never()).modify(any()); + } + + @Test + void shouldClearAnonymousUserMail() throws Exception { + User anonymous = new User(SCMContext.USER_ANONYMOUS); + anonymous.setMail("scm-anonymous@scm-manager.org"); + when(userDAO.get("_anonymous")).thenReturn(anonymous); + + updateStep.doUpdate(); + + verify(userDAO).modify(argThat(user -> user.getMail().equals(""))); + } +}