From b118b00536d0974ea9ac9a07554f36918a624e82 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 18 Oct 2023 19:04:02 +0200 Subject: [PATCH 01/43] pass $document ot mayRemoveVersion() --- op/op.RemoveVersion.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/op/op.RemoveVersion.php b/op/op.RemoveVersion.php index 146b41f2a..6a47def84 100644 --- a/op/op.RemoveVersion.php +++ b/op/op.RemoveVersion.php @@ -47,7 +47,7 @@ if (!is_object($document)) { $accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings); // verify if document may be reviewed -if (!$accessop->mayRemoveVersion()){ +if (!$accessop->mayRemoveVersion($document)){ UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied")); } From 31fa1d505c2f0c5910801061e08a0b5a1c5d6bd8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 20 Oct 2023 07:14:34 +0200 Subject: [PATCH 02/43] fix call of contructor of SeedDMS_AccessOperation --- op/op.RemoveVersion.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/op/op.RemoveVersion.php b/op/op.RemoveVersion.php index 6a47def84..175fea92e 100644 --- a/op/op.RemoveVersion.php +++ b/op/op.RemoveVersion.php @@ -44,7 +44,7 @@ if (!is_object($document)) { } /* Create object for checking access to certain operations */ -$accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings); +$accessop = new SeedDMS_AccessOperation($dms, $user, $settings); // verify if document may be reviewed if (!$accessop->mayRemoveVersion($document)){ From 246ce885e297f5801d514d666bcf4aa8ab4981dd Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 27 Oct 2023 08:08:15 +0200 Subject: [PATCH 03/43] add changes for 5.1.33 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index a3f64a290..34d5c3a41 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,6 +10,7 @@ - show fileѕ and folders in dropfolder dir recursively - fix 'Add to clipboard' menu item in bootstrap theme - open confirm box when changing category in batch operation +- extension can add a legacy access right -------------------------------------------------------------------------------- Changes in version 5.1.32 From 2c32f6f4defa3ae704150972f7e848d25a515686 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 27 Oct 2023 08:21:30 +0200 Subject: [PATCH 04/43] more changes for 5.1.33 --- CHANGELOG | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 34d5c3a41..077b95ba1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,7 +10,11 @@ - show fileѕ and folders in dropfolder dir recursively - fix 'Add to clipboard' menu item in bootstrap theme - open confirm box when changing category in batch operation +- hidden users can excluded when setting list of reviewers/approvers - extension can add a legacy access right +- check if document version may be removed +- set max file size for indexing when updating a document +- nicer output on info page -------------------------------------------------------------------------------- Changes in version 5.1.32 From f562a1bbed0ae36d0510d503fa64f7c612896372 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 27 Oct 2023 12:09:15 +0200 Subject: [PATCH 05/43] fix typo --- languages/en_GB/lang.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index 68111c058..eecdf07bc 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2389), archonwang (3), dgrutsch (9), netixw (14) +// Translators: Admin (2390), archonwang (3), dgrutsch (9), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -1367,7 +1367,7 @@ URL: [url]

