/** * 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.opensocial.shindig.servlet; import com.google.inject.Injector; import com.liferay.opensocial.shindig.util.HttpServletRequestThreadLocal; import com.liferay.opensocial.shindig.util.ShindigUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.Company; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.security.auth.AuthenticatedUserUUIDStoreUtil; import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.security.permission.PermissionCheckerFactoryUtil; import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; import com.liferay.portal.kernel.service.CompanyLocalServiceUtil; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.liferay.portal.kernel.util.CookieKeys; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import com.liferay.util.Encryptor; import com.liferay.util.EncryptorException; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.UnavailableException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.shindig.common.servlet.GuiceServletContextListener; import org.apache.shindig.common.servlet.InjectedFilter; /** * @author Michael Young * @author Dennis Ju */ public class ShindigFilter extends InjectedFilter { public void destroy() { } public void doFilter( ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; if (injector == null) { HttpSession session = request.getSession(); _init(session.getServletContext()); } PermissionChecker permissionChecker = PermissionThreadLocal.getPermissionChecker(); if (permissionChecker == null) { setPermissionChecker(servletRequest); } ShindigUtil.setScheme(servletRequest.getScheme()); String serverName = servletRequest.getServerName(); String host = serverName.concat(StringPool.COLON).concat( String.valueOf(servletRequest.getServerPort())); ShindigUtil.setHost(host); HttpServletRequestThreadLocal.setHttpServletRequest(request); try { filterChain.doFilter(servletRequest, servletResponse); } finally { HttpServletRequestThreadLocal.setHttpServletRequest(null); } } @Override public void init(FilterConfig filterConfig) throws ServletException { // LPS-23577 and LPS-41715 injector = null; } protected boolean setPermissionChecker(ServletRequest servletRequest) { String companyIdString = CookieKeys.getCookie( (HttpServletRequest)servletRequest, CookieKeys.COMPANY_ID); if (Validator.isNull(companyIdString)) { return false; } long companyId = GetterUtil.getLong(companyIdString); String userUUID = StringPool.BLANK; try { Company company = CompanyLocalServiceUtil.fetchCompany(companyId); if (company == null) { return false; } String userUUIDString = CookieKeys.getCookie( (HttpServletRequest)servletRequest, CookieKeys.USER_UUID); if (Validator.isNull(userUUIDString)) { return false; } userUUID = GetterUtil.getString( Encryptor.decrypt(company.getKeyObj(), userUUIDString)); } catch (EncryptorException ee) { return false; } catch (Exception e) { _log.error(e, e); return false; } if (!AuthenticatedUserUUIDStoreUtil.exists(userUUID)) { return false; } String userIdString = userUUID.substring( 0, userUUID.indexOf(StringPool.PERIOD)); long userId = GetterUtil.getLong(userIdString); try { User user = UserLocalServiceUtil.getUserById(userId); PrincipalThreadLocal.setName(userIdString); PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(user); PermissionThreadLocal.setPermissionChecker(permissionChecker); } catch (Exception e) { _log.error(e, e); return false; } return true; } private void _init(ServletContext servletContext) throws ServletException { injector = (Injector)servletContext.getAttribute( GuiceServletContextListener.INJECTOR_ATTRIBUTE); if (injector == null) { injector = (Injector)servletContext.getAttribute( GuiceServletContextListener.INJECTOR_NAME); if (injector == null) { throw new UnavailableException( "Guice injector is not available. Please register " + GuiceServletContextListener.class.getName() + "."); } } injector.injectMembers(this); } private static final Log _log = LogFactoryUtil.getLog(ShindigFilter.class); }