diff src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/edu/harvard/iq/dataverse/ManageFilePermissionsPage.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,486 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package edu.harvard.iq.dataverse;
+
+import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean;
+import edu.harvard.iq.dataverse.authorization.DataverseRole;
+import edu.harvard.iq.dataverse.authorization.Permission;
+import edu.harvard.iq.dataverse.authorization.RoleAssignee;
+import edu.harvard.iq.dataverse.authorization.RoleAssigneeDisplayInfo;
+import edu.harvard.iq.dataverse.authorization.groups.Group;
+import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean;
+import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
+import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
+import edu.harvard.iq.dataverse.engine.command.exception.PermissionException;
+import edu.harvard.iq.dataverse.engine.command.impl.AssignRoleCommand;
+import edu.harvard.iq.dataverse.engine.command.impl.RevokeRoleCommand;
+import edu.harvard.iq.dataverse.util.JsfHelper;
+import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.ejb.EJB;
+import javax.faces.application.FacesMessage;
+import javax.faces.event.ActionEvent;
+import javax.faces.view.ViewScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ *
+ * @author gdurand
+ */
+@ViewScoped
+@Named
+public class ManageFilePermissionsPage implements java.io.Serializable {
+
+    private static final Logger logger = Logger.getLogger(ManageFilePermissionsPage.class.getCanonicalName());
+
+    @EJB
+    DatasetServiceBean datasetService;
+    @EJB
+    DataFileServiceBean datafileService;
+    @EJB
+    DataverseRoleServiceBean roleService;
+    @EJB
+    RoleAssigneeServiceBean roleAssigneeService;
+    @EJB
+    PermissionServiceBean permissionService;
+    @EJB
+    AuthenticationServiceBean authenticationService;
+    @EJB 
+    GroupServiceBean groupService;  
+    @EJB
+    UserNotificationServiceBean userNotificationService;    
+    @EJB
+    EjbDataverseEngine commandEngine;
+
+    @PersistenceContext(unitName = "VDCNet-ejbPU")
+    EntityManager em;
+
+    @Inject
+    DataverseSession session;
+
+    Dataset dataset = new Dataset(); 
+    private Map<RoleAssignee,List<RoleAssignmentRow>> roleAssigneeMap = new HashMap();
+    private Map<DataFile,List<RoleAssignmentRow>> fileMap = new HashMap();
+    private Map<AuthenticatedUser,List<DataFile>> fileAccessRequestMap = new HashMap();    
+
+    public Dataset getDataset() {
+        return dataset;
+    }
+
+    public void setDataset(Dataset dataset) {
+        this.dataset = dataset;
+    }
+    
+    public Map<RoleAssignee, List<RoleAssignmentRow>> getRoleAssigneeMap() {
+        return roleAssigneeMap;
+    }
+
+    public Map<DataFile, List<RoleAssignmentRow>> getFileMap() {
+        return fileMap;
+    }
+
+    public Map<AuthenticatedUser, List<DataFile>> getFileAccessRequestMap() {
+        return fileAccessRequestMap;
+    }
+   
+
+    public String init() {
+        if (dataset.getId() != null) {
+            dataset = datasetService.find(dataset.getId());
+        }
+
+        // check if dvObject exists and user has permission
+        if (dataset == null) {
+            return "/404.xhtml";
+        }
+
+        if (!permissionService.on(dataset).has(Permission.ManageDatasetPermissions)) {
+            return "/loginpage.xhtml" + DataverseHeaderFragment.getRedirectPage();
+        }
+        
+        initMaps();
+        
+        return "";
+    }
+    
+    private void initMaps() {
+        // initialize files and usergroup list
+        roleAssigneeMap.clear();
+        fileMap.clear();
+        fileAccessRequestMap.clear();        
+               
+        for (DataFile file : dataset.getFiles()) {
+            // only include if the file is restricted (or it's draft version is restricted)
+            if (file.isRestricted() || file.getFileMetadata().isRestricted()) {
+                // we get the direct role assignments assigned to the file
+                List<RoleAssignment> ras = roleService.directRoleAssignments(file);
+                List raList = new ArrayList<>(ras.size());
+                for (RoleAssignment ra : ras) {
+                    // for files, only show role assignments which can download
+                    if (ra.getRole().permissions().contains(Permission.DownloadFile)) {
+                        raList.add(new RoleAssignmentRow(ra, roleAssigneeService.getRoleAssignee(ra.getAssigneeIdentifier()).getDisplayInfo()));                   
+                        addFileToRoleAssignee(ra);                    
+                    }
+                }
+                
+                fileMap.put(file, raList);
+                
+                // populate the file access requests map
+                for (AuthenticatedUser au : file.getFileAccessRequesters()) {
+                        List<DataFile> requestedFiles = fileAccessRequestMap.get(au);
+                        if (requestedFiles == null) {
+                            requestedFiles = new ArrayList();
+                            fileAccessRequestMap.put(au, requestedFiles);
+                        }
+
+                        requestedFiles.add(file);                    
+                    
+                }
+            }  
+        }
+        
+    }
+    
+    private void addFileToRoleAssignee(RoleAssignment assignment) {
+        RoleAssignee ra = roleAssigneeService.getRoleAssignee(assignment.getAssigneeIdentifier());
+        List<RoleAssignmentRow> assignments = roleAssigneeMap.get(ra);
+        if (assignments == null) {
+            assignments = new ArrayList();
+            roleAssigneeMap.put(ra, assignments);
+        }
+        
+        assignments.add(new RoleAssignmentRow(assignment, ra.getDisplayInfo()));
+    }
+
+    /* 
+     main page
+     */
+    
+    public void removeRoleAssignments(List<RoleAssignmentRow> raRows) {
+        for (RoleAssignmentRow raRow : raRows) {
+            revokeRole(raRow.getId());
+        }
+        
+        initMaps();
+        showUserGroupMessages();
+    }    
+
+
+    /*
+     view / remove roles dialog
+     */  
+    private DataFile selectedFile;
+    private RoleAssignee selectedRoleAssignee;
+    private List<RoleAssignmentRow> roleAssignments;
+    private List<RoleAssignmentRow> selectedRoleAssignmentRows;
+
+    public DataFile getSelectedFile() {
+        return selectedFile;
+    }
+
+    public void setSelectedFile(DataFile selectedFile) {
+        this.selectedFile = selectedFile;
+    }
+
+    public RoleAssignee getSelectedRoleAssignee() {
+        return selectedRoleAssignee;
+    }
+
+    public void setSelectedRoleAssignee(RoleAssignee selectedRoleAssignee) {
+        this.selectedRoleAssignee = selectedRoleAssignee;
+    }
+    
+    public List<RoleAssignmentRow> getRoleAssignments() {
+        return roleAssignments;
+    }
+
+    public void setRoleAssignments(List<RoleAssignmentRow> roleAssignments) {
+        this.roleAssignments = roleAssignments;
+    }
+
+    public List<RoleAssignmentRow> getSelectedRoleAssignmentRows() {
+        return selectedRoleAssignmentRows;
+    }
+
+    public void setSelectedRoleAssignmentRows(List<RoleAssignmentRow> selectedRoleAssignmentRows) {
+        this.selectedRoleAssignmentRows = selectedRoleAssignmentRows;
+    }
+    
+    public void initViewRemoveDialogByFile(DataFile file, List<RoleAssignmentRow> raRows) {
+        this.selectedFile = file;
+        this.selectedRoleAssignee = null;
+        this.roleAssignments = raRows;
+        showFileMessages();
+    }
+    
+    public void initViewRemoveDialogByRoleAssignee(RoleAssignee ra, List<RoleAssignmentRow> raRows) {
+        this.selectedFile = null;
+        this.selectedRoleAssignee = ra;
+        this.roleAssignments = raRows;
+        showUserGroupMessages();
+    }    
+    
+    public void removeRoleAssignments() {
+        for (RoleAssignmentRow raRow : selectedRoleAssignmentRows) {
+            revokeRole(raRow.getId());
+        }
+        
+        initMaps();        
+    }
+    
+    // internal method used by removeRoleAssignments
+    private void revokeRole(Long roleAssignmentId) {
+        try {
+            RoleAssignment ra = em.find(RoleAssignment.class, roleAssignmentId);
+            commandEngine.submit(new RevokeRoleCommand(ra, session.getUser()));
+            JsfHelper.addSuccessMessage(ra.getRole().getName() + " role for " + roleAssigneeService.getRoleAssignee(ra.getAssigneeIdentifier()).getDisplayInfo().getTitle() + " was removed.");
+        } catch (PermissionException ex) {
+            JH.addMessage(FacesMessage.SEVERITY_ERROR, "The role assignment was not able to be removed.", "Permissions " + ex.getRequiredPermissions().toString() + " missing.");
+        } catch (CommandException ex) {
+            JH.addMessage(FacesMessage.SEVERITY_FATAL, "The role assignment could not be removed.");
+            logger.log(Level.SEVERE, "Error removing role assignment: " + ex.getMessage(), ex);
+        }
+    }    
+  
+ 
+    /*
+     grant access dialog
+     */
+    private List<RoleAssignee> selectedRoleAssignees;
+    private List<DataFile> selectedFiles = new ArrayList();
+    private List<RoleAssignee> roleAssigneeList = new ArrayList();
+    private AuthenticatedUser fileRequester;
+    
+    public List<RoleAssignee> getSelectedRoleAssignees() {
+        return selectedRoleAssignees;
+    }
+
+    public void setSelectedRoleAssignees(List<RoleAssignee> selectedRoleAssignees) {
+        this.selectedRoleAssignees = selectedRoleAssignees;
+    }
+
+    public List<DataFile> getSelectedFiles() {
+        return selectedFiles;
+    }
+
+    public void setSelectedFiles(List<DataFile> selectedFiles) {
+        this.selectedFiles = selectedFiles;
+    }
+    
+    public AuthenticatedUser getFileRequester() {
+        return fileRequester;
+    }
+
+
+    public void initAssignDialog(ActionEvent ae) {
+        fileRequester = null;
+        selectedRoleAssignees = null;
+        selectedFiles.clear();
+        showUserGroupMessages();
+    }
+    
+    public void initAssignDialogByFile(DataFile file) {
+        fileRequester = null;
+        selectedRoleAssignees = null;
+        selectedFiles.clear();
+        selectedFiles.add(file);
+        showFileMessages();
+    }
+    public void initAssignDialogForFileRequester(AuthenticatedUser au) {
+        fileRequester = au;
+        selectedRoleAssignees = null;
+        selectedFiles.clear();
+        selectedFiles.addAll(fileAccessRequestMap.get(au));       
+        showUserGroupMessages();
+    }     
+    
+
+    public List<RoleAssignee> completeRoleAssignee(String query) {
+        if (roleAssigneeList.isEmpty()) {
+            for (AuthenticatedUser au : authenticationService.findAllAuthenticatedUsers()) {
+                roleAssigneeList.add(au);
+            }
+            for ( Group g : groupService.findGlobalGroups() ) {
+                roleAssigneeList.add( g );
+            }            
+        }
+        List<RoleAssignee> returnList = new ArrayList();
+        for (RoleAssignee ra : roleAssigneeList) {
+            // @todo unsure if containsIgnore case will work for all locales
+            if (StringUtils.containsIgnoreCase(ra.getDisplayInfo().getTitle(), query) && (selectedRoleAssignees == null || !selectedRoleAssignees.contains(ra))) {
+                returnList.add(ra);
+            }
+        }
+        return returnList;
+    }
+    
+    public void grantAccess(ActionEvent evt) {
+        // Find the built in file downloader role (currently by alias)
+        DataverseRole fileDownloaderRole = roleService.findBuiltinRoleByAlias(DataverseRole.FILE_DOWNLOADER);
+        for (RoleAssignee roleAssignee : selectedRoleAssignees) {
+            boolean sendNotification = false;
+            for (DataFile file : selectedFiles) {
+                if (assignRole(roleAssignee, file, fileDownloaderRole)) {
+                    if (file.isReleased()) {
+                        sendNotification = true;
+                    }
+                    // remove request, if it exist
+                    if (file.getFileAccessRequesters().remove(roleAssignee)) {
+                        datafileService.save(file);
+                    }                  
+                }               
+            
+            }
+
+            if (sendNotification) {
+                for (AuthenticatedUser au : roleAssigneeService.getExplicitUsers(roleAssignee)) {
+                    userNotificationService.sendNotification(au, new Timestamp(new Date().getTime()), UserNotification.Type.GRANTFILEACCESS, dataset.getId());                
+                }
+             }
+        }
+        
+        initMaps();
+    }
+    
+    public void grantAccessToRequests(AuthenticatedUser au) {
+        grantAccessToRequests(au, selectedFiles);
+    }
+    
+    public void grantAccessToAllRequests(AuthenticatedUser au) {
+        grantAccessToRequests(au, fileAccessRequestMap.get(au));
+    }    
+
+    private void grantAccessToRequests(AuthenticatedUser au, List<DataFile> files) {
+        boolean actionPerformed = false;
+        // Find the built in file downloader role (currently by alias) 
+        DataverseRole fileDownloaderRole = roleService.findBuiltinRoleByAlias(DataverseRole.FILE_DOWNLOADER);
+        for (DataFile file : files) {
+            if (assignRole(au, file, fileDownloaderRole)) {                
+                file.getFileAccessRequesters().remove(au);
+                datafileService.save(file);
+                actionPerformed = true;
+            }
+        }
+        if (actionPerformed) {
+            JsfHelper.addSuccessMessage("File Access request by " + au.getDisplayInfo().getTitle() + " was granted.");                        
+            userNotificationService.sendNotification(au, new Timestamp(new Date().getTime()), UserNotification.Type.GRANTFILEACCESS, dataset.getId());        
+            initMaps();
+        }
+
+    }
+    
+    public void rejectAccessToRequests(AuthenticatedUser au) {
+        rejectAccessToRequests(au, selectedFiles);
+    }
+    
+    public void rejectAccessToAllRequests(AuthenticatedUser au) {
+        rejectAccessToRequests(au, fileAccessRequestMap.get(au));
+    }    
+
+    private void rejectAccessToRequests(AuthenticatedUser au, List<DataFile> files) {
+        boolean actionPerformed = false;        
+        for (DataFile file : files) {               
+            file.getFileAccessRequesters().remove(au);
+            datafileService.save(file);
+            actionPerformed = true;
+        }
+
+        
+        if (actionPerformed) {
+            JsfHelper.addSuccessMessage("File Access request by " + au.getDisplayInfo().getTitle() + " was rejected.");            
+            userNotificationService.sendNotification(au, new Timestamp(new Date().getTime()), UserNotification.Type.REJECTFILEACCESS, dataset.getId());        
+            initMaps();
+        }
+    }    
+
+    private boolean assignRole(RoleAssignee ra,  DataFile file, DataverseRole r) {
+        try {
+            commandEngine.submit(new AssignRoleCommand(ra, r, file, session.getUser()));
+            JsfHelper.addSuccessMessage(r.getName() + " role assigned to " + ra.getDisplayInfo().getTitle() + " for " + file.getDisplayName() + ".");
+        } catch (PermissionException ex) {
+            JH.addMessage(FacesMessage.SEVERITY_ERROR, "The role was not able to be assigned.", "Permissions " + ex.getRequiredPermissions().toString() + " missing.");
+            return false;
+        } catch (CommandException ex) {
+            JH.addMessage(FacesMessage.SEVERITY_FATAL, "The role was not able to be assigned.");
+            logger.log(Level.SEVERE, "Error assiging role: " + ex.getMessage(), ex);
+            return false;
+        }
+        
+        return true;
+    }
+
+
+    boolean renderUserGroupMessages = false;
+    boolean renderFileMessages = false;
+       
+    public void showUserGroupMessages() {
+        renderUserGroupMessages = true;
+        renderFileMessages = false;
+    }
+
+    private void showFileMessages() {
+        renderUserGroupMessages = false;
+        renderFileMessages = true;
+    }    
+    
+    public boolean isRenderUserGroupMessages() {
+        return renderUserGroupMessages;
+    }
+
+    public void setRenderUserGroupMessages(boolean renderUserGroupMessages) {
+        this.renderUserGroupMessages = renderUserGroupMessages;
+    }
+
+    public boolean isRenderFileMessages() {
+        return renderFileMessages;
+    }
+
+    public void setRenderFileMessages(boolean renderFileMessages) {
+        this.renderFileMessages = renderFileMessages;
+    }
+
+
+
+
+
+    // inner class used fordisplay of role assignments
+    public static class RoleAssignmentRow {
+
+        private final RoleAssigneeDisplayInfo assigneeDisplayInfo;
+        private final RoleAssignment ra;
+
+        public RoleAssignmentRow(RoleAssignment anRa, RoleAssigneeDisplayInfo disInf) {
+            this.ra = anRa;
+            this.assigneeDisplayInfo = disInf;
+        }        
+        
+
+        public RoleAssigneeDisplayInfo getAssigneeDisplayInfo() {
+            return assigneeDisplayInfo;
+        }
+
+        public DvObject getDefinitionPoint() {
+            return ra.getDefinitionPoint();
+        }
+
+        
+        public Long getId() {
+            return ra.getId();
+        }
+    
+    }   
+}