/**
* Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016
*
* 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 it.infn.cnaf.voms.saml;
import it.infn.cnaf.voms.aa.VOMSAttributes;
import it.infn.cnaf.voms.aa.VOMSFQAN;
import it.infn.cnaf.voms.aa.VOMSGenericAttribute;
import it.infn.cnaf.voms.saml.emi.AttributeWizard;
import java.util.ArrayList;
import java.util.List;
import org.glite.security.voms.admin.configuration.VOMSConfiguration;
import org.opensaml.Configuration;
import org.opensaml.saml2.core.Attribute;
import org.opensaml.saml2.core.AttributeValue;
import org.opensaml.saml2.core.impl.AttributeBuilder;
import org.opensaml.xml.XMLObjectBuilderFactory;
import org.opensaml.xml.schema.XSString;
import org.opensaml.xml.schema.impl.XSStringBuilder;
/**
*
* @author Andrea Ceccanti
* @author Valerio Venturi
*
*/
public class SAMLAttributeSerializer {
public static final String ATTRIBUTE_NAME_FORMAT = Attribute.URI_REFERENCE;
public static final String FQAN_ATTRIBUTE_NAME = "http://voms.forge.cnaf.infn.it/fqan";
public static final String AUTHZ_INTEROP_FQAN_ATTRIBUTE_NAME = "http://authz-interop.org/xacml/subject/voms-fqan";
static Attribute serializeFQAN(List<VOMSFQAN> fqans) {
XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory();
AttributeBuilder attributeBuilder = (AttributeBuilder) builderFactory
.getBuilder(Attribute.DEFAULT_ELEMENT_NAME);
Attribute fqansAttribute = attributeBuilder.buildObject();
fqansAttribute.setName(AUTHZ_INTEROP_FQAN_ATTRIBUTE_NAME);
fqansAttribute.setNameFormat(ATTRIBUTE_NAME_FORMAT);
XSStringBuilder attributeValueBuilder = (XSStringBuilder) builderFactory
.getBuilder(XSString.TYPE_NAME);
for (VOMSFQAN fqan : fqans) {
XSString attributeValue = attributeValueBuilder.buildObject(
AttributeValue.DEFAULT_ELEMENT_NAME, XSString.TYPE_NAME);
attributeValue.setValue(fqan.getFQAN());
fqansAttribute.getAttributeValues().add(attributeValue);
}
return fqansAttribute;
}
static Attribute serializeGenericAttribute(
VOMSGenericAttribute genericAttribute) {
XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory();
AttributeBuilder attributeBuilder = (AttributeBuilder) builderFactory
.getBuilder(Attribute.DEFAULT_ELEMENT_NAME);
Attribute gaAttribute = attributeBuilder.buildObject();
// FIXME: find out a non-naive format for generic attributes names
gaAttribute.setName(genericAttribute.getName());
gaAttribute.setNameFormat(ATTRIBUTE_NAME_FORMAT);
XSStringBuilder attributeValueBuilder = (XSStringBuilder) builderFactory
.getBuilder(XSString.TYPE_NAME);
XSString attributeValue = attributeValueBuilder.buildObject(
AttributeValue.DEFAULT_ELEMENT_NAME, XSString.TYPE_NAME);
// FIXME: gracefully forgot the context...
attributeValue.setValue(genericAttribute.getValue());
gaAttribute.getAttributeValues().add(attributeValue);
return gaAttribute;
}
public static List<Attribute> serializeAllAttributes(VOMSAttributes attributes) {
assert attributes != null : "Cannot serialize a NULL attribute!";
List<Attribute> vomsSAMLAttributes = new ArrayList<Attribute>();
// EMI profile
String voName = VOMSConfiguration.instance().getVOName();
vomsSAMLAttributes.add(AttributeWizard.createVOAttribute(voName));
vomsSAMLAttributes.add(AttributeWizard.createGroupAttribute(attributes
.getFqans()));
// Find primary group
for (VOMSFQAN f : attributes.getFqans()) {
if (f.isGroup()) {
vomsSAMLAttributes.add(AttributeWizard.createPrimaryGroupAttribute(f));
break;
}
}
vomsSAMLAttributes.add(AttributeWizard.createRoleAttribute(attributes
.getFqans()));
// Find primary role
for (VOMSFQAN f : attributes.getFqans()) {
if (f.isRole()) {
vomsSAMLAttributes.add(AttributeWizard.createPrimaryRoleAttribute(f));
break;
}
}
// Serialize FQANs
vomsSAMLAttributes.add(serializeFQAN(attributes.getFqans()));
// Serialized Generic Attributes
for (VOMSGenericAttribute ga : attributes.getGenericAttributes())
vomsSAMLAttributes.add(serializeGenericAttribute(ga));
return vomsSAMLAttributes;
}
}