From a91177a2d7e2b5c03416699805f5bcacee154efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 31 May 2019 15:57:30 +0200 Subject: [PATCH] Migrate creationDate and lastModified --- .../scm/user/update/XmlUserV1UpdateStep.java | 41 ++++++++++++++----- .../user/update/XmlUserV1UpdateStepTest.java | 9 +++- .../resources/sonia/scm/user/update/users.xml | 1 + 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java index 8a56a9ae09..404993a2bf 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java @@ -3,6 +3,7 @@ package sonia.scm.user.update; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.SCMContextProvider; +import sonia.scm.migration.UpdateException; import sonia.scm.migration.UpdateStep; import sonia.scm.plugin.Extension; import sonia.scm.security.AssignedPermission; @@ -22,9 +23,15 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; import java.util.Map; +import java.util.Optional; +import static java.util.Optional.empty; +import static java.util.Optional.of; import static sonia.scm.version.Version.parse; @Extension @@ -45,11 +52,12 @@ public class XmlUserV1UpdateStep implements UpdateStep { @Override public void doUpdate() throws JAXBException { - if (!determineV1File().exists()) { + Optional v1UsersFile = determineV1File(); + if (!v1UsersFile.isPresent()) { + LOG.info("no v1 file for users found"); return; } - JAXBContext jaxbContext = JAXBContext.newInstance(XmlUserV1UpdateStep.V1UserDatabase.class); - XmlUserV1UpdateStep.V1UserDatabase v1Database = readV1Database(jaxbContext); + XmlUserV1UpdateStep.V1UserDatabase v1Database = readV1Database(v1UsersFile.get()); ConfigurationEntryStore securityStore = createSecurityStore(); v1Database.userList.users.forEach(user -> update(user, securityStore)); } @@ -65,6 +73,7 @@ public class XmlUserV1UpdateStep implements UpdateStep { } private void update(XmlUserV1UpdateStep.V1User v1User, ConfigurationEntryStore securityStore) { + LOG.debug("updating user {}", v1User.name); User user = new User( v1User.name, v1User.displayName, @@ -72,29 +81,39 @@ public class XmlUserV1UpdateStep implements UpdateStep { v1User.password, v1User.type, v1User.active); + user.setCreationDate(v1User.creationDate); + user.setLastModified(v1User.lastModified); userDAO.add(user); if (v1User.admin) { + LOG.debug("setting admin permissions for user {}", v1User.name); securityStore.put(new AssignedPermission(v1User.name, "*")); } } - private XmlUserV1UpdateStep.V1UserDatabase readV1Database(JAXBContext jaxbContext) throws JAXBException { - return (XmlUserV1UpdateStep.V1UserDatabase) jaxbContext.createUnmarshaller().unmarshal(determineV1File()); + private XmlUserV1UpdateStep.V1UserDatabase readV1Database(Path v1UsersFile) throws JAXBException { + JAXBContext jaxbContext = JAXBContext.newInstance(XmlUserV1UpdateStep.V1UserDatabase.class); + return (XmlUserV1UpdateStep.V1UserDatabase) jaxbContext.createUnmarshaller().unmarshal(v1UsersFile.toFile()); } private ConfigurationEntryStore createSecurityStore() { return configurationEntryStoreFactory.withType(AssignedPermission.class).withName("security").build(); } - private File determineV1File() { - File configDirectory = new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME); - for (File file : configDirectory.listFiles()) { - if (file.getName().equals("users" + StoreConstants.FILE_EXTENSION)) { - file.renameTo(new File(configDirectory + "/usersV1" + StoreConstants.FILE_EXTENSION)); + private Optional determineV1File() { + Path configDirectory = new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME).toPath(); + Path existingUsersFile = configDirectory.resolve("users" + StoreConstants.FILE_EXTENSION); + Path usersV1File = configDirectory.resolve("usersV1" + StoreConstants.FILE_EXTENSION); + if (existingUsersFile.toFile().exists()) { + try { + Files.move(existingUsersFile, usersV1File); + } catch (IOException e) { + throw new UpdateException("could not move old users file to " + usersV1File.toAbsolutePath()); } + LOG.info("moved old users file to {}", usersV1File.toAbsolutePath()); + return of(usersV1File); } - return new File(configDirectory, "usersV1" + StoreConstants.FILE_EXTENSION); + return empty(); } @XmlAccessorType(XmlAccessType.FIELD) diff --git a/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java index 03bbbebf9e..4e7784edda 100644 --- a/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java @@ -97,7 +97,14 @@ class XmlUserV1UpdateStepTest { .hasFieldOrPropertyWithValue("displayName", "SCM Administrator") .hasFieldOrPropertyWithValue("active", false) .hasFieldOrPropertyWithValue("password", "ff8f5c593a01f9fcd3ed48b09a4b013e8d8f3be7") - .hasFieldOrPropertyWithValue("type", "xml"); + .hasFieldOrPropertyWithValue("type", "xml") + .hasFieldOrPropertyWithValue("lastModified", 1558597367492L) + .hasFieldOrPropertyWithValue("creationDate", 1558597074732L); } } + + @Test + void shouldNotFailForMissingConfigDir() throws JAXBException { + updateStep.doUpdate(); + } } diff --git a/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml b/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml index 1c579389e8..a8e8738157 100644 --- a/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml +++ b/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml @@ -7,6 +7,7 @@ true 1558597074732 + 1558597367492 SCM Administrator scm-admin@scm-manager.com scmadmin