/* * Copyright (C) 2003-2017 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.management.backup.service.web; import org.exoplatform.commons.utils.IOUtil; import org.exoplatform.management.backup.operations.BackupExportResource; import org.exoplatform.management.backup.operations.BackupImportResource; import org.exoplatform.management.backup.service.BackupInProgressException; import org.exoplatform.web.filter.Filter; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * The Class BackupInProgressFilter. */ public class BackupInProgressFilter implements Filter { /** The Constant MAINTENANCE_PAGE_PATH. */ private static final String MAINTENANCE_PAGE_PATH = System.getProperty("exo.staging.maintenance.page", "html/backupInProgress.html"); /** The maintenance page content. */ private static String MAINTENANCE_PAGE_CONTENT; static { try { MAINTENANCE_PAGE_CONTENT = IOUtil.getResourceAsString(MAINTENANCE_PAGE_PATH); } catch (IOException e) { MAINTENANCE_PAGE_CONTENT = "Server is in maintenance"; } } /** * {@inheritDoc} */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (BackupImportResource.restoreInProgress) { displayBackupMaintenancePage(response); return; } HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServletResponse = (HttpServletResponse) response; try { if (BackupExportResource.backupInProgress) { checkWantLogout(httpServletRequest, httpServletResponse); } chain.doFilter(request, response); } catch (Throwable e) { if (checkException(e)) { if (checkWantLogout(httpServletRequest, httpServletResponse)) { // Nothing to do } else if (checkLoginURI(httpServletRequest)) { httpServletResponse.sendRedirect("/"); } else { displayBackupMaintenancePage(response); } } else { throw e; } } } /** * Display backup maintenance page. * * @param response the response * @throws IOException Signals that an I/O exception has occurred. */ private void displayBackupMaintenancePage(ServletResponse response) throws IOException { response.getWriter().append(MAINTENANCE_PAGE_CONTENT); } /** * Check want logout. * * @param httpServletRequest the http servlet request * @param httpServletResponse the http servlet response * @return true, if successful * @throws IOException Signals that an I/O exception has occurred. */ private boolean checkWantLogout(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { if (checkLogoutURI(httpServletRequest)) { try { httpServletRequest.getSession().invalidate(); } catch (Exception e) { // Nothing to do } Cookie[] cookies = httpServletRequest.getCookies(); for (Cookie cookie : cookies) { if (cookie.getName().equals("rememberme")) { cookie.setMaxAge(0); httpServletResponse.addCookie(cookie); break; } } return true; } return false; } /** * Check login URI. * * @param request the request * @return true, if successful */ private boolean checkLoginURI(HttpServletRequest request) { return ((HttpServletRequest) request).getRequestURI().contains("/login"); } /** * Check logout URI. * * @param request the request * @return true, if successful */ private boolean checkLogoutURI(HttpServletRequest request) { return ((HttpServletRequest) request).getRequestURI().toLowerCase().contains("logout") || (((HttpServletRequest) request).getQueryString() != null && ((HttpServletRequest) request).getQueryString().toLowerCase().contains("=logout")); } /** * Check exception. * * @param e the e * @return true, if successful */ private boolean checkException(Throwable e) { if (e == null) { return false; } else if (e instanceof BackupInProgressException) { BackupInProgressException.untreatedException.set(false); return true; } else if (e.getCause() == null) { return false; } else { return checkException(e.getCause()); } } }