Author: anil.saldhana(a)jboss.com
Date: 2011-02-11 15:08:03 -0500 (Fri, 11 Feb 2011)
New Revision: 749
Added:
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java
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/util/SAMLParserUtil.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/util/XMLTimeUtil.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/SAMLMetadataWriter.java
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescriptor.xml
Log:
some more metadata parsing and writing
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 2011-02-10
17:03:12 UTC (rev 748)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java 2011-02-11
20:08:03 UTC (rev 749)
@@ -36,9 +36,11 @@
import org.picketlink.identity.federation.core.parsers.util.SAMLParserUtil;
import org.picketlink.identity.federation.core.parsers.util.StaxParserUtil;
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.saml.v2.constants.JBossSAMLURIConstants;
+import org.picketlink.identity.federation.core.saml.v2.util.XMLTimeUtil;
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.AttributeConsumingServiceType;
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.EntityDescriptorType.EDTChoiceType;
@@ -50,6 +52,8 @@
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.picketlink.identity.federation.newmodel.saml.v2.metadata.RequestedAttributeType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.SPSSODescriptorType;
import org.w3c.dom.Element;
/**
@@ -66,10 +70,29 @@
StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
StaxParserUtil.validate(startElement, EDT );
- Attribute entityID = startElement.getAttributeByName( new QName(
"entityID" ));
+ Attribute entityID = startElement.getAttributeByName( new QName(
JBossSAMLConstants.ENTITY_ID.get() ));
String entityIDValue = StaxParserUtil.getAttributeValue(entityID);
EntityDescriptorType entityDescriptorType = new EntityDescriptorType( entityIDValue
);
+ Attribute validUntil = startElement.getAttributeByName( new QName(
JBossSAMLConstants.VALID_UNTIL.get() ));
+ if( validUntil != null )
+ {
+ String validUntilValue = StaxParserUtil.getAttributeValue(validUntil);
+ entityDescriptorType.setValidUntil( XMLTimeUtil.parse(validUntilValue));
+ }
+
+ Attribute id = startElement.getAttributeByName( new QName(
JBossSAMLConstants.ID.get() ));
+ if( id != null )
+ {
+ entityDescriptorType.setID( StaxParserUtil.getAttributeValue(id));
+ }
+
+ Attribute cacheDuration = startElement.getAttributeByName( new QName(
JBossSAMLConstants.CACHE_DURATION.get() ));
+ if( cacheDuration != null )
+ {
+ entityDescriptorType.setCacheDuration( XMLTimeUtil.parseAsDuration(
StaxParserUtil.getAttributeValue( cacheDuration )) );
+ }
+
//Get the Child Elements
while( xmlEventReader.hasNext() )
{
@@ -91,6 +114,14 @@
EDTChoiceType edtChoice = EDTChoiceType.oneValue( edtDescChoice );
entityDescriptorType.addChoiceType(edtChoice);
}
+ else if( JBossSAMLConstants.SP_SSO_DESCRIPTOR.get().equals( localPart ))
+ {
+ SPSSODescriptorType spSSO = parseSPSSODescriptor(xmlEventReader);
+
+ EDTDescriptorChoiceType edtDescChoice = new EDTDescriptorChoiceType( spSSO
);
+ EDTChoiceType edtChoice = EDTChoiceType.oneValue( edtDescChoice );
+ entityDescriptorType.addChoiceType(edtChoice);
+ }
else if( JBossSAMLConstants.ATTRIBUTE_AUTHORITY_DESCRIPTOR.get().equals(
localPart ))
{
AttributeAuthorityDescriptorType attrAuthority =
parseAttributeAuthorityDescriptor( xmlEventReader );
@@ -120,6 +151,99 @@
&& localPart.equals( JBossSAMLConstants.ENTITY_DESCRIPTOR.get() );
}
+
+ private SPSSODescriptorType parseSPSSODescriptor( XMLEventReader xmlEventReader )
throws ParsingException
+ {
+ StartElement startElement = StaxParserUtil.getNextStartElement( xmlEventReader );
+ StaxParserUtil.validate(startElement, JBossSAMLConstants.SP_SSO_DESCRIPTOR.get()
);
+
+ List<String> protocolEnum =
SAMLParserUtil.parseProtocolEnumeration(startElement);
+ SPSSODescriptorType spSSODescriptor = new SPSSODescriptorType( protocolEnum );
+
+ Attribute wantAssertionsSigned = startElement.getAttributeByName( new QName(
JBossSAMLConstants.WANT_ASSERTIONS_SIGNED.get() ) );
+ if( wantAssertionsSigned != null )
+ {
+ spSSODescriptor.setWantAssertionsSigned( Boolean.parseBoolean(
StaxParserUtil.getAttributeValue( wantAssertionsSigned )));
+ }
+ Attribute wantAuthnSigned = startElement.getAttributeByName( new QName(
JBossSAMLConstants.AUTHN_REQUESTS_SIGNED.get() ) );
+ if( wantAuthnSigned != null )
+ {
+ spSSODescriptor.setAuthnRequestsSigned( Boolean.parseBoolean(
StaxParserUtil.getAttributeValue( wantAuthnSigned )));
+ }
+
+ while( xmlEventReader.hasNext() )
+ {
+ XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+ if( xmlEvent instanceof EndElement )
+ {
+ EndElement end = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate( end , JBossSAMLConstants.SP_SSO_DESCRIPTOR.get() );
+ break;
+ }
+
+ startElement = (StartElement) xmlEvent;
+ String localPart = startElement.getName().getLocalPart();
+
+ if( JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get().equals( localPart ))
+ {
+ IndexedEndpointType endpoint = parseArtifactResolutionService(xmlEventReader,
startElement);
+ spSSODescriptor.addArtifactResolutionService(endpoint);
+ }
+ else if( JBossSAMLConstants.ASSERTION_CONSUMER_SERVICE.get().equals( localPart
))
+ {
+ IndexedEndpointType endpoint = parseAssertionConsumerService( xmlEventReader,
startElement);
+ spSSODescriptor.addAssertionConsumerService( endpoint );
+ }
+ else if( JBossSAMLConstants.ATTRIBUTE_CONSUMING_SERVICE.get().equals( localPart
))
+ {
+ AttributeConsumingServiceType attributeConsumer =
parseAttributeConsumingService(xmlEventReader, startElement);
+ spSSODescriptor.addAttributeConsumerService(attributeConsumer);
+ }
+ else if( JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ EndpointType endpoint = getEndpointType(startElement);
+
+ EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate( endElement,
JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get() );
+
+ spSSODescriptor.addSingleLogoutService( endpoint );
+ }
+ else if( JBossSAMLConstants.MANAGE_NAMEID_SERVICE.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ EndpointType endpoint = getEndpointType(startElement);
+
+ EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate( endElement,
JBossSAMLConstants.MANAGE_NAMEID_SERVICE.get() );
+
+ spSSODescriptor.addManageNameIDService( endpoint );
+ }
+ else if (JBossSAMLConstants.NAMEID_FORMAT.get().equalsIgnoreCase( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ spSSODescriptor.addNameIDFormat(
StaxParserUtil.getElementText(xmlEventReader) );
+ }
+ else if (JBossSAMLConstants.KEY_DESCRIPTOR.get().equalsIgnoreCase( localPart ))
+ {
+ KeyDescriptorType keyDescriptor = new KeyDescriptorType();
+ String use = StaxParserUtil.getAttributeValue(startElement, "use"
);
+ if( use != null )
+ keyDescriptor.setUse( KeyTypes.fromValue(use) );
+
+ Element key = StaxParserUtil.getDOMElement(xmlEventReader);
+ keyDescriptor.setKeyInfo(key);
+ spSSODescriptor.addKeyDescriptor(keyDescriptor);
+ }
+ else
+ throw new RuntimeException( "Unknown " + localPart );
+ }
+ return spSSODescriptor;
+ }
+
+
+
+
private IDPSSODescriptorType parseIDPSSODescriptor( XMLEventReader xmlEventReader )
throws ParsingException
{
StartElement startElement = StaxParserUtil.getNextStartElement( xmlEventReader );
@@ -149,29 +273,7 @@
if( JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get().equals( localPart ))
{
- startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- 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 );
-
- IndexedEndpointType endpoint = new IndexedEndpointType( URI.create( binding
),
- URI.create( location ));
- Attribute isDefault = startElement.getAttributeByName( new QName(
JBossSAMLConstants.ISDEFAULT.get() ));
- if( isDefault != null )
- {
- endpoint.setIsDefault( Boolean.parseBoolean(
StaxParserUtil.getAttributeValue( isDefault )));
- }
- Attribute index = startElement.getAttributeByName( new QName(
JBossSAMLConstants.INDEX.get() ));
- if( index != null )
- {
- endpoint.setIndex( Integer.parseInt( StaxParserUtil.getAttributeValue(
index )));
- }
-
- EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
- StaxParserUtil.validate( endElement,
JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get() );
-
+ IndexedEndpointType endpoint = parseArtifactResolutionService(xmlEventReader,
startElement);
idpSSODescriptor.addArtifactResolutionService(endpoint);
}
else if( JBossSAMLConstants.ASSERTION_ID_REQUEST_SERVICE.get().equals( localPart
))
@@ -386,4 +488,116 @@
localName.setValue( StaxParserUtil.getElementText(xmlEventReader));
return localName;
}
+
+ private IndexedEndpointType parseAssertionConsumerService( XMLEventReader
xmlEventReader, StartElement startElement ) throws ParsingException
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ IndexedEndpointType endpoint = parseIndexedEndpoint(xmlEventReader, startElement);
+
+ EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate( endElement,
JBossSAMLConstants.ASSERTION_CONSUMER_SERVICE.get() );
+
+ return endpoint;
+ }
+
+ private IndexedEndpointType parseArtifactResolutionService( XMLEventReader
xmlEventReader, StartElement startElement ) throws ParsingException
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ IndexedEndpointType endpoint = parseIndexedEndpoint(xmlEventReader, startElement);
+
+ EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate( endElement,
JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get() );
+
+ return endpoint;
+ }
+
+ private IndexedEndpointType parseIndexedEndpoint( XMLEventReader xmlEventReader,
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 );
+
+ IndexedEndpointType endpoint = new IndexedEndpointType( URI.create( binding ),
+ URI.create( location ));
+ Attribute isDefault = startElement.getAttributeByName( new QName(
JBossSAMLConstants.ISDEFAULT.get() ));
+ if( isDefault != null )
+ {
+ endpoint.setIsDefault( Boolean.parseBoolean( StaxParserUtil.getAttributeValue(
isDefault )));
+ }
+ Attribute index = startElement.getAttributeByName( new QName(
JBossSAMLConstants.INDEX.get() ));
+ if( index != null )
+ {
+ endpoint.setIndex( Integer.parseInt( StaxParserUtil.getAttributeValue( index
)));
+ }
+ return endpoint;
+ }
+
+ private AttributeConsumingServiceType parseAttributeConsumingService( XMLEventReader
xmlEventReader, StartElement startElement ) throws ParsingException
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+
+ Attribute indexAttr = startElement.getAttributeByName( new QName(
JBossSAMLConstants.INDEX.get() ) );
+ if( indexAttr == null )
+ throw new ParsingException( "attribute index required" );
+
+ AttributeConsumingServiceType attributeConsumer = new
AttributeConsumingServiceType( Integer.parseInt(
StaxParserUtil.getAttributeValue(indexAttr)));
+ while( xmlEventReader.hasNext() )
+ {
+ XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+ if( xmlEvent instanceof EndElement )
+ {
+ EndElement end = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate( end ,
JBossSAMLConstants.ATTRIBUTE_CONSUMING_SERVICE.get() );
+ break;
+ }
+
+ startElement = (StartElement) xmlEvent;
+ String localPart = startElement.getName().getLocalPart();
+
+ if( JBossSAMLConstants.SERVICE_NAME.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ LocalizedNameType localName = getLocalizedName(xmlEventReader,
startElement);
+ attributeConsumer.addServiceName(localName);
+ }
+ else if( JBossSAMLConstants.SERVICE_DESCRIPTION.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ LocalizedNameType localName = getLocalizedName(xmlEventReader,
startElement);
+ attributeConsumer.addServiceDescription(localName);
+ }
+ else if( JBossSAMLConstants.REQUESTED_ATTRIBUTE.get().equals( localPart ))
+ {
+ RequestedAttributeType attType = parseRequestedAttributeType(xmlEventReader,
startElement);
+ attributeConsumer.addRequestedAttribute(attType);
+ }
+ else
+ throw new RuntimeException( "Unknown " + localPart );
+ }
+
+ return attributeConsumer;
+ }
+
+ private RequestedAttributeType parseRequestedAttributeType( XMLEventReader
xmlEventReader, StartElement startElement ) throws ParsingException
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ StaxParserUtil.validate( startElement, JBossSAMLConstants.REQUESTED_ATTRIBUTE.get()
);
+ RequestedAttributeType attributeType = null;
+
+ Attribute name = startElement.getAttributeByName( new QName(
JBossSAMLConstants.NAME.get() ));
+ if( name == null )
+ throw new RuntimeException( "Required attribute Name in Attribute" );
+ attributeType = new RequestedAttributeType( StaxParserUtil.getAttributeValue( name
));
+
+ Attribute isRequired = startElement.getAttributeByName( new QName(
JBossSAMLConstants.IS_REQUIRED.get() ));
+ if( isRequired != null )
+ {
+ attributeType.setIsRequired( Boolean.parseBoolean(
StaxParserUtil.getAttributeValue(isRequired) ));
+ }
+
+ SAMLParserUtil.parseAttributeType(xmlEventReader, startElement,
JBossSAMLConstants.REQUESTED_ATTRIBUTE.get(), attributeType);
+ return attributeType;
+ }
}
\ No newline at end of file
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAMLParserUtil.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAMLParserUtil.java 2011-02-10
17:03:12 UTC (rev 748)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAMLParserUtil.java 2011-02-11
20:08:03 UTC (rev 749)
@@ -107,8 +107,11 @@
if( name == null )
throw new RuntimeException( "Required attribute Name in Attribute" );
attributeType = new AttributeType( StaxParserUtil.getAttributeValue( name ));
+
+ parseAttributeType(xmlEventReader, startElement,
JBossSAMLConstants.ATTRIBUTE.get(), attributeType);
+
- //Look for X500 Encoding
+ /*//Look for X500 Encoding
QName x500EncodingName = new QName( JBossSAMLURIConstants.X500_NSURI.get(),
JBossSAMLConstants.ENCODING.get(), JBossSAMLURIConstants.X500_PREFIX.get()
);
Attribute x500EncodingAttr = startElement.getAttributeByName( x500EncodingName );
@@ -150,12 +153,64 @@
attributeType.addAttributeValue( attributeValue );
}
else throw new RuntimeException( "Unknown tag:" + tag );
- }
+ }*/
return attributeType;
}
/**
+ * Parse an {@code AttributeType}
+ * @param xmlEventReader
+ * @throws ParsingException
+ */
+ public static void parseAttributeType( XMLEventReader xmlEventReader,
+ StartElement startElement, String rootTag, AttributeType attributeType ) throws
ParsingException
+ {
+ //Look for X500 Encoding
+ QName x500EncodingName = new QName( JBossSAMLURIConstants.X500_NSURI.get(),
+ JBossSAMLConstants.ENCODING.get(), JBossSAMLURIConstants.X500_PREFIX.get()
);
+ Attribute x500EncodingAttr = startElement.getAttributeByName( x500EncodingName );
+
+ if( x500EncodingAttr != null )
+ {
+ attributeType.getOtherAttributes().put( x500EncodingAttr.getName(),
StaxParserUtil.getAttributeValue( x500EncodingAttr ));
+ }
+
+ Attribute friendlyName = startElement.getAttributeByName( new QName(
JBossSAMLConstants.FRIENDLY_NAME.get() ));
+ if( friendlyName != null )
+ attributeType.setFriendlyName( StaxParserUtil.getAttributeValue( friendlyName
));
+
+ Attribute nameFormat = startElement.getAttributeByName( new QName(
JBossSAMLConstants.NAME_FORMAT.get() ));
+ if( nameFormat != null )
+ attributeType.setNameFormat( StaxParserUtil.getAttributeValue( nameFormat ));
+
+ while( xmlEventReader.hasNext() )
+ {
+ XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+ if( xmlEvent instanceof EndElement )
+ {
+ EndElement end = StaxParserUtil.getNextEndElement(xmlEventReader);
+ if( StaxParserUtil.matches( end, rootTag ))
+ break;
+ }
+ startElement = StaxParserUtil.peekNextStartElement(xmlEventReader);
+ if( startElement == null )
+ break;
+ String tag = StaxParserUtil.getStartElementName(startElement);
+
+ if( JBossSAMLConstants.ATTRIBUTE.get().equals( tag ))
+ break;
+
+ if( JBossSAMLConstants.ATTRIBUTE_VALUE.get().equals( tag ) )
+ {
+ Object attributeValue = parseAttributeValue(xmlEventReader);
+ attributeType.addAttributeValue( attributeValue );
+ }
+ else throw new RuntimeException( "Unknown tag:" + tag );
+ }
+ }
+
+ /**
* Parse Attribute value
* @param xmlEventReader
* @return
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 2011-02-10
17:03:12 UTC (rev 748)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java 2011-02-11
20:08:03 UTC (rev 749)
@@ -32,10 +32,12 @@
ALLOW_CREATE( "AllowCreate" ),
ARTIFACT_RESOLUTION_SERVICE( "ArtifactResolutionService" ),
ASSERTION( "Assertion" ),
+ ASSERTION_CONSUMER_SERVICE( "AssertionConsumerService" ),
ASSERTION_CONSUMER_SERVICE_URL( "AssertionConsumerServiceURL" ),
ASSERTION_ID_REQUEST_SERVICE( "AssertionIDRequestService" ),
ATTRIBUTE( "Attribute" ),
ATTRIBUTE_AUTHORITY_DESCRIPTOR( "AttributeAuthorityDescriptor" ),
+ ATTRIBUTE_CONSUMING_SERVICE( "AttributeConsumingService" ),
ATTRIBUTE_SERVICE( "AttributeService" ),
ATTRIBUTE_STATEMENT( "AttributeStatement" ),
ATTRIBUTE_VALUE( "AttributeValue" ),
@@ -49,7 +51,9 @@
AUTHN_INSTANT( "AuthnInstant" ),
AUTHN_REQUEST( "AuthnRequest" ),
AUTHN_STATEMENT( "AuthnStatement" ),
+ AUTHN_REQUESTS_SIGNED( "AuthnRequestsSigned" ),
BINDING( "Binding" ),
+ CACHE_DURATION( "cacheDuration" ),
CONDITIONS( "Conditions" ),
CONSENT( "Consent" ),
DESTINATION( "Destination" ),
@@ -66,6 +70,7 @@
INPUT_CONTEXT_ONLY( "InputContextOnly" ),
IN_RESPONSE_TO( "InResponseTo" ),
ISDEFAULT( "isDefault" ),
+ IS_REQUIRED( "isRequired" ),
ISSUE_INSTANT( "IssueInstant" ),
ISSUER( "Issuer" ),
KEY_DESCRIPTOR( "KeyDescriptor" ),
@@ -95,13 +100,17 @@
REQUESTED_AUTHN_CONTEXT( "RequestedAuthnContext" ),
RECIPIENT( "Recipient" ),
REQUEST( "Request" ),
+ REQUESTED_ATTRIBUTE( "RequestedAttribute" ),
REQUEST_ABSTRACT( "RequestAbstract" ),
RESPONSE( "Response" ),
RESPONSE_LOCATION( "ResponseLocation" ),
RETURN_CONTEXT( "ReturnContext" ),
SESSION_INDEX( "SessionIndex" ),
+ SERVICE_NAME( "ServiceName" ),
+ SERVICE_DESCRIPTION( "ServiceDescription" ),
SP_PROVIDED_ID( "SPProvidedID" ),
SP_NAME_QUALIFIER( "SPNameQualifier" ),
+ SP_SSO_DESCRIPTOR( "SPSSODescriptor" ),
SIGNATURE( "Signature" ),
SIGNATURE_SHA1_WITH_DSA("http://www.w3.org/2000/09/xmldsig#dsa-sha1&...,
SIGNATURE_SHA1_WITH_RSA("http://www.w3.org/2000/09/xmldsig#rsa-sha1&...,
@@ -117,10 +126,13 @@
SUBJECT_CONFIRMATION( "SubjectConfirmation" ),
SUBJECT_CONFIRMATION_DATA( "SubjectConfirmationData" ),
TYPE( "type" ),
+ USE( "use" ),
VALUE( "Value" ),
+ VALID_UNTIL( "validUntil" ),
VERSION( "Version" ),
VERSION_2_0("2.0"),
WANT_AUTHN_REQUESTS_SIGNED( "WantAuthnRequestsSigned" ),
+ WANT_ASSERTIONS_SIGNED( "WantAssertionsSigned" ),
XACML_AUTHZ_DECISION_QUERY( "XACMLAuthzDecisionQuery" ),
XACML_AUTHZ_DECISION_QUERY_TYPE( "XACMLAuthzDecisionQueryType" ),
XACML_AUTHZ_DECISION_STATEMENT_TYPE( "XACMLAuthzDecisionStatementType" ),
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/util/XMLTimeUtil.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/util/XMLTimeUtil.java 2011-02-10
17:03:12 UTC (rev 748)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/util/XMLTimeUtil.java 2011-02-11
20:08:03 UTC (rev 749)
@@ -152,6 +152,26 @@
}
/**
+ * Given a string, get the Duration object
+ * @param timeValue
+ * @return
+ * @throws ParsingException
+ */
+ public static Duration parseAsDuration( String timeValue ) throws ParsingException
+ {
+ DatatypeFactory factory = null;
+ try
+ {
+ factory = DatatypeFactory.newInstance();
+ }
+ catch (DatatypeConfigurationException e)
+ {
+ throw new ParsingException( e );
+ }
+ return factory.newDuration( Long.parseLong(timeValue));
+ }
+
+ /**
* Given a string representing xml time, parse into {@code XMLGregorianCalendar}
* @param timeString
* @return
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 2011-02-10
17:03:12 UTC (rev 748)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java 2011-02-11
20:08:03 UTC (rev 749)
@@ -39,6 +39,7 @@
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;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedNameType;
/**
* Base Class for the Stax writers for SAML
@@ -116,6 +117,14 @@
{
StaxUtil.writeStartElement(writer, ASSERTION_PREFIX,
JBossSAMLConstants.ATTRIBUTE.get(), ASSERTION_NSURI.get());
+ writeAttributeTypeWithoutRootTag(attributeType);
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeAttributeTypeWithoutRootTag( AttributeType attributeType ) throws
ProcessingException
+ {
String attributeName = attributeType.getName();
if (attributeName != null)
{
@@ -168,8 +177,6 @@
throw new RuntimeException("Unsupported attribute value:" +
attributeValue.getClass().getName());
}
}
- StaxUtil.writeEndElement(writer);
- StaxUtil.flush(writer);
}
public void writeStringAttributeValue( String attributeValue ) throws
ProcessingException
@@ -182,4 +189,14 @@
StaxUtil.writeCharacters(writer, attributeValue );
StaxUtil.writeEndElement(writer);
}
+
+
+
+ public void writeLocalizedNameType( LocalizedNameType localizedNameType, QName
startElement ) throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, startElement.getPrefix(),
startElement.getLocalPart(), startElement.getNamespaceURI() );
+ StaxUtil.writeAttribute(writer, new QName( JBossSAMLURIConstants.XML.get(),
"lang", "xml" ), localizedNameType.getLang() );
+ StaxUtil.writeCharacters(writer, localizedNameType.getValue() );
+ 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/SAMLMetadataWriter.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java 2011-02-10
17:03:12 UTC (rev 748)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java 2011-02-11
20:08:03 UTC (rev 749)
@@ -36,6 +36,7 @@
import org.picketlink.identity.federation.newmodel.saml.v2.assertion.AttributeType;
import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.AffiliationDescriptorType;
import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.AttributeAuthorityDescriptorType;
+import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.AttributeConsumingServiceType;
import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.AuthnAuthorityDescriptorType;
import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EndpointType;
import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
@@ -44,9 +45,11 @@
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.KeyTypes;
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.picketlink.identity.federation.newmodel.saml.v2.metadata.RequestedAttributeType;
import org.picketlink.identity.federation.newmodel.saml.v2.metadata.SPSSODescriptorType;
import org.picketlink.identity.federation.newmodel.saml.v2.metadata.SSODescriptorType;
import org.w3c.dom.Element;
@@ -74,6 +77,14 @@
StaxUtil.writeNameSpace(writer, "ds",
JBossSAMLURIConstants.XMLDSIG_NSURI.get() );
StaxUtil.writeAttribute(writer, JBossSAMLConstants.ENTITY_ID.get(),
entityDescriptor.getEntityID() );
+ if( entityDescriptor.getValidUntil() != null )
+ {
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.VALID_UNTIL.get(),
entityDescriptor.getValidUntil().toString() );
+ }
+ if( entityDescriptor.getID() != null )
+ {
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.ID.get(),
entityDescriptor.getID() );
+ }
List<EDTChoiceType> choiceTypes = entityDescriptor.getChoiceType();
for( EDTChoiceType edtChoice : choiceTypes )
@@ -91,7 +102,7 @@
SPSSODescriptorType spSSO = edtDescChoice.getSpDescriptor();
if( spSSO != null )
- throw new RuntimeException( "NYI" );
+ write( spSSO );
AttributeAuthorityDescriptorType attribAuth =
edtDescChoice.getAttribDescriptor();
if( attribAuth != null )
@@ -102,6 +113,8 @@
throw new RuntimeException( "NYI" );
}
}
+ OrganizationType organization = entityDescriptor.getOrganization();
+ writeOrganization(organization);
StaxUtil.writeEndElement(writer);
StaxUtil.flush(writer);
@@ -111,9 +124,53 @@
{
throw new RuntimeException( "should not called" );
}
+
public void write( SPSSODescriptorType spSSODescriptor ) throws ProcessingException
{
- throw new RuntimeException( "NYI" );
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.SP_SSO_DESCRIPTOR.get(), METADATA_NSURI.get());
+ StaxUtil.writeAttribute(writer, new QName(
JBossSAMLConstants.PROTOCOL_SUPPORT_ENUMERATION.get())
+ , spSSODescriptor.getProtocolSupportEnumeration().get(0) );
+
+ //Get the key descriptors
+ List<KeyDescriptorType> keyDescriptors = spSSODescriptor.getKeyDescriptor();
+ for( KeyDescriptorType keyDescriptor :keyDescriptors )
+ {
+ writeKeyDescriptor(keyDescriptor);
+ }
+
+ List<EndpointType> sloServices = spSSODescriptor.getSingleLogoutService();
+ for( EndpointType endpoint: sloServices )
+ {
+ writeSingleLogoutService(endpoint);
+ }
+
+
+ List<IndexedEndpointType> artifactResolutions =
spSSODescriptor.getArtifactResolutionService();
+ for( IndexedEndpointType artifactResolution: artifactResolutions )
+ {
+ writeArtifactResolutionService( artifactResolution );
+ }
+
+ List<String> nameIDFormats = spSSODescriptor.getNameIDFormat();
+ for( String nameIDFormat : nameIDFormats )
+ {
+ writeNameIDFormat(nameIDFormat);
+ }
+
+ List<IndexedEndpointType> assertionConsumers =
spSSODescriptor.getAssertionConsumerService();
+ for( IndexedEndpointType assertionConsumer: assertionConsumers )
+ {
+ writeAssertionConsumerService( assertionConsumer );
+ }
+
+ List<AttributeConsumingServiceType> attributeConsumers =
spSSODescriptor.getAttributeConsumingService();
+ for( AttributeConsumingServiceType attributeConsumer : attributeConsumers )
+ {
+ writeAttributeConsumingService(attributeConsumer);
+ }
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
}
public void write( IDPSSODescriptorType idpSSODescriptor ) throws ProcessingException
@@ -197,13 +254,65 @@
{
StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get(), METADATA_NSURI.get());
+ writeIndexedEndpointType(indexedEndpoint);
+ }
+
+ public void writeAssertionConsumerService( IndexedEndpointType indexedEndpoint )
throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ASSERTION_CONSUMER_SERVICE.get(), METADATA_NSURI.get());
+ writeIndexedEndpointType(indexedEndpoint);
+ }
+
+ public void writeIndexedEndpointType( IndexedEndpointType indexedEndpoint ) throws
ProcessingException
+ {
writeEndpointType( indexedEndpoint );
+ if( indexedEndpoint.isIsDefault() != null )
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.ISDEFAULT.get(),
""+ indexedEndpoint.isIsDefault() );
+
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.INDEX.get(), ""+
indexedEndpoint.getIndex() );
+
+ StaxUtil.writeEndElement(writer);
+ StaxUtil.flush(writer);
+ }
+
+ public void writeAttributeConsumingService( AttributeConsumingServiceType
attributeConsumer ) throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.ATTRIBUTE_CONSUMING_SERVICE.get(), METADATA_NSURI.get());
+
- StaxUtil.writeAttribute(writer, JBossSAMLConstants.ISDEFAULT.get(), ""+
indexedEndpoint.isIsDefault() );
- StaxUtil.writeAttribute(writer, JBossSAMLConstants.INDEX.get(), ""+
indexedEndpoint.getIndex() );
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.ISDEFAULT.get(), ""+
attributeConsumer.isIsDefault() );
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.INDEX.get(), ""+
attributeConsumer.getIndex() );
+ //Service Name
+ List<LocalizedNameType> serviceNames = attributeConsumer.getServiceName();
+ for( LocalizedNameType serviceName: serviceNames )
+ {
+ writeLocalizedNameType( serviceName, new QName(METADATA_NSURI.get(),
JBossSAMLConstants.SERVICE_NAME.get(),
+ METADATA_PREFIX ));
+ }
+
+ List<LocalizedNameType> serviceDescriptions =
attributeConsumer.getServiceDescription();
+ for( LocalizedNameType serviceDescription: serviceDescriptions )
+ {
+ writeLocalizedNameType( serviceDescription, new QName(METADATA_NSURI.get(),
JBossSAMLConstants.SERVICE_DESCRIPTION.get(),
+ METADATA_PREFIX ));
+ }
+
+ List<RequestedAttributeType> requestedAttributes =
attributeConsumer.getRequestedAttribute();
+ for( RequestedAttributeType requestedAttribute : requestedAttributes )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.REQUESTED_ATTRIBUTE.get(), METADATA_NSURI.get());
+ Boolean isRequired = requestedAttribute.isIsRequired();
+ if( isRequired != null )
+ {
+ StaxUtil.writeAttribute(writer, new QName(
JBossSAMLConstants.IS_REQUIRED.get()), isRequired.toString() );
+ }
+ writeAttributeTypeWithoutRootTag(requestedAttribute);
+ StaxUtil.writeEndElement(writer);
+ }
+
StaxUtil.writeEndElement(writer);
- StaxUtil.flush(writer);
+ StaxUtil.flush(writer);
}
public void writeOrganization( OrganizationType org ) throws ProcessingException
@@ -255,6 +364,10 @@
StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.KEY_DESCRIPTOR.get(),
METADATA_NSURI.get());
+ KeyTypes keyTypes = keyDescriptor.getUse();
+ if( keyTypes != null )
+ StaxUtil.writeAttribute(writer, new QName( JBossSAMLConstants.USE.get()),
keyTypes.toString() );
+
Element keyInfo = keyDescriptor.getKeyInfo();
StaxUtil.writeDOMElement(writer, keyInfo);
StaxUtil.writeEndElement(writer);
Added:
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java
(rev 0)
+++
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java 2011-02-11
20:08:03 UTC (rev 749)
@@ -0,0 +1,65 @@
+/*
+ * 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.test.identity.federation.core.saml.v2.metadata;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.xml.stream.XMLStreamWriter;
+
+import org.junit.Test;
+import org.picketlink.identity.federation.core.parsers.saml.SAMLParser;
+import org.picketlink.identity.federation.core.saml.v2.writers.SAMLMetadataWriter;
+import org.picketlink.identity.federation.core.util.StaxUtil;
+import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
+
+
+/**
+ * Unit test the {@code SAMLMetadataWriter}
+ * @author Anil.Saldhana(a)redhat.com
+ * @since Feb 11, 2011
+ */
+public class SAMLMetadataWriterUnitTestCase
+{
+ @Test
+ public void testWriteSPSSODescriptor() throws Exception
+ {
+ String fileName = "saml2/metadata/sp-entitydescriptor.xml";
+ InputStream is =
Thread.currentThread().getContextClassLoader().getResourceAsStream( fileName );
+ assertNotNull( is );
+
+ SAMLParser parser = new SAMLParser();
+ EntityDescriptorType entityDesc = (EntityDescriptorType) parser.parse(is);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ XMLStreamWriter writer = StaxUtil.getXMLStreamWriter( baos );
+
+ //write it back
+ SAMLMetadataWriter mdWriter = new SAMLMetadataWriter( writer );
+ mdWriter.writeEntityDescriptor( entityDesc ) ;
+
+ System.out.println( new String( baos.toByteArray() ));
+ }
+}
\ No newline at end of file
Modified:
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescriptor.xml
===================================================================
---
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescriptor.xml 2011-02-10
17:03:12 UTC (rev 748)
+++
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescriptor.xml 2011-02-11
20:08:03 UTC (rev 749)
@@ -1,4 +1,8 @@
-<md:EntityDescriptor
entityID="https://service.example.org/shibboleth"
validUntil="2010-01-01T00:00:00Z">
+<md:EntityDescriptor
entityID="https://service.example.org/shibboleth"
validUntil="2010-01-01T00:00:00Z"
+ xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:oasis:names:tc:SAML:2.0:metadata
http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xs...
+ >
<md:SPSSODescriptor
protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol
urn:oasis:names:tc:SAML:2.0:protocol">