/** * 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.content.targeting.anonymous.users.util; import com.liferay.content.targeting.anonymous.users.model.AnonymousUser; import com.liferay.content.targeting.anonymous.users.service.AnonymousUserLocalServiceUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.service.ServiceContext; import com.liferay.portal.util.PortalUtil; import java.util.Enumeration; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Eudaldo Alonso */ @Component public class DefaultAnonymousUsersManagerImpl implements AnonymousUsersManager { @Override public AnonymousUser getAnonymousUser( HttpServletRequest request, HttpServletResponse response) throws PortalException, SystemException { long companyId = PortalUtil.getCompanyId(request); long userId = PortalUtil.getUserId(request); ServiceContext serviceContext = new ServiceContext(); serviceContext.setCompanyId(companyId); AnonymousUser anonymousUser = null; String userIp = getAddressFromRequest(request); if (userId > 0) { anonymousUser = getAnonymousUser(request, userId); if (!anonymousUser.getLastIp().equals(userIp)) { AnonymousUserLocalServiceUtil.updateLastIp( anonymousUser.getAnonymousUserId(), userIp); } return anonymousUser; } anonymousUser = getAnonymousUserFromCookie(request); if (anonymousUser == null) { anonymousUser = AnonymousUserLocalServiceUtil.addAnonymousUser( 0, userIp, null, serviceContext); _anonymousUsersCookieManager.addCookie( request, response, anonymousUser.getAnonymousUserId()); } else if (!anonymousUser.getLastIp().equals(userIp)) { AnonymousUserLocalServiceUtil.updateLastIp( anonymousUser.getAnonymousUserId(), userIp); } return anonymousUser; } @Override public AnonymousUser getAnonymousUser( HttpServletRequest request, long userId) throws PortalException, SystemException { long companyId = PortalUtil.getCompanyId(request); ServiceContext serviceContext = new ServiceContext(); serviceContext.setCompanyId(companyId); String userIp = getAddressFromRequest(request); AnonymousUser anonymousUser = AnonymousUserLocalServiceUtil.fetchAnonymousUserByUserId(userId); if (anonymousUser == null) { anonymousUser = getAnonymousUserFromCookie(request); if ((anonymousUser == null) || ((anonymousUser.getUserId() != 0) && (anonymousUser.getUserId() != userId))) { anonymousUser = AnonymousUserLocalServiceUtil.addAnonymousUser( userId, userIp, null, serviceContext); } else { anonymousUser = AnonymousUserLocalServiceUtil.updateAnonymousUser( anonymousUser.getAnonymousUserId(), userId, userIp, anonymousUser.getTypeSettings(), serviceContext); } } return anonymousUser; } @Override public AnonymousUser getAnonymousUser( RenderRequest renderRequest, RenderResponse renderResponse) throws PortalException, SystemException { HttpServletRequest request = PortalUtil.getHttpServletRequest( renderRequest); HttpServletResponse response = PortalUtil.getHttpServletResponse( renderResponse); return getAnonymousUser(request, response); } public AnonymousUsersCookieManager getAnonymousUsersCookieManager() { return _anonymousUsersCookieManager; } @Reference public void setAnonymousUsersCookieManager( AnonymousUsersCookieManager anonymousUsersCookieManager) { _anonymousUsersCookieManager = anonymousUsersCookieManager; } protected String getAddressFromRequest(HttpServletRequest request) { if (request == null) { return null; } // See http://tools.ietf.org/html/rfc7239 if (request.getHeader(_X_FORWARDED_FOR) != null) { String ip = StringUtil.split( request.getHeader(_X_FORWARDED_FOR))[0]; if (ip != null) { return ip; } } Enumeration<String> values = request.getHeaders(_FORWARDED); if (values.hasMoreElements()) { String value = values.nextElement(); Matcher matcher = _pattern.matcher(value); if (matcher.find()) { return matcher.group(1); } } return request.getRemoteAddr(); } protected AnonymousUser getAnonymousUserFromCookie( HttpServletRequest request) throws SystemException { AnonymousUser anonymousUser = null; long anonymousUserId = _anonymousUsersCookieManager.getAnonymousUserId( request); if (anonymousUserId > 0) { anonymousUser = AnonymousUserLocalServiceUtil.fetchAnonymousUser( anonymousUserId); } return anonymousUser; } private static final String _FORWARDED = "Forwarded"; private static final String _X_FORWARDED_FOR = "X-Forwarded-For"; private AnonymousUsersCookieManager _anonymousUsersCookieManager; private final Pattern _pattern = Pattern.compile( "for=[\"\\[]*([^\\]\\,]+)[\"\\]]*"); }