001/* 002 * Copyright 2011 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.ametys.web.frontoffice; 018 019import java.util.Map; 020import java.util.regex.Matcher; 021import java.util.regex.Pattern; 022 023import org.apache.avalon.framework.parameters.Parameters; 024import org.apache.avalon.framework.service.ServiceException; 025import org.apache.avalon.framework.service.ServiceManager; 026import org.apache.cocoon.acting.ServiceableAction; 027import org.apache.cocoon.environment.Redirector; 028import org.apache.cocoon.environment.SourceResolver; 029import org.apache.commons.lang.StringUtils; 030 031import org.ametys.web.repository.page.Page; 032import org.ametys.web.repository.site.Site; 033import org.ametys.web.repository.site.SiteManager; 034import org.ametys.web.repository.sitemap.Sitemap; 035import org.ametys.web.skin.Skin; 036import org.ametys.web.skin.SkinsManager; 037import org.ametys.web.usermanagement.UserSignupManager; 038 039/** 040 * This action redirects to the login page 041 * Can be /LANG/login.html if it does exist 042 * Otherwise redirects to cocoon://SITE/LANG/_plugins/web/page/frontoffice-formbasedauthentication/default-display/ACTION.html 043 * 044 * The LANG is determined from the requested url*, otherwise "en" is selected, otherwise the first available language is selected. 045 * 046 * Parameters are 047 * action: login or failed, transmitted to render. 048 * site: the current site. 049 * siteContextPath: the site's context path. 050 * requestedURL: the requestedURL for authentication, starting with the site's context path. 051 * 052 */ 053public class FrontLoginScreenRedirectAction extends ServiceableAction 054{ 055 private static final Pattern URL_PATTERN = Pattern.compile("^/([a-z]{2,3})/.*\\.html$"); 056 057 private SiteManager _siteManager; 058 private SkinsManager _skinsManager; 059 private UserSignupManager _userSignupManager; 060 061 @Override 062 public void service(ServiceManager smanager) throws ServiceException 063 { 064 super.service(smanager); 065 066 _siteManager = (SiteManager) smanager.lookup(SiteManager.ROLE); 067 _skinsManager = (SkinsManager) smanager.lookup(SkinsManager.ROLE); 068 _userSignupManager = (UserSignupManager) smanager.lookup(UserSignupManager.ROLE); 069 } 070 071 @Override 072 public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception 073 { 074 String siteName = parameters.getParameter("site"); 075 String action = parameters.getParameter("action"); 076 String requestedURL = parameters.getParameter("requestedURL"); 077 String siteContextPath = parameters.getParameter("siteContextPath"); 078 079 String requestedUrlWithoutContext = requestedURL; 080 if (StringUtils.isNotEmpty(siteContextPath) && requestedURL.startsWith(siteContextPath)) 081 { 082 requestedUrlWithoutContext = requestedURL.substring(siteContextPath.length()); 083 } 084 085 Site site = _siteManager.getSite(siteName); 086 Sitemap sitemap = null; 087 String language = null; 088 089 Matcher m = URL_PATTERN.matcher(requestedUrlWithoutContext); 090 if (m.matches()) 091 { 092 String possibleLang = m.group(1); 093 if (site.hasSitemap(possibleLang)) 094 { 095 language = possibleLang; 096 sitemap = site.getSitemap(language); 097 } 098 } 099 100 if (sitemap == null) 101 { 102 if (site.hasSitemap("en")) 103 { 104 language = "en"; 105 sitemap = site.getSitemap(language); 106 } 107 else 108 { 109 sitemap = site.getSitemaps().iterator().next(); 110 language = sitemap.getName(); 111 } 112 } 113 114 Skin skin = _skinsManager.getSkin(site.getSkinId()); 115 String template = "page"; 116 if (skin.getTemplate("login") != null) 117 { 118 template = "login"; 119 } 120 121 122 StringBuilder requestParameters = new StringBuilder(); 123 124 boolean publicSignup = _userSignupManager.isPublicSignupAllowed(siteName); 125 requestParameters.append("?publicSignup="); 126 requestParameters.append(publicSignup ? "true" : "false"); 127 128 Page signupPage = _userSignupManager.getSignupPage(siteName, language); 129 if (signupPage != null) 130 { 131 requestParameters.append("&signup-page="); 132 requestParameters.append(signupPage.getId()); 133 } 134 135 Page pwdChangePage = _userSignupManager.getPwdChangePage(siteName, language); 136 if (pwdChangePage != null) 137 { 138 requestParameters.append("&pwdchange-page="); 139 requestParameters.append(pwdChangePage.getId()); 140 } 141 142 String url = "cocoon://" + siteName + "/" + language + "/_plugins/web/" + template + "/frontoffice-formbasedauthentication/default-display/" + action + ".html" + requestParameters; 143 144 redirector.redirect(true, url); 145 return null; 146 } 147 148}