/** * Copyright (C) 2009 eXo Platform SAS. * * This 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 software 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. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.portal.webui.application; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import org.exoplatform.portal.application.StandaloneAppRequestContext; import org.exoplatform.portal.config.DataStorage; import org.exoplatform.portal.config.model.Application; import org.exoplatform.portal.config.model.PortalConfig; import org.exoplatform.portal.pom.spi.gadget.Gadget; import org.exoplatform.portal.webui.util.PortalDataMapper; import org.exoplatform.services.security.ConversationState; import org.exoplatform.web.login.LoginServlet; import org.exoplatform.web.login.LogoutControl; import org.exoplatform.web.security.security.AbstractTokenService; import org.exoplatform.web.security.security.CookieTokenService; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.core.UIContainer; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; @ComponentConfig(template = "system:/groovy/portal/webui/application/UIStandaloneAppContainer.gtmpl", events = { @EventConfig(listeners = UIStandaloneAppContainer.LogoutActionListener.class) }) public class UIStandaloneAppContainer extends UIContainer { private boolean lossData; private UIStandaloneGadget currApp; public String getCurrStorageId() { if (currApp != null) { return currApp.getStorageId(); } return null; } public String getCurrAppName() { if (currApp != null) { return currApp.getApplicationName(); } return null; } public void setCurrStorageId(String storageId) throws Exception { // New app, so we reset the lossData status lossData = false; currApp = getChildByStorageId(storageId); if (currApp != null) { return; } DataStorage ds = getApplicationComponent(DataStorage.class); String[] siteInfo; try { siteInfo = ds.getSiteInfo(storageId); } catch (Exception ex) { lossData = true; return; } String siteType = null; String siteOwner = null; if (siteInfo != null) { siteType = siteInfo[0]; siteOwner = siteInfo[1]; } ConversationState currentState = ConversationState.getCurrent(); if (PortalConfig.USER_TYPE.equals(siteType) && currentState.getIdentity().getUserId().equals(siteOwner)) { Application<Gadget> gadgetModel = ds.getApplicationModel(storageId); UIStandaloneGadget staGadget = createUIComponent(UIStandaloneGadget.class, null, null); staGadget.setStorageId(storageId); PortalDataMapper.toUIGadget(staGadget, gadgetModel); addChild(staGadget); currApp = staGadget; } } private UIStandaloneGadget getChildByStorageId(String storageId) { for (UIComponent child : getChildren()) { if (child instanceof UIStandaloneGadget) { UIStandaloneGadget gadget = (UIStandaloneGadget) child; if (gadget.getStorageId().equals(storageId)) { return gadget; } } } return null; } public boolean isLossData() { return lossData; } @Override public void processRender(WebuiRequestContext context) throws Exception { if (!lossData) { if (currApp != null && currApp.isLossData()) { removeChildById(currApp.getId()); currApp = null; lossData = true; } } super.processRender(context); } public static class LogoutActionListener extends EventListener<UIComponent> { public void execute(Event<UIComponent> event) throws Exception { StandaloneAppRequestContext context = (StandaloneAppRequestContext) event.getRequestContext(); HttpServletRequest req = context.getRequest(); // Delete the token from JCR String token = getTokenCookie(req); if (token != null) { AbstractTokenService tokenService = AbstractTokenService.getInstance(CookieTokenService.class); tokenService.deleteToken(token); } token = LoginServlet.getOauthRememberMeTokenCookie(req); if (token != null) { AbstractTokenService tokenService = AbstractTokenService.getInstance(CookieTokenService.class); tokenService.deleteToken(token); } LogoutControl.wantLogout(); Cookie cookie = new Cookie(LoginServlet.COOKIE_NAME, ""); cookie.setPath(req.getContextPath()); cookie.setMaxAge(0); context.getResponse().addCookie(cookie); Cookie oauthCookie = new Cookie(LoginServlet.OAUTH_COOKIE_NAME, ""); oauthCookie.setPath(req.getContextPath()); oauthCookie.setMaxAge(0); context.getResponse().addCookie(oauthCookie); context.sendRedirect(req.getRequestURI()); } private String getTokenCookie(HttpServletRequest req) { Cookie[] cookies = req.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (LoginServlet.COOKIE_NAME.equals(cookie.getName())) { return cookie.getValue(); } } } return null; } } }