', 'no_previous_versions' => 'No other versions found', 'no_receipt_needed' => 'There are currently no documents requiring a receipt confirmation.', 'no_review_needed' => 'No review pending.', -'no_revision_date' => 'Ddate of revision missing', +'no_revision_date' => 'Date of revision missing', 'no_revision_needed' => 'No revision pending.', 'no_revision_planed' => 'No revision of document scheduled', 'no_update_cause_locked' => 'You can therefore not update this document. Please contact the locking user.', From 0aedf55ec60834df0a7df23eca49a56d8c7cc7ec Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 27 Oct 2023 12:51:21 +0200 Subject: [PATCH 06/43] prevent xss attach --- views/bootstrap/class.Search.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/views/bootstrap/class.Search.php b/views/bootstrap/class.Search.php index 5557fd9d5..6aac1bb1a 100644 --- a/views/bootstrap/class.Search.php +++ b/views/bootstrap/class.Search.php @@ -878,7 +878,7 @@ $(document).ready(function() { foreach($values as $v=>$c) { $uu = $dms->getUserByLogin($v); if($uu) { - $option = array($uu->getId(), $v); + $option = array($uu->getId(), htmlspecialchars($v)); if(isset(${$facetname}) && in_array($uu->getId(), ${$facetname})) $option[] = true; else @@ -891,7 +891,7 @@ $(document).ready(function() { foreach($values as $v=>$c) { $cat = $dms->getDocumentCategoryByName($v); if($cat) { - $option = array($cat->getId(), $v); + $option = array($cat->getId(), htmlspecialchars($v)); if(isset(${$facetname}) && in_array($cat->getId(), ${$facetname})) $option[] = true; else @@ -914,7 +914,7 @@ $(document).ready(function() { /* Do not even create a list of options, because it isn't used */ } else { foreach($values as $v=>$c) { - $option = array($v, $v); + $option = array($v, htmlspecialchars($v)); if(isset(${$facetname}) && in_array($v, ${$facetname})) $option[] = true; else @@ -1122,7 +1122,7 @@ $(document).ready(function() { else $fu = $dms->getUserByLogin($v); if($fu) - $oldtransval[] = $fu->getLogin(); + $oldtransval[] = htmlspecialchars($fu->getLogin()); } break; case 'status': @@ -1290,7 +1290,7 @@ $(document).ready(function() { case 'owner': foreach($values as $v=>$c) { if($fu = $dms->getUserByLogin($v)) - $menuitems[] = array('label'=>$fu->getLogin(), 'link'=>$newrequest->getRequestUri().'&'.$facetname.'[]='.$fu->getId(), 'badge'=>$c); + $menuitems[] = array('label'=>htmlspecialchars($fu->getLogin()), 'link'=>$newrequest->getRequestUri().'&'.$facetname.'[]='.$fu->getId(), 'badge'=>$c); } break; default: From 929129abacad413a08381641c076bd0fb193a356 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 31 Oct 2023 14:42:26 +0100 Subject: [PATCH 07/43] do not show filter for categories if none exist --- views/bootstrap/class.Search.php | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/views/bootstrap/class.Search.php b/views/bootstrap/class.Search.php index 6aac1bb1a..4713a907a 100644 --- a/views/bootstrap/class.Search.php +++ b/views/bootstrap/class.Search.php @@ -610,20 +610,22 @@ $(document).ready(function() { $tmpcatids[] = $tmpcat->getID(); $options = array(); $allcategories = $dms->getDocumentCategories(); - foreach($allcategories as $acategory) { - $options[] = array($acategory->getID(), $acategory->getName(), in_array($acategory->getId(), $tmpcatids)); + if($allcategories) { + foreach($allcategories as $acategory) { + $options[] = array($acategory->getID(), $acategory->getName(), in_array($acategory->getId(), $tmpcatids)); + } + $this->formField( + getMLText("categories"), + array( + 'element'=>'select', + 'class'=>'chzn-select', + 'name'=>'category[]', + 'multiple'=>true, + 'attributes'=>array(array('data-placeholder', getMLText('select_category'), array('data-no_results_text', getMLText('unknown_document_category')))), + 'options'=>$options + ) + ); } - $this->formField( - getMLText("categories"), - array( - 'element'=>'select', - 'class'=>'chzn-select', - 'name'=>'category[]', - 'multiple'=>true, - 'attributes'=>array(array('data-placeholder', getMLText('select_category'), array('data-no_results_text', getMLText('unknown_document_category')))), - 'options'=>$options - ) - ); $options = array(); if($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') { if($workflowmode == 'traditional') { From 71369f73b99d6dd0d6b830b5844116a1d45e4afa Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 31 Oct 2023 14:43:42 +0100 Subject: [PATCH 08/43] add changes for 5.1.33 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 077b95ba1..ff83c6928 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -15,6 +15,7 @@ - check if document version may be removed - set max file size for indexing when updating a document - nicer output on info page +- do not show filter for categories in database search if they don't exist -------------------------------------------------------------------------------- Changes in version 5.1.32 From 4e2af679e927c5252daaefd96d467484aac79a02 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 31 Oct 2023 18:49:19 +0100 Subject: [PATCH 09/43] sync with op/op.ImportFS.php --- utils/importfs.php | 161 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 128 insertions(+), 33 deletions(-) diff --git a/utils/importfs.php b/utils/importfs.php index 16323a2f5..eaa50f040 100644 --- a/utils/importfs.php +++ b/utils/importfs.php @@ -88,13 +88,13 @@ if(isset($options['basefolder'])) { } /* check if modification time shall be taken over */ -$filemtime = false; +$setfiledate = false; if(isset($options['filemtime'])) { - $filemtime = true; + $setfiledate = true; } -$foldermtime = false; -if(isset($options['foldermtime'])) { - $foldermtime = true; +$setfolderdate = false; +if(isset($options['setfolderdate'])) { + $setfolderdate = true; } if(isset($settings->_extraPath)) @@ -129,6 +129,87 @@ include($myincpath."/inc/inc.ClassController.php"); echo $settings->_contentDir.$settings->_contentOffsetDir.PHP_EOL; +function getBaseData($colname, $coldata, $objdata) { /* {{{ */ + $objdata[$colname] = $coldata; + return $objdata; +} /* }}} */ + +function getAttributeData($attrdef, $coldata, $objdata) { /* {{{ */ + $objdata['attributes'][$attrdef->getID()] = $coldata; + return $objdata; +} /* }}} */ + +function getCategoryData($colname, $coldata, $objdata) { /* {{{ */ + global $catids; + $kk = explode(',', $coldata); + $objdata['category'][] = array(); + foreach($kk as $k) { + if(isset($catids[$k])) + $objdata['category'][] = $catids[$k]; + } + return $objdata; +} /* }}} */ + +function getUserData($colname, $coldata, $objdata) { /* {{{ */ + global $userids; + if(isset($userids[$coldata])) + $objdata['owner'] = $userids[$coldata]; + return $objdata; +} /* }}} */ + +$metadata = array(); +if(!isset($metadatafile)) { + $csvdelim = ';'; + $csvencl = '"'; + if($fp = fopen($metadatafile, 'r')) { + $colmap = array(); + if($header = fgetcsv($fp, 0, $csvdelim, $csvencl)) { + foreach($header as $i=>$colname) { + $colname = trim($colname); + if(in_array($colname, array('category'))) { + $colmap[$i] = array("getCategoryData", $colname); + } elseif(in_array($colname, array('owner'))) { + $colmap[$i] = array("getUserData", $colname); + } elseif(in_array($colname, array('filename', 'category', 'name', 'comment'))) { + $colmap[$i] = array("getBaseData", $colname); + } elseif(substr($colname, 0, 5) == 'attr:') { + $kk = explode(':', $colname, 2); + if(($attrdef = $dms->getAttributeDefinitionByName($kk[1])) || ($attrdef = $dms->getAttributeDefinition((int) $kk[1]))) { + $colmap[$i] = array("getAttributeData", $attrdef); + } + } + } + } +// echo "
";print_r($colmap);echo "
"; + if(count($colmap) > 1) { + $nameprefix = dirname($dirname).'/'; + $allcats = $dms->getDocumentCategories(); + $catids = array(); + foreach($allcats as $cat) + $catids[$cat->getName()] = $cat; + $allusers = $dms->getAllUsers(); + $userids = array(); + foreach($allusers as $muser) + $userids[$muser->getLogin()] = $muser; + while(!feof($fp)) { + if($data = fgetcsv($fp, 0, $csvdelim, $csvencl)) { + $mi = $nameprefix.$data[$colmap['filename']]; +// $metadata[$mi] = array('category'=>array()); + $md = array(); + $md['attributes'] = array(); + foreach($data as $i=>$coldata) { + if(isset($colmap[$i])) { + $md = call_user_func($colmap[$i][0], $colmap[$i][1], $coldata, $md); + } + } + if(!empty($md['filename'])) + $metadata[$nameprefix.$md['filename']] = $md; + } + } + } + } +} + /* Create a global user object */ if(!($user = $dms->getUserByLogin($userlogin))) { echo "User with login '".$userlogin."' does not exists."; @@ -146,21 +227,22 @@ if ($folder->getAccessMode($user) < M_READWRITE) { exit(1); } -function import_folder($dirname, $folder, $filemtime, $foldermtime) { - global $user, $excludefiles, $fsencoding; +$dms->setForceLink(true); + +function import_folder($dirname, $folder, $setfiledate, $setfolderdate, $metadata) { /* {{{ */ + global $user, $doccount, $foldercount; $d = dir($dirname); $sequence = 1; while(false !== ($entry = $d->read())) { $path = $dirname.'/'.$entry; - if(!in_array($entry, $excludefiles)) { - $name = iconv($fsencoding, 'utf-8', basename($path)); + if($entry != '.' && $entry != '..' && $entry != '.svn') { if(is_file($path)) { + $name = utf8_basename($path); $filetmp = $path; $reviewers = array(); $approvers = array(); - $comment = ''; $version_comment = ''; $reqversion = 1; $expires = false; @@ -173,43 +255,56 @@ function import_folder($dirname, $folder, $filemtime, $foldermtime) { if (is_bool($lastDotIndex) && !$lastDotIndex) $filetype = "."; else $filetype = substr($name, $lastDotIndex); - echo $mimetype." - ".$filetype." - ".$path.PHP_EOL; - $res = $folder->addDocument($name, $comment, $expires, $user, $keywords, - $categories, $filetmp, $name, - $filetype, $mimetype, $sequence, $reviewers, - $approvers, $reqversion, $version_comment); + $docname = !empty($metadata[$path]['name']) ? $metadata[$path]['name'] : $name; + $comment = !empty($metadata[$path]['comment']) ? $metadata[$path]['comment'] : ''; + $owner = !empty($metadata[$path]['owner']) ? $metadata[$path]['owner'] : $user; - if (is_bool($res) && !$res) { - echo "Could not add document to folder".PHP_EOL; - exit(1); + echo $mimetype." - ".$filetype." - ".$path."
\n"; + if($res = $folder->addDocument($docname, $comment, $expires, $owner, $keywords, + !empty($metadata[$path]['category']) ? $metadata[$path]['category'] : array(), $filetmp, $name, + $filetype, $mimetype, $sequence, $reviewers, + $approvers, $reqversion, $version_comment, + !empty($metadata[$path]['attributes']) ? $metadata[$path]['attributes'] : array())) { + $doccount++; + if($setfiledate) { + $newdoc = $res[0]; + $newdoc->setDate(filemtime($path)); + $lc = $newdoc->getLatestContent(); + $lc->setDate(filemtime($path)); + } + } else { + echo "Error importing ".$path."
"; + echo "
".print_r($res, true)."
"; +// return false; } - if($filemtime) { - $newdoc = $res[0]; - $newdoc->setDate(filemtime($path)); - $lc = $newdoc->getLatestContent(); - $lc->setDate(filemtime($path)); - } - set_time_limit(1200); + set_time_limit(30); } elseif(is_dir($path)) { - $newfolder = $folder->addSubFolder($name, '', $user, $sequence); - if($foldermtime) { - $newfolder->setDate(filemtime($path)); + $name = utf8_basename($path); + if($newfolder = $folder->addSubFolder($name, '', $user, $sequence)) { + $foldercount++; + if($setfolderdate) { + $newfolder->setDate(filemtime($path)); + } + if(!import_folder($path, $newfolder, $setfiledate, $setfolderdate, $metadata)) + return false; + } else { +// return false; } - import_folder($path, $newfolder, $filemtime, $foldermtime); } $sequence++; } } -} + return true; +} /* }}} */ if($createbasefolder) { if($newfolder = $folder->addSubFolder(basename($dirname), '', $user, 1)) { - if($foldermtime) { + if($setfolderdate) { $newfolder->setDate(filemtime($dirname)); } - import_folder($dirname, $newfolder, $filemtime, $foldermtime); + import_folder($dirname, $newfolder, $setfiledate, $setfolderdate, $metadata); } } else { - import_folder($dirname, $folder, $filemtime, $foldermtime); + import_folder($dirname, $folder, $setfiledate, $setfolderdate, $metadata); } From 7c1479708fc238686d036e48f80c80d767e51bd4 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 31 Oct 2023 18:49:54 +0100 Subject: [PATCH 10/43] do not list more than 20 folders/files --- views/bootstrap/class.DropFolderChooser.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.DropFolderChooser.php b/views/bootstrap/class.DropFolderChooser.php index e479368c3..554abb5bf 100644 --- a/views/bootstrap/class.DropFolderChooser.php +++ b/views/bootstrap/class.DropFolderChooser.php @@ -54,9 +54,12 @@ $('.folderselect').click(function(ev) { $rii = new DirectoryIterator($path); $files = array(); - foreach ($rii as $file) + foreach ($rii as $file) { if (!$file->isDir()) $files[] = [substr($file->getPath(), strlen($path)+1), $file->getFilename()]; + if(count($files) > 20) + return $files; + } return $files; } @@ -68,11 +71,14 @@ $('.folderselect').click(function(ev) { $rii = new DirectoryIterator($path); $files = array(); - foreach ($rii as $file) + foreach ($rii as $file) { if ($file->isDir()) { if(($t = substr($file->getPath(), strlen($path)+1)) && ($file->getFilename() == '.')) $files[] = $t; } + if(count($files) > 20) + return $files; + } return $files; } From ee4162a5659dd4eb60e5613187b0ec04ef89c272 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 31 Oct 2023 18:51:03 +0100 Subject: [PATCH 11/43] check if $previewer is set --- views/bootstrap/class.Bootstrap.php | 4 ++-- views/bootstrap4/class.Bootstrap4.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 9e55e762d..f69ec0da9 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -3170,7 +3170,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) if(!$skipcont) $content .= $this->documentListRowStart($document); - $previewer->createPreview($latestContent); + if($previewer) $previewer->createPreview($latestContent); $version = $latestContent->getVersion(); if($ec = $this->callHook('documentListRowExtraContent', $document, $latestContent)) @@ -3184,7 +3184,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) else { if($accessop->check_controller_access('Download', array('action'=>'version'))) $content .= "params['settings']->_httpRoot."op/op.Download.php?documentid=".$docID."&version=".$version."\">"; - if($previewer->hasPreview($latestContent)) { + if($previewer && $previewer->hasPreview($latestContent)) { $content .= "params['settings']->_httpRoot."op/op.Preview.php?documentid=".$document->getID()."&version=".$latestContent->getVersion()."&width=".$previewwidth."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; } else { $content .= "getMimeIcon($latestContent->getFileType())."\" ".($previewwidth ? "width=\"".$previewwidth."\"" : "")."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index f718265e4..01830c2e6 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -3244,7 +3244,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) if(!$skipcont) $content .= $this->documentListRowStart($document); - $previewer->createPreview($latestContent); + if($previewer) $previewer->createPreview($latestContent); $version = $latestContent->getVersion(); if($ec = $this->callHook('documentListRowExtraContent', $document, $latestContent)) @@ -3258,7 +3258,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) else { if($accessop->check_controller_access('Download', array('action'=>'version'))) $content .= "params['settings']->_httpRoot."op/op.Download.php?documentid=".$docID."&version=".$version."\">"; - if($previewer->hasPreview($latestContent)) { + if($previewer && $previewer->hasPreview($latestContent)) { $content .= "params['settings']->_httpRoot."op/op.Preview.php?documentid=".$document->getID()."&version=".$latestContent->getVersion()."&width=".$previewwidth."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; } else { $content .= "getMimeIcon($latestContent->getFileType())."\" ".($previewwidth ? "width=\"".$previewwidth."\"" : "")."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; From 7a346f3b9fa7197ef403b662b3f5a0a0957d2d4a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 31 Oct 2023 21:09:15 +0100 Subject: [PATCH 12/43] fix inclusion of files --- utils/importfs.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/utils/importfs.php b/utils/importfs.php index eaa50f040..45e623927 100644 --- a/utils/importfs.php +++ b/utils/importfs.php @@ -119,13 +119,10 @@ if(isset($options['d'])) { include($myincpath."/inc/inc.Settings.php"); include($myincpath."/inc/inc.Utils.php"); -include($myincpath."/inc/inc.Init.php"); include($myincpath."/inc/inc.Language.php"); +include($myincpath."/inc/inc.Init.php"); include($myincpath."/inc/inc.Extension.php"); include($myincpath."/inc/inc.DBInit.php"); -include($myincpath."/inc/inc.ClassNotificationService.php"); -include($myincpath."/inc/inc.ClassEmailNotify.php"); -include($myincpath."/inc/inc.ClassController.php"); echo $settings->_contentDir.$settings->_contentOffsetDir.PHP_EOL; From 4b887c987b81c801ffa00a7c801bec0b8800c5ff Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 31 Oct 2023 21:14:04 +0100 Subject: [PATCH 13/43] fix checking for metadatafile --- utils/importfs.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/importfs.php b/utils/importfs.php index 45e623927..2d81344db 100644 --- a/utils/importfs.php +++ b/utils/importfs.php @@ -155,7 +155,7 @@ function getUserData($colname, $coldata, $objdata) { /* {{{ */ } /* }}} */ $metadata = array(); -if(!isset($metadatafile)) { +if(isset($metadatafile)) { $csvdelim = ';'; $csvencl = '"'; if($fp = fopen($metadatafile, 'r')) { From 172d5b306361057cc8bbf78abb99432032d584b3 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 2 Nov 2023 13:11:14 +0100 Subject: [PATCH 14/43] do not set max_execution_time in constructor, it will be set later --- inc/inc.ClassSettings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php index 2aa5f1932..c1fe6f3b4 100644 --- a/inc/inc.ClassSettings.php +++ b/inc/inc.ClassSettings.php @@ -383,8 +383,8 @@ class Settings { /* {{{ */ exit; } - if (!is_null($this->_maxExecutionTime)) - ini_set("max_execution_time", $this->_maxExecutionTime); +// if (!is_null($this->_maxExecutionTime)) +// ini_set("max_execution_time", $this->_maxExecutionTime); } /* }}} */ /** From 0f258d81aca4b6753819cfdef6437ab418a92db8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 6 Nov 2023 14:31:18 +0100 Subject: [PATCH 15/43] add warning about document being release only if initial doc status is 'released' --- views/bootstrap/class.AddDocument.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/views/bootstrap/class.AddDocument.php b/views/bootstrap/class.AddDocument.php index be12b4e08..67a56ed35 100644 --- a/views/bootstrap/class.AddDocument.php +++ b/views/bootstrap/class.AddDocument.php @@ -150,6 +150,7 @@ console.log(params); function show() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; + $settings = $this->params['settings']; $folder = $this->params['folder']; $enablelargefileupload = $this->params['enablelargefileupload']; $enablemultiupload = $this->params['enablemultiupload']; @@ -511,7 +512,8 @@ console.log(params); ) ); } - $this->warningMsg(getMLText("add_doc_workflow_warning")); + if($settings->_initialDocumentStatus == S_RELEASED) + $this->warningMsg(getMLText("add_doc_workflow_warning")); } elseif($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') { $this->contentContainerEnd(); if($workflowmode == 'traditional') { From 1a5dbfef5104eab7c02ba957c07e08ea5e57ef20 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 6 Nov 2023 14:31:56 +0100 Subject: [PATCH 16/43] get settings from view --- views/bootstrap/class.UpdateDocument.php | 1 + 1 file changed, 1 insertion(+) diff --git a/views/bootstrap/class.UpdateDocument.php b/views/bootstrap/class.UpdateDocument.php index b000d5ae5..5fba65fe5 100644 --- a/views/bootstrap/class.UpdateDocument.php +++ b/views/bootstrap/class.UpdateDocument.php @@ -132,6 +132,7 @@ console.log(element); function show() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; + $settings = $this->params['settings']; $folder = $this->params['folder']; $document = $this->params['document']; $strictformcheck = $this->params['strictformcheck']; From aa9600453d285766cdb915f3776e01e5f2c65088 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 12 Nov 2023 17:36:01 +0100 Subject: [PATCH 17/43] show logs of finished worflows --- views/bootstrap/class.Bootstrap.php | 17 ++++++++++ .../bootstrap/class.DocumentVersionDetail.php | 29 +++++++---------- views/bootstrap/class.ViewDocument.php | 32 ++++++++++--------- views/bootstrap4/class.Bootstrap4.php | 17 ++++++++++ 4 files changed, 62 insertions(+), 33 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index f69ec0da9..824d6f9e6 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -3727,6 +3727,23 @@ $(document).ready(function() { "; + echo "".getMLText('workflow')."".getMLText('date')."".getMLText('action')."".getMLText('user')."".getMLText('comment')."\n"; + echo ""; + foreach($wkflogs as $wkflog) { + echo ""; + echo "".htmlspecialchars($wkflog->getWorkflow()->getName()).""; + echo "".getLongReadableDate($wkflog->getDate()).""; + echo "".htmlspecialchars(getMLText('action_'.strtolower($wkflog->getTransition()->getAction()->getName()), array(), $wkflog->getTransition()->getAction()->getName())).""; + $loguser = $wkflog->getUser(); + echo "".htmlspecialchars($loguser->getFullName()).""; + echo "".htmlspecialchars($wkflog->getComment()).""; + echo ""; + } + print "\n\n"; + } /* }}} */ + /** * Show progressbar * diff --git a/views/bootstrap/class.DocumentVersionDetail.php b/views/bootstrap/class.DocumentVersionDetail.php index 9ea58444e..4d751bff9 100644 --- a/views/bootstrap/class.DocumentVersionDetail.php +++ b/views/bootstrap/class.DocumentVersionDetail.php @@ -554,7 +554,7 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { $this->contentContainerEnd(); } /* }}} */ - if($user->isAdmin()) { + if($accessop->check_view_access($this, array('action'=>'statuslog'))) { $this->contentHeading(getMLText("status")); $this->contentContainerStart(); $statuslog = $version->getStatusLog(); @@ -570,26 +570,19 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { } print "\n\n"; $this->contentContainerEnd(); + } - $wkflogs = $version->getWorkflowLog(); - if($wkflogs) { - $this->contentHeading(getMLText("workflow_summary")); - $this->contentContainerStart(); - echo ""; - echo "\n"; - echo ""; - foreach($wkflogs as $wkflog) { - echo ""; - echo ""; - echo ""; - $loguser = $wkflog->getUser(); - echo ""; - echo ""; - echo ""; + if($accessop->check_view_access($this, array('action'=>'finished_workflowlog'))) { + $wkfalllogs = $version->getWorkflowLog(); + if($wkfalllogs) { + $this->contentHeading(getMLText("finished_workflow_log")); + foreach($wkfalllogs as $wkflogs) { + $this->printWorkflowLog($wkflogs); } - print "\n
".getMLText('date')."".getMLText('action')."".getMLText('user')."".getMLText('comment')."
".$wkflog->getDate()."".$wkflog->getTransition()->getAction()->getName()."".$loguser->getFullName()."".$wkflog->getComment()."
\n"; - $this->contentContainerEnd(); } + } + + if($user->isAdmin() || $user->getId() == $document->getOwner()->getId()) { $this->rowStart(); /* Check for an existing review log, even if the workflowmode * is set to traditional_only_approval. There may be old documents diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 1b63523a4..580f12aa5 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -1039,6 +1039,22 @@ $(document).ready( function() { print "\n\n"; $this->contentContainerEnd(); } + + if(!$workflow) { + if($accessobject->check_view_access($this, array('action'=>'finished_workflowlog'))) { + $wkfalllogs = $latestContent->getWorkflowLog(); + if($wkfalllogs) { + $this->contentHeading(getMLText("finished_workflow_log")); + foreach($wkfalllogs as $wkflogs) { + $this->rowStart(); + $this->columnStart(12); + $this->printWorkflowLog($wkflogs); + $this->columnEnd(); + $this->rowEnd(); + } + } + } + } ?> rowStart(); $this->columnStart(12); $this->contentHeading(getMLText("workflow_log")); - $this->contentContainerStart(); - echo ""; - echo "\n"; - echo ""; - foreach($wkflogs as $wkflog) { - echo ""; - echo ""; - echo ""; - $loguser = $wkflog->getUser(); - echo ""; - echo ""; - echo ""; - } - print "\n
".getMLText('date')."".getMLText('action')."".getMLText('user')."".getMLText('comment')."
".getLongReadableDate($wkflog->getDate())."".htmlspecialchars(getMLText('action_'.strtolower($wkflog->getTransition()->getAction()->getName()), array(), $wkflog->getTransition()->getAction()->getName()))."".htmlspecialchars($loguser->getFullName())."".htmlspecialchars($wkflog->getComment())."
\n"; - $this->contentContainerEnd(); + $this->printWorkflowLog($wkflogs); $this->columnEnd(); $this->rowEnd(); } diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index 01830c2e6..b47340aee 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -3809,6 +3809,23 @@ $(document).ready(function() { "; + echo "".getMLText('workflow')."".getMLText('date')."".getMLText('action')."".getMLText('user')."".getMLText('comment')."\n"; + echo ""; + foreach($wkflogs as $wkflog) { + echo ""; + echo "".htmlspecialchars($wkflog->getWorkflow()->getName()).""; + echo "".getLongReadableDate($wkflog->getDate()).""; + echo "".htmlspecialchars(getMLText('action_'.strtolower($wkflog->getTransition()->getAction()->getName()), array(), $wkflog->getTransition()->getAction()->getName())).""; + $loguser = $wkflog->getUser(); + echo "".htmlspecialchars($loguser->getFullName()).""; + echo "".htmlspecialchars($wkflog->getComment()).""; + echo ""; + } + print "\n\n"; + } /* }}} */ + /** * Show progressbar * From 9132e2805234a5a2f83eed7219e38fb31a5359ab Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 12 Nov 2023 17:36:44 +0100 Subject: [PATCH 18/43] add changes for 5.1.33 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index ff83c6928..2134d49ee 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -16,6 +16,7 @@ - set max file size for indexing when updating a document - nicer output on info page - do not show filter for categories in database search if they don't exist +- show logs of finished worflows -------------------------------------------------------------------------------- Changes in version 5.1.32 From 6f8f56ad4bfd2c2a66b5e28d6ce2fd101ab884e9 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 12 Nov 2023 19:05:35 +0100 Subject: [PATCH 19/43] sync with layout of ViewDocument --- .../bootstrap/class.DocumentVersionDetail.php | 139 ++++++++++++------ 1 file changed, 90 insertions(+), 49 deletions(-) diff --git a/views/bootstrap/class.DocumentVersionDetail.php b/views/bootstrap/class.DocumentVersionDetail.php index 4d751bff9..91c2404c0 100644 --- a/views/bootstrap/class.DocumentVersionDetail.php +++ b/views/bootstrap/class.DocumentVersionDetail.php @@ -46,6 +46,41 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { "; + foreach($items as $item) { + if(is_string($item)) + echo "
  • ".$item."
  • "; + elseif(is_array($item)) { + echo "
  • ".(!empty($item['icon']) ? " " : "").''.getMLText($item['label'])."
  • "; + } + } + print ""; + return; + print ""; + } /* }}} */ + function preview() { /* {{{ */ $dms = $this->params['dms']; $document = $this->params['document']; @@ -139,7 +174,7 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { $user = $this->params['user']; $folder = $this->params['folder']; $document = $this->params['document']; - $accessop = $this->params['accessobject']; + $accessobject = $this->params['accessobject']; $version = $this->params['version']; $viewonlinefiletypes = $this->params['viewonlinefiletypes']; $enableversionmodification = $this->params['enableversionmodification']; @@ -249,18 +284,20 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { $file_exists=file_exists($dms->contentDir . $version->getPath()); $this->contentHeading(getMLText("details_version", array ("version" => $version->getVersion()))); - $this->contentContainerStart(); - print ""; - print "\n\n"; - print "\n"; +// $this->contentContainerStart(); +// print "
    ".htmlspecialchars($version->getOriginalFileName())."
    "; +// print "\n\n"; +// print "\n"; // print "\n"; - print "\n"; - print "\n"; - print "\n\n\n"; - print "\n"; - print "\n"; +// print "\n"; +// print "\n\n\n"; +// print "\n"; +// print "\n"; +// print "\n"; - print "\n"; - - print ""; + print ""; + print ""; +// print "\n"; - print ""; + +// print ""; - print "\n
    ".htmlspecialchars($version->getOriginalFileName())."".getMLText("comment")."".getMLText("status")."
      "; +// print "
    ".getMLText("status")."
      "; - print "
    "; +// print ""; + $this->rowStart(); + $this->columnStart(3); $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidthdetail, $timeout, $xsendfile); if($conversionmgr) $previewer->setConversionMgr($conversionmgr); @@ -282,9 +319,12 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { if ($file_exists) { print ""; } - print "
      \n"; +// print "
    "; + $this->columnEnd(); + $this->columnStart(5); + print "
      \n"; print "
    • ".getMLText('version').": ".$version->getVersion()."
    • \n"; if ($file_exists) @@ -316,50 +356,51 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { } } } - print "
    "; - print getOverallStatusText($status["status"]); + print "
  • ".getMLText('status').": ".getOverallStatusText($status["status"]); if ( $status["status"]==S_DRAFT_REV || $status["status"]==S_DRAFT_APP || $status["status"]==S_IN_WORKFLOW || $status["status"]==S_EXPIRED ){ print "
    hasExpired()?" class=\"warning\" ":"").">".(!$document->getExpires() ? getMLText("does_not_expire") : getMLText("expires").": ".getReadableDate($document->getExpires())).""; } - print "
  • "; +// print ""; + $this->columnEnd(); + $this->columnStart(4); +// print ""; - //if (($document->getAccessMode($user) >= M_READWRITE)) { if ($file_exists){ - print ""; - } - - print ""; - echo "
    \n"; + $items = array(); + if($accessobject->mayRemoveVersion()) { + $items[] = array('link'=>$this->html_url('RemoveVersion', array('documentid'=>$version->getDocument()->getId(),'version'=>$version->getVersion())), 'icon'=>'remove', 'label'=>'rm_version'); + } - $this->contentContainerEnd(); + if($newitems = $this->callHook('extraVersionActions', $version)) + $items = array_merge($items, $newitems); + if($items) { + $this->showActions($items); + } +// echo ""; +// print "\n\n"; + + $this->columnEnd(); + $this->rowEnd(); +// $this->contentContainerEnd(); $this->rowStart(); $this->columnStart(6); @@ -554,7 +595,7 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { $this->contentContainerEnd(); } /* }}} */ - if($accessop->check_view_access($this, array('action'=>'statuslog'))) { + if($accessobject->check_view_access($this, array('action'=>'statuslog'))) { $this->contentHeading(getMLText("status")); $this->contentContainerStart(); $statuslog = $version->getStatusLog(); @@ -572,7 +613,7 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { $this->contentContainerEnd(); } - if($accessop->check_view_access($this, array('action'=>'finished_workflowlog'))) { + if($accessobject->check_view_access($this, array('action'=>'finished_workflowlog'))) { $wkfalllogs = $version->getWorkflowLog(); if($wkfalllogs) { $this->contentHeading(getMLText("finished_workflow_log")); From 2e8ab0cb5204c4411917ec83f373ba121d8fa94f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 12 Nov 2023 19:05:54 +0100 Subject: [PATCH 20/43] do not allow to set workflow of previous versions --- views/bootstrap/class.ViewDocument.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 580f12aa5..074abeb14 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -819,6 +819,7 @@ $(document).ready( function() { if($islatest && $accessobject->mayOverwriteStatus()) { $items[] = array('link'=>$this->html_url('OverrideContentStatus', array('documentid'=>$latestContent->getDocument()->getId(),'version'=>$latestContent->getVersion())), 'icon'=>'align-justify', 'label'=>'change_status'); } + if(0) { if($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') { // Allow changing reviewers/approvals only if not reviewed if($accessobject->maySetReviewersApprovers()) { @@ -832,6 +833,7 @@ $(document).ready( function() { } } } + } if($accessobject->check_view_access('EditComment')) if($accessobject->mayEditComment()) { $items[] = array('link'=>$this->html_url('EditComment', array('documentid'=>$latestContent->getDocument()->getId(),'version'=>$latestContent->getVersion())), 'icon'=>'comment', 'label'=>'edit_comment'); From 1115d08d2fdcf52dfc0fc59ee589456ba8e5e68a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 12 Nov 2023 19:19:02 +0100 Subject: [PATCH 21/43] use instead of --- views/bootstrap/class.DocumentVersionDetail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.DocumentVersionDetail.php b/views/bootstrap/class.DocumentVersionDetail.php index c524764c3..d11d0ad94 100644 --- a/views/bootstrap/class.DocumentVersionDetail.php +++ b/views/bootstrap/class.DocumentVersionDetail.php @@ -379,7 +379,7 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { if ($viewonlinefiletypes && (in_array(strtolower($version->getFileType()), $viewonlinefiletypes) || in_array(strtolower($version->getMimeType()), $viewonlinefiletypes))) if($accessop->check_controller_access('ViewOnline', array('action'=>'run'))) $items[] = array('link'=>$this->params['settings']->_httpRoot."op/op.ViewOnline.php?documentid=".$version->getDocument()->getId()."&version=". $version->getVersion(), 'icon'=>'eye', 'label'=>'view_online', 'target'=>'_blank'); - if($newitems = $this->callHook('extraVersionViews', $latestContent)) + if($newitems = $this->callHook('extraVersionViews', $version)) $items = array_merge($items, $newitems); if($items) { $this->showActions($items); From 0012de73378a0715ae49a09c8d2217ddc9cff1f8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 23 Nov 2023 15:50:25 +0100 Subject: [PATCH 22/43] allow ttf files in directory 'res' --- .htaccess | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.htaccess b/.htaccess index 69e29975e..d9ef34429 100644 --- a/.htaccess +++ b/.htaccess @@ -32,7 +32,7 @@ RewriteRule ^ext/[^/]+/icon.(?:png|svg)$ - [L] RewriteCond %{REQUEST_URI} "ext/[^/]+/" RewriteRule !^ext/[^/]+/.*(?:op|out|res|node_modules) - [F] RewriteCond %{REQUEST_URI} "ext/[^/]+/res/.*$" [NC] -RewriteRule !^ext/[^/]+/res/.*\.(?:css|js|png|gif|svg|ico|html|woff) - [F] +RewriteRule !^ext/[^/]+/res/.*\.(?:css|js|png|gif|svg|ico|html|woff|ttf) - [F] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ext/.*$ - [L] From d59a4c18c9f2a62793ee192ddde6a2fedf51733e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 28 Nov 2023 10:23:08 +0100 Subject: [PATCH 23/43] use conversion manager --- out/out.Clipboard.php | 2 ++ views/bootstrap/class.Clipboard.php | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/out/out.Clipboard.php b/out/out.Clipboard.php index 4460a3012..3d5147f1b 100644 --- a/out/out.Clipboard.php +++ b/out/out.Clipboard.php @@ -43,7 +43,9 @@ if (isset($_GET["folderid"]) && is_numeric($_GET["folderid"])) { if($view) { $view->setParam('folder', $folder); + $view->setParam('conversionmgr', $conversionmgr); $view->setParam('previewWidthList', $settings->_previewWidthList); + $view->setParam('previewConverters', isset($settings->_converters['preview']) ? $settings->_converters['preview'] : array()); $view->setParam('timeout', $settings->_cmdTimeout); $view->setParam('xsendfile', $settings->_enableXsendfile); $view($_GET); diff --git a/views/bootstrap/class.Clipboard.php b/views/bootstrap/class.Clipboard.php index 0bbc0c7b0..3b75db496 100644 --- a/views/bootstrap/class.Clipboard.php +++ b/views/bootstrap/class.Clipboard.php @@ -159,11 +159,17 @@ class SeedDMS_View_Clipboard extends SeedDMS_Theme_Style { $dms = $this->params['dms']; $clipboard = $this->params['session']->getClipboard(); $cachedir = $this->params['cachedir']; + $conversionmgr = $this->params['conversionmgr']; $previewwidth = $this->params['previewWidthList']; + $previewconverters = $this->params['previewConverters']; $timeout = $this->params['timeout']; $xsendfile = $this->params['xsendfile']; $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); + if($conversionmgr) + $previewer->setConversionMgr($conversionmgr); + else + $previewer->setConverters($previewconverters); $content = ''; $txt = $this->callHook('preClipboard', $clipboard); if(is_string($txt)) From 8ff33030157eafc425db28934f2bebfadb5bf130 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 28 Nov 2023 10:23:23 +0100 Subject: [PATCH 24/43] add changes for 5.1.33 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 2134d49ee..07d4f0baa 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -17,6 +17,7 @@ - nicer output on info page - do not show filter for categories in database search if they don't exist - show logs of finished worflows +- show preview of documents on clipboard -------------------------------------------------------------------------------- Changes in version 5.1.32 From dbb938157321757e5a6be805f3891ec444711adc Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 30 Nov 2023 16:59:00 +0100 Subject: [PATCH 25/43] use controller when adding a new document --- restapi/index.php | 89 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 2 deletions(-) diff --git a/restapi/index.php b/restapi/index.php index 3eceae4f0..85abbbd5a 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -608,6 +608,7 @@ class RestapiController { /* {{{ */ $userobj = $this->container->userobj; $settings = $this->container->config; $notifier = $this->container->notifier; + $fulltextservice = $this->container->fulltextservice; if(!$userobj) { return $response->withJson(array('success'=>false, 'message'=>'Not logged in', 'data'=>''), 403); @@ -693,11 +694,94 @@ class RestapiController { /* {{{ */ return $response->withJson(array('success'=>false, 'message'=>getMLText("document_duplicate_name"), 'data'=>''), 409); } } + // Get the list of reviewers and approvers for this document. + $reviewers = array(); + $approvers = array(); + $reviewers["i"] = array(); + $reviewers["g"] = array(); + $approvers["i"] = array(); + $approvers["g"] = array(); + $workflow = null; + if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') { + // add mandatory reviewers/approvers + if($settings->_workflowMode == 'traditional') { + $mreviewers = getMandatoryReviewers($folder, $userobj); + if($mreviewers['i']) + $reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']); + if($mreviewers['g']) + $reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']); + } + $mapprovers = getMandatoryApprovers($folder, $userobj); + if($mapprovers['i']) + $approvers['i'] = array_merge($approvers['i'], $mapprovers['i']); + if($mapprovers['g']) + $approvers['g'] = array_merge($approvers['g'], $mapprovers['g']); + } elseif($settings->_workflowMode == 'advanced') { + if($workflows = $userobj->getMandatoryWorkflows()) { + $workflow = array_shift($workflows); + } + } $temp = $file_info->file; $finfo = finfo_open(FILEINFO_MIME_TYPE); $userfiletype = finfo_file($finfo, $temp); $fileType = ".".pathinfo($origfilename, PATHINFO_EXTENSION); - finfo_close($finfo); + finfo_close($finfo); + $attributes_version = []; + $notusers = []; + $notgroups = []; + $controller = Controller::factory('AddDocument'); + $controller->setParam('documentsource', 'restapi'); + $controller->setParam('documentsourcedetails', null); + $controller->setParam('dms', $dms); + $controller->setParam('user', $userobj); + $controller->setParam('folder', $mfolder); + $controller->setParam('fulltextservice', $fulltextservice); + $controller->setParam('name', $docname); + $controller->setParam('comment', $comment); + $controller->setParam('expires', $expires); + $controller->setParam('keywords', $keywords); + $controller->setParam('categories', $cats); + $controller->setParam('owner', $owner ? $owner : $userobj); + $controller->setParam('userfiletmp', $temp); + $controller->setParam('userfilename', $origfilename ? $origfilename : basename($temp)); + $controller->setParam('filetype', $fileType); + $controller->setParam('userfiletype', $userfiletype); + $controller->setParam('sequence', $sequence); + $controller->setParam('reviewers', $reviewers); + $controller->setParam('approvers', $approvers); + $controller->setParam('reqversion', $reqversion); + $controller->setParam('versioncomment', $version_comment); + $controller->setParam('attributes', $attributes); + $controller->setParam('attributesversion', $attributes_version); + $controller->setParam('workflow', $workflow); + $controller->setParam('notificationgroups', $notgroups); + $controller->setParam('notificationusers', $notusers); + $controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText); + $controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs); + + if(!($document = $controller())) { + $err = $controller->getErrorMsg(); + if(is_string($err)) + $errmsg = getMLText($err); + elseif(is_array($err)) { + $errmsg = getMLText($err[0], $err[1]); + } else { + $errmsg = $err; + } + unlink($temp); + return $response->withJson(array('success'=>false, 'message'=>'Upload failed', 'data'=>''), 500); + } else { + if($controller->hasHook('cleanUpDocument')) { + $controller->callHook('cleanUpDocument', $document, $file); + } + // Send notification to subscribers of folder. + if($notifier) { + $notifier->sendNewDocumentMail($document, $userobj); + } + unlink($temp); + return $response->withJson(array('success'=>true, 'message'=>'Upload succeded', 'data'=>$this->__getLatestVersionData($document->getLatestContent())), 201); + } + /* $res = $mfolder->addDocument($docname, $comment, $expires, $owner ? $owner : $userobj, $keywords, $cats, $temp, $origfilename ? $origfilename : basename($temp), $fileType, $userfiletype, $sequence, array(), array(), $reqversion, $version_comment, $attributes); unlink($temp); if($res) { @@ -708,7 +792,8 @@ class RestapiController { /* {{{ */ return $response->withJson(array('success'=>true, 'message'=>'Upload succeded', 'data'=>$this->__getLatestVersionData($doc->getLatestContent())), 201); } else { return $response->withJson(array('success'=>false, 'message'=>'Upload failed', 'data'=>''), 500); - } + } + */ } else { return $response->withJson(array('success'=>false, 'message'=>'No access', 'data'=>''), 403); } From 1133d655443d9c3619837d30bc58bc6e02b67be7 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 30 Nov 2023 17:00:18 +0100 Subject: [PATCH 26/43] new method to delete group --- restapi/index.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/restapi/index.php b/restapi/index.php index 85abbbd5a..f28a86220 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -2201,6 +2201,25 @@ class RestapiController { /* {{{ */ return $response->withJson(array('success'=>true, 'message'=>'', 'data'=>$this->__getGroupData($newGroup)), 201); } /* }}} */ + function deleteGroup($request, $response, $args) { /* {{{ */ + $dms = $this->container->dms; + $userobj = $this->container->userobj; + + $check = $this->checkIfAdmin($request, $response); + if($check !== true) + return $check; + + if($group = $dms->getGroup($args['id'])) { + if($result = $group->remove($userobj)) { + return $response->withJson(array('success'=>$result, 'message'=>'', 'data'=>''), 200); + } else { + return $response->withJson(array('success'=>$result, 'message'=>'Could not delete group', 'data'=>''), 500); + } + } else { + return $response->withJson(array('success'=>false, 'message'=>'No such group', 'data'=>''), 404); + } + } /* }}} */ + function getGroup($request, $response, $args) { /* {{{ */ $dms = $this->container->dms; $userobj = $this->container->userobj; @@ -2869,6 +2888,7 @@ $app->put('/users/{id}/disable', \RestapiController::class.':setDisabledUser'); $app->put('/users/{id}/password', \RestapiController::class.':changeUserPassword'); $app->post('/groups', \RestapiController::class.':createGroup'); $app->get('/groups', \RestapiController::class.':getGroups'); +$app->delete('/groups/{id}', \RestapiController::class.':deleteGroup'); $app->get('/groups/{id}', \RestapiController::class.':getGroup'); $app->put('/groups/{id}/addUser', \RestapiController::class.':addUserToGroup'); $app->put('/groups/{id}/removeUser', \RestapiController::class.':removeUserFromGroup'); From b131c63dd78957df8520376622b74001129b625a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 30 Nov 2023 17:01:16 +0100 Subject: [PATCH 27/43] fix error msg when creating a group without passing a name --- restapi/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/restapi/index.php b/restapi/index.php index f28a86220..eebf0182a 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -2186,7 +2186,7 @@ class RestapiController { /* {{{ */ return $check; $params = $request->getParsedBody(); if (empty($params['name'])) { - return $response->withJson(array('success'=>false, 'message'=>'Need a category.', 'data'=>''), 400); + return $response->withJson(array('success'=>false, 'message'=>'Need a group name.', 'data'=>''), 400); } $groupName = $params['name']; From 576b866b7f6cd9c6536d6cd95aab65ca505d7e6c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 30 Nov 2023 17:02:28 +0100 Subject: [PATCH 28/43] fix return code of changeGroupMembership() if no user id is passed --- restapi/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/restapi/index.php b/restapi/index.php index eebf0182a..9766a8de7 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -2260,7 +2260,7 @@ class RestapiController { /* {{{ */ $params = $request->getParsedBody(); if (empty($params['userid'])) { - return $response->withJson(array('success'=>false, 'message'=>'Missing userid', 'data'=>''), 200); + return $response->withJson(array('success'=>false, 'message'=>'Missing userid', 'data'=>''), 500); } $userId = $params['userid']; if(ctype_digit($userId)) From 03de004b3056a156ebd62a00f6d0358eaf4dda3c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 30 Nov 2023 17:02:51 +0100 Subject: [PATCH 29/43] fix calling changeGroupMembership() --- restapi/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/restapi/index.php b/restapi/index.php index 9766a8de7..15a695ec2 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -2303,11 +2303,11 @@ class RestapiController { /* {{{ */ } /* }}} */ function addUserToGroup($request, $response, $args) { /* {{{ */ - return changeGroupMembership($request, $response, $args, 'add'); + return $this->changeGroupMembership($request, $response, $args, 'add'); } /* }}} */ function removeUserFromGroup($request, $response, $args) { /* {{{ */ - return changeGroupMembership($request, $response, $args, 'remove'); + return $this->changeGroupMembership($request, $response, $args, 'remove'); } /* }}} */ function setFolderInheritsAccess($request, $response, $args) { /* {{{ */ From 2a2035cccff2be355d914ec6d2462e25a7ab12be Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 13 Dec 2023 08:07:38 +0100 Subject: [PATCH 30/43] use showActions() to output list of buttons on attachment tab --- views/bootstrap/class.ViewDocument.php | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 074abeb14..a1e9bec76 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -141,7 +141,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { $txt = $this->callHook('documentListItem', $document, $previewer, false, 'viewitem'); if(is_string($txt)) $content = $txt; - else + else $content = $this->documentListRow($document, $previewer, true); echo $content; } @@ -337,7 +337,8 @@ $(document).ready( function() { } print ""; - print "
      \n"; + print ""; + print "
        \n"; print "
      • ".htmlspecialchars($file->getName())."
      • \n"; if($file->getName() != $file->getOriginalFileName()) print "
      • ".htmlspecialchars($file->getOriginalFileName())."
      • \n"; @@ -355,23 +356,26 @@ $(document).ready( function() { print "
      "; print "".htmlspecialchars($file->getComment()).""; - print "
        "; + $this->showActions($items); + $items = []; if (($document->getAccessMode($user) == M_ALL)||($file->getUserID()==$user->getID())) { - print $this->html_link('RemoveDocumentFile', array('documentid'=>$document->getID(), 'fileid'=>$file->getID()), array(), ''.getMLText("delete"), false, true, array('
      • ', '
      • ')); - print $this->html_link('EditDocumentFile', array('documentid'=>$document->getID(), 'fileid'=>$file->getID()), array(), ''.getMLText("edit"), false, true, array('
      • ', '
      • ')); + $items[] = array('link'=>$this->html_url('RemoveDocumentFile', array('documentid'=>$document->getID(), 'fileid'=>$file->getID())), 'icon'=>'remove', 'label'=>'delete'); + $items[] = array('link'=>$this->html_url('EditDocumentFile', array('documentid'=>$document->getID(), 'fileid'=>$file->getID())), 'icon'=>'edit', 'label'=>'edit'); } - print "
      "; + $this->showActions($items); + print ""; print ""; } From cab5f5bb2ef3173ef96b93ec9d639dcf72103d28 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 13 Dec 2023 08:23:19 +0100 Subject: [PATCH 31/43] __getDocumentData() sets categories --- restapi/index.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/restapi/index.php b/restapi/index.php index 15a695ec2..97a9cf3b2 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -44,13 +44,19 @@ class RestapiController { /* {{{ */ } /* }}} */ protected function __getDocumentData($document) { /* {{{ */ + $cats = $document->getCategories(); + $tmp = []; + foreach($cats as $cat) { + $tmp[] = $this->__getCategoryData($cat); + } $data = array( 'type'=>'document', 'id'=>(int)$document->getId(), 'date'=>date('Y-m-d H:i:s', $document->getDate()), 'name'=>$document->getName(), 'comment'=>$document->getComment(), - 'keywords'=>$document->getKeywords() + 'keywords'=>$document->getKeywords(), + 'categories'=>$tmp ); return $data; } /* }}} */ From 1ac232476a86076f403576961faf5042eee354f9 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 13 Dec 2023 08:23:58 +0100 Subject: [PATCH 32/43] simplified removeDocumentCategory --- restapi/index.php | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/restapi/index.php b/restapi/index.php index 97a9cf3b2..8f391f6c3 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -1562,24 +1562,20 @@ class RestapiController { /* {{{ */ } $document = $dms->getDocument($args['id']); + if(!$document) + return $response->withJson(array('success'=>false, 'message'=>'No such document', 'data'=>''), 404); $category = $dms->getDocumentCategory($args['catid']); + if(!$category) + return $response->withJson(array('success'=>false, 'message'=>'No such category', 'data'=>''), 404); - if($document && $category) { - if ($document->getAccessMode($userobj, 'removeDocumentCategory') >= M_READWRITE) { - $ret = $document->removeCategories(array($category)); - if ($ret) - return $response->withJson(array('success'=>true, 'message'=>'Deleted category successfully.', 'data'=>''), 200); - else - return $response->withJson(array('success'=>true, 'message'=>'', 'data'=>''), 200); - } else { - return $response->withJson(array('success'=>false, 'message'=>'No access', 'data'=>''), 403); - } + if ($document->getAccessMode($userobj, 'removeDocumentCategory') >= M_READWRITE) { + $ret = $document->removeCategories(array($category)); + if ($ret) + return $response->withJson(array('success'=>true, 'message'=>'Deleted category successfully.', 'data'=>''), 200); + else + return $response->withJson(array('success'=>true, 'message'=>'', 'data'=>''), 200); } else { - if(!$document) - return $response->withJson(array('success'=>false, 'message'=>'No such document', 'data'=>''), 404); - if(!$category) - return $response->withJson(array('success'=>false, 'message'=>'No such category', 'data'=>''), 404); - return $response->withJson(array('success'=>false, 'message'=>'', 'data'=>''), 500); + return $response->withJson(array('success'=>false, 'message'=>'No access', 'data'=>''), 403); } } /* }}} */ From 08415039ca41d775a76cb88df570f7294d51fe4a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 13 Dec 2023 08:24:30 +0100 Subject: [PATCH 33/43] add name of attribute def. in error msg when setting an attribute --- restapi/index.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/restapi/index.php b/restapi/index.php index 8f391f6c3..9d744745c 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -1669,7 +1669,7 @@ class RestapiController { /* {{{ */ $doc = $dms->getDocument($args['id']); if($doc && $attrdef) { if($attrdef->getObjType() !== SeedDMS_Core_AttributeDefinition::objtype_document) { - return $response->withJson(array('success'=>false, 'message'=>'Attribute definition not suitable for documents', 'data'=>''), 409); + return $response->withJson(array('success'=>false, 'message'=>'Attribute definition "'.$attrdef->getName().'" not suitable for documents', 'data'=>''), 409); } $params = $request->getParsedBody(); @@ -1726,7 +1726,7 @@ class RestapiController { /* {{{ */ $version = $doc->getContentByVersion($args['version']); if($doc && $attrdef && $version) { if($attrdef->getObjType() !== SeedDMS_Core_AttributeDefinition::objtype_documentcontent) { - return $response->withJson(array('success'=>false, 'message'=>'Attribute definition not suitable for document versions', 'data'=>''), 409); + return $response->withJson(array('success'=>false, 'message'=>'Attribute definition "'.$attrdef->getName().'" not suitable for document versions', 'data'=>''), 409); } $params = $request->getParsedBody(); @@ -1780,7 +1780,7 @@ class RestapiController { /* {{{ */ $obj = $dms->getFolder($args['id']); if($obj && $attrdef) { if($attrdef->getObjType() !== SeedDMS_Core_AttributeDefinition::objtype_folder) { - return $response->withJson(array('success'=>false, 'message'=>'Attribute definition not suitable for folders', 'data'=>''), 409); + return $response->withJson(array('success'=>false, 'message'=>'Attribute definition "'.$attrdef->getName().'" not suitable for folders', 'data'=>''), 409); } $params = $request->getParsedBody(); From f330477003046083e2ceafe7fcc0013ffcd69cd6 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 13 Dec 2023 08:26:16 +0100 Subject: [PATCH 34/43] add changes for 5.1.33 --- CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 07d4f0baa..9477ffeaf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -18,6 +18,8 @@ - do not show filter for categories in database search if they don't exist - show logs of finished worflows - show preview of documents on clipboard +- minor improvements in restapi +- update layout of tab for attachments -------------------------------------------------------------------------------- Changes in version 5.1.32 From 62ff3da502308a7191a7392adaf49ac263fd67f1 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 15 Dec 2023 14:19:49 +0100 Subject: [PATCH 35/43] get composer 2.2.22 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 4d4be7f17..af197c585 100644 --- a/build.xml +++ b/build.xml @@ -16,7 +16,7 @@ - + From facd9f7a657a4a497cdd8ed69ca2b4129665c89e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 15 Dec 2023 17:13:28 +0100 Subject: [PATCH 36/43] use a stats array from fulltext search for min/max of facet value --- out/out.Search.php | 5 +++++ views/bootstrap/class.Search.php | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/out/out.Search.php b/out/out.Search.php index c56138c05..5b868bee2 100644 --- a/out/out.Search.php +++ b/out/out.Search.php @@ -356,10 +356,12 @@ if($fullsearch) { $totalPages = 0; $entries = array(); $facets = array(); + $stats = array(); $searchTime = 0; } else { $entries = array(); $facets = $searchresult['facets']; + $stats = $searchresult['stats'] ?? null; $dcount = 0; $fcount = 0; if($searchresult['hits']) { @@ -406,6 +408,7 @@ if($fullsearch) { $totalPages = 0; $entries = array(); $facets = array(); + $stats = array(); $searchTime = 0; } } @@ -680,6 +683,7 @@ if($fullsearch) { } else $totalPages = 1; $facets = array(); + $stats = array(); // }}} } @@ -700,6 +704,7 @@ if($settings->_showSingleSearchHit && count($entries) == 1) { $accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if($view) { $view->setParam('facets', $facets); + $view->setParam('stats', $stats); $view->setParam('accessobject', $accessop); $view->setParam('query', $query); $view->setParam('includecontent', $includecontent); diff --git a/views/bootstrap/class.Search.php b/views/bootstrap/class.Search.php index 4713a907a..4cd15fa24 100644 --- a/views/bootstrap/class.Search.php +++ b/views/bootstrap/class.Search.php @@ -393,6 +393,7 @@ $(document).ready(function() { $orderby = $this->params['orderby']; $entries = $this->params['searchhits']; $facets = $this->params['facets']; + $stats = $this->params['stats']; $totalpages = $this->params['totalpages']; $pageNumber = $this->params['pagenumber']; $searchTime = $this->params['searchtime']; @@ -1221,14 +1222,14 @@ $(document).ready(function() { case SeedDMS_Core_AttributeDefinition::type_date: if($values && (count($values) > 1 || reset($values) < $total)) { if(empty($allparams['attributes'][$facetname]['from']) && empty($allparams['attributes'][$facetname]['to'])) { - $tt = array_keys($values); + $tt = isset($stats[$facetname]) ? $stats[$facetname] : [];//array_keys($values); $content = ''; $content .= '

      '.getMLText('objects_without_attribute').'

      '; $content .= '
      '; $content .= ' from '; - $content .= $this->getDateChooser('', "attributes[".$facetname."][from]", $this->params['session']->getLanguage(), '', getReadableDate(min($tt)), getReadableDate(max($tt)), null, '', true); + $content .= $this->getDateChooser('', "attributes[".$facetname."][from]", $this->params['session']->getLanguage(), '', $tt ? getReadableDate($tt['min']) : null, $tt ? getReadableDate($tt['max']) : null, null, '', true); $content .= ' to '; - $content .= $this->getDateChooser('', "attributes[".$facetname."][to]", $this->params['session']->getLanguage(), '', getReadableDate(min($tt)), getReadableDate(max($tt)), null, '', true); + $content .= $this->getDateChooser('', "attributes[".$facetname."][to]", $this->params['session']->getLanguage(), '', $tt ? getReadableDate($tt['min']) : null, $tt ? getReadableDate($tt['max']) : null, null, '', true); $content .= ''; $content .= '
      '; $this->printAccordion($dispname, $content); From ebd11bdaf22e393fd3ddbd40f0efa7fcdc85dedd Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 18 Dec 2023 14:35:39 +0100 Subject: [PATCH 37/43] fix getting mandatory reviewers for document in upload_document --- restapi/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/restapi/index.php b/restapi/index.php index 9d744745c..b1cbbfd32 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -711,13 +711,13 @@ class RestapiController { /* {{{ */ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') { // add mandatory reviewers/approvers if($settings->_workflowMode == 'traditional') { - $mreviewers = getMandatoryReviewers($folder, $userobj); + $mreviewers = getMandatoryReviewers($mfolder, $userobj); if($mreviewers['i']) $reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']); if($mreviewers['g']) $reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']); } - $mapprovers = getMandatoryApprovers($folder, $userobj); + $mapprovers = getMandatoryApprovers($mfolder, $userobj); if($mapprovers['i']) $approvers['i'] = array_merge($approvers['i'], $mapprovers['i']); if($mapprovers['g']) From 6a558a4d26d79807f53bcb92d76bc6090fc1e355 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 18 Dec 2023 21:47:38 +0100 Subject: [PATCH 38/43] add converter from txt to pdf/png --- doc/README.Converters | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/README.Converters b/doc/README.Converters index e699388f2..6537c19c4 100644 --- a/doc/README.Converters +++ b/doc/README.Converters @@ -74,6 +74,9 @@ message/rfc822 The emailconverter can be obtained from https://github.com/nickrussler/email-to-pdf-converter It requires wkhtmltopdf which is part of debian. +text/plain + iconv -c -f utf-8 -t latin1 '%f' | a2ps -1 -q -a1 -R -B -o - - | ps2pdf - - + Conversion to png for preview images ===================================== @@ -113,10 +116,11 @@ application/postscript convert -density 100 -resize %wx '%f[0]' 'png:%o' text/plain - a2ps -1 -a1 -R -B -o - '%f' | gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dFirstPage=1 -dLastPage=1 -dPDFFitPage -r72x72 -sOutputFile=- -q - | convert -resize %wx png:- 'png:%o' + iconv -c -f utf-8 -t latin1 '%f' | a2ps -1 -q -a1 -R -B -o - - | gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dFirstPage=1 -dLastPage=1 -dPDFFitPage -r72x72 -sOutputFile=- -q - | convert -resize %wx png:- 'png:%o' On Linux systems you will have to set the desired value in /etc/papersize for a2ps - e.g. a4, or letter + e.g. a4, or letter. Unfortunately, a2ps cannot process utf-8 encoded files. That's + why the input needs to be recoded with iconv or recode. application/msword application/vnd.oasis.opendocument.spreadsheet From 9050f8b3743b47258d3d3d80855634b6896664f8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 19 Dec 2023 09:31:18 +0100 Subject: [PATCH 39/43] remove session when logging out --- restapi/index.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/restapi/index.php b/restapi/index.php index b1cbbfd32..d6854b6e5 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -258,7 +258,24 @@ class RestapiController { /* {{{ */ $userobj = $this->container->userobj; $settings = $this->container->config; - setcookie("mydms_session", '', time()-3600, $settings->_httpRoot); + if(isset($_COOKIE['mydms_session'])) { + $dms_session = $_COOKIE["mydms_session"]; + $db = $dms->getDb(); + + $session = new SeedDMS_Session($db); + $session->load($dms_session); + + // If setting the user id to 0 worked, it would be a way to logout a + // user. It doesn't work because of a foreign constraint in the database + // won't allow it. So we keep on deleting the session and the cookie on + // logout + // $session->setUser(0); does not work because of foreign user constraint + + if(!$session->delete($dms_session)) { + UI::exitError(getMLText("logout"),$db->getErrorMsg()); + } + setcookie("mydms_session", '', time()-3600, $settings->_httpRoot); + } return $response->withJson(array('success'=>true, 'message'=>'', 'data'=>''), 200); } /* }}} */ From 02b4dd26359e67f071648744d115a1abf7fe207f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 19 Dec 2023 09:31:58 +0100 Subject: [PATCH 40/43] add changes for 5.1.33 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 9477ffeaf..92aab79b6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -20,6 +20,7 @@ - show preview of documents on clipboard - minor improvements in restapi - update layout of tab for attachments +- remove session when calling logout of restapi -------------------------------------------------------------------------------- Changes in version 5.1.32 From 00c1efffac3cfbea797e7261e2fc764e84710a91 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 19 Dec 2023 09:58:55 +0100 Subject: [PATCH 41/43] add substitution of users --- views/bootstrap4/class.Bootstrap4.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index 9feef60ee..731d0c365 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -470,6 +470,12 @@ background-image: linear-gradient(to bottom, #882222, #111111);; if($this->params['user']->isAdmin()) { $showdivider = true; echo " params['settings']->_httpRoot."out/out.SubstituteUser.php\">".getMLText("substitute_user")."\n"; + } elseif($substitutes = $this->params['user']->getReverseSubstitutes()) { + if(count($substitutes) == 1) { + echo " params['settings']->_httpRoot."op/op.SubstituteUser.php?userid=".$substitutes[0]->getID()."&formtoken=".createFormKey('substituteuser')."\">".getMLText("substitute_to_user", array('username'=>$substitutes[0]->getFullName()))."\n"; + } else { + echo " params['settings']->_httpRoot."out/out.SubstituteUser.php\">".getMLText("substitute_user")."\n"; + } } } if($showdivider) From c23c5845adcf4c0458b69194a6eee1f2728f833e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 19 Dec 2023 10:00:51 +0100 Subject: [PATCH 42/43] add changes for 6.0.26 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 03e2b3c67..fbee2e85e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ -------------------------------------------------------------------------------- - merge changes up to 5.1.33 - add task to import files from drop folder +- add substitution of users in bootstrap4 theme -------------------------------------------------------------------------------- Changes in version 6.0.25 From ced00167bfa7715a5bf86365ddadf5865ca967ad Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 19 Dec 2023 12:52:14 +0100 Subject: [PATCH 43/43] turn of links --- utils/importfs.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/importfs.php b/utils/importfs.php index 2d81344db..ede4570d7 100644 --- a/utils/importfs.php +++ b/utils/importfs.php @@ -224,7 +224,7 @@ if ($folder->getAccessMode($user) < M_READWRITE) { exit(1); } -$dms->setForceLink(true); +//$dms->setForceLink(true); function import_folder($dirname, $folder, $setfiledate, $setfolderdate, $metadata) { /* {{{ */ global $user, $doccount, $foldercount;