Author: anil.saldhana(a)jboss.com
Date: 2011-02-11 16:05:14 -0500 (Fri, 11 Feb 2011)
New Revision: 751
Added:
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescOrgContact.xml
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/saml/v2/constants/JBossSAMLConstants.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/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataParsingUnitTestCase.java
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java
federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java
Log:
add contact person parsing/writing for entity descriptor
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-11
20:17:13 UTC (rev 750)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java 2011-02-11
21:05:14 UTC (rev 751)
@@ -41,6 +41,8 @@
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.ContactType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.ContactTypeType;
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;
@@ -136,6 +138,10 @@
entityDescriptorType.setOrganization(organization);
}
+ else if( JBossSAMLConstants.CONTACT_PERSON.get().equals( localPart ))
+ {
+ entityDescriptorType.addContactPerson( parseContactPerson(xmlEventReader));
+ }
else
throw new RuntimeException( "Unknown " + localPart );
}
@@ -478,7 +484,61 @@
}
return org;
}
+
+ private ContactType parseContactPerson( XMLEventReader xmlEventReader ) throws
ParsingException
+ {
+ StartElement startElement = StaxParserUtil.getNextStartElement( xmlEventReader );
+ StaxParserUtil.validate(startElement, JBossSAMLConstants.CONTACT_PERSON.get() );
+ Attribute attr = startElement.getAttributeByName( new QName(
JBossSAMLConstants.CONTACT_TYPE.get() ));
+ if( attr == null )
+ throw new ParsingException( "attribute contactType required" );
+ ContactType contactType = new ContactType(ContactTypeType.fromValue(
StaxParserUtil.getAttributeValue(attr)));
+
+ while( xmlEventReader.hasNext() )
+ {
+ XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+ if( xmlEvent instanceof EndElement )
+ {
+ EndElement end = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate( end , JBossSAMLConstants.CONTACT_PERSON.get() );
+ break;
+ }
+
+ startElement = (StartElement) xmlEvent;
+ String localPart = startElement.getName().getLocalPart();
+
+ if( JBossSAMLConstants.COMPANY.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ contactType.setCompany( StaxParserUtil.getElementText(xmlEventReader) );
+ }
+ else if( JBossSAMLConstants.GIVEN_NAME.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ contactType.setGivenName( StaxParserUtil.getElementText(xmlEventReader) );
+ }
+ else if( JBossSAMLConstants.SURNAME.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ contactType.setSurName( StaxParserUtil.getElementText(xmlEventReader) );
+ }
+ else if( JBossSAMLConstants.EMAIL_ADDRESS.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ contactType.addEmailAddress( StaxParserUtil.getElementText(xmlEventReader) );
+ }
+ else if( JBossSAMLConstants.TELEPHONE_NUMBER.get().equals( localPart ))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ contactType.addTelephone( StaxParserUtil.getElementText(xmlEventReader) );
+ }
+ else
+ throw new RuntimeException( "Unknown " + localPart );
+ }
+ return contactType;
+ }
+
private LocalizedNameType getLocalizedName(XMLEventReader xmlEventReader, StartElement
startElement)
throws ParsingException
{
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-11
20:17:13 UTC (rev 750)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java 2011-02-11
21:05:14 UTC (rev 751)
@@ -54,9 +54,13 @@
AUTHN_REQUESTS_SIGNED( "AuthnRequestsSigned" ),
BINDING( "Binding" ),
CACHE_DURATION( "cacheDuration" ),
+ COMPANY( "Company" ),
CONDITIONS( "Conditions" ),
CONSENT( "Consent" ),
+ CONTACT_PERSON( "ContactPerson" ),
+ CONTACT_TYPE( "contactType" ),
DESTINATION( "Destination" ),
+ EMAIL_ADDRESS( "EmailAddress" ),
ENCODING( "Encoding" ),
ENCRYPTED_ASSERTION( "EncryptedAssertion" ),
ENTITY_ID( "entityID" ),
@@ -64,6 +68,7 @@
ENTITIES_DESCRIPTOR( "EntitiesDescriptor" ),
FORMAT( "Format" ),
FRIENDLY_NAME( "FriendlyName" ),
+ GIVEN_NAME( "GivenName" ),
ID( "ID" ),
IDP_SSO_DESCRIPTOR( "IDPSSODescriptor" ),
INDEX( "index" ),
@@ -125,6 +130,8 @@
SUBJECT( "Subject" ),
SUBJECT_CONFIRMATION( "SubjectConfirmation" ),
SUBJECT_CONFIRMATION_DATA( "SubjectConfirmationData" ),
+ SURNAME( "SurName" ),
+ TELEPHONE_NUMBER( "TelephoneNumber" ),
TYPE( "type" ),
USE( "use" ),
VALUE( "Value" ),
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-11
20:17:13 UTC (rev 750)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java 2011-02-11
21:05:14 UTC (rev 751)
@@ -38,6 +38,8 @@
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.ContactType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.ContactTypeType;
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;
@@ -116,6 +118,12 @@
OrganizationType organization = entityDescriptor.getOrganization();
writeOrganization(organization);
+ List<ContactType> contactPersons = entityDescriptor.getContactPerson();
+ for( ContactType contact : contactPersons )
+ {
+ write( contact );
+ }
+
StaxUtil.writeEndElement(writer);
StaxUtil.flush(writer);
}
@@ -359,6 +367,63 @@
StaxUtil.flush(writer);
}
+ public void write( ContactType contact ) throws ProcessingException
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.CONTACT_PERSON.get(),
+ METADATA_NSURI.get());
+
+ ContactTypeType attribs = contact.getContactType();
+ StaxUtil.writeAttribute(writer, JBossSAMLConstants.CONTACT_TYPE.get(),
attribs.value() );
+
+ //Write the name
+ String company = contact.getCompany();
+ if( company != null )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.COMPANY.get(),
+ METADATA_NSURI.get());
+ StaxUtil.writeCharacters(writer, company);
+ StaxUtil.writeEndElement(writer);
+ }
+ String givenName = contact.getGivenName();
+ if( givenName != null )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.GIVEN_NAME.get(),
+ METADATA_NSURI.get());
+ StaxUtil.writeCharacters(writer, givenName );
+ StaxUtil.writeEndElement(writer);
+ }
+
+ String surName = contact.getSurName();
+ if( surName != null )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.SURNAME.get(),
+ METADATA_NSURI.get());
+ StaxUtil.writeCharacters(writer, surName );
+ StaxUtil.writeEndElement(writer);
+ }
+
+ List<String> emailAddresses = contact.getEmailAddress();
+ for( String email: emailAddresses )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.EMAIL_ADDRESS.get(),
+ METADATA_NSURI.get());
+ StaxUtil.writeCharacters(writer, email );
+ StaxUtil.writeEndElement(writer);
+ }
+
+ List<String> tels = contact.getTelephoneNumber();
+ for( String telephone: tels )
+ {
+ StaxUtil.writeStartElement(writer, METADATA_PREFIX,
JBossSAMLConstants.TELEPHONE_NUMBER.get(),
+ METADATA_NSURI.get());
+ StaxUtil.writeCharacters(writer, telephone );
+ 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(),
Modified:
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataParsingUnitTestCase.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataParsingUnitTestCase.java 2011-02-11
20:17:13 UTC (rev 750)
+++
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataParsingUnitTestCase.java 2011-02-11
21:05:14 UTC (rev 751)
@@ -21,20 +21,25 @@
*/
package org.picketlink.test.identity.federation.core.saml.v2.metadata;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import java.io.InputStream;
import java.security.cert.X509Certificate;
+import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import org.picketlink.identity.federation.core.parsers.saml.SAMLParser;
import org.picketlink.identity.federation.core.saml.v2.util.SAMLMetadataUtil;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.ContactType;
import
org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntitiesDescriptorType;
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.KeyDescriptorType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.OrganizationType;
/**
* Unit test the SAML metadata parsing
@@ -62,4 +67,27 @@
Assert.assertNotNull(cert);
Assert.assertEquals( "CN=test, OU=OpenSSO, O=Sun, L=Santa Clara,
ST=California, C=US", cert.getIssuerDN().getName() );
}
+
+ @Test
+ public void parseOrganizationAndContactPerson() throws Exception
+ {
+ ClassLoader tcl = Thread.currentThread().getContextClassLoader();
+ InputStream is =
+
tcl.getResourceAsStream("saml2/metadata/sp-entitydescOrgContact.xml");
+ assertNotNull("Inputstream not null", is);
+
+ SAMLParser parser = new SAMLParser();
+ EntityDescriptorType entity = (EntityDescriptorType) parser.parse(is);
+ assertNotNull( entity );
+ OrganizationType org = entity.getOrganization();
+ assertNotNull( org );
+
+ List<ContactType> contactPersons = entity.getContactPerson();
+ assertNotNull( contactPersons );
+ assertTrue( contactPersons.size() == 1 );
+
+ assertEquals( "technical", contactPersons.get(0).getContactType().value()
);
+ assertEquals( "SAML SP Support", contactPersons.get(0).getSurName() );
+ assertEquals( "mailto:saml-support@sp.example.com",
contactPersons.get(0).getEmailAddress().get(0) );
+ }
}
\ No newline at end of file
Modified:
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 2011-02-11
20:17:13 UTC (rev 750)
+++
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java 2011-02-11
21:05:14 UTC (rev 751)
@@ -62,4 +62,26 @@
System.out.println( new String( baos.toByteArray() ));
}
+
+ @Test
+ public void testWriteEntityDescWithContactPerson() throws Exception
+ {
+ ClassLoader tcl = Thread.currentThread().getContextClassLoader();
+ InputStream is =
+
tcl.getResourceAsStream("saml2/metadata/sp-entitydescOrgContact.xml");
+ assertNotNull("Inputstream not null", is);
+
+ SAMLParser parser = new SAMLParser();
+ EntityDescriptorType entity = (EntityDescriptorType) parser.parse(is);
+ assertNotNull( entity );
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ XMLStreamWriter writer = StaxUtil.getXMLStreamWriter( baos );
+
+ //write it back
+ SAMLMetadataWriter mdWriter = new SAMLMetadataWriter( writer );
+ mdWriter.writeEntityDescriptor( entity ) ;
+
+ System.out.println( new String( baos.toByteArray() ));
+ }
}
\ No newline at end of file
Added:
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescOrgContact.xml
===================================================================
---
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescOrgContact.xml
(rev 0)
+++
federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescOrgContact.xml 2011-02-11
21:05:14 UTC (rev 751)
@@ -0,0 +1,21 @@
+<md:EntityDescriptor
+ xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+ xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+
entityID="https://sp.example.com/SAML2">
+ <md:Organization>
+ <md:OrganizationName xml:lang="en">
+ SAML Service Provider
+ </md:OrganizationName>
+ <md:OrganizationDisplayName xml:lang="en">
+ SAML Service Provider @ Some Location
+ </md:OrganizationDisplayName>
+ <md:OrganizationURL xml:lang="en">
+
http://www.sp.example.com/
+ </md:OrganizationURL>
+ </md:Organization>
+ <md:ContactPerson contactType="technical">
+ <md:SurName>SAML SP Support</md:SurName>
+ <md:EmailAddress>mailto:saml-support@sp.example.com</md:EmailAddress>
+ </md:ContactPerson>
+ </md:EntityDescriptor>
\ No newline at end of file
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 2011-02-11
20:17:13 UTC (rev 750)
+++
federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java 2011-02-11
21:05:14 UTC (rev 751)
@@ -267,6 +267,20 @@
}
/**
+ * Add a {@link ContactType} contact person
+ * @param ct
+ */
+ public void addContactPerson( ContactType ct )
+ {
+ contactPerson.add(ct);
+ }
+
+ public void removeContactPerson( ContactType ct )
+ {
+ contactPerson.remove(ct);
+ }
+
+ /**
* Gets the value of the contactPerson property.
* <p>
* Objects of the following type(s) are allowed in the list