001/*
002 *  Copyright 2017 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 */
016package org.ametys.plugins.workspaces.documents;
017
018import java.util.HashSet;
019import java.util.Set;
020
021import org.apache.avalon.framework.service.ServiceException;
022import org.apache.avalon.framework.service.ServiceManager;
023import org.apache.commons.lang.StringUtils;
024
025import org.ametys.cms.transformation.URIResolver;
026import org.ametys.core.authentication.token.AuthenticationTokenManager;
027import org.ametys.core.user.CurrentUserProvider;
028import org.ametys.core.user.UserIdentity;
029import org.ametys.plugins.explorer.resources.Resource;
030import org.ametys.plugins.explorer.resources.ResourceCollection;
031import org.ametys.plugins.repository.AmetysObject;
032import org.ametys.plugins.workspaces.project.objects.Project;
033
034/**
035 * {@link URIResolver} for webdav "project-resource". <br>
036 * These links point to a file from the resources of a project through webdav
037 */
038public class WebdavProjectResourceURIResolver extends ProjectResourceURIResolver
039{
040    /** The authentication token manager */
041    protected AuthenticationTokenManager _authenticationTokenManager;
042    
043    /** Current User Provider */
044    protected CurrentUserProvider _currentUserProvider;
045    
046    @Override
047    public void service(ServiceManager manager) throws ServiceException
048    {
049        super.service(manager);
050        _authenticationTokenManager = (AuthenticationTokenManager) manager.lookup(AuthenticationTokenManager.ROLE);
051        _currentUserProvider = (CurrentUserProvider) manager.lookup(CurrentUserProvider.ROLE);
052    }
053    
054    @Override
055    public String getType()
056    {
057        return "webdav-project-resource";
058    }
059    
060    @Override
061    protected String getUriPrefix(AmetysObject object, boolean download, boolean absolute, boolean internal)
062    {
063        Project project = null;
064        String projectName = null;
065        String siteName = null;
066
067        UserIdentity user = _currentUserProvider.getUser();
068        long duration = 12 * 60 * 60; // 12h
069        boolean autoRenew = true; // Auto Renew the token to be able to continue to edit it
070        
071        Set<String> contexts = new HashSet<>();
072        String path = getPath(object); // Token only usable on this resource
073        path = StringUtils.removeStart(path, "/"); // / at the beginning is removed because it is used in a uri path
074        contexts.add(path);
075        
076        if (object instanceof Resource)
077        {
078            String parentPath = getPath(object.getParent());
079            parentPath = StringUtils.removeStart(parentPath, "/").concat("/"); // / at the beginning is removed because it is used in a uri path, / at the end to avoid identical folders
080            contexts.add(parentPath);
081        }
082        String type = "Workspaces-Webdav";
083        String comment = "Token created to modify content : '" + object.getId() + "'";
084        String token = _authenticationTokenManager.generateToken(user, duration, autoRenew, null, contexts, type, comment);
085        
086        project = _getProject(object);
087        projectName = project.getName();
088
089        siteName = project.getSites().iterator().next().getName();
090        
091        if (internal)
092        {
093            return "cocoon://_workspaces/dav/" + projectName + "/" + token;
094        }
095        else if (absolute)
096        {
097            return _webPrefixHandler.getAbsoluteUriPrefix(siteName) + "/_workspaces/dav/" + projectName + "/" + token;
098        }
099        else
100        {
101            return _webPrefixHandler.getUriPrefix(siteName) + "/_workspaces/dav/" + projectName + "/" + token;
102        }
103    }
104    
105    /**
106     * Get the path of a {@link Resource} or a {@link ResourceCollection}
107     * @param resource the resource to work with
108     * @return the path
109     */
110    protected String getPath(AmetysObject resource)
111    {
112        String path = null;
113        if (resource instanceof Resource)
114        {
115            path = getResourcePath((Resource) resource);
116        }
117        else if (resource instanceof ResourceCollection)
118        {
119            path = ((ResourceCollection) resource).getExplorerPath();
120        }
121        else
122        {
123            getLogger().error("Trying to access to something that is not a Resource or a ResourceCollection : " + resource.getId());
124        }
125        return path;
126    }
127    
128    @Override
129    protected String getRealPrefix(Resource resource, String prefix)
130    {
131        return null;
132    }
133}