mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-13 08:55:44 +01:00
fix migration with unknown permissions
This commit is contained in:
@@ -23,6 +23,8 @@ import java.nio.file.Path;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import static java.util.Optional.ofNullable;
|
import static java.util.Optional.ofNullable;
|
||||||
import static sonia.scm.version.Version.parse;
|
import static sonia.scm.version.Version.parse;
|
||||||
@@ -30,6 +32,8 @@ import static sonia.scm.version.Version.parse;
|
|||||||
@Extension
|
@Extension
|
||||||
public class XmlSecurityV1UpdateStep implements UpdateStep {
|
public class XmlSecurityV1UpdateStep implements UpdateStep {
|
||||||
|
|
||||||
|
private static final Pattern v1PermissionPattern = Pattern.compile("^repository:\\*:(READ|WRITE|OWNER)$");
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(XmlSecurityV1UpdateStep.class);
|
private static final Logger LOG = LoggerFactory.getLogger(XmlSecurityV1UpdateStep.class);
|
||||||
|
|
||||||
private final SCMContextProvider contextProvider;
|
private final SCMContextProvider contextProvider;
|
||||||
@@ -63,11 +67,21 @@ public class XmlSecurityV1UpdateStep implements UpdateStep {
|
|||||||
V1Security v1Security = (V1Security) jaxbContext.createUnmarshaller().unmarshal(v1SecurityFile.toFile());
|
V1Security v1Security = (V1Security) jaxbContext.createUnmarshaller().unmarshal(v1SecurityFile.toFile());
|
||||||
|
|
||||||
v1Security.entries.forEach(assignedPermission -> {
|
v1Security.entries.forEach(assignedPermission -> {
|
||||||
|
Matcher matcher = v1PermissionPattern.matcher(assignedPermission.value.permission);
|
||||||
|
if (matcher.matches()) {
|
||||||
|
String newPermission = convertRole(matcher.group(1));
|
||||||
|
securityStore.put(new AssignedPermission(
|
||||||
|
assignedPermission.value.name,
|
||||||
|
Boolean.parseBoolean(assignedPermission.value.groupPermission),
|
||||||
|
newPermission
|
||||||
|
));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
String newPermission = "";
|
private String convertRole(String role) {
|
||||||
if (assignedPermission.value.permission != null && !assignedPermission.value.permission.isEmpty()) {
|
String newPermission;
|
||||||
String[] splitPermission = assignedPermission.value.permission.split(":");
|
switch (role) {
|
||||||
switch(splitPermission[2]) {
|
|
||||||
case "OWNER":
|
case "OWNER":
|
||||||
newPermission = "repository:*";
|
newPermission = "repository:*";
|
||||||
break;
|
break;
|
||||||
@@ -76,15 +90,11 @@ public class XmlSecurityV1UpdateStep implements UpdateStep {
|
|||||||
break;
|
break;
|
||||||
case "READ":
|
case "READ":
|
||||||
newPermission = "repository:read,pull:*";
|
newPermission = "repository:read,pull:*";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
newPermission = "";
|
||||||
}
|
}
|
||||||
}
|
return newPermission;
|
||||||
|
|
||||||
securityStore.put(new AssignedPermission(
|
|
||||||
assignedPermission.value.name,
|
|
||||||
Boolean.parseBoolean(assignedPermission.value.groupPermission),
|
|
||||||
newPermission
|
|
||||||
));
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void forAllAdmins(Consumer<String> userConsumer, Consumer<String> groupConsumer) throws JAXBException {
|
private void forAllAdmins(Consumer<String> userConsumer, Consumer<String> groupConsumer) throws JAXBException {
|
||||||
|
|||||||
@@ -56,13 +56,6 @@ class XmlSecurityV1UpdateStepTest {
|
|||||||
copyTestDatabaseFile(configDir, "config.xml");
|
copyTestDatabaseFile(configDir, "config.xml");
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeEach
|
|
||||||
void createSecurityV1XML(@TempDirectory.TempDir Path tempDir) throws IOException {
|
|
||||||
Path configDir = tempDir.resolve("config");
|
|
||||||
Files.createDirectories(configDir);
|
|
||||||
copyTestDatabaseFile(configDir, "securityV1.xml");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldCreatePermissionForUsersConfiguredAsAdmin() throws JAXBException {
|
void shouldCreatePermissionForUsersConfiguredAsAdmin() throws JAXBException {
|
||||||
updateStep.doUpdate();
|
updateStep.doUpdate();
|
||||||
@@ -89,6 +82,18 @@ class XmlSecurityV1UpdateStepTest {
|
|||||||
assertThat(assignedPermission).contains("admins", "vogons");
|
assertThat(assignedPermission).contains("admins", "vogons");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
class WithExistingSecurityXml {
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void createSecurityV1XML(@TempDirectory.TempDir Path tempDir) throws IOException {
|
||||||
|
Path configDir = tempDir.resolve("config");
|
||||||
|
Files.createDirectories(configDir);
|
||||||
|
copyTestDatabaseFile(configDir, "securityV1.xml");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldMapV1PermissionsFromSecurityV1XML() throws JAXBException {
|
void shouldMapV1PermissionsFromSecurityV1XML() throws JAXBException {
|
||||||
updateStep.doUpdate();
|
updateStep.doUpdate();
|
||||||
@@ -101,6 +106,7 @@ class XmlSecurityV1UpdateStepTest {
|
|||||||
assertThat(assignedPermission).contains("scmadmin");
|
assertThat(assignedPermission).contains("scmadmin");
|
||||||
assertThat(assignedPermission).contains("test");
|
assertThat(assignedPermission).contains("test");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void copyTestDatabaseFile(Path configDir, String fileName) throws IOException {
|
private void copyTestDatabaseFile(Path configDir, String fileName) throws IOException {
|
||||||
|
|||||||
@@ -16,4 +16,20 @@
|
|||||||
<permission>repository:*:OWNER</permission>
|
<permission>repository:*:OWNER</permission>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>CfRWOAANM2</key>
|
||||||
|
<value>
|
||||||
|
<group-permission>true</group-permission>
|
||||||
|
<name>test</name>
|
||||||
|
<permission>invalid:permission</permission>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>CfRWOAANM2</key>
|
||||||
|
<value>
|
||||||
|
<group-permission>true</group-permission>
|
||||||
|
<name>test</name>
|
||||||
|
<permission>repository:*:STRANGE</permission>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
Reference in New Issue
Block a user