in src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java [111:178]
public Resource getReadableResource(final Resource resource) {
Resource returnValue = null;
final Iterator<ResourceAccessGateHandler> accessGateHandlers = getMatchingResourceAccessGateHandlerIterator(
resource.getPath(), ResourceAccessGate.Operation.READ);
GateResult finalGateResult = null;
List<ResourceAccessGate> accessGatesForReadValues = null;
boolean canReadAllValues = false;
if ( accessGateHandlers != null ) {
boolean noGateMatched = true;
while ( accessGateHandlers.hasNext() ) {
noGateMatched = false;
final ResourceAccessGateHandler resourceAccessGateHandler = accessGateHandlers.next();
final GateResult gateResult = !resourceAccessGateHandler
.getResourceAccessGate().hasReadRestrictions(resource.getResourceResolver()) ? GateResult.GRANTED
: resourceAccessGateHandler.getResourceAccessGate()
.canRead(resource);
if (!canReadAllValues && gateResult == GateResult.GRANTED) {
if (resourceAccessGateHandler.getResourceAccessGate().canReadAllValues(resource)) {
canReadAllValues = true;
accessGatesForReadValues = null;
} else {
if (accessGatesForReadValues == null) {
accessGatesForReadValues = new ArrayList<>();
}
accessGatesForReadValues.add(resourceAccessGateHandler.getResourceAccessGate());
}
}
if (finalGateResult == null || finalGateResult == GateResult.DENIED) {
finalGateResult = gateResult;
}
// stop checking if the operation is final and the result not GateResult.CANT_DECIDE
if (gateResult != GateResult.CANT_DECIDE && resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.READ)) {
break;
}
}
// return null if access is denied or no ResourceAccessGate is present
if (finalGateResult == GateResult.DENIED) {
returnValue = null;
} else if (finalGateResult == GateResult.GRANTED ) {
returnValue = resource;
} else if (noGateMatched && this.defaultAllowIfNoGateMatches)
{
returnValue = resource;
}
}
boolean canUpdateResource = canUpdate(resource);
// wrap Resource if read access is not or partly (values) not granted
if (returnValue != null) {
if( !canReadAllValues || !canUpdateResource ) {
returnValue = new AccessGateResourceWrapper(returnValue,
accessGatesForReadValues,
canUpdateResource);
}
}
return returnValue;
}