blob: 6ac811f11161c51df534744ad16aadcbcc412f3a [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.
*
*/
/* $Id$ */
package org.apache.lenya.ac.impl;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.lenya.ac.AccessControlException;
import org.apache.lenya.ac.Accreditable;
import org.apache.lenya.ac.AccreditableManager;
import org.apache.lenya.ac.Credential;
import org.apache.lenya.ac.Identity;
import org.apache.lenya.ac.InheritingPolicyManager;
import org.apache.lenya.ac.Policy;
import org.apache.lenya.ac.Role;
/**
* A policy at a certain URL. The final policy is computed by merging the
* subtree policies of all ancestor-or-self directories with the URL policy of
* the actual URL.
*/
public class URLPolicy implements Policy {
/**
* Returns the resulting policy for a certain URL.
*
* @param controller
* The acccess controller.
* @param _url
* The URL.
* @param manager
* The policy manager.
*/
public URLPolicy(AccreditableManager controller, String _url,
InheritingPolicyManager manager) {
assert _url != null;
this.url = _url;
assert manager != null;
this.policyManager = manager;
assert controller != null;
this.accreditableManager = controller;
}
private String url;
private InheritingPolicyManager policyManager;
private AccreditableManager accreditableManager;
private Policy[] policies = null;
private Credential[] credentials = null;
/**
* Obtains the policies from the policy manager. This method is expensive
* and therefore only called when needed.
*
* @throws AccessControlException
* when something went wrong.
*/
protected void obtainPolicies() throws AccessControlException {
if (this.policies == null) {
this.policies = getPolicyManager().getPolicies(
getAccreditableManager(), getUrl());
}
}
/**
* Obtains the credentials from the policy manager. This method is expensive
* and therefore only called when needed.
*
* @throws AccessControlException
* when something went wrong.
*/
protected void obtainCredentials() throws AccessControlException {
if (this.credentials == null) {
this.credentials = getPolicyManager().getCredentials(
getAccreditableManager(), getUrl());
}
}
static final String[] VISITOR_ROLES = { "visitor", "visit" };
static final String[] ADMINISTRATOR_ROLES = { "administrator", "admin",
"organize" };
static final String[] AUTHOR_ROLES = { "author", "edit" };
/**
* @see org.apache.lenya.ac.Policy#check(org.apache.lenya.ac.Identity, org.apache.lenya.ac.Role)
* Iterate the policy tree bottom-up.
*/
public int check(Identity identity, Role role) throws AccessControlException {
obtainPolicies();
for (int i = 0; i < this.policies.length; i++) {
int result = this.policies[i].check(identity, role);
if (result == Policy.RESULT_GRANTED || result == Policy.RESULT_DENIED) {
return result;
}
}
return Policy.RESULT_NOT_MATCHED;
}
/**
* Returns the visitor role.
*
* @param manager
* The accreditable manager.
* @return A role.
* @throws AccessControlException
* when something went wrong.
*/
public static Role getVisitorRole(AccreditableManager manager)
throws AccessControlException {
Role visitorRole = null;
for (int i = 0; i < VISITOR_ROLES.length; i++) {
Role role = manager.getRoleManager().getRole(VISITOR_ROLES[i]);
if (role != null) {
visitorRole = role;
}
}
return visitorRole;
}
/**
* Returns the administrator role.
*
* @param manager
* The accreditable manager.
* @return A role.
* @throws AccessControlException
* when something went wrong.
*/
public static Role getAdministratorRole(AccreditableManager manager)
throws AccessControlException {
Role administratorRole = null;
for (int i = 0; i < ADMINISTRATOR_ROLES.length; i++) {
Role role = manager.getRoleManager()
.getRole(ADMINISTRATOR_ROLES[i]);
if (role != null) {
administratorRole = role;
}
}
return administratorRole;
}
/**
* Returns the author role.
*
* @param manager
* The accreditable manager.
* @return A role.
* @throws AccessControlException
* when something went wrong.
*/
public static Role getAuthorRole(AccreditableManager manager)
throws AccessControlException {
Role administratorRole = null;
for (int i = 0; i < AUTHOR_ROLES.length; i++) {
Role role = manager.getRoleManager().getRole(AUTHOR_ROLES[i]);
if (role != null) {
administratorRole = role;
}
}
return administratorRole;
}
/**
* Returns the URL of this policy.
*
* @return The URL of this policy.
*/
public String getUrl() {
return this.url;
}
/**
* Returns the policy builder.
*
* @return A policy builder.
*/
public InheritingPolicyManager getPolicyManager() {
return this.policyManager;
}
/**
* Returns the access controller.
*
* @return An access controller.
*/
public AccreditableManager getAccreditableManager() {
return this.accreditableManager;
}
/**
* The URL policy requires SSL protection if one of its member policies
* requires SSL protection.
*
* @see org.apache.lenya.ac.Policy#isSSLProtected()
*/
public boolean isSSLProtected() throws AccessControlException {
obtainPolicies();
boolean ssl = false;
int i = 0;
while (!ssl && i < this.policies.length) {
ssl = ssl || this.policies[i].isSSLProtected();
i++;
}
return ssl;
}
/**
* @see org.apache.lenya.ac.Policy#isEmpty()
*/
public boolean isEmpty() throws AccessControlException {
boolean empty = true;
int i = 0;
while (empty && i < this.policies.length) {
empty = empty && this.policies[i].isEmpty();
i++;
}
return empty;
}
public Credential[] getCredentials() throws AccessControlException {
obtainCredentials();
Set credentials = new LinkedHashSet();
for (int accrIndex = 0; accrIndex < this.credentials.length; accrIndex++) {
credentials.add(this.credentials[accrIndex]);
}
return (Credential[]) credentials.toArray(new Credential[credentials
.size()]);
}
public Credential[] getCredentials(Identity identity)
throws AccessControlException {
Accreditable[] accreditables = identity.getAccreditables();
Credential[] credentials = getCredentials();
Set returnCredential = new LinkedHashSet();
for (int credIndex = 0; credIndex < credentials.length; credIndex++) {
Credential credential = credentials[credIndex];
for (int accrIndex = 0; accrIndex < accreditables.length; accrIndex++) {
Accreditable accreditable = accreditables[accrIndex];
if (credential.getAccreditable().equals(accreditable)) {
returnCredential.add(credential);
}
}
}
return (Credential[]) returnCredential
.toArray(new Credential[returnCredential.size()]);
}
}