CreateHostedSP.java revision 4a2f0f0be43dfd4c1b490cbf3cc48b6ba6084b1c
/**
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2008 Sun Microsystems Inc. All Rights Reserved
*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* https://opensso.dev.java.net/public/CDDLv1.0.html or
* opensso/legal/CDDLv1.0.txt
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at opensso/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id: CreateHostedSP.java,v 1.9 2010/01/04 19:10:50 veiming Exp $
*
*/
package com.sun.identity.workflow;
import com.sun.identity.cot.COTException;
import com.sun.identity.saml2.common.SAML2Constants;
import com.sun.identity.saml2.jaxb.entityconfig.EntityConfigElement;
import com.sun.identity.saml2.jaxb.entityconfig.SPSSOConfigElement;
import com.sun.identity.saml2.meta.SAML2MetaException;
import com.sun.identity.saml2.meta.SAML2MetaManager;
import com.sun.identity.saml2.meta.SAML2MetaUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* Creates Hosted Service Provider.
*/
public class CreateHostedSP
extends Task {
public CreateHostedSP() {
}
/**
* Creates hosted service provider.
*
* @param locale Locale of the Request
* @param params Map of creation parameters.
*/
public String execute(Locale locale, Map params)
throws WorkflowException {
validateParameters(params);
String metadataFile = getString(params, ParameterKeys.P_META_DATA);
String defAttrMappings = getString(
params, ParameterKeys.P_DEF_ATTR_MAPPING);
boolean hasMetaData = (metadataFile != null) &&
(metadataFile.trim().length() > 0);
String metadata = null;
String extendedData = null;
if (hasMetaData) {
String extendedDataFile = getString(params,
ParameterKeys.P_EXENDED_DATA);
metadata = getContent(metadataFile, locale);
extendedData = getContent(extendedDataFile, locale);
} else {
String entityId = getString(params, ParameterKeys.P_ENTITY_ID);
String metaAlias = generateMetaAliasForSP(
getString(params, ParameterKeys.P_REALM));
Map map = new HashMap();
map.put(MetaTemplateParameters.P_SP, metaAlias);
map.put(MetaTemplateParameters.P_SP_E_CERT,
getString(params, ParameterKeys.P_SP_E_CERT));
try {
metadata =
CreateSAML2HostedProviderTemplate.buildMetaDataTemplate(
entityId, map, getRequestURL(params));
//metadata = enableSigning(metadata);
extendedData =
CreateSAML2HostedProviderTemplate.createExtendedDataTemplate(
entityId, map, getRequestURL(params));
} catch (SAML2MetaException e) {
return e.getMessage();
}
}
String[] results = ImportSAML2MetaData.importData(null, metadata,
extendedData);
String realm = results[0];
String entityId = results[1];
String cot = getString(params, ParameterKeys.P_COT);
if ((cot != null) && (cot.length() > 0)) {
try {
AddProviderToCOT.addToCOT(realm, cot, entityId);
} catch (COTException e) {
throw new WorkflowException(e.getMessage());
}
}
List attrMapping = null;
if (defAttrMappings.equals("true")) {
attrMapping = new ArrayList(1);
attrMapping.add("*=*");
} else {
attrMapping = getAttributeMapping(params);
}
if (!attrMapping.isEmpty()) {
try {
SAML2MetaManager manager = new SAML2MetaManager();
EntityConfigElement config = manager.getEntityConfig(
realm, entityId);
SPSSOConfigElement ssoConfig = manager.getSPSSOConfig(
realm, entityId);
Map attribConfig = SAML2MetaUtils.getAttributes(ssoConfig);
List mappedAttributes = (List) attribConfig.get(
SAML2Constants.ATTRIBUTE_MAP);
mappedAttributes.addAll(attrMapping);
manager.setEntityConfig(realm, config);
} catch (SAML2MetaException e) {
throw new WorkflowException(e.getMessage());
}
}
return "done|||realm=" + realm;
}
private String enableSigning(String metadata) {
int idx = metadata.indexOf("WantAssertionsSigned=\"false\"");
if (idx != -1) {
metadata = metadata.substring(0, idx) +
"WantAssertionsSigned=\"true\"" +
metadata.substring(idx + 28);
}
return metadata;
}
private void validateParameters(Map params)
throws WorkflowException {
String metadata = getString(params, ParameterKeys.P_META_DATA);
boolean hasMetaData = (metadata != null) &&
(metadata.trim().length() > 0);
String extendedData = getString(params, ParameterKeys.P_EXENDED_DATA);
boolean hasExtendedData = (extendedData != null) &&
(extendedData.trim().length() > 0);
if ((hasMetaData && !hasExtendedData) ||
(!hasMetaData && hasExtendedData)
) {
throw new WorkflowException("both-meta-extended-data-required",
null);
}
if ((params.size() == 3) &&
params.containsKey(ParameterKeys.P_META_DATA) &&
params.containsKey(ParameterKeys.P_EXENDED_DATA) &&
!hasMetaData && !hasExtendedData
) {
throw new WorkflowException("both-meta-extended-data-required",
null);
}
String cotname = getString(params, ParameterKeys.P_COT);
if ((cotname == null) || (cotname.trim().length() == 0)) {
throw new WorkflowException("missing-cot", null);
}
if (!hasMetaData && !hasExtendedData) {
String realm = getString(params, ParameterKeys.P_REALM);
if ((realm == null) || (realm.trim().length() == 0)) {
throw new WorkflowException("missing-realm", null);
}
String entityId = getString(params, ParameterKeys.P_ENTITY_ID);
if ((entityId == null) || (entityId.trim().length() == 0)) {
throw new WorkflowException("missing-entity-id", null);
}
}
}
}