/*
* Copyright (c) Members of the EGEE Collaboration. 2006-2010.
* See http://www.eu-egee.org/partners/ for details on the copyright holders.
*
* Licensed 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.glite.authz.pep.pip.provider;
import java.util.ArrayList;
import java.util.Arrays;
import org.glite.authz.common.config.ConfigurationException;
import org.glite.authz.common.model.Attribute;
import org.glite.authz.common.profile.CommonXACMLAuthorizationProfileConstants;
import org.glite.authz.common.util.Strings;
import org.glite.authz.pep.pip.PolicyInformationPoint;
import org.glite.voms.PKIStore;
import org.ini4j.Ini;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The PIP applies to request which have a profile identifier
* {@value CommonXACMLAuthorizationProfileConstants#ID_ATTRIBUTE_PROFILE_ID}
* defined in the request environment. By default accept all profile identifier
* values, but a list (space separated) of accepted profile identifier values
* can be specified in the ini config file with the
* {@value #ACCEPTED_PROFILE_IDS_PROP} property.
* <p>
* A policy information point that extracts information from a X.509, version 3,
* certificate. The certificate may include VOMS attribute certificates. All
* extract information is added to the subject(s) containing a valid certificate
* chain.
* <p>
*
* The base64 encoded end-entity certificate, and its certificate chain, are
* expected to be bound to the subject attribute
* {@value Attribute#ID_SUB_KEY_INFO} with a datatype of
* {@value Attribute#DT_BASE64_BINARY}.
*
* Only one end-entity certificate may be present in the chain. If the end
* entity certificate contains a VOMS attribute certificate, and VOMS
* certificate validation is enabled, information from that attribute
* certificate will also be added to the subject. Only one VOMS attribute
* certificate may be present in the end-entity certificate.
*
* @see <a href="https://twiki.cnaf.infn.it/cgi-bin/twiki/view/VOMS">VOMS
* website</a>
*/
public class CommonXACMLAuthorizationProfilePIPIniConfigurationParser extends
AbstractX509PIPIniConfigurationParser {
/** Class logger. */
private Logger log= LoggerFactory.getLogger(CommonXACMLAuthorizationProfilePIPIniConfigurationParser.class);
/**
* The name of the {@value} property to define the accepted Grid
* Authorization Profile ID to process.
*/
protected static String ACCEPTED_PROFILE_IDS_PROP= "acceptedProfileIDs";
/** {@inheritDoc} */
protected PolicyInformationPoint buildInformationPoint(Ini.Section iniConfig,
boolean requireProxy, PKIStore trustMaterial,
PKIStore acTrustMaterial, boolean performPKIXValidation)
throws ConfigurationException {
String pipId= iniConfig.getName();
// read accepted profile IDs from config
String[] acceptedProfileIds= parseValuesList(iniConfig.get(ACCEPTED_PROFILE_IDS_PROP));
if (acceptedProfileIds != null && acceptedProfileIds.length > 0) {
log.info("{}: accepted profile IDs: {}",
pipId,
Arrays.toString(acceptedProfileIds));
}
else {
log.info("{}: accepted profile IDs: all", pipId);
}
CommonXACMLAuthorizationProfilePIP pip= new CommonXACMLAuthorizationProfilePIP(pipId,
requireProxy,
trustMaterial,
acTrustMaterial,
performPKIXValidation,
acceptedProfileIds);
return pip;
}
/**
* Parses a space delimited list of values.
*
* @param valuesList
* space delimited list of values, may be <code>null</code>.
*
* @return array of values or <code>null</code> if valuesList is
* <code>null</code>
*/
protected String[] parseValuesList(String valuesList) {
if (valuesList == null) {
return null;
}
ArrayList<String> values= new ArrayList<String>();
for (String value : valuesList.split(" ")) {
String trimmedValue= Strings.safeTrimOrNullString(value);
if (trimmedValue != null) {
values.add(trimmedValue);
}
}
return values.toArray(new String[values.size()]);
}
}