8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2009 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The contents of this file are subject to the terms
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of the Common Development and Distribution License
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (the License). You may not use this file except in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You can obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * opensso/legal/CDDLv1.0.txt
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at opensso/legal/CDDLv1.0.txt.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, addReferral the following below the CDDL Header,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * with the fields enclosed by brackets [] replaced by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * your own identifying information:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: CoreTokenConfigService.java,v 1.1 2009/11/19 00:07:40 qcheng Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.coretoken.service;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.sso.SSOException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.sso.SSOToken;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.coretoken.CoreTokenConstants;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.coretoken.CoreTokenUtils;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.security.AdminTokenAction;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.ServiceListener;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SMSException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.ServiceConfig;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.ServiceConfigManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.security.AccessController;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Iterator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Map;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This <code>OpenSSOCoreTokenStore</code> implements the core token store
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * using SM store.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class CoreTokenConfigService implements ServiceListener {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String IMPL_CLASS_ATTR = "tokenStoreImplClass";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static final String SEARCHABLE_ATTR = "searchableAttributes";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static final String CLEANUP_INTERVAL = "tokenCleanupInterval";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static final String TYPES_WITHOUT_ETAG_ENFORCE =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "tokenTypesWithoutEtagEnforcement";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // default cleanup interval in mini-seconds
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static final long DEFAULT_CLEANUP_INTERVAL = 180000;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String implClassName = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // searchable attributes set
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static Set<String> searchableAttrs = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static long cleanupInt = 180000;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static Set<String> noETagEnfTypes = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // TODO : implement SMS listener for changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenConfigService service = new CoreTokenConfigService();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster service.initServiceConfig();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken adminToken = (SSOToken) AccessController
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .doPrivileged(AdminTokenAction.getInstance());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ServiceConfigManager serviceConfigManager =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new ServiceConfigManager(adminToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenConstants.CORE_TOKEN_CONFIG_SERVICE_NAME, "1.0");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String notificationId = serviceConfigManager.addListener(service);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (CoreTokenUtils.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.message("CoreTokenConfigService.static "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " add service notification " + notificationId);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SMSException ex) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.error("CoreTokenConfigService.static", ex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException ex) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.error("CoreTokenConfigService.static", ex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void CoreTokenConfigService() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private synchronized void initServiceConfig() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken dsameUserToken = (SSOToken) AccessController.doPrivileged(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AdminTokenAction.getInstance());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ServiceConfigManager mgr = new ServiceConfigManager(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenConstants.CORE_TOKEN_CONFIG_SERVICE_NAME,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dsameUserToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ServiceConfig globalConf = mgr.getGlobalConfig(null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (globalConf != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map<String, Set<String>> map = globalConf.getAttributes();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (map != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> set = map.get(IMPL_CLASS_ATTR);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((set != null) && !set.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster implClassName = set.iterator().next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster set = map.get(SEARCHABLE_ATTR);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> tmpSet = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((set != null) && !set.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator<String> it = set.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (it.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmpSet.add(it.next().toLowerCase());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster searchableAttrs = tmpSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster set = map.get(CLEANUP_INTERVAL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((set != null) && !set.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tmp = set.iterator().next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cleanupInt = Integer.parseInt(tmp) * 1000;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (NumberFormatException ne) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.error("CoreTokenConfigService"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ".init. invalid interval : " + tmp, ne);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cleanupInt = DEFAULT_CLEANUP_INTERVAL;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster set = map.get(TYPES_WITHOUT_ETAG_ENFORCE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmpSet = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((set != null) && !set.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator<String> it = set.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (it.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmpSet.add(it.next().toLowerCase());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster noETagEnfTypes = tmpSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (CoreTokenUtils.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.message("CoreTokenConfigServcie.init: " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "searchable Attrs=" + searchableAttrs +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "; token store impl class=" + implClassName +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "; cleanup interval=" + cleanupInt +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "; token types without ETag enforcement=" + noETagEnfTypes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SMSException ex) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.error("CoreTokenConfigService.init", ex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException ex) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.error("CoreTokenConfigService.init", ex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void schemaChanged(String serviceName, String version) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (CoreTokenUtils.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.message("CoreTokenConfigService.schema"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Change. serviceName=" + serviceName + ", version=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void globalConfigChanged(String serviceName, String version,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String groupName, String serviceComponent, int type) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (CoreTokenUtils.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.message("CoreTokenConfigService.globalConfig"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Change. serviceName=" + serviceName + ", version="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + version + ", groupName=" + groupName + ", serviceComponent="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + serviceComponent + ", type=" + type);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initServiceConfig();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void organizationConfigChanged(String serviceName, String version,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String orgName, String groupName, String serviceComponent, int type) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (CoreTokenUtils.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CoreTokenUtils.debug.message("CoreTokenConfigService.orgConfig"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Change. serviceName=" + serviceName + ", version="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + version + ", groupName=" + groupName + ", serviceComponent="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + serviceComponent + ", type=" + type);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}