Package org.jboss.seam.wiki.core.action

Source Code of org.jboss.seam.wiki.core.action.UserLogin

package org.jboss.seam.wiki.core.action;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.core.Manager;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.log.Log;
import org.jboss.seam.wiki.core.model.WikiDocument;
import org.jboss.seam.wiki.core.ui.WikiURLRenderer;
import org.jboss.seam.wiki.WikiInit;
import org.jboss.seam.Component;
import org.jboss.seam.security.Identity;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.web.ServletContexts;

/**
* Decides what to do (redirect) after a user logs in successfully.
* <p>
* This is a stateful component and therefore different than <tt>WikiSecurityEvents</tt>.
* </p>
*
* @author Christian Bauer
*/
@Name("userLogin")
public class UserLogin {

    protected final static String REGULAR_SESSION_MAX_INACTIVE_SECONDS = "regularSessionMaxInactiveInterval";

    @Logger
    Log log;

    @In(create = false, required = false)
    DocumentHome documentHome;

    @In
    WikiURLRenderer wikiURLRenderer;

    String redirectURL;

    @Observer(Identity.EVENT_LOGIN_SUCCESSFUL)
    public void onLogin() {

        // Store the regular session timeout value, so we can set it back later on logout
        int regularSessionTimeout = ServletContexts.getInstance().getRequest().getSession().getMaxInactiveInterval();
        Contexts.getSessionContext().set(REGULAR_SESSION_MAX_INACTIVE_SECONDS, regularSessionTimeout);
        WikiInit init = (WikiInit)Component.getInstance(WikiInit.class);
        if (init.getAuthenticatedSessionTimeoutMinutes() != 0) {
            log.debug("setting timeout of authenticated user session to minutes: " + init.getAuthenticatedSessionTimeoutMinutes());
            ServletContexts.getInstance().getRequest().getSession().setMaxInactiveInterval(
                init.getAuthenticatedSessionTimeoutMinutes()*60
            );
        }

        // Prepare redirect stuff
        if (documentHome != null && documentHome.isManaged()) {
            redirectURL = wikiURLRenderer.renderURL(documentHome.getInstance());
        } else {
            redirectURL = wikiURLRenderer.renderURL((WikiDocument)Component.getInstance("wikiStart"));
        }

        log.debug("preparing URL for redirect after successful login: " + redirectURL);

        log.debug("destroying all conversations after successful login");
        Manager.instance().killAllOtherConversations();

        // Finally, end the current one after we are done with documentHome
        Conversation.instance().endBeforeRedirect();
    }

    @Observer(Identity.EVENT_LOGGED_OUT)
    public void onLogout() {
        Object o = Contexts.getSessionContext().get(REGULAR_SESSION_MAX_INACTIVE_SECONDS);
        // Don't rely on that, do a null check - this should never be null but sometimes it is... *sigh*
        if (o != null) {
            int regularSessionTimeout = (Integer) o;
            log.debug("resetting timeout of user session after logout to minutes: " + regularSessionTimeout/60);
            ServletContexts.getInstance().getRequest().getSession().setMaxInactiveInterval(regularSessionTimeout);
        } else {
            // Safety, reset to a low value, 10 minutes
            // TODO: That value is actually configured in web.xml, how do we get it here?
            ServletContexts.getInstance().getRequest().getSession().setMaxInactiveInterval(600);
        }
    }

    public String getLoginRedirectURL() {
        log.debug("obtaining redirect URL: " + redirectURL);
        return redirectURL;
    }
}
TOP

Related Classes of org.jboss.seam.wiki.core.action.UserLogin

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.