///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition 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 General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.web.wicket; import java.io.Serializable; import java.util.TimeZone; import org.apache.wicket.Session; import org.apache.wicket.core.request.ClientInfo; import org.apache.wicket.protocol.http.ClientProperties; import org.apache.wicket.protocol.http.WebSession; import org.apache.wicket.protocol.http.request.WebClientInfo; import org.apache.wicket.request.Request; import org.projectforge.Version; import org.projectforge.common.NumberHelper; import org.projectforge.core.Configuration; import org.projectforge.user.PFUserContext; import org.projectforge.user.PFUserDO; import org.projectforge.web.UserAgentBrowser; import org.projectforge.web.UserAgentDetection; import org.projectforge.web.UserAgentDevice; import org.projectforge.web.UserAgentOS; public class MySession extends WebSession { private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(MySession.class); private static final long serialVersionUID = -1783696379234637066L; private PFUserDO user; private String userAgent; private UserAgentDevice userAgentDevice = UserAgentDevice.UNKNOWN; private UserAgentBrowser userAgentBrowser = UserAgentBrowser.UNKNOWN; private ClientProperties clientProperties; private String userAgentBrowserVersionString = null; private Version userAgentBrowserVersion = null; private UserAgentOS userAgentOS = UserAgentOS.UNKNOWN; private boolean mobileUserAgent; private boolean ignoreMobileUserAgent; /** * Random cross site request forgery token. */ private final String csrfToken; public MySession(final Request request) { super(request); setLocale(request); final ClientInfo info = getClientInfo(); if (info instanceof WebClientInfo) { clientProperties = ((WebClientInfo) clientInfo).getProperties(); clientProperties.setTimeZone(PFUserContext.getTimeZone()); userAgent = ((WebClientInfo) info).getUserAgent(); userAgentDevice = UserAgentDevice.getUserAgentDevice(userAgent); userAgentOS = UserAgentOS.getUserAgentOS(userAgent); mobileUserAgent = userAgentDevice.isMobile(); final UserAgentDetection userAgentDetection = UserAgentDetection.browserDetect(userAgent); userAgentBrowser = userAgentDetection.getUserAgentBrowser(); userAgentBrowserVersionString = userAgentDetection.getUserAgentBrowserVersion(); } else { log.error("Oups, ClientInfo is not from type WebClientInfo: " + info); } setUser(PFUserContext.getUser()); this.csrfToken = NumberHelper.getSecureRandomUrlSaveString(20); } public static MySession get() { return (MySession) Session.get(); } /** * @return The logged-in user or null if no user is logged-in. */ public synchronized PFUserDO getUser() { return user; } /** * @return the randomized cross site request forgery token */ public String getCsrfToken() { return csrfToken; } /** * @return The id of the logged-in user or null if no user is logged-in. */ public synchronized Integer getUserId() { return user != null ? user.getId() : null; } public synchronized void setUser(final PFUserDO user) { this.user = user; dirty(); } public synchronized boolean isAuthenticated() { return (user != null); } public synchronized TimeZone getTimeZone() { return user != null ? user.getTimeZoneObject() : Configuration.getInstance().getDefaultTimeZone(); } public String getUserAgent() { return userAgent; } /** * @return the userAgentOS */ public UserAgentOS getUserAgentOS() { return userAgentOS; } /** * @return true, if the user agent device is an iPad, iPhone or iPod. */ public boolean isIOSDevice() { return this.userAgentDevice != null && this.userAgentDevice.isIn(UserAgentDevice.IPAD, UserAgentDevice.IPHONE, UserAgentDevice.IPOD); } /** * @return true, if the user agent is a mobile agent and ignoreMobileUserAgent isn't set, otherwise false. */ public boolean isMobileUserAgent() { if (ignoreMobileUserAgent == true) { return false; } return mobileUserAgent; } /** * The user wants to ignore the mobile agent and wants to get the PC version (normal web version). * @return */ public boolean isIgnoreMobileUserAgent() { return ignoreMobileUserAgent; } /** * @return the userAgentBrowser */ public UserAgentBrowser getUserAgentBrowser() { return userAgentBrowser; } /** * @return the userAgentBrowserVersion */ public String getUserAgentBrowserVersionString() { return userAgentBrowserVersionString; } /** * @return the userAgentBrowserVersion */ public Version getUserAgentBrowserVersion() { if (userAgentBrowserVersion == null && userAgentBrowserVersionString != null) { userAgentBrowserVersion = new Version(userAgentBrowserVersionString); } return userAgentBrowserVersion; } /** * @return the userAgentDevice */ public UserAgentDevice getUserAgentDevice() { return userAgentDevice; } public void setIgnoreMobileUserAgent(final boolean ignoreMobileUserAgent) { this.ignoreMobileUserAgent = ignoreMobileUserAgent; } public void login(final PFUserDO user, final Request request) { if (user == null) { log.warn("Oups, no user given to log in."); return; } this.user = user; log.debug("User logged in: " + user.getShortDisplayName()); PFUserContext.setUser(user); setLocale(request); } /** * Sets or updates the locale of the user's session. Takes the locale of the user account or if not given the locale of the given request. * @param request */ public void setLocale(final Request request) { setLocale(PFUserContext.getLocale(request.getLocale())); } public void logout() { if (user != null) { log.info("User logged out: " + user.getShortDisplayName()); user = null; } PFUserContext.setUser(null); super.clear(); super.invalidate(); } public void put(final String name, final Serializable value) { super.setAttribute(name, value); } public Object get(final String name) { return super.getAttribute(name); } /** * @return the clientProperties */ public ClientProperties getClientProperties() { return clientProperties; } }