Author: anil.saldhana(a)jboss.com
Date: 2010-12-15 17:02:42 -0500 (Wed, 15 Dec 2010)
New Revision: 602
Added:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java
Modified:
federation/trunk/picketlink-fed-api/src/main/java/org/picketlink/identity/federation/api/saml/v2/metadata/KeyDescriptorMetaDataBuilder.java
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/md/providers/MetaDataBuilderDelegate.java
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLURIConstants.java
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/metadata/store/FileBasedMetadataConfigurationStore.java
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLAssertionWriter.java
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/idp-entitydescriptor.xml
federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java
federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/servlets/saml/MetadataServlet.java
Log:
further metadata writing
Modified:
federation/trunk/picketlink-fed-api/src/main/java/org/picketlink/identity/federation/api/saml/v2/metadata/KeyDescriptorMetaDataBuilder.java
===================================================================
---
federation/trunk/picketlink-fed-api/src/main/java/org/picketlink/identity/federation/api/saml/v2/metadata/KeyDescriptorMetaDataBuilder.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-api/src/main/java/org/picketlink/identity/federation/api/saml/v2/metadata/KeyDescriptorMetaDataBuilder.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -69,8 +69,9 @@
if(isEncryptionKey)
keyDescriptor.setUse(KeyTypes.ENCRYPTION);
- keyDescriptor.setKeyInfo(keyInfo);
+ throw new RuntimeException( "We need a dom element as key info" );
+ /*keyDescriptor.setKeyInfo(keyInfo);
- return keyDescriptor;
+ return keyDescriptor;*/
}
}
\ No newline at end of file
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -64,14 +64,10 @@
{
StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
StaxParserUtil.validate(startElement, EDT );
- EntityDescriptorType entityDescriptorType = new EntityDescriptorType();
Attribute entityID = startElement.getAttributeByName( new QName(
"entityID" ));
String entityIDValue = StaxParserUtil.getAttributeValue(entityID);
- if( entityIDValue != null )
- {
- entityDescriptorType.setEntityID(entityIDValue);
- }
+ EntityDescriptorType entityDescriptorType = new EntityDescriptorType( entityIDValue
);
//Get the Child Elements
while( xmlEventReader.hasNext() )
@@ -127,9 +123,16 @@
{
StartElement startElement = StaxParserUtil.getNextStartElement( xmlEventReader );
StaxParserUtil.validate(startElement, JBossSAMLConstants.IDP_SSO_DESCRIPTOR.get()
);
+
List<String> protocolEnum =
SAMLParserUtil.parseProtocolEnumeration(startElement);
IDPSSODescriptorType idpSSODescriptor = new IDPSSODescriptorType( protocolEnum );
+ Attribute wantAuthnSigned = startElement.getAttributeByName( new QName(
JBossSAMLConstants.WANT_AUTHN_REQUESTS_SIGNED.get() ) );
+ if( wantAuthnSigned != null )
+ {
+ idpSSODescriptor.setWantAuthnRequestsSigned( Boolean.parseBoolean(
StaxParserUtil.getAttributeValue( wantAuthnSigned )));
+ }
+
while( xmlEventReader.hasNext() )
{
XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
@@ -173,20 +176,8 @@
else if( JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get().equals( localPart ))
{
startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- Attribute bindingAttr = startElement.getAttributeByName( new QName(
JBossSAMLConstants.BINDING.get() ) );
- String binding = StaxParserUtil.getAttributeValue(bindingAttr);
+ EndpointType endpoint = getEndpointType(startElement);
- Attribute locationAttr = startElement.getAttributeByName( new QName(
JBossSAMLConstants.LOCATION.get() ) );
- String location = StaxParserUtil.getAttributeValue( locationAttr );
-
- EndpointType endpoint = new IndexedEndpointType( NetworkUtil.createURI(
binding ),
- NetworkUtil.createURI( location ));
- Attribute responseLocation = startElement.getAttributeByName( new QName(
JBossSAMLConstants.RESPONSE_LOCATION.get() ));
- if( responseLocation != null )
- {
- endpoint.setResponseLocation( NetworkUtil.createURI(
StaxParserUtil.getAttributeValue( responseLocation )));
- }
-
EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
StaxParserUtil.validate( endElement,
JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get() );
@@ -195,20 +186,8 @@
else if( JBossSAMLConstants.SINGLE_SIGNON_SERVICE.get().equals( localPart ))
{
startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- Attribute bindingAttr = startElement.getAttributeByName( new QName(
JBossSAMLConstants.BINDING.get() ) );
- String binding = StaxParserUtil.getAttributeValue(bindingAttr);
+ EndpointType endpoint = getEndpointType(startElement);
- Attribute locationAttr = startElement.getAttributeByName( new QName(
JBossSAMLConstants.LOCATION.get() ) );
- String location = StaxParserUtil.getAttributeValue( locationAttr );
-
- EndpointType endpoint = new IndexedEndpointType( NetworkUtil.createURI(
binding ),
- NetworkUtil.createURI( location ));
- Attribute responseLocation = startElement.getAttributeByName( new QName(
JBossSAMLConstants.RESPONSE_LOCATION.get() ));
- if( responseLocation != null )
- {
- endpoint.setResponseLocation( NetworkUtil.createURI(
StaxParserUtil.getAttributeValue( responseLocation )));
- }
-
EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
StaxParserUtil.validate( endElement,
JBossSAMLConstants.SINGLE_SIGNON_SERVICE.get() );
@@ -225,11 +204,28 @@
idpSSODescriptor.addAttribute(attribute);
}
else
- throw new RuntimeException( "Unknown " + localPart );
-
+ throw new RuntimeException( "Unknown " + localPart );
}
return idpSSODescriptor;
}
+
+ private EndpointType getEndpointType(StartElement startElement)
+ {
+ Attribute bindingAttr = startElement.getAttributeByName( new QName(
JBossSAMLConstants.BINDING.get() ) );
+ String binding = StaxParserUtil.getAttributeValue(bindingAttr);
+
+ Attribute locationAttr = startElement.getAttributeByName( new QName(
JBossSAMLConstants.LOCATION.get() ) );
+ String location = StaxParserUtil.getAttributeValue( locationAttr );
+
+ EndpointType endpoint = new IndexedEndpointType( NetworkUtil.createURI( binding ),
+ NetworkUtil.createURI( location ));
+ Attribute responseLocation = startElement.getAttributeByName( new QName(
JBossSAMLConstants.RESPONSE_LOCATION.get() ));
+ if( responseLocation != null )
+ {
+ endpoint.setResponseLocation( NetworkUtil.createURI(
StaxParserUtil.getAttributeValue( responseLocation )));
+ }
+ return endpoint;
+ }
private AttributeAuthorityDescriptorType parseAttributeAuthorityDescriptor(
XMLEventReader xmlEventReader ) throws ParsingException
{
@@ -316,19 +312,13 @@
if( JBossSAMLConstants.ORGANIZATION_NAME.get().equals( localPart ))
{
startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- Attribute lang = startElement.getAttributeByName( new QName(
JBossSAMLURIConstants.XML.get(), "lang" ));
- String langVal = StaxParserUtil.getAttributeValue(lang);
- LocalizedNameType localName = new LocalizedNameType(langVal);
- localName.setValue( StaxParserUtil.getElementText(xmlEventReader));
+ LocalizedNameType localName = getLocalizedName(xmlEventReader,
startElement);
org.addOrganizationName(localName);
}
else if( JBossSAMLConstants.ORGANIZATION_DISPLAY_NAME.get().equals( localPart
))
{
startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- Attribute lang = startElement.getAttributeByName( new QName(
JBossSAMLURIConstants.XML.get(), "lang" ));
- String langVal = StaxParserUtil.getAttributeValue(lang);
- LocalizedNameType localName = new LocalizedNameType(langVal);
- localName.setValue( StaxParserUtil.getElementText(xmlEventReader));
+ LocalizedNameType localName = getLocalizedName(xmlEventReader,
startElement);
org.addOrganizationDisplayName( localName ) ;
}
else if( JBossSAMLConstants.ORGANIZATION_URL.get().equals( localPart ))
@@ -341,9 +331,18 @@
org.addOrganizationURL( localName ) ;
}
else
- throw new RuntimeException( "Unknown " + localPart );
-
+ throw new RuntimeException( "Unknown " + localPart );
}
return org;
}
+
+ private LocalizedNameType getLocalizedName(XMLEventReader xmlEventReader, StartElement
startElement)
+ throws ParsingException
+ {
+ Attribute lang = startElement.getAttributeByName( new QName(
JBossSAMLURIConstants.XML.get(), "lang" ));
+ String langVal = StaxParserUtil.getAttributeValue(lang);
+ LocalizedNameType localName = new LocalizedNameType(langVal);
+ localName.setValue( StaxParserUtil.getElementText(xmlEventReader));
+ return localName;
+ }
}
\ No newline at end of file
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/md/providers/MetaDataBuilderDelegate.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/md/providers/MetaDataBuilderDelegate.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/md/providers/MetaDataBuilderDelegate.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -115,9 +115,10 @@
EDTChoiceType choiceType = new EDTChoiceType(edtList);
- EntityDescriptorType entity = new EntityDescriptorType();
+ throw new RuntimeException( "Unknown entity id" );
+ /*EntityDescriptorType entity = new EntityDescriptorType( " ");
entity.addChoiceType(choiceType);
- return entity;
+ return entity; */
}
/**
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -54,6 +54,7 @@
DESTINATION( "Destination" ),
ENCODING( "Encoding" ),
ENCRYPTED_ASSERTION( "EncryptedAssertion" ),
+ ENTITY_ID( "entityID" ),
ENTITY_DESCRIPTOR( "EntityDescriptor" ),
FORMAT( "Format" ),
FRIENDLY_NAME( "FriendlyName" ),
@@ -65,6 +66,7 @@
ISSUE_INSTANT( "IssueInstant" ),
ISSUER( "Issuer" ),
KEY_DESCRIPTOR( "KeyDescriptor" ),
+ LANG( "lang" ),
LANG_EN("en"),
LOCATION( "Location" ),
LOGOUT_REQUEST( "LogoutRequest" ),
@@ -107,6 +109,7 @@
VALUE( "Value" ),
VERSION( "Version" ),
VERSION_2_0("2.0"),
+ WANT_AUTHN_REQUESTS_SIGNED( "WantAuthnRequestsSigned" ),
HTTP_POST_BINDING("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST");
private String val;
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLURIConstants.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLURIConstants.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLURIConstants.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -45,6 +45,7 @@
HOLDER_OF_KEY( "urn:oasis:names:tc:SAML:2.0:cm:holder-of-key" ),
+ METADATA_NSURI( "urn:oasis:names:tc:SAML:2.0:metadata" ),
METADATA_HTTP_REDIRECT_BINDING("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"),
NAMEID_FORMAT_TRANSIENT("urn:oasis:names:tc:SAML:2.0:nameid-format:transient"),
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/metadata/store/FileBasedMetadataConfigurationStore.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/metadata/store/FileBasedMetadataConfigurationStore.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/metadata/store/FileBasedMetadataConfigurationStore.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -39,10 +39,14 @@
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
+import javax.xml.stream.XMLStreamWriter;
import org.apache.log4j.Logger;
import org.picketlink.identity.federation.core.constants.PicketLinkFederationConstants;
+import org.picketlink.identity.federation.core.exceptions.ProcessingException;
+import org.picketlink.identity.federation.core.saml.v2.writers.SAMLMetadataWriter;
import org.picketlink.identity.federation.core.util.JAXBUtil;
+import org.picketlink.identity.federation.core.util.StaxUtil;
import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
/**
@@ -192,13 +196,26 @@
*/
public void persist(EntityDescriptorType entity, String id) throws IOException
{
- /*boolean isIDP = false;
+ boolean isIDP = false;
boolean isSP = false;
File persistedFile = validateIdAndReturnMDFile(id);
- ObjectFactory of = new ObjectFactory();
+ try
+ {
+ XMLStreamWriter streamWriter = StaxUtil.getXMLStreamWriter( new
FileOutputStream( persistedFile ));
+ SAMLMetadataWriter writer = new SAMLMetadataWriter( streamWriter );
+
+ writer.writeEntityDescriptor(entity);
+ }
+ catch (ProcessingException e)
+ {
+ throw new RuntimeException( e );
+ }
+
+ /*ObjectFactory of = new ObjectFactory();
+
JAXBElement<?> jentity = of.createEntityDescriptor(entity);
Marshaller m;
@@ -212,11 +229,14 @@
IOException ioe =new IOException(e.getLocalizedMessage());
ioe.initCause(e);
throw ioe;
- }
+ }*/
if(trace) log.trace("Persisted into " + persistedFile.getPath());
+
+
+ throw new RuntimeException();
- //We need to figure out whether this is sp or idp from the entity data
- List<RoleDescriptorType> roleDescriptorTypes =
entity.getRoleDescriptorOrIDPSSODescriptorOrSPSSODescriptor();
+ /*//We need to figure out whether this is sp or idp from the entity data
+ List<RoleDescriptorType> roleDescriptorTypes =
entity..getRoleDescriptorOrIDPSSODescriptorOrSPSSODescriptor();
for( RoleDescriptorType rdt: roleDescriptorTypes )
{
if( rdt instanceof IDPSSODescriptorType )
@@ -238,9 +258,8 @@
else if( isIDP )
{
addIdentityProvider( id);
- }*/
-
- throw new RuntimeException();
+ }
+ */
}
/**
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -21,15 +21,23 @@
*/
package org.picketlink.identity.federation.core.saml.v2.writers;
+import static
org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants.ASSERTION_NSURI;
+
import java.net.URI;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamWriter;
import org.picketlink.identity.federation.core.exceptions.ProcessingException;
import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLConstants;
+import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants;
import org.picketlink.identity.federation.core.util.StaxUtil;
import org.picketlink.identity.federation.core.util.StringUtil;
+import org.picketlink.identity.federation.newmodel.saml.v2.assertion.AttributeType;
import org.picketlink.identity.federation.newmodel.saml.v2.assertion.NameIDType;
/**
@@ -93,4 +101,82 @@
StaxUtil.writeEndElement( writer);
StaxUtil.flush( writer );
}
+
+ /**
+ * Write an {@code AttributeType} to stream
+ *
+ * @param attributeType
+ * @param out
+ * @throws ProcessingException
+ */
+ public void write(AttributeType attributeType) throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, ASSERTION_PREFIX,
JBossSAMLConstants.ATTRIBUTE.get(), ASSERTION_NSURI.get());
+
+ String attributeName = attributeType.getName();
+ if (attributeName != null)
+ {
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME.get(), attributeName);
+ }
+
+ String friendlyName = attributeType.getFriendlyName();
+ if (StringUtil.isNotNull(friendlyName))
+ {
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.FRIENDLY_NAME.get(),
friendlyName);
+ }
+
+ String nameFormat = attributeType.getNameFormat();
+ if (StringUtil.isNotNull(nameFormat))
+ {
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME_FORMAT.get(),
nameFormat);
+ }
+
+ // Take care of other attributes such as x500:encoding
+ Map<QName, String> otherAttribs = attributeType.getOtherAttributes();
+ if (otherAttribs != null)
+ {
+ List<String> nameSpacesDealt = new ArrayList<String>();
+
+ Iterator<QName> keySet = otherAttribs.keySet().iterator();
+ while (keySet != null && keySet.hasNext())
+ {
+ QName qname = keySet.next();
+ String ns = qname.getNamespaceURI();
+ if (!nameSpacesDealt.contains(ns))
+ {
+ StaxUtil.writeNameSpace(writer, qname.getPrefix(), ns);
+ nameSpacesDealt.add(ns);
+ }
+ String attribValue = otherAttribs.get(qname);
+ StaxUtil.writeAttribute(writer, qname, attribValue);
+ }
+ }
+
+ List<Object> attributeValues = attributeType.getAttributeValue();
+ if (attributeValues != null)
+ {
+ for (Object attributeValue : attributeValues)
+ {
+ if (attributeValue instanceof String)
+ {
+ writeStringAttributeValue( (String) attributeValue );
+ }
+ else
+ throw new RuntimeException("Unsupported attribute value:" +
attributeValue.getClass().getName());
+ }
+ }
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeStringAttributeValue( String attributeValue ) throws
ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, ASSERTION_PREFIX,
JBossSAMLConstants.ATTRIBUTE_VALUE.get(), ASSERTION_NSURI.get());
+
+ StaxUtil.writeNameSpace(writer, "xsi",
JBossSAMLURIConstants.XSI_NSURI.get());
+ StaxUtil.writeNameSpace(writer, "xs",
JBossSAMLURIConstants.XMLSCHEMA_NSURI.get());
+ StaxUtil.writeAttribute(writer, JBossSAMLURIConstants.XSI_NSURI.get(),
"type", "xs:string");
+ StaxUtil.writeCharacters(writer, attributeValue );
+ StaxUtil.writeEndElement(writer);
+ }
}
\ No newline at end of file
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLAssertionWriter.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLAssertionWriter.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLAssertionWriter.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -20,10 +20,7 @@
import static
org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants.ASSERTION_NSURI;
import java.net.URI;
-import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import javax.xml.datatype.XMLGregorianCalendar;
@@ -32,7 +29,6 @@
import org.picketlink.identity.federation.core.exceptions.ProcessingException;
import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLConstants;
-import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants;
import org.picketlink.identity.federation.core.util.StaxUtil;
import org.picketlink.identity.federation.core.util.StringUtil;
import org.picketlink.identity.federation.core.wstrust.WSTrustConstants;
@@ -299,81 +295,8 @@
StaxUtil.flush(writer);
}
- /**
- * Write an {@code AttributeType} to stream
- *
- * @param attributeType
- * @param out
- * @throws ProcessingException
- */
- public void write(AttributeType attributeType) throws ProcessingException
- {
- StaxUtil.writeStartElement(writer, ASSERTION_PREFIX,
JBossSAMLConstants.ATTRIBUTE.get(), ASSERTION_NSURI.get());
+
- String attributeName = attributeType.getName();
- if (attributeName != null)
- {
- StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME.get(), attributeName);
- }
-
- String friendlyName = attributeType.getFriendlyName();
- if (StringUtil.isNotNull(friendlyName))
- {
- StaxUtil.writeAttribute(writer, JBossSAMLConstants.FRIENDLY_NAME.get(),
friendlyName);
- }
-
- String nameFormat = attributeType.getNameFormat();
- if (StringUtil.isNotNull(nameFormat))
- {
- StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME_FORMAT.get(),
nameFormat);
- }
-
- // Take care of other attributes such as x500:encoding
- Map<QName, String> otherAttribs = attributeType.getOtherAttributes();
- if (otherAttribs != null)
- {
- List<String> nameSpacesDealt = new ArrayList<String>();
-
- Iterator<QName> keySet = otherAttribs.keySet().iterator();
- while (keySet != null && keySet.hasNext())
- {
- QName qname = keySet.next();
- String ns = qname.getNamespaceURI();
- if (!nameSpacesDealt.contains(ns))
- {
- StaxUtil.writeNameSpace(writer, qname.getPrefix(), ns);
- nameSpacesDealt.add(ns);
- }
- String attribValue = otherAttribs.get(qname);
- StaxUtil.writeAttribute(writer, qname, attribValue);
- }
- }
-
- List<Object> attributeValues = attributeType.getAttributeValue();
- if (attributeValues != null)
- {
- for (Object attributeValue : attributeValues)
- {
- if (attributeValue instanceof String)
- {
- StaxUtil.writeStartElement(writer, ASSERTION_PREFIX,
JBossSAMLConstants.ATTRIBUTE_VALUE.get(),
- ASSERTION_NSURI.get());
-
- StaxUtil.writeNameSpace(writer, "xsi",
JBossSAMLURIConstants.XSI_NSURI.get());
- StaxUtil.writeNameSpace(writer, "xs",
JBossSAMLURIConstants.XMLSCHEMA_NSURI.get());
- StaxUtil.writeAttribute(writer, JBossSAMLURIConstants.XSI_NSURI.get(),
"type", "xs:string");
- StaxUtil.writeCharacters(writer, (String) attributeValue);
-
- StaxUtil.writeEndElement(writer);
- }
- else
- throw new RuntimeException("Unsupported attribute value:" +
attributeValue.getClass().getName());
- }
- }
- StaxUtil.writeEndElement(writer);
- StaxUtil.flush(writer);
- }
-
/**
* write an {@code SubjectType} to stream
*
Added:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java
(rev 0)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -0,0 +1,287 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.picketlink.identity.federation.core.saml.v2.writers;
+
+import static
org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants.METADATA_NSURI;
+
+import java.net.URI;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.picketlink.identity.federation.core.exceptions.ProcessingException;
+import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLConstants;
+import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants;
+import org.picketlink.identity.federation.core.util.StaxUtil;
+import org.picketlink.identity.federation.newmodel.saml.v2.assertion.AttributeType;
+import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.AttributeAuthorityDescriptorType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EndpointType;
+import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
+import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.IDPSSODescriptorType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.IndexedEndpointType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.KeyDescriptorType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedNameType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedURIType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.OrganizationType;
+import org.w3c.dom.Element;
+
+/**
+ * Write the SAML metadata elements
+ * @author Anil.Saldhana(a)redhat.com
+ * @since Dec 14, 2010
+ */
+public class SAMLMetadataWriter extends BaseWriter
+{
+ private String METADATA_PREFIX = "md";
+
+ public SAMLMetadataWriter(XMLStreamWriter writer) throws ProcessingException
+ {
+ super(writer);
+ }
+
+ public void writeEntityDescriptor( EntityDescriptorType entityDescriptor ) throws
ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ENTITY_DESCRIPTOR.get(), METADATA_NSURI.get());
+ StaxUtil.writeDefaultNameSpace(writer, JBossSAMLURIConstants.METADATA_NSURI.get()
);
+ StaxUtil.writeNameSpace(writer, "saml",
JBossSAMLURIConstants.ASSERTION_NSURI.get() );
+
+ StaxUtil.writeNameSpace(writer, "ds",
JBossSAMLURIConstants.XMLDSIG_NSURI.get() );
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.ENTITY_ID.get(),
entityDescriptor.getEntityID() );
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeIDPSSODescriptor( IDPSSODescriptorType idpSSODescriptor ) throws
ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.IDP_SSO_DESCRIPTOR.get(), METADATA_NSURI.get());
+
+ boolean wantsAuthnRequestsSigned = idpSSODescriptor.isWantAuthnRequestsSigned();
+ StaxUtil.writeAttribute(writer, new QName(
JBossSAMLConstants.WANT_AUTHN_REQUESTS_SIGNED.get() ), "" +
wantsAuthnRequestsSigned );
+
+ writeProtocolSupportEnumeration( idpSSODescriptor.getProtocolSupportEnumeration()
);
+
+ List<IndexedEndpointType> artifactResolutionServices =
idpSSODescriptor.getArtifactResolutionService();
+ for( IndexedEndpointType indexedEndpoint: artifactResolutionServices )
+ {
+ writeArtifactResolutionService( indexedEndpoint );
+ }
+
+ List<EndpointType> sloServices = idpSSODescriptor.getSingleLogoutService();
+ for( EndpointType endpoint: sloServices )
+ {
+ writeSingleLogoutService(endpoint);
+ }
+
+ List<EndpointType> ssoServices = idpSSODescriptor.getSingleSignOnService();
+ for( EndpointType endpoint: ssoServices )
+ {
+ writeSingleSignOnService( endpoint );
+ }
+
+ List<String> nameIDFormats = idpSSODescriptor.getNameIDFormat();
+ for( String nameIDFormat: nameIDFormats )
+ {
+ writeNameIDFormat( nameIDFormat );
+ }
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeAttributeAuthorityDescriptor( AttributeAuthorityDescriptorType
attributeAuthority ) throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ATTRIBUTE_AUTHORITY_DESCRIPTOR.get(),
+ METADATA_NSURI.get());
+
+ writeProtocolSupportEnumeration( attributeAuthority.getProtocolSupportEnumeration()
);
+
+ List<KeyDescriptorType> keyDescriptorList =
attributeAuthority.getKeyDescriptor();
+ for( KeyDescriptorType keyDescriptor: keyDescriptorList )
+ {
+ writeKeyDescriptor( keyDescriptor );
+ }
+
+ List<EndpointType> attributeServices =
attributeAuthority.getAttributeService();
+ for( EndpointType endpoint : attributeServices )
+ {
+ writeAttributeService( endpoint );
+ }
+
+ List<String> nameIDFormats = attributeAuthority.getNameIDFormat();
+ for( String nameIDFormat: nameIDFormats )
+ {
+ writeNameIDFormat( nameIDFormat );
+ }
+
+ List<AttributeType> attributes = attributeAuthority.getAttribute();
+ for( AttributeType attributeType: attributes )
+ {
+ write( attributeType );
+ }
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeArtifactResolutionService( IndexedEndpointType indexedEndpoint )
throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get(), METADATA_NSURI.get());
+
+ writeEndpointType( indexedEndpoint );
+
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.ISDEFAULT.get(), ""+
indexedEndpoint.isIsDefault() );
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.INDEX.get(), ""+
indexedEndpoint.getIndex() );
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeOrganization( OrganizationType org ) throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ORGANIZATION.get(),
+ METADATA_NSURI.get());
+
+ //Write the name
+ List<LocalizedNameType> nameList = org.getOrganizationName();
+ for( LocalizedNameType localName: nameList )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ORGANIZATION_NAME.get(),
+ METADATA_NSURI.get());
+
+ writeLocalizedType( localName );
+ }
+
+ //Write the display name
+ List<LocalizedNameType> displayNameList = org.getOrganizationDisplayName();
+ for( LocalizedNameType localName: displayNameList )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ORGANIZATION_DISPLAY_NAME.get(),
+ METADATA_NSURI.get());
+ writeLocalizedType( localName );
+ }
+
+ //Write the url
+ List<LocalizedURIType> uriList = org.getOrganizationURL();
+ for( LocalizedURIType uri: uriList )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ORGANIZATION_URL.get(),
+ METADATA_NSURI.get());
+
+ String lang = uri.getLang();
+ String val = uri.getValue().toString();
+ StaxUtil.writeAttribute(writer, new QName( JBossSAMLURIConstants.XML.get(),
JBossSAMLConstants.LANG.get(), "xml" ), lang );
+
+ StaxUtil.writeCharacters(writer, val );
+
+ StaxUtil.writeEndElement(writer);
+ }
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeKeyDescriptor( KeyDescriptorType keyDescriptor ) throws
ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.KEY_DESCRIPTOR.get(),
+ METADATA_NSURI.get());
+
+ Element keyInfo = keyDescriptor.getKeyInfo();
+ StaxUtil.writeDOMElement(writer, keyInfo);
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeAttributeService( EndpointType endpoint ) throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ATTRIBUTE_SERVICE.get(), METADATA_NSURI.get());
+
+ writeEndpointType( endpoint );
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeSingleLogoutService( EndpointType endpoint ) throws
ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get(), METADATA_NSURI.get());
+
+ writeEndpointType( endpoint );
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeSingleSignOnService( EndpointType endpoint ) throws
ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.SINGLE_SIGNON_SERVICE.get(), METADATA_NSURI.get());
+
+ writeEndpointType( endpoint );
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ private void writeProtocolSupportEnumeration( List<String> protoEnum ) throws
ProcessingException
+ {
+ if( protoEnum.size() > 0 )
+ {
+ StringBuilder sb = new StringBuilder();
+ for( String str: protoEnum )
+ {
+ sb.append(str).append(" ");
+ }
+
+ StaxUtil.writeAttribute(writer, new QName(
JBossSAMLConstants.PROTOCOL_SUPPORT_ENUMERATION.get() ), sb.toString().trim() );
+ }
+ }
+
+ private void writeEndpointType( EndpointType endpoint ) throws ProcessingException
+ {
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.BINDING.get(),
endpoint.getBinding().toString() );
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.LOCATION.get(),
endpoint.getLocation().toString() );
+
+ URI responseLocation = endpoint.getResponseLocation();
+ if( responseLocation != null )
+ {
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.RESPONSE_LOCATION.get(),
responseLocation.toString() );
+ }
+ }
+
+ private void writeLocalizedType( LocalizedNameType localName ) throws
ProcessingException
+ {
+ String lang = localName.getLang();
+ String val = localName.getValue();
+ StaxUtil.writeAttribute(writer, new QName( JBossSAMLURIConstants.XML.get(),
JBossSAMLConstants.LANG.get(), "xml" ), lang );
+
+ StaxUtil.writeCharacters(writer, val );
+
+ StaxUtil.writeEndElement(writer);
+ }
+
+ private void writeNameIDFormat( String nameIDFormat ) throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.NAMEID_FORMAT.get(), METADATA_NSURI.get());
+
+ StaxUtil.writeCharacters(writer, nameIDFormat );
+ StaxUtil.writeEndElement(writer);
+ }
+}
\ No newline at end of file
Modified:
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/idp-entitydescriptor.xml
===================================================================
---
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/idp-entitydescriptor.xml 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/idp-entitydescriptor.xml 2010-12-15
22:02:42 UTC (rev 602)
@@ -64,7 +64,8 @@
</AttributeAuthorityDescriptor>
- <Organization><OrganizationName xml:lang="en">Example
+ <Organization>
+ <OrganizationName xml:lang="en">Example
Organization, Ltd.
</OrganizationName>
<OrganizationDisplayName xml:lang="en">Example
Modified:
federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java
===================================================================
---
federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -162,6 +162,10 @@
protected String id;
+ public EntityDescriptorType( String entityID )
+ {
+ this.entityID = entityID;
+ }
/**
* Gets the value of the signature property.
@@ -298,18 +302,6 @@
}
/**
- * Sets the value of the entityID property.
- *
- * @param value
- * allowed object is
- * {@link String }
- *
- */
- public void setEntityID(String value) {
- this.entityID = value;
- }
-
- /**
* Gets the value of the validUntil property.
*
* @return
Modified:
federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/servlets/saml/MetadataServlet.java
===================================================================
---
federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/servlets/saml/MetadataServlet.java 2010-12-14
23:10:57 UTC (rev 601)
+++
federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/servlets/saml/MetadataServlet.java 2010-12-15
22:02:42 UTC (rev 602)
@@ -193,7 +193,7 @@
private void updateKeyDescriptor(EntityDescriptorType entityD, KeyDescriptorType
keyD)
{
- List<EDTDescriptorChoiceType> objs =
entityD.getChoiceType().getDescriptors();
+ List<EDTDescriptorChoiceType> objs =
entityD.getChoiceType().get(0).getDescriptors();
if(objs != null)
{
for(EDTDescriptorChoiceType roleD: objs)