Author: dimuthul
Date: Fri Jan 25 01:25:11 2008
New Revision: 12883
Log:
Implementation of SAML1TokenBuilder.java
Added:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/KeyDataHolder.java
Removed:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/X509CredentialImpl.java
Modified:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/IdentityProviderData.java
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/IdentityTokenIssuer.java
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAML1TokenBuilder.java
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAML2TokenBuilder.java
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAMLTokenBuilder.java
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAMLTokenDirector.java
Modified:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/IdentityProviderData.java
==============================================================================
---
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/IdentityProviderData.java
(original)
+++
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/IdentityProviderData.java
Fri Jan 25 01:25:11 2008
@@ -435,7 +435,7 @@
}
}
- protected String getDisplayName(String URI) {
+ public String getDisplayName(String URI) {
ClaimDO temp = (ClaimDO) claimObjs.get(URI);
return temp.getDisplayTag();
}
Modified:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/IdentityTokenIssuer.java
==============================================================================
---
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/IdentityTokenIssuer.java
(original)
+++
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/IdentityTokenIssuer.java
Fri Jan 25 01:25:11 2008
@@ -109,6 +109,7 @@
public final static String ISSUER_SELF = IdentityConstants.NS
+ "/issuer/self";
+
/**
* [EMAIL PROTECTED]
*/
@@ -236,16 +237,20 @@
assertion.sign(sigAlgo, issuerPK, Arrays.asList(issuerCerts));
Node assertionNode = assertion.toDOM();
String assertionId = assertion.getId();
-
+
if (!checkIsValidTokenType(ipData)) {
throw new IdentityProviderException("invalidTokenType",
new Object[] { ipData.getRequiredTokenType() });
}
- // String assertionId = "blah";
- // Element assertionNode = createSAMLAssertionAsDOM(ipData,
rahasData);
- // This will be required to send back to the requester in the RSTR
+/* DateTime notBefore = new DateTime();
+ DateTime notAfter = new DateTime(notBefore.getMillis() + (300 *
1000));
+ String assertionId = "bah";
+
+ Element assertionNode = createSAMLAssertionAsDOM(ipData,
rahasData, notBefore, notAfter, assertionId);
+ */
+
OMElement rstrElem = createRSTR(rahasData, notBefore, notAfter,
env, doc, assertionNode, assertionId, encryptedKey);
@@ -581,6 +586,7 @@
throw new IdentityProviderException("unknownClaimUri",
new String[] { uri });
}
+
SAMLAttribute attr = new SAMLAttribute(uri.substring(index + 1, uri
.length()), uri.substring(0, index), null, -1, list);
assertionList.add(attr);
@@ -724,7 +730,7 @@
}
/*
protected Element createSAMLAssertionAsDOM(IdentityProviderData ipData,
- RahasData rahasData) throws IdentityProviderException{
+ RahasData rahasData, DateTime notBefore, DateTime notAfter, String
assertionId) throws IdentityProviderException{
Element elem = null;
try {
@@ -736,7 +742,7 @@
}
SAMLTokenDirector director = new
SAMLTokenDirector(builder,rahasData, ipData);
- elem = director.createSAMLToken();
+ elem = director.createSAMLToken(notBefore, notAfter, assertionId);
} catch (IdentityProviderException e) {
//TODO
e.printStackTrace();
Added:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/KeyDataHolder.java
==============================================================================
--- (empty file)
+++
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/KeyDataHolder.java
Fri Jan 25 01:25:11 2008
@@ -0,0 +1,117 @@
+package org.wso2.solutions.identity.sts.saml;
+
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.crypto.SecretKey;
+
+import org.apache.xml.security.signature.XMLSignature;
+import org.opensaml.xml.security.credential.Credential;
+import org.opensaml.xml.security.credential.CredentialContextSet;
+import org.opensaml.xml.security.credential.UsageType;
+import org.opensaml.xml.security.x509.X509Credential;
+import org.wso2.solutions.identity.IdentityProviderException;
+import org.wso2.solutions.identity.sts.KeyUtil;
+import org.wso2.utils.ServerConfiguration;
+
+public class KeyDataHolder implements X509Credential {
+
+ private String signatureAlgorithm = null;
+
+ private static KeyDataHolder instance = null;
+
+ private X509Certificate[] issuerCerts = null;
+
+ private PrivateKey issuerPK = null;
+
+
+ public static KeyDataHolder getInstance() throws IdentityProviderException{
+ if(instance == null){
+ instance = new KeyDataHolder();
+ }
+ return instance;
+ }
+
+ private KeyDataHolder() throws IdentityProviderException {
+ //do once - because this is a expensive operation
+ ServerConfiguration config = ServerConfiguration.getInstance();
+ String host = "http://" + config.getFirstProperty("HostName");
+
+ String keyAlias = ServerConfiguration.getInstance().getFirstProperty(
+ "Security.KeyStore.KeyAlias");
+ issuerPK = (PrivateKey)KeyUtil.getPrivateKey(keyAlias);
+
+ issuerCerts = KeyUtil
+ .getServiceCertificateChain(keyAlias);
+
+ signatureAlgorithm = XMLSignature.ALGO_ID_SIGNATURE_RSA;
+ String pubKeyAlgo = issuerCerts[0].getPublicKey().getAlgorithm();
+ if (pubKeyAlgo.equalsIgnoreCase("DSA")) {
+ signatureAlgorithm = XMLSignature.ALGO_ID_SIGNATURE_DSA;
+ }
+
+ }
+
+ public String getSignatureAlgorithm() {
+ return signatureAlgorithm;
+ }
+
+ public void setSignatureAlgorithm(String signatureAlgorithm) {
+ this.signatureAlgorithm = signatureAlgorithm;
+ }
+
+ public Collection<X509CRL> getCRLs() {
+ return null;
+ }
+
+ public X509Certificate getEntityCertificate() {
+ return issuerCerts[0];
+ }
+
+ public Collection<X509Certificate> getEntityCertificateChain() {
+ return Arrays.asList(issuerCerts);
+ }
+
+ public CredentialContextSet getCredentalContextSet() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Class<? extends Credential> getCredentialType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getEntityId() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Collection<String> getKeyNames() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public PrivateKey getPrivateKey() {
+ return issuerPK;
+ }
+
+ public PublicKey getPublicKey() {
+ return issuerCerts[0].getPublicKey();
+ }
+
+ public SecretKey getSecretKey() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public UsageType getUsageType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Modified:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAML1TokenBuilder.java
==============================================================================
---
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAML1TokenBuilder.java
(original)
+++
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAML1TokenBuilder.java
Fri Jan 25 01:25:11 2008
@@ -1,37 +1,186 @@
package org.wso2.solutions.identity.sts.saml;
-import java.util.Date;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import javax.xml.crypto.dsig.CanonicalizationMethod;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.rahas.RahasData;
+import org.apache.xml.security.signature.XMLSignature;
+import org.joda.time.DateTime;
+import org.opensaml.saml1.core.Assertion;
+import org.opensaml.saml1.core.Attribute;
+import org.opensaml.saml1.core.AttributeStatement;
+import org.opensaml.saml1.core.AttributeValue;
+import org.opensaml.saml1.core.Conditions;
+import org.opensaml.saml1.core.ConfirmationMethod;
+import org.opensaml.saml1.core.Subject;
+import org.opensaml.saml1.core.SubjectConfirmation;
+import org.opensaml.xml.Configuration;
+import org.opensaml.xml.ConfigurationException;
+import org.opensaml.xml.XMLConfigurator;
+import org.opensaml.xml.XMLObject;
+import org.opensaml.xml.XMLObjectBuilder;
+import org.opensaml.xml.XMLObjectBuilderFactory;
+import org.opensaml.xml.io.Marshaller;
+import org.opensaml.xml.io.MarshallerFactory;
+import org.opensaml.xml.io.MarshallingException;
+import org.opensaml.xml.schema.XSString;
+import org.opensaml.xml.schema.impl.XSStringBuilder;
+import org.opensaml.xml.security.x509.X509Credential;
+import org.opensaml.xml.signature.Signature;
+import org.opensaml.xml.signature.Signer;
import org.w3c.dom.Element;
+import org.wso2.solutions.identity.IdentityConstants;
+import org.wso2.solutions.identity.IdentityProviderException;
import org.wso2.solutions.identity.sts.IdentityProviderData;
+import org.wso2.solutions.identity.sts.IdentityProviderData.RequestedClaimData;
public class SAML1TokenBuilder implements SAMLTokenBuilder {
- public void createSAMLAssertion(Date notAfter, Date notBefore,
- String assertionId) {
- // TODO Auto-generated method stub
+ private static Log log = LogFactory.getLog(SAML2TokenBuilder.class);
+
+ private Assertion assertion = null;
+ private AttributeStatement attributeStmt = null;
+ private List signatureList = new ArrayList();
+ private Element signedAssertion = null;
+
+ public static final String CONF_KEY =
"urn:oasis:names:tc:SAML:1.0:cm:holder-of-key";
+
+ static {
+ try {
+ Class clazz = Configuration.class;
+ XMLConfigurator configurator = new XMLConfigurator();
+ String[] providerConfigs = { "conf/saml1-assertion-config.xml", };
+ for (String config : providerConfigs) {
+ configurator.load(clazz.getResourceAsStream(config));
+ }
+ } catch (ConfigurationException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void createStatement(IdentityProviderData ipData, RahasData
rahasData)
+ throws IdentityProviderException {
+ if (log.isDebugEnabled()) {
+ log.debug("Begin SAML statement creation.");
+ }
+
+ attributeStmt = (AttributeStatement)
buildXMLObject(AttributeStatement.DEFAULT_ELEMENT_NAME);
+
+ Subject subject = (Subject)
buildXMLObject(Subject.DEFAULT_ELEMENT_NAME);
+ SubjectConfirmation subjectConf = (SubjectConfirmation)
buildXMLObject(SubjectConfirmation.DEFAULT_ELEMENT_NAME);
+ ConfirmationMethod confMethod = (ConfirmationMethod)
buildXMLObject(ConfirmationMethod.DEFAULT_ELEMENT_NAME);
+ confMethod.setConfirmationMethod(CONF_KEY);
+ subjectConf.getConfirmationMethods().add(confMethod);
+ subject.setSubjectConfirmation(subjectConf);
+
+ Map mapClaims = ipData.getRequestedClaims();
+
+ Iterator ite = mapClaims.values().iterator();
+
+ while (ite.hasNext()) {
+ RequestedClaimData claim = (RequestedClaimData) ite.next();
+ String uri = claim.uri;
+ if (uri.equals(IdentityConstants.CLAIM_PPID)) {
+ // Get this user's PPID
+ String name = ipData.getUserIdentifier();
+ claim.value = SAMLTokenDirector.createPPID(rahasData, name,
+ rahasData.getAppliesToEpr());
+ }
+
+ int index = uri.lastIndexOf("/");
+ String attrName = uri.substring(index + 1, uri.length());
+ String attrNamespace = uri.substring(0, index);
+
+ Attribute attribute = (Attribute)
buildXMLObject(Attribute.DEFAULT_ELEMENT_NAME);
+ attribute.setAttributeName(attrName);
+ attribute.setAttributeNamespace(attrNamespace);
+
+ XMLObjectBuilderFactory builderFactory = Configuration
+ .getBuilderFactory();
+ XSStringBuilder attributeValueBuilder = (XSStringBuilder)
builderFactory
+ .getBuilder(XSString.TYPE_NAME);
+
+ XSString stringValue = attributeValueBuilder.buildObject(
+ AttributeValue.DEFAULT_ELEMENT_NAME, XSString.TYPE_NAME);
+ stringValue.setValue(claim.value);
+ attribute.getAttributeValues().add(stringValue);
+ attributeStmt.getAttributes().add(attribute);
+ }
}
- public void createStatement(IdentityProviderData ipData, RahasData
rahasData) {
- // TODO Auto-generated method stub
+ public void createSAMLAssertion(DateTime notAfter, DateTime notBefore,
+ String assertionId) throws IdentityProviderException {
+ assertion = (Assertion) buildXMLObject(Assertion.DEFAULT_ELEMENT_NAME);
+ Conditions conditions = (Conditions)
buildXMLObject(Conditions.DEFAULT_ELEMENT_NAME);
+ conditions.setNotBefore(notBefore);
+ conditions.setNotOnOrAfter(notAfter);
+
+ /*
+ * TODO : is this needed ??? AudienceRestriction audience =
+ * (AudienceRestriction)
+ *
SAMLTokenDirector.buildXMLObject(AudienceRestriction.DEFAULT_ELEMENT_NAME);
+ * audience. conditions.getAudienceRestrictionConditions()
+ */
+ assertion.setConditions(conditions);
+
+ assertion.getAttributeStatements().add(this.attributeStmt);
+ assertion.setID(assertionId);
}
- public Element getSAMLasDOM() {
- // TODO Auto-generated method stub
- return null;
+ public void setSignature(String signatureAlgorithm, X509Credential cred)
+ throws IdentityProviderException {
+ Signature signature = (Signature)
buildXMLObject(Signature.DEFAULT_ELEMENT_NAME);
+ signature.setSigningCredential(cred);
+ signature.setSignatureAlgorithm(XMLSignature.ALGO_ID_SIGNATURE_RSA);
+ signature
+
.setCanonicalizationAlgorithm(CanonicalizationMethod.INCLUSIVE);
+ assertion.setSignature(signature);
+ signatureList.add(signature);
+
}
- public void marshellAndSign() {
- // TODO Auto-generated method stub
+ public void marshellAndSign() throws IdentityProviderException {
+
+ try {
+ MarshallerFactory marshallerFactory = Configuration
+ .getMarshallerFactory();
+ Marshaller marshaller = marshallerFactory.getMarshaller(assertion);
+ signedAssertion = marshaller.marshall(assertion);
+
+ Signer.signObjects(signatureList);
+
+ } catch (MarshallingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
}
- public void setSignature(String signatureAlgorithm) {
- // TODO Auto-generated method stub
+ public Element getSAMLasDOM() throws IdentityProviderException {
+ return signedAssertion;
+ }
+ protected static XMLObject buildXMLObject(QName objectQName)
+ throws IdentityProviderException {
+ XMLObjectBuilder builder = Configuration.getBuilderFactory()
+ .getBuilder(objectQName);
+ if (builder == null) {
+ throw new IdentityProviderException(
+ "Unable to retrieve builder for object QName "
+ + objectQName);
+ }
+ return builder.buildObject(objectQName.getNamespaceURI(), objectQName
+ .getLocalPart(), objectQName.getPrefix());
}
}
Modified:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAML2TokenBuilder.java
==============================================================================
---
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAML2TokenBuilder.java
(original)
+++
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAML2TokenBuilder.java
Fri Jan 25 01:25:11 2008
@@ -1,21 +1,69 @@
package org.wso2.solutions.identity.sts.saml;
-import java.util.Date;
-
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.rahas.RahasData;
+import org.joda.time.DateTime;
+import org.opensaml.saml2.core.AttributeStatement;
+import org.opensaml.xml.security.x509.X509Credential;
import org.w3c.dom.Element;
+import org.wso2.solutions.identity.IdentityProviderException;
import org.wso2.solutions.identity.sts.IdentityProviderData;
public class SAML2TokenBuilder implements SAMLTokenBuilder {
+
+ private static Log log = LogFactory.getLog(SAML2TokenBuilder.class);
+
+ private AttributeStatement attributeStatement = null;
+
+ public void createSAMLAssertion(DateTime notAfter, DateTime notBefore,
+ String assertionId) throws IdentityProviderException{
+
+ // String[] confirmationMethods = new String[] {
SAMLSubject.CONF_HOLDER_KEY };
+
+ // SAMLSubject subject = new SAMLSubject(null, Arrays//
+ // .asList(confirmationMethods), null, null);
- public void createSAMLAssertion(Date notAfter, Date notBefore,
- String assertionId) {
- // TODO Auto-generated method stub
}
- public void createStatement(IdentityProviderData ipData, RahasData
rahasData) {
- // TODO Auto-generated method stub
+ public void createStatement(IdentityProviderData ipData, RahasData
rahasData) throws IdentityProviderException{
+ // The SAMLSubject
+/* if (log.isDebugEnabled()) {
+ log.debug("Begin SAML statement creation.");
+ }
+
+ attributeStatement = (AttributeStatement)
SAMLTokenDirector.buildXMLObject(AttributeStatement.DEFAULT_ELEMENT_NAME);
+ Map mapClaims = ipData.getRequestedClaims();
+
+ Iterator ite = mapClaims.values().iterator();
+
+ while (ite.hasNext()) {
+ RequestedClaimData claim = (RequestedClaimData) ite.next();
+ String uri = claim.uri;
+ if (uri.equals(IdentityConstants.CLAIM_PPID)) {
+ // Get this user's PPID
+ String name = ipData.getUserIdentifier();
+ claim.value = SAMLTokenDirector.createPPID(rahasData, name,
rahasData
+ .getAppliesToEpr());
+ }
+
+ int index = uri.lastIndexOf("/");
+ String attributeName = uri.substring(index + 1, uri.length());
+ String attrNamespace = uri.substring(0, index);
+
+ Attribute attribute = (Attribute)
SAMLTokenDirector.buildXMLObject(Attribute.DEFAULT_ELEMENT_NAME);
+ XSStringBuilder stringBuilder = (XSStringBuilder) Configuration
+ .getBuilderFactory().getBuilder(XSString.TYPE_NAME);
+ XSString stringValue = stringBuilder.buildObject(
+ AttributeValue.DEFAULT_ELEMENT_NAME, XSString.TYPE_NAME);
+
+ stringValue.setValue(claim.value);
+ attribute.getAttributeValues().add(stringValue);
+
+ attributeStatement.getAttributes().add(attribute);
+
+ }*/
}
@@ -28,7 +76,7 @@
// TODO Auto-generated method stub
}
- public void setSignature(String signatureAlgorithm) {
+ public void setSignature(String signatureAlgorithm, X509Credential cred) {
// TODO Auto-generated method stub
}
Modified:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAMLTokenBuilder.java
==============================================================================
---
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAMLTokenBuilder.java
(original)
+++
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAMLTokenBuilder.java
Fri Jan 25 01:25:11 2008
@@ -1,9 +1,10 @@
package org.wso2.solutions.identity.sts.saml;
-import java.util.Date;
-
import org.apache.rahas.RahasData;
+import org.joda.time.DateTime;
+import org.opensaml.xml.security.x509.X509Credential;
import org.w3c.dom.Element;
+import org.wso2.solutions.identity.IdentityProviderException;
import org.wso2.solutions.identity.sts.IdentityProviderData;
/**
* The builder pattern.
@@ -12,13 +13,14 @@
*/
public interface SAMLTokenBuilder {
- void createStatement(IdentityProviderData ipData, RahasData rahasData);
+ void createStatement(IdentityProviderData ipData, RahasData rahasData)
throws IdentityProviderException;
- void createSAMLAssertion(Date notAfter, Date notBefore, String
assertionId);
+ void createSAMLAssertion(DateTime notAfter, DateTime notBefore,
+ String assertionId) throws IdentityProviderException;
- void setSignature(String signatureAlgorithm);
+ void setSignature(String signatureAlgorithm, X509Credential cred) throws
IdentityProviderException;
- void marshellAndSign();
+ void marshellAndSign() throws IdentityProviderException;
- Element getSAMLasDOM();
+ Element getSAMLasDOM() throws IdentityProviderException;
}
Modified:
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAMLTokenDirector.java
==============================================================================
---
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAMLTokenDirector.java
(original)
+++
trunk/solutions/identity/modules/identity-provider/src/main/java/org/wso2/solutions/identity/sts/saml/SAMLTokenDirector.java
Fri Jan 25 01:25:11 2008
@@ -1,37 +1,29 @@
package org.wso2.solutions.identity.sts.saml;
-import java.util.Date;
-
-import javax.xml.namespace.QName;
-
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.util.UUIDGenerator;
import org.apache.rahas.RahasData;
+import org.apache.xml.security.utils.Base64;
+import org.joda.time.DateTime;
import org.opensaml.DefaultBootstrap;
-import org.opensaml.xml.Configuration;
import org.opensaml.xml.ConfigurationException;
-import org.opensaml.xml.XMLConfigurator;
-import org.opensaml.xml.XMLObject;
-import org.opensaml.xml.XMLObjectBuilder;
import org.w3c.dom.Element;
import org.wso2.solutions.identity.IdentityProviderException;
+import org.wso2.solutions.identity.persistence.IPPersistenceManager;
+import org.wso2.solutions.identity.persistence.dataobject.PPIDValueDO;
+import org.wso2.solutions.identity.persistence.dataobject.RelyingPartyDO;
import org.wso2.solutions.identity.sts.IdentityProviderData;
+import org.wso2.solutions.identity.sts.IdentityProviderUtil;
public class SAMLTokenDirector {
private SAMLTokenBuilder builder = null;
private RahasData rahasData = null;
private IdentityProviderData ipData = null;
- private String signatureAlgorithm = null;
-
+
static {
try {
DefaultBootstrap.bootstrap();
-
- Class clazz = Configuration.class;
- XMLConfigurator configurator = new XMLConfigurator();
- String[] providerConfigs = { "/saml-test-config.xml", };
- for (String config : providerConfigs) {
- configurator.load(clazz.getResourceAsStream(config));
- }
} catch (ConfigurationException e) {
e.printStackTrace();
throw new RuntimeException(e);
@@ -45,33 +37,88 @@
this.ipData = iData;
}
- public Element createSAMLToken() throws IdentityProviderException {
-
- Date notBefore = new Date();
- Date notAfter = new Date();
- notAfter.setTime(notBefore.getTime() + (300 * 1000));
- String assertionId = "blah";
-
+ public Element createSAMLToken(DateTime notBefore, DateTime notAfter,
String assertionId) throws IdentityProviderException {
+
+ KeyDataHolder keyDataHolder = KeyDataHolder.getInstance();
+ String signatureAlgorithm = keyDataHolder.getSignatureAlgorithm();
+
Element elem = null;
builder.createStatement(ipData, rahasData);
builder.createSAMLAssertion(notAfter, notBefore, assertionId);
- builder.setSignature(signatureAlgorithm);
+ builder.setSignature(signatureAlgorithm, keyDataHolder);
builder.marshellAndSign();
elem = builder.getSAMLasDOM();
return elem;
}
+
+
+ /**
+ * Obtain the ppid for the given user for the given rp.
+ *
+ * @param rahasData
+ * WS-Trust information in the issue request.
+ * @param name
+ * Name of the user/subject.
+ * @param appliesToEpr
+ * EPR element in wst:AppliesTo element.
+ * @return PPID value. If there's already an issued token then the ppid
+ * value will be reused.
+ * @throws IdentityProviderException
+ */
+ public static String createPPID(RahasData rahasData, String name,
+ OMElement appliesToEpr) throws IdentityProviderException {
+
+ String appliesToHostName = IdentityProviderUtil
+ .getAppliesToHostName(rahasData);
+ IPPersistenceManager db = IPPersistenceManager.getPersistanceManager();
+ PPIDValueDO[] ppidValueDOs = db.getPPIDValuesForUser(name);
+ PPIDValueDO ppidValueDO = null;
+ for (int i = 0; i < ppidValueDOs.length; i++) {
+ String hostName = null;
+ if (ppidValueDOs[i].getRelyingParty() != null) {
+ hostName = ppidValueDOs[i].getRelyingParty().getHostName();
+ } else if (ppidValueDOs[i].getPersonalRelyingParty() != null) {
+ hostName = ppidValueDOs[i].getPersonalRelyingParty()
+ .getIdentifier().getHostName();
+ }
+
+ if (hostName == null) {
+ throw new IdentityProviderException("hostNotTrusted",
+ new String[] { hostName });
+ }
+
+ if (appliesToHostName.equals(hostName)) {
+ ppidValueDO = ppidValueDOs[i];
+ }
+ }
+
+ if (ppidValueDO != null) {
+ // If we have already issued a PPID
+ // Then return that value
+ return ppidValueDO.getPpid();
+ } else {
+ // A new request targeted for a new RP
+ String newPpid = Base64.encode(UUIDGenerator.getUUID().getBytes());
+ ppidValueDO = new PPIDValueDO();
+ ppidValueDO.setUserId(name);
+ ppidValueDO.setPpid(newPpid);
+
+ // If the host is globally trusted
+ RelyingPartyDO rp = db.getRelyingParty(appliesToHostName);
+ if (rp != null) {
+ ppidValueDO.setRelyingParty(rp);
+ } else {
+ // Else the host MUST be personally trusted
+ ppidValueDO.setPersonalRelyingParty(db.getPersonalRelyingParty(
+ name, appliesToHostName));
+ }
+
+ db.create(ppidValueDO);
- public static XMLObject buildXMLObject(QName objectQName) throws Exception
{
- XMLObjectBuilder builder = Configuration.getBuilderFactory()
- .getBuilder(objectQName);
- if (builder == null) {
- throw new Exception("Unable to retrieve builder for object QName "
- + objectQName);
+ return newPpid;
}
- return builder.buildObject(objectQName.getNamespaceURI(), objectQName
- .getLocalPart(), objectQName.getPrefix());
}
}
_______________________________________________
Identity-dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/identity-dev