/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2007 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: ConfigurationBase.java,v 1.4 2009/07/07 06:14:12 veiming Exp $
*
* Portions Copyrighted 2010-2015 ForgeRock AS.
*/
package com.sun.identity.common.configuration;
import com.iplanet.sso.SSOException;
import com.iplanet.sso.SSOToken;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.sun.identity.security.AdminTokenAction;
import com.sun.identity.shared.Constants;
import com.sun.identity.sm.AttributeSchema;
import com.sun.identity.sm.SMSException;
import com.sun.identity.sm.OrganizationConfigManager;
import com.sun.identity.sm.SchemaType;
import com.sun.identity.sm.ServiceConfig;
import com.sun.identity.sm.ServiceConfigManager;
import com.sun.identity.sm.ServiceManager;
import com.sun.identity.sm.ServiceSchema;
import com.sun.identity.sm.ServiceSchemaManager;
import java.security.AccessController;
import java.util.LinkedHashSet;
/**
* This is the base case for ServerConfiguration
and
* SiteConfiguration
classes.
*/
public abstract class ConfigurationBase {
protected static final String OLD_ATTR_SITE_LIST =
"iplanet-am-platform-site-list";
protected static final String OLD_ATTR_SERVER_LIST =
"iplanet-am-platform-server-list";
public static final String CONFIG_SERVERS = "com-sun-identity-servers";
public static final String SUBSCHEMA_SERVER = "server";
protected static final String ATTR_SERVER_ID = "serverid";
public static final String SUBSCHEMA_SITE = "site";
public static final String CONFIG_SITES = "com-sun-identity-sites";
protected static final String SUBCONFIG_ACCESS_URL = "accesspoint";
protected static final String ATTR_PRIMARY_SITE_ID = "primary-siteid";
protected static final String ATTR_PRIMARY_SITE_URL = "primary-url";
protected static final String SUBCONFIG_SEC_URLS = "secondary-urls";
protected static final String ATTR_SEC_ID = "secondary-siteid";
protected static String getNextId(SSOToken ssoToken)
throws SMSException, SSOException {
Set currentIds = new HashSet();
currentIds.addAll(getServerConfigurationId(getRootServerConfig(ssoToken)));
currentIds.addAll(getSiteConfigurationId(getRootSiteConfig(ssoToken)));
return getNextId(currentIds);
}
protected static Set getServerConfigurationId(ServiceConfig svc)
throws SMSException, SSOException {
Set currentIds = new HashSet();
Set names = svc.getSubConfigNames("*");
if ((names != null) && !names.isEmpty()) {
for (Iterator i = names.iterator(); i.hasNext(); ) {
String name = (String)i.next();
ServiceConfig sc = svc.getSubConfig(name);
Map map = sc.getAttributes();
Set set = (Set)map.get(ATTR_SERVER_ID);
if ((set != null) && !set.isEmpty()) {
currentIds.add(set.iterator().next());
}
}
}
return currentIds;
}
protected static Set getSiteConfigurationId(
ServiceConfig svc
) throws SMSException, SSOException {
Set currentIds = new HashSet();
Set names = svc.getSubConfigNames("*");
if ((names != null) && !names.isEmpty()) {
for (Iterator i = names.iterator(); i.hasNext(); ) {
String name = (String)i.next();
currentIds.addAll(
getSiteConfigurationIds(null, svc, name, false));
}
}
return currentIds;
}
protected static Set getSiteConfigurationIds(
SSOToken ssoToken,
ServiceConfig rootNode,
String name,
boolean bPrimaryOnly
) throws SMSException, SSOException {
if (rootNode == null) {
rootNode = getRootSiteConfig(ssoToken);
}
ServiceConfig sc = rootNode.getSubConfig(name);
if (sc == null) {
return Collections.EMPTY_SET;
}
Set currentIds = new LinkedHashSet();
ServiceConfig accessPoint = sc.getSubConfig(SUBCONFIG_ACCESS_URL);
Map map = accessPoint.getAttributes();
Set set = (Set)map.get(ATTR_PRIMARY_SITE_ID);
currentIds.add(set.iterator().next());
if (!bPrimaryOnly) {
Set failovers = accessPoint.getSubConfigNames("*");
if ((failovers != null) && !failovers.isEmpty()) {
for (Iterator i = failovers.iterator(); i.hasNext(); ) {
String foName = (String)i.next();
ServiceConfig s = accessPoint.getSubConfig(foName);
Map mapValues = s.getAttributes();
set = (Set)mapValues.get(ATTR_SEC_ID);
if ((set != null) && !set.isEmpty()) {
currentIds.add(set.iterator().next());
}
}
}
}
return currentIds;
}
protected static String getNextId(Set currentIds) {
String id = null;
if (!currentIds.isEmpty()) {
for (int i = 1; (id == null); i++) {
String test = (i < 10) ? "0" + Integer.toString(i)
: Integer.toString(i);
if (!currentIds.contains(test)) {
id = test;
}
}
}
return (id == null) ? "01" : id;
}
protected static void updateOrganizationAlias(
SSOToken ssoToken,
String instanceName,
boolean bAdd
) throws SMSException {
String hostName = null;
try {
URL url = new URL(instanceName);
hostName = url.getHost();
} catch (MalformedURLException e) {
throw new RuntimeException(e.getMessage());
}
OrganizationConfigManager ocm = new OrganizationConfigManager(
ssoToken, "/");
Map allAttrs = ocm.getAttributes(ServiceManager.REALM_SERVICE);
Set values = (Set)allAttrs.get(OrganizationConfigManager.SUNORG_ALIAS);
if (bAdd) {
if (!values.contains(hostName)) {
values.add(hostName);
ocm.setAttributes(ServiceManager.REALM_SERVICE, allAttrs);
}
} else {
if (values.contains(hostName)) {
values.remove(hostName);
ocm.setAttributes(ServiceManager.REALM_SERVICE, allAttrs);
}
}
}
protected static ServiceConfig getRootServerConfig(SSOToken ssoToken)
throws SMSException, SSOException {
ServiceConfigManager scm = new ServiceConfigManager(
Constants.SVC_NAME_PLATFORM, ssoToken);
ServiceConfig globalSvcConfig = scm.getGlobalConfig(null);
return (globalSvcConfig != null) ?
globalSvcConfig.getSubConfig(CONFIG_SERVERS) : null;
}
protected static ServiceConfig getServerConfig(
SSOToken ssoToken,
String name
) throws SMSException, SSOException {
ServiceConfig sc = getRootServerConfig(ssoToken);
return (sc != null) ? sc.getSubConfig(name) : null;
}
protected static ServiceConfig getRootSiteConfig(SSOToken ssoToken)
throws SMSException, SSOException {
ServiceConfigManager scm = new ServiceConfigManager(
Constants.SVC_NAME_PLATFORM, ssoToken);
ServiceConfig globalSvcConfig = scm.getGlobalConfig(null);
return (globalSvcConfig != null) ?
globalSvcConfig.getSubConfig(CONFIG_SITES) : null;
}
}