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

This commit is contained in:
Uwe Steinmann 2023-01-17 08:39:20 +01:00
commit 531cf570cc
365 changed files with 4285 additions and 1201 deletions

View File

@ -8,7 +8,7 @@ Header set X-Content-Type-Options: "nosniff"
RewriteEngine On
#RewriteRule "^favicon\.ico$" "-" [L]
#RewriteRule "^(favicon\.ico)$" %{HTTP_HOST}/views/bootstrap/images/favicon.svg [L,NC]
RewriteRule "(favicon\.ico)" /views/bootstrap/images/favicon.svg [L,NC]
RewriteRule "^(favicon\.ico)" /views/bootstrap/images/favicon.svg [L,NC]
# Store the current location in an environment variable CWD to use
# mod_rewrite in .htaccess files without knowing the RewriteBase
@ -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|html|woff) - [F]
RewriteRule !^ext/[^/]+/res/.*\.(?:css|js|png|gif|svg|ico|html|woff) - [F]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ext/.*$ - [L]

View File

@ -7,9 +7,16 @@
- do not use md5 password hashing anymore, hashes will be updated automatically
when passwords are reset
--------------------------------------------------------------------------------
Changes in version 6.0.22
--------------------------------------------------------------------------------
- merge changes up to 5.1.28
--------------------------------------------------------------------------------
Changes in version 6.0.21
--------------------------------------------------------------------------------
- merge changes up to 5.1.27
- add new check for documents with identical sequence numbers in a folder
--------------------------------------------------------------------------------
Changes in version 6.0.20
@ -245,6 +252,19 @@
- add document list which can be exported as an archive
- search results can be exported
--------------------------------------------------------------------------------
Changes in version 5.1.29
--------------------------------------------------------------------------------
- fix php errors in restapi
- fix 'maximum size' error when uploading a file with drag&drop
- update jquery to 3.6.1 (only bootstrap4 theme)
- introduce authentication service
- new hook in restapi to add middleware
- previews for png, txt, pdf in different directories
- various improvements of fulltext service
- show number of documents per category in category manager
- show number of keywords per category in keyword manager
--------------------------------------------------------------------------------
Changes in version 5.1.28
--------------------------------------------------------------------------------
@ -252,6 +272,21 @@
with 0 bytes was created by the user
- fix repair of wrong file extension
- fix regression in password forgotten function
- fix security issue when creating hash in password forgotten operation
- add initial support for logging and notifications in rest api
- add rest api calls to get attributes of a document version and to set
attributes of folders, documents, and document versions
- fixed various errors in swagger.yaml
- use methods in inc/inc.ClassNotificationService.php for webdav
- clear login failures when login by webdav succeeds
- output log of restapi in LogManagement
- new hook to add more tabs for sections in LogManagement
- rest api returns version attributes as 'version_attributes' (was
'version-attributes'), each attribute also contains the name
- new hook in rest api to add more routes in extensions
- uploaded several documents at once by fast upload will assign random
sequence number to allow manually sorting the documents afterwards
- fix counting of login failures if both ldap and db authentication is done
--------------------------------------------------------------------------------
Changes in version 5.1.27

View File

@ -62,7 +62,9 @@ repository:
doc:
$(PHPDOC) -d SeedDMS_Core --ignore 'getusers.php,getfoldertree.php,config.php,reverselookup.php' --force -t html
# Download apigen with
# composer create-project --no-dev apigen/apigen:^7.0@alpha tools/apigen
apidoc:
apigen generate -s SeedDMS_Core --exclude tests -d html
tools/apigen/bin/apigen SeedDMS_Core/Core --exclude "tests/*" --output html
.PHONY: doc webdav webapp repository

View File

