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}