diff --git a/lib/actions/bulkaction.php b/lib/actions/bulkaction.php index 9f2be28..7fd7e8b 100644 --- a/lib/actions/bulkaction.php +++ b/lib/actions/bulkaction.php @@ -210,6 +210,53 @@ class KTBulkAction extends KTStandardDispatcher { return $symlinksPresent; } +/** + * checks a folderList for shortcuts and queries the repositories for all folders + * that are somehow connected to these folders. + */ + function getLinkingEntities($aFolderList){ + $aSearchFolders = array(); + if(!empty($aFolderList)){ + foreach($aFolderList as $oFolderItem){ + if(Permission::userHasFolderReadPermission($oFolderItem)){ + // If it is a shortcut, we should do some more searching + if($oFolderItem->isSymbolicLink()){ + $oFolderItem = $oFolderItem->getLinkedFolder(); + $aSearchFolders[] = $oFolderItem->getID(); + } + } + } + } + $aLinkingFolders = array(); + $aSearchCompletedFolders = array(); + $count = 0; + while(count($aSearchFolders)>0){ + $count++; + $oFolder = Folder::get(array_pop($aSearchFolders)); + $sFolderId = $oFolder->getId(); + // Get all the folders within the current folder + $sWhereClause = "parent_folder_ids = '{$sFolderId}' OR + parent_folder_ids LIKE '{$sFolderId},%' OR + parent_folder_ids LIKE '%,{$sFolderId},%' OR + parent_folder_ids LIKE '%,{$sFolderId}'"; + $aFolderList = $this->oFolder->getList($sWhereClause); + foreach($aFolderList as $oFolderItem){ + if($oFolderItem->isSymbolicLink()){ + $oFolderItem = $oFolderItem->getLinkedFolder(); + } + if(Permission::userHasFolderReadPermission($oFolderItem)){ + if($aSearchCompletedFolders[$oFolderItem->getID()] != true){ + $aSearchFolders[] = $oFolderItem->getID(); + $aSearchCompletedFolders[$oFolderItem->getID()] = true; + } + } + } + if(!isset($aLinkingFolders[$oFolder->getId()])){ + $aLinkingFolders[$oFolder->getId()] = $oFolder; + } + } + return $aLinkingFolders; + } // doesn't actually do checks, as they have to be performed per-entity function check() { diff --git a/lib/documentmanagement/documentutil.inc.php b/lib/documentmanagement/documentutil.inc.php index 17300f7..8740332 100644 --- a/lib/documentmanagement/documentutil.inc.php +++ b/lib/documentmanagement/documentutil.inc.php @@ -229,7 +229,7 @@ class KTDocumentUtil { //send an email to the owner of the shortcut if($oOwnerUser->getEmail()!=null && $oOwnerUser->getEmailNotification() == true){ - $emailTemplate = new EmailTemplate("kt3/notifications/notification.SymbolicLinkDeleted",array('user_name'=>$this->oUser->getName(), + $emailTemplate = new EmailTemplate("kt3/notifications/notification.SymbolicLinkArchived",array('user_name'=>$this->oUser->getName(), 'url'=>KTUtil::ktLink(KTBrowseUtil::getUrlForDocument($oShortcutDocument)), 'title' =>$oShortcutDocument->getName())); $email = new EmailAlert($oOwnerUser->getEmail(),_kt("KnowledgeTree Notification"),$emailTemplate->getBody()); diff --git a/plugins/ktcore/KTBulkActions.php b/plugins/ktcore/KTBulkActions.php index e369dc4..23b83bb 100644 --- a/plugins/ktcore/KTBulkActions.php +++ b/plugins/ktcore/KTBulkActions.php @@ -684,6 +684,12 @@ class KTBrowseBulkExportAction extends KTBulkAction { if((!is_a($oEntity, 'Document')) && (!is_a($oEntity, 'Folder'))) { return PEAR::raiseError(_kt('Document cannot be exported')); } + //we need to do an extra folder permission check in case of a shortcut + if(is_a($oEntity,'Folder') && $oEntity->isSymbolicLink()){ + if(!KTPermissionUtil::userHasPermissionOnItem($this->oUser, $this->_sPermission, $oEntity->getLinkedFolder())) { + return PEAR::raiseError(_kt('You do not have the required permissions')); + } + } return parent::check_entity($oEntity); } @@ -768,6 +774,10 @@ class KTBrowseBulkExportAction extends KTBulkAction { }else if(is_a($oEntity, 'Folder')) { $aDocuments = array(); $oFolder = $oEntity; + + if($oFolder->isSymbolicLink()){ + $oFolder = $oFolder->getLinkedFolder(); + } $sFolderId = $oFolder->getId(); $sFolderDocs = $oFolder->getDocumentIDs($sFolderId); @@ -784,6 +794,8 @@ class KTBrowseBulkExportAction extends KTBulkAction { parent_folder_ids LIKE '%,{$sFolderId},%' OR parent_folder_ids LIKE '%,{$sFolderId}'"; $aFolderList = $this->oFolder->getList($sWhereClause); + $aLinkingFolders = $this->getLinkingEntities($aFolderList); + $aFolderList = array_merge($aFolderList,$aLinkingFolders); $aFolderObjects = array(); $aFolderObjects[$sFolderId] = $oFolder; @@ -791,16 +803,21 @@ class KTBrowseBulkExportAction extends KTBulkAction { // Export the folder structure to ensure the export of empty directories if(!empty($aFolderList)){ foreach($aFolderList as $k => $oFolderItem){ - // Get documents for each folder - $sFolderItemId = $oFolderItem->getID(); - $sFolderItemDocs = $oFolderItem->getDocumentIDs($sFolderItemId); - - if(!empty($sFolderItemDocs)){ - $aFolderDocs = explode(',', $sFolderItemDocs); - $aDocuments = array_merge($aDocuments, $aFolderDocs); - } - $this->oZip->addFolderToZip($oFolderItem); - $aFolderObjects[$oFolderItem->getId()] = $oFolderItem; + if(Permission::userHasFolderReadPermission($oFolderItem)){ + // Get documents for each folder + if($oFolderItem->isSymbolicLink()){ + $oFolderItem = $oFolderItem->getLinkedFolder(); + } + $sFolderItemId = $oFolderItem->getID(); + $sFolderItemDocs = $oFolderItem->getDocumentIDs($sFolderItemId); + + if(!empty($sFolderItemDocs)){ + $aFolderDocs = explode(',', $sFolderItemDocs); + $aDocuments = array_merge($aDocuments, $aFolderDocs); + } + $this->oZip->addFolderToZip($oFolderItem); + $aFolderObjects[$oFolderItem->getId()] = $oFolderItem; + } } } @@ -808,6 +825,9 @@ class KTBrowseBulkExportAction extends KTBulkAction { if(!empty($aDocuments)){ foreach($aDocuments as $sDocumentId){ $oDocument = Document::get($sDocumentId); + if($oDocument->isSymbolicLink()){ + $oDocument->switchToLinkedCore(); + } $sDocFolderId = $oDocument->getFolderID(); $oFolder = isset($aFolderObjects[$sDocFolderId]) ? $aFolderObjects[$sDocFolderId] : Folder::get($sDocFolderId); @@ -874,6 +894,12 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction { }else if(!is_a($oEntity, 'Folder')) { return PEAR::raiseError(_kt('Document cannot be checked out')); } + //we need to do an extra folder permission check in case of a shortcut + if(is_a($oEntity,'Folder') && $oEntity->isSymbolicLink()){ + if(!KTPermissionUtil::userHasPermissionOnItem($this->oUser, $this->_sPermission, $oEntity->getLinkedFolder())) { + return PEAR::raiseError(_kt('You do not have the required permissions')); + } + } return parent::check_entity($oEntity); } @@ -1053,6 +1079,9 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction { $aDocuments = array(); $oFolder = $oEntity; + if($oFolder->isSymbolicLink()){ + $oFolder = $oFolder->getLinkedFolder(); + } $sFolderId = $oFolder->getId(); $sFolderDocs = $oFolder->getDocumentIDs($sFolderId); @@ -1067,28 +1096,36 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction { parent_folder_ids LIKE '%,{$sFolderId},%' OR parent_folder_ids LIKE '%,{$sFolderId}'"; $aFolderList = $this->oFolder->getList($sWhereClause); + $aLinkingFolders = $this->getLinkingEntities($aFolderList); + $aFolderList = array_merge($aFolderList,$aLinkingFolders); + $aFolderObjects = array(); $aFolderObjects[$sFolderId] = $oFolder; // Get the documents within the folder if(!empty($aFolderList)){ - foreach($aFolderList as $k => $oFolderItem){ - // Get documents for each folder - $sFolderItemId = $oFolderItem->getID(); - $sFolderItemDocs = $oFolderItem->getDocumentIDs($sFolderItemId); - - if(!empty($sFolderItemDocs)){ - $aFolderDocs = explode(',', $sFolderItemDocs); - $aDocuments = array_merge($aDocuments, $aFolderDocs); - } - - // Add the folder to the zip file - if($this->bDownload){ - $this->oZip->addFolderToZip($oFolderItem); - $aFolderObjects[$oFolderItem->getId()] = $oFolderItem; - } - } + foreach($aFolderList as $k => $oFolderItem){ + if(Permission::userHasFolderReadPermission($oFolderItem)){ + // Get documents for each folder + if($oFolderItem->isSymbolicLink()){ + $oFolderItem = $oFolderItem->getLinkedFolder(); + } + $sFolderItemId = $oFolderItem->getID(); + $sFolderItemDocs = $oFolderItem->getDocumentIDs($sFolderItemId); + + if(!empty($sFolderItemDocs)){ + $aFolderDocs = explode(',', $sFolderItemDocs); + $aDocuments = array_merge($aDocuments, $aFolderDocs); + } + + // Add the folder to the zip file + if($this->bDownload){ + $this->oZip->addFolderToZip($oFolderItem); + $aFolderObjects[$oFolderItem->getId()] = $oFolderItem; + } + } + } } // Checkout each document within the folder structure @@ -1100,6 +1137,9 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction { $this->addErrorMessage($oDocument->getName().': '.$oDocument->getMessage()); continue; } + if($oDocument->isSymbolicLink()){ + $oDocument->switchToLinkedCore(); + } // Check if the action is restricted by workflow on the document if(!KTWorkflowUtil::actionEnabledForDocument($oDocument, 'ktcore.actions.document.checkout')){ @@ -1150,8 +1190,6 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction { } } - $oDocument->setFileName('innerfile.pdf'); - $sDocFolderId = $oDocument->getFolderID(); $oFolder = isset($aFolderObjects[$sDocFolderId]) ? $aFolderObjects[$sDocFolderId] : Folder::get($sDocFolderId); $this->oZip->addDocumentToZip($oDocument, $oFolder);