8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna * Copyright (c) 2011-2016 ForgeRock AS. 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 * http://forgerock.org/license/CDDLv1.0.html
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 http://forgerock.org/license/CDDLv1.0.html
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, add 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 */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage org.forgerock.openam.authentication.service;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
e2c8a434054afd7228765bdfb72df3c6117be3b8David Lunaimport com.iplanet.dpro.session.SessionException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.dpro.session.service.InternalSession;
e2c8a434054afd7228765bdfb72df3c6117be3b8David Lunaimport org.forgerock.openam.sso.providers.stateless.StatelessSession;
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Enumeration;
e2c8a434054afd7228765bdfb72df3c6117be3b8David Lunaimport java.util.Set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This class is used in case of session upgrade for copying session properties
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * from the old session into the new one. Subclasses should implement
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * {@link #shouldCopy(java.lang.String)} in order to control which properties
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * are needed to copy into the new session.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * In case you want to modify the copyable session property you are encouraged
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to override {@link #updateProperty(com.iplanet.dpro.session.service.InternalSession,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * java.lang.String, java.lang.String)} method.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @supported.all.api
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic abstract class SessionPropertyUpgrader {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Entry point for LoginState. This method is called during session upgrade
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * in order to copy session attributes from one session to another.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param oldSession The previous session
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param newSession The new session
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param forceAuth Whether the authentication was forced
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public final void populateProperties(InternalSession oldSession, InternalSession newSession, boolean forceAuth) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Enumeration<String> allProperties = oldSession.getPropertyNames();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (allProperties.hasMoreElements()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String key = allProperties.nextElement();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String value = (String) oldSession.getProperty(key);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (shouldCopy(key)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!forceAuth) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster updateProperty(newSession, key, value);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster updateProperty(oldSession, key, value);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna /**
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna * Entry point for LoginState. This method is called during session upgrade
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna * in order to copy session attributes from one session to another.
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna *
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna * @param oldSession The previous (stateless) session
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna * @param newSession The new session
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna */
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna public final void populatePropertiesFromStateless(StatelessSession oldSession,
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna InternalSession newSession) throws SessionException {
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna Set<String> allProperties = oldSession.getPropertyNames();
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna for (String key : allProperties) {
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna String value = oldSession.getProperty(key);
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna if (shouldCopy(key)) {
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna if (value != null) {
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna newSession.putProperty(key, value);
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna }
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna }
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna }
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna }
e2c8a434054afd7228765bdfb72df3c6117be3b8David Luna
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This method updates a session property in the session with the given value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Override this method if you want to change some properties during the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * upgrade process.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * NOTE: If you override this, you SHOULD call super.updateProperty(..)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at the end of your implementation with the updated values.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param session Session object where the property should be set
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param property Name of the property to set
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param value Value of the given session property
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void updateProperty(InternalSession session, String property, String value) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (value != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster session.putProperty(property, value);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This method decides whether a given session property should be copied to
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the new session.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param key The name of the session property which we want to decide to copy
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return <code>true</code> if the property with the given key should be
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * copied into the new session
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public abstract boolean shouldCopy(String key);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}