/**
* 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.emi;
import it.infn.cnaf.voms.aa.VOMSFQAN;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import org.glite.security.voms.admin.util.PathNamingScheme;
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.XMLObject;
import org.opensaml.xml.XMLObjectBuilderFactory;
import org.opensaml.xml.schema.XSAny;
import org.opensaml.xml.schema.XSString;
import org.opensaml.xml.schema.impl.XSAnyBuilder;
import org.opensaml.xml.schema.impl.XSStringBuilder;
public class AttributeWizard {
public static final QName ROLE_XSD_TYPE = new QName(
EMISAMLProfileConstants.DCI_SEC_NS, EMISAMLProfileConstants.DCI_SEC_ROLE,
EMISAMLProfileConstants.DCI_SEC_PREFIX);
public static final QName VO_XSD_TYPE = new QName(
EMISAMLProfileConstants.DCI_SEC_NS, EMISAMLProfileConstants.DCI_SEC_VO,
EMISAMLProfileConstants.DCI_SEC_PREFIX);
public static final QName SCOPE_XSD_ATTRIBUTE = new QName(
EMISAMLProfileConstants.DCI_SEC_NS, EMISAMLProfileConstants.DCI_SEC_SCOPE,
EMISAMLProfileConstants.DCI_SEC_PREFIX);
public static Attribute createAttribute(String attributeName) {
XMLObjectBuilderFactory bf = Configuration.getBuilderFactory();
AttributeBuilder attributeBuilder = (AttributeBuilder) bf
.getBuilder(Attribute.DEFAULT_ELEMENT_NAME);
Attribute attr = attributeBuilder.buildObject();
attr.setName(attributeName);
attr.setNameFormat(EMISAMLProfileConstants.ATTRIBUTE_NAME_FORMAT);
return attr;
}
public static XSAny createAttributeValue(QName type, String value) {
XMLObjectBuilderFactory bf = Configuration.getBuilderFactory();
XSAnyBuilder builder = (XSAnyBuilder) bf.getBuilder(XSAny.TYPE_NAME);
XSAny attrVal = builder.buildObject(AttributeValue.DEFAULT_ELEMENT_NAME,
type);
attrVal.setTextContent(value);
return attrVal;
}
public static XSString createStringAttributeValue(String value) {
XMLObjectBuilderFactory bf = Configuration.getBuilderFactory();
XSStringBuilder builder = (XSStringBuilder) bf
.getBuilder(XSString.TYPE_NAME);
XSString attrVal = builder.buildObject(AttributeValue.DEFAULT_ELEMENT_NAME,
XSString.TYPE_NAME);
attrVal.setValue(value);
return attrVal;
}
public static XSAny createRoleAttributeValue(String fqan) {
String role = PathNamingScheme.getRoleName(fqan);
String group = PathNamingScheme.getGroupName(fqan);
XSAny roleAttrVal = createAttributeValue(ROLE_XSD_TYPE, role);
roleAttrVal.getUnknownAttributes().put(SCOPE_XSD_ATTRIBUTE, group);
return roleAttrVal;
}
public static Attribute createGroupAttributeFromStrings(List<String> fqans) {
Attribute groupAttr = createAttribute(EMISAMLProfileConstants.GROUP_ATTRIBUTE_NAME);
for (String f : fqans)
groupAttr.getAttributeValues().add(createStringAttributeValue(f));
return groupAttr;
}
public static Attribute createGroupAttribute(List<VOMSFQAN> fqans) {
Attribute groupAttr = createAttribute(EMISAMLProfileConstants.GROUP_ATTRIBUTE_NAME);
for (VOMSFQAN f : fqans) {
if (f.isGroup())
groupAttr.getAttributeValues().add(
createStringAttributeValue(f.getFQAN()));
}
return groupAttr;
}
public static Attribute createPrimaryGroupAttributeFromString(String fqan) {
Attribute pGroupAttr = createAttribute(EMISAMLProfileConstants.PRIMARY_GROUP_ATTRIBUTE_NAME);
if (fqan != null)
pGroupAttr.getAttributeValues().add(createStringAttributeValue(fqan));
return pGroupAttr;
}
public static Attribute createPrimaryGroupAttribute(VOMSFQAN fqan) {
Attribute pGroupAttr = createAttribute(EMISAMLProfileConstants.PRIMARY_GROUP_ATTRIBUTE_NAME);
if (fqan.isGroup())
pGroupAttr.getAttributeValues().add(
createStringAttributeValue(fqan.getFQAN()));
return pGroupAttr;
}
public static List<String> attributeToListOfStrings(Attribute attr) {
List<String> result = new ArrayList<String>();
List<XMLObject> attributeValues = attr.getAttributeValues();
for (XMLObject o : attributeValues) {
XSString stringContent = (XSString) o;
result.add(stringContent.getValue());
}
return result;
}
public static List<String> roleAttributeToFQAN(Attribute roleAttr) {
List<String> result = new ArrayList<String>();
if (!roleAttr.getName().equals(EMISAMLProfileConstants.ROLE_ATTRIBUTE_NAME)
&& !roleAttr.getName().equals(
EMISAMLProfileConstants.PRIMARY_ROLE_ATTRIBUTE_NAME))
throw new IllegalArgumentException("Unsupported attribute name: "
+ roleAttr.getName());
List<XMLObject> attributeValues = roleAttr.getAttributeValues();
for (XMLObject o : attributeValues) {
XSAny roleContent = (XSAny) o;
String roleName = roleContent.getTextContent();
QName scopeAttributeName = new QName(EMISAMLProfileConstants.DCI_SEC_NS,
EMISAMLProfileConstants.DCI_SEC_SCOPE);
String groupScope = roleContent.getUnknownAttributes().get(
scopeAttributeName);
if (groupScope == null)
continue;
String roleFQAN = String.format("%s/Role=%s", groupScope, roleName);
// How to fetch the attributes here?
result.add(roleFQAN);
}
return result;
}
public static Attribute createRoleAttributeFromStrings(List<String> fqans) {
Attribute roleAttr = createAttribute(EMISAMLProfileConstants.ROLE_ATTRIBUTE_NAME);
for (String f : fqans) {
if (PathNamingScheme.isQualifiedRole(f))
roleAttr.getAttributeValues().add(createRoleAttributeValue(f));
}
return roleAttr;
}
public static Attribute createRoleAttribute(List<VOMSFQAN> fqans) {
Attribute roleAttr = createAttribute(EMISAMLProfileConstants.ROLE_ATTRIBUTE_NAME);
for (VOMSFQAN f : fqans) {
if (f.isRole())
roleAttr.getAttributeValues()
.add(createRoleAttributeValue(f.getFQAN()));
}
return roleAttr;
}
public static Attribute createPrimaryRoleAttributeFromString(String fqan) {
Attribute pRoleAttr = createAttribute(EMISAMLProfileConstants.PRIMARY_ROLE_ATTRIBUTE_NAME);
if (fqan != null && PathNamingScheme.isQualifiedRole(fqan))
pRoleAttr.getAttributeValues().add(createRoleAttributeValue(fqan));
return pRoleAttr;
}
public static Attribute createPrimaryRoleAttribute(VOMSFQAN fqan) {
Attribute pRoleAttr = createAttribute(EMISAMLProfileConstants.PRIMARY_ROLE_ATTRIBUTE_NAME);
if (fqan.isRole())
pRoleAttr.getAttributeValues().add(
createRoleAttributeValue(fqan.getFQAN()));
return pRoleAttr;
}
public static Attribute createVOAttribute(String voName) {
Attribute voAttr = createAttribute(EMISAMLProfileConstants.VO_ATTRIBUTE_NAME);
voAttr.getAttributeValues().add(createStringAttributeValue(voName));
return voAttr;
}
}