com.liferay.portal.kernel.util.CookieKeys.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portal.kernel.util.CookieKeys.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 */

package com.liferay.portal.kernel.util;

import com.liferay.petra.string.CharPool;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.configuration.Filter;
import com.liferay.portal.kernel.exception.CookieNotSupportedException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Brian Wing Shun Chan
 * @author Minhchau Dang
 */
public class CookieKeys {

    public static final String COMPANY_ID = "COMPANY_ID";

    public static final String COOKIE_SUPPORT = "COOKIE_SUPPORT";

    public static final String GUEST_LANGUAGE_ID = "GUEST_LANGUAGE_ID";

    public static final String ID = "ID";

    public static final String JSESSIONID = "JSESSIONID";

    public static final String LOGIN = "LOGIN";

    public static final int MAX_AGE = (int) (Time.YEAR / 1000);

    public static final String PASSWORD = "PASSWORD";

    public static final String REMEMBER_ME = "REMEMBER_ME";

    public static final String REMOTE_PREFERENCE_PREFIX = "REMOTE_PREFERENCE_";

    public static final String SCREEN_NAME = "SCREEN_NAME";

    public static final String USER_UUID = "USER_UUID";

    public static void addCookie(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
            Cookie cookie) {

        addCookie(httpServletRequest, httpServletResponse, cookie, httpServletRequest.isSecure());
    }

    public static void addCookie(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
            Cookie cookie, boolean secure) {

        if (!_SESSION_ENABLE_PERSISTENT_COOKIES) {
            return;
        }

        // LEP-5175

        String name = cookie.getName();

        String originalValue = cookie.getValue();

        String encodedValue = originalValue;

        if (isEncodedCookie(name)) {
            encodedValue = UnicodeFormatter.bytesToHex(originalValue.getBytes());

            if (_log.isDebugEnabled()) {
                _log.debug("Add encoded cookie " + name);
                _log.debug("Original value " + originalValue);
                _log.debug("Hex encoded value " + encodedValue);
            }
        }

        cookie.setSecure(secure);
        cookie.setValue(encodedValue);
        cookie.setVersion(0);

        httpServletResponse.addCookie(cookie);

        Map<String, Cookie> cookieMap = _getCookieMap(httpServletRequest);

        cookieMap.put(StringUtil.toUpperCase(name), cookie);
    }

    public static void addSupportCookie(HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) {

        Cookie cookieSupportCookie = new Cookie(COOKIE_SUPPORT, "true");

        cookieSupportCookie.setPath(StringPool.SLASH);
        cookieSupportCookie.setMaxAge(MAX_AGE);

        addCookie(httpServletRequest, httpServletResponse, cookieSupportCookie);
    }

    public static void deleteCookies(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
            String domain, String... cookieNames) {

        if (!_SESSION_ENABLE_PERSISTENT_COOKIES) {
            return;
        }

        Map<String, Cookie> cookieMap = _getCookieMap(httpServletRequest);

        for (String cookieName : cookieNames) {
            Cookie cookie = cookieMap.remove(StringUtil.toUpperCase(cookieName));

            if (cookie != null) {
                if (domain != null) {
                    cookie.setDomain(domain);
                }

                cookie.setMaxAge(0);
                cookie.setPath(StringPool.SLASH);
                cookie.setValue(StringPool.BLANK);

                httpServletResponse.addCookie(cookie);
            }
        }
    }

    public static String getCookie(HttpServletRequest httpServletRequest, String name) {

        return getCookie(httpServletRequest, name, true);
    }

    public static String getCookie(HttpServletRequest httpServletRequest, String name, boolean toUpperCase) {

        if (!_SESSION_ENABLE_PERSISTENT_COOKIES) {
            return null;
        }

        String value = _get(httpServletRequest, name, toUpperCase);

        if ((value == null) || !isEncodedCookie(name)) {
            return value;
        }

        try {
            String encodedValue = value;

            String originalValue = new String(UnicodeFormatter.hexToBytes(encodedValue));

            if (_log.isDebugEnabled()) {
                _log.debug("Get encoded cookie " + name);
                _log.debug("Hex encoded value " + encodedValue);
                _log.debug("Original value " + originalValue);
            }

            return originalValue;
        } catch (Exception e) {
            if (_log.isWarnEnabled()) {
                _log.warn(e.getMessage());
            }

            return value;
        }
    }