@ -120,6 +120,27 @@ class SeedDMS_Core_Attribute { /* {{{ */
*/
function getValue() { return $this->_value; }
/**
* Return attribute value parsed into a php type or object
*
* This function will return the value of multi value attributes
* including the separator char.
*
* @return string the attribute value as it is stored in the database.
*/
function getParsedValue() { /* {{{ */
switch($this->_attrdef->getType()) {
case SeedDMS_Core_AttributeDefinition::type_float:
return (float) $this->_value;
case SeedDMS_Core_AttributeDefinition::type_boolean:
return (bool) $this->_value;
case SeedDMS_Core_AttributeDefinition::type_int:
return (int) $this->_value;
default:
return $this->_value;
}
} /* }}} */
/**
* Return attribute values as an array
*
@ -247,7 +268,7 @@ class SeedDMS_Core_Attribute { /* {{{ */
break;
case $this->_dms->getClassname('folder'):
if(trim($value) === '')
$queryStr = "DELETE FROM `tblFolderAttributes WHERE` `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId();
$queryStr = "DELETE FROM `tblFolderAttributes` WHERE `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId();
else
$queryStr = "UPDATE `tblFolderAttributes` SET `value` = ".$db->qstr($value)." WHERE `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId();
break;
@ -1232,7 +1253,7 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */
* @param boolean $new set to true if the value is new value and not taken from
* an existing attribute
* (this will only be passed to the onAttributeValidate callback)
* @return boolean true if validation succeds, otherwise false
* @return boolean true if validation succeeds, otherwise false
*/
function validate($attrvalue, $object=null, $new=false) { /* {{{ */
/* Check if 'onAttributeValidate' callback is set */

View File

@ -451,6 +451,7 @@ class SeedDMS_Core_DMS {
$this->classnames['folder'] = 'SeedDMS_Core_Folder';
$this->classnames['document'] = 'SeedDMS_Core_Document';
$this->classnames['documentcontent'] = 'SeedDMS_Core_DocumentContent';
$this->classnames['documentfile'] = 'SeedDMS_Core_DocumentFile';
$this->classnames['user'] = 'SeedDMS_Core_User';
$this->classnames['role'] = 'SeedDMS_Core_Role';
$this->classnames['apikey'] = 'SeedDMS_Core_ApiKey';
@ -4131,6 +4132,41 @@ class SeedDMS_Core_DMS {
} /* }}} */
/**
* Returns folders which contain documents with none unique sequence number
*
* This method is for finding folders with documents not having a
* unique sequence number. Those documents cannot propperly be sorted
* by sequence and changing their position is impossible if more than
* two documents with the same sequence number exists, e.g.
* doc 1: 3
* doc 2: 5
* doc 3: 5
* doc 4: 5
* doc 5: 7
* If document 4 was to be moved between doc 1 and 2 it get sequence
* number 4 ((5+3)/2).
* But if document 4 was to be moved between doc 2 and 3 it will again
* have sequence number 5.
*
* @return array|bool
*/
function getDuplicateSequenceNo() { /* {{{ */
$queryStr = "SELECT DISTINCT `folder` FROM (SELECT `folder`, `sequence`, count(*) c FROM `tblDocuments` GROUP BY `folder`, `sequence` HAVING c > 1) a";
$resArr = $this->db->getResultArray($queryStr);
if ($resArr === false)
return false;
$folders = array();
foreach($resArr as $row) {
$folder = $this->getFolder($row['folder']);
if($folder)
$folders[] = $folder;
}
return $folders;
} /* }}} */
/**
* Returns a list of reviews, approvals, receipts, revisions which are not
* linked to a user, group anymore

View File

@ -124,7 +124,7 @@ define("S_LOG_SLEEPING", -3);
/**
* Class to represent a document in the document management system
*
* A document in SeedDMS is similar to files in a regular file system.
* A document in SeedDMS is similar to a file in a regular file system.
* Documents may have any number of content elements
* ({@link SeedDMS_Core_DocumentContent}). These content elements are often
* called versions ordered in a timely manner. The most recent content element
@ -139,7 +139,7 @@ define("S_LOG_SLEEPING", -3);
* @author Markus Westphal, Malcolm Cowe, Matteo Lucarelli,
* Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe,
* 2010 Matteo Lucarelli, 2010 Uwe Steinmann
* 2010 Matteo Lucarelli, 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
@ -1202,7 +1202,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
$db->rollbackTransaction();
return false;
}
if(!SeedDMS_Core_File::removeFile($info['filename'])) {
if(file_exists($info['filename']) && !SeedDMS_Core_File::removeFile($info['filename'])) {
$db->rollbackTransaction();
return false;
}
@ -2325,7 +2325,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
}
foreach($resArr as $res) {
$file = $this->_dms->contentDir . $this->getDir().'r'.$res['reviewLogID'];
if(file_exists($file))
if(SeedDMS_Core_File::file_exists($file))
SeedDMS_Core_File::removeFile($file);
}
}
@ -2354,7 +2354,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
}
foreach($resArr as $res) {
$file = $this->_dms->contentDir . $this->getDir().'a'.$res['approveLogID'];
if(file_exists($file))
if(SeedDMS_Core_File::file_exists($file))
SeedDMS_Core_File::removeFile($file);
}
}
@ -2458,7 +2458,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
return false;
}
if (file_exists( $this->_dms->contentDir.$version->getPath() ))
if (SeedDMS_Core_File::file_exists( $this->_dms->contentDir.$version->getPath() ))
if (!SeedDMS_Core_File::removeFile( $this->_dms->contentDir.$version->getPath() )) {
$db->rollbackTransaction();
return false;
@ -2714,7 +2714,8 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
if ((is_bool($resArr) && !$resArr) || count($resArr)==0) return false;
$resArr = $resArr[0];
$file = new SeedDMS_Core_DocumentFile($resArr["id"], $this, $resArr["userID"], $resArr["comment"], $resArr["date"], $resArr["dir"], $resArr["fileType"], $resArr["mimeType"], $resArr["orgFileName"], $resArr["name"],$resArr["version"],$resArr["public"]);
$classname = $this->_dms->getClassname('documentfile');
$file = new $classname($resArr["id"], $this, $resArr["userID"], $resArr["comment"], $resArr["date"], $resArr["dir"], $resArr["fileType"], $resArr["mimeType"], $resArr["orgFileName"], $resArr["name"],$resArr["version"],$resArr["public"]);
$user = $this->_dms->getLoggedInUser();
if($file->getAccessMode($user) >= M_READ)
return $file;
@ -2755,8 +2756,9 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
$this->_documentFiles = array($hash=>array());
$user = $this->_dms->getLoggedInUser();
$classname = $this->_dms->getClassname('documentfile');
foreach ($resArr as $row) {
$file = new SeedDMS_Core_DocumentFile($row["id"], $this, $row["userID"], $row["comment"], $row["date"], $row["dir"], $row["fileType"], $row["mimeType"], $row["orgFileName"], $row["name"], $row["version"], $row["public"]);
$file = new $classname($row["id"], $this, $row["userID"], $row["comment"], $row["date"], $row["dir"], $row["fileType"], $row["mimeType"], $row["orgFileName"], $row["name"], $row["version"], $row["public"]);
if($file->getAccessMode($user) >= M_READ)
array_push($this->_documentFiles[$hash], $file);
}
@ -2820,7 +2822,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
return false;
}
if (file_exists( $this->_dms->contentDir . $file->getPath() )){
if (SeedDMS_Core_File::file_exists( $this->_dms->contentDir . $file->getPath() )){
if (!SeedDMS_Core_File::removeFile( $this->_dms->contentDir . $file->getPath() )) {
$db->rollbackTransaction();
return false;
@ -2887,7 +2889,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
// TODO: versioning file?
if (file_exists( $this->_dms->contentDir . $this->getDir() ))
if (SeedDMS_Core_File::file_exists( $this->_dms->contentDir . $this->getDir() ))
if (!SeedDMS_Core_File::removeDir( $this->_dms->contentDir . $this->getDir() )) {
$db->rollbackTransaction();
return false;
@ -3293,7 +3295,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
* Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann
* 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
@ -3729,6 +3731,9 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
function setMimeType($newMimetype) { /* {{{ */
$db = $this->_document->getDMS()->getDB();
if(!$newMimetype)
return false;
$newMimetype = trim($newMimetype);
if(!$newMimetype)
@ -4177,7 +4182,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
}
foreach($res as &$t) {
$filename = $this->_dms->contentDir . $this->_document->getDir().'r'.$t['reviewLogID'];
if(file_exists($filename))
if(SeedDMS_Core_File::file_exists($filename))
$t['file'] = $filename;
else
$t['file'] = '';
@ -4357,7 +4362,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
}
foreach($res as &$t) {
$filename = $this->_dms->contentDir . $this->_document->getDir().'a'.$t['approveLogID'];
if(file_exists($filename))
if(SeedDMS_Core_File::file_exists($filename))
$t['file'] = $filename;
else
$t['file'] = '';
@ -7043,7 +7048,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
$dms = $this->_document->getDMS();
$db = $this->_dms->getDB();
if(file_exists($this->_dms->contentDir.$this->_document->getDir() . $this->_version . $this->_fileType)) {
if(SeedDMS_Core_File::file_exists($this->_dms->contentDir.$this->_document->getDir() . $this->_version . $this->_fileType)) {
if(strlen($this->_fileType) < 2) {
switch($this->_mimeType) {
case "application/pdf":
@ -7068,7 +7073,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
break;
}
}
} elseif(file_exists($this->_document->getDir() . $this->_version . '.')) {
} elseif(SeedDMS_Core_File::file_exists($this->_document->getDir() . $this->_version . '.')) {
echo "no file";
} else {
echo $this->_dms->contentDir.$this->_document->getDir() . $this->_version . $this->_fileType;
@ -7094,7 +7099,7 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */
* Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann
* 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Core_DocumentLink { /* {{{ */
@ -7226,7 +7231,7 @@ class SeedDMS_Core_DocumentLink { /* {{{ */
* Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann
* 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Core_DocumentFile { /* {{{ */
@ -7542,7 +7547,7 @@ class SeedDMS_Core_DocumentFile { /* {{{ */
* Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann
* 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Core_AddContentResultSet { /* {{{ */

View File

@ -778,21 +778,25 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
/**
* Returns a file system path
*
* This path contains spaces around the slashes for better readability.
* Run str_replace(' / ', '/', $path) on it to get a valid unix
* This path contains by default spaces around the slashes for better readability.
* Run str_replace(' / ', '/', $path) on it or pass '/' as $sep to get a valid unix
* file system path.
*
* @param bool $skiproot skip the name of the root folder and start with $sep
* @param string $sep separator between path elements
* @return string path separated with ' / '
*/
function getFolderPathPlain() { /* {{{ */
$path="";
function getFolderPathPlain($skiproot = false, $sep = ' / ') { /* {{{ */
$path="".$sep;
$folderPath = $this->getPath();
for ($i = 0; $i < count($folderPath); $i++) {
$path .= $folderPath[$i]->getName();
if ($i +1 < count($folderPath))
$path .= " / ";
for ($i = 0; $i < count($folderPath); $i++) {
if($i > 0 || !$skiproot) {
$path .= $folderPath[$i]->getName();
if ($i+1 < count($folderPath))
$path .= $sep;
}
}
return $path;
return trim($path);
} /* }}} */
/**
@ -1062,7 +1066,11 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
}
if($categories) {
$document->setCategories($categories);
if(!$document->setCategories($categories)) {
$document->remove();
$db->rollbackTransaction();
return false;
}
}
if($attributes) {
@ -2195,6 +2203,40 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
return $resArr[0];
} /* }}} */
/**
* Reorder documents of folder
*
* Fix the sequence numbers of all documents in the folder, by assigning new
* numbers starting from 1 incrementing by 1. This can be necessary if sequence
* numbers are not unique which makes manual reordering for documents with
* identical sequence numbers impossible.
*
* @return bool false in case of an error, otherwise true
*/
function reorderDocuments() { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "SELECT `id` FROM `tblDocuments` WHERE `folder` = " . (int) $this->_id . " ORDER BY `sequence`";
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr == false)
return false;
$db->startTransaction();
$no = 1.0;
foreach($resArr as $doc) {
$queryStr = "UPDATE `tblDocuments` SET `sequence` = " . $no . " WHERE `id` = ". $doc['id'];
if (!$db->getResult($queryStr)) {
$db->rollbackTransaction();
return false;
}
$no += 1.0;
}
$db->commitTransaction();
return true;
} /* }}} */
}
?>

View File

@ -1,5 +1,5 @@
<?php
namespace SeedDMS;
namespace SeedDMS\Core;
/**
* Implementation of the document iterartor

View File

@ -8,7 +8,7 @@
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe,
* 2010 Uwe Steinmann
* 2010-2023 Uwe Steinmann
* @version Release: @package_version@
*/
@ -19,7 +19,7 @@
* @package SeedDMS_Core
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe,
* 2010 Uwe Steinmann
* 2010-2023 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Core_KeywordCategory {
@ -47,53 +47,53 @@ class SeedDMS_Core_KeywordCategory {
*/
protected $_dms;
/**
* SeedDMS_Core_KeywordCategory constructor.
* @param $id
* @param $ownerID
* @param $name
*/
function __construct($id, $ownerID, $name) {
/**
* SeedDMS_Core_KeywordCategory constructor.
* @param $id
* @param $ownerID
* @param $name
*/
function __construct($id, $ownerID, $name) { /* {{{ */
$this->_id = $id;
$this->_name = $name;
$this->_ownerID = $ownerID;
$this->_dms = null;
}
} /* }}} */
/**
* @param SeedDMS_Core_DMS $dms
*/
function setDMS($dms) {
/**
* @param SeedDMS_Core_DMS $dms
*/
function setDMS($dms) { /* {{{ */
$this->_dms = $dms;
}
} /* }}} */
/**
* @return int
*/
/**
* @return int
*/
function getID() { return $this->_id; }
/**
* @return string
*/
/**
* @return string
*/
function getName() { return $this->_name; }
/**
* @return bool|SeedDMS_Core_User
*/
function getOwner() {
/**
* @return bool|SeedDMS_Core_User
*/
function getOwner() { /* {{{ */
if (!isset($this->_owner))
$this->_owner = $this->_dms->getUser($this->_ownerID);
return $this->_owner;
}
} /* }}} */
/**
* @param $newName
* @return bool
*/
function setName($newName) {
$newName = trim($newName);
if(!$newName)
return false;
/**
* @param $newName
* @return bool
*/
function setName($newName) { /* {{{ */
$newName = trim($newName);
if(!$newName)
return false;
$db = $this->_dms->getDB();
@ -103,75 +103,89 @@ class SeedDMS_Core_KeywordCategory {
$this->_name = $newName;
return true;
}
} /* }}} */
/**
* @param SeedDMS_Core_User $user
* @return bool
*/
function setOwner($user) {
if(!$user || !$user->isType('user'))
return false;
/**
* @param SeedDMS_Core_User $user
* @return bool
*/
function setOwner($user) { /* {{{ */
if(!$user || !$user->isType('user'))
return false;
$db = $this->_dms->getDB();
$queryStr = "UPDATE `tblKeywordCategories` SET `owner` = " . $user->getID() . " WHERE `id` = " . $this->_id;
$queryStr = "UPDATE `tblKeywordCategories` SET `owner` = " . $user->getID() . " WHERE `id` = " . $this->_id;
if (!$db->getResult($queryStr))
return false;
$this->_ownerID = $user->getID();
$this->_owner = $user;
return true;
}
} /* }}} */
/**
* @return array
*/
function getKeywordLists() {
/**
* @return array keywords in this list
*/
function getKeywordLists() { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "SELECT * FROM `tblKeywords` WHERE `category` = " . $this->_id . " order by `keywords`";
return $db->getResultArray($queryStr);
}
/**
* @param $listID
* @param $keywords
* @return bool
*/
function editKeywordList($listID, $keywords) {
/**
* @return integer number of keywords in this list
*/
function countKeywordLists() { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "SELECT COUNT(*) as `c` FROM `tblKeywords` where `category`=".$this->_id;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && !$resArr)
return false;
return $resArr[0]['c'];
} /* }}} */
/**
* @param $listID
* @param $keywords
* @return bool
*/
function editKeywordList($listID, $keywords) { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "UPDATE `tblKeywords` SET `keywords` = ".$db->qstr($keywords)." WHERE `id` = $listID";
return $db->getResult($queryStr);
}
} /* }}} */
/**
* @param $keywords
* @return bool
*/
function addKeywordList($keywords) {
/**
* @param $keywords
* @return bool
*/
function addKeywordList($keywords) { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "INSERT INTO `tblKeywords` (`category`, `keywords`) VALUES (" . $this->_id . ", ".$db->qstr($keywords).")";
return $db->getResult($queryStr);
}
} /* }}} */
/**
* @param $listID
* @return bool
*/
function removeKeywordList($listID) {
/**
* @param $listID
* @return bool
*/
function removeKeywordList($listID) { /* {{{ */
$db = $this->_dms->getDB();
$queryStr = "DELETE FROM `tblKeywords` WHERE `id` = $listID";
return $db->getResult($queryStr);
}
} /* }}} */
/**
* @return bool
*/
function remove() {
/**
* @return bool
*/
function remove() { /* {{{ */
$db = $this->_dms->getDB();
$db->startTransaction();
@ -189,5 +203,5 @@ class SeedDMS_Core_KeywordCategory {
$db->commitTransaction();
return true;
}
} /* }}} */
}

View File

@ -38,10 +38,10 @@ class SeedDMS_Core_Object { /* {{{ */
*/
public $_dms;
/**
* SeedDMS_Core_Object constructor.
* @param $id
*/
/**
* SeedDMS_Core_Object constructor.
* @param $id
*/
function __construct($id) { /* {{{ */
$this->_id = $id;
$this->_dms = null;
@ -155,7 +155,7 @@ class SeedDMS_Core_Object { /* {{{ */
}
if (isset($this->_attributes[$attrdef->getId()])) {
$value = $this->_attributes[$attrdef->getId()]->getValue();
$value = $this->_attributes[$attrdef->getId()]->getValue();
if($attrdef->getMultipleValues()) {
$sep = substr($value, 0, 1);
$vsep = $attrdef->getValueSetSeparator();
@ -169,7 +169,7 @@ class SeedDMS_Core_Object { /* {{{ */
else
return(array($value));
} else {
return $value;
return $this->_attributes[$attrdef->getId()]->getParsedValue();
}
} else
return false;

View File

@ -313,6 +313,7 @@ class SeedDMS_Core_DatabaseAccess {
switch($this->_driver) {
case 'mysql':
$this->_conn->exec('SET NAMES utf8');
// $this->_conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);
/* Turn this on if you want strict checking of default values, etc. */
/* $this->_conn->exec("SET SESSION sql_mode = 'STRICT_TRANS_TABLES'"); */
/* The following is the default on Ubuntu 16.04 */
@ -459,9 +460,15 @@ class SeedDMS_Core_DatabaseAccess {
$this->_conn->beginTransaction();
}
$this->_intransaction++;
if($this->_logfp) {
fwrite($this->_logfp, microtime()." START ".$htis->_intransaction."\n");
}
} /* }}} */
function rollbackTransaction() { /* {{{ */
if($this->_logfp) {
fwrite($this->_logfp, microtime()." ROLLBACK ".$htis->_intransaction."\n");
}
if($this->_intransaction == 1) {
$this->_conn->rollBack();
}
@ -469,6 +476,9 @@ class SeedDMS_Core_DatabaseAccess {
} /* }}} */
function commitTransaction() { /* {{{ */
if($this->_logfp) {
fwrite($this->_logfp, microtime()." COMMIT ".$htis->_intransaction."\n");
}
if($this->_intransaction == 1) {
$this->_conn->commit();
}

View File

@ -9,19 +9,21 @@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann
* 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class to represent a user in the document management system
* Class to file operation in the document management system
* Use the methods of this class only for files below the content
* directory but not for temporäry files, cache files or log files.
*
* @category DMS
* @package SeedDMS_Core
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli,
* 2010 Uwe Steinmann
* 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Core_File {
@ -78,8 +80,37 @@ class SeedDMS_Core_File {
} /* }}} */
/**
* @param $size
* @param array $sizes
* Return the mimetype of a given file
*
* This method uses finfo to determine the mimetype
* but will correct some mimetypes which are
* not propperly determined or could be more specific, e.g. text/plain
* when it is actually text/markdown. In thoses cases
* the file extension will be taken into account.
*
* @param string $filename name of file on disc
* @return string mimetype
*/
static function mimetype($filename) { /* {{{ */
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename);
switch($mimetype) {
case 'application/octet-stream':
case 'text/plain':
$lastDotIndex = strrpos($filename, ".");
if($lastDotIndex === false) $fileType = ".";
else $fileType = substr($filename, $lastDotIndex);
if($fileType == '.md')
$mimetype = 'text/markdown';
break;
}
return $mimetype;
} /* }}} */
/**
* @param integer $size
* @param array $sizes list of units for 10^0, 10^3, 10^6, ..., 10^(n*3) bytes
* @return string
*/
static function format_filesize($size, $sizes = array('Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB')) { /* {{{ */
@ -90,18 +121,22 @@ class SeedDMS_Core_File {
} /* }}} */
/**
* Parses a string like '[0-9]+ *[BKMGT]*' into an integer
* B,K,M,G,T stand for byte, kilo byte, mega byte, giga byte, tera byte
* If the last character is omitted, bytes are assumed.
*
* @param $str
* @return bool|int
*/
static function parse_filesize($str) { /* {{{ */
preg_replace('/\s\s+/', '', $str);
if(in_array(strtoupper(substr($str, -1)), array('B','K','M','G'))) {
$value = (int) substr($str, 0, -1);
$unit = substr($str, -1, 1);
} else {
return (int) $str;
}
switch(strtoupper($unit)) {
if(!preg_match('/^([0-9]+) *([BKMGT]*)$/', trim($str), $matches))
return false;
$value = $matches[1];
$unit = $matches[2] ? $matches[2] : 'B';
switch($unit) {
case 'T':
return $value * 1024 * 1024 * 1024 *1024;
break;
case 'G':
return $value * 1024 * 1024 * 1024;
break;
@ -112,13 +147,21 @@ class SeedDMS_Core_File {
return $value * 1024;
break;
default;
return $value;
return (int) $value;
break;
}
/** @noinspection PhpUnreachableStatementInspection */
return false;
} /* }}} */
/**
* @param $file
* @return string
*/
static function file_exists($file) { /* {{{ */
return file_exists($file);
} /* }}} */
/**
* @param $file
* @return string
@ -129,7 +172,7 @@ class SeedDMS_Core_File {
/**
* @param $string mimetype
* @return string
* @return string file extension with the dot or an empty string
*/
static function fileExtension($mimetype) { /* {{{ */
switch($mimetype) {
@ -224,6 +267,7 @@ class SeedDMS_Core_File {
'text/x-log' => 'log',
'audio/x-m4a' => 'm4a',
'application/vnd.mpegurl' => 'm4u',
'text/markdown' => 'md',
'audio/midi' => 'mid',
'application/vnd.mif' => 'mif',
'video/quicktime' => 'mov',
@ -405,7 +449,7 @@ class SeedDMS_Core_File {
continue;
else if (is_dir($path . DIRECTORY_SEPARATOR . $entry))
{
if (!self::removeDir($path . DIRECTORY_SEPARATOR . $entry . "/"))
if (!self::removeDir($path . DIRECTORY_SEPARATOR . $entry ))
return false;
}
else
@ -452,10 +496,10 @@ class SeedDMS_Core_File {
*/
static function moveDir($sourcePath, $targetPath) { /* {{{ */
/** @noinspection PhpUndefinedFunctionInspection */
if (!copyDir($sourcePath, $targetPath))
if (!self::copyDir($sourcePath, $targetPath))
return false;
/** @noinspection PhpUndefinedFunctionInspection */
return removeDir($sourcePath);
return self::removeDir($sourcePath);
} /* }}} */
// code by Kioob (php.net manual)

View File

@ -12,7 +12,7 @@
<email>uwe@steinmann.cx</email>
<active>yes</active>
</lead>
<date>2022-10-10</date>
<date>2022-12-10</date>
<time>13:44:55</time>
<version>
<release>6.1.0</release>
@ -2012,6 +2012,49 @@ add method SeedDMS_Core_DatabaseAccess::setLogFp()
- pass an array as an attribute to search() will OR each element
</notes>
</release>
<release>
<date>2022-11-07</date>
<time>13:44:55</time>
<version>
<release>5.1.28</release>
<api>5.1.28</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- fix SeedDMS_Core_User::getDocumentContents()
- fix SeedDMS_Core_File::fileExtension()
- SeedDMS_Core_DMS::createPasswordRequest() creates a cryptographically secure hash
- fix sql error when deleting a folder attribute
- add SeedDMS_Core_Attribute::getParsedValue() and use it in SeedDMS_Core_Object::getAttributeValue()
- add SeedDMS_Core_DMS::getDuplicateSequenceNo() and SeedDMS_Core_Folder::reorderDocuments()
- add SeedDMS_Core_File::mimetype(), fix SeedDMS_Core_File::moveDir()
- all file operations use methods of SeedDMS_Core_File
- change namespace of iterators from SeedDMS to SeedDMS\Core
</notes>
</release>
<release>
<date>2022-11-21</date>
<time>13:44:55</time>
<version>
<release>5.1.29</release>
<api>5.1.29</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- SeedDMS_Core_Folder::addDocument() does rollback transaction propperly when setting document categories fail
- add $skiproot and $sep parameter to SeedDMS_Core_Folder::getFolderPathPlain()
- add class name for 'documentfile'
- add method SeedDMS_Core_KeywordCategory::countKeywordLists()
</notes>
</release>
<release>
<date>2017-02-28</date>
<time>06:34:50</time>
@ -2429,7 +2472,7 @@ better error checking in SeedDMS_Core_Document::cancelCheckOut()
</notes>
</release>
<release>
<date>2022-09-18</date>
<date>2022-11-18</date>
<time>13:44:55</time>
<version>
<release>6.0.21</release>
@ -2446,5 +2489,21 @@ better error checking in SeedDMS_Core_Document::cancelCheckOut()
- SeedDMS_Core_DMS::createPasswordRequest() creates a cryptographically secure hash
</notes>
</release>
<release>
<date>2023-l1-16</date>
<time>13:44:55</time>
<version>
<release>6.0.22</release>
<api>6.0.22</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- all changes from 5.1.29 merged
</notes>
</release>
</changelog>
</package>

View File

@ -145,12 +145,14 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document {
if($document->isType('document')) {
$this->addField(Zend_Search_Lucene_Field::Keyword('document_id', 'D'.$document->getID()));
$this->addField(Zend_Search_Lucene_Field::Keyword('record_type', 'document'));
$version = $document->getLatestContent();
if($version) {
$this->addField(Zend_Search_Lucene_Field::Keyword('mimetype', $version->getMimeType()));
$this->addField(Zend_Search_Lucene_Field::Keyword('origfilename', $version->getOriginalFileName(), 'utf-8'));
$this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $version->getDate()));
if(!$nocontent)
$this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $version->getDate()));
$this->addField(Zend_Search_Lucene_Field::UnIndexed('indexed', time()));
if($attributes = $version->getAttributes()) {
foreach($attributes as $attribute) {
$attrdef = $attribute->getAttributeDefinition();
@ -181,7 +183,15 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document {
if(file_exists($path)) {
$mimetype = $version->getMimeType();
$this->mimetype = $mimetype;
if(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) {
if(is_callable($convcmd)) {
$result = $convcmd($document);
if($result['content']) {
self::setContent($result['content']);
} elseif($result['content'] === false) {
$this->errormsg = $result['errormsg'];
}
$this->cmd = $result['cmd'];
} elseif(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) {
if($service = $convcmd->getService($mimetype, 'text/plain')) {
$content = $convcmd->convert($path, $mimetype, 'text/plain');
if($content) {
@ -223,7 +233,9 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document {
}
} elseif($document->isType('folder')) {
$this->addField(Zend_Search_Lucene_Field::Keyword('document_id', 'F'.$document->getID()));
$this->addField(Zend_Search_Lucene_Field::Keyword('record_type', 'folder'));
$this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $document->getDate()));
$this->addField(Zend_Search_Lucene_Field::UnIndexed('indexed', time()));
}
} /* }}} */

View File

@ -29,10 +29,23 @@ class SeedDMS_Lucene_Indexer {
*/
protected $indexname;
/**
* @var string $index lucene index
* @access protected
*/
protected $index;
public function __construct($index) {
$this->index = $index;
}
static function open($conf) { /* {{{ */
try {
$index = Zend_Search_Lucene::open($conf['indexdir']);
return($index);
if($index)
return new self($index);
else
return null;
} catch (Exception $e) {
return null;
}
@ -41,7 +54,10 @@ class SeedDMS_Lucene_Indexer {
static function create($conf) { /* {{{ */
try {
$index = Zend_Search_Lucene::create($conf['indexdir']);
return($index);
if($index)
return new self($index);
else
return null;
} catch (Exception $e) {
return null;
}
@ -51,7 +67,7 @@ class SeedDMS_Lucene_Indexer {
* Do some initialization
*
*/
static function init($stopWordsFile='') { /* {{{ */
public function init($stopWordsFile='') { /* {{{ */
$analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive();
if($stopWordsFile && file_exists($stopWordsFile)) {
$stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords();
@ -62,6 +78,131 @@ class SeedDMS_Lucene_Indexer {
Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);
} /* }}} */
/**
* Add document to index
*
* @param object $doc indexed document of class
* SeedDMS_Lucene_IndexedDocument
* @return boolean false in case of an error, otherwise true
*/
function addDocument($doc) { /* {{{ */
if(!$this->index)
return false;
return $this->index->addDocument($doc);
} /* }}} */
/**
* Remove document from index
*
* @param object $id internal id of document
* @return boolean false in case of an error, otherwise true
*/
public function delete($id) { /* {{{ */
if(!$this->index)
return false;
return $this->index->delete($id);
} /* }}} */
/**
* Check if document was deleted
*
* @param object $id internal id of document
* @return boolean true if document was deleted
*/
public function isDeleted($id) { /* {{{ */
if(!$this->index)
return false;
return $this->index->isDeleted($id);
} /* }}} */
/**
* Search in index
*
* @param string $query
* @return array result
*/
public function find($query) { /* {{{ */
if(!$this->index)
return false;
return $this->index->find($query);
} /* }}} */
/**
* Get a single document from index
*
* @param string $id id of document
* @return boolean false in case of an error, otherwise true
*/
public function findById($id) { /* {{{ */
if(!$this->index)
return false;
return $this->index->findById($id);
} /* }}} */
/**
* Get a single document from index
*
* @param integer $id id of index record
* @return boolean false in case of an error, otherwise true
*/
public function getDocument($id, $content=true) { /* {{{ */
if(!$this->index)
return false;
return $this->index->getDocument($id);
} /* }}} */
/**
* Return list of terms in index
*
* @return array list of Zend_Lucene_Term
*/
public function terms($prefix='', $col='') { /* {{{ */
if(!$this->index)
return false;
return $this->index->terms();
} /* }}} */
/**
* Return number of documents in index
*
* @return interger number of documents
*/
public function count() { /* {{{ */
if(!$this->index)
return false;
return $this->index->count();
} /* }}} */
/**
* Commit changes
*
* This function does nothing!
*/
function commit() { /* {{{ */
if(!$this->index)
return false;
return $this->index->commit();
} /* }}} */
/**
* Optimize index
*
* This function does nothing!
*/
function optimize() { /* {{{ */
if(!$this->index)
return false;
return $this->index->optimize();
} /* }}} */
}
?>

View File

@ -77,10 +77,10 @@ class SeedDMS_Lucene_Search {
$querystr = substr($term, -1) != '*' ? $term.'*' : $term;
}
if(!empty($fields['owner'])) {
if(is_string($owner)) {
if(is_string($fields['owner'])) {
if($querystr)
$querystr .= ' && ';
$querystr .= 'owner:'.$owner;
$querystr .= 'owner:'.$fields['owner'];
} elseif(is_array($fields['owner'])) {
if($querystr)
$querystr .= ' && ';
@ -89,6 +89,13 @@ class SeedDMS_Lucene_Search {
$querystr .= '")';
}
}
if(!empty($fields['record_type'])) {
if($querystr)
$querystr .= ' && ';
$querystr .= '(record_type:';
$querystr .= implode(' || record_type:', $fields['record_type']);
$querystr .= ')';
}
if(!empty($fields['category'])) {
if($querystr)
$querystr .= ' && ';
@ -137,7 +144,7 @@ class SeedDMS_Lucene_Search {
$recs = array();
$c = 0;
foreach($hits as $hit) {
if($c >= $limit['offset'] && ($c-$limit['offset'] < $limit))
if($c >= $limit['offset'] && ($c-$limit['offset'] < $limit['limit']))
$recs[] = array('id'=>$hit->id, 'document_id'=>$hit->document_id);
$c++;
}

View File

@ -11,11 +11,11 @@
<email>uwe@steinmann.cx</email>
<active>yes</active>
</lead>
<date>2021-05-10</date>
<date>2023-01-09</date>
<time>08:55:43</time>
<version>
<release>1.1.17</release>
<api>1.1.17</api>
<release>1.1.18</release>
<api>1.1.18</api>
</version>
<stability>
<release>stable</release>
@ -23,7 +23,8 @@
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- close pipes in execWithTimeout(), also return exit code of command
- IndexedDocument() accepts a callable for conversion to text
- SeedDMS_Lucene_Search::open and create return itself but Zend_Search_Lucene
</notes>
<contents>
<dir baseinstalldir="SeedDMS" name="/">
@ -368,5 +369,21 @@ Index users with at least read access on the document
- add indexing of folders
</notes>
</release>
<release>
<date>2021-05-10</date>
<time>08:55:43</time>
<version>
<release>1.1.17</release>
<api>1.1.17</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- close pipes in execWithTimeout(), also return exit code of command
</notes>
</release>
</changelog>
</package>

View File

@ -31,4 +31,9 @@ require_once('Preview/Previewer.php');
*/
require_once('Preview/PdfPreviewer.php');
/**
* @uses Preview/PdfPreviewer.php
*/
require_once('Preview/TxtPreviewer.php');
?>

View File

@ -136,6 +136,15 @@ class SeedDMS_Preview_Base {
}
} /* }}} */
/**
* Get preview dir
*
* @return string name of preview directory on disc
*/
public function getPreviewDir() { /* {{{ */
return $this->previewDir;
} /* }}} */
/**
* Set a list of converters
*

View File

@ -25,41 +25,30 @@
class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
function __construct($previewDir, $timeout=5, $xsendfile=true) { /* {{{ */
parent::__construct($previewDir, $timeout, $xsendfile);
parent::__construct($previewDir.DIRECTORY_SEPARATOR.'pdf', $timeout, $xsendfile);
$this->converters = array(
'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/vnd.oasis.opendocument.text' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'text/rtf' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/msword' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/vnd.ms-excel' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'text/plain' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'",
'application/postscript' => "ps2pdf '%f' - > '%o'",
'image/jpeg' => "convert '%f' pdf:- > '%o'",
'image/png' => "convert '%f' pdf:- > '%o'",
'image/gif' => "convert '%f' pdf:- > '%o'",
'video/mp4' => "convert '%f[1-20]' pdf:- > '%o'",
);
} /* }}} */
/**
* Return the physical filename of the preview image on disk
* Return the physical filename of the preview image on disc
* including the path
*
* @param object $object document content or document file
* @return string file name of preview image
*/
protected function getFileName($object) { /* {{{ */
public function getFileName($object) { /* {{{ */
if(!$object)
return false;
$document = $object->getDocument();
$dms = $document->_dms;
$dir = $this->previewDir.'/'.$document->getDir();
$dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
switch(get_class($object)) {
case $dms->getClassname('documentcontent'):
$target = $dir.'p'.$object->getVersion();
break;
case "SeedDMS_Core_DocumentFile":
case $dms->getClassname('documentfile'):
$target = $dir.'f'.$object->getID();
break;
default:
@ -101,8 +90,8 @@ class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
if(!$this->previewDir)
return false;
if(!is_dir($this->previewDir.'/'.$dir)) {
if (!SeedDMS_Core_File::makeDir($this->previewDir.'/'.$dir)) {
if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
return false;
}
}
@ -128,9 +117,11 @@ class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
} elseif(isset($this->converters['*'])) {
$cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.pdf', $mimetype), $this->converters['*']);
}
if($cmd) {
try {
self::execWithTimeout($cmd, $this->timeout);
$new = true;
} catch(Exception $e) {
$this->lastpreviewfile = '';
return false;
@ -139,6 +130,7 @@ class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
}
return true;
}
$new = false;
return true;
} /* }}} */
@ -305,7 +297,7 @@ class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base {
if(!$this->previewDir)
return false;
$dir = $this->previewDir.'/'.$document->getDir();
$dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
if(file_exists($dir) && is_dir($dir)) {
return SeedDMS_Preview_Previewer::recurseRmdir($dir);
} else {

View File

@ -29,41 +29,48 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
*/
protected $width;
/**
* Create instance of image previewer
*
* @param string $previewDir path of base directory where all images are
* stored. This directory will have a subdirectory derived from the object id.
* @param integer $width default width of an image
* @param integer $timeout timeout for shell commands to create a preview image
* @param boolean $xsendfile if set to true the apache module xsendfile will
* be used.
*/
function __construct($previewDir, $width=40, $timeout=5, $xsendfile=true) { /* {{{ */
parent::__construct($previewDir, $timeout, $xsendfile);
parent::__construct($previewDir.DIRECTORY_SEPARATOR.'png', $timeout, $xsendfile);
$this->converters = array(
'image/png' => "convert -resize %wx '%f' '%o'",
'image/gif' => "convert -resize %wx '%f' '%o'",
'image/jpg' => "convert -resize %wx '%f' '%o'",
'image/jpeg' => "convert -resize %wx '%f' '%o'",
'image/svg+xml' => "convert -resize %wx '%f' '%o'",
'text/plain' => "convert -resize %wx '%f' '%o'",
'application/pdf' => "convert -density 100 -resize %wx '%f[0]' '%o'",
'application/postscript' => "convert -density 100 -resize %wx '%f[0]' '%o'",
'application/x-compressed-tar' => "tar tzvf '%f' | convert -density 100 -resize %wx text:-[0] '%o'",
);
$this->width = intval($width);
} /* }}} */
/**
* Return the physical filename of the preview image on disk
* Return the physical filename of the preview image on disc
* including the path
*
* @param object $object document content or document file
* @param integer $width width of preview image
* @return string file name of preview image
*/
public function getFileName($object, $width) { /* {{{ */
public function getFileName($object, $width=0) { /* {{{ */
if(!$object)
return false;
if($width == 0)
$width = $this->width;
else
$width = intval($width);
$document = $object->getDocument();
$dms = $document->_dms;
$dir = $this->previewDir.'/'.$document->getDir();
$dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
switch(get_class($object)) {
case $dms->getClassname('documentcontent'):
$target = $dir.'p'.$object->getVersion().'-'.$width;
break;
case "SeedDMS_Core_DocumentFile":
case $dms->getClassname('documentfile'):
$target = $dir.'f'.$object->getID().'-'.$width;
break;
default:
@ -98,6 +105,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
* @param string $mimetype MimeType of input file
* @param integer $width width of generated preview image
* @param string $target optional name of preview image (without extension)
* @param boolean $new will be set to true if the preview images was created
* @return boolean true on success, false on failure
*/
public function createRawPreview($infile, $dir, $mimetype, $width=0, $target='', &$new=false) { /* {{{ */
@ -110,8 +118,8 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
$width = intval($width);
if(!$this->previewDir)
return false;
if(!is_dir($this->previewDir.'/'.$dir)) {
if (!SeedDMS_Core_File::makeDir($this->previewDir.'/'.$dir)) {
if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
return false;
}
}
@ -166,6 +174,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @param integer $width desired width of preview image
* @param boolean $new will be set to true if the preview images was created
* @return boolean true on success, false on failure
*/
public function createPreview($object, $width=0, &$new=false) { /* {{{ */
@ -350,7 +359,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base {
if(!$this->previewDir)
return false;
$dir = $this->previewDir.'/'.$document->getDir();
$dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
if(file_exists($dir) && is_dir($dir)) {
return SeedDMS_Preview_Previewer::recurseRmdir($dir);
} else {

View File

@ -0,0 +1,306 @@
<?php
/**
* Implementation of text preview documents
*
* @category DMS
* @package SeedDMS_Preview
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2010, Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Class for managing creation of text preview for documents.
*
* @category DMS
* @package SeedDMS_Preview
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2011, Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_Preview_TxtPreviewer extends SeedDMS_Preview_Base {
function __construct($previewDir, $timeout=5, $xsendfile=true) { /* {{{ */
parent::__construct($previewDir.DIRECTORY_SEPARATOR.'txt', $timeout, $xsendfile);
$this->converters = array(
);
} /* }}} */
/**
* Return the physical filename of the preview image on disc
* including the path
*
* @param object $object document content or document file
* @return string file name of preview image
*/
public function getFileName($object) { /* {{{ */
if(!$object)
return false;
$document = $object->getDocument();
$dms = $document->_dms;
$dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
switch(get_class($object)) {
case $dms->getClassname('documentcontent'):
$target = $dir.'t'.$object->getVersion();
break;
default:
return false;
}
return $target;
} /* }}} */
/**
* Check if converter for a given mimetype is set
*
* @param string $mimetype from mimetype
*
* @return boolean true if converter exists, otherwise false
*/
function hasConverter($from, $to='') { /* {{{ */
return parent::hasConverter($from, 'text/plain');
} /* }}} */
/**
* Create a text preview for a given file
*
* This method creates a preview in text format for a regular file
* in the file system and stores the result in the directory $dir relative
* to the configured preview directory. The filename of the resulting preview
* image is either $target.text (if set) or md5($infile).text.
* The $mimetype is used to select the propper conversion programm.
* An already existing text preview is replaced.
*
* @param string $infile name of input file including full path
* @param string $dir directory relative to $this->previewDir
* @param string $mimetype MimeType of input file
* @param string $target optional name of preview image (without extension)
* @return boolean true on success, false on failure
*/
public function createRawPreview($infile, $dir, $mimetype, $target='') { /* {{{ */
if(!self::hasConverter($mimetype))
return true;
if(!$this->previewDir)
return false;
if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) {
return false;
}
}
if(!file_exists($infile))
return false;
if(!$target)
$target = $this->previewDir.$dir.md5($infile);
$this->lastpreviewfile = $target.'.txt';
if($target != '' && (!file_exists($target.'.txt') || filectime($target.'.txt') < filectime($infile))) {
if($this->conversionmgr) {
if(!$this->conversionmgr->convert($infile, $mimetype, 'text/plain', $target.'.txt')) {
$this->lastpreviewfile = '';
return false;
}
$new = true;
} else {
$cmd = '';
$mimeparts = explode('/', $mimetype, 2);
if(isset($this->converters[$mimetype])) {
$cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters[$mimetype]);
} elseif(isset($this->converters[$mimeparts[0].'/*'])) {
$cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters[$mimeparts[0].'/*']);
} elseif(isset($this->converters['*'])) {
$cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters['*']);
}
if($cmd) {
try {
self::execWithTimeout($cmd, $this->timeout);
$new = true;
} catch(Exception $e) {
$this->lastpreviewfile = '';
return false;
}
}
}
return true;
}
$new = false;
return true;
} /* }}} */
/**
* Create preview image
*
* This function creates a preview image for the given document
* content or document file. It internally uses
* {@link SeedDMS_Preview::createRawPreview()}. The filename of the
* preview image is created by {@link SeedDMS_Preview_Previewer::getFileName()}
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean true on success, false on failure
*/
public function createPreview($object) { /* {{{ */
if(!$object)
return false;
$document = $object->getDocument();
$file = $document->_dms->contentDir.$object->getPath();
$target = $this->getFileName($object);
return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $target);
} /* }}} */
/**
* Check if a preview image already exists.
*
* This function is a companion to {@link SeedDMS_Preview_Previewer::createRawPreview()}.
*
* @param string $infile name of input file including full path
* @param string $dir directory relative to $this->previewDir
* @return boolean true if preview exists, otherwise false
*/
public function hasRawPreview($infile, $dir, $target='') { /* {{{ */
if(!$this->previewDir)
return false;
if(!$target)
$target = $this->previewDir.$dir.md5($infile);
if($target !== false && file_exists($target.'.txt') && filectime($target.'.txt') >= filectime($infile)) {
return true;
}
return false;
} /* }}} */
/**
* Check if a preview txt already exists.
*
* This function is a companion to {@link SeedDMS_Preview_Previewer::createPreview()}.
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean true if preview exists, otherwise false
*/
public function hasPreview($object) { /* {{{ */
if(!$object)
return false;
if(!$this->previewDir)
return false;
$target = $this->getFileName($object);
if($target !== false && file_exists($target.'.txt') && filectime($target.'.txt') >= $object->getDate()) {
return true;
}
return false;
} /* }}} */
/**
* Return a preview image.
*
* This function returns the content of a preview image if it exists..
*
* @param string $infile name of input file including full path
* @param string $dir directory relative to $this->previewDir
* @return boolean/string image content if preview exists, otherwise false
*/
public function getRawPreview($infile, $dir, $target='') { /* {{{ */
if(!$this->previewDir)
return false;
if(!$target)
$target = $this->previewDir.$dir.md5($infile);
if($target && file_exists($target.'.txt')) {
$this->sendFile($target.'.txt');
}
} /* }}} */
/**
* Return a preview image.
*
* This function returns the content of a preview image if it exists..
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean/string image content if preview exists, otherwise false
*/
public function getPreview($object) { /* {{{ */
if(!$this->previewDir)
return false;
$target = $this->getFileName($object);
if($target && file_exists($target.'.txt')) {
$this->sendFile($target.'.txt');
}
} /* }}} */
/**
* Return file size preview image.
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean/integer size of preview image or false if image
* does not exist
*/
public function getFilesize($object) { /* {{{ */
$target = $this->getFileName($object);
if($target && file_exists($target.'.txt')) {
return(filesize($target.'.txt'));
} else {
return false;
}
} /* }}} */
/**
* Delete preview image.
*
* @param object $object instance of SeedDMS_Core_DocumentContent
* or SeedDMS_Core_DocumentFile
* @return boolean true if deletion succeded or false if file does not exist
*/
public function deletePreview($object) { /* {{{ */
if(!$this->previewDir)
return false;
$target = $this->getFileName($object);
if($target && file_exists($target.'.txt')) {
return(unlink($target.'.txt'));
} else {
return false;
}
} /* }}} */
static function recurseRmdir($dir) {
$files = array_diff(scandir($dir), array('.','..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? SeedDMS_Preview_Previewer::recurseRmdir("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}
/**
* Delete all preview text belonging to a document
*
* This function removes the preview text of all versions and
* files of a document including the directory. It actually just
* removes the directory for the document in the cache.
*
* @param object $document instance of SeedDMS_Core_Document
* @return boolean true if deletion succeded or false if file does not exist
*/
public function deleteDocumentPreviews($document) { /* {{{ */
if(!$this->previewDir)
return false;
$dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir();
if(file_exists($dir) && is_dir($dir)) {
return SeedDMS_Preview_Previewer::recurseRmdir($dir);
} else {
return false;
}
} /* }}} */
}
?>

View File

@ -11,11 +11,11 @@
<email>uwe@steinmann.cx</email>
<active>yes</active>
</lead>
<date>2021-10-16</date>
<date>2023-01-09</date>
<time>09:49:39</time>
<version>
<release>1.4.0</release>
<api>1.4.0</api>
<release>1.5.0</release>
<api>1.5.0</api>
</version>
<stability>
<release>stable</release>
@ -23,8 +23,7 @@
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- use new conversion service if available
- createRawPreview() checks early if a converter exists
- add previewer which creates txt
</notes>
<contents>
<dir baseinstalldir="SeedDMS" name="/">
@ -38,6 +37,9 @@
<file name="PdfPreviewer.php" role="php">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
<file name="TxtPreviewer.php" role="php">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
</dir> <!-- /Lucene -->
<dir name="tests">
</dir> <!-- /tests -->
@ -49,7 +51,7 @@
<dependencies>
<required>
<php>
<min>4.3.0</min>
<min>7.4.0</min>
</php>
<pearinstaller>
<min>1.5.4</min>
@ -488,5 +490,22 @@ update package description
preview image was actually created
</notes>
</release>
<release>
<date>2021-10-16</date>
<time>09:49:39</time>
<version>
<release>1.4.0</release>
<api>1.4.0</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- use new conversion service if available
- createRawPreview() checks early if a converter exists
</notes>
<release>
</changelog>
</package>

View File

@ -111,7 +111,7 @@ class SeedDMS_SQLiteFTS_Document {
* @return string
*/
public function getFieldValue($fieldName) {
return $this->getField($fieldName)->value;
return $this->getField($fieldName)->value;
}
}
?>

View File

@ -151,8 +151,9 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document {
if($version) {
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('mimetype', $version->getMimeType()));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('origfilename', $version->getOriginalFileName()));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $version->getDate(), 'unindexed'));
if(!$nocontent)
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $version->getDate(), 'unindexed'));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', time(), 'unindexed'));
if($attributes = $version->getAttributes()) {
foreach($attributes as $attribute) {
$attrdef = $attribute->getAttributeDefinition();
@ -168,7 +169,7 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document {
foreach($categories as $cat) {
$names[] = $cat->getName();
}
$this->addField(SeedDMS_SQLiteFTS_Field::Text('category', implode(' ', $names)));
$this->addField(SeedDMS_SQLiteFTS_Field::Text('category', implode('#', $names)));
}
if($keywords = $document->getKeywords()) {
$this->addField(SeedDMS_SQLiteFTS_Field::Text('keywords', $keywords));
@ -182,7 +183,15 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document {
if(file_exists($path)) {
$mimetype = $version->getMimeType();
$this->mimetype = $mimetype;
if(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) {
if(is_callable($convcmd)) {
$result = $convcmd($document);
if($result['content']) {
self::setContent($result['content']);
} elseif($result['content'] === false) {
$this->errormsg = $result['errormsg'];
}
$this->cmd = $result['cmd'];
} elseif(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) {
if($service = $convcmd->getService($mimetype, 'text/plain')) {
$content = $convcmd->convert($path, $mimetype, 'text/plain');
if($content) {
@ -226,6 +235,7 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document {
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('document_id', 'F'.$document->getID()));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('record_type', 'folder'));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $document->getDate(), 'unindexed'));
$this->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', time(), 'unindexed'));
}
} /* }}} */

View File

@ -25,18 +25,48 @@
class SeedDMS_SQLiteFTS_Indexer {
/**
* @var string $ftstype
* @var string $_ftstype
* @access protected
*/
protected $_ftstype;
/**
* @var object $index sqlite index
* @var object $_conn sqlite index
* @access protected
*/
protected $_conn;
/**
* @var array $_stop_words array of stop words
* @access protected
*/
protected $_stop_words;
const ftstype = 'fts5';
/**
* Remove stopwords from string
*/
protected function strip_stopwords($str = "") { /* {{{ */
// 1.) break string into words
// [^-\w\'] matches characters, that are not [0-9a-zA-Z_-']
// if input is unicode/utf-8, the u flag is needed: /pattern/u
$words = preg_split('/[^-\w\']+/u', $str, -1, PREG_SPLIT_NO_EMPTY);
// 2.) if we have at least 2 words, remove stopwords
if(!empty($words)) {
$stopwords = $this->_stop_words;
$words = array_filter($words, function ($w) use (&$stopwords) {
return ((mb_strlen($w, 'utf-8') > 2) && !isset($stopwords[mb_strtolower($w, "utf-8")]));
});
}
// check if not too much was removed such as "the the" would return empty
if(!empty($words))
return implode(" ", $words);
return $str;
} /* }}} */
/**
* Constructor
*
@ -48,6 +78,7 @@ class SeedDMS_SQLiteFTS_Indexer {
$this->_rawid = 'rowid';
else
$this->_rawid = 'docid';
$this->_stop_words = [];
} /* }}} */
/**
@ -59,7 +90,7 @@ class SeedDMS_SQLiteFTS_Indexer {
if(file_exists($conf['indexdir'].'/index.db')) {
return new SeedDMS_SQLiteFTS_Indexer($conf['indexdir']);
} else
return self::create($conf);
return static::create($conf);
} /* }}} */
/**
@ -77,9 +108,9 @@ class SeedDMS_SQLiteFTS_Indexer {
$version = SQLite3::version();
if(self::ftstype == 'fts4') {
if($version['versionNumber'] >= 3008000)
$sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, users, status, path, notindexed=created, matchinfo=fts3)';
$sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, indexed, users, status, path, notindexed=created, notindexed=indexed, matchinfo=fts3)';
else
$sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, users, status, path, matchinfo=fts3)';
$sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, indexed, users, status, path, matchinfo=fts3)';
$res = $index->_conn->exec($sql);
if($res === false) {
return null;
@ -90,7 +121,7 @@ class SeedDMS_SQLiteFTS_Indexer {
return null;
}
} elseif(self::ftstype == 'fts5') {
$sql = 'CREATE VIRTUAL TABLE docs USING fts5(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, users, status, path)';
$sql = 'CREATE VIRTUAL TABLE docs USING fts5(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, indexed unindexed, users, status, path)';
$res = $index->_conn->exec($sql);
if($res === false) {
return null;
@ -109,7 +140,9 @@ class SeedDMS_SQLiteFTS_Indexer {
* Do some initialization
*
*/
static function init($stopWordsFile='') { /* {{{ */
public function init($stopWordsFile='') { /* {{{ */
if($stopWordsFile)
$this->_stop_words = array_flip(preg_split("/[\s,]+/", file_get_contents($stopWordsFile)));
} /* }}} */
/**
@ -123,7 +156,7 @@ class SeedDMS_SQLiteFTS_Indexer {
if(!$this->_conn)
return false;
foreach(array('comment', 'keywords', 'category', 'content', 'mimetype', 'origfilename', 'status', 'created') as $kk) {
foreach(array('comment', 'keywords', 'category', 'content', 'mimetype', 'origfilename', 'status', 'created', 'indexed') as $kk) {
try {
${$kk} = $doc->getFieldValue($kk);
} catch (Exception $e) {
@ -135,7 +168,10 @@ class SeedDMS_SQLiteFTS_Indexer {
if($res === false) {
return false;
}
$sql = "INSERT INTO docs (documentid, record_type, title, comment, keywords, category, owner, content, mimetype, origfilename, created, users, status, path) VALUES (".$this->_conn->quote($doc->getFieldValue('document_id')).", ".$this->_conn->quote($doc->getFieldValue('record_type')).", ".$this->_conn->quote($doc->getFieldValue('title')).", ".$this->_conn->quote($comment).", ".$this->_conn->quote($keywords).", ".$this->_conn->quote($category).", ".$this->_conn->quote($doc->getFieldValue('owner')).", ".$this->_conn->quote($content).", ".$this->_conn->quote($mimetype).", ".$this->_conn->quote($origfilename).", ".(int)$created.", ".$this->_conn->quote($doc->getFieldValue('users')).", ".$this->_conn->quote($status).", ".$this->_conn->quote($doc->getFieldValue('path'))/*time()*/.")";
if($this->_stop_words)
$content = $this->strip_stopwords($content);
$sql = "INSERT INTO docs (documentid, record_type, title, comment, keywords, category, owner, content, mimetype, origfilename, created, indexed, users, status, path) VALUES (".$this->_conn->quote($doc->getFieldValue('document_id')).", ".$this->_conn->quote($doc->getFieldValue('record_type')).", ".$this->_conn->quote($doc->getFieldValue('title')).", ".$this->_conn->quote($comment).", ".$this->_conn->quote($keywords).", ".$this->_conn->quote($category).", ".$this->_conn->quote($doc->getFieldValue('owner')).", ".$this->_conn->quote($content).", ".$this->_conn->quote($mimetype).", ".$this->_conn->quote($origfilename).", ".(int)$created.", ".(int)$indexed.", ".$this->_conn->quote($doc->getFieldValue('users')).", ".$this->_conn->quote($status).", ".$this->_conn->quote($doc->getFieldValue('path'))/*time()*/.")";
$res = $this->_conn->exec($sql);
if($res === false) {
return false;
@ -147,8 +183,7 @@ class SeedDMS_SQLiteFTS_Indexer {
/**
* Remove document from index
*
* @param object $doc indexed document of class
* SeedDMS_SQLiteFTS_IndexedDocument
* @param object $id internal id of document
* @return boolean false in case of an error, otherwise true
*/
public function delete($id) { /* {{{ */
@ -179,15 +214,22 @@ class SeedDMS_SQLiteFTS_Indexer {
* @return boolean false in case of an error, otherwise array with elements
* 'count', 'hits', 'facets'. 'hits' is an array of SeedDMS_SQLiteFTS_QueryHit
*/
public function find($query, $limit=array()) { /* {{{ */
public function find($query, $filter='', $limit=array(), $order=array()) { /* {{{ */
if(!$this->_conn)
return false;
/* First count some records for facets */
foreach(array('owner', 'mimetype', 'category') as $facetname) {
foreach(array('owner', 'mimetype', 'category', 'status') as $facetname) {
$sql = "SELECT `".$facetname."`, count(*) AS `c` FROM `docs`";
if($query)
if($query) {
$sql .= " WHERE docs MATCH ".$this->_conn->quote($query);
}
if($filter) {
if($query)
$sql .= " AND ".$filter;
else
$sql .= " WHERE ".$filter;
}
$res = $this->_conn->query($sql." GROUP BY `".$facetname."`");
if(!$res)
throw new SeedDMS_SQLiteFTS_Exception("Counting records in facet \"$facetname\" failed.");
@ -196,7 +238,7 @@ class SeedDMS_SQLiteFTS_Indexer {
foreach($res as $row) {
if($row[$facetname] && $row['c']) {
if($facetname == 'category') {
$tmp = explode(' ', $row[$facetname]);
$tmp = explode('#', $row[$facetname]);
if(count($tmp) > 1) {
foreach($tmp as $t) {
if(!isset($facets[$facetname][$t]))
@ -210,6 +252,8 @@ class SeedDMS_SQLiteFTS_Indexer {
else
$facets[$facetname][$row[$facetname]] += $row['c'];
}
} elseif($facetname == 'status') {
$facets[$facetname][($row[$facetname]-10).''] = $row['c'];
} else
$facets[$facetname][$row[$facetname]] = $row['c'];
}
@ -219,6 +263,12 @@ class SeedDMS_SQLiteFTS_Indexer {
$sql = "SELECT `record_type`, count(*) AS `c` FROM `docs`";
if($query)
$sql .= " WHERE docs MATCH ".$this->_conn->quote($query);
if($filter) {
if($query)
$sql .= " AND ".$filter;
else
$sql .= " WHERE ".$filter;
}
$res = $this->_conn->query($sql." GROUP BY `record_type`");
if(!$res)
throw new SeedDMS_SQLiteFTS_Exception("Counting records in facet \"record_type\" failed.");
@ -232,10 +282,32 @@ class SeedDMS_SQLiteFTS_Indexer {
$sql = "SELECT ".$this->_rawid.", documentid FROM docs";
if($query)
$sql .= " WHERE docs MATCH ".$this->_conn->quote($query);
if($this->_ftstype == 'fts5')
if($filter) {
if($query)
$sql .= " AND ".$filter;
else
$sql .= " WHERE ".$filter;
}
if($this->_ftstype == 'fts5') {
//$sql .= " ORDER BY rank";
// boost documentid, title and comment
$sql .= " ORDER BY bm25(docs, 10.0, 10.0, 10.0)";
// boost documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, users, status, path
if(!empty($order['by'])) {
switch($order['by']) {
case "title":
$sql .= " ORDER BY title";
break;
case "created":
$sql .= " ORDER BY created";
break;
default:
$sql .= " ORDER BY bm25(docs, 10.0, 0.0, 10.0, 5.0, 5.0, 10.0)";
}
if(!empty($order['dir'])) {
if($order['dir'] == 'desc')
$sql .= " DESC";
}
}
}
if(!empty($limit['limit']))
$sql .= " LIMIT ".(int) $limit['limit'];
if(!empty($limit['offset']))
@ -289,7 +361,7 @@ class SeedDMS_SQLiteFTS_Indexer {
if(!$this->_conn)
return false;
$sql = "SELECT ".$this->_rawid.", documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, users, status, path".($content ? ", content" : "")." FROM docs WHERE ".$this->_rawid."='".$id."'";
$sql = "SELECT ".$this->_rawid.", documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, indexed, users, status, path".($content ? ", content" : "")." FROM docs WHERE ".$this->_rawid."='".$id."'";
$res = $this->_conn->query($sql);
$doc = false;
if($res) {
@ -306,9 +378,10 @@ class SeedDMS_SQLiteFTS_Indexer {
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('origfilename', $rec['origfilename']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Text('owner', $rec['owner']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $rec['created']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', $rec['indexed']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Text('users', $rec['users']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('status', $rec['status']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('path', $rec['path']));
$doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('path', explode('x', substr($rec['path'], 1, -1))));
if($content)
$doc->addField(SeedDMS_SQLiteFTS_Field::UnStored('content', $rec['content']));
}
@ -318,16 +391,33 @@ class SeedDMS_SQLiteFTS_Indexer {
/**
* Return list of terms in index
*
* This function does nothing!
* @return array list of SeedDMS_SQLiteFTS_Term
*/
public function terms() { /* {{{ */
public function terms($prefix='', $col='') { /* {{{ */
if(!$this->_conn)
return false;
if($this->_ftstype == 'fts5')
$sql = "SELECT term, col, doc as occurrences FROM docs_terms WHERE col!='*' ORDER BY col";
else
$sql = "SELECT term, col, occurrences FROM docs_terms WHERE col!='*' ORDER BY col";
if($this->_ftstype == 'fts5') {
$sql = "SELECT term, col, doc as occurrences FROM docs_terms";
if($prefix || $col) {
$sql .= " WHERE";
if($prefix) {
$sql .= " term like '".$prefix."%'";
if($col)
$sql .= " AND";
}
if($col)
$sql .= " col = '".$col."'";
}
$sql .= " ORDER BY col, occurrences desc";
} else {
$sql = "SELECT term, col, occurrences FROM docs_terms WHERE col!='*'";
if($prefix)
$sql .= " AND term like '".$prefix."%'";
if($col)
$sql .= " AND col = '".$col."'";
$sql .= " ORDER BY col, occurrences desc";
}
$res = $this->_conn->query($sql);
$terms = array();
if($res) {
@ -340,8 +430,9 @@ class SeedDMS_SQLiteFTS_Indexer {
} /* }}} */
/**
* Return list of documents in index
* Return number of documents in index
*
* @return interger number of documents
*/
public function count() { /* {{{ */
$sql = "SELECT count(*) c FROM docs";

View File

@ -53,6 +53,7 @@ class SeedDMS_SQLiteFTS_QueryHit {
*/
public function __construct(SeedDMS_SQLiteFTS_Indexer $index) { /* {{{ */
$this->_index = $index;
$this->_document = null;
} /* }}} */
/**

View File

@ -70,7 +70,7 @@ class SeedDMS_SQliteFTS_Search {
* @param object $index SQlite FTS index
* @return object instance of SeedDMS_Lucene_Search
*/
function search($term, $fields=array(), $limit=array()) { /* {{{ */
function search($term, $fields=array(), $limit=array(), $order=array()) { /* {{{ */
$querystr = '';
$term = trim($term);
if($term) {
@ -139,8 +139,20 @@ class SeedDMS_SQliteFTS_Search {
$querystr .= str_replace(':', 'x', $fields['startFolder']->getFolderList().$fields['startFolder']->getID().':');
$querystr .= '*)';
}
$filterstr = '';
if(!empty($fields['created_start'])) {
if($filterstr)
$filterstr .= ' AND ';
$filterstr .= '(created>='.$fields['created_start'].')';
}
if(!empty($fields['created_end'])) {
if($filterstr)
$filterstr .= ' AND ';
$filterstr .= '(created<'.$fields['created_end'].')';
}
try {
$result = $this->index->find($querystr, $limit);
$result = $this->index->find($querystr, $filterstr, $limit, $order);
$recs = array();
foreach($result["hits"] as $hit) {
$recs[] = array('id'=>$hit->id, 'document_id'=>$hit->documentid);

View File

@ -60,7 +60,8 @@ class SeedDMS_SQLiteFTS_Term {
9 => 'created',
10 => 'user',
11 => 'status',
12 => 'path'
12 => 'path',
13 => 'indexed',
);
/* fts5 pass the column name in $col, fts4 uses an integer */
if(is_int($col))

View File

@ -11,11 +11,11 @@
<email>uwe@steinmann.cx</email>
<active>yes</active>
</lead>
<date>2022-03-04</date>
<date>2023-01-09</date>
<time>08:57:44</time>
<version>
<release>1.0.17</release>
<api>1.0.17</api>
<release>1.0.18</release>
<api>1.0.18</api>
</version>
<stability>
<release>stable</release>
@ -23,8 +23,10 @@
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- throw exeption in find() instead of returning false
- fix query if rootFolder or startFolder is set
- add optional parameter $order to SeedDMS_SQLiteFTS_Indexer::find()
- add optional parameters $query and $col to SeedDMS_SQLiteFTS_Indexer::terms()
- IndexedDocument() accepts a callable for conversion to text
- remove stop words from content
</notes>
<contents>
<dir baseinstalldir="SeedDMS" name="/">
@ -353,5 +355,22 @@ add user to list of terms
- add class SeedDMS_SQLiteFTS_Field
</notes>
</release>
<release>
<date>2022-03-04</date>
<time>08:57:44</time>
<version>
<release>1.0.17</release>
<api>1.0.17</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- throw exeption in find() instead of returning false
- fix query if rootFolder or startFolder is set
</notes>
</release>
</changelog>
</package>

View File

@ -29,8 +29,18 @@ class SeedDMS_Controller_ClearCache extends SeedDMS_Controller_Common {
$post = $this->params['post'];
$ret = '';
if(!empty($post['preview'])) {
$cmd = 'rm -rf '.$settings->_cacheDir.'/[1-9]*';
if(!empty($post['previewpng'])) {
$cmd = 'rm -rf '.$settings->_cacheDir.'/png/[1-9]*';
system($cmd, $ret);
}
if(!empty($post['previewpdf'])) {
$cmd = 'rm -rf '.$settings->_cacheDir.'/pdf/[1-9]*';
system($cmd, $ret);
}
if(!empty($post['previewtxt'])) {
$cmd = 'rm -rf '.$settings->_cacheDir.'/txt/[1-9]*';
system($cmd, $ret);
}

View File

@ -26,6 +26,7 @@ class SeedDMS_Controller_Cron extends SeedDMS_Controller_Common {
$dms = $this->params['dms'];
$user = $this->params['user'];
$settings = $this->params['settings'];
$logger = $this->params['logger'];
$mode = $this->params['mode'];
$db = $dms->getDb();

View File

@ -35,9 +35,11 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
$dms = $this->params['dms'];
$settings = $this->params['settings'];
$session = $this->params['session'];
$sesstheme = $this->params['sesstheme'];
$referuri = $this->params['referuri'];
$lang = $this->params['lang'];
$authenticator = $this->params['authenticator'];
$source = isset($this->params['source']) ? $this->params['source'] : '';
$sesstheme = $this->getParam('sesstheme');
$referuri = $this->getParam('referuri');
$lang = $this->getParam('lang');
$login = $this->params['login'];
if($user = $dms->getUserByLogin($login)) {
@ -133,73 +135,78 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
/* Clear login failures if login was successful */
$user->clearLoginFailures();
// Capture the user's language and theme settings.
if ($lang) {
$user->setLanguage($lang);
} else {
$lang = $user->getLanguage();
if (strlen($lang)==0) {
$lang = $settings->_language;
/* Setting the theme and language and all the cookie handling is
* only done when authentication was requested from a weg page.
*/
if($source == 'web') {
// Capture the user's language and theme settings.
if ($lang) {
$user->setLanguage($lang);
}
}
if ($sesstheme) {
$user->setTheme($sesstheme);
}
else {
$sesstheme = $user->getTheme();
/* Override the theme if the user doesn't have one or the default theme
* shall override it.
*/
if (strlen($sesstheme)==0 || !empty($settings->_overrideTheme)) {
$sesstheme = $settings->_theme;
// $user->setTheme($sesstheme);
}
}
// Delete all sessions that are more than 1 week or the configured
// cookie lifetime old. Probably not the most
// reliable place to put this check -- move to inc.Authentication.php?
if($settings->_cookieLifetime)
$lifetime = intval($settings->_cookieLifetime);
else
$lifetime = 7*86400;
if(!$session->deleteByTime($lifetime)) {
$this->setErrorMsg("error_occured");
return false;
}
if (isset($_COOKIE["mydms_session"])) {
/* This part will never be reached unless the session cookie is kept,
* but op.Logout.php deletes it. Keeping a session could be a good idea
* for retaining the clipboard data, but the user id in the session should
* be set to 0 which is not possible due to foreign key constraints.
* So for now op.Logout.php will delete the cookie as always
*/
/* Load session */
$dms_session = $_COOKIE["mydms_session"];
if(!$resArr = $session->load($dms_session)) {
/* Turn off http only cookies if jumploader is enabled */
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot, null, false, true); //delete cookie
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$referuri);
exit;
} else {
$session->updateAccess($dms_session);
$session->setUser($userid);
$lang = $user->getLanguage();
if (strlen($lang)==0) {
$lang = $settings->_language;
$user->setLanguage($lang);
}
}
} else {
// Create new session in database
if(!$id = $session->create(array('userid'=>$userid, 'theme'=>$sesstheme, 'lang'=>$lang))) {
if ($sesstheme) {
$user->setTheme($sesstheme);
}
else {
$sesstheme = $user->getTheme();
/* Override the theme if the user doesn't have one or the default theme
* shall override it.
*/
if (strlen($sesstheme)==0 || !empty($settings->_overrideTheme)) {
$sesstheme = $settings->_theme;
// $user->setTheme($sesstheme);
}
}
// Delete all sessions that are more than 1 week or the configured
// cookie lifetime old. Probably not the most
// reliable place to put this check -- move to inc.Authentication.php?
if($settings->_cookieLifetime)
$lifetime = intval($settings->_cookieLifetime);
else
$lifetime = 7*86400;
if(!$session->deleteByTime($lifetime)) {
$this->setErrorMsg("error_occured");
return false;
}
// Set the session cookie.
if($settings->_cookieLifetime)
$lifetime = time() + intval($settings->_cookieLifetime);
else
$lifetime = 0;
setcookie("mydms_session", $id, $lifetime, $settings->_httpRoot, null, false, true);
if (isset($_COOKIE["mydms_session"])) {
/* This part will never be reached unless the session cookie is kept,
* but op.Logout.php deletes it. Keeping a session could be a good idea
* for retaining the clipboard data, but the user id in the session should
* be set to 0 which is not possible due to foreign key constraints.
* So for now op.Logout.php will delete the cookie as always
*/
/* Load session */
$dms_session = $_COOKIE["mydms_session"];
if(!$resArr = $session->load($dms_session)) {
/* Turn off http only cookies if jumploader is enabled */
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot, null, false, true); //delete cookie
header("Location: " . $settings->_httpRoot . "out/out.Login.php?referuri=".$referuri);
exit;
} else {
$session->updateAccess($dms_session);
$session->setUser($userid);
}
} else {
// Create new session in database
if(!$id = $session->create(array('userid'=>$userid, 'theme'=>$sesstheme, 'lang'=>$lang))) {
$this->setErrorMsg("error_occured");
return false;
}
// Set the session cookie.
if($settings->_cookieLifetime)
$lifetime = time() + intval($settings->_cookieLifetime);
else
$lifetime = 0;
setcookie("mydms_session", $id, $lifetime, $settings->_httpRoot, null, false, true);
}
}
if($this->callHook('postLogin', $user)) {
@ -275,6 +282,7 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
}
}
if(0) {
/* Authenticate against LDAP server {{{ */
if (!is_object($user) && isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) {
require_once("../inc/inc.ClassLdapAuthentication.php");
@ -288,6 +296,7 @@ class SeedDMS_Controller_Login extends SeedDMS_Controller_Common {
$authobj = new SeedDMS_DbAuthentication($dms, $settings);
$user = $authobj->authenticate($login, $pwd);
} /* }}} */
}
/* If the user is still not authenticated, then exit with an error */
if(!is_object($user)) {

View File

@ -90,6 +90,9 @@ image/jpeg
image/png
convert -resize %wx '%f' 'png:%o'
text/plain
convert -density 100 -resize %wx 'text:%f[0]' 'png:%o'
application/pdf
gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q '%f' | convert -resize %wx png:- '%o'
@ -97,9 +100,15 @@ application/pdf
mutool draw -F png -w %w -q -N -o %o %f 1
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'
On Linux systems you will have to set the desired value in /etc/papersize for a2ps
e.g. a4, or letter
application/msword
application/vnd.oasis.opendocument.spreadsheet
application/vnd.oasis.opendocument.text

26
doc/README.Scheduler.md Normal file
View File

@ -0,0 +1,26 @@
Scheduler
==========
The scheduler in SeedDMS manages frequently run tasks. It is very similar
to regular unix cron jobs. A task in SeedDMS is an instanciation of a task
class which itself is defined by an extension or SeedDMS itself.
SeedDMS has some predefined classes e.g. core::expireddocs.
In order for tasks to be runnalbe, a user `cli_scheduler` must exists in
SeedDMS.
All tasks are executed by a single cronjob in the directory `utils`
> */5 * * * * /home/www-data/seeddms60x/seeddms/utils/seeddms-schedulercli --mode=run
Please keep in mind, that the php interpreter used for the cronjob may be
different from the php interpreter used für the web application. Hence, two
different php.ini files might be used. php and the php extensions may differ as
well. This can cause some extensions to be disabled and consequently some task
classes are not defined.
`utils/seeddms-schedulercli` can also be run on the command line. If you
do that, run it with the same system user used for the web server. On Debian
this is www-data. Hence run it like
sudo -u www-data utils/seeddms-schedulercli --mode=list

13
doc/README.Swagger Normal file
View File

@ -0,0 +1,13 @@
Swagger
========
Swagger is used to describe a rest api. SeedDMS ships a swagger.yaml file
in the restapi directory. You can load this file into a swagger editor, e.g.
http://petstore.swagger.io/ or http://editor.swagger.io/
You may as well set up your own swagger-ui installation as described at
https://medium.com/@tatianaensslin/how-to-add-swagger-ui-to-php-server-code-f1610c01dc03
Your apache needs to have the module 'header' enabled, because some HTTP headers
are set when the file swagger.yaml is accessed by the editor.
Currently, the swagger.yaml shipped with SeedDMS uses still swagger 2.0

View File

@ -1,5 +1,5 @@
WebDAV
-----------------------------------------------
========
SeedDMS has support for WebDAV which allows to easily add, delete,
move, copy and modify documents. All operating systems have support
@ -29,7 +29,7 @@ the content of document or creating a new
version if a document is saved.
Configuring davfs2
===================
-------------------
On Linux it is quite simple to mount the SeedDMS WebDAV server with
davfs2. Just place a line like the following in your /etc/fstab
@ -51,15 +51,14 @@ and possibly add your login data to /etc/davfs2/secrets
/media/webdav admin secret
Making applications work with WebDAV
=====================================
-------------------------------------
Various programms have differnt strategies to save files to disc and
prevent data lost under all circumstances. Those strategies often don't
work very well an a WebDAV-Server. The following will list some of those
strategies.
VIM
=========================
### VIM
vim does a lot more than just reading and writing the file you want
to edit. It creates swap and backup files for data recovery if vim crashes
@ -69,7 +68,7 @@ swap file at all or create it outside the WebDAV server. A second problem
arises from how vim modifіes the file you are editing. Before a file
is saved a backup is created by renaming the file to the same name with a
'~' at the end and writing the file content into a new
file with the name of the original file. Afterwards vim deleteѕ the backup
file with the name of the original file. Afterwards vim deletes the backup
file. On a regular file system you
won't see a difference between the file before and after saving, though
it is actually a new one. In SeedDMS you won't notice a difference either
@ -88,12 +87,17 @@ set nobackup
set nowritebackup
set noswapfile
If you want to restrict the settings to the directory where the dms
is mounted by webdav, e.g. /media/webdav, you can set an auto command
in .vimrc
autocmd BufNewFile,BufRead /media/webdav/* set nobackup nowritebackup noswapfile
Creating the backup file in a directory outside of WebDAV doesn't help in
this case, because it still does the file renaming which is turned of by
this case, because it still does the file renaming which is turned off by
'nowritebackup'.
cdaver
========
### cdaver
cadaver is a webdav client similar to classical command line based ftp clients.
It can be used to browse through the folders, downloads and uploads files, and

View File

@ -12,9 +12,6 @@
* @version Release: @package_version@
*/
require_once("inc.Utils.php");
require_once("inc.ClassNotificationService.php");
require_once("inc.ClassEmailNotify.php");
require_once("inc.ClassSession.php");
require_once("inc.ClassAccessOperation.php");
@ -110,8 +107,6 @@ if($settings->_useHomeAsRootFolder && !$user->isAdmin() && $user->getHomeFolder(
$role = $user->getRole();
$dms->noReadForStatus = $role->getNoAccess();
require_once('inc/inc.Notification.php');
/* Include additional language file for view
* This file must set $LANG[xx][]
*/

View File

@ -0,0 +1,42 @@
<?php
/**
* Create authentication service
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2002-2005 Markus Westphal,
* 2006-2008 Malcolm Cowe, 2010-2022 Uwe Steinmann
* @version Release: @package_version@
*/
require_once('inc.ClassAuthenticationService.php');
require_once('inc.ClassDbAuthentication.php');
require_once('inc.ClassLdapAuthentication.php');
global $logger;
$authenticator = new SeedDMS_AuthenticationService($logger, $settings);
if(isset($GLOBALS['SEEDDMS_HOOKS']['authentication'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['authentication'] as $authenticationObj) {
if(method_exists($authenticationObj, 'preAddService')) {
$authenticationObj->preAddService($dms, $authenticator);
}
}
}
$authenticator->addService(new SeedDMS_DbAuthentication($dms, $settings), 'db');
if(isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) {
$authenticator->addService(new SeedDMS_LdapAuthentication($dms, $settings), 'ldap');
}
if(isset($GLOBALS['SEEDDMS_HOOKS']['authentication'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['authentication'] as $authenticationObj) {
if(method_exists($authenticationObj, 'postAddService')) {
$authenticationObj->postAddService($dms, $authenticator);
}
}
}

View File

@ -18,53 +18,13 @@ require_once("inc.ClassEmailNotify.php");
require_once("inc.ClassSession.php");
require_once("inc.ClassAccessOperation.php");
function __authenticate($username, $password) { /* {{{ */
global $dms, $settings;
$user = false;
/* Authenticate against LDAP server {{{ */
if (!$user && isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) {
require_once("../inc/inc.ClassLdapAuthentication.php");
$authobj = new SeedDMS_LdapAuthentication($dms, $settings);
$user = $authobj->authenticate($username, $password);
} /* }}} */
/* Authenticate against SeedDMS database {{{ */
else {
require_once("../inc/inc.ClassDbAuthentication.php");
$authobj = new SeedDMS_DbAuthentication($dms, $settings);
$user = $authobj->authenticate($username, $password);
} /* }}} */
if (!$user) {
return false;
}
if (($user->getID() == $settings->_guestID) && (!$settings->_enableGuestLogin)) {
return false;
}
// Check if account is disabled
if($user->isDisabled()) {
return false;
}
// control admin IP address if required
if ($user->isAdmin() && ($_SERVER['REMOTE_ADDR'] != $settings->_adminIP ) && ( $settings->_adminIP != "") ){
return false;
}
return $user;
} /* }}} */
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
header('HTTP/1.0 401 Unauthorized');
echo getMLText('cancel_basic_authentication');
exit;
} else {
if(!($user = __authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) {
if(!($user = $authenticator->authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))) {
header('WWW-Authenticate: Basic realm="'.$settings->_siteName.'"');
header('HTTP/1.0 401 Unauthorized');
echo getMLText('cancel_basic_authentication');

View File

@ -24,34 +24,6 @@
*/
abstract class SeedDMS_Authentication
{
/**
* DMS object
*
* @var SeedDMS_Core_DMS
* @access protected
*/
protected $dms;
/**
* DMS settings
*
* @var Settings
* @access protected
*/
protected $settings;
/**
* Constructor
*
* @param SeedDMS_Core_DMS $dms DMS object
* @param Settings $settings DMS settings
*/
function __construct($dms, $settings) /* {{{ */
{
$this->dms = $dms;
$this->settings = $settings;
} /* }}} */
/**
* Do Authentication
*

View File

@ -0,0 +1,73 @@
<?php
/* Middleware for authentication based on session */
class SeedDMS_Auth_Middleware_Session { /* {{{ */
private $container;
public function __construct($container) {
$this->container = $container;
}
/**
* Example middleware invokable class
*
* @param \Psr\Http\Message\ServerRequestInterface $request PSR7 request
* @param \Psr\Http\Message\ResponseInterface $response PSR7 response
* @param callable $next Next middleware
*
* @return \Psr\Http\Message\ResponseInterface
*/
public function __invoke($request, $response, $next) {
// $this->container has the DI
$dms = $this->container->dms;
$settings = $this->container->config;
$logger = $this->container->logger;
$userobj = null;
if($this->container->has('userobj'))
$userobj = $this->container->userobj;
if($userobj) {
$response = $next($request, $response);
return $response;
}
$logger->log("Invoke middleware for method ".$request->getMethod()." on '".$request->getUri()->getPath()."'", PEAR_LOG_INFO);
require_once("inc/inc.ClassSession.php");
$session = new SeedDMS_Session($dms->getDb());
if (isset($_COOKIE["mydms_session"])) {
$dms_session = $_COOKIE["mydms_session"];
$logger->log("Session key: ".$dms_session, PEAR_LOG_DEBUG);
if(!$resArr = $session->load($dms_session)) {
/* Delete Cookie */
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot);
$logger->log("Session for id '".$dms_session."' has gone", PEAR_LOG_ERR);
return $response->withStatus(403);
}
/* Load user data */
$userobj = $dms->getUser($resArr["userID"]);
if (!is_object($userobj)) {
/* Delete Cookie */
setcookie("mydms_session", $dms_session, time()-3600, $settings->_httpRoot);
if($settings->_enableGuestLogin) {
if(!($userobj = $dms->getUser($settings->_guestID)))
return $response->withStatus(403);
} else
return $response->withStatus(403);
}
if($userobj->isAdmin()) {
if($resArr["su"]) {
if(!($userobj = $dms->getUser($resArr["su"])))
return $response->withStatus(403);
}
}
$dms->setUser($userobj);
} else {
return $response->withStatus(403);
}
$this->container['userobj'] = $userobj;
$response = $next($request, $response);
return $response;
}
} /* }}} */

View File

@ -0,0 +1,88 @@
<?php
/**
* Implementation of authentication service
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2016 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Implementation of authentication service
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2016 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_AuthenticationService {
/**
* List of services for authenticating user
*/
protected $services;
/*
* List of servives with errors
*/
protected $errors;
/*
* Service for logging
*/
protected $logger;
/*
* Configuration
*/
protected $settings;
public function __construct($logger = null, $settings = null) { /* {{{ */
$this->services = array();
$this->errors = array();
$this->logger = $logger;
$this->settings = $settings;
} /* }}} */
public function addService($service, $name='') { /* {{{ */
if(!$name)
$name = md5(uniqid());
$this->services[$name] = $service;
$this->errors[$name] = true;
} /* }}} */
public function getServices() { /* {{{ */
return $this->services;
} /* }}} */
public function getErrors() { /* {{{ */
return $this->errors;
} /* }}} */
public function authenticate($username, $password) { /* {{{ */
$user = null;
foreach($this->services as $name => $service) {
$this->logger->log('Authentication service \''.$name.'\'', PEAR_LOG_INFO);
$user = $service->authenticate($username, $password);
if($user === false) {
$this->errors[$name] = false;
if($this->logger)
$this->logger->log('Authentication service \''.$name.'\': Authentication of user \''.$username.'\' failed.', PEAR_LOG_ERR);
return false;
} elseif($user === null) {
if($this->logger)
$this->logger->log('Authentication service \''.$name.'\': Authentication of user \''.$username.'\' disregarded.', PEAR_LOG_ERR);
} else {
if($this->logger)
$this->logger->log('Authentication service \''.$name.'\': Authentication of user \''.$username.'\' successful.', PEAR_LOG_INFO);
$this->errors[$name] = true;
return $user;
}
}
return $user;
} /* }}} */
}

View File

@ -16,6 +16,7 @@ require_once("inc/inc.ClassConversionServiceImageToImage.php");
require_once("inc/inc.ClassConversionServiceImageToText.php");
require_once("inc/inc.ClassConversionServicePdfToImage.php");
require_once("inc/inc.ClassConversionServiceTextToText.php");
require_once("inc/inc.ClassConversionServiceTextToImage.php");
/**
* Implementation of conversion manager
@ -72,18 +73,25 @@ class SeedDMS_ConversionMgr {
* @param string $file name of file to convert
* @param string $from mimetype of input file
* @param string $to mimetype of output file
* @param string $target name of target file. If none is given the
* content of the converted document will be returned.
* @param array $params additional parameter needed for the conversion,
* e.g. the width of an image
*
* @return boolean true on success, other false
*/
public function convert($file, $from, $to, $target=null, $params=array()) {
public function convert($file, $from, $to, $target=null, $params=array()) { /* {{{ */
if(isset($this->services[$from][$to])) {
$services = $this->services[$from][$to];
for(end($services); key($services)!==null; prev($services)) {
$service = current($services);
$text = $service->convert($file, $target, $params);
if($text !== false)
if(!$service->wasSuccessful())
return false;
if($text)
return $text;
}
}
}
return true;
} /* }}} */
}

View File

@ -36,9 +36,15 @@ abstract class SeedDMS_ConversionServiceBase {
*/
protected $logger;
/**
* @var $success set to false if conversion failed
*/
protected $success;
public function __construct() {
$this->from = null;
$this->to = null;
$this->success = true;
}
public function setLogger($logger) {
@ -53,6 +59,10 @@ abstract class SeedDMS_ConversionServiceBase {
return [];
} /* }}} */
public function wasSuccessful() { /* {{{ */
return $this->success;
} /* }}} */
/**
* This method does the conversion
*

View File

@ -91,11 +91,12 @@ class SeedDMS_ConversionServiceExec extends SeedDMS_ConversionServiceBase {
}
} /* }}} */
public function __construct($from, $to, $cmd) {
public function __construct($from, $to, $cmd, $timeout=5) {
parent::__construct();
$this->from = $from;
$this->to = $to;
$this->cmd = $cmd;
$this->timeout = 5;
$this->timeout = ((int) $timeout) ? (int) $timeout : 5;
}
public function getInfo() {
@ -167,6 +168,7 @@ class SeedDMS_ConversionServiceExec extends SeedDMS_ConversionServiceBase {
} catch(Exception $e) {
if($hastempfile)
unlink($tmpfile);
$this->success = false;
return false;
}
$end = microtime(true);

View File

@ -29,6 +29,7 @@ class SeedDMS_ConversionServiceImageToImage extends SeedDMS_ConversionServiceBas
public $timeout;
public function __construct($from, $to) { /* {{{ */
parent::__construct();
$this->from = $from;
$this->to = $to;
$this->timeout = 5;

View File

@ -29,6 +29,7 @@ class SeedDMS_ConversionServiceImageToText extends SeedDMS_ConversionServiceBase
public $timeout;
public function __construct($from, $to) { /* {{{ */
parent::__construct();
$this->from = $from;
$this->to = $to;
} /* }}} */
@ -50,25 +51,24 @@ class SeedDMS_ConversionServiceImageToText extends SeedDMS_ConversionServiceBase
public function convert($infile, $target = null, $params = array()) { /* {{{ */
$start = microtime(true);
$imsize = getimagesize($infile, $moreinfo);
$txt = '';
if(!empty($moreinfo['APP13'])) {
$txt = '';
$iptcdata = iptcparse($moreinfo['APP13']);
foreach(['2#005', '2#015', '2#025', '2#105', '2#080', '2#115', '2#120'] as $key) {
if(isset($iptcdata[$key]))
$txt .= implode(' ', $iptcdata[$key])."\n";
}
$end = microtime(true);
if($this->logger) {
$this->logger->log('Conversion from '.$this->from.' to '.$this->to.' by extracting iptc took '.($end-$start).' sec.', PEAR_LOG_INFO);
}
if($target) {
file_put_contents($target, $txt);
return true;
} else {
return $txt;
}
}
return false;
$end = microtime(true);
if($this->logger) {
$this->logger->log('Conversion from '.$this->from.' to '.$this->to.' by extracting iptc took '.($end-$start).' sec.', PEAR_LOG_INFO);
}
if($target) {
file_put_contents($target, $txt);
return true;
} else {
return $txt;
}
} /* }}} */
}

View File

@ -29,6 +29,7 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
public $timeout;
public function __construct($from, $to) {
parent::__construct();
$this->from = $from;
$this->to = $to;
$this->timeout = 5;
@ -50,8 +51,12 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
$imagick = new Imagick();
/* Setting a smaller resolution will speed up the conversion
* A resolution of 72,72 will create a 596x842 image
* Setting it to 36,36 will create a 298x421 image which should
* be sufficient in most cases, but keep in mind that images are
* not scaled up. Hence, a width of 400px still results in a 298px
* wide image
*/
$imagick->setResolution(36,36);
$imagick->setResolution(72,72);
$page = 0;
if(!empty($params['page']) && intval($params['page']) > 0)
$page = intval($params['page'])-1;
@ -71,6 +76,7 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
}
}
} catch (ImagickException $e) {
$this->success = false;
return false;
}
return false;

View File

@ -0,0 +1,144 @@
<?php
/**
* Implementation of conversion service class
*
* @category DMS
* @package SeedDMS
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2023 Uwe Steinmann
* @version Release: @package_version@
*/
require_once("inc/inc.ClassConversionServiceBase.php");
/**
* Implementation of conversion service from text to image
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2023 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_ConversionServiceTextToImage extends SeedDMS_ConversionServiceBase {
public function __construct($from, $to) {
parent::__construct();
$this->from = $from;
$this->to = $to;
}
public function getInfo() {
return "Convert with imagick php functions";
}
public function getAdditionalParams() { /* {{{ */
return [
['name'=>'width', 'type'=>'number', 'description'=>'Width of converted image'],
['name'=>'page', 'type'=>'number', 'description'=>'Page of text document'],
];
} /* }}} */
private function wordWrapAnnotation($image, $draw, $text, $maxWidth) { /* {{{ */
$words = preg_split('%\s%', trim($text), -1, PREG_SPLIT_NO_EMPTY);
$lines = array();
$i = 0;
$lineHeight = 0;
while (count($words) > 0) {
$metrics = $image->queryFontMetrics($draw, implode(' ', array_slice($words, 0, ++$i)));
$lineHeight = max($metrics['textHeight'], $lineHeight);
// check if we have found the word that exceeds the line width
if ($metrics['textWidth'] > $maxWidth or count($words) < $i) {
// handle case where a single word is longer than the allowed line width (just add this as a word on its own line?)
if ($i == 1)
$i++;
$lines[] = implode(' ', array_slice($words, 0, --$i));
$words = array_slice($words, $i);
$i = 0;
}
}
return array($lines, $lineHeight);
} /* }}} */
public function convert($infile, $target = null, $params = array()) { /* {{{ */
$boxWidth = 596;
$boxHeight = 842;
$boxTop = 30;
$boxBottom = 30;
$boxLeft = 30;
$boxRight = 30;
$parSep = 10;
$fontSize = 10;
$start = microtime(true);
$imagick = new Imagick();
/* Setting a smaller resolution will speed up the conversion
* A resolution of 72,72 will create a 596x842 image
* Setting it to 36,36 will create a 298x421 image which should
* be sufficient in most cases, but keep in mind that images are
* not scaled up. Hence, a width of 400px still results in a 298px
* wide image
*/
$imagick->setResolution(72,72);
$page = 0;
if(!empty($params['page']) && intval($params['page']) > 0)
$page = intval($params['page'])-1;
try {
if($imagick->newImage($boxWidth, $boxHeight, "white")) {
$draw = new ImagickDraw();
$draw->setStrokeColor("none");
$draw->setFont("Courier");
$draw->setFontSize($fontSize);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$content = file_get_contents($infile);
$lines = preg_split('~\R~',$content);
$boxY = $boxTop;
$pagecount = 0;
foreach($lines as $line) {
if($line) {
$rlines = $this->wordWrapAnnotation($imagick, $draw, $line, $boxWidth-$boxLeft-$boxRight);
foreach($rlines[0] as $rline) {
if($pagecount == $page && $boxY < ($boxHeight-$boxBottom)) {
$imagick->annotateImage($draw, $boxLeft, $boxY, 0, $rline);
}
$boxY = $boxY + $rlines[1];
}
} else {
$boxY += $parSep;
}
if($boxY >= ($boxHeight-$boxBottom)) {
$pagecount++;
$boxY = $boxTop;
if($pagecount > $page)
break;
}
}
if(!empty($params['width']))
$imagick->scaleImage(min((int) $params['width'], $imagick->getImageWidth()), 0);
$imagick->setImageFormat('png');
$end = microtime(true);
if($this->logger) {
$this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with text service took '.($end-$start).' sec.', PEAR_LOG_INFO);
}
if($target) {
return $imagick->writeImage($target);
} else {
return $imagick->getImageBlob();
}
}
} catch (ImagickException $e) {
return false;
}
return false;
} /* }}} */
}

View File

@ -24,6 +24,7 @@ require_once("inc/inc.ClassConversionServiceBase.php");
*/
class SeedDMS_ConversionServiceTextToText extends SeedDMS_ConversionServiceBase {
public function __construct($from, $to) {
parent::__construct();
$this->from = $from;
$this->to = $to;
}

View File

@ -24,6 +24,15 @@ require_once "inc.ClassAuthentication.php";
*/
class SeedDMS_DbAuthentication extends SeedDMS_Authentication {
var $dms;
var $settings;
public function __construct($dms, $settings) { /* {{{ */
$this->dms = $dms;
$this->settings = $settings;
} /* }}} */
/**
* Do Authentication
*
@ -32,29 +41,15 @@ class SeedDMS_DbAuthentication extends SeedDMS_Authentication {
* @return object|boolean user object if authentication was successful otherwise false
*/
public function authenticate($username, $password) { /* {{{ */
$settings = $this->settings;
$dms = $this->dms;
// Try to find user with given login.
if($user = $dms->getUserByLogin($username)) {
$userid = $user->getID();
// Check if password matches (if not a guest user)
// Assume that the password has been sent via HTTP POST. It would be careless
// (and dangerous) for passwords to be sent via GET.
// Check if password matches
if (!seed_pass_verify($password, $user->getPwd())) {
/* if counting of login failures is turned on, then increment its value */
$failures = $user->addLoginFailure();
if($settings->_loginFailure) {
if($failures >= $settings->_loginFailure)
$user->setDisabled(true);
}
if($settings->_loginDelay) {
if($failures > 1) {
$user->setDisabledUntil(($failures-1)*($failures-1)*3);
}
}
$user = false;
$user = null;
}
}

View File

@ -665,6 +665,7 @@ class SeedDMS_Extension_Mgr {
}
file_put_contents($this->cachedir."/".self::repos_list_file, $file);
} else {
$this->errmsgs[] = 'Could not fetch extension list';
return false;
}
}

View File

@ -7,17 +7,27 @@
* @license GPL 2
* @version @version@
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2016 Uwe Steinmann
* @copyright Copyright (C) 2021-2023 Uwe Steinmann
* @version Release: @package_version@
*/
/**
* Implementation of fulltext service
*
* The fulltext service is wrapper around single services for a full text
* search. Such a service can be based on Solr, SQlite, etc. It implements
* three major methods:
* IndexedDocument() for creating an instance of an indexed document
* Indexer() for creating an instance of the index
* Search() fro creating an instance of a search frontend
*
* Though this class can manage more than one service, it will only
* use the first one.
*
* @category DMS
* @package SeedDMS
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright Copyright (C) 2016 Uwe Steinmann
* @copyright Copyright (C) 2021-2023 Uwe Steinmann
* @version Release: @package_version@
*/
class SeedDMS_FulltextService {
@ -54,6 +64,7 @@ class SeedDMS_FulltextService {
$this->services = array();
$this->converters = array();
$this->conversionmgr = null;
$this->previewer = null;
$this->logger = null;
$this->maxsize = 0;
$this->index = null;
@ -93,8 +104,75 @@ class SeedDMS_FulltextService {
$this->cmdtimeout = $timeout;
}
public function setPreviewer($previewer) {
$this->previewer = $previewer;
}
/**
* Return an indexable document from the given document or folder
* Returns callback function to convert a document into plain text
*
* This variant just uses the conversion manager and does not
* cache the converted document
*/
public function getConversionCallback() { /* {{{ */
$conversionmgr = $this->conversionmgr;
return function($object) use ($conversionmgr) {
$result = ['content'=>false, 'cmd'=>'', 'errormsg'=>''];
if(!$conversionmgr)
return $result;
if($object->isType('document')) {
$dms = $object->getDMS();
$version = $object->getLatestContent();
$mimetype = $version->getMimeType();
$path = $dms->contentDir . $version->getPath();
if(file_exists($path)) {
if($service = $conversionmgr->getService($mimetype, 'text/plain')) {
$content = $conversionmgr->convert($path, $mimetype, 'text/plain');
if($content) {
$result['content'] = $content;
} elseif($content === false) {
$result['errormsg'] = 'Conversion failed';
}
$result['cmd'] = get_class($service);
} else {
$result['cmd'] = 'No service to convert '.$mimetype.' to text/plain';
}
}
}
return $result;
};
} /* }}} */
/**
* Returns callback function to convert a document into plain text
*
* This variant uses the text previewer which
* caches the converted document
*/
public function getConversionWithPreviewCallback() { /* {{{ */
$previewer = $this->previewer;
return function($object) use ($previewer) {
$result = ['content'=>false, 'cmd'=>'', 'errormsg'=>''];
if($object->isType('document')) {
$dms = $object->getDMS();
$version = $object->getLatestContent();
if($previewer->createPreview($version)) {
if($previewer->hasPreview($version)) {
$filename = $previewer->getFileName($version).'.txt';
$result['content'] = file_get_contents($filename);
$result['cmd'] = 'previewer '.$previewer->getFileSize($version);
}
} else {
$result['cmd'] = 'previewer';
$result['errormsg'] = 'Creating preview failed';
}
}
return $result;
};
} /* }}} */
/**
* Return an indexable document based on the given document or folder
*
* @param SeedDMS_Core_Document|SeedDMS_Core_Folder $object document or folder
* to be indexed
@ -108,13 +186,14 @@ class SeedDMS_FulltextService {
$nocontent = $object->getLatestContent()->getFileSize() > $this->maxsize && $this->maxsize && !$forceupdate;
else
$nocontent = true;
return new $this->services[0]['IndexedDocument']($object->getDMS(), $object, $this->conversionmgr ? $this->conversionmgr : $this->converters, $nocontent, $this->cmdtimeout);
$convcallback = $this->getConversionWithPreviewCallback();
return new $this->services[0]['IndexedDocument']($object->getDMS(), $object, $convcallback /*$this->conversionmgr ? $this->conversionmgr : $this->converters*/, $nocontent, $this->cmdtimeout);
}
/**
* Returns an instance of the indexer
*
* The indexer provides access to fulltext index. It allows to add and
* The indexer provides access to the fulltext index. It allows to add and
* get documents.
*
* @return object instance of class specified in 'Indexer'

View File

@ -24,6 +24,15 @@ require_once "inc.ClassAuthentication.php";
*/
class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
var $dms;
var $settings;
public function __construct($dms, $settings) { /* {{{ */
$this->dms = $dms;
$this->settings = $settings;
} /* }}} */
/**
* Do ldap authentication
*
@ -84,7 +93,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
$bind = @ldap_bind($ds);
}
$dn = false;
/* If bind succeed, then get the dn of for the user */
/* If bind succeed, then get the dn of the user */
if ($bind) {
if (isset($settings->_ldapFilter) && strlen($settings->_ldapFilter) > 0) {
$search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.$username.")".$settings->_ldapFilter.")");
@ -106,7 +115,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
$dn = $tmpDN;
}
/* No do the actual authentication of the user */
/* Now do the actual authentication of the user */
$bind = @ldap_bind($ds, $dn, $password);
$user = $dms->getUserByLogin($username);
if($user === false) {
@ -134,17 +143,6 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
}
}
} elseif($user) {
$userid = $user->getID();
$failures = $user->addLoginFailure();
if($settings->_loginFailure) {
if($failures >= $settings->_loginFailure)
$user->setDisabled(true);
}
if($settings->_loginDelay) {
if($failures > 1) {
$user->setDisabledUntil(($failures-1)*($failures-1)*3);
}
}
$user = false;
}
ldap_close($ds);

View File

@ -5,19 +5,19 @@ $conversionmgr = new SeedDMS_ConversionMgr();
if(!empty($settings->_converters['preview'])) {
foreach($settings->_converters['preview'] as $mimetype=>$cmd) {
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'image/png', $cmd))->setLogger($logger);
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'image/png', $cmd), $settings->_cmdTimeout)->setLogger($logger);
}
}
if(!empty($settings->_converters['pdf'])) {
foreach($settings->_converters['pdf'] as $mimetype=>$cmd) {
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'application/pdf', $cmd))->setLogger($logger);
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'application/pdf', $cmd, $settings->_cmdTimeout))->setLogger($logger);
}
}
if(!empty($settings->_converters['fulltext'])) {
foreach($settings->_converters['fulltext'] as $mimetype=>$cmd) {
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'text/plain', $cmd))->setLogger($logger);
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'text/plain', $cmd, $settings->_cmdTimeout))->setLogger($logger);
}
}
@ -34,6 +34,10 @@ if(extension_loaded('gd') || extension_loaded('imagick')) {
$conversionmgr->addService(new SeedDMS_ConversionServiceImageToImage('image/gif', 'image/png'))->setLogger($logger);
}
if(extension_loaded('imagick')) {
$conversionmgr->addService(new SeedDMS_ConversionServiceTextToImage('text/plain', 'image/png'))->setLogger($logger);
}
$conversionmgr->addService(new SeedDMS_ConversionServiceImageToText('image/jpeg', 'text/plain'))->setLogger($logger);
$conversionmgr->addService(new SeedDMS_ConversionServiceImageToText('image/jpg', 'text/plain'))->setLogger($logger);

View File

@ -21,7 +21,7 @@
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDB'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDB'] as $hookObj) {
if (method_exists($hookObj, 'pretInitDB')) {
$hookObj->preInitDB(array('settings'=>$settings));
$hookObj->preInitDB(array('settings'=>$settings, 'logger'=>$logger));
}
}
}
@ -32,7 +32,7 @@ $db->connect() or die ("Could not connect to db-server \"" . $settings->_dbHostn
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDB'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDB'] as $hookObj) {
if (method_exists($hookObj, 'postInitDB')) {
$hookObj->postInitDB(array('db'=>$db, 'settings'=>$settings));
$hookObj->postInitDB(array('db'=>$db, 'settings'=>$settings, 'logger'=>$logger));
}
}
}
@ -40,7 +40,7 @@ if(isset($GLOBALS['SEEDDMS_HOOKS']['initDB'])) {
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) {
if (method_exists($hookObj, 'pretInitDMS')) {
$hookObj->preInitDMS(array('db'=>$db, 'settings'=>$settings));
$hookObj->preInitDMS(array('db'=>$db, 'settings'=>$settings, 'logger'=>$logger));
}
}
}
@ -61,7 +61,7 @@ $dms->setMaxDirID($settings->_maxDirID);
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) {
if (method_exists($hookObj, 'postInitDMS')) {
$hookObj->postInitDMS(array('dms'=>$dms, 'settings'=>$settings));
$hookObj->postInitDMS(array('dms'=>$dms, 'settings'=>$settings, 'logger'=>$logger));
}
}
}
@ -69,3 +69,8 @@ if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
require_once('inc/inc.Tasks.php');
require_once("inc.ConversionInit.php");
require_once('inc.FulltextInit.php');
require_once('inc.AuthenticationInit.php');
require_once("inc.ClassNotificationService.php");
require_once("inc.ClassEmailNotify.php");
require_once('inc.Notification.php');

View File

@ -16,8 +16,6 @@ global $logger;
require "inc.ClassExtensionMgr.php";
require_once "inc.ClassSchedulerTaskBase.php";
require_once "inc.ClassExtBase.php";
require_once "inc.Version.php";
require_once "inc.Utils.php";
$extMgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cacheDir, $settings->_repositoryUrl, $settings->_proxyUrl, $settings->_proxyUser, $settings->_proxyPassword);

View File

@ -33,8 +33,10 @@ if($settings->_enableFullSearch) {
$indexconf = null;
if(isset($GLOBALS['SEEDDMS_HOOKS']['initFulltext'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initFulltext'] as $hookObj) {
if (method_exists($hookObj, 'initFulltextService')) {
$indexconf = $hookObj->initFulltextService(array('engine'=>$settings->_fullSearchEngine, 'dms'=>$dms, 'settings'=>$settings));
if (method_exists($hookObj, 'isFulltextService') && $hookObj->isFulltextService($settings->_fullSearchEngine)) {
if (method_exists($hookObj, 'initFulltextService')) {
$indexconf = $hookObj->initFulltextService(array('engine'=>$settings->_fullSearchEngine, 'dms'=>$dms, 'settings'=>$settings));
}
}
}
}
@ -42,9 +44,15 @@ if($settings->_enableFullSearch) {
$fulltextservice->addService($settings->_fullSearchEngine, $indexconf);
}
}
/* setConverters() is deprecated */
$fulltextservice->setConverters(isset($settings->_converters['fulltext']) ? $settings->_converters['fulltext'] : null);
$fulltextservice->setConversionMgr($conversionmgr);
$fulltextservice->setMaxSize($settings->_maxSizeForFullText);
$fulltextservice->setCmdTimeout($settings->_cmdTimeout);
require_once("SeedDMS/Preview.php");
$txtpreviewer = new SeedDMS_Preview_TxtPreviewer($settings->_cacheDir, $settings->_cmdTimeout, $settings->_enableXsendfile);
if($conversionmgr)
$txtpreviewer->setConversionMgr($conversionmgr);
$fulltextservice->setPreviewer($txtpreviewer);
}

View File

@ -19,18 +19,7 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("Log.php");
require_once("inc/inc.Utils.php");
if ($settings->_logFileEnable) {
if ($settings->_logFileRotation=="h") $logname=date("YmdH", time());
else if ($settings->_logFileRotation=="d") $logname=date("Ymd", time());
else $logname=date("Ym", time());
$logger = getLogger();
if(!file_exists($settings->_contentDir.'log'))
@mkdir($settings->_contentDir.'log');
if(file_exists($settings->_contentDir.'log') && is_dir($settings->_contentDir.'log'))
$logger = Log::factory('file', $settings->_contentDir.'log/'.$logname.'.log');
else
$logger = null;
} else {
$logger = null;
}

View File

@ -83,3 +83,5 @@ ini_set('include_path', $settings->_rootDir.'../pear'. PATH_SEPARATOR .ini_get('
/* composer is installed in pear directory, but install tool does not need it */
if(!defined("SEEDDMS_INSTALL"))
require_once 'vendor/autoload.php';
require_once "inc.Version.php";

View File

@ -125,17 +125,33 @@ class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
protected $fulltextservice;
public function __construct($scheduler, $fulltextservice, $forceupdate) { /* {{{ */
protected $logger;
protected $dacount;
protected $facount;
protected $ducount;
protected $fucount;
public function __construct($scheduler, $fulltextservice, $forceupdate, $logger) { /* {{{ */
$this->scheduler = $scheduler;
$this->fulltextservice = $fulltextservice;
$this->logger = $logger;
$this->forceupdate = $forceupdate;
$this->numdocs = $this->fulltextservice->Indexer()->count();
$this->dacount = 0;
$this->facount = 0;
$this->ducount = 0;
$this->fucount = 0;
} /* }}} */
public function process($folder, $depth=0) { /* {{{ */
$lucenesearch = $this->fulltextservice->Search();
$documents = $folder->getDocuments();
echo str_repeat(' ', $depth+1).$folder->getId().":".$folder->getFolderPathPlain()." ";
$logger = $this->logger;
// echo str_repeat(' ', $depth+1).$folder->getId().":".$folder->getFolderPathPlain()." ";
if(($this->numdocs == 0) || !($hit = $lucenesearch->getFolder($folder->getId()))) {
try {
$idoc = $this->fulltextservice->IndexedDocument($folder, true);
@ -149,26 +165,30 @@ class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
}
}
$this->fulltextservice->Indexer()->addDocument($idoc);
echo "(".getMLText('index_folder_added').")".PHP_EOL;
// echo "(".getMLText('index_folder_added').")".PHP_EOL;
$logger->log('Task \'indexingdocs\': folder '.$folder->getId().' added', PEAR_LOG_INFO);
$this->facount++;
} else {
echo "(".$error.")".PHP_EOL;
// echo "(".$error.")".PHP_EOL;
$logger->log('Task \'indexingdocs\': adding folder '.$folder->getId().' failed', PEAR_LOG_ERR);
}
} catch(Exception $e) {
echo "(Timeout)".PHP_EOL;
// echo "(Timeout)".PHP_EOL;
$logger->log('Task \'indexingdocs\': adding folder '.$folder->getId().' failed', PEAR_LOG_ERR);
}
} else {
/* Check if the attribute created is set or has a value older
/* Check if the attribute indexed is set or has a value older
* than the lastet content. Folders without such an attribute
* where added when a new folder was added to the dms. In such
* a case the folder content wasn't indexed.
*/
try {
$created = (int) $hit->getDocument()->getFieldValue('created');
$indexed = (int) $hit->getDocument()->getFieldValue('indexed');
} catch (/* Zend_Search_Lucene_ */Exception $e) {
$created = 0;
$indexed = 0;
}
if($created >= $folder->getDate() && !$this->forceupdate) {
echo "(".getMLText('index_folder_unchanged').")".PHP_EOL;
if($indexed >= $folder->getDate() && !$this->forceupdate) {
// echo "(".getMLText('index_folder_unchanged').")".PHP_EOL;
} else {
$this->fulltextservice->Indexer()->delete($hit->id);
try {
@ -183,18 +203,22 @@ class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
}
}
$this->fulltextservice->Indexer()->addDocument($idoc);
echo "(".getMLText('index_folder_updated').")".PHP_EOL;
// echo "(".getMLText('index_folder_updated').")".PHP_EOL;
$logger->log('Task \'indexingdocs\': folder '.$folder->getId().' updated', PEAR_LOG_INFO);
$this->fucount++;
} else {
echo "(".$error.")".PHP_EOL;
// echo "(".$error.")".PHP_EOL;
$logger->log('Task \'indexingdocs\': updating folder '.$folder->getId().' failed', PEAR_LOG_ERR);
}
} catch(Exception $e) {
echo "(Timeout)".PHP_EOL;
// echo "(Timeout)".PHP_EOL;
$logger->log('Task \'indexingdocs\': updating folder '.$folder->getId().' failed. '.$e->getMessage(), PEAR_LOG_ERR);
}
}
}
if($documents) {
foreach($documents as $document) {
echo str_repeat(' ', $depth+2).$document->getId().":".$document->getName()." ";
// echo str_repeat(' ', $depth+2).$document->getId().":".$document->getName()." ";
/* If the document wasn't indexed before then just add it */
if(($this->numdocs == 0) || !($hit = $lucenesearch->getDocument($document->getId()))) {
try {
@ -206,46 +230,67 @@ class SeedDMS_Task_Indexer_Process_Folder { /* {{{ */
}
}
}
$this->fulltextservice->Indexer()->addDocument($idoc);
echo "(".getMLText('index_document_added').")".PHP_EOL;
if($this->fulltextservice->Indexer()->addDocument($idoc)) {
// echo "(".getMLText('index_document_added').")".PHP_EOL;
$logger->log('Task \'indexingdocs\': document '.$document->getId().' added', PEAR_LOG_INFO);
} else {
$logger->log('Task \'indexingdocs\': adding document '.$document->getId().' failed', PEAR_LOG_ERR);
}
$this->dacount++;
} catch(Exception $e) {
echo "(Timeout)".PHP_EOL;
// echo "(Timeout)".PHP_EOL;
$logger->log('Task \'indexingdocs\': adding document '.$document->getId().' failed. '.$e->getMessage(), PEAR_LOG_ERR);
}
} else {
/* Check if the attribute created is set or has a value older
/* Check if the attribute indexed is set or has a value older
* than the lastet content. Documents without such an attribute
* where added when a new document was added to the dms. In such
* a case the document content wasn't indexed.
*/
try {
$created = (int) $hit->getDocument()->getFieldValue('created');
$indexed = (int) $hit->getDocument()->getFieldValue('indexed');
} catch (/* Zend_Search_Lucene_ */Exception $e) {
$created = 0;
$indexed = 0;
}
$content = $document->getLatestContent();
if($created >= $content->getDate() && !$this->forceupdate) {
echo "(".getMLText('index_document_unchanged').")".PHP_EOL;
} else {
$this->fulltextservice->Indexer()->delete($hit->id);
try {
$idoc = $this->fulltextservice->IndexedDocument($document, true);
if(isset($GLOBALS['SEEDDMS_HOOKS']['indexDocument'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['indexDocument'] as $hookObj) {
if (method_exists($hookObj, 'preIndexDocument')) {
$hookObj->preIndexDocument(null, $document, $idoc);
if($content) {
if($indexed >= $content->getDate() && !$this->forceupdate) {
// echo "(".getMLText('index_document_unchanged').")".PHP_EOL;
} else {
$this->fulltextservice->Indexer()->delete($hit->id);
try {
$idoc = $this->fulltextservice->IndexedDocument($document, true);
if(isset($GLOBALS['SEEDDMS_HOOKS']['indexDocument'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['indexDocument'] as $hookObj) {
if (method_exists($hookObj, 'preIndexDocument')) {
$hookObj->preIndexDocument(null, $document, $idoc);
}
}
}
if($this->fulltextservice->Indexer()->addDocument($idoc)) {
// echo "(".getMLText('index_document_updated').")".PHP_EOL;
$logger->log('Task \'indexingdocs\': document '.$document->getId().' updated', PEAR_LOG_INFO);
} else {
$logger->log('Task \'indexingdocs\': updating document '.$document->getId().' failed', PEAR_LOG_ERR);
}
$this->ducount++;
} catch(Exception $e) {
// echo "(Timeout)".PHP_EOL;
$logger->log('Task \'indexingdocs\': updating document '.$document->getId().' failed', PEAR_LOG_ERR);
}
$this->fulltextservice->Indexer()->addDocument($idoc);
echo "(".getMLText('index_document_updated').")".PHP_EOL;
} catch(Exception $e) {
echo "(Timeout)".PHP_EOL;
}
} else {
// echo "(Missing content)".PHP_EOL;
$logger->log('Task \'indexingdocs\': document '.$document->getId().' misses content', PEAR_LOG_ERR);
}
}
}
}
} /* }}} */
public function statistics() {
return array('folder'=>array('add'=>$this->facount, 'update'=>$this->fucount), 'document'=>array('add'=>$this->dacount, 'update'=>$this->ducount));
}
} /* }}} */
/**
@ -287,9 +332,11 @@ class SeedDMS_IndexingDocumentsTask extends SeedDMS_SchedulerTaskBase { /* {{{ *
}
}
$folderprocess = new SeedDMS_Task_Indexer_Process_Folder($this, $fulltextservice, $recreate);
$folderprocess = new SeedDMS_Task_Indexer_Process_Folder($this, $fulltextservice, $recreate, $logger);
call_user_func(array($folderprocess, 'process'), $folder, -1);
$tree = new SeedDMS_FolderTree($folder, array($folderprocess, 'process'));
$stat = $folderprocess->statistics();
$logger->log('Task \'indexingdocs\': '.$stat['folder']['add'].' folders added, '.$stat['folder']['update'].' folders updated, '.$stat['document']['add'].' documents added, '.$stat['document']['update'].' documents updated', PEAR_LOG_INFO);
} else {
$logger->log('Task \'indexingdocs\': fulltext search is turned off', PEAR_LOG_WARNING);
}

View File

@ -395,7 +395,7 @@ function getFilenameByDocname($content) { /* {{{ */
return mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $filename);
} /* }}} */
function getLogger($prefix='') { /* {{{ */
function getLogger($prefix='', $mask=PEAR_LOG_INFO) { /* {{{ */
global $settings;
if($settings->_logFileEnable) {
@ -407,7 +407,7 @@ function getLogger($prefix='') { /* {{{ */
@mkdir($settings->_contentDir.'log');
if(file_exists($settings->_contentDir.'log') && is_dir($settings->_contentDir.'log')) {
$logger = Log::factory('file', $logname);
$logger->setMask(Log::MAX(PEAR_LOG_DEBUG));
$logger->setMask(Log::MAX($mask));
} else
$logger = null;
} else {
@ -1142,7 +1142,7 @@ class SeedDMS_JwtToken { /* {{{ */
class SeedDMS_FolderTree { /* {{{ */
public function __construct($folder, $callback) { /* {{{ */
$iter = new \SeedDMS\RecursiveFolderIterator($folder);
$iter = new \SeedDMS\Core\RecursiveFolderIterator($folder);
$iter2 = new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::SELF_FIRST);
foreach($iter2 as $ff) {
call_user_func($callback, $ff, $iter2->getDepth());

View File

@ -20,12 +20,12 @@
include("inc/inc.Settings.php");
if(true) {
include("inc/inc.LogInit.php");
include("inc/inc.Utils.php");
include("inc/inc.Language.php");
include("inc/inc.Init.php");
include("inc/inc.Extension.php");
include("inc/inc.DBInit.php");
require_once("inc/inc.Utils.php");
require_once("inc/inc.LogInit.php");
require_once("inc/inc.Language.php");
require_once("inc/inc.Init.php");
require_once("inc/inc.Extension.php");
require_once("inc/inc.DBInit.php");
require "vendor/autoload.php";
@ -53,11 +53,19 @@ if(true) {
};
};
$app = new \Slim\App($c);
$container = $app->getContainer();
$container['dms'] = $dms;
$container['config'] = $settings;
$container['conversionmgr'] = $conversionmgr;
$container['logger'] = $logger;
$container['fulltextservice'] = $fulltextservice;
$container['notifier'] = $notifier;
$container['authenticator'] = $authenticator;
if(isset($GLOBALS['SEEDDMS_HOOKS']['initDMS'])) {
foreach($GLOBALS['SEEDDMS_HOOKS']['initDMS'] as $hookObj) {
if (method_exists($hookObj, 'addRoute')) {
$hookObj->addRoute(array('dms'=>$dms, 'app'=>$app, 'settings'=>$settings));
$hookObj->addRoute(array('dms'=>$dms, 'app'=>$app, 'settings'=>$settings, 'conversionmgr'=>$conversionmgr, 'authenticator'=>$authenticator, 'fulltextservice'=>$fulltextservice, 'logger'=>$logger));
// } else {
// include("inc/inc.Authentication.php");
// if (method_exists($hookObj, 'addRouteAfterAuthentication')) {

View File

@ -514,6 +514,7 @@ URL: [url]',
'dump_remove' => 'ازالة الملف المستخرج',
'duplicates' => 'تكرارات',
'duplicate_content' => 'المحتوى متكرر',
'duplicate_sequences' => '',
'edit' => 'تعديل',
'edit_attributes' => 'تعديل السمات',
'edit_comment' => 'تعديل تعليق',
@ -620,6 +621,7 @@ URL: [url]',
'extension_mgr_repository' => 'مستودع إدارة الإضافات',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'لائحة الإضافات حسب الإصدار',
'february' => 'فبراير',
@ -753,6 +755,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => 'فهرسة بلا محتوى',
'index_pending' => 'الفهرسة قيد الإنتظار',
'index_processing' => '',
'index_waiting' => 'الفهرسة قيد الإنتظار',
'individuals' => 'افراد',
'individuals_in_groups' => 'أفراد في المجموعات',
@ -903,6 +906,7 @@ URL: [url]',
'move_clipboard' => 'تحريك القصاصة',
'move_document' => 'تحريك مستند',
'move_folder' => 'تحريك مجلد',
'move_into_rootfolder' => '',
'my_account' => 'حسابي',
'my_documents' => 'مستنداتي',
'my_transmittals' => 'الإحالات الخاصة بي',
@ -1045,6 +1049,7 @@ Parent folder: [folder_path]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - تم تغيير المالك',
'parent_folder' => '',
'password' => 'كلمة السر',
'password_already_used' => 'كلمة السر بالفعل تم ارسالها',
'password_expiration' => 'انتهاء صلاحية كلمة السر',
@ -1082,6 +1087,7 @@ URL: [url]',
'preview' => 'معاينة',
'preview_converters' => 'محول المعاينات',
'preview_images' => 'معاينة الصور',
'preview_images_text' => '',
'preview_markdown' => 'معاينة التخفيضات',
'preview_pdf' => 'معاينة ملف pdf',
'preview_plain' => 'معاينة سطحية',
@ -1094,6 +1100,7 @@ URL: [url]',
'quota_exceeded' => 'لقد قمت بتعدي المساحة المخصصة لك بمقدار [bytes].',
'quota_is_disabled' => 'الغيت الكوتا',
'quota_warning' => 'اقصى مساحة للقرص الصلب تم تعديها بمقدار [bytes]. من فضلك قم بمسح بعض المستندات او اصدارات سابقة منها',
'readme_loading' => '',
'receipts_accepted' => 'تم الموافقة على الوصول',
'receipts_accepted_latest' => '',
'receipts_not_touched' => 'الوصول غير ملموسة',
@ -1779,6 +1786,7 @@ URL: [url]',
'set_password' => 'تحديد كلمة السر',
'set_workflow' => 'تحديد مسار العمل',
'show_extension_changelog' => 'تغيير سجل',
'show_extension_readme' => '',
'show_extension_version_list' => 'لائحة الإصدارات',
'signed_in_as' => 'تسجيل الدخول بإسم',
'sign_in' => 'تسجيل الدخول',
@ -2042,6 +2050,7 @@ URL: [url]',
'update_approvers' => 'تحديثة قائمة الموافقون',
'update_document' => 'تحديث المستند',
'update_fulltext_index' => 'تحديث فهرس النص الكامل',
'update_fulltext_messages' => '',
'update_info' => 'تحديث المعلومات',
'update_locked_msg' => 'هذا المستند محمي من التعديل.',
'update_recipients' => 'تطوير المستلم',

View File

@ -467,6 +467,7 @@ $text = array(
'dump_remove' => 'Изтрий дъмп',
'duplicates' => '',
'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'Редактирай',
'edit_attributes' => 'Редактирай атрибути',
'edit_comment' => 'Редактирай коментар',
@ -569,6 +570,7 @@ $text = array(
'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '',
'february' => 'Февруари',
@ -682,6 +684,7 @@ $text = array(
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => '',
'individuals' => 'Личности',
'individuals_in_groups' => '',
@ -832,6 +835,7 @@ $text = array(
'move_clipboard' => '',
'move_document' => 'Премести документ',
'move_folder' => 'Премести папка',
'move_into_rootfolder' => '',
'my_account' => 'Моя акаунт',
'my_documents' => 'Моите документи',
'my_transmittals' => 'Моите предавания',
@ -944,6 +948,7 @@ $text = array(
'ownership_changed_email_body' => '',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '',
'parent_folder' => '',
'password' => 'Парола',
'password_already_used' => 'Вече използвана парола',
'password_expiration' => 'Паролата изтича',
@ -981,6 +986,7 @@ $text = array(
'preview' => 'Преглед',
'preview_converters' => '',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '',
'preview_pdf' => '',
'preview_plain' => '',
@ -993,6 +999,7 @@ $text = array(
'quota_exceeded' => 'Вашата дискова квота е превишена с [bytes].',
'quota_is_disabled' => '',
'quota_warning' => 'Вашето max. използуване на диска е превишена с [bytes]. Please remove documents or previous versions.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1642,6 +1649,7 @@ $text = array(
'set_password' => 'Установи парола',
'set_workflow' => 'Установи процес',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => 'Вход като',
'sign_in' => 'вход',
@ -1896,6 +1904,7 @@ $text = array(
'update_approvers' => 'Обнови списъка с утвърждаващи',
'update_document' => 'Обнови документ',
'update_fulltext_index' => 'Обнови пълнотекстовия индекс',
'update_fulltext_messages' => '',
'update_info' => 'Обнови информацията',
'update_locked_msg' => 'Този документ е блокиран',
'update_recipients' => '',

View File

@ -472,6 +472,7 @@ URL: [url]',
'dump_remove' => 'Eliminar fitxer de bolcat',
'duplicates' => '',
'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'editar',
'edit_attributes' => 'Editar atributs',
'edit_comment' => 'Editar comentari',
@ -574,6 +575,7 @@ URL: [url]',
'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '',
'february' => 'Febrer',
@ -687,6 +689,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => '',
'individuals' => 'Individuals',
'individuals_in_groups' => '',
@ -837,6 +840,7 @@ URL: [url]',
'move_clipboard' => '',
'move_document' => 'Moure document',
'move_folder' => 'Moure directori',
'move_into_rootfolder' => '',
'my_account' => 'El meu compte',
'my_documents' => 'Els meus documents',
'my_transmittals' => 'Documents enviats per mi',
@ -949,6 +953,7 @@ URL: [url]',
'ownership_changed_email_body' => '',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '',
'parent_folder' => '',
'password' => 'Contrasenya',
'password_already_used' => '',
'password_expiration' => '',
@ -986,6 +991,7 @@ URL: [url]',
'preview' => 'Previsualitzar',
'preview_converters' => '',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '',
'preview_pdf' => '',
'preview_plain' => '',
@ -998,6 +1004,7 @@ URL: [url]',
'quota_exceeded' => '',
'quota_is_disabled' => '',
'quota_warning' => '',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1647,6 +1654,7 @@ URL: [url]',
'set_password' => '',
'set_workflow' => '',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => 'Connectat com',
'sign_in' => 'sign in',
@ -1901,6 +1909,7 @@ URL: [url]',
'update_approvers' => 'Actualitzar llista d\'aprovadors',
'update_document' => 'Actualitzar',
'update_fulltext_index' => 'Update fulltext index',
'update_fulltext_messages' => '',
'update_info' => 'Actualitzar informació',
'update_locked_msg' => 'Aquest document està bloquejat.',
'update_recipients' => '',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => 'Odstranit soubor zálohy',
'duplicates' => 'Duplikáty',
'duplicate_content' => 'Duplicitní obsah',
'duplicate_sequences' => '',
'edit' => 'upravit',
'edit_attributes' => 'Editovat atributy',
'edit_comment' => 'Upravit komentář',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => 'Dostupný',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Verze',
'february' => 'Únor',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => 'Nenaindexoval se obsah',
'index_pending' => 'Probíhá indexování',
'index_processing' => '',
'index_waiting' => 'Čekání',
'individuals' => 'Jednotlivci',
'individuals_in_groups' => 'Členové skupiny',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => 'Přesun schránky',
'move_document' => 'Přesunout dokument',
'move_folder' => 'Přesun složky',
'move_into_rootfolder' => '',
'my_account' => 'Můj účet',
'my_documents' => 'Moje dokumenty',
'my_transmittals' => 'Moje přenosy',
@ -1076,6 +1080,7 @@ Uživatel: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Vlastník změněn',
'parent_folder' => '',
'password' => 'Heslo',
'password_already_used' => 'Heslo již použité',
'password_expiration' => 'Vypršení platnosti hesla',
@ -1117,6 +1122,7 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm
'preview' => 'Náhled',
'preview_converters' => 'Náhled převodu dokumentu',
'preview_images' => 'Náhled obrázků',
'preview_images_text' => '',
'preview_markdown' => 'Náhled úpravy textu Markdown',
'preview_pdf' => 'Náhled jako PDF',
'preview_plain' => 'Náhled jako text',
@ -1129,6 +1135,7 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm
'quota_exceeded' => 'Vaše kvóta disku je překročena o [bytes].',
'quota_is_disabled' => 'Podpora kvót je v současné době zakázána v nastavení. Nastavení uživatelských kvót nebude mít žádný vliv, dokud se znovu neaktivuje.',
'quota_warning' => 'Vaše maximální využití disku je překročeno o [bajtů]. Prosím, odstraňte dokumenty nebo předchozí verze.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] potvrzení přijetí již přijato',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '[no_receipts] potvrzení přijetí nebylo dotčeno',
@ -1851,6 +1858,7 @@ Jméno: [username]
'set_password' => 'Nastavení hesla',
'set_workflow' => 'Nastavit workflow',
'show_extension_changelog' => 'Zobrazit Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Zobrazit seznam verzí',
'signed_in_as' => 'Přihlášen jako',
'sign_in' => 'Přihlásit',
@ -2114,6 +2122,7 @@ URL: [url]',
'update_approvers' => 'Aktualizovat seznam schvalovatelů',
'update_document' => 'Aktualizovat',
'update_fulltext_index' => 'Aktualizovat fulltext index',
'update_fulltext_messages' => '',
'update_info' => 'Aktualizovat informace',
'update_locked_msg' => 'Tento dokument je zamčený.',
'update_recipients' => 'Aktualizovat příjemce',

View File

@ -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 (3143), dgrutsch (22)
// Translators: Admin (3154), dgrutsch (22)
$text = array(
'2_factor_auth' => '2-Faktor Authentifizierung',
@ -632,13 +632,14 @@ URL: [url]</p>',
'dropfolder_metadata' => 'Metadaten der zu importierenen Dateien',
'dropupload' => 'Direkt Hochladen',
'drop_files_here' => 'Dateien hier hin ziehen!',
'drop_files_here_or_click' => 'Dateien hier hin ziehen oder Klicken!',
'drop_files_here_or_click' => 'Dateien hier hin ziehen oder Klicken zum Hochladen!',
'dump_creation' => 'DB dump erzeugen',
'dump_creation_warning' => 'Mit dieser Operation können Sie einen Dump der Datenbank erzeugen. Nach der Erstellung wird der Dump im Datenordner Ihres Servers gespeichert.',
'dump_list' => 'Vorhandene DB dumps',
'dump_remove' => 'DB dump löschen',
'duplicates' => 'Duplikate',
'duplicate_content' => 'Doppelte Dateien',
'duplicate_sequences' => 'Doppelte Sequenznummer in einem Ordner',
'edit' => 'Bearbeiten',
'edit_attributes' => 'Attribute bearbeiten',
'edit_comment' => 'Kommentar bearbeiten',
@ -751,6 +752,7 @@ URL: [url]</p>',
'extension_mgr_repository' => 'Verfügbar',
'extension_mgr_upload_disabled' => 'Der Upload neuer Erweiterungen ist nicht möglich, weil dies in den Einstellungen ausgeschaltet ist.',
'extension_missing_name' => 'Kein Erweiterungsname übergeben',
'extension_readme' => 'Readme',
'extension_toggle_error' => 'Konnte Erweiterung nicht aus/einschalten',
'extension_version_list' => 'Versionen',
'february' => 'Februar',
@ -852,7 +854,7 @@ Old name: [old_name]<br />
Benutzer: [username]<br />
URL: [url]</p>',
'folder_renamed_email_subject' => '[sitename]: [name] - Ordner umbenannt',
'folder_title' => 'SeedDMS - Ordner: [foldername]',
'folder_title' => 'Ordner: [foldername]',
'foot_note' => '',
'force_update' => 'Aktualisieren',
'friday' => 'Freitag',
@ -927,6 +929,7 @@ URL: [url]</p>',
'index_folder_updated' => 'Ordner aktualisiert',
'index_no_content' => 'Inhalt nicht indiziert',
'index_pending' => 'Vorgemerkt',
'index_processing' => 'Verarbeite ...',
'index_waiting' => 'Warte',
'individuals' => 'Einzelpersonen',
'individuals_in_groups' => 'Mitglieder einer Gruppe',
@ -1077,6 +1080,7 @@ URL: [url]</p>',
'move_clipboard' => 'Zwischenablage in Ordner verschieben',
'move_document' => 'Verschieben',
'move_folder' => 'Verschieben',
'move_into_rootfolder' => 'In den Wurzelordner verschieben',
'my_account' => 'Mein Profil',
'my_documents' => 'Meine Dokumente',
'my_transmittals' => 'Meine Dokumentenlisten',
@ -1256,6 +1260,7 @@ Neuer Besitzer: [new_owner]<br />
Benutzer: [username]<br />
URL: [url]</p>',
'ownership_changed_email_subject' => '[sitename]: [name] - Besitzer geändert',
'parent_folder' => 'Elternordner',
'password' => 'Passwort',
'password_already_used' => 'Passwort schon einmal verwendet',
'password_expiration' => 'Ablauf eines Passworts',
@ -1309,6 +1314,7 @@ Sollen Sie danach immer noch Probleme bei der Anmeldung haben, dann kontaktieren
'preview' => 'Vorschau',
'preview_converters' => 'Vorschau Dokumentenumwandlung',
'preview_images' => 'Vorschaubilder',
'preview_images_text' => 'Vorschaubilder und Textinhalt',
'preview_markdown' => 'Markdown',
'preview_pdf' => 'Vorschau als PDF',
'preview_plain' => 'Text',
@ -1321,6 +1327,7 @@ Sollen Sie danach immer noch Probleme bei der Anmeldung haben, dann kontaktieren
'quota_exceeded' => 'Ihr maximal verfügbarer Plattenplatz wurde um [bytes] überschritten.',
'quota_is_disabled' => 'Quota-Unterstützung ist zur Zeit ausgeschaltet. Benutzer-Quota werden ignoriert bis Quota-Unterstützung in den Einstellungen eingeschaltet wird.',
'quota_warning' => 'Ihr maximal verfügbarer Plattenplatz wurde um [bytes] überschritten. Bitte löschen Sie Dokumente oder ältere Versionen.',
'readme_loading' => 'Bitte warten, bis die Readme geladen ist ...',
'receipts_accepted' => '[no_receipts] Empfangsbestätigungen',
'receipts_accepted_latest' => '(davon [no_receipts] in letzter Version)',
'receipts_not_touched' => '[no_receipts] offene Empfangsbestätigungen',
@ -2183,6 +2190,7 @@ Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Ver
'set_password' => 'Passwort setzen',
'set_workflow' => 'Workflow zuweisen',
'show_extension_changelog' => 'Zeige Versionshistorie',
'show_extension_readme' => 'Readme anzeigen',
'show_extension_version_list' => 'Zeige Liste der Versionen',
'signed_in_as' => 'Angemeldet als',
'sign_in' => 'Anmelden',
@ -2457,6 +2465,7 @@ URL: [url]</p>',
'update_approvers' => 'Liste der Freigebenden aktualisieren',
'update_document' => 'Aktualisieren',
'update_fulltext_index' => 'Aktualisiere Volltext-Index',
'update_fulltext_messages' => 'Nachrichten',
'update_info' => 'Informationen zur Aktualisierung',
'update_locked_msg' => 'Dieses Dokument wurde gesperrt<p>Die Sperrung wurde von <a href="mailto:[email]">[username]</a> eingerichtet.<br>',
'update_recipients' => 'Liste der Empfänger aktualisieren',

View File

@ -467,6 +467,7 @@ $text = array(
'dump_remove' => '',
'duplicates' => '',
'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'Επεξεργασία',
'edit_attributes' => '',
'edit_comment' => 'Επεξερασία σχόλιου',
@ -569,6 +570,7 @@ $text = array(
'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '',
'february' => 'Φεβρουάριος',
@ -682,6 +684,7 @@ $text = array(
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Αναμονή',
'individuals' => 'Άτομα',
'individuals_in_groups' => '',
@ -832,6 +835,7 @@ $text = array(
'move_clipboard' => '',
'move_document' => 'Μετακίνηση εγγράφου',
'move_folder' => 'Μετακίνηση φακέλου',
'move_into_rootfolder' => '',
'my_account' => 'Ο Λογαριασμός μου',
'my_documents' => 'Τα έγγραφα μου',
'my_transmittals' => 'Οι Διαβιβάσεις μου',
@ -955,6 +959,7 @@ URL: [url]',
'ownership_changed_email_body' => '',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '',
'parent_folder' => '',
'password' => '',
'password_already_used' => '',
'password_expiration' => '',
@ -992,6 +997,7 @@ URL: [url]',
'preview' => 'προεπισκόπηση',
'preview_converters' => '',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '',
'preview_pdf' => '',
'preview_plain' => '',
@ -1004,6 +1010,7 @@ URL: [url]',
'quota_exceeded' => '',
'quota_is_disabled' => '',
'quota_warning' => '',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1653,6 +1660,7 @@ URL: [url]',
'set_password' => '',
'set_workflow' => '',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => 'Σύνδεση σαν',
'sign_in' => 'Σύνδεση',
@ -1907,6 +1915,7 @@ URL: [url]',
'update_approvers' => '',
'update_document' => 'Ενημέρωση εγγράφου',
'update_fulltext_index' => 'Ενημέρωση της Αρίθμησης Κειμένων',
'update_fulltext_messages' => '',
'update_info' => '',
'update_locked_msg' => '',
'update_recipients' => '',

View File

@ -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 (2238), archonwang (3), dgrutsch (9), netixw (14)
// Translators: Admin (2248), archonwang (3), dgrutsch (9), netixw (14)
$text = array(
'2_factor_auth' => '2-factor authentication',
@ -632,13 +632,14 @@ URL: [url]</p>',
'dropfolder_metadata' => 'Metadata of files to be imported',
'dropupload' => 'Fast upload',
'drop_files_here' => 'Drop files here!',
'drop_files_here_or_click' => 'Drop files here or click!',
'drop_files_here_or_click' => 'Drop files here or click to upload!',
'dump_creation' => 'DB dump creation',
'dump_creation_warning' => 'With this operation you can create a dump file of your database content. After the creation the dump file will be saved in the data folder of your server.',
'dump_list' => 'Existings dump files',
'dump_remove' => 'Remove dump file',
'duplicates' => 'Duplicates',
'duplicate_content' => 'Duplicate Content',
'duplicate_sequences' => 'Duplicate sequence numbers in a folder',
'edit' => 'Edit',
'edit_attributes' => 'Edit attributes',
'edit_comment' => 'Edit comment',
@ -751,6 +752,7 @@ URL: [url]</p>',
'extension_mgr_repository' => 'Available',
'extension_mgr_upload_disabled' => 'Uploading new extensions is not possible because it is disabled in the configuraton.',
'extension_missing_name' => 'No extension name given',
'extension_readme' => 'Readme',
'extension_toggle_error' => 'Could not toggle extension',
'extension_version_list' => 'Versions',
'february' => 'February',
@ -928,6 +930,7 @@ URL: [url]</p>',
'index_folder_updated' => 'Folder updated',
'index_no_content' => 'Did not index content',
'index_pending' => 'Pending',
'index_processing' => 'Processing ...',
'index_waiting' => 'Waiting',
'individuals' => 'Individuals',
'individuals_in_groups' => 'Members of a group',
@ -1078,6 +1081,7 @@ URL: [url]</p>',
'move_clipboard' => 'Move clipboard',
'move_document' => 'Move document',
'move_folder' => 'Move Folder',
'move_into_rootfolder' => 'Move into root folder',
'my_account' => 'My Account',
'my_documents' => 'My Documents',
'my_transmittals' => 'My Transmittals',
@ -1259,6 +1263,7 @@ New owner: [new_owner]<br />
User: [username]<br />
URL: [url]</p>',
'ownership_changed_email_subject' => '[sitename]: [name] - Owner changed',
'parent_folder' => 'Parent folder',
'password' => 'Password',
'password_already_used' => 'Password already used',
'password_expiration' => 'Password expiration',
@ -1312,6 +1317,7 @@ If you still have problems to login, then please contact your administrator.',
'preview' => 'Preview',
'preview_converters' => 'Preview document conversion',
'preview_images' => 'Preview images',
'preview_images_text' => 'Preview images and text content',
'preview_markdown' => 'Markdown',
'preview_pdf' => 'Preview as PDF',
'preview_plain' => 'Text',
@ -1324,6 +1330,7 @@ If you still have problems to login, then please contact your administrator.',
'quota_exceeded' => 'Your disk quota is exceeded by [bytes].',
'quota_is_disabled' => 'Quota support is currently disabled in the settings. Setting a user quota will have no effect until it is enabled again.',
'quota_warning' => 'Your maximum disc usage is exceeded by [bytes]. Please remove documents or previous versions.',
'readme_loading' => 'Pleae wait, until the Readme is loaded ...',
'receipts_accepted' => '[no_receipts] receipts already accepted',
'receipts_accepted_latest' => '(being [no_receipts] in latest version)',
'receipts_not_touched' => '[no_receipts] receipts not being touched',
@ -2186,6 +2193,7 @@ If you did not receive a password, please use the password forgotten function on
'set_password' => 'Set Password',
'set_workflow' => 'Set Workflow',
'show_extension_changelog' => 'Show Changelog',
'show_extension_readme' => 'Show Readme',
'show_extension_version_list' => 'Show list of versions',
'signed_in_as' => 'Signed in as',
'sign_in' => 'Sign in',
@ -2460,6 +2468,7 @@ URL: [url]</p>',
'update_approvers' => 'Update List of Approvers',
'update_document' => 'Update document',
'update_fulltext_index' => 'Update fulltext index',
'update_fulltext_messages' => 'Messages',
'update_info' => 'Update Information',
'update_locked_msg' => 'This document is locked.',
'update_recipients' => 'Update list of recipients',

View File

@ -527,6 +527,7 @@ URL: [url]',
'dump_remove' => 'Eliminar fichero de volcado',
'duplicates' => 'Duplicados',
'duplicate_content' => 'Contenido duplicado',
'duplicate_sequences' => '',
'edit' => 'editar',
'edit_attributes' => 'Editar atributos',
'edit_comment' => 'Editar comentario',
@ -633,6 +634,7 @@ URL: [url]',
'extension_mgr_repository' => 'Disponible',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Versiones',
'february' => 'Febrero',
@ -772,6 +774,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Esperando',
'individuals' => 'Individuales',
'individuals_in_groups' => 'Miembros del grupo',
@ -922,6 +925,7 @@ URL: [url]',
'move_clipboard' => 'Mover portapaprles',
'move_document' => 'Mover documento',
'move_folder' => 'Mover carpeta',
'move_into_rootfolder' => '',
'my_account' => 'Mi cuenta',
'my_documents' => 'Mis documentos',
'my_transmittals' => 'Mi transmision',
@ -1064,6 +1068,7 @@ Usuario: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Propietario modificado',
'parent_folder' => '',
'password' => 'Contraseña',
'password_already_used' => 'La contraseña ya está en uso',
'password_expiration' => 'Caducidad de la contraseña',
@ -1109,6 +1114,7 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado
'preview' => 'anterior',
'preview_converters' => 'Vista previa del documento convertido',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '',
'preview_pdf' => '',
'preview_plain' => '',
@ -1121,6 +1127,7 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado
'quota_exceeded' => 'Su cuota de disco se ha excedido en [bytes].',
'quota_is_disabled' => 'La cuota está actualmente deshabilitada en las opciones. Establecer una cuota de usuario no tendrá efecto hasta que sea habilitada de nuevo.',
'quota_warning' => 'El máximo de uso de disco se ha excedido en [bytes]. Por favor eliminar documentos o versiones anteriores.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1806,6 +1813,7 @@ URL: [url]',
'set_password' => 'Establecer contraseña',
'set_workflow' => 'Establecer Flujo de Trabajo',
'show_extension_changelog' => 'Mostrar log de cambios',
'show_extension_readme' => '',
'show_extension_version_list' => 'Lista corta de versiones',
'signed_in_as' => 'Conectado como',
'sign_in' => 'Conectar',
@ -2069,6 +2077,7 @@ URL: [url]',
'update_approvers' => 'Actualizar lista de aprobadores',
'update_document' => 'Actualizar documento',
'update_fulltext_index' => 'Actualizar índice de texto completo',
'update_fulltext_messages' => '',
'update_info' => 'Actualizar información',
'update_locked_msg' => 'Este documento está bloqueado.',
'update_recipients' => 'Actualizaar lista de receptores',

View File

@ -625,6 +625,7 @@ URL : [url]</p>',
'dump_remove' => 'Supprimer fichier de sauvegarde',
'duplicates' => 'Doublons',
'duplicate_content' => 'Contenu en double',
'duplicate_sequences' => '',
'edit' => 'Modifier',
'edit_attributes' => 'Modifier les attributs',
'edit_comment' => 'Modifier le commentaire',
@ -737,6 +738,7 @@ URL : [url]</p>',
'extension_mgr_repository' => 'Disponibles',
'extension_mgr_upload_disabled' => 'Le chargement d\'extension n\'est pas activé',
'extension_missing_name' => 'Nom dextension manquant',
'extension_readme' => '',
'extension_toggle_error' => 'Impossible dactiver/désactiver lextension',
'extension_version_list' => 'Versions',
'february' => 'Février',
@ -914,6 +916,7 @@ URL : [url]</p>',
'index_folder_updated' => 'Dossier mis à jour',
'index_no_content' => 'Contenu non indexé',
'index_pending' => 'En attente',
'index_processing' => '',
'index_waiting' => 'Chargement…',
'individuals' => 'Individuels',
'individuals_in_groups' => 'Membres dun groupe',
@ -1064,6 +1067,7 @@ URL : [url]</p>',
'move_clipboard' => 'Déplacer le contenu du presse-papier',
'move_document' => 'Déplacer le document',
'move_folder' => 'Déplacer le dossier',
'move_into_rootfolder' => '',
'my_account' => 'Mon compte',
'my_documents' => 'Mes documents',
'my_transmittals' => 'Mes transmissions',
@ -1246,6 +1250,7 @@ Nouveau propriétaire : [new_owner]<br />
Utilisateur : [username]<br />
URL : [url]</p>',
'ownership_changed_email_subject' => '[sitename] : [name] - Propriétaire modifié',
'parent_folder' => '',
'password' => 'Mot de passe',
'password_already_used' => 'Mot de passe déjà utilisé',
'password_expiration' => 'Expiration du mot de passe',
@ -1297,6 +1302,7 @@ En cas de problème persistant, veuillez contacter votre administrateur.',
'preview' => 'Aperçu',
'preview_converters' => 'Conversion des documents pour prévisualisation',
'preview_images' => 'Miniatures',
'preview_images_text' => '',
'preview_markdown' => 'Prévisualisation',
'preview_pdf' => 'Prévisualisation en PDF',
'preview_plain' => 'Texte',
@ -1309,6 +1315,7 @@ En cas de problème persistant, veuillez contacter votre administrateur.',
'quota_exceeded' => 'Votre quota de disque est dépassé de [bytes].',
'quota_is_disabled' => 'La prise en charge des quotas est actuellement désactivée dans les réglages. Affecter un quota utilisateur naura pas deffet jusquà ce quil soit de nouveau activé.',
'quota_warning' => 'Votre quota despace disque est dépassé de [bytes]. Veuillez supprimer des documents ou d\'anciennes versions.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] réceptions déjà confirmées',
'receipts_accepted_latest' => '(dont [no_receipts] dans la dernière version)',
'receipts_not_touched' => '[no_receipts] réceptions non amorcées',
@ -2169,6 +2176,7 @@ Nom : [username]
'set_password' => 'Définir mot de passe',
'set_workflow' => 'Définir le Workflow',
'show_extension_changelog' => 'Afficher le journal des modifications',
'show_extension_readme' => '',
'show_extension_version_list' => 'Afficher la liste des versions',
'signed_in_as' => 'Connecté en tant que',
'sign_in' => 'Connexion',
@ -2443,6 +2451,7 @@ URL : [url]</p>',
'update_approvers' => 'Mettre à jour la liste des approbateurs',
'update_document' => 'Mettre à jour',
'update_fulltext_index' => 'Mettre à jour l\'index de recherche plein texte',
'update_fulltext_messages' => '',
'update_info' => 'Informations de mise à jour',
'update_locked_msg' => 'Ce document est verrouillé.',
'update_recipients' => 'Mettre à jour la liste des destinataires',

View File

@ -19,10 +19,10 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
// Translators: Admin (1249), marbanas (16)
// Translators: Admin (1250), marbanas (16)
$text = array(
'2_factor_auth' => '',
'2_factor_auth' => '2-faktorska autentikacija',
'2_factor_auth_info' => '',
'2_fact_auth_current_secret' => '',
'2_fact_auth_new_secret' => '',
@ -526,6 +526,7 @@ Internet poveznica: [url]',
'dump_remove' => 'Ukloni datoteku za odlaganje',
'duplicates' => 'duplikati',
'duplicate_content' => 'Duplicirani sadržaj',
'duplicate_sequences' => '',
'edit' => 'Uredi',
'edit_attributes' => 'Uredi atribute',
'edit_comment' => 'Uredi komentar',
@ -632,6 +633,7 @@ Internet poveznica: [url]',
'extension_mgr_repository' => 'Dostupno',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Inačice',
'february' => 'Veljača',
@ -765,6 +767,7 @@ Internet poveznica: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => '',
'individuals' => 'Pojedinci',
'individuals_in_groups' => '',
@ -915,6 +918,7 @@ Internet poveznica: [url]',
'move_clipboard' => 'Premjesti međuspremnik',
'move_document' => 'Premjesti dokument',
'move_folder' => 'Premjesti mapu',
'move_into_rootfolder' => '',
'my_account' => 'Moj korisnički račun',
'my_documents' => 'Moji dokumenti',
'my_transmittals' => 'Moja proslijeđivanja',
@ -1056,6 +1060,7 @@ Korisnik: [username]
Internet poveznica: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Promijenjen vlasnik',
'parent_folder' => '',
'password' => 'Lozinka',
'password_already_used' => 'Lozinka se već koristi',
'password_expiration' => 'Istek lozinke',
@ -1101,6 +1106,7 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator
'preview' => 'Predpregled',
'preview_converters' => 'Pretpregled konverzije dokumenta',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => 'Smanjenje',
'preview_pdf' => '',
'preview_plain' => 'Obični tekst',
@ -1113,6 +1119,7 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator
'quota_exceeded' => 'Vaša kvota na disku je premašena za [bytes].',
'quota_is_disabled' => 'Podrška kvoti je trenutno onemogućena u postavkama. Postavka korisničke kvote neće imati utjecaja dok se ponovno ne omogući.',
'quota_warning' => 'Vaš maksimalni prostor na disku je premašen za [bytes]. Molimo uklonite dokumente ili prethodne verzije.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1815,6 +1822,7 @@ Internet poveznica: [url]',
'set_password' => 'Postavi lozinku',
'set_workflow' => 'Postavi tok rada',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => 'Prijavljen kao',
'sign_in' => 'Prijava u sustav',
@ -2078,6 +2086,7 @@ Internet poveznica: [url]',
'update_approvers' => 'Ažuriraj popis validatora',
'update_document' => 'Ažuriraj dokument',
'update_fulltext_index' => 'Ažuriraj indeksiranje cijelog teksta',
'update_fulltext_messages' => '',
'update_info' => 'Info ažuriranje',
'update_locked_msg' => 'Ovaj dokument je zaključan.',
'update_recipients' => 'Izmjena liste primatelja',

View File

@ -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 (648), Kalpy (113), ribaz (1036)
// Translators: Admin (649), Kalpy (113), ribaz (1036)
$text = array(
'2_factor_auth' => 'Kétfaktoros azonosítás',
@ -521,6 +521,7 @@ URL: [url]',
'dump_remove' => 'Adatbázis mentés eltávolítása',
'duplicates' => '',
'duplicate_content' => 'Duplikált tartalom',
'duplicate_sequences' => '',
'edit' => 'Szerkesztés',
'edit_attributes' => 'Jellemzők szerkesztése',
'edit_comment' => 'Megjegyzés szerkesztése',
@ -627,6 +628,7 @@ URL: [url]',
'extension_mgr_repository' => 'Telepíthető',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Verziók',
'february' => 'Február',
@ -735,7 +737,7 @@ URL: [url]',
'hu_HU' => 'Magyar',
'id' => 'ID',
'identical_version' => 'Az új verzió megegyezik az eredetivel.',
'id_ID' => '',
'id_ID' => 'Indonéz',
'import' => 'Import',
'importfs' => '',
'import_extension' => 'Kiterjesztés import',
@ -760,6 +762,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => '',
'individuals' => 'Egyedek',
'individuals_in_groups' => '',
@ -910,6 +913,7 @@ URL: [url]',
'move_clipboard' => 'Vágólapra helyez',
'move_document' => 'Dokumentum áthelyezése',
'move_folder' => 'Könyvtár áthelyezése',
'move_into_rootfolder' => '',
'my_account' => 'Saját hozzáférés',
'my_documents' => 'Saját dokumentumok',
'my_transmittals' => 'Átviteleim',
@ -1052,6 +1056,7 @@ Felhasználó: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Tulajdonos megváltozott',
'parent_folder' => '',
'password' => 'Jelszó',
'password_already_used' => 'Jelszó korábban használva volt',
'password_expiration' => 'Jelszó lejárat',
@ -1097,6 +1102,7 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a
'preview' => 'Előnézet',
'preview_converters' => 'A dokumentum átalakításának előnézete',
'preview_images' => 'előnézeti képek',
'preview_images_text' => '',
'preview_markdown' => '',
'preview_pdf' => '',
'preview_plain' => '',
@ -1109,6 +1115,7 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a
'quota_exceeded' => 'Túllépte a lemezterület korlátot [bytes].',
'quota_is_disabled' => 'Kvóta támogatás jelenleg le van tiltva a beállításoknál. Felhasználói korlát beállítások nem kerülnek érvényesítésre amíg nincs újra engedélyezve.',
'quota_warning' => 'Túllépte lemez korlátot [bytes] bájttal. Kérjük távolítson el dokumentumokat vagy korábbi változatokat.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1793,6 +1800,7 @@ URL: [url]',
'set_password' => 'Jelszó beállítása',
'set_workflow' => 'Munkafolyamat beállítása',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => 'Bejelentkezve mint',
'sign_in' => 'Bejelentkezés',
@ -2056,6 +2064,7 @@ URL: [url]',
'update_approvers' => 'Jóváhagyók listájának frissítése',
'update_document' => 'Dokumentum frissítése',
'update_fulltext_index' => 'Teljes szöveg index frissítése',
'update_fulltext_messages' => '',
'update_info' => 'Információ frissítése',
'update_locked_msg' => 'Ez a dokumentum zárolt.',
'update_recipients' => '',

View File

@ -565,6 +565,7 @@ URL: [url]</p>',
'dump_remove' => 'Hapus file sampah',
'duplicates' => 'Duplikasi',
'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'Ubah',
'edit_attributes' => 'Ubah label',
'edit_comment' => 'Ubah komentar',
@ -672,6 +673,7 @@ URL: [url]',
'extension_mgr_repository' => 'Tersedia',
'extension_mgr_upload_disabled' => 'Mengunggah ekstensi baru tidak dimungkinkan karena dinonaktifkan di konfigurasi.',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => 'Tidak dapat mengaktifkan ekstensi',
'extension_version_list' => 'Versi',
'february' => 'Februari',
@ -816,6 +818,7 @@ URL: [url]</p>',
'index_folder_updated' => 'Folder diperbarui',
'index_no_content' => '',
'index_pending' => 'Ditunda',
'index_processing' => '',
'index_waiting' => 'Mengunggu',
'individuals' => 'Perorangan',
'individuals_in_groups' => '',
@ -966,6 +969,7 @@ URL: [url]</p>',
'move_clipboard' => 'Pindah clipboard',
'move_document' => 'Pindah dokumen',
'move_folder' => 'Pindah Folder',
'move_into_rootfolder' => '',
'my_account' => 'Akun Saya',
'my_documents' => 'Dokumen Saya',
'my_transmittals' => 'Transmisi Saya',
@ -1129,6 +1133,7 @@ Pemilik baru: [new_owner]<br / >
Pengguna: [username]<br />
URL: [url]</p>',
'ownership_changed_email_subject' => '[sitename]: [name] - Pemilik diterapkan',
'parent_folder' => '',
'password' => 'Kata sandi',
'password_already_used' => 'Kata sandi telah digunakan',
'password_expiration' => 'Kata sandi telah kadaluwarsa',
@ -1182,6 +1187,7 @@ Jika Anda masih mengalami masalah untuk login, silakan hubungi administrator And
'preview' => 'Pratinjau',
'preview_converters' => 'Pratinjau konversi dokumen',
'preview_images' => 'Pratinjau gambar',
'preview_images_text' => '',
'preview_markdown' => 'Markdown',
'preview_pdf' => 'Lihat sebagai PDF',
'preview_plain' => 'Text',
@ -1194,6 +1200,7 @@ Jika Anda masih mengalami masalah untuk login, silakan hubungi administrator And
'quota_exceeded' => '',
'quota_is_disabled' => 'Dukungan kuota saat ini dinonaktifkan di pengaturan. Menetapkan kuota pengguna tidak akan berpengaruh hingga diaktifkan kembali.',
'quota_warning' => '',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] kuitansi sudah diterima',
'receipts_accepted_latest' => '(menjadi [no_receipts] dalam versi terbaru)',
'receipts_not_touched' => '',
@ -1867,6 +1874,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'set_password' => 'Setel Kata Sandi',
'set_workflow' => 'Setel Alur Kerja',
'show_extension_changelog' => 'Tampilkan Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Tampilkan daftar versi',
'signed_in_as' => 'Masuk sebagai',
'sign_in' => 'Masuk',
@ -2121,6 +2129,7 @@ Jika Anda tidak menerima kata sandi, silakan gunakan fitur lupa kata sandi di ha
'update_approvers' => 'Perbarui Daftar Penyetuju',
'update_document' => 'Perbarui dokumen',
'update_fulltext_index' => 'Perbarui indek fulltext',
'update_fulltext_messages' => '',
'update_info' => 'Perbarui Informasi',
'update_locked_msg' => 'Dokumen ini terkunci.',
'update_recipients' => 'Perbarui daftar penerima',

View File

@ -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 (2057), rickr (144), s.pnt (26)
// Translators: Admin (2058), rickr (144), s.pnt (26)
$text = array(
'2_factor_auth' => 'Autorizzazione a due fattori',
@ -531,6 +531,7 @@ URL: [url]',
'dump_remove' => 'Cancella il file di dump',
'duplicates' => 'Duplicati',
'duplicate_content' => 'Contenuto duplicato',
'duplicate_sequences' => '',
'edit' => 'Modifica',
'edit_attributes' => 'Modifica gli attributi',
'edit_comment' => 'Modifica il commento',
@ -637,6 +638,7 @@ URL: [url]',
'extension_mgr_repository' => 'Disponibile',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Versioni',
'february' => 'Febbraio',
@ -770,6 +772,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => 'Non indicizzare contenuti',
'index_pending' => 'Indicizzazione pendente',
'index_processing' => '',
'index_waiting' => 'Attendi',
'individuals' => 'Singoli',
'individuals_in_groups' => 'I membri de la gruppo',
@ -920,6 +923,7 @@ URL: [url]',
'move_clipboard' => 'Sposta appunti',
'move_document' => 'Sposta documento',
'move_folder' => 'Sposta cartella',
'move_into_rootfolder' => '',
'my_account' => 'Account personale',
'my_documents' => 'Documenti personali',
'my_transmittals' => 'Mie trasmissioni',
@ -1062,6 +1066,7 @@ Utente: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Cambio di proprietario',
'parent_folder' => '',
'password' => 'Password',
'password_already_used' => 'Password già usata',
'password_expiration' => 'Scadenza password',
@ -1107,6 +1112,7 @@ Dovessero esserci ancora problemi al login, prego contatta l\'amministratore di
'preview' => 'Anteprima',
'preview_converters' => 'Anteprima convesione documento',
'preview_images' => 'Immagini di anteprima',
'preview_images_text' => '',
'preview_markdown' => 'Riduzione ribasso',
'preview_pdf' => 'Anteprima come PDF',
'preview_plain' => 'Testo',
@ -1119,6 +1125,7 @@ Dovessero esserci ancora problemi al login, prego contatta l\'amministratore di
'quota_exceeded' => 'La quota-disco è stata superata di [bytes].',
'quota_is_disabled' => 'Il supporto per le quote è attualmente disattivato nelle impostazioni. L\'impostazione di una quota-utente non avrà alcun effetto finché tale funzionalità non verrà nuovamente attivata.',
'quota_warning' => 'Il vostro utilizzo massimo di spazio è stato superato di [bytes]. Si prega di rimuovere documenti o versioni obsolete.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] ricevute già accettate',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '[no_receipts] ricevute non gestite',
@ -1360,7 +1367,7 @@ URL: [url]',
'search' => 'Ricerca',
'search_fulltext' => 'Ricerca fulltext',
'search_in' => 'Cerca in',
'search_mode' => '',
'search_mode' => 'Modalità di ricerca',
'search_mode_and' => 'tutte le parole',
'search_mode_documents' => 'Solo documenti',
'search_mode_folders' => 'Solo cartelle',
@ -1842,6 +1849,7 @@ Name: [username]
'set_password' => 'Imposta password',
'set_workflow' => 'Imposta il flusso di lavoro',
'show_extension_changelog' => 'Registro delle modifiche dell\'estensione',
'show_extension_readme' => '',
'show_extension_version_list' => 'Mostra lista delle versioni',
'signed_in_as' => 'Utente',
'sign_in' => 'Accesso',
@ -2105,6 +2113,7 @@ URL: [url]',
'update_approvers' => 'Aggiornamento lista approvatori',
'update_document' => 'Aggiorna documento',
'update_fulltext_index' => 'Aggiorna indice fulltext',
'update_fulltext_messages' => '',
'update_info' => 'Aggiorna informazioni',
'update_locked_msg' => 'Questo documento è bloccato.',
'update_recipients' => 'Aggiorna lista cartelle',

View File

@ -527,6 +527,7 @@ URL: [url]',
'dump_remove' => '덤프 파일 제거',
'duplicates' => '',
'duplicate_content' => '중복 내용',
'duplicate_sequences' => '',
'edit' => '편집',
'edit_attributes' => '속성 편집',
'edit_comment' => '주석 고치기',
@ -633,6 +634,7 @@ URL: [url]',
'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '',
'february' => '2월',
@ -766,6 +768,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => '기다리는 중',
'individuals' => '개인',
'individuals_in_groups' => '개별 그룹',
@ -916,6 +919,7 @@ URL: [url]',
'move_clipboard' => '이동 클립 보드',
'move_document' => '문서 옮기기',
'move_folder' => '폴더 이동',
'move_into_rootfolder' => '',
'my_account' => '내 계정',
'my_documents' => '내 문서',
'my_transmittals' => '내 송부',
@ -1058,6 +1062,7 @@ URL : [url]',
URL : [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename] : [name] - 소유자 변경',
'parent_folder' => '',
'password' => '암호',
'password_already_used' => '예전에 쓰인 암호',
'password_expiration' => '암호 만료',
@ -1095,6 +1100,7 @@ URL : [url]',
'preview' => '미리보기',
'preview_converters' => '문서 변환 미리보기',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '마크다운',
'preview_pdf' => '',
'preview_plain' => '텍스트',
@ -1107,6 +1113,7 @@ URL : [url]',
'quota_exceeded' => '당신은 디스크 할당량 [bytes]을 초과한다.',
'quota_is_disabled' => '할당량 지원이 설정에서 비활성화되어 있습니다. 다시 활성화 될 때까지 사용자의 할당량 설정은 적용되지 않습니다.',
'quota_warning' => '당신의 최대 디스크 사용량 [bytes] 초과됩니다. 문서 또는 이전 버전을 제거하십시오.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1809,6 +1816,7 @@ URL : [url]',
'set_password' => '비밀번호 설정',
'set_workflow' => '워크플로우 설정',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => '로그인',
'sign_in' => '로그인',
@ -2072,6 +2080,7 @@ URL : [url]',
'update_approvers' => '승인자의 업데이트 목록',
'update_document' => '문서 갱신하기',
'update_fulltext_index' => '업데이트 전체 텍스트 색인',
'update_fulltext_messages' => '',
'update_info' => '업데이트 정보',
'update_locked_msg' => '이 문서는 잠겨 있습니다.',
'update_recipients' => '받는 사람 업데이트 목록',

View File

@ -524,6 +524,7 @@ URL: [url]',
'dump_remove' => 'ລົບແຟ້ມການຖ່າຍໂອນຂໍ້ມູນ',
'duplicates' => 'ລາຍການທີຊໍ້າກັນ',
'duplicate_content' => 'ເນື້ອຫາທີ່ຊໍ້າກັນ',
'duplicate_sequences' => '',
'edit' => 'ແກ້ໄຂ',
'edit_attributes' => 'ແກ້ໄຂແອັດທີບິວ',
'edit_comment' => 'ແກ້ໄຂຄວາມຄິດເຫັນ',
@ -630,6 +631,7 @@ URL: [url]',
'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '',
'february' => 'ເດືອນ ກຸມພາ',
@ -763,6 +765,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => 'ລໍຖ້າດຳເນີນການ',
'index_processing' => '',
'index_waiting' => 'ຖ້າ',
'individuals' => 'ບຸກຄົນ',
'individuals_in_groups' => 'ສະມາຊິກຂອງກຸ່ມ',
@ -913,6 +916,7 @@ URL: [url]',
'move_clipboard' => 'ຍ້າຍຄິບບອດ',
'move_document' => 'ຍ້າຍເອກະສານ',
'move_folder' => 'ຍ້າຍໂຟລເດີ',
'move_into_rootfolder' => '',
'my_account' => 'ບັນຊີຂອງຂ້ອຍ',
'my_documents' => 'ເອກະສານຂອງຂ້ອຍ',
'my_transmittals' => 'ການຂົນສົ່ງຂອງຂ້ອຍ',
@ -1055,6 +1059,7 @@ URL: [url]',
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]:[name] - ປ່ຽນເຈົ້າຂອງແລ້ວ',
'parent_folder' => '',
'password' => 'ລະຫັດຜ່ານ',
'password_already_used' => 'ລະຫັດຜ່ານທີນຳໄຊ້ແລ້ວ',
'password_expiration' => 'ລະຫັດຜ່ານໝົດອາຍຸ',
@ -1100,6 +1105,7 @@ URL: [url]',
'preview' => 'ເບີ່ງຕົວຢ່າງ',
'preview_converters' => 'ເບີ່ງຕົວຢ່າງການແປງເອກະສານ',
'preview_images' => 'ເບີ່ງຮູບຕົງຢ່າງ',
'preview_images_text' => '',
'preview_markdown' => 'ເຮັດເຄື່ອງຫມາຍລົງ',
'preview_pdf' => '',
'preview_plain' => 'ຂໍ້ຄວາມ',
@ -1112,6 +1118,7 @@ URL: [url]',
'quota_exceeded' => 'ໂຄຕ້າດິສຂອງເຈົ້າມີຂະໜາດເກີນ [ໄບ]',
'quota_is_disabled' => 'ຂະນະນີ້ການສະນັບສະໜູນໂຄຕ້າຖືກປິດໄຊ້ງານໃນການຕັ້ງຄ່າແລ້ວການກຳນົດໂຄຕ້າຜູ້ໄຊ້ຈະບໍ່ມີຜົນໄດໆ ຈົນກວ່າຈະເປີດໄຊ້ງານອີກຄັ້ງ',
'quota_warning' => 'ການໄຊ້ດິສສູງສຸດຂອງເຈົ້າເກີນ [ໄບຣ] ໂປດລົບເອກະສານຫຼືເວີຊັນກ່ອນໜ້າ',
'readme_loading' => '',
'receipts_accepted' => 'ໃບບິນຮັບເງີນໄດ້ຮັບການຍອມຮັບແລ້ວ [ບໍມີໃບບິນຮັບເງິນ]',
'receipts_accepted_latest' => '',
'receipts_not_touched' => 'ບໍ່ມີໃບບິນຮັບເງິນ',
@ -1835,6 +1842,7 @@ URL: [url]',
'set_password' => 'ຕັ້ງລະຫັດຜ່ານ',
'set_workflow' => 'ຕັ້ງຄ່າການທຳງານ',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => 'ລົງຊື່ເຂົາໄຊ້ໂດຍ',
'sign_in' => 'ລົງຊື່ເຂົາໄຊ້',
@ -2098,6 +2106,7 @@ URL: [url]',
'update_approvers' => 'ອັບເດດລາຍຊື່ຜູ້ອະນຸມັດ',
'update_document' => 'ອັບເດດເອກະສານ',
'update_fulltext_index' => 'ອັບເດດດັດຊະນີຂໍ້ຄວາມແບບເຕັມຮູບແບບ',
'update_fulltext_messages' => '',
'update_info' => 'ອັບເດດຂໍ້ມູນ',
'update_locked_msg' => 'ເອກະສານນີ້ຖືກລັອກ',
'update_recipients' => 'ອັບເດລາຍຊື່ຜູ້ຮັບ',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => 'Ta bort dumpfil',
'duplicates' => 'Duplikater',
'duplicate_content' => 'Dubliser innehold',
'duplicate_sequences' => '',
'edit' => 'Rediger',
'edit_attributes' => 'Rediger egenskaper',
'edit_comment' => 'Rediger kommentar',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => 'Tilgjengelig',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Versjon',
'february' => 'Februar',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => 'Indekserte ikke innhold',
'index_pending' => 'Avventer',
'index_processing' => '',
'index_waiting' => 'Venter',
'individuals' => 'Personer',
'individuals_in_groups' => 'Medlemmer i en gruppe',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => 'Flytt utklippstavlen',
'move_document' => 'Flytte dokument',
'move_folder' => 'Flytte mappe',
'move_into_rootfolder' => '',
'my_account' => 'Min side',
'my_documents' => 'Mine dokumenter',
'my_transmittals' => 'Mine sendinger',
@ -1076,6 +1080,7 @@ Bruker: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Eier endret',
'parent_folder' => '',
'password' => 'Passord',
'password_already_used' => 'Passord allerede brukt',
'password_expiration' => 'Passord utgått',
@ -1115,6 +1120,7 @@ Om du fortsatt har problemer med innloggingen, kontakt admin.',
'preview' => 'Forhåndsvisning',
'preview_converters' => 'Forhåndsvis dokumentkonvertering',
'preview_images' => 'Forhåndsvis bilder',
'preview_images_text' => '',
'preview_markdown' => 'Forminsking',
'preview_pdf' => 'Forhåndsvis som PDF',
'preview_plain' => 'Tekst',
@ -1127,6 +1133,7 @@ Om du fortsatt har problemer med innloggingen, kontakt admin.',
'quota_exceeded' => 'Diskkvoten din er overskridet med [bytes].',
'quota_is_disabled' => 'Kvotestøtte er for øyeblikket deaktivert i innstillingene. Å sette en brukerkvote vil ikke ha noen effekt før den er aktivert igjen.',
'quota_warning' => 'Din maksimale lagringskvote er overskredet med [bytes]. Ta bort dokumenter eller tidigere versjoner.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] kvitteringer allerede akseptert',
'receipts_accepted_latest' => '(er [no_receipts] i siste versjon)',
'receipts_not_touched' => '[no_receipts] kvitteringer ikke blir berørt',
@ -1848,6 +1855,7 @@ Bruker: [username]
'set_password' => 'Angi passord',
'set_workflow' => 'Velg arbeidsflyt',
'show_extension_changelog' => 'Vis forandrings logg',
'show_extension_readme' => '',
'show_extension_version_list' => 'Vis liste over versjoner',
'signed_in_as' => 'Innlogget som',
'sign_in' => 'Logg inn',
@ -2111,6 +2119,7 @@ URL: [url]',
'update_approvers' => 'Oppdater liste over godkjennere',
'update_document' => 'Oppdater dokumentet',
'update_fulltext_index' => 'Oppdater fulltekstindeksen',
'update_fulltext_messages' => '',
'update_info' => 'Oppdater informasjon',
'update_locked_msg' => 'Dette dokumentet er låst.',
'update_recipients' => 'Oppdater liste over mottakere',

View File

@ -531,6 +531,7 @@ URL: [url]',
'dump_remove' => 'Verwijder dump bestand',
'duplicates' => 'Doublures',
'duplicate_content' => 'Dubbele inhoud',
'duplicate_sequences' => '',
'edit' => 'Wijzigen',
'edit_attributes' => 'Bewerk attributen',
'edit_comment' => 'Wijzig commentaar',
@ -637,6 +638,7 @@ URL: [url]',
'extension_mgr_repository' => 'Beschikbaar',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => 'Naam extensie ontbreekt',
'extension_readme' => '',
'extension_toggle_error' => 'Omschakelen mislukt',
'extension_version_list' => 'Versies',
'february' => 'februari',
@ -777,6 +779,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => 'Index heeft geen inhoud',
'index_pending' => 'Indexering moet nog gebeuren',
'index_processing' => '',
'index_waiting' => 'Indexering wacht',
'individuals' => 'Individuen',
'individuals_in_groups' => 'Individuen in groepen',
@ -927,6 +930,7 @@ URL: [url]',
'move_clipboard' => 'Verplaats klembord',
'move_document' => 'Verplaats document',
'move_folder' => 'Map verplaatsen',
'move_into_rootfolder' => '',
'my_account' => 'Mijn Account',
'my_documents' => 'Mijn Documenten',
'my_transmittals' => 'Mijn zendingen',
@ -1068,6 +1072,7 @@ Gebruiker: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Eigenaar gewijzigd',
'parent_folder' => '',
'password' => 'Wachtwoord',
'password_already_used' => 'Wachtwoord al gebruikt',
'password_expiration' => 'Wachtwoord vervaldatum',
@ -1114,6 +1119,7 @@ Mocht u de komende minuten geen email ontvangen, probeer het dan nogmaals en con
'preview' => 'Voorbeeld',
'preview_converters' => 'Converters',
'preview_images' => 'Voorbeelden',
'preview_images_text' => '',
'preview_markdown' => 'Voorbeeld in Markdown',
'preview_pdf' => 'Inhoud van het document',
'preview_plain' => 'Voorbeeld in platte tekst',
@ -1126,6 +1132,7 @@ Mocht u de komende minuten geen email ontvangen, probeer het dan nogmaals en con
'quota_exceeded' => 'Uw data quotum is overschreden met [bytes].',
'quota_is_disabled' => 'Quota support is momenteel niet actief in de eigenschappen. Een user-quotum instellen zal geen effect hebben tot quota actief zijn',
'quota_warning' => 'Uw maximale datagebruik is overschreden met [bytes]. Gelieve documenten of eerdere versies te verwijderen.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] ontvangen en geaccepteerd',
'receipts_accepted_latest' => '(er zijn [no_receipts] in de nieuwste versie)',
'receipts_not_touched' => '[no_receipts] ontvangen, nog niet behandeld',
@ -1847,6 +1854,7 @@ Name: [username]
'set_password' => 'Stel wachtwoord in',
'set_workflow' => 'Stel workflow in',
'show_extension_changelog' => 'Toon wijzigingslog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Toon lijst met versies',
'signed_in_as' => 'Ingelogd als:',
'sign_in' => 'Log in',
@ -2110,6 +2118,7 @@ URL: [url]',
'update_approvers' => 'Bijwerken lijst van [Goedkeurders]',
'update_document' => 'Bijwerken',
'update_fulltext_index' => 'Index voor fulltext search bijwerken',
'update_fulltext_messages' => '',
'update_info' => 'Update-informatie',
'update_locked_msg' => 'Dit document is geblokkeerd.',
'update_recipients' => 'Update de lijst vanontvangers',

View File

@ -514,6 +514,7 @@ URL: [url]',
'dump_remove' => 'Usuń plik zrzutu',
'duplicates' => 'Duplikaty',
'duplicate_content' => 'Zduplikowana zawartość',
'duplicate_sequences' => '',
'edit' => 'Edytuj',
'edit_attributes' => 'Zmiana atrybutów',
'edit_comment' => 'Edytuj komentarz',
@ -620,6 +621,7 @@ URL: [url]',
'extension_mgr_repository' => 'Dostępne',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Wersje',
'february' => 'Luty',
@ -753,6 +755,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => 'Nie indeksuje zawartości',
'index_pending' => 'Oczekujące',
'index_processing' => '',
'index_waiting' => 'Oczekiwanie',
'individuals' => 'Indywidualni',
'individuals_in_groups' => 'Członkowie grupy',
@ -903,6 +906,7 @@ URL: [url]',
'move_clipboard' => 'Przenieś schowek',
'move_document' => 'Przenieś dokument',
'move_folder' => 'Przenieś folder',
'move_into_rootfolder' => '',
'my_account' => 'Moje konto',
'my_documents' => 'Moje dokumenty',
'my_transmittals' => 'Moi recenzenci',
@ -1045,6 +1049,7 @@ Użytkownik: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Zmiana właściciela',
'parent_folder' => '',
'password' => 'Hasło',
'password_already_used' => 'Hasło jest aktualnie używane',
'password_expiration' => 'Wygaśnięcie hasła',
@ -1090,6 +1095,7 @@ Jeśli nadal będą problemy z zalogowaniem, prosimy o kontakt z administratorem
'preview' => 'Podgląd',
'preview_converters' => 'Podgląd konwersji dokumentu',
'preview_images' => 'Podgląd obrazu',
'preview_images_text' => '',
'preview_markdown' => 'Oznacz w dół',
'preview_pdf' => 'Podgląd PDF',
'preview_plain' => 'Zwykły podgląd',
@ -1102,6 +1108,7 @@ Jeśli nadal będą problemy z zalogowaniem, prosimy o kontakt z administratorem
'quota_exceeded' => 'Twój limit przydzielonej przestrzeni dyskowej został przekroczony o [bytes].',
'quota_is_disabled' => 'Wsparcie limitów dyskowych jest obecnie wyłączone w ustawieniach. Ustawiony limit dyskowy użytkownika nie będzie działał dopóki wparcie nie zostanie ponownie włączone.',
'quota_warning' => 'Przekroczono użycie dysku o [bytes]. Usuń dokumenty lub poprzednie wersje.',
'readme_loading' => '',
'receipts_accepted' => 'Potwierdzenia zaakceptowane',
'receipts_accepted_latest' => '(istnieje [no_receipts] w ostatniej wersji)',
'receipts_not_touched' => 'Potwierdzenia nieoglądane',
@ -1778,6 +1785,7 @@ Name: [username]
'set_password' => 'Zmień hasło',
'set_workflow' => 'Ustaw proces',
'show_extension_changelog' => 'Pokaż Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Pokaż listę wersji',
'signed_in_as' => 'Zalogowany jako',
'sign_in' => 'Zaloguj się',
@ -2041,6 +2049,7 @@ URL: [url]',
'update_approvers' => 'Aktualizuj listę osób zatwierdzających',
'update_document' => 'Aktualizuj dokument',
'update_fulltext_index' => 'Aktualizuj indeks pełnotekstowy',
'update_fulltext_messages' => '',
'update_info' => 'Aktualizuj informacje',
'update_locked_msg' => 'Ten dokument jest zablokowany.',
'update_recipients' => 'Zaktualizuj listę odbiorców',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => 'Remover arquivo de despejo',
'duplicates' => 'Duplicados',
'duplicate_content' => 'Conteúdo duplicado',
'duplicate_sequences' => '',
'edit' => 'editar',
'edit_attributes' => 'Editar atributos',
'edit_comment' => 'Editar comentário',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => 'Disponível',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Versões',
'february' => 'Fevereiro',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => 'Não indexou o conteúdo',
'index_pending' => 'Pendente',
'index_processing' => '',
'index_waiting' => 'Aguarde...',
'individuals' => 'Indivíduos',
'individuals_in_groups' => 'Members of a group',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => 'Mover para memória auxiliar',
'move_document' => 'Mover documento',
'move_folder' => 'Mover Pasta',
'move_into_rootfolder' => '',
'my_account' => 'Minha Conta',
'my_documents' => 'Meus Documentos',
'my_transmittals' => 'Minhas Transmissões',
@ -1075,6 +1079,7 @@ Usuário: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Proprietário mudou',
'parent_folder' => '',
'password' => 'Senha',
'password_already_used' => 'Senha já usada',
'password_expiration' => 'Expiração de senha',
@ -1120,6 +1125,7 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ
'preview' => 'visualizar',
'preview_converters' => 'Visualizar a conversão do documento',
'preview_images' => 'Imagens de pré-visualização',
'preview_images_text' => '',
'preview_markdown' => 'Markdown',
'preview_pdf' => 'Visualizar como PDF',
'preview_plain' => 'Texto',
@ -1132,6 +1138,7 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ
'quota_exceeded' => 'Sua cota de disco foi ultrapassada em [bytes].',
'quota_is_disabled' => 'Suporte a cota está desativado nas configurações. A definição de cota do usuário não terá efeito até que seja habilitada novamente.',
'quota_warning' => 'Seu uso máximo do disco foi ultrapassado em [bytes]. Por favor, remova documentos ou versões anteriores.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] recibos já aceitos',
'receipts_accepted_latest' => 'recibos aceites mais recentes',
'receipts_not_touched' => '[no_receipts] recibos não tocados',
@ -1854,6 +1861,7 @@ Nome: [username]
'set_password' => 'Definir Senha',
'set_workflow' => 'Definir fluxo de trabalho',
'show_extension_changelog' => 'Mostrar Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Exibir Lista de Versões',
'signed_in_as' => 'Logado',
'sign_in' => 'Entre com seu usuário e senha',
@ -2117,6 +2125,7 @@ URL: [url]',
'update_approvers' => 'Atualizar lista de aprovadores',
'update_document' => 'Atualizar',
'update_fulltext_index' => 'Índice de atualização de texto completo',
'update_fulltext_messages' => '',
'update_info' => 'Atualizar informação',
'update_locked_msg' => 'Este documento está travado.',
'update_recipients' => 'Atualizar lista de destinatários',

View File

@ -526,6 +526,7 @@ URL: [url]',
'dump_remove' => 'Sterge fișier imagine',
'duplicates' => '',
'duplicate_content' => '',
'duplicate_sequences' => '',
'edit' => 'Editează',
'edit_attributes' => 'Editează atribute',
'edit_comment' => 'Editează comentariu',
@ -632,6 +633,7 @@ URL: [url]',
'extension_mgr_repository' => 'Disponibila',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Versiuni',
'february' => 'Februarie',
@ -765,6 +767,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Așteptare',
'individuals' => 'Individuals',
'individuals_in_groups' => '',
@ -915,6 +918,7 @@ URL: [url]',
'move_clipboard' => 'Mută clipboard',
'move_document' => 'Mută document',
'move_folder' => 'Mută Folder',
'move_into_rootfolder' => '',
'my_account' => 'Contul Meu',
'my_documents' => 'Documentele Mele',
'my_transmittals' => 'Trimiterile mele',
@ -1057,6 +1061,7 @@ Utilizator: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Proprietar schimbat',
'parent_folder' => '',
'password' => 'Parolă',
'password_already_used' => 'Parolă folosită deja',
'password_expiration' => 'Expirare parolă',
@ -1102,6 +1107,7 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț
'preview' => 'Previzualizare',
'preview_converters' => '',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '',
'preview_pdf' => '',
'preview_plain' => '',
@ -1114,6 +1120,7 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț
'quota_exceeded' => 'Spatiul tău alocat pe disc este depășit cu [bytes].',
'quota_is_disabled' => 'Spatiu alocat este dezactivată în setări. Stabilirea unui spatiu alocat pentru utilizator nu va avea nici un efect până când setarea este reactivată din nou.',
'quota_warning' => 'Dimensiunea dumneavoastră maximă este depasită cu [bytes]. Vă rugăm să eliminați documente sau versiuni anterioare.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1816,6 +1823,7 @@ URL: [url]',
'set_password' => 'Setare Parolă',
'set_workflow' => 'Setare Workflow',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => 'Arata o lista a versiunilor',
'signed_in_as' => 'Autentificat ca',
'sign_in' => 'Sign in',
@ -2079,6 +2087,7 @@ URL: [url]',
'update_approvers' => 'Actualizare Listă de aprobatori',
'update_document' => 'Actualizare document',
'update_fulltext_index' => 'Actualizare index pe tot textul (fulltext index)',
'update_fulltext_messages' => '',
'update_info' => 'Informații actualizare',
'update_locked_msg' => 'Acest document este blocat.',
'update_recipients' => '',

View File

@ -526,6 +526,7 @@ URL: [url]',
'dump_remove' => 'Удалить дамп',
'duplicates' => 'Дубликаты',
'duplicate_content' => 'Дублированное содержимое',
'duplicate_sequences' => '',
'edit' => 'Изменить',
'edit_attributes' => 'Изменить атрибуты',
'edit_comment' => 'Изменить комментарий',
@ -632,6 +633,7 @@ URL: [url]',
'extension_mgr_repository' => 'Установленные',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Версии',
'february' => 'Февраль',
@ -765,6 +767,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Ожидание',
'individuals' => 'Пользователи',
'individuals_in_groups' => 'Пользователи группы',
@ -915,6 +918,7 @@ URL: [url]',
'move_clipboard' => 'Переместить буфер обмена',
'move_document' => 'Переместить документ',
'move_folder' => 'Переместить каталог',
'move_into_rootfolder' => '',
'my_account' => 'Моя учётка',
'my_documents' => 'Мои документы',
'my_transmittals' => 'Мои пересылки',
@ -1056,6 +1060,7 @@ URL: [url]',
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: изменён владелец «[name]»',
'parent_folder' => '',
'password' => 'Пароль',
'password_already_used' => 'Пароль уже используется',
'password_expiration' => 'Срок действия пароля',
@ -1099,6 +1104,7 @@ URL: [url]',
'preview' => 'Предварительный просмотр',
'preview_converters' => 'Предварительный просмотр конвертации документа',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => 'Markdown',
'preview_pdf' => '',
'preview_plain' => 'Текст',
@ -1111,6 +1117,7 @@ URL: [url]',
'quota_exceeded' => 'Ваша дисковая квота превышена на [bytes].',
'quota_is_disabled' => 'Поддержка квот в настоящее время отключена в настройках.',
'quota_warning' => 'Ваша дисковая квота превышена на [bytes]. Удалите ненужные документы или их предыдущие версии.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1823,6 +1830,7 @@ URL: [url]',
'set_password' => 'Установить пароль',
'set_workflow' => 'Установить процесс',
'show_extension_changelog' => 'Показать журнал изменений',
'show_extension_readme' => '',
'show_extension_version_list' => 'Показать список версий',
'signed_in_as' => 'Пользователь',
'sign_in' => 'Войти',
@ -2086,6 +2094,7 @@ URL: [url]',
'update_approvers' => 'Обновить список утверждающих',
'update_document' => 'Обновить документ',
'update_fulltext_index' => 'Обновить полнотекстовый индекс',
'update_fulltext_messages' => '',
'update_info' => 'Обновить информацию',
'update_locked_msg' => 'Этот документ заблокирован',
'update_recipients' => 'Обновить список получателей',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => 'Odstrániť vystup',
'duplicates' => 'Duplikáty',
'duplicate_content' => 'Duplicitný obsah',
'duplicate_sequences' => '',
'edit' => 'upraviť',
'edit_attributes' => 'Uprav parametre',
'edit_comment' => 'Upraviť komentár',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => 'Available',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Versions',
'february' => 'Február',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => 'Did not index content',
'index_pending' => 'Pending',
'index_processing' => '',
'index_waiting' => 'Čakajte',
'individuals' => 'Jednotlivci',
'individuals_in_groups' => 'Členovia skupiny',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => 'Presunúť schránku',
'move_document' => 'Presunúť dokument',
'move_folder' => 'Presunúť zložku',
'move_into_rootfolder' => '',
'my_account' => 'Môj účet',
'my_documents' => 'Moje dokumenty',
'my_transmittals' => 'My Transmittals',
@ -1076,6 +1080,7 @@ Používateľ: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Vlastník zmenený',
'parent_folder' => '',
'password' => 'Heslo',
'password_already_used' => 'Heslo sa už používa',
'password_expiration' => 'Vypršanie hesla',
@ -1121,6 +1126,7 @@ If you have still problems to login, then please contact your administrator.',
'preview' => 'Náhľad',
'preview_converters' => 'Ukážka konverzie dokumentu',
'preview_images' => 'Náhľad obrázkov',
'preview_images_text' => '',
'preview_markdown' => 'Markdown',
'preview_pdf' => 'Preview as PDF',
'preview_plain' => 'Text',
@ -1133,6 +1139,7 @@ If you have still problems to login, then please contact your administrator.',
'quota_exceeded' => 'Vaša disková kvóta bola prekročená o [bytes].',
'quota_is_disabled' => 'Podpora kvót je momentálne zakázaná v nastaveniach. Nastavenie kvóty používateľa nebude mať žiadny účinok, kým nebude znovu aktivovaná.',
'quota_warning' => 'Maximálne využitie disku je prekročené o [bytes]. Odstráňte dokumenty alebo predchádzajúce verzie.',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts] receipts already accepted',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '[no_receipts] receipts not being touched',
@ -1856,6 +1863,7 @@ Meno: [username]
'set_password' => 'Nastaviť heslo',
'set_workflow' => 'Set Workflow',
'show_extension_changelog' => 'Show Changelog',
'show_extension_readme' => '',
'show_extension_version_list' => 'Show list of versions',
'signed_in_as' => 'Prihlásený ako',
'sign_in' => 'Prihlásiť sa',
@ -2119,6 +2127,7 @@ URL: [url]',
'update_approvers' => 'Aktualizovať zoznam schvaľovateľov',
'update_document' => 'Aktualizovať',
'update_fulltext_index' => 'Aktualizovať fulltext index',
'update_fulltext_messages' => '',
'update_info' => 'Aktualizovať informácie',
'update_locked_msg' => 'Tento dokument je zamknutý.',
'update_recipients' => 'Aktualizovať zoznam recipientov',

View File

@ -532,6 +532,7 @@ URL: [url]',
'dump_remove' => 'Ta bort dumpfil',
'duplicates' => 'Dubletter',
'duplicate_content' => 'Duplicera innehåll',
'duplicate_sequences' => '',
'edit' => 'Ändra',
'edit_attributes' => 'Ändra attribut',
'edit_comment' => 'Ändra kommentar',
@ -638,6 +639,7 @@ URL: [url]',
'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '',
'february' => 'februari',
@ -771,6 +773,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => 'Förestående',
'index_processing' => '',
'index_waiting' => 'Väntar',
'individuals' => 'Personer',
'individuals_in_groups' => 'Medlemmar i en grupp',
@ -921,6 +924,7 @@ URL: [url]',
'move_clipboard' => 'Flytta urklipp',
'move_document' => 'Flytta dokument',
'move_folder' => 'Flytta katalog',
'move_into_rootfolder' => '',
'my_account' => 'Min Sida',
'my_documents' => 'Mina dokument',
'my_transmittals' => 'Mina överföringar',
@ -1063,6 +1067,7 @@ Användare: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Ägare har ändrats',
'parent_folder' => '',
'password' => 'Lösenord',
'password_already_used' => 'Lösenordet används redan',
'password_expiration' => 'Lösenord utgår',
@ -1105,6 +1110,7 @@ Om du fortfarande har problem med inloggningen, kontakta administratören.',
'preview' => 'Förhandsgranskning',
'preview_converters' => 'Konvertering för förhandsgranskning',
'preview_images' => 'Förhandsgranska bilder',
'preview_images_text' => '',
'preview_markdown' => 'Förminskning',
'preview_pdf' => 'Förhandsgranska som PDF',
'preview_plain' => 'Text',
@ -1117,6 +1123,7 @@ Om du fortfarande har problem med inloggningen, kontakta administratören.',
'quota_exceeded' => 'Din minneskvot har överskridits med [bytes].',
'quota_is_disabled' => 'Kvotstöd är för närvarande inaktiverad i inställningarna. Ett värde för användarkvot kommer inte att ha någon effekt förrän den är aktiverad igen.',
'quota_warning' => 'Din maximala lagringskvot har överskridits med [bytes]. Ta bort dokument eller tidigare versioner.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1829,6 +1836,7 @@ Kommentar: [comment]',
'set_password' => 'Ange lösenord',
'set_workflow' => 'Välj arbetsflöde',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => 'Inloggad som',
'sign_in' => 'Logga in',
@ -2092,6 +2100,7 @@ URL: [url]',
'update_approvers' => 'Uppdatera lista med personer som godkänner',
'update_document' => 'Uppdatera dokument',
'update_fulltext_index' => 'Uppdatera fulltext-index',
'update_fulltext_messages' => '',
'update_info' => 'Uppdatera information',
'update_locked_msg' => 'Dokumentet är låst',
'update_recipients' => 'Uppdatera lista med mottagare',

View File

@ -520,6 +520,7 @@ URL: [url]',
'dump_remove' => 'Dump dosyasını sil',
'duplicates' => '',
'duplicate_content' => 'içeriği_klonla',
'duplicate_sequences' => '',
'edit' => 'Düzenle',
'edit_attributes' => 'Nitelikleri düzenle',
'edit_comment' => 'Açıklamayı düzenle',
@ -626,6 +627,7 @@ URL: [url]',
'extension_mgr_repository' => 'Mevcut',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => 'Veysionlar',
'february' => 'Şubat',
@ -759,6 +761,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => 'Bekliyor',
'individuals' => 'Bireysel',
'individuals_in_groups' => 'Ekip Üyeleri',
@ -909,6 +912,7 @@ URL: [url]',
'move_clipboard' => 'Panoyu taşı',
'move_document' => 'Dokümanı taşı',
'move_folder' => 'Klasörü Taşı',
'move_into_rootfolder' => '',
'my_account' => 'Hesabım',
'my_documents' => 'Dokümanlarım',
'my_transmittals' => 'Çevirilerim',
@ -1051,6 +1055,7 @@ Kullanıcı: [username]
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - Sahip değişti',
'parent_folder' => '',
'password' => 'Parola',
'password_already_used' => 'Bu parola zaten kullanılmış',
'password_expiration' => 'Parola kullanım süresi',
@ -1098,6 +1103,7 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü
'preview' => 'Önizle',
'preview_converters' => '',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => '',
'preview_pdf' => '',
'preview_plain' => '',
@ -1110,6 +1116,7 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü
'quota_exceeded' => 'Size ayrılan disk kotası [bytes] aşıldı.',
'quota_is_disabled' => 'Kota desteği ayarlardan kapatılmış durumda. Açılana kadar kullanıcıya kota tanımlamanın bir etkisi olmaz.',
'quota_warning' => 'Size ayrılan disk kotası [bytes] aşıldı. Lütfen gereksiz olduğunu düşündüğünüz dokümanları veya eski versiyonları silin.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1795,6 +1802,7 @@ URL: [url]',
'set_password' => 'Parola Belirle',
'set_workflow' => 'İş Akışı Tanımla',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => 'Versiyonları görüntüle',
'signed_in_as' => 'Giriş yapan kullanıcı',
'sign_in' => 'Giriş',
@ -2058,6 +2066,7 @@ URL: [url]',
'update_approvers' => 'Onaylayanlar listesini güncelle',
'update_document' => 'Doküman güncelle',
'update_fulltext_index' => 'Tam metin indeksini güncelle',
'update_fulltext_messages' => '',
'update_info' => 'Bilgileri Güncelle',
'update_locked_msg' => 'Bu doküman kilitli.',
'update_recipients' => '',

View File

@ -526,6 +526,7 @@ URL: [url]',
'dump_remove' => 'Видалити дамп',
'duplicates' => '',
'duplicate_content' => 'Дубльований вміст',
'duplicate_sequences' => '',
'edit' => 'Змінити',
'edit_attributes' => 'Змінити атрибути',
'edit_comment' => 'Змінити коментар',
@ -632,6 +633,7 @@ URL: [url]',
'extension_mgr_repository' => '',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '',
'february' => 'Лютий',
@ -765,6 +767,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '',
'index_pending' => '',
'index_processing' => '',
'index_waiting' => '',
'individuals' => 'Користувачі',
'individuals_in_groups' => 'Користувачі групи',
@ -915,6 +918,7 @@ URL: [url]',
'move_clipboard' => 'Перемістити буфер обміну',
'move_document' => 'Перемістити документ',
'move_folder' => 'Перемістити каталог',
'move_into_rootfolder' => '',
'my_account' => 'Мій обліковий запис',
'my_documents' => 'Мої документи',
'my_transmittals' => 'Мої перенесення',
@ -1056,6 +1060,7 @@ URL: [url]',
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: змінено власника «[name]»',
'parent_folder' => '',
'password' => 'Пароль',
'password_already_used' => 'Пароль вже використовується',
'password_expiration' => 'Термін використання паролю',
@ -1099,6 +1104,7 @@ URL: [url]',
'preview' => 'Попередній перегляд',
'preview_converters' => 'Попередній перегляд перетворення документу',
'preview_images' => '',
'preview_images_text' => '',
'preview_markdown' => 'Markdown',
'preview_pdf' => '',
'preview_plain' => 'Текст',
@ -1111,6 +1117,7 @@ URL: [url]',
'quota_exceeded' => 'Ваша дискова квота перевищена на [bytes].',
'quota_is_disabled' => 'Квотування відключено',
'quota_warning' => 'Ваша дискова квота перевищена на [bytes]. Видаліть непотрібні документи або їх попередні версії.',
'readme_loading' => '',
'receipts_accepted' => '',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '',
@ -1816,6 +1823,7 @@ URL: [url]',
'set_password' => 'Встановити пароль',
'set_workflow' => 'Вказати процес',
'show_extension_changelog' => '',
'show_extension_readme' => '',
'show_extension_version_list' => '',
'signed_in_as' => 'Користувач',
'sign_in' => 'Увійти',
@ -2079,6 +2087,7 @@ URL: [url]',
'update_approvers' => 'Оновити список затверджувачів',
'update_document' => 'Оновити документ',
'update_fulltext_index' => 'Оновити повнотекстовий пошук',
'update_fulltext_messages' => '',
'update_info' => 'Оновити інформацію',
'update_locked_msg' => 'Цей документ заблоковано',
'update_recipients' => 'Оновити список отримувачів',

View File

@ -526,6 +526,7 @@ URL: [url]',
'dump_remove' => '删除转储文件',
'duplicates' => '复制',
'duplicate_content' => '重复的内容',
'duplicate_sequences' => '',
'edit' => '编辑',
'edit_attributes' => '编辑属性',
'edit_comment' => '编辑说明',
@ -634,6 +635,7 @@ URL: [url]',
'extension_mgr_repository' => '可得到',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '版本列表',
'february' => '二 月',
@ -767,6 +769,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '没有索引内容',
'index_pending' => '待处理',
'index_processing' => '',
'index_waiting' => '等待',
'individuals' => '个人',
'individuals_in_groups' => '组成员',
@ -917,6 +920,7 @@ URL: [url]',
'move_clipboard' => '移动剪切板',
'move_document' => '移动文档',
'move_folder' => '移动文件夹',
'move_into_rootfolder' => '',
'my_account' => '我的账户',
'my_documents' => '我的文档',
'my_transmittals' => '我的传送',
@ -1059,6 +1063,7 @@ URL: [url]',
URL: [url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - 所有者已更新',
'parent_folder' => '',
'password' => '密码',
'password_already_used' => '密码已被使用',
'password_expiration' => '密码过期',
@ -1104,6 +1109,7 @@ URL: [url]',
'preview' => '预览',
'preview_converters' => '预览文档',
'preview_images' => '预览图片',
'preview_images_text' => '',
'preview_markdown' => 'Markdown',
'preview_pdf' => '作为PDF预览',
'preview_plain' => 'TEXT',
@ -1116,6 +1122,7 @@ URL: [url]',
'quota_exceeded' => '您的磁盘配额已超过 [bytes]。',
'quota_is_disabled' => '配额的支持',
'quota_warning' => '您的磁盘最大使用量已超过 [bytes]。请删除文档或以前的版本。',
'readme_loading' => '',
'receipts_accepted' => '已收到收据',
'receipts_accepted_latest' => '',
'receipts_not_touched' => '未获取收据[no_receipts]',
@ -1803,6 +1810,7 @@ URL: [url]',
'set_password' => '设定密码',
'set_workflow' => '设置工作流',
'show_extension_changelog' => '显示更新记录',
'show_extension_readme' => '',
'show_extension_version_list' => '显示版本列表',
'signed_in_as' => '登录为',
'sign_in' => '登录',
@ -2057,6 +2065,7 @@ URL: [url]',
'update_approvers' => '更新审核人名单',
'update_document' => '更新',
'update_fulltext_index' => '更新全文索引',
'update_fulltext_messages' => '',
'update_info' => '更新信息',
'update_locked_msg' => '该文档被锁定',
'update_recipients' => '更新收件人列表',

View File

@ -538,6 +538,7 @@ URL: [url]',
'dump_remove' => '刪除轉儲檔',
'duplicates' => '重複項',
'duplicate_content' => '重複內容',
'duplicate_sequences' => '',
'edit' => '編輯',
'edit_attributes' => '編輯屬性',
'edit_comment' => '編輯說明',
@ -644,6 +645,7 @@ URL: [url]',
'extension_mgr_repository' => '可用',
'extension_mgr_upload_disabled' => '',
'extension_missing_name' => '',
'extension_readme' => '',
'extension_toggle_error' => '',
'extension_version_list' => '版本',
'february' => '二 月',
@ -784,6 +786,7 @@ URL: [url]',
'index_folder_updated' => '',
'index_no_content' => '沒有索引內容',
'index_pending' => '待定',
'index_processing' => '',
'index_waiting' => '請稍後',
'individuals' => '個人',
'individuals_in_groups' => '小組成員',
@ -934,6 +937,7 @@ URL: [url]',
'move_clipboard' => '移動剪貼簿',
'move_document' => '移動文件',
'move_folder' => '移動資料夾',
'move_into_rootfolder' => '',
'my_account' => '我的帳戶',
'my_documents' => '我的文件',
'my_transmittals' => '我的傳送',
@ -1076,6 +1080,7 @@ URL: [url]',
網址:[url]',
'ownership_changed_email_body_html' => '',
'ownership_changed_email_subject' => '[sitename]: [name] - 擁有者已改變',
'parent_folder' => '',
'password' => '密碼',
'password_already_used' => '密碼已使用',
'password_expiration' => '密碼過期',
@ -1119,6 +1124,7 @@ URL: [url]',
'preview' => '預覽',
'preview_converters' => '預覽文件轉換',
'preview_images' => '預覽圖像',
'preview_images_text' => '',
'preview_markdown' => 'Markdown',
'preview_pdf' => '預覽為PDF',
'preview_plain' => '文本',
@ -1131,6 +1137,7 @@ URL: [url]',
'quota_exceeded' => '您的磁盤配額超出了[bytes]。',
'quota_is_disabled' => '當前在設置中禁用了配額支持。除非再次啟用,否則設置使用者配額將無效。',
'quota_warning' => '您的最大光盤使用量超出了[bytes]。請刪除文檔或以前的版本。',
'readme_loading' => '',
'receipts_accepted' => '[no_receipts]張收據已被接受',
'receipts_accepted_latest' => '(最新版本為[no_receipts]',
'receipts_not_touched' => '[no_receipts]收據未觸及',
@ -1854,6 +1861,7 @@ URL: [url]',
'set_password' => '設定密碼',
'set_workflow' => '設定工作流程',
'show_extension_changelog' => '顯示變更日誌',
'show_extension_readme' => '',
'show_extension_version_list' => '版本列表',
'signed_in_as' => '登錄為',
'sign_in' => '登入',
@ -2117,6 +2125,7 @@ URL: [url]',
'update_approvers' => '更新審核人名單',
'update_document' => '更新',
'update_fulltext_index' => '更新全文索引',
'update_fulltext_messages' => '',
'update_info' => '更新資訊',
'update_locked_msg' => '該文件被鎖定',
'update_recipients' => '',

View File

@ -1,3 +1,4 @@
RewriteEngine on
RewriteCond %{REQUEST_URI} (.*)viewonline/([0-9]+)/([0-9]+)/(.+)$
RewriteRule (.*)viewonline/([0-9]+)/([0-9]+)/(.+)$ $1op.ViewOnline.php?request=$2:$3 [PT]
RewriteEngine on
RewriteCond %{REQUEST_URI} (.*)viewonline/([0-9]+)/([0-9]+)/(.+)$
RewriteRule (.*)viewonline/([0-9]+)/([0-9]+)/(.+)$ $1op.ViewOnline.php?request=$2:$3 [PT]
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
require_once("../inc/inc.Settings.php");
require_once("../inc/inc.LogInit.php");
require_once("../inc/inc.Utils.php");
require_once("../inc/inc.LogInit.php");
require_once("../inc/inc.Language.php");
require_once("../inc/inc.Init.php");
require_once("../inc/inc.Extension.php");

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");
@ -508,7 +508,7 @@ foreach($file_ary as $file) {
}
}
}
add_log_line("?name=".$name."&folderid=".$folderid);
}

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");
include("../inc/inc.DBInit.php");

View File

@ -18,8 +18,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");

View File

@ -18,8 +18,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");

View File

@ -20,8 +20,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
include("../inc/inc.Settings.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Utils.php");
include("../inc/inc.LogInit.php");
include("../inc/inc.Language.php");
include("../inc/inc.Init.php");
include("../inc/inc.Extension.php");

Some files were not shown because too many files have changed in this diff Show More