/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program 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. * * Copyright (c) 2002-2017 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.solutionbrowser.fileproperties; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.xml.client.Document; import com.google.gwt.xml.client.Element; import com.google.gwt.xml.client.Node; import com.google.gwt.xml.client.NodeList; import com.google.gwt.xml.client.Text; import com.google.gwt.xml.client.XMLParser; import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback; import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox; import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox; import org.pentaho.gwt.widgets.client.filechooser.RepositoryFile; import org.pentaho.mantle.client.messages.Messages; import org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel; import java.util.ArrayList; import java.util.List; /** * Permissions tab sub panel of FilePropertiesDialog. GET ACL call is performed by FilePropertiesDialog and then * passed to sub panels to consolidate */ public class PermissionsPanel extends FlexTable implements IFileModifier { private static final String RECIPIENT_TYPE_ELEMENT_NAME = "recipientType"; //$NON-NLS-1$ private static final String PERMISSIONS_ELEMENT_NAME = "permissions"; //$NON-NLS-1$ private static final String RECIPIENT_ELEMENT_NAME = "recipient"; //$NON-NLS-1$ private static final String MODIFIABLE_ELEMENT_NAME = "modifiable"; //$NON-NLS-1$ private static final String ACES_ELEMENT_NAME = "aces"; //$NON-NLS-1$ private static final String OWNER_NAME_ELEMENT_NAME = "owner"; //$NON-NLS-1$ private static final String OWNER_TYPE_ELEMENT_NAME = "ownerType"; //$NON-NLS-1$ public static final int USER_TYPE = 0; public static final int ROLE_TYPE = 1; public static final int PERM_READ = 0; public static final int PERM_WRITE = 1; public static final int PERM_DELETE = 2; public static final int PERM_GRANT_PERM = 3; public static final int PERM_ALL = 4; private static final String INHERITS_ELEMENT_NAME = "entriesInheriting"; //$NON-NLS-1$ boolean dirty = false; ArrayList<String> existingUsersAndRoles = new ArrayList<String>(); RepositoryFile fileSummary; Document fileInfo; Document origFileInfo; boolean origInheritAclFlag = false; ListBox usersAndRolesList = new ListBox( true ); Label permissionsLabel = new Label( Messages.getString( "permissionsColon" ) ); //$NON-NLS-1$ FlexTable permissionsTable = new FlexTable(); Button removeButton = new Button( Messages.getString( "remove" ) ); //$NON-NLS-1$ Button addButton = new Button( Messages.getString( "addPeriods" ) ); //$NON-NLS-1$ final CheckBox readPermissionCheckBox = new CheckBox( Messages.getString( "read" ) ); //$NON-NLS-1$ final CheckBox deletePermissionCheckBox = new CheckBox( Messages.getString( "delete" ) ); //$NON-NLS-1$ final CheckBox writePermissionCheckBox = new CheckBox( Messages.getString( "write" ) ); //$NON-NLS-1$ final CheckBox managePermissionCheckBox = new CheckBox( Messages.getString( "managePermissions" ) ); //$NON-NLS-1$ final CheckBox inheritsCheckBox = new CheckBox( Messages.getString( "inherits" ) ); //$NON-NLS-1$ /** * @param fileSummary */ public PermissionsPanel( RepositoryFile theFileSummary ) { this.fileSummary = theFileSummary; removeButton.setStylePrimaryName( "pentaho-button" ); addButton.setStylePrimaryName( "pentaho-button" ); usersAndRolesList.getElement().setId( "sharePanelUsersAndRolesList" ); addButton.getElement().setId( "sharePanelAddButton" ); removeButton.getElement().setId( "sharePanelRemoveButton" ); removeButton.addClickHandler( new ClickHandler() { public void onClick( ClickEvent clickEvent ) { // find list to remove if ( usersAndRolesList.getItemCount() == 0 ) { return; } dirty = true; for ( final String userOrRoleString : SelectUserOrRoleDialog.getSelectedItemsValue( usersAndRolesList ) ) { String recipientType = getRecipientTypeByValue( userOrRoleString ); //"(user)".length() = "(role)".length() = 6 String userOrRoleNameString = userOrRoleString.substring( 0, userOrRoleString.length() - 6 ); removeRecipient( userOrRoleNameString, recipientType, fileInfo ); usersAndRolesList.removeItem( usersAndRolesList.getSelectedIndex() ); existingUsersAndRoles.remove( userOrRoleNameString ); } } } ); addButton.addClickHandler( new ClickHandler() { public void onClick( ClickEvent clickEvent ) { dirty = true; final SelectUserOrRoleDialog pickUserRoleDialog = new SelectUserOrRoleDialog( fileInfo, existingUsersAndRoles, new IUserRoleSelectedCallback() { public void roleSelected( String role ) { //this was done to distinguish users and roles in case they are identical usersAndRolesList.addItem( role, role + "(role)" ); //$NON-NLS-1$ existingUsersAndRoles.add( role ); usersAndRolesList.setSelectedIndex( usersAndRolesList.getItemCount() - 1 ); addRecipient( role, ROLE_TYPE, fileInfo ); buildPermissionsTable( fileInfo ); } public void userSelected( String user ) { usersAndRolesList.addItem( user, user + "(user)" ); //$NON-NLS-1$ existingUsersAndRoles.add( user ); usersAndRolesList.setSelectedIndex( usersAndRolesList.getItemCount() - 1 ); addRecipient( user, USER_TYPE, fileInfo ); buildPermissionsTable( fileInfo ); } } ); pickUserRoleDialog.center(); } } ); FlowPanel buttonPanel = new FlowPanel(); buttonPanel.add( addButton ); buttonPanel.add( removeButton ); usersAndRolesList.setVisibleItemCount( 7 ); usersAndRolesList.addClickHandler( new ClickHandler() { public void onClick( ClickEvent clickEvent ) { // update permissions list and permission label (put username in it) // rebuild permissionsTable settings based on selected mask buildPermissionsTable( fileInfo ); } } ); usersAndRolesList.setWidth( "100%" ); //$NON-NLS-1$ buttonPanel.setWidth( "100%" ); //$NON-NLS-1$ readPermissionCheckBox.getElement().setId( "sharePermissionRead" ); //$NON-NLS-1$ deletePermissionCheckBox.getElement().setId( "sharePermissionDelete" ); //$NON-NLS-1$ writePermissionCheckBox.getElement().setId( "sharePermissionWrite" ); //$NON-NLS-1$ managePermissionCheckBox.getElement().setId( "sharePermissionManagePerm" ); //$NON-NLS-1$ readPermissionCheckBox.addClickHandler( new ClickHandler() { public void onClick( ClickEvent clickEvent ) { updatePermissionMask( fileInfo, readPermissionCheckBox.getValue(), PERM_READ ); refreshPermission(); } } ); deletePermissionCheckBox.addClickHandler( new ClickHandler() { public void onClick( ClickEvent clickEvent ) { setDeleteCheckBox( deletePermissionCheckBox.getValue() ); refreshPermission(); } } ); writePermissionCheckBox.addClickHandler( new ClickHandler() { public void onClick( ClickEvent clickEvent ) { setWriteCheckBox( writePermissionCheckBox.getValue() ); refreshPermission(); } } ); managePermissionCheckBox.addClickHandler( new ClickHandler() { public void onClick( ClickEvent clickEvent ) { setManageCheckBox( managePermissionCheckBox.getValue() ); refreshPermission(); } } ); readPermissionCheckBox.setEnabled( false ); inheritsCheckBox.addClickHandler( new ClickHandler() { public void onClick( ClickEvent clickEvent ) { dirty = true; String moduleBaseURL = GWT.getModuleBaseURL(); String moduleName = GWT.getModuleName(); final String contextURL = moduleBaseURL.substring( 0, moduleBaseURL.lastIndexOf( moduleName ) ); if ( inheritsCheckBox.getValue() ) { VerticalPanel vp = new VerticalPanel(); vp.add( new Label( Messages.getString( "permissionsWillBeLostQuestion" ) ) ); //$NON-NLS-1$ // Get the state of add and remove button final boolean currRemoveButtonState = removeButton.isEnabled(); final boolean currAddButtonState = addButton.isEnabled(); final PromptDialogBox permissionsOverwriteConfirm = new PromptDialogBox( Messages.getString( "permissionsWillBeLostConfirmMessage" ), Messages.getString( "ok" ), Messages.getString( "cancel" ), false, true, vp ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ final IDialogCallback callback = new IDialogCallback() { public void cancelPressed() { permissionsOverwriteConfirm.hide(); inheritsCheckBox.setValue( false ); dirty = false; // BACKLOG-15986 Set the button state to value before the confirmation dialog setInheritsAcls( inheritsCheckBox.getValue(), fileInfo ); addButton.setEnabled( currAddButtonState ); removeButton.setEnabled( currRemoveButtonState ); } public void okPressed() { String path = fileSummary.getPath().substring( 0, fileSummary.getPath().lastIndexOf( "/" ) ); String url = contextURL + "api/repo/files/" + SolutionBrowserPanel.pathToId( path ) + "/acl"; //$NON-NLS-1$ //$NON-NLS-2$ RequestBuilder builder = new RequestBuilder( RequestBuilder.GET, url ); // This header is required to force Internet Explorer to not cache values from the GET response. builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); try { builder.sendRequest( null, new RequestCallback() { public void onResponseReceived( Request request, Response response ) { if ( response.getStatusCode() == Response.SC_OK ) { initializePermissionPanel( XMLParser.parse( response.getText() ) ); inheritsCheckBox.setValue( true ); refreshPermission(); } else { inheritsCheckBox.setValue( false ); refreshPermission(); MessageDialogBox dialogBox = new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "couldNotGetPermissions", response.getStatusText() ), //$NON-NLS-1$ //$NON-NLS-2$ false, false, true ); dialogBox.center(); } } @Override public void onError( Request request, Throwable exception ) { inheritsCheckBox.setValue( false ); refreshPermission(); MessageDialogBox dialogBox = new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "couldNotGetPermissions", exception.getLocalizedMessage() ), //$NON-NLS-1$ //$NON-NLS-2$ false, false, true ); dialogBox.center(); } } ); } catch ( RequestException e ) { inheritsCheckBox.setValue( false ); refreshPermission(); MessageDialogBox dialogBox = new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "couldNotGetPermissions", e.getLocalizedMessage() ), //$NON-NLS-1$ //$NON-NLS-2$ false, false, true ); dialogBox.center(); } } }; permissionsOverwriteConfirm.setCallback( callback ); permissionsOverwriteConfirm.center(); } refreshPermission(); } } ); int row = 0; setWidget( row++, 0, inheritsCheckBox ); setWidget( row++, 0, new Label( Messages.getString( "usersAndRoles" ) ) ); //$NON-NLS-1$ setWidget( row++, 0, usersAndRolesList ); // right justify button panel CellFormatter buttonPanelCellFormatter = new CellFormatter(); buttonPanelCellFormatter.setHorizontalAlignment( row, 0, HasHorizontalAlignment.ALIGN_RIGHT ); setCellFormatter( buttonPanelCellFormatter ); setWidget( row++, 0, buttonPanel ); setWidget( row++, 0, permissionsLabel ); setWidget( row++, 0, permissionsTable ); setCellPadding( 4 ); setWidth( "100%" ); //$NON-NLS-1$ permissionsTable.setWidget( 0, 0, managePermissionCheckBox ); permissionsTable.setWidget( 1, 0, deletePermissionCheckBox ); permissionsTable.setWidget( 2, 0, writePermissionCheckBox ); permissionsTable.setWidget( 3, 0, readPermissionCheckBox ); permissionsTable.setStyleName( "permissionsTable" ); //$NON-NLS-1$ permissionsTable.setWidth( "100%" ); //$NON-NLS-1$ permissionsTable.setHeight( "100%" ); //$NON-NLS-1$ init(); } private void setManageCheckBox( boolean value ) { managePermissionCheckBox.setValue( value ); updatePermissionMask( fileInfo, value, PERM_GRANT_PERM ); if ( value ) { setDeleteCheckBox( true ); } } private void setDeleteCheckBox( boolean value ) { deletePermissionCheckBox.setValue( value ); updatePermissionMask( fileInfo, value, PERM_DELETE ); if ( value ) { setWriteCheckBox( true ); } } private void setWriteCheckBox( boolean value ) { writePermissionCheckBox.setValue( value ); updatePermissionMask( fileInfo, value, PERM_WRITE ); } private void refreshPermission() { refreshPermission( inheritsCheckBox.getValue(), managePermissionCheckBox.getValue(), deletePermissionCheckBox .getValue() ); } private void refreshPermission( Boolean inheritCheckBoxValue, Boolean managePermissionCheckBoxValue, Boolean deletePermissionCheckBoxValue ) { setInheritsAcls( inheritCheckBoxValue, fileInfo ); managePermissionCheckBox.setEnabled( !inheritCheckBoxValue ); deletePermissionCheckBox.setEnabled( !inheritCheckBoxValue && !managePermissionCheckBoxValue ); writePermissionCheckBox.setEnabled( !inheritCheckBoxValue && !managePermissionCheckBoxValue && !deletePermissionCheckBoxValue ); addButton.setEnabled( !inheritCheckBoxValue ); removeButton.setEnabled( !inheritCheckBoxValue ); } /** * Set the widgets according to what is currently in the DOM. */ public void buildPermissionsTable( Document fileInfo ) { String userOrRoleString = ""; //$NON-NLS-1$ String recipientType = ""; //$NON-NLS-1$ if ( usersAndRolesList.getItemCount() == 0 ) { permissionsLabel.setText( Messages.getString( "permissionsColon" ) ); //$NON-NLS-1$ } else { String value = usersAndRolesList.getValue( usersAndRolesList.getSelectedIndex() ); recipientType = getRecipientTypeByValue( value ); //"(user)".length() = "(role)".length() = 6 userOrRoleString = value.substring( 0, value.length() - 6 ); permissionsLabel.setText( Messages.getString( "permissionsFor", userOrRoleString ) ); //$NON-NLS-1$ } List<Integer> perms = getPermissionsForUserOrRole( fileInfo, userOrRoleString, recipientType ); // create checkboxes, with listeners who update the fileInfo lists if ( "".equals( userOrRoleString ) ) { //$NON-NLS-1$ writePermissionCheckBox.setEnabled( false ); deletePermissionCheckBox.setEnabled( false ); managePermissionCheckBox.setEnabled( false ); } if ( perms.contains( PERM_ALL ) ) { updatePermissionForUserOrRole( fileInfo, userOrRoleString, recipientType, false, PERM_ALL ); updatePermissionForUserOrRole( fileInfo, userOrRoleString, recipientType, true, PERM_GRANT_PERM ); updatePermissionForUserOrRole( fileInfo, userOrRoleString, recipientType, true, PERM_DELETE ); updatePermissionForUserOrRole( fileInfo, userOrRoleString, recipientType, true, PERM_WRITE ); updatePermissionForUserOrRole( fileInfo, userOrRoleString, recipientType, true, PERM_READ ); } readPermissionCheckBox.setValue( perms.contains( PERM_READ ) || perms.contains( PERM_GRANT_PERM ) || perms.contains( PERM_ALL ) ); deletePermissionCheckBox.setValue( perms.contains( PERM_DELETE ) || perms.contains( PERM_GRANT_PERM ) || perms.contains( PERM_ALL ) ); writePermissionCheckBox.setValue( perms.contains( PERM_WRITE ) || perms.contains( PERM_GRANT_PERM ) || perms.contains( PERM_ALL ) ); managePermissionCheckBox.setValue( perms.contains( PERM_GRANT_PERM ) || perms.contains( PERM_ALL ) ); inheritsCheckBox.setValue( isInheritsAcls( fileInfo ) ); refreshPermission(); if ( !isModifiableUserOrRole( fileInfo, userOrRoleString, recipientType ) ) { managePermissionCheckBox.setEnabled( false ); } addButton.setEnabled( !inheritsCheckBox.getValue() ); removeButton.setEnabled( !( isOwner( userOrRoleString, USER_TYPE, fileInfo ) || isOwner( userOrRoleString, ROLE_TYPE, fileInfo ) || !isModifiableUserOrRole( fileInfo, userOrRoleString, recipientType ) ) && !inheritsCheckBox.getValue() ); } /** * @param grant * @param perm */ public void updatePermissionMask( Document fileInfo, boolean grant, int perm ) { if ( usersAndRolesList.getSelectedIndex() >= 0 ) { dirty = true; final String value = usersAndRolesList.getValue( usersAndRolesList.getSelectedIndex() ); final String recipientType = getRecipientTypeByValue( value ); //"(user)".length() = "(role)".length() = 6 final String userOrRoleString = value.substring( 0, value.length() - 6 ); updatePermissionForUserOrRole( fileInfo, userOrRoleString, recipientType, grant, perm ); } } /** * PUT acl changes back via REST call to /acl */ public void apply() { // not used } /** * @return */ public List<RequestBuilder> prepareRequests() { ArrayList<RequestBuilder> requestBuilders = new ArrayList<RequestBuilder>(); String moduleBaseURL = GWT.getModuleBaseURL(); String moduleName = GWT.getModuleName(); String contextURL = moduleBaseURL.substring( 0, moduleBaseURL.lastIndexOf( moduleName ) ); String url = contextURL + "api/repo/files/" + SolutionBrowserPanel.pathToId( fileSummary.getPath() ) + "/acl"; //$NON-NLS-1$//$NON-NLS-2$ RequestBuilder builder = new RequestBuilder( RequestBuilder.PUT, url ); builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); builder.setHeader( "Content-Type", "application/xml" ); // At this point if we're inheriting we need to remove all the acls so that the inheriting flag isn't set by // default if ( isInheritsAcls( fileInfo ) ) { removeAllAces( fileInfo ); } else { // Check if any of the permission sets should be replaced with ALL. // Any non-inherited Ace with a permission set containing PERM_GRANT_PERM should be replaced // with a single PERM_ALL. NodeList aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); for ( int i = 0; i < aces.getLength(); i++ ) { Element ace = (Element) aces.item( i ); NodeList perms = ace.getElementsByTagName( PERMISSIONS_ELEMENT_NAME ); for ( int j = 0; j < perms.getLength(); j++ ) { Element perm = (Element) perms.item( j ); if ( perm.getFirstChild() != null ) { if ( Integer.parseInt( perm.getFirstChild().getNodeValue() ) == PERM_GRANT_PERM ) { replacePermissionsWithAll( ace, fileInfo ); break; } } } } } // set request data in builder itself builder.setRequestData( fileInfo.toString() ); // add builder to list to return to parent for execution requestBuilders.add( builder ); return requestBuilders; } /** * Take permissions from fileInfo response and create roles and users list * * @param fileSummary * @param fileInfo */ public void init( RepositoryFile fileSummary, Document fileInfo ) { this.fileInfo = fileInfo; this.origFileInfo = fileInfo; this.origInheritAclFlag = isInheritsAcls( fileInfo ); initializePermissionPanel( fileInfo ); } private void initializePermissionPanel( Document fileInfo ) { usersAndRolesList.clear(); existingUsersAndRoles.clear(); for ( String name : getNames( fileInfo, USER_TYPE ) ) { //this was done to distinguish users and roles in case they are identical usersAndRolesList.addItem( name, name + "(user)" ); //$NON-NLS-1$ existingUsersAndRoles.add( name ); } for ( String name : getNames( fileInfo, ROLE_TYPE ) ) { usersAndRolesList.addItem( name, name + "(role)" ); //$NON-NLS-1$ existingUsersAndRoles.add( name ); } if ( usersAndRolesList.getItemCount() > 0 ) { usersAndRolesList.setSelectedIndex( 0 ); } buildPermissionsTable( fileInfo ); } /** * */ public void init() { // not doing anything right now. GET moved to FilePropertiesDialog parent and // response set in PermissionsPanel.setAclResponse } // ********************* // Document manipulation // ********************* void removeRecipient( String recipient, String recipientType, Document fileInfo ) { NodeList aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); for ( int i = 0; i < aces.getLength(); i++ ) { Element ace = (Element) aces.item( i ); if ( ace.getElementsByTagName( RECIPIENT_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipient ) && ace.getElementsByTagName( RECIPIENT_TYPE_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipientType ) ) { ace.getParentNode().removeChild( ace ); break; } } } /** * @param name * @param type * @return */ private Boolean isOwner( String name, Integer type, Document fileInfo ) { return name == getOwnerName( fileInfo ) && type == getOwnerType( fileInfo ); } /** * @return */ private String getOwnerName( Document fileInfo ) { return fileInfo.getElementsByTagName( OWNER_NAME_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue(); } /** * @return */ private Integer getOwnerType( Document fileInfo ) { return Integer.parseInt( fileInfo.getElementsByTagName( OWNER_TYPE_ELEMENT_NAME ).item( 0 ).getFirstChild() .getNodeValue() ); } /** * @param recipientName * @param recipientType */ void addRecipient( String recipientName, int recipientType, Document fileInfo ) { Element newAces = fileInfo.createElement( ACES_ELEMENT_NAME ); Element newPermission = fileInfo.createElement( PERMISSIONS_ELEMENT_NAME ); Element newRecipient = fileInfo.createElement( RECIPIENT_ELEMENT_NAME ); Element newRecipientType = fileInfo.createElement( RECIPIENT_TYPE_ELEMENT_NAME ); Text textNode = fileInfo.createTextNode( recipientName ); newRecipient.appendChild( textNode ); textNode = fileInfo.createTextNode( Integer.toString( recipientType ) ); newRecipientType.appendChild( textNode ); newAces.appendChild( newPermission ); newAces.appendChild( newRecipient ); newAces.appendChild( newRecipientType ); fileInfo.getDocumentElement().appendChild( newAces ); // Base recipient is created at this point. // Now give them the default perms. String strRecipientType = Integer.toString( recipientType ); updatePermissionForUserOrRole( fileInfo, recipientName, strRecipientType, true, PERM_READ ); } /** * @param recipient * @param permission */ private void addPermission( String recipient, String recipientType, int permission, Document fileInfo ) { NodeList aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); for ( int i = 0; i < aces.getLength(); i++ ) { Element ace = (Element) aces.item( i ); if ( ace.getElementsByTagName( RECIPIENT_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipient ) && ace.getElementsByTagName( RECIPIENT_TYPE_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipientType ) ) { Element newPerm = fileInfo.createElement( PERMISSIONS_ELEMENT_NAME ); Text textNode = fileInfo.createTextNode( Integer.toString( permission ) ); newPerm.appendChild( textNode ); ace.appendChild( newPerm ); } } } /** * @param type * @return list of names of given "type" */ protected List<String> getNames( final Document fileInfo, int type ) { List<String> names = new ArrayList<String>(); NodeList aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); for ( int i = 0; i < aces.getLength(); i++ ) { Element ace = (Element) aces.item( i ); NodeList recipientTypeList = ace.getElementsByTagName( RECIPIENT_TYPE_ELEMENT_NAME ); Node recipientNode = recipientTypeList.item( 0 ); String nodeValue = recipientNode.getFirstChild().getNodeValue(); int recipientType = Integer.parseInt( nodeValue ); if ( recipientType == type ) { names.add( ace.getElementsByTagName( RECIPIENT_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue() ); } } return names; } /** * @param recipient * @return */ private List<Integer> getPermissionsForUserOrRole( Document fileInfo, String recipient, String recipientType ) { List<Integer> values = new ArrayList<Integer>(); NodeList aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); for ( int i = 0; i < aces.getLength(); i++ ) { Element ace = (Element) aces.item( i ); if ( ace.getElementsByTagName( RECIPIENT_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipient ) && ace.getElementsByTagName( RECIPIENT_TYPE_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipientType ) ) { NodeList permissions = ace.getElementsByTagName( PERMISSIONS_ELEMENT_NAME ); for ( int j = 0; j < permissions.getLength(); j++ ) { if ( permissions.item( j ).getFirstChild() != null ) { values.add( new Integer( permissions.item( j ).getFirstChild().getNodeValue() ) ); } } break; } } return values; } private Boolean isModifiableUserOrRole( Document fileInfo, String recipient, String recipientType ) { NodeList aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); for ( int i = 0; i < aces.getLength(); i++ ) { Element ace = (Element) aces.item( i ); if ( ace.getElementsByTagName( RECIPIENT_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipient ) && ace.getElementsByTagName( RECIPIENT_TYPE_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipientType ) ) { NodeList modifiable = ace.getElementsByTagName( MODIFIABLE_ELEMENT_NAME ); return modifiable.getLength() > 0 && modifiable.item( 0 ).getFirstChild().getNodeValue().equals( "true" ); } } return false; } /** * @param recipient * @param grant true = grant the Permission, false = deny the Permission (remove it if present) * @param perm The integer value of the Permission as defined in <code>RepositoryFilePermissions</code> */ private void updatePermissionForUserOrRole( Document fileInfo, String recipient, String recipientType, boolean grant, int perm ) { // first let's see if this node exists Node foundPermission = null; NodeList aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); for ( int i = 0; i < aces.getLength(); i++ ) { Element ace = (Element) aces.item( i ); if ( ace.getElementsByTagName( RECIPIENT_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipient ) && ace.getElementsByTagName( RECIPIENT_TYPE_ELEMENT_NAME ).item( 0 ).getFirstChild().getNodeValue().equals( recipientType ) ) { NodeList permissions = ace.getElementsByTagName( PERMISSIONS_ELEMENT_NAME ); for ( int j = 0; j < permissions.getLength(); j++ ) { Node testNode = permissions.item( j ); if ( testNode.getFirstChild() != null && Integer.parseInt( testNode.getFirstChild() .getNodeValue() ) == perm ) { foundPermission = testNode; break; } } break; } } if ( grant ) { if ( foundPermission != null ) { // This permission already exists. return; } addPermission( recipient, recipientType, perm, fileInfo ); } else { if ( foundPermission != null ) { foundPermission.getParentNode().removeChild( foundPermission ); } } } /** * */ private void removeAllAces( Document fileInfo ) { // Window.alert("removeAllAces() called with: \n" + fileInfo.toString()); NodeList aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); while ( aces != null && aces.getLength() > 0 ) { for ( int i = 0; i < aces.getLength(); i++ ) { Node ace = aces.item( i ); ace.getParentNode().removeChild( ace ); } aces = fileInfo.getElementsByTagName( ACES_ELEMENT_NAME ); } } private void replacePermissionsWithAll( Element ace, Document fileInfo ) { NodeList perms = ace.getElementsByTagName( PERMISSIONS_ELEMENT_NAME ); int childCount = perms.getLength(); for ( int i = 0; i < childCount; i++ ) { Node perm = perms.item( i ); if ( perm != null ) { ace.removeChild( perm ); } } Element newPerm = fileInfo.createElement( PERMISSIONS_ELEMENT_NAME ); Text textNode = fileInfo.createTextNode( Integer.toString( PERM_ALL ) ); newPerm.appendChild( textNode ); ace.appendChild( newPerm ); } /** * @return */ Boolean isInheritsAcls( Document fileInfo ) { return Boolean.valueOf( fileInfo.getElementsByTagName( INHERITS_ELEMENT_NAME ).item( 0 ).getFirstChild() .getNodeValue() ); } /** * @param inherits */ void setInheritsAcls( Boolean inherits, Document fileInfo ) { fileInfo.getElementsByTagName( INHERITS_ELEMENT_NAME ).item( 0 ) .getFirstChild().setNodeValue( inherits.toString() ); } /** * Get owner name from acl response * * @param response */ protected void setAclResponse( Response response ) { init( fileSummary, XMLParser.parse( response.getText() ) ); } private String getRecipientTypeByValue( String userOrRoleString ) { String recipientType = ""; if ( userOrRoleString.endsWith( "(user)" ) ) { recipientType = "0"; } else if ( userOrRoleString.endsWith( "(role)" ) ) { recipientType = "1"; } return recipientType; } }