    public static String getDomain(HttpServletRequest httpServletRequest) {

        // See LEP-4602 and   LEP-4618.

        if (Validator.isNotNull(_SESSION_COOKIE_DOMAIN)) {
            return _SESSION_COOKIE_DOMAIN;
        }

        if (_SESSION_COOKIE_USE_FULL_HOSTNAME) {
            return StringPool.BLANK;
        }

        return getDomain(httpServletRequest.getServerName());
    }

    public static String getDomain(String host) {

        // See LEP-4602 and LEP-4645.

        if (host == null) {
            return null;
        }

        // See LEP-5595.

        if (Validator.isIPAddress(host)) {
            return host;
        }

        int x = host.lastIndexOf(CharPool.PERIOD);

        if (x <= 0) {
            return null;
        }

        int y = host.lastIndexOf(CharPool.PERIOD, x - 1);

        if (y <= 0) {
            return StringPool.PERIOD + host;
        }

        int z = host.lastIndexOf(CharPool.PERIOD, y - 1);

        String domain = null;

        if (z <= 0) {
            domain = host.substring(y);
        } else {
            domain = host.substring(z);
        }

        return domain;
    }

    public static boolean hasSessionId(HttpServletRequest httpServletRequest) {
        String jsessionid = getCookie(httpServletRequest, JSESSIONID, false);

        if (jsessionid != null) {
            return true;
        }

        return false;
    }

    public static boolean isEncodedCookie(String name) {
        if (name.equals(ID) || name.equals(LOGIN) || name.equals(PASSWORD) || name.equals(SCREEN_NAME)
                || name.equals(USER_UUID)) {

            return true;
        }

        return false;
    }

    public static void validateSupportCookie(HttpServletRequest httpServletRequest)
            throws CookieNotSupportedException {

        if (_SESSION_ENABLE_PERSISTENT_COOKIES && _SESSION_TEST_COOKIE_SUPPORT) {

            String cookieSupport = getCookie(httpServletRequest, COOKIE_SUPPORT, false);

            if (Validator.isNull(cookieSupport)) {
                throw new CookieNotSupportedException();
            }
        }
    }

    private static String _get(HttpServletRequest httpServletRequest, String name, boolean toUpperCase) {

        Map<String, Cookie> cookieMap = _getCookieMap(httpServletRequest);

        if (toUpperCase) {
            name = StringUtil.toUpperCase(name);
        }

        Cookie cookie = cookieMap.get(name);

        if (cookie == null) {
            return null;
        }

        return cookie.getValue();
    }

    private static Map<String, Cookie> _getCookieMap(HttpServletRequest httpServletRequest) {

        Map<String, Cookie> cookieMap = (Map<String, Cookie>) httpServletRequest
                .getAttribute(CookieKeys.class.getName());

        if (cookieMap != null) {
            return cookieMap;
        }

        Cookie[] cookies = httpServletRequest.getCookies();

        if (cookies == null) {
            cookieMap = new HashMap<>();
        } else {
            cookieMap = new HashMap<>(cookies.length * 4 / 3);

            for (Cookie cookie : cookies) {
                String cookieName = GetterUtil.getString(cookie.getName());

                cookieName = StringUtil.toUpperCase(cookieName);

                cookieMap.put(cookieName, cookie);
            }
        }

        httpServletRequest.setAttribute(CookieKeys.class.getName(), cookieMap);

        return cookieMap;
    }

    private static final String _SESSION_COOKIE_DOMAIN = PropsUtil.get(PropsKeys.SESSION_COOKIE_DOMAIN);

    private static final boolean _SESSION_COOKIE_USE_FULL_HOSTNAME = GetterUtil.getBoolean(
            PropsUtil.get(PropsKeys.SESSION_COOKIE_USE_FULL_HOSTNAME, new Filter(ServerDetector.getServerId())));

    private static final boolean _SESSION_ENABLE_PERSISTENT_COOKIES = GetterUtil
            .getBoolean(PropsUtil.get(PropsKeys.SESSION_ENABLE_PERSISTENT_COOKIES));

    private static final boolean _SESSION_TEST_COOKIE_SUPPORT = GetterUtil
            .getBoolean(PropsUtil.get(PropsKeys.SESSION_TEST_COOKIE_SUPPORT));

    private static final Log _log = LogFactoryUtil.getLog(CookieKeys.class);

}