PermissionPredicateEvaluator.java 2.81 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.UnsupportedRepositoryOperationException
 *  javax.jcr.query.Row
 *  javax.jcr.security.AccessControlManager
 *  javax.jcr.security.Privilege
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.search.eval;

import com.day.cq.search.Predicate;
import com.day.cq.search.eval.AbstractPredicateEvaluator;
import com.day.cq.search.eval.EvaluationContext;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.query.Row;
import javax.jcr.security.AccessControlManager;
import javax.jcr.security.Privilege;
import org.apache.felix.scr.annotations.Component;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0, factory="com.day.cq.search.eval.PredicateEvaluator/hasPermission")
public class PermissionPredicateEvaluator
extends AbstractPredicateEvaluator {
    public static final String HAS_PERMISSION_PREDICATE = "hasPermission";
    private static final Logger log = LoggerFactory.getLogger(PermissionPredicateEvaluator.class);

    @Override
    public boolean includes(Predicate p, Row row, EvaluationContext context) {
        if (!p.hasNonEmptyValue("hasPermission")) {
            return true;
        }
        try {
            ResourceResolver resolver = context.getResourceResolver();
            Session session = (Session)resolver.adaptTo(Session.class);
            AccessControlManager acm = session.getAccessControlManager();
            Resource resource = context.getResource(row);
            String[] permissions = p.get("hasPermission").split(",");
            Privilege[] privileges = new Privilege[permissions.length];
            for (int i = 0; i < permissions.length; ++i) {
                privileges[i] = acm.privilegeFromName(permissions[i]);
            }
            return acm.hasPrivileges(resource.getPath(), privileges);
        }
        catch (UnsupportedRepositoryOperationException e) {
            log.error("Exception occured while evaluating hasPermission predicate", (Throwable)e);
        }
        catch (RepositoryException e) {
            log.error("Exception occured while evaluating hasPermission predicate", (Throwable)e);
        }
        return false;
    }

    @Override
    public boolean canXpath(Predicate predicate, EvaluationContext context) {
        return false;
    }

    @Override
    public boolean canFilter(Predicate predicate, EvaluationContext context) {
        return true;
    }
}