Abstract
AEM Cloud Service : 2022.3.6582.20220307T234020Z-220100 (March 07, 2022)
System wise, for dam-users, when assetCategory metadata of an asset is RESTRICTED show it only when assetUsage is set to CALIFORNIA (so when assetUsage is set to TEXAS its hidden for dam-users)
1) Add the assetCategory restriction apps.experienceaem.assets.core.acls.EAEMAssetCategoryRestriction
package apps.experienceaem.assets.core.acls;
import org.apache.commons.lang3.StringUtils;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionPattern;
public class EAEMAssetCategoryRestriction implements RestrictionPattern {
private final String restrictedValue;
public static final String ASSET_CATEGORY = "assetCategory";
EAEMAssetCategoryRestriction(String restrictedValue) {
this.restrictedValue = restrictedValue;
}
public boolean matches(Tree tree, PropertyState propertyState) {
PropertyState property = tree.getChild(JcrConstants.JCR_CONTENT).getChild("metadata").getProperty(ASSET_CATEGORY);
if(property == null){
if(restrictedValue.equals("EMPTY")){
return true;
}
return false;
}
String value = property.getValue(Type.STRING);
if(restrictedValue.equals("EMPTY") && StringUtils.isEmpty(value)){
return true;
}
return restrictedValue.equalsIgnoreCase(value);
}
public boolean matches(String path) {
return false;
}
public boolean matches() {
return false;
}
}
2) Add the assetUsage restriction apps.experienceaem.assets.core.acls.EAEMAssetUsageRestriction
package apps.experienceaem.assets.core.acls;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionPattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EAEMAssetUsageRestriction implements RestrictionPattern {
private static final Logger log = LoggerFactory.getLogger(EAEMAssetUsageRestriction.class);
private final String usageValue;
public static final String ASSET_USAGE = "assetUsage";
EAEMAssetUsageRestriction(String usageValue) {
this.usageValue = usageValue;
}
public boolean matches(Tree tree, PropertyState propertyState) {
PropertyState property = tree.getChild(JcrConstants.JCR_CONTENT).getChild("metadata").getProperty(ASSET_USAGE);
if(property == null){
return false;
}
String value = property.getValue(Type.STRING);
return usageValue.equalsIgnoreCase(value);
}
public boolean matches(String path) {
return false;
}
public boolean matches() {
return false;
}
}
3) Add the restriction provider apps.experienceaem.assets.core.acls.EAEMRestrictionProvider
package apps.experienceaem.assets.core.acls;
import com.google.common.collect.ImmutableMap;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.spi.security.authorization.restriction.*;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Component(
service = RestrictionProvider.class
)
public class EAEMRestrictionProvider extends AbstractRestrictionProvider {
private static final Logger log = LoggerFactory.getLogger(EAEMRestrictionProvider.class);
public EAEMRestrictionProvider() {
super(supportedRestrictions());
}
private static Map<String, RestrictionDefinition> supportedRestrictions() {
RestrictionDefinition assetCategoryRes = new RestrictionDefinitionImpl(EAEMAssetCategoryRestriction.ASSET_CATEGORY,
Type.STRING, false);
RestrictionDefinition assetUsageRes = new RestrictionDefinitionImpl(EAEMAssetUsageRestriction.ASSET_USAGE,
Type.STRING, false);
return ImmutableMap.of(assetCategoryRes.getName(), assetCategoryRes, assetUsageRes.getName(), assetUsageRes);
}
@Override
public RestrictionPattern getPattern(String oakPath, Tree tree) {
if (oakPath == null) {
return RestrictionPattern.EMPTY;
} else {
List patterns = new ArrayList(2);
PropertyState assetCategoryProperty = tree.getProperty(EAEMAssetCategoryRestriction.ASSET_CATEGORY);
if (assetCategoryProperty != null) {
patterns.add(new EAEMAssetCategoryRestriction(assetCategoryProperty.getValue(Type.STRING)));
}
PropertyState assetUsageProperty = tree.getProperty(EAEMAssetUsageRestriction.ASSET_USAGE);
if (assetUsageProperty != null) {
patterns.add(new EAEMAssetUsageRestriction(assetUsageProperty.getValue(Type.STRING)));
}
return CompositePattern.create(patterns);
}
}
@Override
public RestrictionPattern getPattern(String oakPath, Set restrictions) {
if (oakPath == null || restrictions.isEmpty()) {
return RestrictionPattern.EMPTY;
} else {
List patterns = new ArrayList(2);
for (Restriction r : restrictions) {
String name = r.getDefinition().getName();
if (EAEMAssetCategoryRestriction.ASSET_CATEGORY.equals(name)) {
patterns.add(new EAEMAssetCategoryRestriction(r.getProperty().getValue(Type.STRING)));
}else if (EAEMAssetUsageRestriction.ASSET_USAGE.equals(name)) {
patterns.add(new EAEMAssetUsageRestriction(r.getProperty().getValue(Type.STRING)));
} else {
log.debug("Ignoring unsupported restriction " + name);
}
}
return CompositePattern.create(patterns);
}
}
}
Read Full Blog
Q&A
Please use this thread to ask the related questions.
Kautuk Sahni