blob: 0d8c313e0028e1bce93aecd4283acd5569125e66 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.api.security;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.annotation.versioning.ProviderType;
/**
* The <code>ResourceAccessSecurity</code> defines a service API which is
* used in two different context: for securing resource providers which
* have no own access control and on the application level to further
* restrict the access to resources in general.
*
* A resource access security service is registered with the service
* property {@link #CONTEXT}. Allowed values are {@link #APPLICATION_CONTEXT}
* and {@link #PROVIDER_CONTEXT}. If the value is missing or invalid,
* the service will be ignored.
*
* In the context of resource providers, this service might be used
* for implementations of resource providers where the underlying persistence
* layer does not implement access control. The goal is to make it easy to implement
* a lightweight access control for such providers. For example, a JCR resource
* providers should *not* use the provider context resource access security - in a
* JCR context, security is fully delegated to the underlying repository, and
* mixing security models would be a bad idea.
*
* In the context of the application, this service might be used to add
* additional or temporary constraints across the whole resource tree.
*
* It is expected to only have a single service per context in the
* framework/application (much like the OSGi LogService or ConfigurationAdmin Service).
* In the case of multiple services per context, the one with the highest
* service ranking is used.
*/
@ProviderType
public interface ResourceAccessSecurity {
/**
* The name of the service registration property containing the context
* of this service. Allowed values are {@link #APPLICATION_CONTEXT} and
* {@link #PROVIDER_CONTEXT}.
* This property is required and has no default value.
* (value is "access.context")
*/
String CONTEXT = "access.context";
/**
* Allowed value for the {@link #CONTEXT} service registration property.
* Services marked with this context are applied to all resources.
*/
String APPLICATION_CONTEXT = "application";
/**
* Allowed value for the {@link #CONTEXT} service registration property.
* Services marked with this context are only applied to resource
* providers which indicate the additional checks with the
* {@link org.apache.sling.api.resource.ResourceProvider#USE_RESOURCE_ACCESS_SECURITY}
* property.
*/
String PROVIDER_CONTEXT = "provider";
/**
* If supplied Resource can be read, return it (or a wrapped
* variant of it). The returned Resource should then be used
* instead of the one that was passed into the method.
* @param resource The resource to test.
* @return null if {@link Resource} cannot be read
*/
@CheckForNull Resource getReadableResource(Resource resource);
/**
* Check whether a resource can be created at the path.
* @param absPathName The path to create
* @param resourceResolver The resource resolver
* @return true if a {@link Resource} can be created at the supplied
* absolute path.
*/
boolean canCreate(@Nonnull String absPathName, @Nonnull ResourceResolver resourceResolver);
/**
* Check whether a resource can be updated at the path.
* @param resource The resource to test.
* @return true if supplied {@link Resource} can be updated
*/
boolean canUpdate(@Nonnull Resource resource);
/**
* Check whether a resource can be deleted at the path.
* @param resource The resource to test.
* @return true if supplied {@link Resource} can be deleted
*/
boolean canDelete(@Nonnull Resource resource);
/**
* Check whether a resource can be executed at the path.
* @param resource The resource to test.
* @return true if supplied {@link Resource} can be executed as a script
*/
boolean canExecute(@Nonnull Resource resource);
/**
* Check whether a value can be read
* @param resource The resource to test.
* @param valueName The name of the value
* @return true if the "valueName" value of supplied {@link Resource} can be read
*/
boolean canReadValue(@Nonnull Resource resource, @Nonnull String valueName);
/**
* Check whether a value can be set
* @param resource The resource to test.
* @param valueName The name of the value
* @return true if the "valueName" value of supplied {@link Resource} can be set
*/
boolean canSetValue(@Nonnull Resource resource, @Nonnull String valueName);
/**
* Check whether a value can be deleted
* @param resource The resource to test.
* @param valueName The name of the value
* @return true if the "valueName" value of supplied {@link Resource} can be deleted
*/
boolean canDeleteValue(@Nonnull Resource resource, @Nonnull String valueName);
/**
* Optionally transform a query based on the current
* user's credentials. Can be used to narrow down queries to omit results
* that the current user is not allowed to see anyway, to speed up
* downstream access control.
*
* Query transformations are not critical with respect to access control as results
* are filtered downstream using the canRead.. methods.
*
* @param query the query
* @param language the language in which the query is expressed
* @param resourceResolver the resource resolver which resolves the query
* @return the transformed query
* @throws AccessSecurityException If access is denied
*/
@Nonnull String transformQuery(@Nonnull String query, @Nonnull String language, @Nonnull ResourceResolver resourceResolver)
throws AccessSecurityException;
}