/* * * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under * one or more contributor license agreements (see COPYRIGHT for details). * The CA licenses this file to you under the GNU Affero General Public * License version 3, (the "License"); you may not use this file except in * compliance with the License. This file is part of kune. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package cc.kune.core.server; import java.util.Date; import javax.persistence.NoResultException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jetty.server.SessionManager; import org.eclipse.jetty.server.session.HashSessionManager; import cc.kune.core.server.manager.UserManager; import cc.kune.core.server.notifier.UsersOnline; import cc.kune.core.server.xmpp.XmppRosterPresenceProvider; import cc.kune.core.shared.SessionConstants; import cc.kune.domain.User; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; // @LogThis /** * The Class UserSessionManager. * * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado) */ @Singleton public class UserSessionManagerImpl implements UsersOnline, UserSessionManager { /** The Constant LOG. */ public static final Log LOG = LogFactory.getLog(UserSessionManagerImpl.class); /** The presence manager. */ private final XmppRosterPresenceProvider presenceManager; private final Provider<HttpServletRequest> requestProvider; /** The manager. */ private final UserManager userManager; private final org.waveprotocol.box.server.authentication.SessionManager waveSessionManager; /** * Instantiates a new user session manager. * * @param userManager * the manager * @param userSessionProv * the user session prov * @param jettySessionManager * the jetty session manager * @param userSessionMonitor * the user session monitor * @param presence * the presence */ @Inject public UserSessionManagerImpl(final UserManager userManager, final org.waveprotocol.box.server.authentication.SessionManager waveSessionManager, final SessionManager jettySessionManager, final UserSessionMonitor userSessionMonitor, final XmppRosterPresenceProvider presence, final Provider<HttpServletRequest> requestProvider) { this.userManager = userManager; this.waveSessionManager = waveSessionManager; this.presenceManager = presence; this.requestProvider = requestProvider; final HashSessionManager hSessionManager = (HashSessionManager) jettySessionManager; hSessionManager.setMaxInactiveInterval(-1); hSessionManager.setSavePeriod(5); // Delete sessions with problems http://jira.codehaus.org/browse/JETTY-1484 hSessionManager.setDeleteUnrestorableSessions(true); hSessionManager.addEventListener(userSessionMonitor); LOG.debug(String.format("User sessions: %d", hSessionManager.getSessions())); LOG.debug(String.format("User sessions total: %d", hSessionManager.getSessionsTotal())); // this prevent saving the session?? // hSessionManager.setUsingCookies(true); } /* * (non-Javadoc) * * @see cc.kune.core.server.UserSessionManager#getHashFromSession() */ @Override public String getHash() { final HttpSession session = getSession(); return session == null ? null : (String) session.getAttribute(USER_HASH); } private HttpSession getSession() { return requestProvider.get().getSession(); } @SuppressWarnings("unused") // Right now this is only used in websocket connect (can be cross-domain) to // get the session and in the InitData generation to get the websocket info private HttpSession getSessionFromHash(final String userHash) { HttpSession session = null; if (userHash != null) { try { session = waveSessionManager.getSessionFromToken(userHash); } catch (final NullPointerException e) { // If the hash don't exist jetty throws a NPE } } return session; } /* * (non-Javadoc) * * @see cc.kune.core.server.UserSessionManager#getUser() */ @Override public User getUser() { final HttpSession session = getSession(); if (session != null) { final Object attribute = session.getAttribute(USER_ID); return userManager.find((Long) attribute); } else { return User.UNKNOWN_USER; } } /* * (non-Javadoc) * * @see cc.kune.core.server.notifier.UsersOnline#isOnline(java.lang.String) */ /* * (non-Javadoc) * * @see cc.kune.core.server.UserSessionManager#isOnline(java.lang.String) */ @Override public boolean isOnline(final String shortname) { try { final long diffToLastConnection = (new Date()).getTime() - presenceManager.getLastConnected(shortname); return diffToLastConnection < SessionConstants._2_HOURS; } catch (final NoResultException e) { return false; } } /* * (non-Javadoc) * * @see cc.kune.core.server.UserSessionManager#isUserLoggedIn() */ @Override public boolean isUserLoggedIn() { final HttpSession session = getSession(); if (session == null) { return false; } else { return (session.getAttribute(USER_ID) != null); } } /* * (non-Javadoc) * * @see * cc.kune.core.server.UserSessionManager#isUserNotLoggedIn(java.lang.String) */ @Override public boolean isUserNotLoggedIn() { return !isUserLoggedIn(); } /* * (non-Javadoc) * * @see cc.kune.core.server.UserSessionManager#login(java.lang.Long, * java.lang.String) */ @Override public void login(final Long userId, final String newUserHash) { final HttpSession session = getSession(); session.setAttribute(USER_ID, userId); session.setAttribute(USER_HASH, newUserHash); } /* * (non-Javadoc) * * @see cc.kune.core.server.UserSessionManager#logout() */ @Override public void logout() { final HttpSession session = getSession(); session.setAttribute(USER_ID, null); session.setAttribute(USER_HASH, null); waveSessionManager.logout(session); } }