SLING-8573 - ACLs are missing from the converted content packages for
regular users and groups
initial checkin
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/AclManager.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/AclManager.java
index 80ac1be..79b2f0d 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/AclManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/AclManager.java
@@ -28,7 +28,7 @@
boolean addSystemUser(SystemUser systemUser);
- Acl addAcl(String systemUser, Acl acl);
+ boolean addAcl(String systemUser, Acl acl);
void addRepoinitExtension(List<VaultPackageAssembler> packageAssemblers, Feature feature);
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
index 4db3d54..cebc5c2 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/DefaultAclManager.java
@@ -62,9 +62,12 @@
return false;
}
- public Acl addAcl(String systemUser, Acl acl) {
- acls.computeIfAbsent(systemUser, k -> new LinkedList<>()).add(acl);
- return acl;
+ public boolean addAcl(String systemUser, Acl acl) {
+ if (isKnownSystemUser(systemUser)) {
+ acls.computeIfAbsent(systemUser, k -> new LinkedList<>()).add(acl);
+ return true;
+ }
+ return false;
}
private void addPath(Path path, Set<Path> paths) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/acl/SystemUser.java b/src/main/java/org/apache/sling/feature/cpconverter/acl/SystemUser.java
index 0c3c3c6..097fad7 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/acl/SystemUser.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/acl/SystemUser.java
@@ -61,6 +61,9 @@
return Objects.equals(id, other.getId()) && Objects.equals(path, other.getPath());
}
-
+ @Override
+ public String toString() {
+ return "SystemUser [id=" + id + ", path=" + path + "]";
+ }
}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
index dfe8126..3015622 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
@@ -44,10 +44,11 @@
@Override
public void handle(String path, Archive archive, Entry entry, ContentPackage2FeatureModelConverter converter)
throws Exception {
+ String resourcePath;
Matcher matcher = getPattern().matcher(path);
// we are pretty sure it matches, here
if (matcher.matches()) {
- path = matcher.group(1);
+ resourcePath = matcher.group(1);
} else {
throw new IllegalStateException("Something went terribly wrong: pattern '"
+ getPattern().pattern()
@@ -56,13 +57,19 @@
+ "' but it does not, currently");
}
- RepPolicyParser systemUserParser = new RepPolicyParser(path, converter.getAclManager());
+ RepPolicyParser systemUserParser = new RepPolicyParser(resourcePath, converter.getAclManager());
+ boolean accepted = false;
+
try (InputStream input = archive.openInputStream(entry)) {
- systemUserParser.parse(input);
+ accepted = systemUserParser.parse(input);
+ }
+
+ if (!accepted) {
+ converter.getMainPackageAssembler().addEntry(path, archive, entry);
}
}
- private static final class RepPolicyParser extends AbstractJcrNodeParser<Void> {
+ private static final class RepPolicyParser extends AbstractJcrNodeParser<Boolean> {
private static final String REP_ACL = "rep:ACL";
@@ -95,6 +102,8 @@
private boolean onRepAclNode = false;
+ private boolean accepted = true;
+
public RepPolicyParser(String path, AclManager aclManager) {
super(REP_ACL);
this.path = path;
@@ -115,7 +124,12 @@
Acl acl = new Acl(operation, privileges, Paths.get(path));
- acls.add(aclManager.addAcl(principalName, acl));
+ if (aclManager.addAcl(principalName, acl)) {
+ acls.add(acl);
+ } else {
+ accepted = false;
+ onRepAclNode = false;
+ }
} else if (REP_RESTRICTIONS.equals(primaryType) && !acls.isEmpty()) {
for (String restriction : RESTRICTIONS) {
String path = extractValue(attributes.getValue(restriction));
@@ -143,8 +157,8 @@
}
@Override
- protected Void getParsingResult() {
- return null;
+ protected Boolean getParsingResult() {
+ return accepted;
}
private static String extractValue(String expression) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
index 79925dd..4284e1b 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
@@ -23,13 +23,15 @@
import org.apache.jackrabbit.vault.packaging.PackageId;
import org.apache.jackrabbit.vault.packaging.PackageManager;
import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.apache.sling.feature.cpconverter.handlers.EntryHandler;
+import org.apache.sling.feature.cpconverter.handlers.SystemUsersEntryHandler;
import org.apache.sling.feature.cpconverter.handlers.VersionResolverContentPackageEntryHandler;
public final class RecollectorVaultPackageScanner extends BaseVaultPackageScanner {
private final ContentPackage2FeatureModelConverter converter;
- private final VersionResolverContentPackageEntryHandler handler;
+ private final EntryHandler[] handlers;
public RecollectorVaultPackageScanner(ContentPackage2FeatureModelConverter converter,
PackageManager packageManager,
@@ -37,13 +39,18 @@
Map<PackageId, String> subContentPackages) {
super(packageManager, strictValidation);
this.converter = converter;
- handler = new VersionResolverContentPackageEntryHandler(this, subContentPackages);
+ handlers = new EntryHandler[] {
+ new SystemUsersEntryHandler(),
+ new VersionResolverContentPackageEntryHandler(this, subContentPackages)
+ };
}
@Override
protected void onFile(String path, Archive archive, Entry entry) throws Exception {
- if (handler.matches(path)) {
- handler.handle(path, archive, entry, converter);
+ for (EntryHandler handler : handlers) {
+ if (handler.matches(path)) {
+ handler.handle(path, archive, entry, converter);
+ }
}
}
diff --git a/src/main/resources/META-INF/services/org.apache.sling.feature.cpconverter.handlers.EntryHandler b/src/main/resources/META-INF/services/org.apache.sling.feature.cpconverter.handlers.EntryHandler
index b63a5d8..f75b920 100644
--- a/src/main/resources/META-INF/services/org.apache.sling.feature.cpconverter.handlers.EntryHandler
+++ b/src/main/resources/META-INF/services/org.apache.sling.feature.cpconverter.handlers.EntryHandler
@@ -6,5 +6,4 @@
org.apache.sling.feature.cpconverter.handlers.PrivilegesHandler
org.apache.sling.feature.cpconverter.handlers.PropertiesConfigurationEntryHandler
org.apache.sling.feature.cpconverter.handlers.RepPolicyEntryHandler
-org.apache.sling.feature.cpconverter.handlers.SystemUsersEntryHandler
org.apache.sling.feature.cpconverter.handlers.XmlConfigurationEntryHandler