Merge branch 'seeddms-5.1.x' into seeddms-6.0.x

This commit is contained in:
Uwe Steinmann 2022-03-03 09:04:47 +01:00
commit a156932843
2 changed files with 101 additions and 67 deletions

View File

@ -792,7 +792,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
* *
* @return bool * @return bool
*/ */
function setDefaultAccess($mode, $noclean="false") { /* {{{ */ function setDefaultAccess($mode, $noclean=false) { /* {{{ */
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
if($mode < M_LOWEST_RIGHT || $mode > M_HIGHEST_RIGHT) if($mode < M_LOWEST_RIGHT || $mode > M_HIGHEST_RIGHT)
@ -1328,10 +1328,10 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
} }
$modeStr = ""; $modeStr = "";
if ($mode!=M_ANY) { if ($mode!=M_ANY) {
$modeStr = " AND mode".$op.(int)$mode; $modeStr = " AND `mode`".$op.(int)$mode;
} }
$queryStr = "SELECT * FROM `tblACLs` WHERE `targetType` = ".T_DOCUMENT. $queryStr = "SELECT * FROM `tblACLs` WHERE `targetType` = ".T_DOCUMENT.
" AND target = " . $this->_id . $modeStr . " ORDER BY `targetType`"; " AND `target` = " . $this->_id . $modeStr . " ORDER BY `targetType`";
$resArr = $db->getResultArray($queryStr); $resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && !$resArr) if (is_bool($resArr) && !$resArr)
return false; return false;
@ -1351,8 +1351,10 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
/** /**
* Add access right to folder * Add access right to folder
* This function may change in the future. Instead of passing the a flag * This function may change in the future. Instead of passing a flag
* and a user/group id a user or group object will be expected. * and a user/group id a user or group object will be expected.
* Starting with version 5.1.25 this method will first check if there
* is already an access right for the user/group.
* *
* @param integer $mode access mode * @param integer $mode access mode
* @param integer $userOrGroupID id of user or group * @param integer $userOrGroupID id of user or group
@ -1368,6 +1370,13 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
$userOrGroup = ($isUser) ? "`userID`" : "`groupID`"; $userOrGroup = ($isUser) ? "`userID`" : "`groupID`";
/* Adding a second access right will return false */
$queryStr = "SELECT * FROM `tblACLs` WHERE `targetType` = ".T_DOCUMENT.
" AND `target` = " . $this->_id . " AND ". $userOrGroup . " = ".$userOrGroupID;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) || $resArr)
return false;
$queryStr = "INSERT INTO `tblACLs` (`target`, `targetType`, ".$userOrGroup.", `mode`) VALUES $queryStr = "INSERT INTO `tblACLs` (`target`, `targetType`, ".$userOrGroup.", `mode`) VALUES
(".$this->_id.", ".T_DOCUMENT.", " . (int) $userOrGroupID . ", " .(int) $mode. ")"; (".$this->_id.", ".T_DOCUMENT.", " . (int) $userOrGroupID . ", " .(int) $mode. ")";
if (!$db->getResult($queryStr)) if (!$db->getResult($queryStr))
@ -2954,7 +2963,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
* This function is deprecated. Use * This function is deprecated. Use
* {@see SeedDMS_Core_Document::getReadAccessList()} instead. * {@see SeedDMS_Core_Document::getReadAccessList()} instead.
*/ */
function getApproversList() { /* {{{ */ protected function __getApproversList() { /* {{{ */
return $this->getReadAccessList(0, 0, 0); return $this->getReadAccessList(0, 0, 0);
} /* }}} */ } /* }}} */
@ -7113,9 +7122,18 @@ class SeedDMS_Core_DocumentLink { /* {{{ */
$this->_document = $document; $this->_document = $document;
$this->_target = $target; $this->_target = $target;
$this->_userID = $userID; $this->_userID = $userID;
$this->_public = $public; $this->_public = $public ? true : false;
} }
/**
* Check if this object is of type 'documentlink'.
*
* @param string $type type of object
*/
public function isType($type) { /* {{{ */
return $type == 'documentlink';
} /* }}} */
/** /**
* @return int * @return int
*/ */
@ -7288,9 +7306,18 @@ class SeedDMS_Core_DocumentFile { /* {{{ */
$this->_orgFileName = $orgFileName; $this->_orgFileName = $orgFileName;
$this->_name = $name; $this->_name = $name;
$this->_version = $version; $this->_version = $version;
$this->_public = $public; $this->_public = $public ? true : false;
} }
/**
* Check if this object is of type 'documentfile'.
*
* @param string $type type of object
*/
public function isType($type) { /* {{{ */
return $type == 'documentfile';
} /* }}} */
/** /**
* @return int * @return int
*/ */
@ -7339,7 +7366,7 @@ class SeedDMS_Core_DocumentFile { /* {{{ */
* to the current timestamp * to the current timestamp
* @return boolean true on success * @return boolean true on success
*/ */
function setDate($date) { /* {{{ */ function setDate($date=null) { /* {{{ */
$db = $this->_document->getDMS()->getDB(); $db = $this->_document->getDMS()->getDB();
if(!$date) if(!$date)
@ -7454,7 +7481,7 @@ class SeedDMS_Core_DocumentFile { /* {{{ */
if (!$db->getResult($queryStr)) if (!$db->getResult($queryStr))
return false; return false;
$this->_public = $newPublic ? 1 : 0; $this->_public = $newPublic ? true : false;
return true; return true;
} /* }}} */ } /* }}} */

View File

@ -126,27 +126,27 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
$this->_inheritAccess = $inheritAccess; $this->_inheritAccess = $inheritAccess;
$this->_defaultAccess = $defaultAccess; $this->_defaultAccess = $defaultAccess;
$this->_sequence = $sequence; $this->_sequence = $sequence;
$this->_notifyList = array(); $this->_notifyList = array();
/* Cache */ /* Cache */
$this->clearCache(); $this->clearCache();
} /* }}} */ } /* }}} */
/** /**
* Clear cache of this instance. * Clear cache of this instance.
* *
* The result of some expensive database actions (e.g. get all subfolders * The result of some expensive database actions (e.g. get all subfolders
* or documents) will be saved in a class variable to speed up consecutive * or documents) will be saved in a class variable to speed up consecutive
* calls of the same method. If a second call of the same method shall not * calls of the same method. If a second call of the same method shall not
* use the cache, then it must be cleared. * use the cache, then it must be cleared.
* *
*/ */
public function clearCache() { /* {{{ */ public function clearCache() { /* {{{ */
$this->_parent = null; $this->_parent = null;
$this->_owner = null; $this->_owner = null;
$this->_subFolders = null; $this->_subFolders = null;
$this->_documents = null; $this->_documents = null;
$this->_accessList = null; $this->_accessList = null;
$this->_notifyList = null; $this->_notifyList = null;
} /* }}} */ } /* }}} */
/** /**
@ -384,16 +384,16 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
/** /**
* Check if the folder is subfolder * Check if the folder is subfolder
* *
* This method checks if the current folder is in the path of the * This method checks if the current folder is in the path of the
* passed subfolder. In that case the current folder is a parent, * passed subfolder. In that case the current folder is a parent,
* grant parent, grant grant parent, etc. of the subfolder or * grant parent, grant grant parent, etc. of the subfolder or
* to say it differently the passed folder is somewhere below the * to say it differently the passed folder is somewhere below the
* current folder. * current folder.
* *
* This is basically the opposite of {@see SeedDMS_Core_Folder::isDescendant()} * This is basically the opposite of {@see SeedDMS_Core_Folder::isDescendant()}
* *
* @param SeedDMS_Core_Folder $subfolder folder to be checked if it is * @param SeedDMS_Core_Folder $subfolder folder to be checked if it is
* a subfolder on any level of the current folder * a subfolder on any level of the current folder
* @return bool true if passed folder is a subfolder, otherwise false * @return bool true if passed folder is a subfolder, otherwise false
*/ */
function isSubFolder($subfolder) { /* {{{ */ function isSubFolder($subfolder) { /* {{{ */
@ -797,22 +797,22 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
/** /**
* Check, if this folder is a subfolder of a given folder * Check, if this folder is a subfolder of a given folder
* *
* This is basically the opposite of {@see SeedDMS_Core_Folder::isSubFolder()} * This is basically the opposite of {@see SeedDMS_Core_Folder::isSubFolder()}
* *
* @param object $folder parent folder * @param object $folder parent folder
* @return boolean true if folder is a subfolder * @return boolean true if folder is a subfolder
*/ */
function isDescendant($folder) { /* {{{ */ function isDescendant($folder) { /* {{{ */
/* If the current folder has no parent it cannot be a descendant */ /* If the current folder has no parent it cannot be a descendant */
if(!$this->getParent()) if(!$this->getParent())
return false; return false;
/* Check if the passed folder is the parent of the current folder. /* Check if the passed folder is the parent of the current folder.
* In that case the current folder is a subfolder of the passed folder. * In that case the current folder is a subfolder of the passed folder.
*/ */
if($this->getParent()->getID() == $folder->getID()) if($this->getParent()->getID() == $folder->getID())
return true; return true;
/* Recursively go up to the root folder */ /* Recursively go up to the root folder */
return $this->getParent()->isDescendant($folder); return $this->getParent()->isDescendant($folder);
} /* }}} */ } /* }}} */
@ -824,13 +824,13 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
* @return int number of documents or false in case of an error * @return int number of documents or false in case of an error
*/ */
function hasDocuments() { /* {{{ */ function hasDocuments() { /* {{{ */
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
/* Do not use the cache because it may not contain all documents if /* Do not use the cache because it may not contain all documents if
* the former call getDocuments() limited the number of documents * the former call getDocuments() limited the number of documents
if (isset($this->_documents)) { if (isset($this->_documents)) {
return count($this->_documents); return count($this->_documents);
} }
*/ */
$queryStr = "SELECT count(*) as c FROM `tblDocuments` WHERE `folder` = " . $this->_id; $queryStr = "SELECT count(*) as c FROM `tblDocuments` WHERE `folder` = " . $this->_id;
$resArr = $db->getResultArray($queryStr); $resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && !$resArr) if (is_bool($resArr) && !$resArr)
@ -1319,14 +1319,14 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
$pacl = array("groups" => array(), "users" => array()); $pacl = array("groups" => array(), "users" => array());
} }
if (!isset($this->_accessList[$mode])) { if (!isset($this->_accessList[$mode])) {
if ($op!=O_GTEQ && $op!=O_LTEQ && $op!=O_EQ) { if ($op!=O_GTEQ && $op!=O_LTEQ && $op!=O_EQ) {
return false; return false;
} }
$modeStr = ""; $modeStr = "";
if ($mode!=M_ANY) { if ($mode!=M_ANY) {
$modeStr = " AND mode".$op.(int)$mode; $modeStr = " AND `mode`".$op.(int)$mode;
} }
$queryStr = "SELECT * FROM `tblACLs` WHERE `targetType` = ".T_FOLDER. $queryStr = "SELECT * FROM `tblACLs` WHERE `targetType` = ".T_FOLDER.
" AND `target` = " . $this->_id . $modeStr . " ORDER BY `targetType`"; " AND `target` = " . $this->_id . $modeStr . " ORDER BY `targetType`";
$resArr = $db->getResultArray($queryStr); $resArr = $db->getResultArray($queryStr);
@ -1340,7 +1340,7 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
else //if ($row["groupID"] != -1) else //if ($row["groupID"] != -1)
array_push($this->_accessList[$mode]["groups"], new SeedDMS_Core_GroupAccess($this->_dms->getGroup($row["groupID"]), (int) $row["mode"])); array_push($this->_accessList[$mode]["groups"], new SeedDMS_Core_GroupAccess($this->_dms->getGroup($row["groupID"]), (int) $row["mode"]));
} }
} }
return $this->_accessList[$mode]; return $this->_accessList[$mode];
return SeedDMS_Core_DMS::mergeAccessLists($pacl, $this->_accessList[$mode]); return SeedDMS_Core_DMS::mergeAccessLists($pacl, $this->_accessList[$mode]);
@ -1381,11 +1381,18 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
function addAccess($mode, $userOrGroupID, $isUser) { /* {{{ */ function addAccess($mode, $userOrGroupID, $isUser) { /* {{{ */
$db = $this->_dms->getDB(); $db = $this->_dms->getDB();
if($mode < M_NONE || $mode > M_ALL) if($mode < M_NONE || $mode > M_ALL)
return false; return false;
$userOrGroup = ($isUser) ? "`userID`" : "`groupID`"; $userOrGroup = ($isUser) ? "`userID`" : "`groupID`";
/* Adding a second access right will return false */
$queryStr = "SELECT * FROM `tblACLs` WHERE `targetType` = ".T_FOLDER.
" AND `target` = " . $this->_id . " AND ". $userOrGroup . " = ".$userOrGroupID;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) || $resArr)
return false;
$queryStr = "INSERT INTO `tblACLs` (`target`, `targetType`, ".$userOrGroup.", `mode`) VALUES $queryStr = "INSERT INTO `tblACLs` (`target`, `targetType`, ".$userOrGroup.", `mode`) VALUES
(".$this->_id.", ".T_FOLDER.", " . (int) $userOrGroupID . ", " .(int) $mode. ")"; (".$this->_id.", ".T_FOLDER.", " . (int) $userOrGroupID . ", " .(int) $mode. ")";
if (!$db->getResult($queryStr)) if (!$db->getResult($queryStr))
@ -1458,18 +1465,18 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
/** /**
* Get the access mode of a user on the folder * Get the access mode of a user on the folder
* *
* The access mode is either M_READ, M_READWRITE, M_ALL, or M_NONE. * The access mode is either M_READ, M_READWRITE, M_ALL, or M_NONE.
* It is determined * It is determined
* - by the user (admins and owners have always access mode M_ALL) * - by the user (admins and owners have always access mode M_ALL)
* - by the access list for the user (possibly inherited) * - by the access list for the user (possibly inherited)
* - by the default access mode * - by the default access mode
* *
* This function returns the access mode for a given user. An administrator * This function returns the access mode for a given user. An administrator
* and the owner of the folder has unrestricted access. A guest user has * and the owner of the folder has unrestricted access. A guest user has
* read only access or no access if access rights are further limited * read only access or no access if access rights are further limited
* by access control lists all the default access. * by access control lists all the default access.
* All other users have access rights according * All other users have access rights according
* to the access control lists or the default access. This function will * to the access control lists or the default access. This function will
* recursively check for access rights of parent folders if access rights * recursively check for access rights of parent folders if access rights
* are inherited. * are inherited.
@ -1480,8 +1487,8 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
* will be passed as a third parameter to the callback. It contains * will be passed as a third parameter to the callback. It contains
* the operation for which the access mode is retrieved. It is for example * the operation for which the access mode is retrieved. It is for example
* set to 'removeDocument' if the access mode is used to check for sufficient * set to 'removeDocument' if the access mode is used to check for sufficient
* permission on deleting a document. This callback could be used to * permission on deleting a document. This callback could be used to
* override any existing access mode in a certain context. * override any existing access mode in a certain context.
* *
* @param SeedDMS_Core_User $user user for which access shall be checked * @param SeedDMS_Core_User $user user for which access shall be checked
* @param string $context context in which the access mode is requested * @param string $context context in which the access mode is requested