commit 28b02db2ea6e2c24cdc389c31e239a365559cd8b Author: david Date: Fri Sep 10 16:45:26 2010 +0000 Importación inicial con versión 3.7.0.2 original git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_SGD/tags/3.7.0.2_original@1 eb19766c-00d9-a042-a3a0-45cb8ec72764 diff --git a/about.php b/about.php new file mode 100644 index 0000000..dc48327 --- /dev/null +++ b/about.php @@ -0,0 +1,81 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +// main library routines and defaults +require_once("config/dmsDefaults.php"); +require_once(KT_LIB_DIR . "/unitmanagement/Unit.inc"); + +require_once(KT_LIB_DIR . "/templating/templating.inc.php"); +require_once(KT_LIB_DIR . "/dispatcher.inc.php"); +require_once(KT_LIB_DIR . "/widgets/forms.inc.php"); + +class KTAbout extends KTStandardDispatcher { + var $sSection = 'aboutkt'; + + function do_main() { + global $default; + $this->aBreadcrumbs = array(array('action' => 'aboutkt', 'name' => _kt("About"))); + $oUser =& $this->oUser; + + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate("ktcore/principals/about"); + + $aVersionInfo = explode(' ', $default->versionName); + foreach($aVersionInfo as $sVersionpiece){ + if(substr($sVersionpiece, 1, 1) == '.'){ + $sVersionNo = $sVersionpiece; + }else{ + $sVersionName .= " ".$sVersionpiece; + } + } + + $aTemplateData = array( + "context" => $this, + "versionname" => $sVersionName, + "versionnumber" => $sVersionNo, + 'smallVersion' => substr($default->versionName, -18, -1), + ); + return $oTemplate->render($aTemplateData); + } +} + +$oDispatcher = new KTAbout(); +$oDispatcher->dispatch(); + +?> diff --git a/action.php b/action.php new file mode 100644 index 0000000..972b79c --- /dev/null +++ b/action.php @@ -0,0 +1,201 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +require_once('config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/actions/actionregistry.inc.php'); +require_once(KT_LIB_DIR . '/dispatcher.inc.php'); + +// Strip html tags out of the request action to prevent XSS attacks +// This is done here to ensure that it is done for all places that use the variables. +$_REQUEST['fReturnAction'] = strip_tags($_REQUEST['fReturnAction']); +$_REQUEST['fReturnData'] = strip_tags($_REQUEST['fReturnData']); + +/* + * Using KTStandardDispatcher for errorPage, overriding handleOutput as + * the document action dispatcher will handle that. + */ + +/** + * Dispatcher for action.php/actionname + * + * This dispatcher looks up the action from the Action Registry, and + * then chains onto that action's dispatcher. + */ +class KTActionDispatcher extends KTStandardDispatcher { + /** + * Default dispatch + * + * Find the action, and then use its dispatcher. Error out nicely + * if we aren't so lucky. + */ + function do_main() { + $this->error = false; + $action = KTUtil::arrayGet($_SERVER, 'PATH_INFO'); + $action = trim($action); + $action = trim($action, '/'); + if (empty($action)) { + $this->error = true; + $this->errorPage(_kt('No action given')); + } + $oRegistry =& KTActionRegistry::getSingleton(); + $aActionInfo = $oRegistry->getActionByNsname($action); + if (empty($aActionInfo)) { + $this->error = true; + $this->errorPage(sprintf(_kt('No such action exists in %s'), APP_NAME)); + } + $sFilename = $aActionInfo[1]; + if (!empty($sFilename)) { + require_once($sFilename); + } + $oAction = new $aActionInfo[0]; + $oAction->dispatch(); + } + + function json_main() { + return $this->do_main(); + } + + function getBulkReturnUrl(){ + $sReturnAction = $_REQUEST['fReturnAction']; + $sReturnData = $_REQUEST['fReturnData']; + $sAction = 'main'; + $qs = ''; + + switch ($sReturnAction){ + case 'browse': + $sReturnData = (empty($sReturnData)) ? $_REQUEST['fFolderId'] : $sReturnData; + $sTargetUrl = KTBrowseUtil::getUrlForFolder(Folder::get($sReturnData)); + break; + case 'simpleSearch': + $sTargetUrl = KTBrowseUtil::getSimpleSearchBaseUrl(); + $extra = 'fSearchableText='.$sReturnData; + break; + case 'booleanSearch': + $sTargetUrl = KTBrowseUtil::getBooleanSearchBaseUrl(); + $sAction = 'performSearch'; + $extra = 'boolean_search_id='.$sReturnData; + break; + case 'search2': + $sTargetUrl = KTBrowseUtil::getSearchResultURL(); + $sAction = 'searchResults'; + break; + default: + $sTargetUrl = $sReturnAction; + $sAction = ''; + } + + $qs = (!empty($sAction))? 'action='.$sAction : ''; + $qs .= (!empty($extra))? '&'.$extra : ''; + $sTargetUrl = KTUtil::addQueryString($sTargetUrl, $qs); + + return $sTargetUrl; + } + + function do_bulkaction() { + $act = (array) KTUtil::arrayGet($_REQUEST, 'submit',null); + + $targets = array_keys($act); + if (!empty($targets)) { + $target = $targets[0]; + } else { + $this->errorRedirectToBrowse(_kt('No action selected.')); + exit(0); + } + + $aFolderSelection = KTUtil::arrayGet($_REQUEST, 'selection_f' , array()); + $aDocumentSelection = KTUtil::arrayGet($_REQUEST, 'selection_d' , array()); + + $oFolder = Folder::get(KTUtil::arrayGet($_REQUEST, 'fFolderId', 1)); + if (PEAR::isError($oFolder)) { + $redirectUrl = $this->getBulkReturnUrl(); + if(!empty($redirectUrl)){ + $this->addErrorMessage(_kt('Invalid folder selected.')); + redirect($redirectUrl); + exit(0); + } + $this->errorRedirectToBrowse(_kt('Invalid folder selected.')); + exit(0); + } + + if (empty($aFolderSelection) && empty($aDocumentSelection)) { + $redirectUrl = $this->getBulkReturnUrl(); + if(!empty($redirectUrl)){ + $this->addErrorMessage(_kt('Please select documents or folders first.')); + redirect($redirectUrl); + exit(0); + } + $this->errorRedirectToBrowse(_kt('Please select documents or folders first.'), sprintf('fFolderId=%d', $oFolder->getId())); + exit(0); + } + + // prepare for passing to bulk actions + $oActionRegistry =& KTActionRegistry::getSingleton(); + $oAction =& $oActionRegistry->initializeAction($target, $this->oUser); + + if(!$oAction || PEAR::isError($oAction)) { + $this->errorRedirectToBrowse(_kt('No such action.')); + exit(0); + } + + $oAction->oFolder = $oFolder; + + $oEntityList = new KTEntityList($aDocumentSelection, $aFolderSelection); + $oAction->setEntityList($oEntityList); + $oAction->redispatch('action', 'do_', $this); + + // exit(0); + } + + + /** + * Handle output from this dispatcher. + * + * If there's an error in _this_ dispatcher, use the standard + * surroundings. If not, don't put anything around the output - the + * chained dispatcher will take care of that. + */ + function handleOutput ($data) { + if ($this->bJSONMode || $this->error) { + parent::handleOutput($data); + } else { + print $data; + } + } +} +$d = new KTActionDispatcher(); +$d->dispatch(); diff --git a/admin.php b/admin.php new file mode 100644 index 0000000..16ed8e7 --- /dev/null +++ b/admin.php @@ -0,0 +1,171 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +require_once('config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/templating/kt3template.inc.php'); +require_once(KT_LIB_DIR . '/dispatcher.inc.php'); +require_once(KT_LIB_DIR . '/widgets/portlet.inc.php'); + +require_once(KT_LIB_DIR . '/plugins/KTAdminNavigation.php'); + +class AdminSplashDispatcher extends KTAdminDispatcher { + var $category = ''; + var $sSection = 'administration'; + + function AdminSplashDispatcher() { + $this->aBreadcrumbs = array( + array('url' => KTUtil::getRequestScriptName($_SERVER), 'name' => _kt('Administration')), + ); + + parent::KTAdminDispatcher(); + } + + function do_main() { + if ($this->category !== '') { + return $this->do_viewCategory(); + }; + + + // are we categorised, or not? + $oRegistry =& KTAdminNavigationRegistry::getSingleton(); + $categories = $oRegistry->getCategories(); + $KTConfig =& KTConfig::getSingleton(); + $condensed_admin = $KTConfig->get('condensedAdminUI'); + + $aAllItems = array(); + // we need to investigate sub_url solutions. + if ($condensed_admin) { + foreach ($categories as $aCategory) { + $aItems = $oRegistry->getItemsForCategory($aCategory['name']); + $aAllItems[$aCategory['name']] = $aItems; + } + } + + $this->oPage->title = _kt('Administration') . ': '; + $oTemplating =& KTTemplating::getSingleton(); + + if ($condensed_admin) { + $oTemplate = $oTemplating->loadTemplate('kt3/admin_fulllist'); + } else { + $oTemplate = $oTemplating->loadTemplate('kt3/admin_categories'); + } + + $aTemplateData = array( + 'context' => $this, + 'categories' => $categories, + 'all_items' => $aAllItems, + 'baseurl' => $_SERVER['PHP_SELF'], + ); + return $oTemplate->render($aTemplateData); + } + + function do_viewCategory() { + // are we categorised, or not? + $category = KTUtil::arrayGet($_REQUEST, 'fCategory', $this->category); + + //Removing bad documents/fieldmanagement links from the Document Metadata and Workflow Configuration page. + if ($category == 'documents') { + $oPage =& $GLOBALS['main']; + $aJavascript[] = 'thirdpartyjs/jquery/jquery-1.3.2.js'; + $oPage->requireJSResources($aJavascript); + $jscript .= ""; + } + + $oRegistry =& KTAdminNavigationRegistry::getSingleton(); + $aCategory = $oRegistry->getCategory($category); + + $aItems = $oRegistry->getItemsForCategory($category); + asort($aItems); + $this->aBreadcrumbs[] = array('name' => $aCategory['title'], 'url' => KTUtil::ktLink('admin.php',$category)); + + $this->oPage->title = _kt('Administration') . ': ' . $aCategory['title']; + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('kt3/admin_items'); + $aTemplateData = array( + 'context' => $this, + 'category' => $aCategory, + 'items' => $aItems, + 'baseurl' => $_SERVER['PHP_SELF'], + 'jscript' => $jscript, + ); + return $oTemplate->render($aTemplateData); + } +} + +$sub_url = KTUtil::arrayGet($_SERVER, 'PATH_INFO'); + +$sub_url = trim($sub_url); +$sub_url= trim($sub_url, '/'); + +if (empty($sub_url)) { + $oDispatcher = new AdminSplashDispatcher(); +} else { + $oRegistry =& KTAdminNavigationRegistry::getSingleton(); + if ($oRegistry->isRegistered($sub_url)) { + $oDispatcher = $oRegistry->getDispatcher($sub_url); + + $aParts = explode('/',$sub_url); + + $oRegistry =& KTAdminNavigationRegistry::getSingleton(); + $aCategory = $oRegistry->getCategory($aParts[0]); + + $oDispatcher->aBreadcrumbs = array(); + $oDispatcher->aBreadcrumbs[] = array('action' => 'administration', 'name' => _kt('Administration')); + $oDispatcher->aBreadcrumbs[] = array('name' => $aCategory['title'], 'url' => KTUtil::ktLink('admin.php',$aParts[0])); + + } else { + // FIXME (minor) redirect to no-suburl? + $oDispatcher = new AdminSplashDispatcher(); + $oDispatcher->category = $sub_url; + } +} + +// Implement an electronic signature for accessing the admin section, it will appear every 10 minutes +global $main; +global $default; +if($default->enableAdminSignatures && $_SESSION['electronic_signature_time'] < time()){ + $sBaseUrl = KTUtil::kt_url(); + $sUrl = KTPluginUtil::getPluginPath('electronic.signatures.plugin', true); + $heading = _kt('You are attempting to access Administration'); + $main->setBodyOnload("javascript: showSignatureForm('{$sUrl}', '{$heading}', 'dms.administration.administration_section_access', 'admin', '{$sBaseUrl}/browse.php', 'close');"); +} + + +$oDispatcher->dispatch(); // we _may_ be redirected at this point (see KTAdminNavigation) + +?> diff --git a/bin/.htaccess b/bin/.htaccess new file mode 100644 index 0000000..3d19990 --- /dev/null +++ b/bin/.htaccess @@ -0,0 +1,4 @@ +Order deny,allow +Allow from all + +IndexIgnore *.* diff --git a/bin/ajaxtasks/downloadTask.php b/bin/ajaxtasks/downloadTask.php new file mode 100644 index 0000000..90acbc1 --- /dev/null +++ b/bin/ajaxtasks/downloadTask.php @@ -0,0 +1,47 @@ +isDownloadAvailable($code); + + if($status === false){ + echo 'wait'; + }else{ + $str = ''; + // display any error messages + if(!empty($status)){ + $str = '
'._kt('The following errors occurred during the download').':
'; + $str .= ''; + foreach ($status as $msg){ + $str .= ''; + } + $str .= '
'.$msg.'
'; + } + echo $str; + } + exit(0); +} + +if($queue->isLocked()){ + exit(0); +} +// Not a ping, process the queue +$queue->processQueue(); + +exit(0); +?> \ No newline at end of file diff --git a/bin/automated_upgrade.php b/bin/automated_upgrade.php new file mode 100644 index 0000000..80b9c87 --- /dev/null +++ b/bin/automated_upgrade.php @@ -0,0 +1,94 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +require_once('../config/dmsDefaults.php'); +require_once(KT_DIR . '/lib/upgrades/upgrade.inc.php'); + +if (!($default->dbAdminUser && $default->dbAdminPass)) { + print "You need to set up the administrator user for your database.\n"; + print "Consult docs/UPGRADE.txt for more information\n"; + exit(1); +} + +if (PEAR::isError($default->_admindb)) { + print "Your database administrator user credentials can not login.\n"; + print "Consult docs/UPGRADE.txt for more information.\n"; + exit(1); +} + +$query = sprintf('SELECT value FROM %s WHERE name = "knowledgeTreeVersion"', $default->system_settings_table); +$lastVersion = DBUtil::getOneResultKey($query, 'value'); +$currentVersion = $default->systemVersion; + +$action = $_SERVER['argv'][1]; +if (empty($action)) { + $action = 'show'; +} + +$upgrades = describeUpgrade($lastVersion, $currentVersion); + +$i = 1; +foreach ($upgrades as $step) { + print "Upgrade step $i: " . $step->getDescription(); + $bApplied = $step->isAlreadyApplied(); + $i++; + if ($bApplied) { + print " (already applied)\n"; + continue; + } + print "\n"; + if ($action == 'show') { + continue; + } + $res = $step->performUpgrade(); + print ' RESULT: '; + if ($res === true) { + print 'Success'; + } + if (PEAR::isError($res)) { + if (is_a($res, strtolower('Upgrade_Already_Applied'))) { + print 'Already applied'; + } else { + print "ERROR\n"; + print $res->toString(); + } + } + print "\n"; +} + +?> diff --git a/bin/checkopenoffice.php b/bin/checkopenoffice.php new file mode 100644 index 0000000..95033eb --- /dev/null +++ b/bin/checkopenoffice.php @@ -0,0 +1,199 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + */ + +chdir(realpath(dirname(__FILE__))); +require_once('../config/dmsDefaults.php'); + +/* +Script checks if open office is running, if it isn't then it attempts to start it. + +Windows Vista always returns false if we try and check the host and port +so for windows we use the win32 service status checks. + +*/ + +// Check if the calling function requires a return value +$sGiveOutput = (isset($argv[1]) && $argv[1] == 'output') ? true : false; + +// Check indexed document count +// If the number of indexed documents is greater than the set amount, restart open office +// this clears open office's memory usage +$resetPoint = 50; // todo: put in config +$count = Indexer::getIndexedDocumentCount(); + +$restartOO = false; +if($count > $resetPoint){ + $restartOO = true; + + // reset the count + Indexer::updateIndexedDocumentCount(0); + $default->log->debug('Check Open Office Task: Restarting open office.'); +} + +// First we check the host:port to see if open office is running +$sCheckOO = SearchHelper::checkOpenOfficeAvailablity(); + +if(empty($sCheckOO) && !$restartOO){ + // If the check returns empty then it is available on that port so we exit + if($sGiveOutput){ + echo 1; + } + exit; +} + +// Open office appears not to be running or requires a restart +if(OS_WINDOWS){ + $OOService = 'ktopenoffice'; + $default->log->debug('Check Open Office Task: ' . get_current_user()); + + if($restartOO){ + // If Open office needs to be restarted - stop it here + $result_stop = win32_stop_service($OOService); + + + // Wait for the service to stop fully before trying to restart it + $continue = false; + $cnt = 0; + while($continue === false && $cnt < 15){ + $result = win32_query_service_status($OOService); + + if(isset($result['ProcessId']) && $result['ProcessId'] != 0){ + // If there is still a process id then the service has not stopped yet. + sleep(2); + $continue = false; + $cnt++; + }else{ + $continue = true; + } + } + }else{ + // If this is vista, checking the port may not work so we query the service + $result = win32_query_service_status($OOService); + + if(is_array($result)){ + $iProcessId = $result['ProcessId']; + if(!empty($iProcessId) && $iProcessId != 0){ + // If there is a process id (PID) then open office is running so we exit + if($sGiveOutput){ + echo 1; + } + exit; + } + } + } + + // Service is not running - log it and attempt to start + $default->log->error('Check Open Office Task: Open office service is not running... trying to start it.'); + + // Use the win32 service start + $result2 = win32_start_service($OOService); + + if($result2 == 0){ + // Service started successfully + $default->log->debug('Check Open Office Task: Open office service started.'); + if($sGiveOutput){ + echo 1; + } + exit; + } + + $default->log->error('Check Open Office Task: Open office service could not be started. Error code '.$result2); + + // Attempt using the dmsctl batch script + $sPath = realpath('../../bin/dmsctl.bat'); + + if(file_exists($sPath)){ + $sCmd = "\"$sPath\" start"; + $default->log->debug('Check Open Office Task: ' . get_current_user()); + $default->log->debug('Check Open Office Task: ' . $sCmd); + + $res = KTUtil::pexec($sCmd); + + $default->log->debug('Check Open Office Task: Attempted start using dmsctl.bat.'); + if($sGiveOutput){ + echo 2; + } + exit; + }else{ + $default->log->debug('Check Open Office Task: Can\'t find dmsctl.bat, this may be a source install.'); + if($sGiveOutput){ + echo 0; + } + exit; + } +}else{ + // If the OS is Unix or Linux + $sPath = realpath('../../dmsctl.sh'); + if(file_exists($sPath)){ + // If Open office needs to be restarted - stop it here + if($restartOO){ + $sCmd = "\"$sPath\" restart soffice >/dev/null &"; + $default->log->debug('Check Open Office Task: ' . get_current_user()); + $default->log->debug('Check Open Office Task: ' . $sCmd); + + KTUtil::pexec($sCmd); + + $default->log->debug('Check Open Office Task: Attempted restart using dmsctl.sh.'); + }else{ + $sCmd = "\"$sPath\" start soffice >/dev/null &"; + $default->log->debug('Check Open Office Task: ' . get_current_user()); + $default->log->debug('Check Open Office Task: ' . $sCmd); + + KTUtil::pexec($sCmd); + + $default->log->debug('Check Open Office Task: Attempted start using dmsctl.sh.'); + } + if($sGiveOutput){ + echo 2; + } + exit; + }else{ + $default->log->debug('Check Open Office Task: Can\'t find dmsctl.sh, this may be a source install.'); + if($sGiveOutput){ + echo 0; + } + exit; + } +} +$default->log->debug('Check Open Office Task: Can\'t start Open office, this may be a source install.'); +if($sGiveOutput){ + echo 0; +} +exit(0); +?> diff --git a/bin/cleanup.php b/bin/cleanup.php new file mode 100644 index 0000000..1a10a3f --- /dev/null +++ b/bin/cleanup.php @@ -0,0 +1,202 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +require_once('../config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/config/config.inc.php'); +require_once(KT_LIB_DIR . '/browse/browseutil.inc.php'); + +$oConfig =& KTConfig::getSingleton(); +$fsPath = $oConfig->get('urls/documentRoot'); + +$aIgnore = array( + '.', '..', + 'CVS', + '.empty', + '.htaccess', + '.cvsignore', +); + +$aFoldersToRemove = array(); +$aFilesToRemove = array(); +$aRepoDocumentProblems = array(); +$aRepoFolderProblems = array(); +$aRepoVersionProblems = array(); + +function checkFileVersion($path, $version) { + $fod = KTBrowseUtil::folderOrDocument($path); + if ($fod === false) { + // No document by that name, so no point checking version + // information. + return; + } + return true; +} + +function checkFile($path, $first = true) { + $pattern = "/^(.*)-((?:\d+)\.(?:\d+))$/"; + if (preg_match($pattern, $path, $matches)) { + if (checkFileVersion($matches[1], $matches[2])) { + // If it's a version, then don't check for full path + // below... + return; + } + } + $fod = KTBrowseUtil::folderOrDocument($path); + if ($fod === false) { + $GLOBALS['aFilesToRemove'][] = $path; + return; + } +} + +function checkDirectory($path) { + global $fsPath, $aIgnore; + $fullpath = sprintf('%s/%s', $fsPath, $path); + + if (!is_dir($fullpath)) { + print "Not a directory: $fullpath\n"; + } + + if ($path === '/Deleted') { + // Deleted files handled separately. + return; + } + + if (!empty($path)) { + $fod = KTBrowseUtil::folderOrDocument($path); + if ($fod === false) { + $GLOBALS['aFoldersToRemove'][] = $path; + return; + } + } + + $dh = @opendir($fullpath); + if ($dh === false) { + print "Could not open directory: $fullpath\n"; + } + while (($filename = readdir($dh)) !== false) { + if (in_array($filename, $aIgnore)) { continue; } + $subrelpath = sprintf('%s/%s', $path, $filename); + $subfullpath = sprintf('%s/%s', $fsPath, $subrelpath); + if (is_dir($subfullpath)) { + checkDirectory($subrelpath); + } + if (is_file($subfullpath)) { + checkFile($subrelpath); + } + } +} + +function checkRepoFolder($oFolder) { + global $fsPath, $aRepoFolderProblems; + $sFolderPath = sprintf('%s/%s', $oFolder->getFullPath(), $oFolder->getName()); + $sFullPath = sprintf('%s/%s', $fsPath, $sFolderPath); + if (!is_dir($sFullPath)) { + $aRepoFolderProblems[] = $sFolderPath; + } +} + +function checkRepoDocument($oDocument) { + global $fsPath, $aRepoDocumentProblems; + $sDocumentPath = $oDocument->getStoragePath(); + $sFullPath = sprintf('%s/%s', $fsPath, $sDocumentPath); + if (!is_file($sFullPath)) { + $aRepoDocumentProblems[] = $sDocumentPath; + } + checkRepoVersions($oDocument); +} + +function checkRepoVersions($oDocument) { + global $fsPath, $aRepoVersionProblems; + $table = 'document_transactions'; + $aVersions = DBUtil::getResultArrayKey(array("SELECT DISTINCT version FROM $table WHERE document_id = ?", array($oDocument->getID())), 'version'); + foreach($aVersions as $sVersion) { + if ($sVersion == $oDocument->getVersion()) { + continue; + } + $sDocumentPath = $oDocument->getStoragePath(); + $sFullPath = sprintf('%s/%s-%s', $fsPath, $sDocumentPath, $sVersion); + if (!is_file($sFullPath)) { + $aRepoVersionProblems[] = array($sDocumentPath, $sVersion); + continue; + } + } +} + +checkDirectory(''); + +print "\n"; +print "Would remove these folders (and all their contents):\n"; +foreach ($aFoldersToRemove as $path) { + print "\t$path\n"; +} +print "\n"; +print "Would remove these files:\n"; +foreach ($aFilesToRemove as $path) { + print "\t$path\n"; +} +print "\n"; + +$aFolders =& Folder::getList(); +foreach ($aFolders as $oFolder) { + checkRepoFolder($oFolder); +} + +print "These folders are not on the filesystem:\n"; +foreach ($aRepoFolderProblems as $path) { + print "\t$path\n"; +} + +$aDocuments =& Document::getList(array('status_id = ?', array(LIVE))); +foreach ($aDocuments as $oDocument) { + checkRepoDocument($oDocument); +} +print "\n"; + +print "These documents are not on the filesystem:\n"; +foreach ($aRepoDocumentProblems as $path) { + print "\t$path\n"; +} +print "\n"; + +print "These documents have versions not on the filesystem:\n"; +foreach ($aRepoVersionProblems as $path) { + list($path, $version) = $path; + print "\t$path - version $version\n"; +} +print "\n"; + diff --git a/bin/dbmaint.php b/bin/dbmaint.php new file mode 100644 index 0000000..efd3aba --- /dev/null +++ b/bin/dbmaint.php @@ -0,0 +1,58 @@ + 0) +{ + foreach($argv as $arg) + { + $action=strtolower($arg); + switch ($action) + { + case 'repair': + $sqlaction='repair table'; + break; + case 'optimize': + $sqlaction='optimize table'; + break; + case 'help': + print "Usage: dbmaint.php repair|check|optimize\n"; + exit; + case 'check': + default: + $action = 'check'; + $sqlaction='check table'; + break; + } + } +} + +$default->log->info("DB Maintenance... \nAction selected: {$action}"); + +$sql = "show tables"; +$tables = DBUtil::getResultArray($sql); + +if(!empty($tables)){ + foreach($tables as $table) + { + $key = array_keys($table); + + $tablename=$table[$key[0]]; + $sql = "$sqlaction $tablename;"; + $result = DBUtil::getOneResult($sql); + + if (PEAR::isError($result)) + { + $default->log->error('Attempted: '.$sql); + $default->log->error(' *: '.$result->getMessage()); + continue; + } + $default->log->info('Running: '.$sql .' - '. $result['Msg_text']); + } +} + +$default->log->info('Done.'); +exit; +?> diff --git a/bin/diagtools/ReportTemplate.html b/bin/diagtools/ReportTemplate.html new file mode 100644 index 0000000..6090888 --- /dev/null +++ b/bin/diagtools/ReportTemplate.html @@ -0,0 +1 @@ +
[heading]
[content]
\ No newline at end of file diff --git a/bin/diagtools/winDiag.php b/bin/diagtools/winDiag.php new file mode 100644 index 0000000..8dfa8b4 --- /dev/null +++ b/bin/diagtools/winDiag.php @@ -0,0 +1,22 @@ +$results){ + $test=ucwords($test); + $report[]=str_replace(array('[heading]','[content]'),array($test,$results),$template); + } + + $report=join('',$report); + + echo $report; +*/ +?> \ No newline at end of file diff --git a/bin/expungeall.php b/bin/expungeall.php new file mode 100644 index 0000000..581713e --- /dev/null +++ b/bin/expungeall.php @@ -0,0 +1,104 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + */ + +require_once('../config/dmsDefaults.php'); +require_once('../ktapi/ktapi.inc.php'); + +/** + * This script expects the following in the config.ini: + * [autoexpunge] + * admin=admin + * password=admin + * maximum=50 + * + * admin and password is required to expunge documents from the system. + * + * maximum is the maximum number of documents that should be expunged from the system in one run. + * + */ + +$start_time = time(); + +$config = KTConfig::getSingleton(); +$user = $config->get('autoexpunge/admin','admin'); +$password = $config->get('autoexpunge/password','admin'); +$maximum = $config->get('autoexpunge/maximum',50); + +$ktapi = new KTAPI(); +$session = $ktapi->start_session($user, $password); +if (PEAR::isError($session)) +{ + $default->log->debug('Expunge_all task: Can\'t create session: '.$session->getMessage()); + return; +} + +$sql = sprintf("SELECT id FROM documents WHERE status_id=%d LIMIT %d", DELETED, $maximum); + +$rows = DBUtil::getResultArray($sql); +$count = count($rows); + +if ($count == 0) +{ + $default->log->debug('Expunge_all task: Nothing to do.'); + $session->logout(); + return; +} + +foreach($rows as $row) +{ + $id = $row['id']; + + $document = $ktapi->get_document_by_id($id); + $title = $document->get_title(); + + $default->log->info('Expunge_all task: Document to expunge, ID: '.$id.' Name: '.$title); + $result = $document->expunge(); + if (PEAR::isError($result)) + { + $default->log->error('Expunge_all task: document can\'t be expunged: '.$result->getMessage()); + } +} + +$end_time = time(); + +$diff = $end_time - $start_time; + +$session->logout(); +exit; +?> diff --git a/bin/genpo.sh b/bin/genpo.sh new file mode 100644 index 0000000..bfc380b --- /dev/null +++ b/bin/genpo.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +DIR=`dirname $0` +cd $DIR +cd .. +pwd + +#pull in comm stuff +#cp -R ../commercial-plugins/alerts plugins/commercial/ +#cp -R ../commercial-plugins/conditional-metadata plugins/commercial/ +#cp -R ../commercial-plugins/custom-numbering plugins/commercial/ +#cp -R ../commercial-plugins/documentcomparison plugins/commercial/ +#cp -R ../commercial-plugins/network plugins/commercial/ +#cp -R ../commercial-plugins/professional-reporting plugins/commercial/ +#cp -R ../commercial-plugins/shortcuts plugins/commercial/ +#cp -R ../commercial-plugins/wintools plugins/commercial/ +#cp -R ../commercial-plugins/guidInserter plugins/commercial/ +#cp -R ../commercial-plugins/clienttools plugins/commercial/ +#cp -R ../commercial-plugins/electronic-signatures plugins/commercial/ +#cp -R ../commercial-plugins/officeaddin plugins/commercial/ +#cp -R ../ktofficeAddIn/ktoffice ktoffice + +cp -R ../commercial-plugins plugins/commercial +cp -R ../ktofficeaddin/ktoffice ktoffice + +rm -f i18n/templates.c +find resources -name "*.js" | sort | python ./bin/jsi18n.py > templates/ktcore/javascript_i18n.smarty +php bin/smarty_to_gettext.php . > i18n/templates.c +find . -type f -name "*.php" -o -name "*.inc" | sort | xgettext --no-wrap -d knowledgeTree -L PHP -s -f - --keyword=_kt -o i18n/knowledgeTree.pot +echo i18n/templates.c i18n/transactions.c i18n/permissions.c | xargs -n 1 | sort | xgettext --no-wrap -d knowledgeTree -j -s -f - -o i18n/knowledgeTree.pot + +# ktoffice js tamplate file generation +cd ktoffice/pogenerator +php generatetemplate.php > ../../templates/ktcore/ktoffice_i18n.smarty +cd ../../ + +#remove comm stuff again +rm -rf plugins/commercial +rm -rf ktoffice + +#alerts conditional-metadata custom-numbering documentcomparison i18n network professional-reporting shortcuts wintools guidInserter clienttools electronic-signatures officeaddin + +# Manually append some strings with #appname# issues +echo ' ' >> i18n/knowledgeTree.pot +echo 'msgid "By default, KnowledgeTree controls its own users and groups and stores all information about them inside the database. In many situations, an organisation will already have a list of users and groups, and needs to use that existing information to allow access to the DMS. These Authentication Sources allow the system administrator to specify additional sources of authentication data."' >> i18n/knowledgeTree.pot +echo 'msgstr ""' >> i18n/knowledgeTree.pot + +echo 'msgid "This report lists all mime types and extensions that can be identified by KnowledgeTree."' >> i18n/knowledgeTree.pot +echo 'msgstr ""' >> i18n/knowledgeTree.pot diff --git a/bin/jsi18n.py b/bin/jsi18n.py new file mode 100644 index 0000000..63c6571 --- /dev/null +++ b/bin/jsi18n.py @@ -0,0 +1,65 @@ +#!/usr/bin/python +# +# JS Gettext-style extractor. + +import re +import sys + +usage_str = ''' + Extracts _() items in JS. + + Usage: jsi18n.py [list of files] > output.smarty +''' + +baseline = ''' +/* + * Javascript (actual translations); + */ + +{literal} +var i18n = {}; + +function _(trans_string) { + var newstr = i18n[trans_string]; + if (!isUndefinedOrNull(newstr)) { return newstr; } + else { + return trans_string; + } +} +{/literal} + + +''' + +peritem = "i18n['%s'] = '{i18n}%s{/i18n}';\n" + +# this is not the best way to do this ... + +class JSExtractor: + def __init__(self, filename): + self.strings = [] + handle = file(filename, 'r') + self.content = handle.read() + handle.close() + + def process(self): + proc = re.compile('(_\(\'(.*?)\'\))') + self.strings = [i[1] for i in proc.findall(self.content)] + + def getStrings(self): + out = '' + for l in self.strings: + out += peritem%(l, l) + return out + +if __name__ == '__main__': + fake_po = baseline + + filelist = sys.stdin.readlines() + for filename in filelist: + processor = JSExtractor(filename[:-1]) + processor.process() + fake_po += "\n// strings for file: %s\n"%(filename[:-1]); + fake_po += processor.getStrings() + + print fake_po \ No newline at end of file diff --git a/bin/luceneserver/KTLuceneService.exe b/bin/luceneserver/KTLuceneService.exe new file mode 100644 index 0000000..9512a08 Binary files /dev/null and b/bin/luceneserver/KTLuceneService.exe differ diff --git a/bin/luceneserver/KnowledgeTreeIndexer.Logging.properties b/bin/luceneserver/KnowledgeTreeIndexer.Logging.properties new file mode 100644 index 0000000..63cba91 --- /dev/null +++ b/bin/luceneserver/KnowledgeTreeIndexer.Logging.properties @@ -0,0 +1,9 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=INFO, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n diff --git a/bin/luceneserver/KnowledgeTreeIndexer.properties b/bin/luceneserver/KnowledgeTreeIndexer.properties new file mode 100644 index 0000000..b753946 --- /dev/null +++ b/bin/luceneserver/KnowledgeTreeIndexer.properties @@ -0,0 +1,6 @@ +server.port=8875 +server.paranoid=false +server.accept=127.0.0.1 +server.deny= +indexer.directory=/var/lib/knowledgetree-ce/indexes +indexer.analyzer=org.apache.lucene.analysis.standard.StandardAnalyzer diff --git a/bin/luceneserver/README.TXT b/bin/luceneserver/README.TXT new file mode 100644 index 0000000..dc18164 --- /dev/null +++ b/bin/luceneserver/README.TXT @@ -0,0 +1,87 @@ +Lucene XML-RPC Server +--------------------- + +Prerequisites +============= + +This requires Java 1.5+ to be installed. + + +Starting the Lucene Server Manually +=================================== + +cd c:\program files\ktdms\knowledgeTree\bin\luceneserver +;cd /opt/ktdms/knowledgeTree/bin/luceneserver +java -jar ktlucene.jar + +Starting the Lucene Server in the background under Windows +========================================================== + +The best is to install a service wrapper application called JavaService. This can be obtained from http://forge.objectweb.org/projects/javaservice/ and is licensed under LGPL. + +Rename JavaService.exe to KTLuceneService.exe and place it in the KTLUCENEDIR folder. + +To install the service: + ; you may need to edit the JVMLIB. note - there is also bin\client\jvm.dll sometimes. + SET JVMLIB=c:\j2sdk\jre\bin\server\jvm.dll + SET KTLUCENEDIR=c:\program files\ktdms\knowledgeTree\bin\luceneserver + SET KTLUCENECLASS=%PROXYDIR%\ktlucene.jar + SET OUTFILE=%KTLUCENEDIR%\out.txt + SET ERRFILE=%KTLUCENEDIR%\err.txt + KTLuceneService.exe -install "KTLuceneService" %JVMLIB% -Djava.class.path=%KTLUCENECLASS% -start KTLuceneService -auto -out %OUTFILE% -err %ERRFILE% + + +To uninstall the service: + KTLuceneService -uninstall "KTLuceneService" + +Starting the Lucene Service in the background under Linux/Unix +============================================================== + +cd c:\program files\ktdms\knowledgeTree\bin\luceneserver +;cd /opt/ktdms/knowledgeTree/bin/luceneserver +nohup java -jar ktlucene.jar 2>&1 & + + +KnowledgeTreeIndexer.Logging.properties +======================================= + +The Lucene server uses log4j as the logging library. More information regarding +configuration may be obtained from http://www.apache.org + +To enable debugging, change + log4j.rootLogger=INFO, A1 +to + log4j.rootLogger=DEBUG, A1 + + +TODO... discuss logrotation with log4j. + + +KnowledgeTreeIndexer.properties +=============================== + +; specifies the port on which the system will listen for requests +server.port=8080 +; if paranoid, only 'acceptable ip addresses will be able to make requests. +server.paranoid=false +; the list of acceptable ip addresses +server.accept=127.0.0.1,192.168.1.1 +; the folder where the lucene server will store the indexes +indexer.directory=../../var/indexes + +Licensing +========= + +The Java based KnowledgeTree XML-RPC Server utilises the following jar files: + +commons-lang-2.3.jar - Apache License +log4j-1.2.14.jar - Apache License +lucene-core-2.1.0.jar - Apache License +lucene-highlighter-2.1.0.jar - Apache License +NTEventLogAppender.dll - Apache License +commons-logging-1.1.jar - Apache License +ws-commons-util-1.0.1.jar - Apache License +xmlrpc-common-3.0.jar - Apache License +xmlrpc-server-3.0.jar - Apache License + +For more information, visit http://www.apache.org diff --git a/bin/luceneserver/ktlucene.jar b/bin/luceneserver/ktlucene.jar new file mode 100644 index 0000000..92192d0 Binary files /dev/null and b/bin/luceneserver/ktlucene.jar differ diff --git a/bin/luceneserver/lib/NTEventLogAppender.dll b/bin/luceneserver/lib/NTEventLogAppender.dll new file mode 100644 index 0000000..975c975 Binary files /dev/null and b/bin/luceneserver/lib/NTEventLogAppender.dll differ diff --git a/bin/luceneserver/lib/asm-3.1.jar b/bin/luceneserver/lib/asm-3.1.jar new file mode 100644 index 0000000..8217cae Binary files /dev/null and b/bin/luceneserver/lib/asm-3.1.jar differ diff --git a/bin/luceneserver/lib/commons-codec-1.3.jar b/bin/luceneserver/lib/commons-codec-1.3.jar new file mode 100644 index 0000000..957b675 Binary files /dev/null and b/bin/luceneserver/lib/commons-codec-1.3.jar differ diff --git a/bin/luceneserver/lib/commons-io-1.4.jar b/bin/luceneserver/lib/commons-io-1.4.jar new file mode 100644 index 0000000..133dc6c Binary files /dev/null and b/bin/luceneserver/lib/commons-io-1.4.jar differ diff --git a/bin/luceneserver/lib/commons-lang-2.3.jar b/bin/luceneserver/lib/commons-lang-2.3.jar new file mode 100644 index 0000000..c33b353 Binary files /dev/null and b/bin/luceneserver/lib/commons-lang-2.3.jar differ diff --git a/bin/luceneserver/lib/commons-logging-1.1.jar b/bin/luceneserver/lib/commons-logging-1.1.jar new file mode 100644 index 0000000..2ff9bbd Binary files /dev/null and b/bin/luceneserver/lib/commons-logging-1.1.jar differ diff --git a/bin/luceneserver/lib/fontbox-0.1.0.jar b/bin/luceneserver/lib/fontbox-0.1.0.jar new file mode 100644 index 0000000..acb1d7b Binary files /dev/null and b/bin/luceneserver/lib/fontbox-0.1.0.jar differ diff --git a/bin/luceneserver/lib/icu4j-3.4.4.jar b/bin/luceneserver/lib/icu4j-3.4.4.jar new file mode 100644 index 0000000..f5e8c16 Binary files /dev/null and b/bin/luceneserver/lib/icu4j-3.4.4.jar differ diff --git a/bin/luceneserver/lib/java_uno.jar b/bin/luceneserver/lib/java_uno.jar new file mode 100644 index 0000000..7213e48 Binary files /dev/null and b/bin/luceneserver/lib/java_uno.jar differ diff --git a/bin/luceneserver/lib/jodconverter-2.2.2.jar b/bin/luceneserver/lib/jodconverter-2.2.2.jar new file mode 100644 index 0000000..d033256 Binary files /dev/null and b/bin/luceneserver/lib/jodconverter-2.2.2.jar differ diff --git a/bin/luceneserver/lib/juh-3.0.1.jar b/bin/luceneserver/lib/juh-3.0.1.jar new file mode 100644 index 0000000..1e38c5c Binary files /dev/null and b/bin/luceneserver/lib/juh-3.0.1.jar differ diff --git a/bin/luceneserver/lib/junit-3.8.1.jar b/bin/luceneserver/lib/junit-3.8.1.jar new file mode 100644 index 0000000..674d71e Binary files /dev/null and b/bin/luceneserver/lib/junit-3.8.1.jar differ diff --git a/bin/luceneserver/lib/jurt-3.0.1.jar b/bin/luceneserver/lib/jurt-3.0.1.jar new file mode 100644 index 0000000..3e2b117 Binary files /dev/null and b/bin/luceneserver/lib/jurt-3.0.1.jar differ diff --git a/bin/luceneserver/lib/log4j-1.2.14.jar b/bin/luceneserver/lib/log4j-1.2.14.jar new file mode 100644 index 0000000..6251307 Binary files /dev/null and b/bin/luceneserver/lib/log4j-1.2.14.jar differ diff --git a/bin/luceneserver/lib/lucene-core-2.1.0.jar b/bin/luceneserver/lib/lucene-core-2.1.0.jar new file mode 100644 index 0000000..6660095 Binary files /dev/null and b/bin/luceneserver/lib/lucene-core-2.1.0.jar differ diff --git a/bin/luceneserver/lib/lucene-highlighter-2.1.0.jar b/bin/luceneserver/lib/lucene-highlighter-2.1.0.jar new file mode 100644 index 0000000..bc034c2 Binary files /dev/null and b/bin/luceneserver/lib/lucene-highlighter-2.1.0.jar differ diff --git a/bin/luceneserver/lib/nekohtml-0.9.5.jar b/bin/luceneserver/lib/nekohtml-0.9.5.jar new file mode 100644 index 0000000..ebd5b4b Binary files /dev/null and b/bin/luceneserver/lib/nekohtml-0.9.5.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/dom4j-1.6.1.jar b/bin/luceneserver/lib/ooxml-lib/dom4j-1.6.1.jar new file mode 100644 index 0000000..c8c4dbb Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/dom4j-1.6.1.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/jaxen-1.1.jar b/bin/luceneserver/lib/ooxml-lib/jaxen-1.1.jar new file mode 100644 index 0000000..8215192 Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/jaxen-1.1.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/jsr173_1.0_api.jar b/bin/luceneserver/lib/ooxml-lib/jsr173_1.0_api.jar new file mode 100644 index 0000000..fef9a9c Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/jsr173_1.0_api.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/ooxml-schemas.jar b/bin/luceneserver/lib/ooxml-lib/ooxml-schemas.jar new file mode 100644 index 0000000..1639286 Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/ooxml-schemas.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/openxml4j-bin-alpha-080407.jar b/bin/luceneserver/lib/ooxml-lib/openxml4j-bin-alpha-080407.jar new file mode 100644 index 0000000..725848f Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/openxml4j-bin-alpha-080407.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/openxml4j-bin-beta-080728.jar b/bin/luceneserver/lib/ooxml-lib/openxml4j-bin-beta-080728.jar new file mode 100644 index 0000000..c891587 Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/openxml4j-bin-beta-080728.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/openxml4j-src-alpha-080407.jar b/bin/luceneserver/lib/ooxml-lib/openxml4j-src-alpha-080407.jar new file mode 100644 index 0000000..219926e Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/openxml4j-src-alpha-080407.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/xercesImpl-2.8.1.jar b/bin/luceneserver/lib/ooxml-lib/xercesImpl-2.8.1.jar new file mode 100644 index 0000000..3b351f6 Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/xercesImpl-2.8.1.jar differ diff --git a/bin/luceneserver/lib/ooxml-lib/xmlbeans-2.3.0.jar b/bin/luceneserver/lib/ooxml-lib/xmlbeans-2.3.0.jar new file mode 100644 index 0000000..ccd8163 Binary files /dev/null and b/bin/luceneserver/lib/ooxml-lib/xmlbeans-2.3.0.jar differ diff --git a/bin/luceneserver/lib/pdfbox-0.7.3.jar b/bin/luceneserver/lib/pdfbox-0.7.3.jar new file mode 100644 index 0000000..9bfe670 Binary files /dev/null and b/bin/luceneserver/lib/pdfbox-0.7.3.jar differ diff --git a/bin/luceneserver/lib/poi-3.5-beta5/poi-3.5-beta5.jar b/bin/luceneserver/lib/poi-3.5-beta5/poi-3.5-beta5.jar new file mode 100644 index 0000000..4989e1d Binary files /dev/null and b/bin/luceneserver/lib/poi-3.5-beta5/poi-3.5-beta5.jar differ diff --git a/bin/luceneserver/lib/poi-3.5-beta5/poi-contrib-3.5-beta5.jar b/bin/luceneserver/lib/poi-3.5-beta5/poi-contrib-3.5-beta5.jar new file mode 100644 index 0000000..ab07ee0 Binary files /dev/null and b/bin/luceneserver/lib/poi-3.5-beta5/poi-contrib-3.5-beta5.jar differ diff --git a/bin/luceneserver/lib/poi-3.5-beta5/poi-ooxml-3.5-beta5.jar b/bin/luceneserver/lib/poi-3.5-beta5/poi-ooxml-3.5-beta5.jar new file mode 100644 index 0000000..fa142d3 Binary files /dev/null and b/bin/luceneserver/lib/poi-3.5-beta5/poi-ooxml-3.5-beta5.jar differ diff --git a/bin/luceneserver/lib/poi-3.5-beta5/poi-scratchpad-3.5-beta5.jar b/bin/luceneserver/lib/poi-3.5-beta5/poi-scratchpad-3.5-beta5.jar new file mode 100644 index 0000000..99efcb9 Binary files /dev/null and b/bin/luceneserver/lib/poi-3.5-beta5/poi-scratchpad-3.5-beta5.jar differ diff --git a/bin/luceneserver/lib/ridl-3.0.1.jar b/bin/luceneserver/lib/ridl-3.0.1.jar new file mode 100644 index 0000000..5976c18 Binary files /dev/null and b/bin/luceneserver/lib/ridl-3.0.1.jar differ diff --git a/bin/luceneserver/lib/slf4j-api-1.5.6.jar b/bin/luceneserver/lib/slf4j-api-1.5.6.jar new file mode 100644 index 0000000..d794252 Binary files /dev/null and b/bin/luceneserver/lib/slf4j-api-1.5.6.jar differ diff --git a/bin/luceneserver/lib/slf4j-jdk14-1.5.6.jar b/bin/luceneserver/lib/slf4j-jdk14-1.5.6.jar new file mode 100644 index 0000000..1ce0a28 Binary files /dev/null and b/bin/luceneserver/lib/slf4j-jdk14-1.5.6.jar differ diff --git a/bin/luceneserver/lib/tika-app-0.4.jar b/bin/luceneserver/lib/tika-app-0.4.jar new file mode 100644 index 0000000..b4d6306 Binary files /dev/null and b/bin/luceneserver/lib/tika-app-0.4.jar differ diff --git a/bin/luceneserver/lib/unoil-3.0.1.jar b/bin/luceneserver/lib/unoil-3.0.1.jar new file mode 100644 index 0000000..5dfd090 Binary files /dev/null and b/bin/luceneserver/lib/unoil-3.0.1.jar differ diff --git a/bin/luceneserver/lib/unoloader.jar b/bin/luceneserver/lib/unoloader.jar new file mode 100644 index 0000000..2a19f08 Binary files /dev/null and b/bin/luceneserver/lib/unoloader.jar differ diff --git a/bin/luceneserver/lib/ws-commons-util-1.0.1.jar b/bin/luceneserver/lib/ws-commons-util-1.0.1.jar new file mode 100644 index 0000000..3769ee5 Binary files /dev/null and b/bin/luceneserver/lib/ws-commons-util-1.0.1.jar differ diff --git a/bin/luceneserver/lib/xmlrpc-common-3.0.jar b/bin/luceneserver/lib/xmlrpc-common-3.0.jar new file mode 100644 index 0000000..e7aebd2 Binary files /dev/null and b/bin/luceneserver/lib/xmlrpc-common-3.0.jar differ diff --git a/bin/luceneserver/lib/xmlrpc-server-3.0.jar b/bin/luceneserver/lib/xmlrpc-server-3.0.jar new file mode 100644 index 0000000..246ff6f Binary files /dev/null and b/bin/luceneserver/lib/xmlrpc-server-3.0.jar differ diff --git a/bin/luceneserver/lib/xstream-1.3.1.jar b/bin/luceneserver/lib/xstream-1.3.1.jar new file mode 100644 index 0000000..4ef4219 Binary files /dev/null and b/bin/luceneserver/lib/xstream-1.3.1.jar differ diff --git a/bin/luceneserver/msvcr71.dll b/bin/luceneserver/msvcr71.dll new file mode 100644 index 0000000..9d9e028 Binary files /dev/null and b/bin/luceneserver/msvcr71.dll differ diff --git a/bin/md5_validation.php b/bin/md5_validation.php new file mode 100644 index 0000000..8bdb891 --- /dev/null +++ b/bin/md5_validation.php @@ -0,0 +1,149 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + */ + +require_once('../config/dmsDefaults.php'); + +print "KnowledgeTree MD5 Validation Tool\n"; +print "=================================\n\n"; +print "NOTE: This utility make take some time to run to completion!\n\n"; + +$sql = "SELECT + dcv.id, dmv.document_id, MAX(dmv.id) AS metadata_version_id, MAX(dmv.metadata_version) AS metadata_version + FROM + document_content_version AS dcv + INNER JOIN document_metadata_version AS dmv ON dcv.id = dmv.content_version_id + GROUP BY + dcv.id + ORDER BY dcv.document_id"; + +$rows = DBUtil::getResultArray(array($sql)); + +$total = count($rows); +$problem = 0; +$ok = 0; +$no_hash = 0; +$current = 0; +$dots = 0; + +foreach($rows as $row) +{ + if (++$current % 100 == 0) + { + print '.'; + if ($dots++ % 60 == 0) + { + print "\n"; + } + } + $content_id = $row['id']; + $document_id = $row['document_id']; + $metadata_version = $row['metadata_version']; + $metadata_version_id = $row['metadata_version_id']; + + $document = Document::get($document_id, $metadata_version_id); + $core = &$document->_oDocumentContentVersion; + + $filename = $document->getFileName(); + $md5 = $core->getStorageHash(); + + if (empty($md5)) + { + if ($dots > 0) print "\n"; + print("Document Id: $document_id - Content Id: $content_id - No MD5 hash available.\n"); + + $no_hash++; + $current = 0; $dots = 0; + // don't exit here, we do so later + } + + $storage = KTStorageManagerUtil::getSingleton(); + $storage_path = $storage->temporaryFile($document); + if (PEAR::isError($storage_path)) + { + if ($dots > 0) print "\n"; + print("Document Id: $document_id - Content Id: $content_id - Storage engine reported an error: " . $storage_path->getMessage() . "\n"); + + $no_hash++; + $current = 0; $dots = 0; + continue; + } + if (!file_exists($storage_path)) + { + if ($dots > 0) print "\n"; + print("Document Id: $document_id - Content Id: $content_id - File '$storage_path' cannot be found!\n"); + + $no_hash++; + $current = 0; $dots = 0; + continue; + } + + $actual_md5 = md5_file($storage_path); + + $storage->freeTemporaryFile($storage_path); + + if (empty($md5)) + { + $core->setStorageHash($actual_md5); + $core->update(); + print("\tHash set to: $actual_md5\n"); + continue; + } + + + if ($md5 != $actual_md5) + { + if ($dots > 0) print "\n"; + print("Document Id: $document_id - Content ID: $content_id - MD5 difference\n"); + print("\tStored MD5: $md5\n"); + print("\tCurrent MD5: $actual_md5\n"); + $problem++; + $current = 0; $dots = 0; + continue; + } + $ok++; +} + +print("\nStatistics:\n"); +print("\tNo Problem:\t$ok\n"); +print("\tProblem:\t$problem\n"); +print("\tNo Hash:\t$no_hash\n"); +print("\tTotal:\t\t$total\n"); + + +?> diff --git a/bin/openoffice/DocumentConverter.py b/bin/openoffice/DocumentConverter.py new file mode 100644 index 0000000..89e84e7 --- /dev/null +++ b/bin/openoffice/DocumentConverter.py @@ -0,0 +1,162 @@ +# +# PyODConverter (Python OpenDocument Converter) v0.9 - 2007-04-05 +# +# This script converts a document from one office format to another by +# connecting to an OpenOffice.org instance via Python-UNO bridge. +# +# Copyright (C) 2007 Mirko Nasato +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +# +# Modified by Kevin Fourie +# Contributions by Xavier Duret, Conrad Vermeulen + +#DEFAULT_OPENOFFICE_PORT = 8100 + +import os, sys, glob + +extrapaths = glob.glob('/usr/lib*/openoffice*/program/') + glob.glob('/usr/lib*/ooo*/program') + [ '/Applications/NeoOffice.app/Contents/program', 'c:/program files/ktdms/openoffice/program' ] + +ooProgramPath = os.environ.get('ooProgramPath') +if not ooProgramPath is None: + extrapaths = [ ooProgramPath ] + extrapaths + +for path in extrapaths: + try: + sys.path.append(path) + import uno + os.environ['PATH'] = '%s:' % path + os.environ['PATH'] + break + except ImportError: + sys.path.remove(path) + continue +else: + print >>sys.stderr, "PyODConverter: Cannot find the pyuno.so library in sys.path and known paths." + sys.exit(1) + +from os.path import abspath, splitext +from com.sun.star.beans import PropertyValue +from com.sun.star.connection import NoConnectException + +FAMILY_PRESENTATION = "Presentation" +FAMILY_SPREADSHEET = "Spreadsheet" +FAMILY_TEXT = "Text" + +FAMILY_BY_EXTENSION = { + "odt": FAMILY_TEXT, + "sxw": FAMILY_TEXT, + "doc": FAMILY_TEXT, + "rtf": FAMILY_TEXT, + "txt": FAMILY_TEXT, + "wpd": FAMILY_TEXT, + "html": FAMILY_TEXT, + "ods": FAMILY_SPREADSHEET, + "sxc": FAMILY_SPREADSHEET, + "xls": FAMILY_SPREADSHEET, + "odp": FAMILY_PRESENTATION, + "sxi": FAMILY_PRESENTATION, + "ppt": FAMILY_PRESENTATION +} + +FILTER_BY_EXTENSION = { + "pdf": { + FAMILY_TEXT: "writer_pdf_Export", + FAMILY_SPREADSHEET: "calc_pdf_Export", + FAMILY_PRESENTATION: "impress_pdf_Export" + }, + "html": { + FAMILY_TEXT: "HTML (StarWriter)", + FAMILY_SPREADSHEET: "HTML (StarCalc)", + FAMILY_PRESENTATION: "impress_html_Export" + }, + "odt": { FAMILY_TEXT: "writer8" }, + "doc": { FAMILY_TEXT: "MS Word 97" }, + "rtf": { FAMILY_TEXT: "Rich Text Format" }, + "txt": { FAMILY_TEXT: "Text" }, + "ods": { FAMILY_SPREADSHEET: "calc8" }, + "xls": { FAMILY_SPREADSHEET: "MS Excel 97" }, + "odp": { FAMILY_PRESENTATION: "impress8" }, + "ppt": { FAMILY_PRESENTATION: "MS PowerPoint 97" }, + "swf": { FAMILY_PRESENTATION: "impress_flash_Export" } +} + + +class DocumentConversionException(Exception): + + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message + + +def _unoProps(**args): + props = [] + for key in args: + prop = PropertyValue() + prop.Name = key + prop.Value = args[key] + props.append(prop) + return tuple(props) + + +class DocumentConverter: + + def __init__(self, host, port): + localContext = uno.getComponentContext() + resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext) + try: + context = resolver.resolve("uno:socket,host=%s,port=%s;urp;StarOffice.ComponentContext" % (host, port)) + except NoConnectException: + raise DocumentConversionException, "failed to connect to OpenOffice.org on port %s" % port + self.desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context) + + def convert(self, inputFile, outputFile): + inputExt = self._fileExt(inputFile) + outputExt = self._fileExt(outputFile) + + filterName = self._filterName(inputExt, outputExt) + + inputUrl = self._fileUrl(argv[1]) + outputUrl = self._fileUrl(argv[2]) + + document = self.desktop.loadComponentFromURL(inputUrl, "_blank", 0, _unoProps(Hidden=True, ReadOnly=True)) + document.storeToURL(outputUrl, _unoProps(FilterName=filterName)) + document.close(True) + + def _filterName(self, inputExt, outputExt): + try: + family = FAMILY_BY_EXTENSION[inputExt] + except KeyError: + raise DocumentConversionException, "unknown input format: '%s'" % inputExt + try: + filterByFamily = FILTER_BY_EXTENSION[outputExt] + except KeyError: + raise DocumentConversionException, "unknown output format: '%s'" % outputExt + try: + return filterByFamily[family] + except KeyError: + raise DocumentConversionException, "unsupported conversion: from '%s' to '%s'" % (inputExt, outputExt) + + def _fileExt(self, path): + ext = splitext(path)[1] + if ext is not None: + return ext[1:].lower() + + def _fileUrl(self, path): + return uno.systemPathToFileUrl(abspath(path)) + + +if __name__ == "__main__": + from sys import argv, exit + + if len(argv) < 3: + print "USAGE: " + argv[0] + " " + exit(255) + + try: + converter = DocumentConverter(argv[3],argv[4]) + converter.convert(argv[1], argv[2]) + except DocumentConversionException, exception: + print "ERROR! " + str(exception) + exit(1) + diff --git a/bin/openoffice/pdfgen.py b/bin/openoffice/pdfgen.py new file mode 100644 index 0000000..9638212 --- /dev/null +++ b/bin/openoffice/pdfgen.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python +# +# $Id$ +# +# KnowledgeTree Community Edition +# Document Management Made Simple +# Copyright (C) 2008, 2009 KnowledgeTree Inc. +# +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License version 3 as published by the +# Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, +# California 94120-7775, or email info@knowledgetree.com. +# +# The interactive user interfaces in modified source and object code versions +# of this program must display Appropriate Legal Notices, as required under +# Section 5 of the GNU General Public License version 3. +# +# In accordance with Section 7(b) of the GNU General Public License version 3, +# these Appropriate Legal Notices must retain the display of the "Powered by +# KnowledgeTree" logo and retain the original copyright notice. If the display of the +# logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices +# must display the words "Powered by KnowledgeTree" and retain the original +# copyright notice. +# Contributor( s): ______________________________________ +# + +import os, sys, glob + +extrapaths = glob.glob('/usr/lib*/openoffice*/program/') + glob.glob('/usr/lib*/ooo*/program') + [ '/Applications/NeoOffice.app/Contents/program', 'c:/program files/ktdms/openoffice/program' ] + +ooProgramPath = os.environ.get('ooProgramPath') +if not ooProgramPath is None: + extrapaths = [ ooProgramPath ] + extrapaths + +for path in extrapaths: + try: + sys.path.append(path) + import uno + os.environ['PATH'] = '%s:' % path + os.environ['PATH'] + break + except ImportError: + sys.path.remove(path) + continue +else: + print >>sys.stderr, "PyODConverter: Cannot find the pyuno.so library in sys.path and known paths." + sys.exit(1) + +from com.sun.star.beans import PropertyValue + +NoConnectException = uno.getClass("com.sun.star.connection.NoConnectException") +IllegalArgumentException = uno.getClass("com.sun.star.lang.IllegalArgumentException") +RuntimeException = uno.getClass("com.sun.star.uno.RuntimeException") +IOException = uno.getClass("com.sun.star.io.IOException") + +url_original = uno.systemPathToFileUrl(sys.argv[1]) +url_save = uno.systemPathToFileUrl(sys.argv[2]) + +try: + ### Get Service Manager + context = uno.getComponentContext() + resolver = context.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", context) + ctx = resolver.resolve("uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext") + smgr = ctx.ServiceManager + + ### Load document + properties = [] + p = PropertyValue() + p.Name = "Hidden" + p.Value = True + properties.append(p) + properties = tuple(properties) + + desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx) + +except NoConnectException, e: + sys.stderr.write("OpenOffice process not found or not listening (" + e.Message + ")\n") + sys.exit(1) +except IllegalArgumentException, e: + sys.stderr.write("The url is invalid ( " + e.Message + ")\n") + sys.exit(1) +except RuntimeException, e: + sys.stderr.write("An unknown error occured: " + e.Message + "\n") + +try: + doc = desktop.loadComponentFromURL(url_original, "_blank", 0, properties) +except IOException, e: + sys.stderr.write("URL couldn't be found or was corrupt (" + e.Message + ")\n") + sys.exit(1) +except IllegalArgumentException, e: + sys.stderr.write("Given parameters don't conform to the specification ( " + e.Message + ")\n") + sys.exit(1) +except RuntimeException, e: + sys.stderr.write("An unknown error occured: " + e.Message + "\n") + +if doc == None: + sys.stderr.write("The document could not be opened for conversion. This could indicate an unsupported mimetype.\n") + sys.exit(1) + + +### Save File +properties = [] +p = PropertyValue() +p.Name = "Overwrite" +p.Value = True +properties.append(p) +p = PropertyValue() +p.Name = "FilterName" +p.Value = 'writer_pdf_Export' +properties.append(p) +properties = tuple(properties) + +try: + doc.storeToURL(url_save, properties) + doc.dispose() +except IOException, e: + sys.stderr.write("URL (" + url_save + ") couldn't be found or was corrupt (" + e.Message + ")\n") + sys.exit(1) +except IllegalArgumentException, e: + sys.stderr.write("Given parameters don't conform to the specification ( " + e.Message + ")\n") + sys.exit(1) +except RuntimeException, e: + sys.stderr.write("An unknown error occured: " + e.Message + "\n") diff --git a/bin/recreateIndexes.php b/bin/recreateIndexes.php new file mode 100644 index 0000000..37efbba --- /dev/null +++ b/bin/recreateIndexes.php @@ -0,0 +1,63 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +/* + * PURPOSE: This script will recreate the indexes on the database. It will also attempt to add foreign key constraints. + * + * It will produce 'errors' when there are issues. Many may be ignored as some do not apply to open source. + */ + +define('USE_DB_ADMIN_USER',1); +chdir(dirname(__FILE__)); +require_once('../config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/database/schema.inc.php'); + +print _kt('Recreate DB Indexes') . "...\n\n"; + +ini_set('display_errors','Off'); +$schemautil = KTSchemaUtil::getSingleton(); + +$schemautil->dropForeignKeys(); +$schemautil->dropPrimaryKeys(); +$schemautil->dropIndexes(); +$schemautil->createPrimaryKeys(); +$schemautil->createForeignKeys(); +$schemautil->createIndexes(); + +?> diff --git a/bin/releaseKT.sh b/bin/releaseKT.sh new file mode 100644 index 0000000..4665823 --- /dev/null +++ b/bin/releaseKT.sh @@ -0,0 +1,73 @@ +#!/bin/sh +# +# script to checkout the latest tagged build from cvs and upload +# to the remote server of your choice + +## functions + +# displays the script usage message +# +usage() { + echo "usage: `basename $0` -b branch -v version" + echo " eg. `basename $0` -b BRANCH_1_0_1_20030728 -v 1.1.2" + exit 1 +} + +deploy() { + # cleanup + rm -rf $tmp 2> /dev/null + mkdir $tmp + + # export kt + cd $tmp + cvs -d $cvsroot co -r $branch -N knowledgeTree + cvs -d $cvsroot co -r $branch -N "knowledgeTree/Documents/Root Folder/Default Unit" + find . -name CVS -exec rm -rf {} \; 2> /dev/null + + # tar it up + rm /tmp/knowledgeTree-$version.tgz 2> /dev/null + tar -czvf /tmp/knowledgeTree-$version.tgz knowledgeTree + + # convert src to windoze line-endings + find $tmp/knowledgeTree -name \*\.php -exec unix2dos {} \; 2> /dev/null + find $tmp/knowledgeTree -name \*\.inc -exec unix2dos {} \; 2> /dev/null + find $tmp/knowledgeTree -name \*\.txt -exec unix2dos {} \; 2> /dev/null + + # zip it up + rm /tmp/knowledgeTree-$version.zip 2> /dev/null + zip -r /tmp/knowledgeTree-$version.zip knowledgeTree + + # move them to this dir + cd - + mv /tmp/knowledgeTree-$version.* . + + # clean up + rm -rf $tmp 2> /dev/null +} + +# check the command line options +if [ $# -lt 2 ]; then + usage +fi + +# process the params +while getopts ":b:v:" Option +do + case $Option in + b ) branch=$OPTARG;; + v ) version=$OPTARG;; + * ) usage;; + esac +done + +# check that everything we want is set +if [ -z $branch -o -z $version ]; then + usage +fi + +# setup up some paths and stuff +cvsroot=/usr/local/cvsroot +tmp=/tmp/dms + +# now just do it +deploy diff --git a/bin/scheduler.php b/bin/scheduler.php new file mode 100644 index 0000000..345a3b6 --- /dev/null +++ b/bin/scheduler.php @@ -0,0 +1,284 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ +chdir(dirname(__FILE__)); +require_once('../config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/database/dbutil.inc'); + +// Set the time limit to 0 to prevent the script timing out +set_time_limit(0); + +global $default; + +// Check the lock file before starting +$lock = $default->cacheDirectory . DIRECTORY_SEPARATOR . 'scheduler.lock'; +if(file_exists($lock)){ + $default->log->debug('Scheduler: can\'t start - lock file exists'); + exit(0); +} + +// NOTE commented out because it was causing problems with the new locations in KnowledgeTree 3.7 +/* +// If this is *nix and we are root then make sure file permisions are correct +if(!OS_WINDOWS && (get_current_user() == 'root')) +{ + // The log files... + try { + $default->log->debug( 'Scheduler: setting owner to nobody on - '.$default->logDirectory); + exec('chown -R nobody:0 '.escapeshellcmd($default->logDirectory)); + } catch(Exception $e) { + $default->log->error('Scheduler: can\'t set owner to nobody - '.$e); + } +} +*/ + +/* ** Set up functions ** */ + +// Calculate the next run time based on the frequency of iteration and the given time +function calculateRunTime($sFreq, $iTime) { + + switch($sFreq){ + case 'monthly': + $iDays = date('t'); + $iDiff = (60*60)*24*$iDays; + break; + case 'weekly': + $iDiff = (60*60)*24*7; + break; + case 'daily': + $iDiff = (60*60)*24; + break; + case 'hourly': + $iDiff = (60*60); + break; + case 'half_hourly': + $iDiff = (60*30); + break; + case 'quarter_hourly': + $iDiff = (60*15); + break; + case '10mins': + $iDiff = (60*10); + break; + case '5mins': + $iDiff = (60*5); + break; + case '1min': + $iDiff = 60; + break; + case '30secs': + $iDiff = 30; + break; + case 'once': + $iDiff = 0; + break; + } + $iNextTime = $iTime + $iDiff; + return $iNextTime; +} + +// Update the task information in the database +function updateTask($aFieldValues, $iId) { + DBUtil::autoUpdate('scheduler_tasks', $aFieldValues, $iId); +} + +// Get the list of tasks due to be run from the database +function getTaskList() { + $now = date('Y-m-d H:i:s'); //time(); + + $query = "SELECT * FROM scheduler_tasks WHERE is_complete = 0 AND run_time < '{$now}' AND status != 'disabled'"; + + $result = DBUtil::getResultArray($query); + + if (PEAR::isError($result)){ + return false; + } + return $result; +} + +/* ** Scheduler script ** */ + +$default->log->debug('Scheduler: starting'); + +// Get task list +$aList = getTaskList(); +if (empty($aList)) +{ + $default->log->debug('Scheduler: stopping - nothing to do'); + return; +} + +// Loop through tasks and run + + foreach($aList as $item) + { + $aUpdate = array(); + $iEnd = 0; $iStart = 0; $iDuration = 0; + $sFreq = ''; $sParameters = ''; + $retval = TRUE; + + // Set up start variables + $sTask = $item['task']; + $sTaskUrl = $item['script_url']; + $iDuration = $item['run_duration']; + $sFreq = $item['frequency']; + $sParameters = $item['script_params']; + + // Check if script is windows or *nix compatible + $ext = pathinfo($sTaskUrl, PATHINFO_EXTENSION); + $script = substr($sTaskUrl,0,-strlen($ext)-1); + + if(OS_WINDOWS) + { + $mapping = array('sh'=>'bin','bat'=>'exe'); + if (array_key_exists($ext, $mapping)) + { + $sTaskUrl = $script . '.' . $mapping[$ext]; + } + } + else + { + $mapping = array('bat'=>'sh', 'exe'=>'bin'); + + if (array_key_exists($ext, $mapping)) + { + switch ($ext) + { + case 'exe': + if (is_executable(KT_DIR . '/' . $script)) + { + $sTaskUrl = $script; + break; + } + default: + $sTaskUrl = $script . '.' . $mapping[$ext]; + } + } + + if (!is_executable(KT_DIR . '/' . $script) && $ext != 'php') + { + $default->log->error("Scheduler: The script '{$sTaskUrl}' is not executable."); + continue; + } + } + + $file = realpath(KT_DIR . '/' . $sTaskUrl); + + if ($file === false) + { + $default->log->error("Scheduler: The script '{$sTaskUrl}' cannot be resolved."); + continue; + } + + $iTime = time(); + $iStart = KTUtil::getBenchmarkTime(); + + // Run the script + + $cmd = "\"$file\" {$sParameters}"; + + if ($ext == 'php') + { + $oKTConfig = KTConfig::getSingleton(); + $phpPath = $oKTConfig->get('externalBinary/php', 'php'); + //$phpPath = KTUtil::findCommand('externalBinary/php'); + + // being protective as some scripts work on relative paths + $dirname = dirname($file); + chdir($dirname); + + $cmd = "\"$phpPath\" $cmd"; + } + + if (OS_WINDOWS) + { $default->log->debug("Scheduler - dirname: $dirname cmd: $cmd"); + //$WshShell = new COM("WScript.Shell"); + //$res = $WshShell->Run($cmd, 0, true); + + KTUtil::pexec($cmd); + + } + else + { + $cmd .= (strtolower($sTask) == 'openoffice test') ? ' >/dev/null &' : ' 2>&1'; + + $default->log->debug("Scheduler cmd: $cmd"); + $res = shell_exec($cmd); + } + + // On completion - reset run time + $iEnd = KTUtil::getBenchmarkTime(); + $iDuration = number_format($iEnd - $iStart,2); + + + $ignore = array('openoffice test'); + + if (!empty($res)) + { + $func = in_array(strtolower($sTask), $ignore)?'debug':'info'; + + $default->log->$func("Scheduler - Task: $sTask"); + $default->log->$func("Scheduler - Command: $cmd"); + $default->log->$func("Scheduler - Output: $res"); + $default->log->$func("Scheduler - Background tasks should not produce output. Please review why this is producing output."); + + } + else + { + $default->log->debug("Scheduler - Task: {$sTask} completed in {$iDuration}s."); + } + + if(($sFreq == 'once' || empty($sFreq)) && $retval !== FALSE) + { + // Set is_complete to true + $aUpdate['is_complete'] = '1'; + } + else + { + $iNextTime = calculateRunTime($sFreq, $iTime); + $aUpdate['run_time'] = date('Y-m-d H:i:s', $iNextTime); + } + + $aUpdate['previous_run_time'] = date('Y-m-d H:i:s', $iTime); + $aUpdate['run_duration'] = $iDuration; + + updateTask($aUpdate, $item['id']); + } + +$default->log->debug('Scheduler: stopping'); +exit(0); +?> diff --git a/bin/smarty_to_gettext.php b/bin/smarty_to_gettext.php new file mode 100644 index 0000000..358f423 --- /dev/null +++ b/bin/smarty_to_gettext.php @@ -0,0 +1,132 @@ +#!/usr/bin/env php + <..> > smarty.c + * + * If a parameter is a directory, the template files within will be parsed. + * + * @version $Id$ + * @link http://smarty-gettext.sf.net/ + * @author Sagi Bashari + * @copyright 2004-2005 Sagi Bashari + */ + +// smarty open tag +$ldq = preg_quote('{'); + +// smarty close tag +$rdq = preg_quote('}'); + +// smarty command +$cmd = preg_quote('i18n'); + +// extensions of smarty files, used when going through a directory +$extensions = array('smarty'); + +// "fix" string - strip slashes, escape and convert new lines to \n +function fs($str) +{ + $str = stripslashes($str); + $str = trim($str); + $str = str_replace('"', '\"', $str); + $str = str_replace("\n", '\n', $str); + return $str; +} + +// rips gettext strings from $file and prints them in C format +function do_file($file) +{ + $content = @file_get_contents($file); + + if (empty($content)) { + return; + } + + global $ldq, $rdq, $cmd; + + preg_match_all( + "/{$ldq}\s*({$cmd})\s*([^{$rdq}]*){$rdq}([^{$ldq}]*){$ldq}\/\\1{$rdq}/", + $content, + $matches + ); + + for ($i=0; $i < count($matches[0]); $i++) { + // TODO: add line number + echo "/* $file */\n"; // credit: Mike van Lammeren 2005-02-14 + + $content = $matches[3][$i]; + if (!preg_match('/formatmatters\s*=\s*["\']?\s*(.[^\"\']*)\s*["\']?/', $matches[2][$i], $match)) { + $replace = array( + '@ *[\n\r]+@' => ' ', + ); + $content = preg_replace(array_keys($replace), array_values($replace), $content); + } + if (preg_match('/plural\s*=\s*["\']?\s*(.[^\"\']*)\s*["\']?/', $matches[2][$i], $match)) { + echo 'ngettext("'.fs($content).'","'.fs($match[1]).'",x);'."\n"; + } else { + echo 'gettext("'.fs($content).'");'."\n"; + } + + echo "\n"; + } +} + +// go through a directory +function do_dir($dir) +{ + $d = dir($dir); + + while (false !== ($entry = $d->read())) { + if ($entry == '.' || $entry == '..') { + continue; + } + + $entry = $dir.'/'.$entry; + + if (is_dir($entry)) { // if a directory, go through it + do_dir($entry); + } else { // if file, parse only if extension is matched + $pi = pathinfo($entry); + + if (isset($pi['extension']) && in_array($pi['extension'], $GLOBALS['extensions'])) { + do_file($entry); + } + } + } + + $d->close(); +} + +for ($ac=1; $ac < $_SERVER['argc']; $ac++) { + if (is_dir($_SERVER['argv'][$ac])) { // go through directory + do_dir($_SERVER['argv'][$ac]); + } else { // do file + do_file($_SERVER['argv'][$ac]); + } +} + +?> diff --git a/bin/storageverification.php b/bin/storageverification.php new file mode 100644 index 0000000..65766d1 --- /dev/null +++ b/bin/storageverification.php @@ -0,0 +1,190 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + */ + +require_once(dirname(__FILE__) . '/../config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/storage/storagemanager.inc.php'); + +// TODO: this does not verify files that are in the storage system, but not on the database. It is better that the storage system +// be in sync with the database. However, we should have a better way to query the storage driver to give us a list of files. + +class StorageVerification +{ + private $count; + private $lineCount; + private $doc; + const DOCS_PER_DOT = 100; + const DOTS_PER_LINE = 80; + private $nl; + private $tab; + + private + function error($msg) + { + $doc = $this->doc; + $documentId = $doc->getId(); + $path = $doc->getFullPath(); + $filename = $doc->getFileName(); + $storagePath = $doc->getStoragePath(); + + print "{$this->nl}{$this->nl}"; + print "Problem with Document ID: {$documentId}{$this->nl}"; + print "{$this->tab}Path: {$path}{$this->nl}"; + print "{$this->tab}Filename: {$filename}{$this->nl}"; + print "{$this->tab}StoragePath: {$storagePath}{$this->nl}"; + print "{$this->tab}Problem: {$msg}{$this->nl}{$this->nl}"; + flush(); + $this->count = 0; + $this->lineCount = 0; + $this->clearCache(); + } + + private + function progress() + { + if ($this->count++ % StorageVerification::DOCS_PER_DOT == 0) + { + $this->lineCount++; + print '.'; + flush(); + } + + if ($this->lineCount == StorageVerification::DOTS_PER_LINE ) + { + print "{$this->nl}"; + flush(); + $this->lineCount = 0; + } + $this->clearCache(); + } + + private + function clearCache() + { + $metadataid = $this->doc->getMetadataVersionId(); + $contentid = $this->doc->getContentVersionId(); + $iId = $this->doc->getId(); + $cache = KTCache::getSingleton(); + $cache->remove('KTDocumentMetadataVersion/id', $metadataid); + $cache->remove('KTDocumentContentVersion/id', $contentid); + $cache->remove('KTDocumentCore/id', $iId); + $cache->remove('Document/id', $iId); + unset($GLOBALS['_OBJECTCACHE']['KTDocumentMetadataVersion'][$metadataid]); + unset($GLOBALS['_OBJECTCACHE']['KTDocumentContentVersion'][$contentid]); + unset($GLOBALS['_OBJECTCACHE']['KTDocumentCore'][$iId]); + + unset($this->doc); + } + + public + function run() + { + global $argc; + + if (isset($argc)) + { + $this->nl = "\n"; + $this->tab = "\t"; + print "Storage Verification{$this->nl}"; + print "===================={$this->nl}"; + } + else + { + $this->nl = '
'; + $this->tab = '    '; + print "Storage Verification{$this->nl}"; + + } + + + + $sql = "SELECT + dmv.id as metadata_version_id, dcv.document_id, dcv.md5hash, dcv.size + FROM + document_content_version dcv + INNER JOIN document_metadata_version dmv ON dcv.id=dmv.content_version_id"; + $rows = DBUtil::getResultArray($sql); + $this->count = 0; + $this->lineCount = 0; + + $storage =& KTStorageManagerUtil::getSingleton(); + foreach($rows as $row) + { + $doc = Document::get($row['document_id'], $row['metadata_version_id']); + + if (PEAR::isError($doc)) + { + $msg = $doc->getMessage(); + $this->error($doc, "Error with document: {$msg}"); + continue; + } + $this->doc = $doc; + + $tmpPath = $storage->temporaryFile($doc); + if (!file_exists($tmpPath)) + { + $this->error("Temporary file could not be resolved: {$tmpPath}"); + continue; + } + + $expectedSize = $row['size']; + $currentSize = filesize($tmpPath); + if ($expectedSize != $currentSize) + { + $this->error("Filesize does not match. Expected: {$expectedSize} Current: {$currentSize}"); + continue; + } + + $expectedHash = $row['md5hash']; + $currentHash = md5_file($tmpPath); + if ($expectedHash != $currentHash) + { + $this->error("Hash does not match. Expected: {$expectedHash} Current: {$currentHash}"); + continue; + } + $this->progress(); + } + + print "{$this->nl}Done.{$this->nl}{$this->nl}"; + } + +} + + +$verification = new StorageVerification(); +$verification->run(); + +?> diff --git a/bin/system_info.php b/bin/system_info.php new file mode 100644 index 0000000..bbaab85 --- /dev/null +++ b/bin/system_info.php @@ -0,0 +1,198 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + */ + +/* +* Script to collect system information as part of a call home mechanism, no identifying information is stored. +* +* The following data is collected: +* Unique installation information: installation GUID, number of users in repository, number of documents in repository, +* operating system (platform, platform version, flavor if Linux), version and edition. + +|||| +||| +||| +*/ + +chdir(realpath(dirname(__FILE__))); +require_once('../config/dmsDefaults.php'); + +global $default; +$default->log->debug('System information collection script starting...'); + +// Get installation guid +function getGuid() +{ + $guid = KTUtil::getSystemIdentifier(); + + if(PEAR::isError($guid)){ + $guid = '-'; + } + return $guid; +} + +// Get the number of users in the repository +function getUserCnt() +{ + $query = 'select count(*) as cnt, disabled from users where id > 0 group by disabled;'; + $result = DBUtil::getResultArray($query); + + if(empty($result) || PEAR::isError($result)){ + return '-|-|-'; + } + $enabled = '-'; + $disabled = '-'; + $deleted = '-'; + + foreach ($result as $row){ + switch($row['disabled']){ + case 0: $enabled = $row['cnt']; break; + case 1: $disabled = $row['cnt']; break; + case 2: $deleted = $row['cnt']; break; + } + } + return "{$enabled}|{$disabled}|{$deleted}"; +} + +// Get the number of documents in the repository +function getDocCnt() +{ + $query = 'select count(*) as cnt, status_id from documents d WHERE status_id IN (1,3,4) group by d.status_id;'; + $result2 = DBUtil::getResultArray($query); + + if(empty($result2) || PEAR::isError($result2)){ + return '-|-|-'; + } + $live = '-'; + $deleted = '-'; + $archived = '-'; + + foreach ($result2 as $row){ + switch($row['status_id']){ + case 1: $live = $row['cnt']; break; + case 3: $deleted = $row['cnt']; break; + case 4: $archived = $row['cnt']; break; + } + } + return "{$live}|{$deleted}|{$archived}"; +} + +// Get the version of KT +function getKTVersion() +{ + $version = KTUtil::getSystemSetting('knowledgeTreeVersion'); + if(empty($version) || PEAR::isError($version)){ + $version = file_get_contents(KT_DIR . 'docs/VERSION.txt'); + } + // remove newline that is in the version file + $version = str_replace("\n", '', $version); + return $version; +} + +// Get the edition of KT +function getKTEdition() +{ + $edition = 'Community|-'; + if (KTPluginUtil::pluginIsActive('ktdms.wintools')) { + $path = KTPluginUtil::getPluginPath('ktdms.wintools'); + require_once($path . 'baobabkeyutil.inc.php'); + $edition = BaobabKeyUtil::getName(); + + // this could be done with regular expressions... + // Remove the brackets around the name + $edition = substr($edition, 1); + $edition = substr($edition, 0, strlen($edition)-1); + // Remove the "users" + $pos = strpos($edition, 'users'); + $edition = ($pos === false) ? $edition.'|-' : substr($edition, 0, $pos-1); + // Replace the , with | + $edition = str_replace(', ', '|', $edition); + } + return $edition; +} + + +// Get OS info - platform, version, linux flavour +function getOSInfo() +{ + $server = php_uname(); + $server_arr = explode(' ', $server); + + // kernel version and os type - 32bit / 64bit + $kernel_v = $server_arr[2]; + $os_v = array_pop($server_arr); + + if(strpos($server, 'Darwin') !== false){ + $os = 'Mac OS X'; + }else if(strpos($server, 'Win') !== false){ + $os = 'Windows'; + // windows differs from *nix + // kernel version = windows version + // os version = build number + $kernel_v = $server_arr[3]; + }else if(strpos($server, 'Linux') !== false) { + $os = 'Linux'; + }else { + $os = 'Unix'; + } + + return $os.'|'.$kernel_v.'|'.$os_v; +} + +function sendForm($data) +{ + $url = 'http://ktnetwork.knowledgetree.com/call_home.php'; + $data = http_build_query($data); + + $ch = curl_init($url); + curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_exec($ch); + curl_close($ch); +} + +$post_str = getGuid() .'|'. getUserCnt() .'|'. getDocCnt() .'|'. getKTVersion() .'|'. getKTEdition() .'|'. getOSInfo(); +$data['system_info'] = $post_str; + +sendForm($data); + +$default->log->debug('System information collection script finishing.'); +exit(0); +?> diff --git a/bin/upgrade/pear-upgrade.bat b/bin/upgrade/pear-upgrade.bat new file mode 100644 index 0000000..bb9fa80 --- /dev/null +++ b/bin/upgrade/pear-upgrade.bat @@ -0,0 +1,27 @@ + +; TEST ALL PEAR LIBRARIES BEFORE UPGRADING INTO RELEASE + +PATH=%PATH%;c:\php5\PEAR + +pear channel-update pear.php.net +pear config-set php_dir "C:\kt\kt.trunk\thirdparty\pear" + +pear config-set preferred_state stable + +pear upgrade --alldeps PEAR +pear upgrade --alldeps Cache_Lite +pear upgrade --alldeps Config +pear upgrade --alldeps DB +pear upgrade --alldeps File + +;pear upgrade --alldeps MDB2#mysql + +pear upgrade --alldeps Log +pear upgrade --alldeps PHP_Compat + +pear config-set preferred_state beta +pear upgrade --alldeps File_Gettext +pear upgrade --alldeps Net_LDAP +pear upgrade --alldeps SOAP +pear config-set preferred_state stable + diff --git a/bin/upgrade/pre-upgrade-3.0b3.php b/bin/upgrade/pre-upgrade-3.0b3.php new file mode 100644 index 0000000..31f0865 --- /dev/null +++ b/bin/upgrade/pre-upgrade-3.0b3.php @@ -0,0 +1,61 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +$checkup = true; + +require_once('../../config/dmsDefaults.php'); + +$s = array( + "sql*2.99.5*0*2.99.5/dashlet_disabling.sql", + "sql*2.99.5*0*2.99.5/role_allocations.sql", + "sql*2.99.5*0*2.99.5/transaction_namespaces.sql", + "sql*2.99.5*0*2.99.5/fieldset_field_descriptions.sql", + "sql*2.99.5*0*2.99.5/role_changes.sql", +); + +$sTable = KTUtil::getTableName('upgrades'); + +foreach ($s as $u) { + var_dump($u); + $f = array( + 'descriptor' => $u, + 'result' => true, + ); + $res = DBUtil::autoInsert($sTable, $f); + var_dump($res); +} diff --git a/bin/upgrade/upgrade-to-2.0.6.php b/bin/upgrade/upgrade-to-2.0.6.php new file mode 100644 index 0000000..22da09a --- /dev/null +++ b/bin/upgrade/upgrade-to-2.0.6.php @@ -0,0 +1,49 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +require_once('../../config/dmsDefaults.php'); +require_once(KT_DIR . '/lib/upgrades/UpgradeFunctions.inc.php'); + +$oUF = new UpgradeFunctions(); +$aFuncs = $oUF->upgrades['2.0.6']; +foreach ($aFuncs as $sFunc) { + $f = array('UpgradeFunctions', $sFunc); + call_user_func($f); +} + +?> diff --git a/bin/win32/installScheduler.php b/bin/win32/installScheduler.php new file mode 100644 index 0000000..c280227 --- /dev/null +++ b/bin/win32/installScheduler.php @@ -0,0 +1,50 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +$scriptPath = realpath(dirname(__FILE__) . '/taskrunner.bat'); + +win32_create_service(array( + 'service' => 'ktscheduler', + 'display' => 'ktdmsScheduler', + 'path' => $scriptPath + )); + +//win32_start_service('ktscheduler'); + +?> diff --git a/bin/win32/schedulerService.php b/bin/win32/schedulerService.php new file mode 100644 index 0000000..15669f8 --- /dev/null +++ b/bin/win32/schedulerService.php @@ -0,0 +1,150 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +$myservicename = 'ktscheduler'; + +// Connect to service dispatcher and notify that startup was successful +if (!win32_start_service_ctrl_dispatcher($myservicename)) die('Could not connect to service :'.$myservicename); +win32_set_service_status(WIN32_SERVICE_RUNNING); + +// Scheduler is dependent on the mysql server being up, +// so we sleep for a minute to ensure the server is running before we start the scheduler +sleep(120); + +chdir(dirname(__FILE__)); // need to be here to include dmsDefaults +require_once('../../config/dmsDefaults.php'); + +global $default; + +$config = KTConfig::getSingleton(); +$schedulerInterval = $config->get('KnowledgeTree/schedulerInterval',30); // interval in seconds + +// Change to knowledgeTree/bin folder +$dir = realpath(dirname(__FILE__) . '/..'); +chdir($dir); + +// Setup php binary path +$phpPath = $config->get('externalBinary/php','php'); +if (!is_file($phpPath)) +{ + $default->log->error("Scheduler: php not found: $phpPath"); + exit; +} + + +$loop = true; +$bTableExists = false; + +while(!$bTableExists){ + switch (win32_get_last_control_message()) + { + + case WIN32_SERVICE_CONTROL_CONTINUE: + break; // Continue server routine + case WIN32_SERVICE_CONTROL_INTERROGATE: + win32_set_service_status(WIN32_SERVICE_RUNNING); + break; // Respond with status + case WIN32_SERVICE_CONTROL_STOP: + win32_set_service_status(WIN32_SERVICE_STOPPED); + $loop = false; // Terminate script + $bTableExists = true; + continue; + default: + } + + $default->log->info("Scheduler Service: Checking if the scheduler_tasks table exists."); + + $checkQuery = 'show tables'; + $tableList = DBUtil::getResultArray($checkQuery); + + if(!empty($tableList)){ + foreach($tableList as $table){ + if(in_array('scheduler_tasks', $table)){ + $bTableExists = true; + } + } + } + + + if(!$bTableExists){ + $default->log->error('Scheduler Service: Scheduler_tasks table does not exist, sleeping for 30 seconds'); + sleep(30); + } +} + +$default->log->info("Scheduler Service: starting main loop"); + +// Main Scheduler Service Loop +while ($loop) +{ + switch (win32_get_last_control_message()) + { + + case WIN32_SERVICE_CONTROL_CONTINUE: + break; // Continue server routine + case WIN32_SERVICE_CONTROL_INTERROGATE: + win32_set_service_status(WIN32_SERVICE_RUNNING); + break; // Respond with status + case WIN32_SERVICE_CONTROL_STOP: + win32_set_service_status(WIN32_SERVICE_STOPPED); + $loop = false; // Terminate script + continue; + default: + } + // Run the scheduler script + $cmd = "\"$phpPath\" \"$dir/scheduler.php\""; +$default->log->info('Scheduler Service: cmd - ' .$cmd ); + + $WshShell = new COM("WScript.Shell"); + $res = $WshShell->Run($cmd, 0, true); + //$cmd = str_replace( '/','\\',$cmd); + //$res = `$cmd 2>&1`; + if (!empty($res)) + { + $default->log->error('Scheduler Service: unexpected output - ' .$res); + } + + sleep($schedulerInterval); + +} +win32_set_service_status(WIN32_SERVICE_STOPPED); + +$default->log->error("Scheduler Service: exiting main loop"); + +?> diff --git a/bin/win32/schedulerServiceStatus.php b/bin/win32/schedulerServiceStatus.php new file mode 100644 index 0000000..509511e --- /dev/null +++ b/bin/win32/schedulerServiceStatus.php @@ -0,0 +1,42 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +var_dump(win32_query_service_status('ktscheduler')); + +?> diff --git a/bin/win32/taskrunner.bat b/bin/win32/taskrunner.bat new file mode 100644 index 0000000..dbed1f4 --- /dev/null +++ b/bin/win32/taskrunner.bat @@ -0,0 +1,3 @@ +@echo off +"@@BITROCK_INSTALLDIR@@\php\php.exe" "@@BITROCK_INSTALLDIR@@\knowledgeTree\bin\win32\schedulerService.php" + diff --git a/bin/win32/uninstallScheduler.php b/bin/win32/uninstallScheduler.php new file mode 100644 index 0000000..82adb9b --- /dev/null +++ b/bin/win32/uninstallScheduler.php @@ -0,0 +1,42 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +win32_delete_service('ktscheduler'); + +?> diff --git a/bin/win32/winserv.exe b/bin/win32/winserv.exe new file mode 100644 index 0000000..f687daa Binary files /dev/null and b/bin/win32/winserv.exe differ diff --git a/browse.php b/browse.php new file mode 100644 index 0000000..e7931f7 --- /dev/null +++ b/browse.php @@ -0,0 +1,441 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + */ + +// main library routines and defaults +require_once('config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/templating/templating.inc.php'); +require_once(KT_LIB_DIR . '/templating/kt3template.inc.php'); +require_once(KT_LIB_DIR . '/dispatcher.inc.php'); +require_once(KT_LIB_DIR . '/util/ktutil.inc'); +require_once(KT_LIB_DIR . '/browse/DocumentCollection.inc.php'); +require_once(KT_LIB_DIR . '/browse/BrowseColumns.inc.php'); +require_once(KT_LIB_DIR . '/browse/PartialQuery.inc.php'); +require_once(KT_LIB_DIR . '/browse/browseutil.inc.php'); + +require_once(KT_LIB_DIR . '/foldermanagement/Folder.inc'); +require_once(KT_LIB_DIR . '/documentmanagement/DocumentType.inc'); +require_once(KT_LIB_DIR . '/documentmanagement/Document.inc'); +require_once(KT_LIB_DIR . '/documentmanagement/DocumentField.inc'); + +require_once(KT_LIB_DIR . '/widgets/portlet.inc.php'); +require_once(KT_LIB_DIR . '/actions/folderaction.inc.php'); +require_once(KT_DIR . '/plugins/ktcore/KTFolderActions.php'); + +require_once(KT_LIB_DIR . '/permissions/permissionutil.inc.php'); +require_once(KT_LIB_DIR . '/permissions/permission.inc.php'); + +require_once(KT_LIB_DIR . '/users/userhistory.inc.php'); + +require_once(KT_LIB_DIR . '/browse/columnregistry.inc.php'); +require_once(KT_LIB_DIR . '/actions/entitylist.php'); +require_once(KT_LIB_DIR . '/actions/bulkaction.php'); + +$sectionName = 'browse'; + +class BrowseDispatcher extends KTStandardDispatcher { + + var $sName = 'ktcore.actions.folder.view'; + + var $oFolder = null; + var $sSection = 'browse'; + var $browse_mode = null; + var $query = null; + var $resultURL; + var $sHelpPage = 'ktcore/browse.html'; + var $editable; + + function BrowseDispatcher() { + $this->aBreadcrumbs = array( + array('action' => 'browse', 'name' => _kt('Browse')), + ); + return parent::KTStandardDispatcher(); + } + + function check() { + $this->browse_mode = KTUtil::arrayGet($_REQUEST, 'fBrowseMode', 'folder'); + $action = KTUtil::arrayGet($_REQUEST, $this->event_var, 'main'); + $this->editable = false; + + + // catch the alternative actions. + if ($action != 'main') { + return true; + } + + // if we're going to main ... + + // folder browse mode + if ($this->browse_mode == 'folder') { + $in_folder_id = KTUtil::arrayGet($_REQUEST, 'fFolderId'); + if (empty($in_folder_id)) { + $oConfig = KTConfig::getSingleton(); + if ($oConfig->get('tweaks/browseToUnitFolder')) { + $iHomeFolderId = $this->oUser->getHomeFolderId(); + if ($iHomeFolderId) { + $in_folder_id = $iHomeFolderId; + } + } + } + + $folder_id = (int) $in_folder_id; // conveniently, will be 0 if not possible. + if ($folder_id == 0) { + $folder_id = 1; + } + + $_REQUEST['fBrowseMode'] = 'folder'; + + // here we need the folder object to do the breadcrumbs. + $oFolder =& Folder::get($folder_id); + if (PEAR::isError($oFolder)) { + return false; // just fail. + } + + // check whether the user can edit this folder + $oPerm = KTPermission::getByName('ktcore.permissions.write'); + if (KTPermissionUtil::userHasPermissionOnItem($this->oUser, $oPerm, $oFolder)) { + $this->editable = true; + } else { + $this->editable = false; + } + + // set the title and breadcrumbs... + $this->oPage->setTitle(_kt('Browse')); + + if (KTPermissionUtil::userHasPermissionOnItem($this->oUser, 'ktcore.permissions.folder_details', $oFolder)) { + $this->oPage->setSecondaryTitle($oFolder->getName()); + } else { + if (KTBrowseUtil::inAdminMode($this->oUser, $oFolder)) { + $this->oPage->setSecondaryTitle(sprintf('(%s)', $oFolder->getName())); + } else { + $this->oPage->setSecondaryTitle('...'); + } + } + + //Figure out if we came here by navigating trough a shortcut. + //If we came here from a shortcut, the breadcrumbspath should be relative + //to the shortcut folder. + $iSymLinkFolderId = KTUtil::arrayGet($_REQUEST, 'fShortcutFolder', null); + if(is_numeric($iSymLinkFolderId)){ + $oBreadcrumbsFolder = Folder::get($iSymLinkFolderId); + $this->aBreadcrumbs = kt_array_merge($this->aBreadcrumbs, KTBrowseUtil::breadcrumbsForFolder($oBreadcrumbsFolder,array('final' => false))); + $this->aBreadcrumbs[] = array('name'=>$oFolder->getName()); + }else{ + $this->aBreadcrumbs = kt_array_merge($this->aBreadcrumbs, KTBrowseUtil::breadcrumbsForFolder($oFolder)); + } + $this->oFolder =& $oFolder; + + + // we now have a folder, and need to create the query. + $aOptions = array( + 'ignorepermissions' => KTBrowseUtil::inAdminMode($this->oUser, $oFolder), + ); + $this->oQuery = new BrowseQuery($oFolder->getId(), $this->oUser, $aOptions); + + $this->resultURL = KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf('fFolderId=%d', $oFolder->getId())); + + // and the portlets + $portlet = new KTActionPortlet(sprintf(_kt('About this folder'))); + $aActions = KTFolderActionUtil::getFolderInfoActionsForFolder($this->oFolder, $this->oUser); + $portlet->setActions($aActions,$this->sName); + $this->oPage->addPortlet($portlet); + + $portlet = new KTActionPortlet(sprintf(_kt('Actions on this folder'))); + $aActions = KTFolderActionUtil::getFolderActionsForFolder($oFolder, $this->oUser); + $portlet->setActions($aActions,null); + $this->oPage->addPortlet($portlet); + + + + } else if ($this->browse_mode == 'lookup_value') { + // browsing by a lookup value + + $this->editable = false; + + // check the inputs + $field = KTUtil::arrayGet($_REQUEST, 'fField', null); + $oField = DocumentField::get($field); + if (PEAR::isError($oField) || ($oField == false)) { + $this->errorRedirectToMain('No Field selected.'); + exit(0); + } + $value = KTUtil::arrayGet($_REQUEST, 'fValue', null); + $oValue = MetaData::get($value); + if (PEAR::isError($oValue) || ($oValue == false)) { + $this->errorRedirectToMain('No Value selected.'); + exit(0); + } + + + $this->oQuery = new ValueBrowseQuery($oField, $oValue); + $this->resultURL = KTUtil::addQueryString($_SERVER['PHP_SELF'], + sprintf('fBrowseMode=lookup_value&fField=%d&fValue=%d', $field, $value)); + + // setup breadcrumbs + $this->aBreadcrumbs = + array( + array('name' => _kt('Lookup Values'), + 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], 'action=selectField')), + array('name' => $oField->getName(), + 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], 'action=selectLookup&fField=' . $oField->getId())), + array('name' => $oValue->getName(), + 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf('fBrowseMode=lookup_value&fField=%d&fValue=%d', $field, $value)))); + + + + } else if ($this->browse_mode == 'document_type') { + // browsing by document type + + + $this->editable = false; + $doctype = KTUtil::arrayGet($_REQUEST, 'fType',null); + $oDocType = DocumentType::get($doctype); + if (PEAR::isError($oDocType) || ($oDocType == false)) { + $this->errorRedirectToMain('No Document Type selected.'); + exit(0); + } + + $this->oQuery = new TypeBrowseQuery($oDocType); + + // FIXME probably want to redirect to self + action=selectType + $this->aBreadcrumbs[] = array('name' => _kt('Document Types'), 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], 'action=selectType')); + $this->aBreadcrumbs[] = array('name' => $oDocType->getName(), 'url' => KTUtil::addQueryString($_SERVER['PHP_SELF'], 'fBrowseMode=document_type&fType=' . $oDocType->getId())); + + $this->resultURL = KTUtil::addQueryString($_SERVER['PHP_SELF'], sprintf('fType=%s&fBrowseMode=document_type', $doctype));; + + + } else { + // FIXME what should we do if we can't initiate the browse? we "pretend" to have no perms. + return false; + } + + return true; + } + + function do_main() { + $oColumnRegistry =& KTColumnRegistry::getSingleton(); + + $collection = new AdvancedCollection; + $collection->addColumns($oColumnRegistry->getColumnsForView('ktcore.views.browse')); + + $aOptions = $collection->getEnvironOptions(); // extract data from the environment + $aOptions['result_url'] = $this->resultURL; + $aOptions['is_browse'] = true; + + + + $collection->setOptions($aOptions); + $collection->setQueryObject($this->oQuery); + $collection->setColumnOptions('ktcore.columns.selection', array( + 'rangename' => 'selection', + 'show_folders' => true, + 'show_documents' => true, + )); + + // get bulk actions + $aBulkActions = KTBulkActionUtil::getAllBulkActions(); + + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('kt3/browse'); + $aTemplateData = array( + 'context' => $this, + 'collection' => $collection, + 'browse_mode' => $this->browse_mode, + 'isEditable' => $this->editable, + 'bulkactions' => $aBulkActions, + 'browseutil' => new KTBrowseUtil(), + 'returnaction' => 'browse', + ); + if ($this->oFolder) { + $aTemplateData['returndata'] = $this->oFolder->getId(); + } + return $oTemplate->render($aTemplateData); + } + + + + function do_selectField() { + $aFields = DocumentField::getList('has_lookup = 1'); + + if (empty($aFields)) { + $this->errorRedirectToMain(_kt('No lookup fields available.')); + exit(0); + } + + $_REQUEST['fBrowseMode'] = 'lookup_value'; + + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('kt3/browse_lookup_selection'); + $aTemplateData = array( + 'context' => $this, + 'fields' => $aFields, + ); + return $oTemplate->render($aTemplateData); + } + + function do_selectLookup() { + $field = KTUtil::arrayGet($_REQUEST, 'fField', null); + $oField = DocumentField::get($field); + if (PEAR::isError($oField) || ($oField == false) || (!$oField->getHasLookup())) { + $this->errorRedirectToMain('No Field selected.'); + exit(0); + } + + $_REQUEST['fBrowseMode'] = 'lookup_value'; + + $aValues = MetaData::getByDocumentField($oField); + + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('kt3/browse_lookup_value'); + $aTemplateData = array( + 'context' => $this, + 'oField' => $oField, + 'values' => $aValues, + ); + return $oTemplate->render($aTemplateData); + } + + function do_selectType() { + $aTypes = DocumentType::getList(); + // FIXME what is the error message? + + $_REQUEST['fBrowseMode'] = 'document_type'; + + if (empty($aTypes)) { + $this->errorRedirectToMain('No document types available.'); + exit(0); + } + + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('kt3/browse_types'); + $aTemplateData = array( + 'context' => $this, + 'document_types' => $aTypes, + ); + return $oTemplate->render($aTemplateData); + } + + function do_enableAdminMode() { + $iDocumentId = KTUtil::arrayGet($_REQUEST, 'fDocumentId'); + $iFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId'); + if ($iDocumentId) { + $oDocument = Document::get($iDocumentId); + if (PEAR::isError($oDocument) || ($oDocument === false)) { + return null; + } + $iFolderId = $oDocument->getFolderId(); + } + + if (!Permission::userIsSystemAdministrator() && !Permission::isUnitAdministratorForFolder($this->oUser, $iFolderId)) { + $this->errorRedirectToMain(_kt('You are not an administrator')); + } + + // log this entry + $oLogEntry =& KTUserHistory::createFromArray(array( + 'userid' => $this->oUser->getId(), + 'datetime' => date('Y-m-d H:i:s', time()), + 'actionnamespace' => 'ktcore.user_history.enable_admin_mode', + 'comments' => 'Admin Mode enabled', + 'sessionid' => $_SESSION['sessionID'], + )); + $aOpts = array( + 'redirect_to' => 'main', + 'message' => _kt('Unable to log admin mode entry. Not activating admin mode.'), + ); + $this->oValidator->notError($oLogEntry, $aOpts); + + $_SESSION['adminmode'] = true; + + + + if ($_REQUEST['fDocumentId']) { + $_SESSION['KTInfoMessage'][] = _kt('Administrator mode enabled'); + redirect(KTBrowseUtil::getUrlForDocument($iDocumentId)); + exit(0); + } + if ($_REQUEST['fFolderId']) { + $this->successRedirectToMain(_kt('Administrator mode enabled'), sprintf('fFolderId=%d', $_REQUEST['fFolderId'])); + } + $this->successRedirectToMain(_kt('Administrator mode enabled')); + } + + function do_disableAdminMode() { + $iDocumentId = KTUtil::arrayGet($_REQUEST, 'fDocumentId'); + $iFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId'); + if ($iDocumentId) { + $oDocument = Document::get($iDocumentId); + if (PEAR::isError($oDocument) || ($oDocument === false)) { + return null; + } + $iFolderId = $oDocument->getFolderId(); + } + + if (!Permission::userIsSystemAdministrator() && !Permission::isUnitAdministratorForFolder($this->oUser, $iFolderId)) { + $this->errorRedirectToMain(_kt('You are not an administrator')); + } + + // log this entry + $oLogEntry =& KTUserHistory::createFromArray(array( + 'userid' => $this->oUser->getId(), + 'datetime' => date('Y-m-d H:i:s', time()), + 'actionnamespace' => 'ktcore.user_history.disable_admin_mode', + 'comments' => 'Admin Mode disabled', + 'sessionid' => $_SESSION['sessionID'], + )); + $aOpts = array( + 'redirect_to' => 'main', + 'message' => _kt('Unable to log admin mode exit. Not de-activating admin mode.'), + ); + $this->oValidator->notError($oLogEntry, $aOpts); + + $_SESSION['adminmode'] = false; + if ($_REQUEST['fDocumentId']) { + $_SESSION['KTInfoMessage'][] = _kt('Administrator mode disabled'); + redirect(KTBrowseUtil::getUrlForDocument($iDocumentId)); + exit(0); + } + if ($_REQUEST['fFolderId']) { + $this->successRedirectToMain(_kt('Administrator mode disabled'), sprintf('fFolderId=%d', $_REQUEST['fFolderId'])); + } + $this->successRedirectToMain(_kt('Administrator mode disabled')); + } +} + +$oDispatcher = new BrowseDispatcher(); +$oDispatcher->dispatch(); + +?> + diff --git a/call_home.php b/call_home.php new file mode 100644 index 0000000..7520d41 --- /dev/null +++ b/call_home.php @@ -0,0 +1,18 @@ +||||| +*/ + +$data = isset($_REQUEST['system_info']) ? strip_tags($_REQUEST['system_info']) : ''; + +if(empty($data)){ + exit(0); +} + +$file = 'var/system_info.txt'; +$fp = fopen($file, 'a'); +fwrite($fp, $data."\n"); +fclose($fp); + +exit(0); +?> \ No newline at end of file diff --git a/config/.htaccess b/config/.htaccess new file mode 100644 index 0000000..93169e4 --- /dev/null +++ b/config/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/config/cache-path b/config/cache-path new file mode 100644 index 0000000..bea5430 --- /dev/null +++ b/config/cache-path @@ -0,0 +1 @@ +var/cache \ No newline at end of file diff --git a/config/config-path b/config/config-path new file mode 100644 index 0000000..170f529 --- /dev/null +++ b/config/config-path @@ -0,0 +1 @@ +/etc/knowledgetree-ce/config.ini \ No newline at end of file diff --git a/config/config.ini b/config/config.ini new file mode 100644 index 0000000..61ae5a2 --- /dev/null +++ b/config/config.ini @@ -0,0 +1,149 @@ +; ---------------------------------------------------------------- +; At a minimum, you may need to change some of settings in this +; db section. +; ---------------------------------------------------------------- + +[db] +; The Database Engine to use. Currently mysql is the only +; supported type. +dbType = mysql + +; Database login details +dbHost = localhost +dbName = dms +dbUser = dms +dbPass = djw9281js +dbPort = default + +dbAdminUser = dmsadmin +dbAdminPass = js9281djw + +[KnowledgeTree] + +; ---------------------------------------------------------------- +; The options in this section should automatically be detected by +; KnowledgeTree. Please DO NOT set these manually if you do not +; need to, as you may introduce errors in your system. +; ---------------------------------------------------------------- + + +; install path (file path) +; +; Leave as default to have it automatically detected. +; +fileSystemRoot = default + +; Webserver name (host name) +; +; Leave as default to have it automatically detected. +; +serverName = default + +; Whether ssl is enabled or not +; +; Leave as default to have it automatically detected. +; +sslEnabled = false + +; Path to the web application from the root of the web site. +; If KT is at http://example.org/foo/, then rootUrl should be '/foo' +; +; Leave as default to have it automatically detected. +; +rootUrl = default + +; Whether the platform supports PATH_INFO or not. Currently defaults to +; true, but later will attempt to determine somehow. +pathInfoSupport = default + +; Where to look for binaries on your system. This defaults to the path +; set for your web server, which works well for Unix-like systems, but +; may need some changing for Windows systems. +execSearchPath = default + +; Use new Dashboard. +; Defaults to true +useNewDashboard = default + +; Which level of logging to use. DEBUG, INFO, WARN, ERROR +; Defaults to INFO +; logLevel = DEBUG + +; The location of the mime magic file +; Defaults to /usr/share/file/magic +magicDatabase = default + +[storage] +; By default uses KTOnDiskHashedStorageManager +; manager = KTOnDiskHashedStorageManager +manager = default + +[ui] + +; Main logo +;mainLogo = ${rootUrl}/resources/oemlogo.png +; the logo's width in pixels +;mainLogoWidth = 219px +; ALT text - for accessibility purposes. +;mainLogoTitle = ACME Knowledge Management Systems +; URL on the main logo +;mainLogoUrl = ${rootUrl} +; powered by kt logo +;powerLogo = ${rootUrl}/resources/powered-by-kt.png +; the logo's width in pixels +;powerLogoWidth = 130px +; ALT text - for accessibility purposes. +;powerLogoTitle = Powered by KnowledgeTree + +; use the additional IE specific GIF theme overrides. +; using this means that arbitrary theme packs may not work without +; having GIF versions available. +; ieGIF = true +ieGIF = default + +; Set to true to automatically refresh the page after the session would +; have expired. +automaticRefresh = default + +; "dot" command location +dot = dot + +[tweaks] +; If you want to enable PHP error logging to the log/php_error_log +; file, change the following to true +phpErrorLogFile = false + +[urls] +; directories +varDirectory = ${fileSystemRoot}/var +logDirectory = ${varDirectory}/log +documentRoot = ${varDirectory}/Documents +uiDirectory = ${fileSystemRoot}/presentation/lookAndFeel/knowledgeTree +tmpDirectory = ${varDirectory}/tmp + +;dedicated feed url +;dedicatedrsstitle = RSS Feed Title +;dedicatedrssurl = + +; files +stopwordsFile = ${fileSystemRoot}/config/stopwords.txt + +[session] + +; Set to true to force sessions to come from the same IP address +; ipTracking = false + +[export] + +; encoding to use in bulk export plugin +; default is set to UTF-8 +; encoding = cp1252 +encoding = default + +[cache] +; +; enable/disable the cache and set the cache location +; +cacheEnabled = true +cacheDirectory = ${varDirectory}/cache +cachePlugins = true diff --git a/config/dmsDefaults.php b/config/dmsDefaults.php new file mode 100644 index 0000000..81fdf00 --- /dev/null +++ b/config/dmsDefaults.php @@ -0,0 +1,671 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): Guenter Roeck______________________________________ + * + */ + +// stuff in the new installer section database upgrade fails without this +global $default; + +if (defined('DMS_DEFAULTS_INCLUDED')) +{ + return; +} + +define('DMS_DEFAULTS_INCLUDED',1); +define('LATEST_WEBSERVICE_VERSION',2); + + +if (function_exists('apd_set_pprof_trace')) { + apd_set_pprof_trace(); +} + +// Default settings differ, we need some of these, so force the matter. +// Can be overridden here if actually necessary. +error_reporting(E_ALL & ~E_NOTICE); +ini_set('display_errors', '1'); +ini_set('display_startup_errors', '1'); +ini_set('magic_quotes_runtime', '0'); +ini_set('arg_separator.output', '&'); + +$microtime_simple = explode(' ', microtime()); + +$_KT_starttime = (float) $microtime_simple[1] + (float) $microtime_simple[0]; +unset($microtime_simple); + +// If not defined, set KT_DIR based on my usual location in the tree +if (!defined('KT_DIR')) { + $rootLoc = realpath(dirname(__FILE__) . '/..'); + if (substr(PHP_OS, 0, 3) == 'WIN') { + $rootLoc = str_replace('\\','/',$rootLoc); + } + define('KT_DIR', $rootLoc); +} + +if (!defined('KT_LIB_DIR')) { + define('KT_LIB_DIR', KT_DIR . '/lib'); +} + +// If not defined, set KT_STACK_DIR based on my usual location in the tree +// TODO: This needs to use a config.ini entry if available +if (!defined('KT_STACK_DIR')) { + $stackLoc = realpath(dirname(__FILE__) . '/../..'); + if (substr(PHP_OS, 0, 3) == 'WIN') { + $stackLoc = str_replace('\\','/',$stackLoc); + } + define('KT_STACK_DIR', $stackLoc); +} + + +// PATH_SEPARATOR added in PHP 4.3.0 +if (!defined('PATH_SEPARATOR')) { + if (substr(PHP_OS, 0, 3) == 'WIN') { + define('PATH_SEPARATOR', ';'); + } else { + define('PATH_SEPARATOR', ':'); + } +} + +require_once(KT_LIB_DIR . '/validation/customerror.php'); + + + +// {{{ prependPath() +function prependPath ($path) { + + $include_path = ini_get('include_path'); + ini_set('include_path', $path . PATH_SEPARATOR . $include_path); +} +// }}} + +prependPath(KT_DIR . '/thirdparty/ZendFramework/library'); +prependPath(KT_DIR . '/thirdparty/pear'); +prependPath(KT_DIR . '/thirdparty/Smarty'); +prependPath(KT_DIR . '/thirdparty/simpletest'); +prependPath(KT_DIR . '/thirdparty/xmlrpc-2.2/lib'); +prependPath(KT_DIR . '/ktapi'); +prependPath(KT_DIR . '/search2'); +require_once('PEAR.php'); + +// Give everyone access to legacy PHP functions +require_once(KT_LIB_DIR . '/util/legacy.inc'); + +// Give everyone access to KTUtil utility functions +require_once(KT_LIB_DIR . '/util/ktutil.inc'); + +require_once(KT_LIB_DIR . '/ktentity.inc'); + +require_once(KT_LIB_DIR . '/config/config.inc.php'); +require_once(KT_DIR . '/search2/indexing/indexerCore.inc.php'); + +// {{{ KTInit +class KTInit { + + // {{{ setupLogging() + function setupLogging () { + global $default; + $oKTConfig =& KTConfig::getSingleton(); + if(!defined('APP_NAME')) { + define('APP_NAME', $oKTConfig->get('ui/appName', 'KnowledgeTree')); + } + + define('KT_LOG4PHP_DIR', KT_DIR . '/thirdparty/apache-log4php/src/main/php' . DIRECTORY_SEPARATOR); + define('LOG4PHP_CONFIGURATION', KT_DIR . '/config/ktlog.ini'); + define('LOG4PHP_DEFAULT_INIT_OVERRIDE', true); + + require_once(KT_LOG4PHP_DIR . 'LoggerManager.php'); + require_once(KT_LOG4PHP_DIR . 'LoggerPropertyConfigurator.php'); + + $configurator = new LoggerPropertyConfigurator(); + $repository = LoggerManager::getLoggerRepository(); + $properties = @parse_ini_file(LOG4PHP_CONFIGURATION); + $properties['log4php.appender.default'] = 'LoggerAppenderDailyFile'; + $properties['log4php.appender.default.layout'] = 'LoggerPatternLayout'; + $properties['log4php.appender.default.layout.conversionPattern'] = '%d{Y-m-d | H:i:s} | %p | %t | %r | %X{userid} | %X{db} | %c | %M | %m%n'; + $properties['log4php.appender.default.datePattern'] = 'Y-m-d'; + $logDir = $oKTConfig->get('urls/logDirectory'); + $properties['log4php.appender.default.file'] = $logDir . '/kt%s.' . KTUtil::running_user() . '.log.txt'; + + // get the log level set in the configuration settings to override the level set in ktlog.ini + // for the default / main logging. Additional logging can be configured through the ini file + $logLevel = $oKTConfig->get('KnowledgeTree/logLevel'); + $properties['log4php.rootLogger'] = $logLevel . ', default'; + + session_start(); + $configurator->doConfigureProperties($properties, $repository); + + $userId = isset($_SESSION['userID'])?$_SESSION['userID']:'n/a'; + + LoggerMDC::put('userid', $userId); + LoggerMDC::put('db', $oKTConfig->get('db/dbName')); + + $default->log = LoggerManager::getLogger('default'); + $default->queryLog = LoggerManager::getLogger('sql'); + $default->timerLog = LoggerManager::getLogger('timer'); + $default->phpErrorLog = LoggerManager::getLogger('php'); + } + // }}} + + // {{{ setupI18n() + /** + * setupI18n + * + */ + function setupI18n () { + require_once(KT_LIB_DIR . '/i18n/i18nutil.inc.php'); + require_once('HTTP.php'); + global $default; + $language = KTUtil::arrayGet($_COOKIE, 'kt_language'); + if ($language) { + $default->defaultLanguage = $language; + } + } + // }}} + + + + // {{{ cleanGlobals() + function cleanGlobals () { + /* + * Borrowed from TikiWiki + * + * Copyright (c) 2002-2004, Luis Argerich, Garland Foster, + * Eduardo Polidor, et. al. + */ + if (ini_get('register_globals')) { + $aGlobals = array($_ENV, $_GET, $_POST, $_COOKIE, $_SERVER); + foreach ($aGlobals as $superglob) { + foreach ($superglob as $key => $val) { + if (isset($GLOBALS[$key]) && $GLOBALS[$key] == $val) { + unset($GLOBALS[$key]); + } + } + } + } + } + // }}} + + // {{{ cleanMagicQuotesItem() + function cleanMagicQuotesItem (&$var) { + if (is_array($var)) { + foreach ($var as $key => $val) { + $this->cleanMagicQuotesItem($var[$key]); + } + } else { + // XXX: Make it look pretty + $var = stripslashes($var); + } + } + // }}} + + // {{{ cleanMagicQuotes() + function cleanMagicQuotes () { + if (get_magic_quotes_gpc()) { + $this->cleanMagicQuotesItem($_GET); + $this->cleanMagicQuotesItem($_POST); + $this->cleanMagicQuotesItem($_REQUEST); + $this->cleanMagicQuotesItem($_COOKIE); + } + } + // }}} + + // {{{ setupServerVariables + function setupServerVariables() { + $oKTConfig =& KTConfig::getSingleton(); + $bPathInfoSupport = $oKTConfig->get('KnowledgeTree/pathInfoSupport'); + if ($bPathInfoSupport) { + // KTS-21: Some environments (FastCGI only?) don't set PATH_INFO + // correctly, but do set ORIG_PATH_INFO. + $path_info = KTUtil::arrayGet($_SERVER, 'PATH_INFO'); + $orig_path_info = KTUtil::arrayGet($_SERVER, 'ORIG_PATH_INFO'); + if (empty($path_info) && !empty($orig_path_info)) { + $_SERVER['PATH_INFO'] = strip_tags($_SERVER['ORIG_PATH_INFO']); + $_SERVER['PHP_SELF'] .= $_SERVER['PATH_INFO']; + } + $env_path_info = KTUtil::arrayGet($_SERVER, 'REDIRECT_kt_path_info'); + if (empty($path_info) && !empty($env_path_info)) { + $_SERVER['PATH_INFO'] = strip_tags($env_path_info); + $_SERVER['PHP_SELF'] .= $_SERVER['PATH_INFO']; + } + + // KTS-50: IIS (and probably most non-Apache web servers) don't + // set REQUEST_URI. Fake it. + $request_uri = KTUtil::arrayGet($_SERVER, 'REQUEST_URI'); + if (empty($request_uri)) { + $_SERVER['REQUEST_URI'] = strip_tags(KTUtil::addQueryString($_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING'])); + } + } else { + unset($_SERVER['PATH_INFO']); + } + + $script_name = strip_tags(KTUtil::arrayGet($_SERVER, 'SCRIPT_NAME')); + $php_self = strip_tags(KTUtil::arrayGet($_SERVER, 'PHP_SELF')); + + $_SERVER['SCRIPT_NAME'] = $script_name; + $_SERVER['PHP_SELF'] = $php_self; + + $kt_path_info = strip_tags(KTUtil::arrayGet($_REQUEST, 'kt_path_info')); + if (!empty($kt_path_info)) { + $_SERVER['PHP_SELF'] .= '?kt_path_info=' . $kt_path_info; + $_SERVER['PATH_INFO'] = $kt_path_info; + } + + $sServerName = $oKTConfig->get('KnowledgeTree/serverName'); + $_SERVER['HTTP_HOST'] = $sServerName; + } + // }}} + + // {{{ setupRandomSeed() + function setupRandomSeed () { + mt_srand(hexdec(substr(md5(microtime()), -8)) & 0x7fffffff); + } + // }}} + + // {{{ handleInitError() + function handleInitError($oError) { + global $checkup; + $msg = $oError->toString(); + + if ($checkup === true) { + echo $msg; + exit(0); + //return; + } + + if (KTUtil::arrayGet($_SERVER, 'REQUEST_METHOD')) { + session_start(); + $_SESSION['sErrorMessage'] = $msg; + + $url = KTUtil::kt_url().'/customerrorpage.php'; + // Redirect to custom error page + header('Location: '.$url.$qs); + + /* A lot of steps to display the error page ... are they really needed? + require_once(KT_LIB_DIR . '/dispatcher.inc.php'); + $oDispatcher =new KTErrorDispatcher($oError); + $oDispatcher->dispatch(); + */ + } else { + print $msg . "\n"; + } + exit(0); + } + // }}} + + static function detectMagicFile() + { + $knownPaths = array( + '/usr/share/file/magic', // the old default + '/etc/httpd/conf/magic', // fedora's location + '/etc/magic' // worst case scenario. Noticed this is sometimes empty and containing a reference to somewher else + ); + + foreach($knownPaths as $path) + { + if (file_exists($path)) + { + return $path; + } + } + return KT_DIR . '/config/magic'; + } + + + static protected $handlerMapping = array( + E_WARNING=>'warn', + E_USER_WARNING=>'warn', + E_NOTICE=>'info', + E_USER_NOTICE=>'info', + E_ERROR=>'error', + E_USER_ERROR=>'error' + ); + + // {{{ handlePHPError() + static function handlePHPError($code, $message, $file, $line) { + global $default; + + $priority = 'info'; + if (array_key_exists($code, KTInit::$handlerMapping)) + { + $priority = KTInit::$handlerMapping[$code]; + } + + if (empty($priority)) + { + $priority = 'info'; + } + + $msg = $message . ' in ' . $file . ' at line ' . $line; + + if (isset($default->phpErrorLog)) + { + $default->phpErrorLog->$priority($msg); + } + } + + // }}} + + function catchFatalErrors() + { + ini_set('display_errors','On'); + $phperror='>>
+ '; + ini_set('error_append_string',$phperror); + } + + + + // {{{ guessRootUrl() + function guessRootUrl() { + $urlpath = $_SERVER['SCRIPT_NAME']; + $bFound = false; + $rootUrl = ''; + while ($urlpath) { + if (file_exists(KT_DIR . '/' . $urlpath)) { + $bFound = true; + break; + } + $i = strpos($urlpath, '/'); + if ($i === false) { + break; + } + if ($rootUrl) + { + $rootUrl .= '/'; + } + $rootUrl .= substr($urlpath, 0, $i); + $urlpath = substr($urlpath, $i + 1); + } + if ($bFound) { + if ($rootUrl) { + $rootUrl = '/' . $rootUrl; + } + + // If the rootUrl contains KT_DIR then it is the full path and not relative to the apache document root + // We return an empty string which will work for all stack installs but might break source installs. + // However this situation should only crop up when running background scripts and can be avoided by setting + // the rootUrl in the config settings. + if(strpos($rootUrl, KT_DIR) !== false){ + return ''; + } + return $rootUrl; + } + return ''; + } + // }}} + + // {{{ getDynamicConfigSettings + //This function gets the intial config settings which can only be resolved by using php + function getDynamicConfigSettings() + { + $oKTConfig =& KTConfig::getSingleton(); + + // Override the config setting - KT_DIR is resolved on page load + $oKTConfig->setdefaultns('KnowledgeTree', 'fileSystemRoot', KT_DIR); + + // Set ssl to enabled if using https - if the server variable is not set, allow the config setting to take precedence + if (array_key_exists('HTTPS', $_SERVER)) { + if (strtolower($_SERVER['HTTPS']) === 'on') { + $oKTConfig->setdefaultns('KnowledgeTree', 'sslEnabled', 'true'); + } + } + + $oKTConfig->setdefaultns('KnowledgeTree', 'serverName', $_SERVER['HTTP_HOST']); + + // Check for the config setting before overriding with the resolved setting + $serverName = $oKTConfig->get('KnowledgeTree/serverName'); + $rootUrl = $oKTConfig->get('KnowledgeTree/rootUrl'); + $execSearchPath = $oKTConfig->get('KnowledgeTree/execSearchPath'); + $magicDatabase = $oKTConfig->get('KnowledgeTree/magicDatabase'); + + // base server name + if(empty($serverName) || $serverName == 'default'){ + $oKTConfig->setdefaultns('KnowledgeTree', 'serverName', KTUtil::getServerName()); + } + + // the sub directory or root url + if(empty($rootUrl) || $rootUrl == 'default'){ + $oKTConfig->setdefaultns('KnowledgeTree', 'rootUrl', $this->guessRootUrl()); + } + + // path to find the executable binaries + if(empty($execSearchPath) || $execSearchPath == 'default'){ + $oKTConfig->setdefaultns('KnowledgeTree', 'execSearchPath', $_SERVER['PATH']); + } + + // path to magic database + if(empty($magicDatabase) || $magicDatabase == 'default'){ + $oKTConfig->setdefaultns('KnowledgeTree', 'magicDatabase', KTInit::detectMagicFile()); + } + } + // }}} + + // {{{ initConfig + function initConfig() { + global $default; + $oKTConfig = KTConfig::getSingleton(); + + // Override the config setting - KT_DIR is resolved on page load + $oKTConfig->setdefaultns('KnowledgeTree', 'fileSystemRoot', KT_DIR); + + // TODO: refactor when all the config settings are stored in the database + // Check for the config cache + $use_cache = false; + $store_cache = true; + $cachePath = $oKTConfig->getCacheFilename(); + if (file_exists($cachePath)) { + $configPath = $oKTConfig->getConfigFilename(); + + // This check can be removed once all config settings are in the database + // Check if the config file has been updated since the last time the cache file was generated. + $cachestat = stat($cachePath); + $configstat = stat($configPath); + $tval = 9; + if ($cachestat[$tval] > $configstat[$tval]) { + $use_cache = true; + $store_cache = false; + } + + if ($use_cache) { + $use_cache = $oKTConfig->loadCache($cachePath); + } + }else{ + if(!isset($_SERVER['HTTP_HOST']) || empty($_SERVER['HTTP_HOST'])){ + // If the http_host server variable is not set then the serverName gets set to localhost + // We don't want to store this setting so we set store_cache to false + $store_cache = false; + } + } + + if(!$use_cache) { + //Read in DB settings and config settings + $oKTConfig->readDBConfig(); + } + + $dbSetup = $oKTConfig->setupDB(); + + if(PEAR::isError($dbSetup)) + { + /* We need to setup the language handler to display this error correctly */ + $this->setupI18n(); + $this->handleInitError($dbSetup); + } + + // Read in the config settings from the database + // Create the global $default array + if(!$use_cache) $res = $oKTConfig->readConfig(); + + // Get default server url settings + $this->getDynamicConfigSettings(); + + if($store_cache && isset($cachePath)){ + @touch($cachePath); + if (is_writable($cachePath)) { + $oKTConfig->createCache($cachePath); + } + } + } + // }}} + + + + // {{{ initTesting + function initTesting() { + $oKTConfig =& KTConfig::getSingleton(); + $sConfigFile = trim(@file_get_contents(KT_DIR . '/config/test-config-path')); + if (empty($sConfigFile)) { + $sConfigFile = 'config/test.ini'; + } + if (!KTUtil::isAbsolutePath($sConfigFile)) { + $sConfigFile = sprintf('%s/%s', KT_DIR, $sConfigFile); + } + if (!file_exists($sConfigFile)) { + $this->handleInitError(PEAR::raiseError('Test infrastructure not configured')); + exit(0); + } + $res = $oKTConfig->loadFile($sConfigFile); + if (PEAR::isError($res)) { + return $res; + } + $_SESSION['userID'] = 1; + } + // }}} +} +// }}} + + +$KTInit = new KTInit(); +$KTInit->initConfig(); +$KTInit->setupI18n(); + +//==================================== + +define('KTLOG_CACHE',false); + +if (isset($GLOBALS['kt_test'])) { + $KTInit->initTesting(); +} + +$oKTConfig = KTConfig::getSingleton(); + +if($oKTConfig->get('CustomErrorMessages/customerrormessages') == 'on') +{ + $KTInit->catchFatalErrors(); +} + +if (phpversion()<5){ + + $rootUrl = $KTInit->guessRootUrl(); + $sErrorPage = 'http://'.$_SERVER['HTTP_HOST'].$rootUrl.'/'.'customerrorpage.php'; + + session_start(); + + $_SESSION['sErrorMessage'] = 'KnowledgeTree now requires that PHP version 5 is installed. PHP version 4 is no longer supported.'; + + + header('location:'. $sErrorPage ) ; + exit(0); +} +$KTInit->setupServerVariables(); + +// instantiate log +$loggingSupport = $KTInit->setupLogging(); + +// Send all PHP errors to a file (and maybe a window) +set_error_handler(array('KTInit', 'handlePHPError')); + + +$KTInit->setupRandomSeed(); + +$GLOBALS['KTRootUrl'] = $oKTConfig->get('KnowledgeTree/rootUrl'); + +require_once(KT_LIB_DIR . '/database/lookup.inc'); + +// table mapping entries +include('tableMappings.inc'); + +$default->systemVersion = trim(file_get_contents(KT_DIR . '/docs/VERSION.txt')); +$default->versionName = trim(file_get_contents(KT_DIR . '/docs/VERSION-NAME.txt')); + +$KTInit->cleanGlobals(); +$KTInit->cleanMagicQuotes(); + +// site map definition +require_once(KT_DIR . '/config/siteMap.inc'); + +require_once(KT_LIB_DIR . '/session/Session.inc'); +require_once(KT_LIB_DIR . '/session/control.inc'); + +require_once(KT_LIB_DIR . '/plugins/pluginutil.inc.php'); + +if ($checkup !== true) { + // Replace function later + /* ** Get the page being loaded and load the plugins specific to the page ** */ + $sScriptName = $GLOBALS['_SERVER']['SCRIPT_NAME']; + $sScript = basename($sScriptName); + $pos = strpos($sScript, '.'); + $sType = substr($sScript, 0, $pos); + + KTPluginUtil::loadPlugins($sType); +} + +if ($checkup !== true) { + if (KTPluginUtil::pluginIsActive('ktdms.wintools')) { + $path = KTPluginUtil::getPluginPath('ktdms.wintools'); + require_once($path . 'baobabkeyutil.inc.php'); + $name = BaobabKeyUtil::getName(); + if ($name) { + $default->versionName = sprintf('%s %s', $default->versionName, $name); + } + }else{ + $default->versionName = $default->versionName.' '._kt('(Community Edition)'); + } +} +if (!extension_loaded('mbstring')) +{ + require_once(KT_LIB_DIR . '/mbstring.inc.php'); +} + +require_once(KT_LIB_DIR . '/templating/kt3template.inc.php'); +$GLOBALS['main'] =new KTPage(); + +?> diff --git a/config/ktlog.ini b/config/ktlog.ini new file mode 100644 index 0000000..eba8845 --- /dev/null +++ b/config/ktlog.ini @@ -0,0 +1,4 @@ +log4php.rootLogger = INFO, default +;log4php.logger.sql= DEBUG +;log4php.logger.timer= DEBUG +log4php.logger.php= ERROR \ No newline at end of file diff --git a/config/magic b/config/magic new file mode 100644 index 0000000..9c6a4e2 --- /dev/null +++ b/config/magic @@ -0,0 +1,13136 @@ +# Magic +# Magic data for file(1) command. +# Machine-generated from src/cmd/file/magdir/*; edit there only! +# Format is described in magic(files), where: +# files is 5 on V7 and BSD, 4 on SV, and ?? in the SVID. + +#------------------------------------------------------------------------------ +# Localstuff: file(1) magic for locally observed files +# +# $File: Localstuff,v 1.4 2003/03/23 04:17:27 christos Exp $ +# Add any locally observed files here. Remember: +# text if readable, executable if runnable binary, data if unreadable. +#------------------------------------------------------------------------------ +# acorn: file(1) magic for files found on Acorn systems +# + +# RISC OS Chunk File Format +# From RISC OS Programmer's Reference Manual, Appendix D +# We guess the file type from the type of the first chunk. +0 lelong 0xc3cbc6c5 RISC OS Chunk data +>12 string OBJ_ \b, AOF object +>12 string LIB_ \b, ALF library + +# RISC OS AIF, contains "SWI OS_Exit" at offset 16. +16 lelong 0xef000011 RISC OS AIF executable + +# RISC OS Draw files +# From RISC OS Programmer's Reference Manual, Appendix E +0 string Draw RISC OS Draw file data + +# RISC OS new format font files +# From RISC OS Programmer's Reference Manual, Appendix E +0 string FONT\0 RISC OS outline font data, +>5 byte x version %d +0 string FONT\1 RISC OS 1bpp font data, +>5 byte x version %d +0 string FONT\4 RISC OS 4bpp font data +>5 byte x version %d + +# RISC OS Music files +# From RISC OS Programmer's Reference Manual, Appendix E +0 string Maestro\r RISC OS music file +>8 byte x version %d + + +#------------------------------------------------------------------------------ +# adi: file(1) magic for ADi's objects +# From Gregory McGarry +# +0 leshort 0x521c COFF DSP21k +>18 lelong &02 executable, +>18 lelong ^02 +>>18 lelong &01 static object, +>>18 lelong ^01 relocatable object, +>18 lelong &010 stripped +>18 lelong ^010 not stripped + +#------------------------------------------------------------------------------ +# adventure: file(1) magic for Adventure game files +# +# from Allen Garvin +# Edited by Dave Chapeskie Jun 28, 1998 +# Edited by Chris Chittleborough , March 2002 +# +# ALAN +# I assume there are other, lower versions, but these are the only ones I +# saw in the archive. +0 beshort 0x0206 ALAN game data +>2 byte <10 version 2.6%d + + +# Infocom (see z-machine) +#------------------------------------------------------------------------------ +# Z-machine: file(1) magic for Z-machine binaries. +# +# This will match ${TEX_BASE}/texmf/omega/ocp/char2uni/inbig5.ocp which +# appears to be a version-0 Z-machine binary. +# +# The (false match) message is to correct that behavior. Perhaps it is +# not needed. +# +16 belong&0xfe00f0f0 0x3030 Infocom game data +>0 ubyte 0 (false match) +>0 ubyte >0 (Z-machine %d, +>>2 ubeshort x Release %d / +>>18 string >\0 Serial %.6s) + +#------------------------------------------------------------------------------ +# Glulx: file(1) magic for Glulx binaries. +# +# I haven't checked for false matches yet. +# +0 string Glul Glulx game data +>4 beshort x (Version %d +>>6 byte x \b.%d +>>8 byte x \b.%d) +>36 string Info Compiled by Inform + + + +# For Quetzal and blorb magic see iff + + +# TADS (Text Adventure Development System) +# All files are machine-independent (games compile to byte-code) and are tagged +# with a version string of the form "V2..\0" (but TADS 3 is +# on the way). +# Game files start with "TADS2 bin\n\r\032\0" then the compiler version. +0 string TADS2\ bin TADS +>9 belong !0x0A0D1A00 game data, CORRUPTED +>9 belong 0x0A0D1A00 +>>13 string >\0 %s game data +# Resource files start with "TADS2 rsc\n\r\032\0" then the compiler version. +0 string TADS2\ rsc TADS +>9 belong !0x0A0D1A00 resource data, CORRUPTED +>9 belong 0x0A0D1A00 +>>13 string >\0 %s resource data +# Some saved game files start with "TADS2 save/g\n\r\032\0", a little-endian +# 2-byte length N, the N-char name of the game file *without* a NUL (darn!), +# "TADS2 save\n\r\032\0" and the interpreter version. +0 string TADS2\ save/g TADS +>12 belong !0x0A0D1A00 saved game data, CORRUPTED +>12 belong 0x0A0D1A00 +>>(16.s+32) string >\0 %s saved game data +# Other saved game files start with "TADS2 save\n\r\032\0" and the interpreter +# version. +0 string TADS2\ save TADS +>10 belong !0x0A0D1A00 saved game data, CORRUPTED +>10 belong 0x0A0D1A00 +>>14 string >\0 %s saved game data + +#------------------------------------------------------------------------------ +# allegro: file(1) magic for Allegro datafiles +# Toby Deshane +# +0 belong 0x736C6821 Allegro datafile (packed) +0 belong 0x736C682E Allegro datafile (not packed/autodetect) +0 belong 0x736C682B Allegro datafile (appended exe data) + +#------------------------------------------------------------------------------ +# alliant: file(1) magic for Alliant FX series a.out files +# +# If the FX series is the one that had a processor with a 68K-derived +# instruction set, the "short" should probably become "beshort" and the +# "long" should probably become "belong". +# If it's the i860-based one, they should probably become either the +# big-endian or little-endian versions, depending on the mode they ran +# the 860 in.... +# +0 short 0420 0420 Alliant virtual executable +>2 short &0x0020 common library +>16 long >0 not stripped +0 short 0421 0421 Alliant compact executable +>2 short &0x0020 common library +>16 long >0 not stripped +#------------------------------------------------------------------------------ +# alpha architecture description +# + +0 leshort 0603 COFF format alpha +>22 leshort&030000 !020000 executable +>24 leshort 0410 pure +>24 leshort 0413 paged +>22 leshort&020000 !0 dynamically linked +>16 lelong !0 not stripped +>16 lelong 0 stripped +>22 leshort&030000 020000 shared library +>24 leshort 0407 object +>27 byte x - version %d +>26 byte x .%d +>28 byte x -%d + +# Basic recognition of Digital UNIX core dumps - Mike Bremford +# +# The actual magic number is just "Core", followed by a 2-byte version +# number; however, treating any file that begins with "Core" as a Digital +# UNIX core dump file may produce too many false hits, so we include one +# byte of the version number as well; DU 5.0 appears only to be up to +# version 2. +# +0 string Core\001 Alpha COFF format core dump (Digital UNIX) +>24 string >\0 \b, from '%s' +0 string Core\002 Alpha COFF format core dump (Digital UNIX) +>24 string >\0 \b, from '%s' + +#------------------------------------------------------------------------------ +# amanda: file(1) magic for amanda file format +# +0 string AMANDA:\ AMANDA +>8 string TAPESTART\ DATE tape header file, +>>23 string X +>>>25 string >\ Unused %s +>>23 string >\ DATE %s +>8 string FILE\ dump file, +>>13 string >\ DATE %s +#------------------------------------------------------------------------------ +# amigaos: file(1) magic for AmigaOS binary formats: + +# +# From ignatios@cs.uni-bonn.de (Ignatios Souvatzis) +# +0 belong 0x000003fa AmigaOS shared library +0 belong 0x000003f3 AmigaOS loadseg()ble executable/binary +0 belong 0x000003e7 AmigaOS object/library data +# +0 beshort 0xe310 Amiga Workbench +>2 beshort 1 +>>48 byte 1 disk icon +>>48 byte 2 drawer icon +>>48 byte 3 tool icon +>>48 byte 4 project icon +>>48 byte 5 garbage icon +>>48 byte 6 device icon +>>48 byte 7 kickstart icon +>>48 byte 8 workbench application icon +>2 beshort >1 icon, vers. %d +# +# various sound formats from the Amiga +# G=F6tz Waschk +# +0 string FC14 Future Composer 1.4 Module sound file +0 string SMOD Future Composer 1.3 Module sound file +0 string AON4artofnoise Art Of Noise Module sound file +1 string MUGICIAN/SOFTEYES Mugician Module sound file +58 string SIDMON\ II\ -\ THE Sidmon 2.0 Module sound file +0 string Synth4.0 Synthesis Module sound file +0 string ARP. The Holy Noise Module sound file +0 string BeEp\0 JamCracker Module sound file +0 string COSO\0 Hippel-COSO Module sound file +# Too simple (short, pure ASCII, deep), MPi +#26 string V.3 Brian Postma's Soundmon Module sound file v3 +#26 string BPSM Brian Postma's Soundmon Module sound file v3 +#26 string V.2 Brian Postma's Soundmon Module sound file v2 + +# The following are from: "Stefan A. Haubenthal" +0 beshort 0x0f00 AmigaOS bitmap font +0 beshort 0x0f03 AmigaOS outline font +0 belong 0x80001001 AmigaOS outline tag +0 string ##\ version catalog translation +0 string EMOD\0 Amiga E module +8 string ECXM\0 ECX module +0 string/c @database AmigaGuide file + +# Amiga disk types +# +0 string RDSK Rigid Disk Block +>160 string x on %.24s +0 string DOS\0 Amiga DOS disk +0 string DOS\1 Amiga FFS disk +0 string DOS\2 Amiga Inter DOS disk +0 string DOS\3 Amiga Inter FFS disk +0 string DOS\4 Amiga Fastdir DOS disk +0 string DOS\5 Amiga Fastdir FFS disk +0 string KICK Kickstart disk + +# From: Alex Beregszaszi +0 string LZX LZX compressed archive (Amiga) + + +#------------------------------------------------------------------------------ +# animation: file(1) magic for animation/movie formats +# +# animation formats +# MPEG, FLI, DL originally from vax@ccwf.cc.utexas.edu (VaX#n8) +# FLC, SGI, Apple originally from Daniel Quinlan (quinlan@yggdrasil.com) + +# SGI and Apple formats +0 string MOVI Silicon Graphics movie file +4 string moov Apple QuickTime +>12 string mvhd \b movie (fast start) +>12 string mdra \b URL +>12 string cmov \b movie (fast start, compressed header) +>12 string rmra \b multiple URLs +4 string mdat Apple QuickTime movie (unoptimized) +4 string wide Apple QuickTime movie (unoptimized) +4 string skip Apple QuickTime movie (modified) +4 string free Apple QuickTime movie (modified) +4 string idsc Apple QuickTime image (fast start) +4 string idat Apple QuickTime image (unoptimized) +4 string pckg Apple QuickTime compressed archive +4 string/B jP JPEG 2000 image +4 string ftyp ISO Media +>8 string isom \b, MPEG v4 system, version 1 +>8 string iso2 \b, MPEG v4 system, part 12 revision +>8 string mp41 \b, MPEG v4 system, version 1 +>8 string mp42 \b, MPEG v4 system, version 2 +>8 string mp7t \b, MPEG v4 system, MPEG v7 XML +>8 string mp7b \b, MPEG v4 system, MPEG v7 binary XML +>8 string/B jp2 \b, JPEG 2000 +>8 string 3gp \b, MPEG v4 system, 3GPP +>>11 byte 4 \b v4 (H.263/AMR GSM 6.10) +>>11 byte 5 \b v5 (H.263/AMR GSM 6.10) +>>11 byte 6 \b v6 (ITU H.264/AMR GSM 6.10) +>8 string mmp4 \b, MPEG v4 system, 3GPP Mobile +>8 string avc1 \b, MPEG v4 system, 3GPP JVT AVC +>8 string/B M4A \b, MPEG v4 system, iTunes AAC-LC +>8 string/B M4P \b, MPEG v4 system, iTunes AES encrypted +>8 string/B M4B \b, MPEG v4 system, iTunes bookmarked +>8 string/B qt \b, Apple QuickTime movie + +# MPEG sequences +# Scans for all common MPEG header start codes +0 belong 0x00000001 JVT NAL sequence +>4 byte&0x1F 0x07 \b, H.264 video +>>5 byte 66 \b, baseline +>>5 byte 77 \b, main +>>5 byte 88 \b, extended +>>7 byte x \b @ L %u +0 belong&0xFFFFFF00 0x00000100 MPEG sequence +>3 byte 0xBA +>>4 byte &0x40 \b, v2, program multiplex +>>4 byte ^0x40 \b, v1, system multiplex +>3 byte 0xBB \b, v1/2, multiplex (missing pack header) +>3 byte&0x1F 0x07 \b, H.264 video +>>4 byte 66 \b, baseline +>>4 byte 77 \b, main +>>4 byte 88 \b, extended +>>6 byte x \b @ L %u +>3 byte 0xB0 \b, v4 +>>5 belong 0x000001B5 +>>>9 byte &0x80 +>>>>10 byte&0xF0 16 \b, video +>>>>10 byte&0xF0 32 \b, still texture +>>>>10 byte&0xF0 48 \b, mesh +>>>>10 byte&0xF0 64 \b, face +>>>9 byte&0xF8 8 \b, video +>>>9 byte&0xF8 16 \b, still texture +>>>9 byte&0xF8 24 \b, mesh +>>>9 byte&0xF8 32 \b, face +>>4 byte 1 \b, simple @ L1 +>>4 byte 2 \b, simple @ L2 +>>4 byte 3 \b, simple @ L3 +>>4 byte 4 \b, simple @ L0 +>>4 byte 17 \b, simple scalable @ L1 +>>4 byte 18 \b, simple scalable @ L2 +>>4 byte 33 \b, core @ L1 +>>4 byte 34 \b, core @ L2 +>>4 byte 50 \b, main @ L2 +>>4 byte 51 \b, main @ L3 +>>4 byte 53 \b, main @ L4 +>>4 byte 66 \b, n-bit @ L2 +>>4 byte 81 \b, scalable texture @ L1 +>>4 byte 97 \b, simple face animation @ L1 +>>4 byte 98 \b, simple face animation @ L2 +>>4 byte 99 \b, simple face basic animation @ L1 +>>4 byte 100 \b, simple face basic animation @ L2 +>>4 byte 113 \b, basic animation text @ L1 +>>4 byte 114 \b, basic animation text @ L2 +>>4 byte 129 \b, hybrid @ L1 +>>4 byte 130 \b, hybrid @ L2 +>>4 byte 145 \b, advanced RT simple @ L! +>>4 byte 146 \b, advanced RT simple @ L2 +>>4 byte 147 \b, advanced RT simple @ L3 +>>4 byte 148 \b, advanced RT simple @ L4 +>>4 byte 161 \b, core scalable @ L1 +>>4 byte 162 \b, core scalable @ L2 +>>4 byte 163 \b, core scalable @ L3 +>>4 byte 177 \b, advanced coding efficiency @ L1 +>>4 byte 178 \b, advanced coding efficiency @ L2 +>>4 byte 179 \b, advanced coding efficiency @ L3 +>>4 byte 180 \b, advanced coding efficiency @ L4 +>>4 byte 193 \b, advanced core @ L1 +>>4 byte 194 \b, advanced core @ L2 +>>4 byte 209 \b, advanced scalable texture @ L1 +>>4 byte 210 \b, advanced scalable texture @ L2 +>>4 byte 211 \b, advanced scalable texture @ L3 +>>4 byte 225 \b, simple studio @ L1 +>>4 byte 226 \b, simple studio @ L2 +>>4 byte 227 \b, simple studio @ L3 +>>4 byte 228 \b, simple studio @ L4 +>>4 byte 229 \b, core studio @ L1 +>>4 byte 230 \b, core studio @ L2 +>>4 byte 231 \b, core studio @ L3 +>>4 byte 232 \b, core studio @ L4 +>>4 byte 240 \b, advanced simple @ L0 +>>4 byte 241 \b, advanced simple @ L1 +>>4 byte 242 \b, advanced simple @ L2 +>>4 byte 243 \b, advanced simple @ L3 +>>4 byte 244 \b, advanced simple @ L4 +>>4 byte 245 \b, advanced simple @ L5 +>>4 byte 247 \b, advanced simple @ L3b +>>4 byte 248 \b, FGS @ L0 +>>4 byte 249 \b, FGS @ L1 +>>4 byte 250 \b, FGS @ L2 +>>4 byte 251 \b, FGS @ L3 +>>4 byte 252 \b, FGS @ L4 +>>4 byte 253 \b, FGS @ L5 +>3 byte 0xB5 \b, v4 +>>4 byte &0x80 +>>>5 byte&0xF0 16 \b, video (missing profile header) +>>>5 byte&0xF0 32 \b, still texture (missing profile header) +>>>5 byte&0xF0 48 \b, mesh (missing profile header) +>>>5 byte&0xF0 64 \b, face (missing profile header) +>>4 byte&0xF8 8 \b, video (missing profile header) +>>4 byte&0xF8 16 \b, still texture (missing profile header) +>>4 byte&0xF8 24 \b, mesh (missing profile header) +>>4 byte&0xF8 32 \b, face (missing profile header) +>3 byte 0xB3 +>>12 belong 0x000001B8 \b, v1, progressive Y'CbCr 4:2:0 video +>>12 belong 0x000001B2 \b, v1, progressive Y'CbCr 4:2:0 video +>>12 belong 0x000001B5 \b, v2, +>>>16 byte&0x0F 1 \b HP +>>>16 byte&0x0F 2 \b Spt +>>>16 byte&0x0F 3 \b SNR +>>>16 byte&0x0F 4 \b MP +>>>16 byte&0x0F 5 \b SP +>>>17 byte&0xF0 64 \b@HL +>>>17 byte&0xF0 96 \b@H-14 +>>>17 byte&0xF0 128 \b@ML +>>>17 byte&0xF0 160 \b@LL +>>>17 byte &0x08 \b progressive +>>>17 byte ^0x08 \b interlaced +>>>17 byte&0x06 2 \b Y'CbCr 4:2:0 video +>>>17 byte&0x06 4 \b Y'CbCr 4:2:2 video +>>>17 byte&0x06 6 \b Y'CbCr 4:4:4 video +>>11 byte &0x02 +>>>75 byte &0x01 +>>>>140 belong 0x000001B8 \b, v1, progressive Y'CbCr 4:2:0 video +>>>>140 belong 0x000001B2 \b, v1, progressive Y'CbCr 4:2:0 video +>>>>140 belong 0x000001B5 \b, v2, +>>>>>144 byte&0x0F 1 \b HP +>>>>>144 byte&0x0F 2 \b Spt +>>>>>144 byte&0x0F 3 \b SNR +>>>>>144 byte&0x0F 4 \b MP +>>>>>144 byte&0x0F 5 \b SP +>>>>>145 byte&0xF0 64 \b@HL +>>>>>145 byte&0xF0 96 \b@H-14 +>>>>>145 byte&0xF0 128 \b@ML +>>>>>145 byte&0xF0 160 \b@LL +>>>>>145 byte &0x08 \b progressive +>>>>>145 byte ^0x08 \b interlaced +>>>>>145 byte&0x06 2 \b Y'CbCr 4:2:0 video +>>>>>145 byte&0x06 4 \b Y'CbCr 4:2:2 video +>>>>>145 byte&0x06 6 \b Y'CbCr 4:4:4 video +>>76 belong 0x000001B8 \b, v1, progressive Y'CbCr 4:2:0 video +>>76 belong 0x000001B2 \b, v1, progressive Y'CbCr 4:2:0 video +>>76 belong 0x000001B5 \b, v2, +>>>80 byte&0x0F 1 \b HP +>>>80 byte&0x0F 2 \b Spt +>>>80 byte&0x0F 3 \b SNR +>>>80 byte&0x0F 4 \b MP +>>>80 byte&0x0F 5 \b SP +>>>81 byte&0xF0 64 \b@HL +>>>81 byte&0xF0 96 \b@H-14 +>>>81 byte&0xF0 128 \b@ML +>>>81 byte&0xF0 160 \b@LL +>>>81 byte &0x08 \b progressive +>>>81 byte ^0x08 \b interlaced +>>>81 byte&0x06 2 \b Y'CbCr 4:2:0 video +>>>81 byte&0x06 4 \b Y'CbCr 4:2:2 video +>>>81 byte&0x06 6 \b Y'CbCr 4:4:4 video +>>4 belong&0xFFFFFF00 0x78043800 \b, HD-TV 1920P +>>>7 byte&0xF0 0x10 \b, 16:9 +>>4 belong&0xFFFFFF00 0x50002D00 \b, SD-TV 1280I +>>>7 byte&0xF0 0x10 \b, 16:9 +>>4 belong&0xFFFFFF00 0x30024000 \b, PAL Capture +>>>7 byte&0xF0 0x10 \b, 4:3 +>>4 beshort&0xFFF0 0x2C00 \b, 4CIF +>>>5 beshort&0x0FFF 0x01E0 \b NTSC +>>>5 beshort&0x0FFF 0x0240 \b PAL +>>>7 byte&0xF0 0x20 \b, 4:3 +>>>7 byte&0xF0 0x30 \b, 16:9 +>>>7 byte&0xF0 0x40 \b, 11:5 +>>>7 byte&0xF0 0x80 \b, PAL 4:3 +>>>7 byte&0xF0 0xC0 \b, NTSC 4:3 +>>4 belong&0xFFFFFF00 0x2801E000 \b, LD-TV 640P +>>>7 byte&0xF0 0x10 \b, 4:3 +>>4 belong&0xFFFFFF00 0x1400F000 \b, 320x240 +>>>7 byte&0xF0 0x10 \b, 4:3 +>>4 belong&0xFFFFFF00 0x0F00A000 \b, 240x160 +>>>7 byte&0xF0 0x10 \b, 4:3 +>>4 belong&0xFFFFFF00 0x0A007800 \b, 160x120 +>>>7 byte&0xF0 0x10 \b, 4:3 +>>4 beshort&0xFFF0 0x1600 \b, CIF +>>>5 beshort&0x0FFF 0x00F0 \b NTSC +>>>5 beshort&0x0FFF 0x0120 \b PAL +>>>7 byte&0xF0 0x20 \b, 4:3 +>>>7 byte&0xF0 0x30 \b, 16:9 +>>>7 byte&0xF0 0x40 \b, 11:5 +>>>7 byte&0xF0 0x80 \b, PAL 4:3 +>>>7 byte&0xF0 0xC0 \b, NTSC 4:3 +>>>5 beshort&0x0FFF 0x0240 \b PAL 625 +>>>>7 byte&0xF0 0x20 \b, 4:3 +>>>>7 byte&0xF0 0x30 \b, 16:9 +>>>>7 byte&0xF0 0x40 \b, 11:5 +>>4 beshort&0xFFF0 0x2D00 \b, CCIR/ITU +>>>5 beshort&0x0FFF 0x01E0 \b NTSC 525 +>>>5 beshort&0x0FFF 0x0240 \b PAL 625 +>>>7 byte&0xF0 0x20 \b, 4:3 +>>>7 byte&0xF0 0x30 \b, 16:9 +>>>7 byte&0xF0 0x40 \b, 11:5 +>>4 beshort&0xFFF0 0x1E00 \b, SVCD +>>>5 beshort&0x0FFF 0x01E0 \b NTSC 525 +>>>5 beshort&0x0FFF 0x0240 \b PAL 625 +>>>7 byte&0xF0 0x20 \b, 4:3 +>>>7 byte&0xF0 0x30 \b, 16:9 +>>>7 byte&0xF0 0x40 \b, 11:5 +>>7 byte&0x0F 1 \b, 23.976 fps +>>7 byte&0x0F 2 \b, 24 fps +>>7 byte&0x0F 3 \b, 25 fps +>>7 byte&0x0F 4 \b, 29.97 fps +>>7 byte&0x0F 5 \b, 30 fps +>>7 byte&0x0F 6 \b, 50 fps +>>7 byte&0x0F 7 \b, 59.94 fps +>>7 byte&0x0F 8 \b, 60 fps +>>11 byte &0x04 \b, Constrained + +# MPEG ADTS Audio (*.mpx/mxa/aac) +# from dreesen@math.fu-berlin.de +# modified to fully support MPEG ADTS + +# MP3, M1A +0 beshort&0xFFFE 0xFFFA MPEG ADTS, layer III, v1 +# rates +>2 byte&0xF0 0x10 \b, 32 kBits +>2 byte&0xF0 0x20 \b, 40 kBits +>2 byte&0xF0 0x30 \b, 48 kBits +>2 byte&0xF0 0x40 \b, 56 kBits +>2 byte&0xF0 0x50 \b, 64 kBits +>2 byte&0xF0 0x60 \b, 80 kBits +>2 byte&0xF0 0x70 \b, 96 kBits +>2 byte&0xF0 0x80 \b, 112 kBits +>2 byte&0xF0 0x90 \b, 128 kBits +>2 byte&0xF0 0xA0 \b, 160 kBits +>2 byte&0xF0 0xB0 \b, 192 kBits +>2 byte&0xF0 0xC0 \b, 224 kBits +>2 byte&0xF0 0xD0 \b, 256 kBits +>2 byte&0xF0 0xE0 \b, 320 kBits +# timing +>2 byte&0x0C 0x00 \b, 44.1 kHz +>2 byte&0x0C 0x04 \b, 48 kHz +>2 byte&0x0C 0x08 \b, 32 kHz +# channels/options +>3 byte&0xC0 0x00 \b, Stereo +>3 byte&0xC0 0x40 \b, JntStereo +>3 byte&0xC0 0x80 \b, 2x Monaural +>3 byte&0xC0 0xC0 \b, Monaural +#>1 byte ^0x01 \b, Data Verify +#>2 byte &0x02 \b, Packet Pad +#>2 byte &0x01 \b, Custom Flag +#>3 byte &0x08 \b, Copyrighted +#>3 byte &0x04 \b, Original Source +#>3 byte&0x03 1 \b, NR: 50/15 ms +#>3 byte&0x03 3 \b, NR: CCIT J.17 + +# MP2, M1A +0 beshort&0xFFFE 0xFFFC MPEG ADTS, layer II, v1 +# rates +>2 byte&0xF0 0x10 \b, 32 kBits +>2 byte&0xF0 0x20 \b, 48 kBits +>2 byte&0xF0 0x30 \b, 56 kBits +>2 byte&0xF0 0x40 \b, 64 kBits +>2 byte&0xF0 0x50 \b, 80 kBits +>2 byte&0xF0 0x60 \b, 96 kBits +>2 byte&0xF0 0x70 \b, 112 kBits +>2 byte&0xF0 0x80 \b, 128 kBits +>2 byte&0xF0 0x90 \b, 160 kBits +>2 byte&0xF0 0xA0 \b, 192 kBits +>2 byte&0xF0 0xB0 \b, 224 kBits +>2 byte&0xF0 0xC0 \b, 256 kBits +>2 byte&0xF0 0xD0 \b, 320 kBits +>2 byte&0xF0 0xE0 \b, 384 kBits +# timing +>2 byte&0x0C 0x00 \b, 44.1 kHz +>2 byte&0x0C 0x04 \b, 48 kHz +>2 byte&0x0C 0x08 \b, 32 kHz +# channels/options +>3 byte&0xC0 0x00 \b, Stereo +>3 byte&0xC0 0x40 \b, JntStereo +>3 byte&0xC0 0x80 \b, 2x Monaural +>3 byte&0xC0 0xC0 \b, Monaural +#>1 byte ^0x01 \b, Data Verify +#>2 byte &0x02 \b, Packet Pad +#>2 byte &0x01 \b, Custom Flag +#>3 byte &0x08 \b, Copyrighted +#>3 byte &0x04 \b, Original Source +#>3 byte&0x03 1 \b, NR: 50/15 ms +#>3 byte&0x03 3 \b, NR: CCIT J.17 + +# MPA, M1A +# updated by Joerg Jenderek +# GRR the original test are too common for many DOS files, so test 32 <= kbits <= 448 +0 beshort&0xFFFE 0xFFFE +>2 ubyte&0xF0 >0x0F +>>2 ubyte&0xF0 <0xE1 MPEG ADTS, layer I, v1 +# rate +>>>2 byte&0xF0 0x10 \b, 32 kBits +>>>2 byte&0xF0 0x20 \b, 64 kBits +>>>2 byte&0xF0 0x30 \b, 96 kBits +>>>2 byte&0xF0 0x40 \b, 128 kBits +>>>2 byte&0xF0 0x50 \b, 160 kBits +>>>2 byte&0xF0 0x60 \b, 192 kBits +>>>2 byte&0xF0 0x70 \b, 224 kBits +>>>2 byte&0xF0 0x80 \b, 256 kBits +>>>2 byte&0xF0 0x90 \b, 288 kBits +>>>2 byte&0xF0 0xA0 \b, 320 kBits +>>>2 byte&0xF0 0xB0 \b, 352 kBits +>>>2 byte&0xF0 0xC0 \b, 384 kBits +>>>2 byte&0xF0 0xD0 \b, 416 kBits +>>>2 byte&0xF0 0xE0 \b, 448 kBits +# timing +>>>2 byte&0x0C 0x00 \b, 44.1 kHz +>>>2 byte&0x0C 0x04 \b, 48 kHz +>>>2 byte&0x0C 0x08 \b, 32 kHz +# channels/options +>>>3 byte&0xC0 0x00 \b, Stereo +>>>3 byte&0xC0 0x40 \b, JntStereo +>>>3 byte&0xC0 0x80 \b, 2x Monaural +>>>3 byte&0xC0 0xC0 \b, Monaural +#>1 byte ^0x01 \b, Data Verify +#>2 byte &0x02 \b, Packet Pad +#>2 byte &0x01 \b, Custom Flag +#>3 byte &0x08 \b, Copyrighted +#>3 byte &0x04 \b, Original Source +#>3 byte&0x03 1 \b, NR: 50/15 ms +#>3 byte&0x03 3 \b, NR: CCIT J.17 + +# MP3, M2A +0 beshort&0xFFFE 0xFFF2 MPEG ADTS, layer III, v2 +# rate +>2 byte&0xF0 0x10 \b, 8 kBits +>2 byte&0xF0 0x20 \b, 16 kBits +>2 byte&0xF0 0x30 \b, 24 kBits +>2 byte&0xF0 0x40 \b, 32 kBits +>2 byte&0xF0 0x50 \b, 40 kBits +>2 byte&0xF0 0x60 \b, 48 kBits +>2 byte&0xF0 0x70 \b, 56 kBits +>2 byte&0xF0 0x80 \b, 64 kBits +>2 byte&0xF0 0x90 \b, 80 kBits +>2 byte&0xF0 0xA0 \b, 96 kBits +>2 byte&0xF0 0xB0 \b, 112 kBits +>2 byte&0xF0 0xC0 \b, 128 kBits +>2 byte&0xF0 0xD0 \b, 144 kBits +>2 byte&0xF0 0xE0 \b, 160 kBits +# timing +>2 byte&0x0C 0x00 \b, 22.05 kHz +>2 byte&0x0C 0x04 \b, 24 kHz +>2 byte&0x0C 0x08 \b, 16 kHz +# channels/options +>3 byte&0xC0 0x00 \b, Stereo +>3 byte&0xC0 0x40 \b, JntStereo +>3 byte&0xC0 0x80 \b, 2x Monaural +>3 byte&0xC0 0xC0 \b, Monaural +#>1 byte ^0x01 \b, Data Verify +#>2 byte &0x02 \b, Packet Pad +#>2 byte &0x01 \b, Custom Flag +#>3 byte &0x08 \b, Copyrighted +#>3 byte &0x04 \b, Original Source +#>3 byte&0x03 1 \b, NR: 50/15 ms +#>3 byte&0x03 3 \b, NR: CCIT J.17 + +# MP2, M2A +0 beshort&0xFFFE 0xFFF4 MPEG ADTS, layer II, v2 +# rate +>2 byte&0xF0 0x10 \b, 8 kBits +>2 byte&0xF0 0x20 \b, 16 kBits +>2 byte&0xF0 0x30 \b, 24 kBits +>2 byte&0xF0 0x40 \b, 32 kBits +>2 byte&0xF0 0x50 \b, 40 kBits +>2 byte&0xF0 0x60 \b, 48 kBits +>2 byte&0xF0 0x70 \b, 56 kBits +>2 byte&0xF0 0x80 \b, 64 kBits +>2 byte&0xF0 0x90 \b, 80 kBits +>2 byte&0xF0 0xA0 \b, 96 kBits +>2 byte&0xF0 0xB0 \b, 112 kBits +>2 byte&0xF0 0xC0 \b, 128 kBits +>2 byte&0xF0 0xD0 \b, 144 kBits +>2 byte&0xF0 0xE0 \b, 160 kBits +# timing +>2 byte&0x0C 0x00 \b, 22.05 kHz +>2 byte&0x0C 0x04 \b, 24 kHz +>2 byte&0x0C 0x08 \b, 16 kHz +# channels/options +>3 byte&0xC0 0x00 \b, Stereo +>3 byte&0xC0 0x40 \b, JntStereo +>3 byte&0xC0 0x80 \b, 2x Monaural +>3 byte&0xC0 0xC0 \b, Monaural +#>1 byte ^0x01 \b, Data Verify +#>2 byte &0x02 \b, Packet Pad +#>2 byte &0x01 \b, Custom Flag +#>3 byte &0x08 \b, Copyrighted +#>3 byte &0x04 \b, Original Source +#>3 byte&0x03 1 \b, NR: 50/15 ms +#>3 byte&0x03 3 \b, NR: CCIT J.17 + +# MPA, M2A +0 beshort&0xFFFE 0xFFF6 MPEG ADTS, layer I, v2 +# rate +>2 byte&0xF0 0x10 \b, 32 kBits +>2 byte&0xF0 0x20 \b, 48 kBits +>2 byte&0xF0 0x30 \b, 56 kBits +>2 byte&0xF0 0x40 \b, 64 kBits +>2 byte&0xF0 0x50 \b, 80 kBits +>2 byte&0xF0 0x60 \b, 96 kBits +>2 byte&0xF0 0x70 \b, 112 kBits +>2 byte&0xF0 0x80 \b, 128 kBits +>2 byte&0xF0 0x90 \b, 144 kBits +>2 byte&0xF0 0xA0 \b, 160 kBits +>2 byte&0xF0 0xB0 \b, 176 kBits +>2 byte&0xF0 0xC0 \b, 192 kBits +>2 byte&0xF0 0xD0 \b, 224 kBits +>2 byte&0xF0 0xE0 \b, 256 kBits +# timing +>2 byte&0x0C 0x00 \b, 22.05 kHz +>2 byte&0x0C 0x04 \b, 24 kHz +>2 byte&0x0C 0x08 \b, 16 kHz +# channels/options +>3 byte&0xC0 0x00 \b, Stereo +>3 byte&0xC0 0x40 \b, JntStereo +>3 byte&0xC0 0x80 \b, 2x Monaural +>3 byte&0xC0 0xC0 \b, Monaural +#>1 byte ^0x01 \b, Data Verify +#>2 byte &0x02 \b, Packet Pad +#>2 byte &0x01 \b, Custom Flag +#>3 byte &0x08 \b, Copyrighted +#>3 byte &0x04 \b, Original Source +#>3 byte&0x03 1 \b, NR: 50/15 ms +#>3 byte&0x03 3 \b, NR: CCIT J.17 + +# MP3, M25A +0 beshort&0xFFFE 0xFFE2 MPEG ADTS, layer III, v2.5 +# rate +>2 byte&0xF0 0x10 \b, 8 kBits +>2 byte&0xF0 0x20 \b, 16 kBits +>2 byte&0xF0 0x30 \b, 24 kBits +>2 byte&0xF0 0x40 \b, 32 kBits +>2 byte&0xF0 0x50 \b, 40 kBits +>2 byte&0xF0 0x60 \b, 48 kBits +>2 byte&0xF0 0x70 \b, 56 kBits +>2 byte&0xF0 0x80 \b, 64 kBits +>2 byte&0xF0 0x90 \b, 80 kBits +>2 byte&0xF0 0xA0 \b, 96 kBits +>2 byte&0xF0 0xB0 \b, 112 kBits +>2 byte&0xF0 0xC0 \b, 128 kBits +>2 byte&0xF0 0xD0 \b, 144 kBits +>2 byte&0xF0 0xE0 \b, 160 kBits +# timing +>2 byte&0x0C 0x00 \b, 11.025 kHz +>2 byte&0x0C 0x04 \b, 12 kHz +>2 byte&0x0C 0x08 \b, 8 kHz +# channels/options +>3 byte&0xC0 0x00 \b, Stereo +>3 byte&0xC0 0x40 \b, JntStereo +>3 byte&0xC0 0x80 \b, 2x Monaural +>3 byte&0xC0 0xC0 \b, Monaural +#>1 byte ^0x01 \b, Data Verify +#>2 byte &0x02 \b, Packet Pad +#>2 byte &0x01 \b, Custom Flag +#>3 byte &0x08 \b, Copyrighted +#>3 byte &0x04 \b, Original Source +#>3 byte&0x03 1 \b, NR: 50/15 ms +#>3 byte&0x03 3 \b, NR: CCIT J.17 + +# AAC (aka MPEG-2 NBC audio) and MPEG-4 audio + +# Stored AAC streams (instead of the MP4 format) +0 string ADIF MPEG ADIF, AAC +>4 byte &0x80 +>>13 byte &0x10 \b, VBR +>>13 byte ^0x10 \b, CBR +>>16 byte&0x1E 0x02 \b, single stream +>>16 byte&0x1E 0x04 \b, 2 streams +>>16 byte&0x1E 0x06 \b, 3 streams +>>16 byte &0x08 \b, 4 or more streams +>>16 byte &0x10 \b, 8 or more streams +>>4 byte &0x80 \b, Copyrighted +>>13 byte &0x40 \b, Original Source +>>13 byte &0x20 \b, Home Flag +>4 byte ^0x80 +>>4 byte &0x10 \b, VBR +>>4 byte ^0x10 \b, CBR +>>7 byte&0x1E 0x02 \b, single stream +>>7 byte&0x1E 0x04 \b, 2 streams +>>7 byte&0x1E 0x06 \b, 3 streams +>>7 byte &0x08 \b, 4 or more streams +>>7 byte &0x10 \b, 8 or more streams +>>4 byte &0x40 \b, Original Stream(s) +>>4 byte &0x20 \b, Home Source + +# Live or stored single AAC stream (used with MPEG-2 systems) +0 beshort&0xFFF6 0xFFF0 MPEG ADTS, AAC +>1 byte &0x08 \b, v2 +>1 byte ^0x08 \b, v4 +# profile +>>2 byte &0xC0 \b LTP +>2 byte&0xc0 0x00 \b Main +>2 byte&0xc0 0x40 \b LC +>2 byte&0xc0 0x80 \b SSR +# timing +>2 byte&0x3c 0x00 \b, 96 kHz +>2 byte&0x3c 0x04 \b, 88.2 kHz +>2 byte&0x3c 0x08 \b, 64 kHz +>2 byte&0x3c 0x0c \b, 48 kHz +>2 byte&0x3c 0x10 \b, 44.1 kHz +>2 byte&0x3c 0x14 \b, 32 kHz +>2 byte&0x3c 0x18 \b, 24 kHz +>2 byte&0x3c 0x1c \b, 22.05 kHz +>2 byte&0x3c 0x20 \b, 16 kHz +>2 byte&0x3c 0x24 \b, 12 kHz +>2 byte&0x3c 0x28 \b, 11.025 kHz +>2 byte&0x3c 0x2c \b, 8 kHz +# channels +>2 beshort&0x01c0 0x0040 \b, monaural +>2 beshort&0x01c0 0x0080 \b, stereo +>2 beshort&0x01c0 0x00c0 \b, stereo + center +>2 beshort&0x01c0 0x0100 \b, stereo+center+LFE +>2 beshort&0x01c0 0x0140 \b, surround +>2 beshort&0x01c0 0x0180 \b, surround + LFE +>2 beshort &0x01C0 \b, surround + side +#>1 byte ^0x01 \b, Data Verify +#>2 byte &0x02 \b, Custom Flag +#>3 byte &0x20 \b, Original Stream +#>3 byte &0x10 \b, Home Source +#>3 byte &0x08 \b, Copyrighted + +# Live MPEG-4 audio streams (instead of RTP FlexMux) +0 beshort&0xFFE0 0x56E0 MPEG-4 LOAS +#>1 beshort&0x1FFF x \b, %u byte packet +>3 byte&0xE0 0x40 +>>4 byte&0x3C 0x04 \b, single stream +>>4 byte&0x3C 0x08 \b, 2 streams +>>4 byte&0x3C 0x0C \b, 3 streams +>>4 byte &0x08 \b, 4 or more streams +>>4 byte &0x20 \b, 8 or more streams +>3 byte&0xC0 0 +>>4 byte&0x78 0x08 \b, single stream +>>4 byte&0x78 0x10 \b, 2 streams +>>4 byte&0x78 0x18 \b, 3 streams +>>4 byte &0x20 \b, 4 or more streams +>>4 byte &0x40 \b, 8 or more streams +0 beshort 0x4DE1 MPEG-4 LO-EP audio stream + +# FLI animation format +4 leshort 0xAF11 FLI file +>6 leshort x - %d frames, +>8 leshort x width=%d pixels, +>10 leshort x height=%d pixels, +>12 leshort x depth=%d, +>16 leshort x ticks/frame=%d +# FLC animation format +4 leshort 0xAF12 FLC file +>6 leshort x - %d frames +>8 leshort x width=%d pixels, +>10 leshort x height=%d pixels, +>12 leshort x depth=%d, +>16 leshort x ticks/frame=%d + +# DL animation format +# XXX - collision with most `mips' magic +# +# I couldn't find a real magic number for these, however, this +# -appears- to work. Note that it might catch other files, too, so be +# careful! +# +# Note that title and author appear in the two 20-byte chunks +# at decimal offsets 2 and 22, respectively, but they are XOR'ed with +# 255 (hex FF)! The DL format is really bad. +# +#0 byte 1 DL version 1, medium format (160x100, 4 images/screen) +#>42 byte x - %d screens, +#>43 byte x %d commands +#0 byte 2 DL version 2 +#>1 byte 1 - large format (320x200,1 image/screen), +#>1 byte 2 - medium format (160x100,4 images/screen), +#>1 byte >2 - unknown format, +#>42 byte x %d screens, +#>43 byte x %d commands +# Based on empirical evidence, DL version 3 have several nulls following the +# \003. Most of them start with non-null values at hex offset 0x34 or so. +#0 string \3\0\0\0\0\0\0\0\0\0\0\0 DL version 3 + +# iso 13818 transport stream +# +# from Oskar Schirmer Feb 3, 2001 (ISO 13818.1) +# (the following is a little bit restrictive and works fine for a stream +# that starts with PAT properly. it won't work for stream data, that is +# cut from an input device data right in the middle, but this shouldn't +# disturb) +# syncbyte 8 bit 0x47 +# error_ind 1 bit - +# payload_start 1 bit 1 +# priority 1 bit - +# PID 13 bit 0x0000 +# scrambling 2 bit - +# adaptfld_ctrl 2 bit 1 or 3 +# conti_count 4 bit 0 +0 belong&0xFF5FFF1F 0x47400010 MPEG transport stream data +>188 byte !0x47 CORRUPTED + +# DIF digital video file format +0 belong&0xffffff00 0x1f070000 DIF +>4 byte &0x01 (DVCPRO) movie file +>4 byte ^0x01 (DV) movie file +>3 byte &0x80 (PAL) +>3 byte ^0x80 (NTSC) + +# Microsoft Advanced Streaming Format (ASF) +0 belong 0x3026b275 Microsoft ASF + +# MNG Video Format, +0 string \x8aMNG MNG video data, +>4 belong !0x0d0a1a0a CORRUPTED, +>4 belong 0x0d0a1a0a +>>16 belong x %ld x +>>20 belong x %ld + +# JNG Video Format, +0 string \x8bJNG JNG video data, +>4 belong !0x0d0a1a0a CORRUPTED, +>4 belong 0x0d0a1a0a +>>16 belong x %ld x +>>20 belong x %ld + +# Vivo video (Wolfram Kleff) +3 string \x0D\x0AVersion:Vivo Vivo video data + +# VRML (Virtual Reality Modelling Language) +0 string/b #VRML\ V1.0\ ascii VRML 1 file +0 string/b #VRML\ V2.0\ utf8 ISO/IEC 14772 VRML 97 file + +#--------------------------------------------------------------------------- +# HVQM4: compressed movie format designed by Hudson for Nintendo GameCube +# From Mark Sheppard , 2002-10-03 +# +0 string HVQM4 %s +>6 string >\0 v%s +>0 byte x GameCube movie, +>0x34 ubeshort x %d x +>0x36 ubeshort x %d, +>0x26 ubeshort x %dµs, +>0x42 ubeshort 0 no audio +>0x42 ubeshort >0 %dHz audio + +# From: "Stefan A. Haubenthal" +0 string DVDVIDEO-VTS Video title set, +>0x21 byte x v%x +0 string DVDVIDEO-VMG Video manager, +>0x21 byte x v%x + +#------------------------------------------------------------------------------ +# apl: file(1) magic for APL (see also "pdp" and "vax" for other APL +# workspaces) +# +0 long 0100554 APL workspace (Ken's original?) + +#------------------------------------------------------------------------------ +# apple: file(1) magic for Apple file formats +# +0 string FiLeStArTfIlEsTaRt binscii (apple ][) text +0 string \x0aGL Binary II (apple ][) data +0 string \x76\xff Squeezed (apple ][) data +0 string NuFile NuFile archive (apple ][) data +0 string N\xf5F\xe9l\xe5 NuFile archive (apple ][) data +0 belong 0x00051600 AppleSingle encoded Macintosh file +0 belong 0x00051607 AppleDouble encoded Macintosh file + +# magic for Newton PDA package formats +# from Ruda Moura +0 string package0 Newton package, NOS 1.x, +>12 belong &0x80000000 AutoRemove, +>12 belong &0x40000000 CopyProtect, +>12 belong &0x10000000 NoCompression, +>12 belong &0x04000000 Relocation, +>12 belong &0x02000000 UseFasterCompression, +>16 belong x version %d + +0 string package1 Newton package, NOS 2.x, +>12 belong &0x80000000 AutoRemove, +>12 belong &0x40000000 CopyProtect, +>12 belong &0x10000000 NoCompression, +>12 belong &0x04000000 Relocation, +>12 belong &0x02000000 UseFasterCompression, +>16 belong x version %d + +0 string package4 Newton package, +>8 byte 8 NOS 1.x, +>8 byte 9 NOS 2.x, +>12 belong &0x80000000 AutoRemove, +>12 belong &0x40000000 CopyProtect, +>12 belong &0x10000000 NoCompression, + +# The following entries for the Apple II are for files that have +# been transferred as raw binary data from an Apple, without having +# been encapsulated by any of the above archivers. +# +# In general, Apple II formats are hard to identify because Apple DOS +# and especially Apple ProDOS have strong typing in the file system and +# therefore programmers never felt much need to include type information +# in the files themselves. +# +# Eric Fischer + +# AppleWorks word processor: +# +# This matches the standard tab stops for an AppleWorks file, but if +# a file has a tab stop set in the first four columns this will fail. +# +# The "O" is really the magic number, but that's so common that it's +# necessary to check the tab stops that follow it to avoid false positives. + +4 string O==== AppleWorks word processor data +>85 byte&0x01 >0 \b, zoomed +>90 byte&0x01 >0 \b, paginated +>92 byte&0x01 >0 \b, with mail merge +#>91 byte x \b, left margin %d + +# AppleWorks database: +# +# This isn't really a magic number, but it's the closest thing to one +# that I could find. The 1 and 2 really mean "order in which you defined +# categories" and "left to right, top to bottom," respectively; the D and R +# mean that the cursor should move either down or right when you press Return. + +#30 string \x01D AppleWorks database data +#30 string \x02D AppleWorks database data +#30 string \x01R AppleWorks database data +#30 string \x02R AppleWorks database data + +# AppleWorks spreadsheet: +# +# Likewise, this isn't really meant as a magic number. The R or C means +# row- or column-order recalculation; the A or M means automatic or manual +# recalculation. + +#131 string RA AppleWorks spreadsheet data +#131 string RM AppleWorks spreadsheet data +#131 string CA AppleWorks spreadsheet data +#131 string CM AppleWorks spreadsheet data + +# Applesoft BASIC: +# +# This is incredibly sloppy, but will be true if the program was +# written at its usual memory location of 2048 and its first line +# number is less than 256. Yuck. + +0 belong&0xff00ff 0x80000 Applesoft BASIC program data +#>2 leshort x \b, first line number %d + +# ORCA/EZ assembler: +# +# This will not identify ORCA/M source files, since those have +# some sort of date code instead of the two zero bytes at 6 and 7 +# XXX Conflicts with ELF +#4 belong&0xff00ffff 0x01000000 ORCA/EZ assembler source data +#>5 byte x \b, build number %d + +# Broderbund Fantavision +# +# I don't know what these values really mean, but they seem to recur. +# Will they cause too many conflicts? + +# Probably :-) +#2 belong&0xFF00FF 0x040008 Fantavision movie data + +# Some attempts at images. +# +# These are actually just bit-for-bit dumps of the frame buffer, so +# there's really no reasonably way to distinguish them except for their +# address (if preserved) -- 8192 or 16384 -- and their length -- 8192 +# or, occasionally, 8184. +# +# Nevertheless this will manage to catch a lot of images that happen +# to have a solid-colored line at the bottom of the screen. + +8144 string \x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F Apple II image with white background +8144 string \x55\x2A\x55\x2A\x55\x2A\x55\x2A Apple II image with purple background +8144 string \x2A\x55\x2A\x55\x2A\x55\x2A\x55 Apple II image with green background +8144 string \xD5\xAA\xD5\xAA\xD5\xAA\xD5\xAA Apple II image with blue background +8144 string \xAA\xD5\xAA\xD5\xAA\xD5\xAA\xD5 Apple II image with orange background + +# Beagle Bros. Apple Mechanic fonts + +0 belong&0xFF00FFFF 0x6400D000 Apple Mechanic font + +# Apple Universal Disk Image Format (UDIF) - dmg files. +# From Johan Gade. +# These entries are disabled for now until we fix the following issues. +# +# Note there might be some problems with the "VAX COFF executable" +# entry. Note this entry should be placed before the mac filesystem section, +# particularly the "Apple Partition data" entry. +# +# The intended meaning of these tests is, that the file is only of the +# specified type if both of the lines are correct - i.e. if the first +# line matches and the second doesn't then it is not of that type. +# +#0 long 0x7801730d +#>4 long 0x62626060 UDIF read-only zlib-compressed image (UDZO) +# +# Note that this entry is recognized correctly by the "Apple Partition +# data" entry - however since this entry is more specific - this +# information seems to be more useful. +#0 long 0x45520200 +#>0x410 string disk\ image UDIF read/write image (UDRW) + +# From: Toby Peterson +0 string bplist00 Apple binary property list + +# Apple binary property list (bplist) +# Assumes version bytes are hex. +# Provides content hints for version 0 files. Assumes that the root +# object is the first object (true for CoreFoundation implementation). +# From: David Remahl +0 string bplist +>6 byte x \bCoreFoundation binary property list data, version 0x%c +>>7 byte x \b%c +>6 string 00 \b +>>8 byte&0xF0 0x00 \b +>>>8 byte&0x0F 0x00 \b, root type: null +>>>8 byte&0x0F 0x08 \b, root type: false boolean +>>>8 byte&0x0F 0x09 \b, root type: true boolean +>>8 byte&0xF0 0x10 \b, root type: integer +>>8 byte&0xF0 0x20 \b, root type: real +>>8 byte&0xF0 0x30 \b, root type: date +>>8 byte&0xF0 0x40 \b, root type: data +>>8 byte&0xF0 0x50 \b, root type: ascii string +>>8 byte&0xF0 0x60 \b, root type: unicode string +>>8 byte&0xF0 0x80 \b, root type: uid (CORRUPT) +>>8 byte&0xF0 0xa0 \b, root type: array +>>8 byte&0xF0 0xd0 \b, root type: dictionary + +# Apple/NeXT typedstream data +# Serialization format used by NeXT and Apple for various +# purposes in YellowStep/Cocoa, including some nib files. +# From: David Remahl +2 string typedstream NeXT/Apple typedstream data, big endian +>0 byte x \b, version %hhd +>0 byte <5 \b +>>13 byte 0x81 \b +>>>14 ubeshort x \b, system %hd +2 string streamtyped NeXT/Apple typedstream data, little endian +>0 byte x \b, version %hhd +>0 byte <5 \b +>>13 byte 0x81 \b +>>>14 uleshort x \b, system %hd + +#------------------------------------------------------------------------------ +# applix: file(1) magic for Applixware +# From: Peter Soos +# +0 string *BEGIN Applixware +>7 string WORDS Words Document +>7 string GRAPHICS Graphic +>7 string RASTER Bitmap +>7 string SPREADSHEETS Spreadsheet +>7 string MACRO Macro +>7 string BUILDER Builder Object + +#------------------------------------------------------------------------------ +# archive: file(1) magic for archive formats (see also "msdos" for self- +# extracting compressed archives) +# +# cpio, ar, arc, arj, hpack, lha/lharc, rar, squish, uc2, zip, zoo, etc. +# pre-POSIX "tar" archives are handled in the C code. + +# POSIX tar archives +257 string ustar\0 POSIX tar archive +257 string ustar\040\040\0 GNU tar archive + +# cpio archives +# +# Yes, the top two "cpio archive" formats *are* supposed to just be "short". +# The idea is to indicate archives produced on machines with the same +# byte order as the machine running "file" with "cpio archive", and +# to indicate archives produced on machines with the opposite byte order +# from the machine running "file" with "byte-swapped cpio archive". +# +# The SVR4 "cpio(4)" hints that there are additional formats, but they +# are defined as "short"s; I think all the new formats are +# character-header formats and thus are strings, not numbers. +0 short 070707 cpio archive +0 short 0143561 byte-swapped cpio archive +0 string 070707 ASCII cpio archive (pre-SVR4 or odc) +0 string 070701 ASCII cpio archive (SVR4 with no CRC) +0 string 070702 ASCII cpio archive (SVR4 with CRC) + +# Debian package (needs to go before regular portable archives) +# +0 string =!\ndebian +>8 string debian-split part of multipart Debian package +>8 string debian-binary Debian binary package +>68 string >\0 (format %s) +# These next two lines do not work, because a bzip2 Debian archive +# still uses gzip for the control.tar (first in the archive). Only +# data.tar varies, and the location of its filename varies too. +# file/libmagic does not current have support for ascii-string based +# (offsets) as of 2005-09-15. +#>81 string bz2 \b, uses bzip2 compression +#>84 string gz \b, uses gzip compression +#>136 ledate x created: %s + +# other archives +0 long 0177555 very old archive +0 short 0177555 very old PDP-11 archive +0 long 0177545 old archive +0 short 0177545 old PDP-11 archive +0 long 0100554 apl workspace +0 string = archive + +# MIPS archive (needs to go before regular portable archives) +# +0 string =!\n__________E MIPS archive +>20 string U with MIPS Ucode members +>21 string L with MIPSEL members +>21 string B with MIPSEB members +>19 string L and an EL hash table +>19 string B and an EB hash table +>22 string X -- out of date + +0 string -h- Software Tools format archive text + +# +# XXX - why are there multiple thingies? Note that 0x213c6172 is +# "! current ar archive +# 0 long 0x213c6172 archive file +# +# and for SVR1 archives, we have: +# +# 0 string \ System V Release 1 ar archive +# 0 string = archive +# +# XXX - did Aegis really store shared libraries, breakpointed modules, +# and absolute code program modules in the same format as new-style +# "ar" archives? +# +0 string =! current ar archive +>8 string __.SYMDEF random library +>0 belong =65538 - pre SR9.5 +>0 belong =65539 - post SR9.5 +>0 beshort 2 - object archive +>0 beshort 3 - shared library module +>0 beshort 4 - debug break-pointed module +>0 beshort 5 - absolute code program module +0 string \ System V Release 1 ar archive +0 string = archive +# +# XXX - from "vax", which appears to collect a bunch of byte-swapped +# thingies, to help you recognize VAX files on big-endian machines; +# with "leshort", "lelong", and "string", that's no longer necessary.... +# +0 belong 0x65ff0000 VAX 3.0 archive +0 belong 0x3c61723e VAX 5.0 archive +# +0 long 0x213c6172 archive file +0 lelong 0177555 very old VAX archive +0 leshort 0177555 very old PDP-11 archive +# +# XXX - "pdp" claims that 0177545 can have an __.SYMDEF member and thus +# be a random library (it said 0xff65 rather than 0177545). +# +0 lelong 0177545 old VAX archive +>8 string __.SYMDEF random library +0 leshort 0177545 old PDP-11 archive +>8 string __.SYMDEF random library +# +# From "pdp" (but why a 4-byte quantity?) +# +0 lelong 0x39bed PDP-11 old archive +0 lelong 0x39bee PDP-11 4.0 archive + +# ARC archiver, from Daniel Quinlan (quinlan@yggdrasil.com) +# +# The first byte is the magic (0x1a), byte 2 is the compression type for +# the first file (0x01 through 0x09), and bytes 3 to 15 are the MS-DOS +# filename of the first file (null terminated). Since some types collide +# we only test some types on basis of frequency: 0x08 (83%), 0x09 (5%), +# 0x02 (5%), 0x03 (3%), 0x04 (2%), 0x06 (2%). 0x01 collides with terminfo. +0 lelong&0x8080ffff 0x0000081a ARC archive data, dynamic LZW +0 lelong&0x8080ffff 0x0000091a ARC archive data, squashed +0 lelong&0x8080ffff 0x0000021a ARC archive data, uncompressed +0 lelong&0x8080ffff 0x0000031a ARC archive data, packed +0 lelong&0x8080ffff 0x0000041a ARC archive data, squeezed +0 lelong&0x8080ffff 0x0000061a ARC archive data, crunched +# [JW] stuff taken from idarc, obviously ARC successors: +0 lelong&0x8080ffff 0x00000a1a PAK archive data +0 lelong&0x8080ffff 0x0000141a ARC+ archive data +0 lelong&0x8080ffff 0x0000481a HYP archive data + +# Acorn archive formats (Disaster prone simpleton, m91dps@ecs.ox.ac.uk) +# I can't create either SPARK or ArcFS archives so I have not tested this stuff +# [GRR: the original entries collide with ARC, above; replaced with combined +# version (not tested)] +#0 byte 0x1a RISC OS archive (spark format) +0 string \032archive RISC OS archive (ArcFS format) +0 string Archive\000 RISC OS archive (ArcFS format) + +# All these were taken from idarc, many could not be verified. Unfortunately, +# there were many low-quality sigs, i.e. easy to trigger false positives. +# Please notify me of any real-world fishy/ambiguous signatures and I'll try +# to get my hands on the actual archiver and see if I find something better. [JW] +# probably many can be enhanced by finding some 0-byte or control char near the start + +# idarc calls this Crush/Uncompressed... *shrug* +0 string CRUSH Crush archive data +# Squeeze It (.sqz) +0 string HLSQZ Squeeze It archive data +# SQWEZ +0 string SQWEZ SQWEZ archive data +# HPack (.hpk) +0 string HPAK HPack archive data +# HAP +0 string \x91\x33HF HAP archive data +# MD/MDCD +0 string MDmd MDCD archive data +# LIM +0 string LIM\x1a LIM archive data +# SAR +3 string LH5 SAR archive data +# BSArc/BS2 +0 string \212\3SB \0 BSArc/BS2 archive data +# MAR +2 string =-ah MAR archive data +# ACB +0 belong&0x00f800ff 0x00800000 ACB archive data +# CPZ +# TODO, this is what idarc says: 0 string \0\0\0 CPZ archive data +# JRC +0 string JRchive JRC archive data +# Quantum +0 string DS\0 Quantum archive data +# ReSOF +0 string PK\3\6 ReSOF archive data +# QuArk +0 string 7\4 QuArk archive data +# YAC +14 string YC YAC archive data +# X1 +0 string X1 X1 archive data +0 string XhDr X1 archive data +# CDC Codec (.dqt) +0 belong&0xffffe000 0x76ff2000 CDC Codec archive data +# AMGC +0 string \xad6" AMGC archive data +# NuLIB +0 string NƵFĆ©lĆ„ NuLIB archive data +# PakLeo +0 string LEOLZW PAKLeo archive data +# ChArc +0 string SChF ChArc archive data +# PSA +0 string PSA PSA archive data +# CrossePAC +0 string DSIGDCC CrossePAC archive data +# Freeze +0 string \x1f\x9f\x4a\x10\x0a Freeze archive data +# KBoom +0 string ĀØMPĀØ KBoom archive data +# NSQ, must go after CDC Codec +0 string \x76\xff NSQ archive data +# DPA +0 string Dirk\ Paehl DPA archive data +# BA +# TODO: idarc says "bytes 0-2 == bytes 3-5" +# TTComp +0 string \0\6 TTComp archive data +# ESP, could this conflict with Easy Software Products' (e.g.ESP ghostscript) documentation? +0 string ESP ESP archive data +# ZPack +0 string \1ZPK\1 ZPack archive data +# Sky +0 string \xbc\x40 Sky archive data +# UFA +0 string UFA UFA archive data +# Dry +0 string =-H2O DRY archive data +# FoxSQZ +0 string FOXSQZ FoxSQZ archive data +# AR7 +0 string ,AR7 AR7 archive data +# PPMZ +0 string PPMZ PPMZ archive data +# MS Compress +4 string \x88\xf0\x27 MS Compress archive data +# updated by Joerg Jenderek +>9 string \0 +>>0 string KWAJ +>>>7 string \321\003 MS Compress archive data +>>>>14 ulong >0 \b, original size: %ld bytes +>>>>18 ubyte >0x65 +>>>>>18 string x \b, was %.8s +>>>>>(10.b-4) string x \b.%.3s +# MP3 (archiver, not lossy audio compression) +0 string MP3\x1a MP3-Archiver archive data +# ZET +0 string OZƝ ZET archive data +# TSComp +0 string \x65\x5d\x13\x8c\x08\x01\x03\x00 TSComp archive data +# ARQ +0 string gW\4\1 ARQ archive data +# Squash +3 string OctSqu Squash archive data +# Terse +0 string \5\1\1\0 Terse archive data +# PUCrunch +0 string \x01\x08\x0b\x08\xef\x00\x9e\x32\x30\x36\x31 PUCrunch archive data +# UHarc +0 string UHA UHarc archive data +# ABComp +0 string \2AB ABComp archive data +0 string \3AB2 ABComp archive data +# CMP +0 string CO\0 CMP archive data +# Splint +0 string \x93\xb9\x06 Splint archive data +# InstallShield +0 string \x13\x5d\x65\x8c InstallShield Z archive Data +# Gather +1 string GTH Gather archive data +# BOA +0 string BOA BOA archive data +# RAX +0 string ULEB\xa RAX archive data +# Xtreme +0 string ULEB\0 Xtreme archive data +# Pack Magic +0 string @Ć¢\1\0 Pack Magic archive data +# BTS +0 belong&0xfeffffff 0x1a034465 BTS archive data +# ELI 5750 +0 string Ora\ ELI 5750 archive data +# QFC +0 string \x1aFC\x1a QFC archive data +0 string \x1aQF\x1a QFC archive data +# PRO-PACK +0 string RNC PRO-PACK archive data +# 777 +0 string 777 777 archive data +# LZS221 +0 string sTaC LZS221 archive data +# HPA +0 string HPA HPA archive data +# Arhangel +0 string LG Arhangel archive data +# EXP1, uses bzip2 +0 string 0123456789012345BZh EXP1 archive data +# IMP +0 string IMP\xa IMP archive data +# NRV +0 string \x00\x9E\x6E\x72\x76\xFF NRV archive data +# Squish +0 string \x73\xb2\x90\xf4 Squish archive data +# Par +0 string PHILIPP Par archive data +0 string PAR Par archive data +# HIT +0 string UB HIT archive data +# SBX +0 belong&0xfffff000 0x53423000 SBX archive data +# NaShrink +0 string NSK NaShrink archive data +# SAPCAR +0 string #\ CAR\ archive\ header SAPCAR archive data +0 string CAR\ 2.00RG SAPCAR archive data +# Disintegrator +0 string DST Disintegrator archive data +# ASD +0 string ASD ASD archive data +# InstallShield CAB +0 string ISc( InstallShield CAB +# TOP4 +0 string T4\x1a TOP4 archive data +# BatComp left out: sig looks like COM executable +# so TODO: get real 4dos batcomp file and find sig +# BlakHole +0 string BH\5\7 BlakHole archive data +# BIX +0 string BIX0 BIX archive data +# ChiefLZA +0 string ChfLZ ChiefLZA archive data +# Blink +0 string Blink Blink archive data +# Logitech Compress +0 string \xda\xfa Logitech Compress archive data +# ARS-Sfx (FIXME: really a SFX? then goto COM/EXE) +1 string (C)\ STEPANYUK ARS-Sfx archive data +# AKT/AKT32 +0 string AKT32 AKT32 archive data +0 string AKT AKT archive data +# NPack +0 string MSTSM NPack archive data +# PFT +0 string \0\x50\0\x14 PFT archive data +# SemOne +0 string SEM SemOne archive data +# PPMD +0 string \x8f\xaf\xac\x84 PPMD archive data +# FIZ +0 string FIZ FIZ archive data +# MSXiE +0 belong&0xfffff0f0 0x4d530000 MSXiE archive data +# DeepFreezer +0 belong&0xfffffff0 0x797a3030 DeepFreezer archive data +# DC +0 string =2 byte x \b, version %i +>3 byte x \b.%i +# ZZip archiver (.zz) +0 string ZZ\ \0\0 ZZip archive data +0 string ZZ0 ZZip archive data +# PAQ archiver (.paq) +0 string \xaa\x40\x5f\x77\x1f\xe5\x82\x0d PAQ archive data +0 string PAQ PAQ archive data +>3 byte&0xf0 0x30 +>>3 byte x (v%c) +# JAR archiver (.j), this is the successor to ARJ, not Java's JAR (which is essentially ZIP) +0xe string \x1aJar\x1b JAR (ARJ Software, Inc.) archive data +0 string JARCS JAR (ARJ Software, Inc.) archive data + +# ARJ archiver (jason@jarthur.Claremont.EDU) +0 leshort 0xea60 ARJ archive data +>5 byte x \b, v%d, +>8 byte &0x04 multi-volume, +>8 byte &0x10 slash-switched, +>8 byte &0x20 backup, +>34 string x original name: %s, +>7 byte 0 os: MS-DOS +>7 byte 1 os: PRIMOS +>7 byte 2 os: Unix +>7 byte 3 os: Amiga +>7 byte 4 os: Macintosh +>7 byte 5 os: OS/2 +>7 byte 6 os: Apple ][ GS +>7 byte 7 os: Atari ST +>7 byte 8 os: NeXT +>7 byte 9 os: VAX/VMS +>3 byte >0 %d] +# [JW] idarc says this is also possible +2 leshort 0xea60 ARJ archive data + +# HA archiver (Greg Roelofs, newt@uchicago.edu) +# This is a really bad format. A file containing HAWAII will match this... +#0 string HA HA archive data, +#>2 leshort =1 1 file, +#>2 leshort >1 %u files, +#>4 byte&0x0f =0 first is type CPY +#>4 byte&0x0f =1 first is type ASC +#>4 byte&0x0f =2 first is type HSC +#>4 byte&0x0f =0x0e first is type DIR +#>4 byte&0x0f =0x0f first is type SPECIAL +# suggestion: at least identify small archives (<1024 files) +0 belong&0xffff00fc 0x48410000 HA archive data +>2 leshort =1 1 file, +>2 leshort >1 %u files, +>4 byte&0x0f =0 first is type CPY +>4 byte&0x0f =1 first is type ASC +>4 byte&0x0f =2 first is type HSC +>4 byte&0x0f =0x0e first is type DIR +>4 byte&0x0f =0x0f first is type SPECIAL + +# HPACK archiver (Peter Gutmann, pgut1@cs.aukuni.ac.nz) +0 string HPAK HPACK archive data + +# JAM Archive volume format, by Dmitry.Kohmanyuk@UA.net +0 string \351,\001JAM\ JAM archive, +>7 string >\0 version %.4s +>0x26 byte =0x27 - +>>0x2b string >\0 label %.11s, +>>0x27 lelong x serial %08x, +>>0x36 string >\0 fstype %.8s + +# LHARC/LHA archiver (Greg Roelofs, newt@uchicago.edu) +2 string -lh0- LHarc 1.x/ARX archive data [lh0] +2 string -lh1- LHarc 1.x/ARX archive data [lh1] +2 string -lz4- LHarc 1.x archive data [lz4] +2 string -lz5- LHarc 1.x archive data [lz5] +# [never seen any but the last; -lh4- reported in comp.compression:] +2 string -lzs- LHa/LZS archive data [lzs] +2 string -lh\40- LHa 2.x? archive data [lh ] +2 string -lhd- LHa 2.x? archive data [lhd] +2 string -lh2- LHa 2.x? archive data [lh2] +2 string -lh3- LHa 2.x? archive data [lh3] +2 string -lh4- LHa (2.x) archive data [lh4] +2 string -lh5- LHa (2.x) archive data [lh5] +2 string -lh6- LHa (2.x) archive data [lh6] +2 string -lh7- LHa (2.x)/LHark archive data [lh7] +>20 byte x - header level %d +# taken from idarc [JW] +2 string -lZ PUT archive data +2 string -lz LZS archive data +2 string -sw1- Swag archive data + +# RAR archiver (Greg Roelofs, newt@uchicago.edu) +0 string Rar! RAR archive data, +>44 byte x v%0x, +>10 byte >0 flags: +>>10 byte &0x01 Archive volume, +>>10 byte &0x02 Commented, +>>10 byte &0x04 Locked, +>>10 byte &0x08 Solid, +>>10 byte &0x20 Authenticated, +>35 byte 0 os: MS-DOS +>35 byte 1 os: OS/2 +>35 byte 2 os: Win32 +>35 byte 3 os: Unix +# some old version? idarc says: +0 string RE\x7e\x5e RAR archive data + +# SQUISH archiver (Greg Roelofs, newt@uchicago.edu) +0 string SQSH squished archive data (Acorn RISCOS) + +# UC2 archiver (Greg Roelofs, newt@uchicago.edu) +# [JW] see exe section for self-extracting version +0 string UC2\x1a UC2 archive data + +# ZIP archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu) +0 string PK\003\004 +>4 byte 0x09 Zip archive data, at least v0.9 to extract +>4 byte 0x0a Zip archive data, at least v1.0 to extract +>4 byte 0x0b Zip archive data, at least v1.1 to extract +>4 byte 0x14 +>>30 ubelong !0x6d696d65 Zip archive data, at least v2.0 to extract +>0x161 string WINZIP Zip archive data, WinZIP self-extracting + + +# OpenOffice.org / KOffice / StarOffice documents +# From: Abel Cheung +# Listed here because they are basically zip files +>>30 string mimetype + +# KOffice (1.2 or above) formats +>>>50 string vnd.kde. KOffice (>=1.2) +>>>>58 string karbon Karbon document +>>>>58 string kchart KChart document +>>>>58 string kformula KFormula document +>>>>58 string kivio Kivio document +>>>>58 string kontour Kontour document +>>>>58 string kpresenter KPresenter document +>>>>58 string kspread KSpread document +>>>>58 string kword KWord document + +# OpenOffice formats (for OpenOffice 1.x / StarOffice 6/7) +>>>50 string vnd.sun.xml. OpenOffice.org 1.x +>>>>62 string writer Writer +>>>>>68 byte !0x2e document +>>>>>68 string .template template +>>>>>68 string .global global document +>>>>62 string calc Calc +>>>>>66 byte !0x2e spreadsheet +>>>>>66 string .template template +>>>>62 string draw Draw +>>>>>66 byte !0x2e document +>>>>>66 string .template template +>>>>62 string impress Impress +>>>>>69 byte !0x2e presentation +>>>>>69 string .template template +>>>>62 string math Math document + +# OpenDocument formats (for OpenOffice 2.x / StarOffice >= 8) +# http://lists.oasis-open.org/archives/office/200505/msg00006.html +>>>50 string vnd.oasis.opendocument. OpenDocument +>>>>73 string text +>>>>>77 byte !0x2d Text +>>>>>77 string -template Text Template +>>>>>77 string -web HTML Document Template +>>>>>77 string -master Master Document +>>>>73 string graphics Drawing +>>>>>81 string -template Template +>>>>73 string presentation Presentation +>>>>>85 string -template Template +>>>>73 string spreadsheet Spreadsheet +>>>>>84 string -template Template +>>>>73 string chart Chart +>>>>>78 string -template Template +>>>>73 string formula Formula +>>>>>80 string -template Template +>>>>73 string database Database +>>>>73 string image Image + +# Zoo archiver +20 lelong 0xfdc4a7dc Zoo archive data +>4 byte >48 \b, v%c. +>>6 byte >47 \b%c +>>>7 byte >47 \b%c +>32 byte >0 \b, modify: v%d +>>33 byte x \b.%d+ +>42 lelong 0xfdc4a7dc \b, +>>70 byte >0 extract: v%d +>>>71 byte x \b.%d+ + +# Shell archives +10 string #\ This\ is\ a\ shell\ archive shell archive text + +# +# LBR. NB: May conflict with the questionable +# "binary Computer Graphics Metafile" format. +# +0 string \0\ \ \ \ \ \ \ \ \ \ \ \0\0 LBR archive data +# +# PMA (CP/M derivative of LHA) +# +2 string -pm0- PMarc archive data [pm0] +2 string -pm1- PMarc archive data [pm1] +2 string -pm2- PMarc archive data [pm2] +2 string -pms- PMarc SFX archive (CP/M, DOS) +5 string -pc1- PopCom compressed executable (CP/M) + +# From Rafael Laboissiere +# The Project Revision Control System (see +# http://prcs.sourceforge.net) generates a packaged project +# file which is recognized by the following entry: +0 leshort 0xeb81 PRCS packaged project + +# Microsoft cabinets +# by David Necas (Yeti) +#0 string MSCF\0\0\0\0 Microsoft cabinet file data, +#>25 byte x v%d +#>24 byte x \b.%d +# MPi: All CABs have version 1.3, so this is pointless. +# Better magic in debian-additions. + +# GTKtalog catalogs +# by David Necas (Yeti) +4 string gtktalog\ GTKtalog catalog data, +>13 string 3 version 3 +>>14 beshort 0x677a (gzipped) +>>14 beshort !0x677a (not gzipped) +>13 string >3 version %s + +############################################################################ +# Parity archive reconstruction file, the 'par' file format now used on Usenet. +0 string PAR\0 PARity archive data +>48 leshort =0 - Index file +>48 leshort >0 - file number %d + +# Felix von Leitner +0 string d8:announce BitTorrent file + +# Atari MSA archive - Teemu Hukkanen +0 beshort 0x0e0f Atari MSA archive data +>2 beshort x \b, %d sectors per track +>4 beshort 0 \b, 1 sided +>4 beshort 1 \b, 2 sided +>6 beshort x \b, starting track: %d +>8 beshort x \b, ending track: %d + +# Alternate ZIP string (amc@arwen.cs.berkeley.edu) +0 string PK00PK\003\004 Zip archive data + +# ACE archive (from http://www.wotsit.org/download.asp?f=ace) +# by Stefan `Sec` Zehl +7 string **ACE** ACE archive data +>15 byte >0 version %d +>16 byte =0x00 \b, from MS-DOS +>16 byte =0x01 \b, from OS/2 +>16 byte =0x02 \b, from Win/32 +>16 byte =0x03 \b, from Unix +>16 byte =0x04 \b, from MacOS +>16 byte =0x05 \b, from WinNT +>16 byte =0x06 \b, from Primos +>16 byte =0x07 \b, from AppleGS +>16 byte =0x08 \b, from Atari +>16 byte =0x09 \b, from Vax/VMS +>16 byte =0x0A \b, from Amiga +>16 byte =0x0B \b, from Next +>14 byte x \b, version %d to extract +>5 leshort &0x0080 \b, multiple volumes, +>>17 byte x \b (part %d), +>5 leshort &0x0002 \b, contains comment +>5 leshort &0x0200 \b, sfx +>5 leshort &0x0400 \b, small dictionary +>5 leshort &0x0800 \b, multi-volume +>5 leshort &0x1000 \b, contains AV-String +>>30 string \x16*UNREGISTERED\x20VERSION* (unregistered) +>5 leshort &0x2000 \b, with recovery record +>5 leshort &0x4000 \b, locked +>5 leshort &0x8000 \b, solid +# Date in MS-DOS format (whatever that is) +#>18 lelong x Created on + +# sfArk : compression program for Soundfonts (sf2) by Dirk Jagdmann +# +0x1A string sfArk sfArk compressed Soundfont +>0x15 string 2 +>>0x1 string >\0 Version %s +>>0x2A string >\0 : %s + +# DR-DOS 7.03 Packed File *.??_ +0 string Packed\ File\ Personal NetWare Packed File +>12 string x \b, was "%.12s" + +# EET archive +# From: Tilman Sauerbeck +0 belong 0x1ee7ff00 EET archive + +# rzip archives +0 string RZIP rzip compressed data +>4 byte x - version %d +>5 byte x \b.%d +>6 belong x (%d bytes) + +# From: "Robert Dale" +0 belong 123 dar archive, +>4 belong x label "%.8x +>>8 belong x %.8x +>>>12 beshort x %.4x" +>14 byte 0x54 end slice +>14 beshort 0x4e4e multi-part +>14 beshort 0x4e53 multi-part, with -S + +# Symbian installation files +# http://www.thouky.co.uk/software/psifs/sis.html +# http://developer.symbian.com/main/downloads/papers/SymbianOSv91/softwareinstallsis.pdf +8 lelong 0x10000419 Symbian installation file +>4 lelong 0x1000006D (EPOC release 3/4/5) +>4 lelong 0x10003A12 (EPOC release 6) +0 lelong 0x10201A7A Symbian installation file (Symbian OS 9.x) + +#------------------------------------------------------------------------------ +# asterix: file(1) magic for Aster*x; SunOS 5.5.1 gave the 4-character +# strings as "long" - we assume they're just strings: +# From: guy@netapp.com (Guy Harris) +# +0 string *STA Aster*x +>7 string WORD Words Document +>7 string GRAP Graphic +>7 string SPRE Spreadsheet +>7 string MACR Macro +0 string 2278 Aster*x Version 2 +>29 byte 0x36 Words Document +>29 byte 0x35 Graphic +>29 byte 0x32 Spreadsheet +>29 byte 0x38 Macro + + +#------------------------------------------------------------------------------ +# att3b: file(1) magic for AT&T 3B machines +# +# The `versions' should be un-commented if they work for you. +# (Was the problem just one of endianness?) +# +# 3B20 +# +# The 3B20 conflicts with SCCS. +#0 beshort 0550 3b20 COFF executable +#>12 belong >0 not stripped +#>22 beshort >0 - version %ld +#0 beshort 0551 3b20 COFF executable (TV) +#>12 belong >0 not stripped +#>22 beshort >0 - version %ld +# +# WE32K +# +0 beshort 0560 WE32000 COFF +>18 beshort ^00000020 object +>18 beshort &00000020 executable +>12 belong >0 not stripped +>18 beshort ^00010000 N/A on 3b2/300 w/paging +>18 beshort &00020000 32100 required +>18 beshort &00040000 and MAU hardware required +>20 beshort 0407 (impure) +>20 beshort 0410 (pure) +>20 beshort 0413 (demand paged) +>20 beshort 0443 (target shared library) +>22 beshort >0 - version %ld +0 beshort 0561 WE32000 COFF executable (TV) +>12 belong >0 not stripped +#>18 beshort &00020000 - 32100 required +#>18 beshort &00040000 and MAU hardware required +#>22 beshort >0 - version %ld +# +# core file for 3b2 +0 string \000\004\036\212\200 3b2 core file +>364 string >\0 of '%s' + +#------------------------------------------------------------------------------ +# audio: file(1) magic for sound formats (see also "iff") +# +# Jan Nicolai Langfeldt (janl@ifi.uio.no), Dan Quinlan (quinlan@yggdrasil.com), +# and others +# + +# Sun/NeXT audio data +0 string .snd Sun/NeXT audio data: +>12 belong 1 8-bit ISDN mu-law, +>12 belong 2 8-bit linear PCM [REF-PCM], +>12 belong 3 16-bit linear PCM, +>12 belong 4 24-bit linear PCM, +>12 belong 5 32-bit linear PCM, +>12 belong 6 32-bit IEEE floating point, +>12 belong 7 64-bit IEEE floating point, +>12 belong 8 Fragmented sample data, +>12 belong 10 DSP program, +>12 belong 11 8-bit fixed point, +>12 belong 12 16-bit fixed point, +>12 belong 13 24-bit fixed point, +>12 belong 14 32-bit fixed point, +>12 belong 18 16-bit linear with emphasis, +>12 belong 19 16-bit linear compressed, +>12 belong 20 16-bit linear with emphasis and compression, +>12 belong 21 Music kit DSP commands, +>12 belong 23 8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.), +>12 belong 24 compressed (8-bit CCITT G.722 ADPCM) +>12 belong 25 compressed (3-bit CCITT G.723.3 ADPCM), +>12 belong 26 compressed (5-bit CCITT G.723.5 ADPCM), +>12 belong 27 8-bit A-law (CCITT G.711), +>20 belong 1 mono, +>20 belong 2 stereo, +>20 belong 4 quad, +>16 belong >0 %d Hz + +# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format +# that uses little-endian encoding and has a different magic number +0 lelong 0x0064732E DEC audio data: +>12 lelong 1 8-bit ISDN mu-law, +>12 lelong 2 8-bit linear PCM [REF-PCM], +>12 lelong 3 16-bit linear PCM, +>12 lelong 4 24-bit linear PCM, +>12 lelong 5 32-bit linear PCM, +>12 lelong 6 32-bit IEEE floating point, +>12 lelong 7 64-bit IEEE floating point, +>12 belong 8 Fragmented sample data, +>12 belong 10 DSP program, +>12 belong 11 8-bit fixed point, +>12 belong 12 16-bit fixed point, +>12 belong 13 24-bit fixed point, +>12 belong 14 32-bit fixed point, +>12 belong 18 16-bit linear with emphasis, +>12 belong 19 16-bit linear compressed, +>12 belong 20 16-bit linear with emphasis and compression, +>12 belong 21 Music kit DSP commands, +>12 lelong 23 8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.), +>12 belong 24 compressed (8-bit CCITT G.722 ADPCM) +>12 belong 25 compressed (3-bit CCITT G.723.3 ADPCM), +>12 belong 26 compressed (5-bit CCITT G.723.5 ADPCM), +>12 belong 27 8-bit A-law (CCITT G.711), +>20 lelong 1 mono, +>20 lelong 2 stereo, +>20 lelong 4 quad, +>16 lelong >0 %d Hz + +# Creative Labs AUDIO stuff +0 string MThd Standard MIDI data +>8 beshort x (format %d) +>10 beshort x using %d track +>10 beshort >1 \bs +>12 beshort&0x7fff x at 1/%d +>12 beshort&0x8000 >0 SMPTE + +0 string CTMF Creative Music (CMF) data +0 string SBI SoundBlaster instrument data +0 string Creative\ Voice\ File Creative Labs voice data +# is this next line right? it came this way... +>19 byte 0x1A +>23 byte >0 - version %d +>22 byte >0 \b.%d + +# first entry is also the string "NTRK" +0 belong 0x4e54524b MultiTrack sound data +>4 belong x - version %ld + +# Extended MOD format (*.emd) (Greg Roelofs, newt@uchicago.edu); NOT TESTED +# [based on posting 940824 by "Dirk/Elastik", husberg@lehtori.cc.tut.fi] +0 string EMOD Extended MOD sound data, +>4 byte&0xf0 x version %d +>4 byte&0x0f x \b.%d, +>45 byte x %d instruments +>83 byte 0 (module) +>83 byte 1 (song) + +# Real Audio (Magic .ra\0375) +0 belong 0x2e7261fd RealAudio sound file +0 string .RMF RealMedia file + +# MTM/669/FAR/S3M/ULT/XM format checking [Aaron Eppert, aeppert@dialin.ind.net] +# Oct 31, 1995 +# fixed by 2003-06-24 +# Too short... +#0 string MTM MultiTracker Module sound file +#0 string if Composer 669 Module sound data +#0 string JN Composer 669 Module sound data (extended format) +0 string MAS_U ULT(imate) Module sound data + +#0 string FAR Module sound data +#>4 string >\15 Title: "%s" + +0x2c string SCRM ScreamTracker III Module sound data +>0 string >\0 Title: "%s" + +# Gravis UltraSound patches +# From + +0 string GF1PATCH110\0ID#000002\0 GUS patch +0 string GF1PATCH100\0ID#000002\0 Old GUS patch + +# +# Taken from loader code from mikmod version 2.14 +# by Steve McIntyre (stevem@chiark.greenend.org.uk) +# added title printing on 2003-06-24 +0 string MAS_UTrack_V00 +>14 string >/0 ultratracker V1.%.1s module sound data + +0 string UN05 MikMod UNI format module sound data + +0 string Extended\ Module: Fasttracker II module sound data +>17 string >\0 Title: "%s" + +21 string/c =!SCREAM! Screamtracker 2 module sound data +21 string BMOD2STM Screamtracker 2 module sound data +1080 string M.K. 4-channel Protracker module sound data +>0 string >\0 Title: "%s" +1080 string M!K! 4-channel Protracker module sound data +>0 string >\0 Title: "%s" +1080 string FLT4 4-channel Startracker module sound data +>0 string >\0 Title: "%s" +1080 string FLT8 8-channel Startracker module sound data +>0 string >\0 Title: "%s" +1080 string 4CHN 4-channel Fasttracker module sound data +>0 string >\0 Title: "%s" +1080 string 6CHN 6-channel Fasttracker module sound data +>0 string >\0 Title: "%s" +1080 string 8CHN 8-channel Fasttracker module sound data +>0 string >\0 Title: "%s" +1080 string CD81 8-channel Octalyser module sound data +>0 string >\0 Title: "%s" +1080 string OKTA 8-channel Oktalyzer module sound data +>0 string >\0 Title: "%s" +# Not good enough. +#1082 string CH +#>1080 string >/0 %.2s-channel Fasttracker "oktalyzer" module sound data +1080 string 16CN 16-channel Taketracker module sound data +>0 string >\0 Title: "%s" +1080 string 32CN 32-channel Taketracker module sound data +>0 string >\0 Title: "%s" + +# TOC sound files -Trevor Johnson +# +0 string TOC TOC sound file + +# sidfiles +# added name,author,(c) and new RSID type by 2003-06-24 +0 string SIDPLAY\ INFOFILE Sidplay info file + +0 string PSID PlaySID v2.2+ (AMIGA) sidtune +>4 beshort >0 w/ header v%d, +>14 beshort =1 single song, +>14 beshort >1 %d songs, +>16 beshort >0 default song: %d +>0x16 string >\0 name: "%s" +>0x36 string >\0 author: "%s" +>0x56 string >\0 copyright: "%s" + +0 string RSID RSID sidtune PlaySID compatible +>4 beshort >0 w/ header v%d, +>14 beshort =1 single song, +>14 beshort >1 %d songs, +>16 beshort >0 default song: %d +>0x16 string >\0 name: "%s" +>0x36 string >\0 author: "%s" +>0x56 string >\0 copyright: "%s" + +# IRCAM +# VAX and MIPS files are little-endian; Sun and NeXT are big-endian +0 belong 0x64a30100 IRCAM file (VAX) +0 belong 0x64a30200 IRCAM file (Sun) +0 belong 0x64a30300 IRCAM file (MIPS little-endian) +0 belong 0x64a30400 IRCAM file (NeXT) + +# NIST SPHERE +0 string NIST_1A\n\ \ \ 1024\n NIST SPHERE file + +# Sample Vision +0 string SOUND\ SAMPLE\ DATA\ Sample Vision file + +# Audio Visual Research +0 string 2BIT Audio Visual Research file, +>12 beshort =0 mono, +>12 beshort =-1 stereo, +>14 beshort x %d bits +>16 beshort =0 unsigned, +>16 beshort =-1 signed, +>22 belong&0x00ffffff x %d Hz, +>18 beshort =0 no loop, +>18 beshort =-1 loop, +>21 ubyte <=127 note %d, +>22 byte =0 replay 5.485 KHz +>22 byte =1 replay 8.084 KHz +>22 byte =2 replay 10.971 Khz +>22 byte =3 replay 16.168 Khz +>22 byte =4 replay 21.942 KHz +>22 byte =5 replay 32.336 KHz +>22 byte =6 replay 43.885 KHz +>22 byte =7 replay 47.261 KHz + +# SGI SoundTrack +0 string _SGI_SoundTrack SGI SoundTrack project file +# ID3 version 2 tags +0 string ID3 Audio file with ID3 version 2 +>3 ubyte <0xff \b%d. +>4 ubyte <0xff \b%d tag +>2584 string fLaC \b, FLAC encoding +>>2588 byte&0x7f >0 \b, unknown version +>>2588 byte&0x7f 0 \b +# some common bits/sample values +>>>2600 beshort&0x1f0 0x030 \b, 4 bit +>>>2600 beshort&0x1f0 0x050 \b, 6 bit +>>>2600 beshort&0x1f0 0x070 \b, 8 bit +>>>2600 beshort&0x1f0 0x0b0 \b, 12 bit +>>>2600 beshort&0x1f0 0x0f0 \b, 16 bit +>>>2600 beshort&0x1f0 0x170 \b, 24 bit +>>>2600 byte&0xe 0x0 \b, mono +>>>2600 byte&0xe 0x2 \b, stereo +>>>2600 byte&0xe 0x4 \b, 3 channels +>>>2600 byte&0xe 0x6 \b, 4 channels +>>>2600 byte&0xe 0x8 \b, 5 channels +>>>2600 byte&0xe 0xa \b, 6 channels +>>>2600 byte&0xe 0xc \b, 7 channels +>>>2600 byte&0xe 0xe \b, 8 channels +# some common sample rates +>>>2597 belong&0xfffff0 0x0ac440 \b, 44.1 kHz +>>>2597 belong&0xfffff0 0x0bb800 \b, 48 kHz +>>>2597 belong&0xfffff0 0x07d000 \b, 32 kHz +>>>2597 belong&0xfffff0 0x056220 \b, 22.05 kHz +>>>2597 belong&0xfffff0 0x05dc00 \b, 24 kHz +>>>2597 belong&0xfffff0 0x03e800 \b, 16 kHz +>>>2597 belong&0xfffff0 0x02b110 \b, 11.025 kHz +>>>2597 belong&0xfffff0 0x02ee00 \b, 12 kHz +>>>2597 belong&0xfffff0 0x01f400 \b, 8 kHz +>>>2597 belong&0xfffff0 0x177000 \b, 96 kHz +>>>2597 belong&0xfffff0 0x0fa000 \b, 64 kHz +>>>2601 byte&0xf >0 \b, >4G samples +>2584 string !fLaC \b, MP3 encoding + +# NSF (NES sound file) magic +0 string NESM\x1a NES Sound File +>14 string >\0 ("%s" by +>46 string >\0 %s, copyright +>78 string >\0 %s), +>5 byte x version %d, +>6 byte x %d tracks, +>122 byte&0x2 =1 dual PAL/NTSC +>122 byte&0x1 =1 PAL +>122 byte&0x1 =0 NTSC + +# Impulse tracker module (audio/x-it) +0 string IMPM Impulse Tracker module sound data - +>4 string >\0 "%s" +>40 leshort !0 compatible w/ITv%x +>42 leshort !0 created w/ITv%x + +# Imago Orpheus module (audio/x-imf) +60 string IM10 Imago Orpheus module sound data - +>0 string >\0 "%s" + +# From +# These are the /etc/magic entries to decode modules, instruments, and +# samples in Impulse Tracker's native format. + +0 string IMPS Impulse Tracker Sample +>18 byte &2 16 bit +>18 byte ^2 8 bit +>18 byte &4 stereo +>18 byte ^4 mono +0 string IMPI Impulse Tracker Instrument +>28 leshort !0 ITv%x +>30 byte !0 %d samples + +# Yamaha TX Wave: file(1) magic for Yamaha TX Wave audio files +# From +0 string LM8953 Yamaha TX Wave +>22 byte 0x49 looped +>22 byte 0xC9 non-looped +>23 byte 1 33kHz +>23 byte 2 50kHz +>23 byte 3 16kHz + +# scream tracker: file(1) magic for Scream Tracker sample files +# +# From +76 string SCRS Scream Tracker Sample +>0 byte 1 sample +>0 byte 2 adlib melody +>0 byte >2 adlib drum +>31 byte &2 stereo +>31 byte ^2 mono +>31 byte &4 16bit little endian +>31 byte ^4 8bit +>30 byte 0 unpacked +>30 byte 1 packed + +# audio +# From: Cory Dikkers +0 string MMD0 MED music file, version 0 +0 string MMD1 OctaMED Pro music file, version 1 +0 string MMD3 OctaMED Soundstudio music file, version 3 +0 string OctaMEDCmpr OctaMED Soundstudio compressed file +0 string MED MED_Song +0 string SymM Symphonie SymMOD music file +# +0 string THX AHX version +>3 byte =0 1 module data +>3 byte =1 2 module data +# +0 string OKTASONG Oktalyzer module data +# +0 string DIGI\ Booster\ module\0 %s +>20 byte >0 %c +>>21 byte >0 \b%c +>>>22 byte >0 \b%c +>>>>23 byte >0 \b%c +>610 string >\0 \b, "%s" +# +0 string DBM0 DIGI Booster Pro Module +>4 byte >0 V%X. +>>5 byte x \b%02X +>16 string >\0 \b, "%s" +# +0 string FTMN FaceTheMusic module +>16 string >\0d \b, "%s" + +# From: 2003-06-24 +0 string AMShdr\32 Velvet Studio AMS Module v2.2 +0 string Extreme Extreme Tracker AMS Module v1.3 +0 string DDMF Xtracker DMF Module +>4 byte x v%i +>0xD string >\0 Title: "%s" +>0x2B string >\0 Composer: "%s" +0 string DSM\32 Dynamic Studio Module DSM +0 string SONG DigiTrekker DTM Module +0 string DMDL DigiTrakker MDL Module +0 string PSM\32 Protracker Studio PSM Module +44 string PTMF Poly Tracker PTM Module +>0 string >\32 Title: "%s" +0 string MT20 MadTracker 2.0 Module MT2 +0 string RAD\40by\40REALiTY!! RAD Adlib Tracker Module RAD +0 string RTMM RTM Module +0x426 string MaDoKaN96 XMS Adlib Module +>0 string >\0 Composer: "%s" +0 string AMF AMF Module +>4 string >\0 Title: "%s" +0 string MODINFO1 Open Cubic Player Module Inforation MDZ +0 string Extended\40Instrument: Fast Tracker II Instrument + +# From: Takeshi Hamasaki +# NOA Nancy Codec file +0 string \210NOA\015\012\032 NOA Nancy Codec Movie file +# Yamaha SMAF format +0 string MMMD Yamaha SMAF file +# Sharp Jisaku Melody format for PDC +0 string \001Sharp\040JisakuMelody SHARP Cell-Phone ringing Melody +>20 string Ver01.00 Ver. 1.00 +>>32 byte x , %d tracks + +# Free lossless audio codec +# From: Przemyslaw Augustyniak +0 string fLaC FLAC audio bitstream data +>4 byte&0x7f >0 \b, unknown version +>4 byte&0x7f 0 \b +# some common bits/sample values +>>20 beshort&0x1f0 0x030 \b, 4 bit +>>20 beshort&0x1f0 0x050 \b, 6 bit +>>20 beshort&0x1f0 0x070 \b, 8 bit +>>20 beshort&0x1f0 0x0b0 \b, 12 bit +>>20 beshort&0x1f0 0x0f0 \b, 16 bit +>>20 beshort&0x1f0 0x170 \b, 24 bit +>>20 byte&0xe 0x0 \b, mono +>>20 byte&0xe 0x2 \b, stereo +>>20 byte&0xe 0x4 \b, 3 channels +>>20 byte&0xe 0x6 \b, 4 channels +>>20 byte&0xe 0x8 \b, 5 channels +>>20 byte&0xe 0xa \b, 6 channels +>>20 byte&0xe 0xc \b, 7 channels +>>20 byte&0xe 0xe \b, 8 channels +# some common sample rates +>>17 belong&0xfffff0 0x0ac440 \b, 44.1 kHz +>>17 belong&0xfffff0 0x0bb800 \b, 48 kHz +>>17 belong&0xfffff0 0x07d000 \b, 32 kHz +>>17 belong&0xfffff0 0x056220 \b, 22.05 kHz +>>17 belong&0xfffff0 0x05dc00 \b, 24 kHz +>>17 belong&0xfffff0 0x03e800 \b, 16 kHz +>>17 belong&0xfffff0 0x02b110 \b, 11.025 kHz +>>17 belong&0xfffff0 0x02ee00 \b, 12 kHz +>>17 belong&0xfffff0 0x01f400 \b, 8 kHz +>>17 belong&0xfffff0 0x177000 \b, 96 kHz +>>17 belong&0xfffff0 0x0fa000 \b, 64 kHz +>>21 byte&0xf >0 \b, >4G samples +>>21 byte&0xf 0 \b +>>>22 belong >0 \b, %u samples +>>>22 belong 0 \b, length unknown + +# (ISDN) VBOX voice message file (Wolfram Kleff) +0 string VBOX VBOX voice message data + +# ReBorn Song Files (.rbs) +# David J. Singer +8 string RB40 RBS Song file +>29 string ReBorn created by ReBorn +>37 string Propellerhead created by ReBirth + +# Synthesizer Generator and Kimwitu share their file format +0 string A#S#C#S#S#L#V#3 Synthesizer Generator or Kimwitu data +# Kimwitu++ uses a slightly different magic +0 string A#S#C#S#S#L#HUB Kimwitu++ data + +# From "Simon Hosie +0 string TFMX-SONG TFMX module sound data + +# Monkey's Audio compressed audio format (.ape) +# From danny.milo@gmx.net (Danny Milosavljevic) +# New version from Abel Cheung +0 string MAC\040 Monkey's Audio compressed format +>4 uleshort >0x0F8B version %d +>>(0x08.l) uleshort =1000 with fast compression +>>(0x08.l) uleshort =2000 with normal compression +>>(0x08.l) uleshort =3000 with high compression +>>(0x08.l) uleshort =4000 with extra high compression +>>(0x08.l) uleshort =5000 with insane compression +>>(0x08.l+18) uleshort =1 \b, mono +>>(0x08.l+18) uleshort =2 \b, stereo +>>(0x08.l+20) ulelong x \b, sample rate %d +>4 uleshort <0x0F8C version %d +>>6 uleshort =1000 with fast compression +>>6 uleshort =2000 with normal compression +>>6 uleshort =3000 with high compression +>>6 uleshort =4000 with extra high compression +>>6 uleshort =5000 with insane compression +>>10 uleshort =1 \b, mono +>>10 uleshort =2 \b, stereo +>>12 ulelong x \b, sample rate %d + +# adlib sound files +# From Gürkan Sengün , http://www.linuks.mine.nu +0 string RAWADATA RdosPlay RAW + +1068 string RoR AMUSIC Adlib Tracker + +0 string JCH EdLib + +0 string mpu401tr MPU-401 Trakker + +0 string SAdT Surprise! Adlib Tracker +>4 byte x Version %d + +0 string XAD! eXotic ADlib + +0 string ofTAZ! eXtra Simple Music + +# Spectrum 128 tunes (.ay files). +# From: Emanuel Haupt +0 string ZXAYEMUL Spectrum 128 tune + +0 string \0BONK BONK, +#>5 byte x version %d +>14 byte x %d channel(s), +>15 byte =1 lossless, +>15 byte =0 lossy, +>16 byte x mid-side + +384 string LockStream LockStream Embedded file (mostly MP3 on old Nokia phones) + +# format VQF (proprietary codec for sound) +# some infos on the header file available at : +# http://www.twinvq.org/english/technology_format.html +0 string TWIN97012000 VQF data +>27 short 0 \b, Mono +>27 short 1 \b, Stereo +>31 short >0 \b, %d kbit/s +>35 short >0 \b, %d kHz + +# Nelson A. de Oliveira (naoliv@gmail.com) +# .eqf +0 string Winamp\ EQ\ library\ file %s +# it will match only versions like v. +# Since I saw only eqf files with version v1.1 I think that it's OK +>23 string x \b%.4s +# .preset +0 string [Equalizer\ preset] XMMS equalizer preset +# .m3u +0 string #EXTM3U M3U playlist +# .pls +0 string [playlist] PLS playlist +# licq.conf +1 string [licq] LICQ configuration file + +# Atari ST audio files by Dirk Jagdmann +0 string ICE! SNDH Atari ST music +0 string SC68\ Music-file\ /\ (c)\ (BeN)jami sc68 Atari ST music + +# musepak support From: "Jiri Pejchal" +0 string MP+ Musepack audio +>3 byte 255 \b, SV pre8 +>3 byte&0xF 0x6 \b, SV 6 +>3 byte&0xF 0x8 \b, SV 8 +>3 byte&0xF 0x7 \b, SV 7 +>>3 byte&0xF0 0x0 \b.0 +>>3 byte&0xF0 0x10 \b.1 +>>3 byte&0xF0 240 \b.15 +>>10 byte&0xF0 0x0 \b, no profile +>>10 byte&0xF0 0x10 \b, profile 'Unstable/Experimental' +>>10 byte&0xF0 0x50 \b, quality 0 +>>10 byte&0xF0 0x60 \b, quality 1 +>>10 byte&0xF0 0x70 \b, quality 2 (Telephone) +>>10 byte&0xF0 0x80 \b, quality 3 (Thumb) +>>10 byte&0xF0 0x90 \b, quality 4 (Radio) +>>10 byte&0xF0 0xA0 \b, quality 5 (Standard) +>>10 byte&0xF0 0xB0 \b, quality 6 (Xtreme) +>>10 byte&0xF0 0xC0 \b, quality 7 (Insane) +>>10 byte&0xF0 0xD0 \b, quality 8 (BrainDead) +>>10 byte&0xF0 0xE0 \b, quality 9 +>>10 byte&0xF0 0xF0 \b, quality 10 +>>27 byte 0x0 \b, Buschmann 1.7.0-9, Klemm 0.90-1.05 +>>27 byte 102 \b, Beta 1.02 +>>27 byte 104 \b, Beta 1.04 +>>27 byte 105 \b, Alpha 1.05 +>>27 byte 106 \b, Beta 1.06 +>>27 byte 110 \b, Release 1.1 +>>27 byte 111 \b, Alpha 1.11 +>>27 byte 112 \b, Beta 1.12 +>>27 byte 113 \b, Alpha 1.13 +>>27 byte 114 \b, Beta 1.14 +>>27 byte 115 \b, Alpha 1.15 + +# IMY +# from http://filext.com/detaillist.php?extdetail=IMY +# http://cellphones.about.com/od/cellularfaqs/f/rf_imelody.htm +# http://download.ncl.ie/doc/api/ie/ncl/media/music/IMelody.html +# http://www.wx800.com/msg/download/irda/iMelody.pdf +0 string BEGIN:IMELODY iMelody Ringtone Format + +# From: Matthew Flaschen +0 string #EXTM3U M3U playlist text + +#---------------------------------------------------------------- +# basis: file(1) magic for BBx/Pro5-files +# Oliver Dammer 2005/11/07 +# http://www.basis.com business-basic-files. +# +0 string \074\074bbx\076\076 BBx +>7 string \000 indexed file +>7 string \001 serial file +>7 string \002 keyed file +>>13 short 0 (sort) +>7 string \004 program +>>18 byte x (LEVEL %d) +>>>23 string >\000 psaved +>7 string \006 mkeyed file +>>13 short 0 (sort) +>>8 string \000 (mkey) +#------------------------------------------------------------------------------ +# bFLT: file(1) magic for BFLT uclinux binary files +# +# From Philippe De Muyter +# +0 string bFLT BFLT executable +>4 belong x - version %ld +>4 belong 4 +>>36 belong&0x1 0x1 ram +>>36 belong&0x2 0x2 gotpic +>>36 belong&0x4 0x4 gzip +>>36 belong&0x8 0x8 gzdata +#------------------------------------------------------------------------------ +# blender: file(1) magic for Blender 3D data files +# +# Coded by Guillermo S. Romero using the +# data from Ton Roosendaal . Ton or his company do not +# support the rule, so mail GSR if problems with it. Rule version: 1.1. +# You can get latest version with comments and details about the format +# at http://acd.asoc.euitt.upm.es/~gsromero/3d/blender/magic.blender + +0 string =BLENDER Blender3D, +>7 string =_ saved as 32-bits +>7 string =- saved as 64-bits +>8 string =v little endian +>8 string =V big endian +>9 byte x with version %c. +>10 byte x \b%c +>11 byte x \b%c + +#------------------------------------------------------------------------------ +# blit: file(1) magic for 68K Blit stuff as seen from 680x0 machine +# +# Note that this 0407 conflicts with several other a.out formats... +# +# XXX - should this be redone with "be" and "le", so that it works on +# little-endian machines as well? If so, what's the deal with +# "VAX-order" and "VAX-order2"? +# +#0 long 0407 68K Blit (standalone) executable +#0 short 0407 VAX-order2 68K Blit (standalone) executable +0 short 03401 VAX-order 68K Blit (standalone) executable +0 long 0406 68k Blit mpx/mux executable +0 short 0406 VAX-order2 68k Blit mpx/mux executable +0 short 03001 VAX-order 68k Blit mpx/mux executable +# Need more values for WE32 DMD executables. +# Note that 0520 is the same as COFF +#0 short 0520 tty630 layers executable +# +# i80960 b.out objects and archives +# +0 long 0x10d i960 b.out relocatable object +>16 long >0 not stripped +# +# b.out archive (hp-rt on i960) +0 string =! b.out archive +>8 string __.SYMDEF random library +#------------------------------------------------------------------------------ +# bsdi: file(1) magic for BSD/OS (from BSDI) objects +# + +0 lelong 0314 386 compact demand paged pure executable +>16 lelong >0 not stripped +>32 byte 0x6a (uses shared libs) + +0 lelong 0407 386 executable +>16 lelong >0 not stripped +>32 byte 0x6a (uses shared libs) + +0 lelong 0410 386 pure executable +>16 lelong >0 not stripped +>32 byte 0x6a (uses shared libs) + +0 lelong 0413 386 demand paged pure executable +>16 lelong >0 not stripped +>32 byte 0x6a (uses shared libs) + +# same as in SunOS 4.x, except for static shared libraries +0 belong&077777777 0600413 sparc demand paged +>0 byte &0x80 +>>20 belong <4096 shared library +>>20 belong =4096 dynamically linked executable +>>20 belong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +>36 belong 0xb4100001 (uses shared libs) + +0 belong&077777777 0600410 sparc pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +>36 belong 0xb4100001 (uses shared libs) + +0 belong&077777777 0600407 sparc +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +>36 belong 0xb4100001 (uses shared libs) +#------------------------------------------------------------------------------ +# BTSnoop: file(1) magic for BTSnoop files +# +# From +0 string btsnoop\0 BTSnoop +>8 belong x version %d, +>12 belong 1001 Unencapsulated HCI +>12 belong 1002 HCI UART (H4) +>12 belong 1003 HCI BCSP +>12 belong 1004 HCI Serial (H5) +>>12 belong x type %d + +#------------------------------------------------------------------------------ +# autocad: file(1) magic for cad files +# + +# AutoCAD DWG versions R13/R14 (www.autodesk.com) +# Written December 01, 2003 by Lester Hightower +# Based on the DWG File Format Specifications at http://www.opendwg.org/ +0 string \101\103\061\060\061 AutoCAD +>5 string \062\000\000\000\000 DWG ver. R13 +>5 string \064\000\000\000\000 DWG ver. R14 + +# Microstation DGN/CIT Files (www.bentley.com) +# Last updated July 29, 2005 by Lester Hightower +# DGN is the default file extension of Microstation/Intergraph CAD files. +# CIT is the proprietary raster format (similar to TIFF) used to attach +# raster underlays to Microstation DGN (vector) drawings. +# +# http://www.wotsit.org/search.asp +# http://filext.com/detaillist.php?extdetail=DGN +# http://filext.com/detaillist.php?extdetail=CIT +# +# http://www.bentley.com/products/default.cfm?objectid=97F351F5-9C35-4E5E-89C2 +# 3F86C928&method=display&p_objectid=97F351F5-9C35-4E5E-89C280A93F86C928 +# http://www.bentley.com/products/default.cfm?objectid=A5C2FD43-3AC9-4C71-B682 +# 721C479F&method=display&p_objectid=A5C2FD43-3AC9-4C71-B682C7BE721C479F +0 string \010\011\376 Microstation +>3 string \002 +>>30 string \026\105 DGNFile +>>30 string \034\105 DGNFile +>>30 string \073\107 DGNFile +>>30 string \073\110 DGNFile +>>30 string \106\107 DGNFile +>>30 string \110\103 DGNFile +>>30 string \120\104 DGNFile +>>30 string \172\104 DGNFile +>>30 string \172\105 DGNFile +>>30 string \172\106 DGNFile +>>30 string \234\106 DGNFile +>>30 string \273\105 DGNFile +>>30 string \306\106 DGNFile +>>30 string \310\104 DGNFile +>>30 string \341\104 DGNFile +>>30 string \372\103 DGNFile +>>30 string \372\104 DGNFile +>>30 string \372\106 DGNFile +>>30 string \376\103 DGNFile +>4 string \030\000\000 CITFile +>4 string \030\000\003 CITFile + +# AutoCad, from Nahuel Greco +# AutoCAD DWG versions R12/R13/R14 (www.autodesk.com) +0 string AC1012 AutoCad (release 12) +0 string AC1013 AutoCad (release 13) +0 string AC1014 AutoCad (release 14) + +# CAD: file(1) magic for computer aided design files +# Phillip Griffith +# AutoCAD magic taken from the Open Design Alliance's OpenDWG specifications. +# +0 belong 0x08051700 Bentley/Intergraph MicroStation DGN cell library +0 belong 0x0809fe02 Bentley/Intergraph MicroStation DGN vector CAD +0 belong 0xc809fe02 Bentley/Intergraph MicroStation DGN vector CAD +0 beshort 0x0809 Bentley/Intergraph MicroStation +>0x02 byte 0xfe +>>0x04 beshort 0x1800 CIT raster CAD +0 string AC1012 AutoDesk AutoCAD R13 +0 string AC1014 AutoDesk AutoCAD R14 +0 string AC1015 AutoDesk AutoCAD R2000 +#------------------------------------------------------------------------------ +# Cafe Babes unite! +# +# Since Java bytecode and Mach-O fat-files have the same magic number, the test +# must be performed in the same "magic" sequence to get both right. The long +# at offset 4 in a mach-O fat file tells the number of architectures; the short at +# offset 4 in a Java bytecode file is the JVM minor version and the +# short at offset 6 is the JVM major version. Since there are only +# only 18 labeled Mach-O architectures at current, and the first released +# Java class format was version 43.0, we can safely choose any number +# between 18 and 39 to test the number of architectures against +# (and use as a hack). Let's not use 18, because the Mach-O people +# might add another one or two as time goes by... +# +0 belong 0xcafebabe +>4 belong >30 compiled Java class data, +>>6 beshort x version %d. +>>4 beshort x \b%d +>4 belong 1 Mach-O fat file with 1 architecture +>4 belong >1 +>>4 belong <20 Mach-O fat file with %ld architectures + +#------------------------------------------------------------------------------ +# c-lang: file(1) magic for C programs (or REXX) +# + +# XPM icons (Greg Roelofs, newt@uchicago.edu) +# if you uncomment "/*" for C/REXX below, also uncomment this entry +#0 string /*\ XPM\ */ X pixmap image data + +# this first will upset you if you're a PL/1 shop... +# in which case rm it; ascmagic will catch real C programs +#0 string /* C or REXX program text +#0 string // C++ program text + +# From: Mikhail Teterin +0 string cscope cscope reference data +>7 string x version %.2s +# We skip the path here, because it is often long (so file will +# truncate it) and mostly redundant. +# The inverted index functionality was added some time betwen +# versions 11 and 15, so look for -q if version is above 14: +>7 string >14 +>>10 regex .+\ -q\ with inverted index +>10 regex .+\ -c\ text (non-compressed) + +#------------------------------------------------------------------------------ +# c64: file(1) magic for various commodore 64 related files +# +# From: Dirk Jagdmann + +0x16500 belong 0x12014100 D64 Image +0x16500 belong 0x12014180 D71 Image +0x61800 belong 0x28034400 D81 Image +0 string C64\40CARTRIDGE CCS C64 Emultar Cartridge Image +0 belong 0x43154164 X64 Image + +0 string GCR-1541 GCR Image +>8 byte x version: %i +>9 byte x tracks: %i + +9 string PSUR ARC archive (c64) +2 string -LH1- LHA archive (c64) + +0 string C64File PC64 Emulator file +>8 string >\0 "%s" +0 string C64Image PC64 Freezer Image + +0 beshort 0x38CD C64 PCLink Image +0 string CBM\144\0\0 Power 64 C64 Emulator Snapshot + +0 belong 0xFF424CFF WRAptor packer (c64) + +0 string C64S\x20tape\x20file T64 tape Image +>32 leshort x Version:0x%x +>36 leshort !0 Entries:%i +>40 string x Name:%.24s + +0 string C64\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0 T64 tape Image +>32 leshort x Version:0x%x +>36 leshort !0 Entries:%i +>40 string x Name:%.24s + +0 string C64S\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0 T64 tape Image +>32 leshort x Version:0x%x +>36 leshort !0 Entries:%i +>40 string x Name:%.24s + +#------------------------------------------------------------------------------ +# CDDB: file(1) magic for CDDB(tm) format CD text data files +# +# From +# +# This is the /etc/magic entry to decode datafiles as used by +# CDDB-enabled CD player applications. +# + +0 string/b #\040xmcd CDDB(tm) format CD text data + +#------------------------------------------------------------------------------ +# chord: file(1) magic for Chord music sheet typesetting utility input files +# +# From Philippe De Muyter +# File format is actually free, but many distributed files begin with `{title' +# +0 string {title Chord text file + +#------------------------------------------------------------------------------ +# cisco: file(1) magic for cisco Systems routers +# +# Most cisco file-formats are covered by the generic elf code +# +# Microcode files are non-ELF, 0x8501 conflicts with NetBSD/alpha. +0 belong&0xffffff00 0x85011400 cisco IOS microcode +>7 string >\0 for '%s' +0 belong&0xffffff00 0x8501cb00 cisco IOS experimental microcode +>7 string >\0 for '%s' +#------------------------------------------------------------------------------ +# citrus locale declaration +# + +0 string RuneCT Citrus locale declaration for LC_CTYPE + + +#------------------------------------------------------------------------------ +# claris: file(1) magic for claris +# "H. Nanosecond" +# Claris Works a word processor, etc. +# Version 3.0 + +# .pct claris works clip art files +#0000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 +#* +#0001000 #010 250 377 377 377 377 000 213 000 230 000 021 002 377 014 000 +#null to byte 1000 octal +514 string \377\377\377\377\000 Claris clip art? +>0 string \0\0\0\0\0\0\0\0\0\0\0\0\0 yes. +514 string \377\377\377\377\001 Claris clip art? +>0 string \0\0\0\0\0\0\0\0\0\0\0\0\0 yes. + +# Claris works files +# .cwk +0 string \002\000\210\003\102\117\102\117\000\001\206 Claris works document +# .plt +0 string \020\341\000\000\010\010 Claris Works pallete files .plt + +# .msp a dictionary file I am not sure about this I have only one .msp file +0 string \002\271\262\000\040\002\000\164 Claris works dictionary + +# .usp are user dictionary bits +# I am not sure about a magic header: +#0000000 001 123 160 146 070 125 104 040 136 123 015 012 160 157 144 151 +# soh S p f 8 U D sp ^ S cr nl p o d i +#0000020 141 164 162 151 163 164 040 136 123 015 012 144 151 166 040 043 +# a t r i s t sp ^ S cr nl d i v sp # + +# .mth Thesaurus +# starts with \0 but no magic header + +# .chy Hyphenation file +# I am not sure: 000 210 034 000 000 + +# other claris files +#./windows/claris/useng.ndx: data +#./windows/claris/xtndtran.l32: data +#./windows/claris/xtndtran.lst: data +#./windows/claris/clworks.lbl: data +#./windows/claris/clworks.prf: data +#./windows/claris/userd.spl: data + +#------------------------------------------------------------------------------ +# clipper: file(1) magic for Intergraph (formerly Fairchild) Clipper. +# +# XXX - what byte order does the Clipper use? +# +# XXX - what's the "!" stuff: +# +# >18 short !074000,000000 C1 R1 +# >18 short !074000,004000 C2 R1 +# >18 short !074000,010000 C3 R1 +# >18 short !074000,074000 TEST +# +# I shall assume it's ANDing the field with the first value and +# comparing it with the second, and rewrite it as: +# +# >18 short&074000 000000 C1 R1 +# >18 short&074000 004000 C2 R1 +# >18 short&074000 010000 C3 R1 +# >18 short&074000 074000 TEST +# +# as SVR3.1's "file" doesn't support anything of the "!074000,000000" +# sort, nor does SunOS 4.x, so either it's something Intergraph added +# in CLIX, or something AT&T added in SVR3.2 or later, or something +# somebody else thought was a good idea; it's not documented in the +# man page for this version of "magic", nor does it appear to be +# implemented (at least not after I blew off the bogus code to turn +# old-style "&"s into new-style "&"s, which just didn't work at all). +# +0 short 0575 CLIPPER COFF executable (VAX #) +>20 short 0407 (impure) +>20 short 0410 (5.2 compatible) +>20 short 0411 (pure) +>20 short 0413 (demand paged) +>20 short 0443 (target shared library) +>12 long >0 not stripped +>22 short >0 - version %ld +0 short 0577 CLIPPER COFF executable +>18 short&074000 000000 C1 R1 +>18 short&074000 004000 C2 R1 +>18 short&074000 010000 C3 R1 +>18 short&074000 074000 TEST +>20 short 0407 (impure) +>20 short 0410 (pure) +>20 short 0411 (separate I&D) +>20 short 0413 (paged) +>20 short 0443 (target shared library) +>12 long >0 not stripped +>22 short >0 - version %ld +>48 long&01 01 alignment trap enabled +>52 byte 1 -Ctnc +>52 byte 2 -Ctsw +>52 byte 3 -Ctpw +>52 byte 4 -Ctcb +>53 byte 1 -Cdnc +>53 byte 2 -Cdsw +>53 byte 3 -Cdpw +>53 byte 4 -Cdcb +>54 byte 1 -Csnc +>54 byte 2 -Cssw +>54 byte 3 -Cspw +>54 byte 4 -Cscb +4 string pipe CLIPPER instruction trace +4 string prof CLIPPER instruction profile + +#------------------------------------------------------------------------------ +# cracklib: file (1) magic for cracklib v2.7 + +0 lelong 0x70775631 Cracklib password index, little endian +>4 long >0 (%i words) +>4 long 0 ("64-bit") +>>8 long >-1 (%i words) +0 belong 0x70775631 Cracklib password index, big endian +>4 belong >-1 (%i words) +# really bellong 0x0000000070775631 +4 belong 0x70775631 Cracklib password index, big endian ("64-bit") +>12 belong >0 (%i words) + +#------------------------------------------------------------------------------ +# spec: file(1) magic for SPEC raw results (*.raw, *.rsf) +# +# Cloyce D. Spradling + +0 string spec SPEC +>4 string .cpu CPU +>>8 string <: \b%.4s +>>12 string . raw result text + +17 string version=SPECjbb SPECjbb +>32 string <: \b%.4s +>>37 string <: v%.4s raw result text + +0 string BEGIN\040SPECWEB SPECweb +>13 string <: \b%.2s +>>15 string _SSL \b_SSL +>>>20 string <: v%.4s raw result text +>>16 string <: v%.4s raw result text + +#------------------------------------------------------------------------------ +# commands: file(1) magic for various shells and interpreters +# +0 string : shell archive or script for antique kernel text +0 string/b #!\ /bin/sh Bourne shell script text executable +0 string/b #!\ /bin/csh C shell script text executable +# korn shell magic, sent by George Wu, gwu@clyde.att.com +0 string/b #!\ /bin/ksh Korn shell script text executable +0 string/b #!\ /bin/tcsh Tenex C shell script text executable +0 string/b #!\ /usr/local/tcsh Tenex C shell script text executable +0 string/b #!\ /usr/local/bin/tcsh Tenex C shell script text executable + +# +# zsh/ash/ae/nawk/gawk magic from cameron@cs.unsw.oz.au (Cameron Simpson) +0 string/b #!\ /bin/zsh Paul Falstad's zsh script text executable +0 string/b #!\ /usr/bin/zsh Paul Falstad's zsh script text executable +0 string/b #!\ /usr/local/bin/zsh Paul Falstad's zsh script text executable +0 string/b #!\ /usr/local/bin/ash Neil Brown's ash script text executable +0 string/b #!\ /usr/local/bin/ae Neil Brown's ae script text executable +0 string/b #!\ /bin/nawk new awk script text executable +0 string/b #!\ /usr/bin/nawk new awk script text executable +0 string/b #!\ /usr/local/bin/nawk new awk script text executable +0 string/b #!\ /bin/gawk GNU awk script text executable +0 string/b #!\ /usr/bin/gawk GNU awk script text executable +0 string/b #!\ /usr/local/bin/gawk GNU awk script text executable +# +0 string/b #!\ /bin/awk awk script text executable +0 string/b #!\ /usr/bin/awk awk script text executable +# update to distinguish from *.vcf files +0 regex BEGIN[[:space:]]*[{] awk script text + +# AT&T Bell Labs' Plan 9 shell +0 string/b #!\ /bin/rc Plan 9 rc shell script text executable + +# bash shell magic, from Peter Tobias (tobias@server.et-inf.fho-emden.de) +0 string/b #!\ /bin/bash Bourne-Again shell script text executable +0 string/b #!\ /usr/local/bin/bash Bourne-Again shell script text executable + +# using env +0 string #!/usr/bin/env a +>15 string >\0 %s script text executable +0 string #!\ /usr/bin/env a +>16 string >\0 %s script text executable + +# PHP scripts +# Ulf Harnhammar +0 string/c =. +0 string $Suite TTCN Abstract Test Suite +>&1 string $SuiteId +>>&1 string >\n %s +>&2 string $SuiteId +>>&1 string >\n %s +>&3 string $SuiteId +>>&1 string >\n %s + +# MSC (message sequence charts) are a formal description technique, +# described in ITU-T Z.120, mainly used for communication protocols. +# Added by W. Borgert . +0 string mscdocument Message Sequence Chart (document) +0 string msc Message Sequence Chart (chart) +0 string submsc Message Sequence Chart (subchart) + +#------------------------------------------------------------------------------ +# compress: file(1) magic for pure-compression formats (no archives) +# +# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc. +# +# Formats for various forms of compressed data +# Formats for "compress" proper have been moved into "compress.c", +# because it tries to uncompress it to figure out what's inside. + +# standard unix compress +0 string \037\235 compress'd data +>2 byte&0x80 >0 block compressed +>2 byte&0x1f x %d bits + +# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver) +# Edited by Chris Chittleborough , March 2002 +# * Original filename is only at offset 10 if "extra field" absent +# * Produce shorter output - notably, only report compression methods +# other than 8 ("deflate", the only method defined in RFC 1952). +0 string \037\213 gzip compressed data +>2 byte <8 \b, reserved method +>2 byte >8 \b, unknown method +>3 byte &0x01 \b, ASCII +>3 byte &0x02 \b, has CRC +>3 byte &0x04 \b, extra field +>3 byte&0xC =0x08 +>>10 string x \b, was "%s" +>3 byte &0x10 \b, has comment +>9 byte =0x00 \b, from FAT filesystem (MS-DOS, OS/2, NT) +>9 byte =0x01 \b, from Amiga +>9 byte =0x02 \b, from VMS +>9 byte =0x03 \b, from Unix +>9 byte =0x04 \b, from VM/CMS +>9 byte =0x05 \b, from Atari +>9 byte =0x06 \b, from HPFS filesystem (OS/2, NT) +>9 byte =0x07 \b, from MacOS +>9 byte =0x08 \b, from Z-System +>9 byte =0x09 \b, from CP/M +>9 byte =0x0A \b, from TOPS/20 +>9 byte =0x0B \b, from NTFS filesystem (NT) +>9 byte =0x0C \b, from QDOS +>9 byte =0x0D \b, from Acorn RISCOS +>3 byte &0x10 \b, comment +>3 byte &0x20 \b, encrypted +>4 ledate >0 \b, last modified: %s +>8 byte 2 \b, max compression +>8 byte 4 \b, max speed + +# packed data, Huffman (minimum redundancy) codes on a byte-by-byte basis +0 string \037\036 packed data +>2 belong >1 \b, %d characters originally +>2 belong =1 \b, %d character originally +# +# This magic number is byte-order-independent. +0 short 0x1f1f old packed data + +# XXX - why *two* entries for "compacted data", one of which is +# byte-order independent, and one of which is byte-order dependent? +# +0 short 0x1fff compacted data +# This string is valid for SunOS (BE) and a matching "short" is listed +# in the Ultrix (LE) magic file. +0 string \377\037 compacted data +0 short 0145405 huf output + +# bzip2 +0 string BZh bzip2 compressed data +>3 byte >47 \b, block size = %c00k + +# squeeze and crunch +# Michael Haardt +0 beshort 0x76FF squeezed data, +>4 string x original name %s +0 beshort 0x76FE crunched data, +>2 string x original name %s +0 beshort 0x76FD LZH compressed data, +>2 string x original name %s + +# Freeze +0 string \037\237 frozen file 2.1 +0 string \037\236 frozen file 1.0 (or gzip 0.5) + +# SCO compress -H (LZH) +0 string \037\240 SCO compress -H (LZH) data + +# European GSM 06.10 is a provisional standard for full-rate speech +# transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse +# excitation/long term prediction) coding at 13 kbit/s. +# +# There's only a magic nibble (4 bits); that nibble repeats every 33 +# bytes. This isn't suited for use, but maybe we can use it someday. +# +# This will cause very short GSM files to be declared as data and +# mismatches to be declared as data too! +#0 byte&0xF0 0xd0 data +#>33 byte&0xF0 0xd0 +#>66 byte&0xF0 0xd0 +#>99 byte&0xF0 0xd0 +#>132 byte&0xF0 0xd0 GSM 06.10 compressed audio + +# bzip a block-sorting file compressor +# by Julian Seward and others +# +0 string BZ bzip compressed data +>2 byte x \b, version: %c +>3 string =1 \b, compression block size 100k +>3 string =2 \b, compression block size 200k +>3 string =3 \b, compression block size 300k +>3 string =4 \b, compression block size 400k +>3 string =5 \b, compression block size 500k +>3 string =6 \b, compression block size 600k +>3 string =7 \b, compression block size 700k +>3 string =8 \b, compression block size 800k +>3 string =9 \b, compression block size 900k + +# lzop from +0 string \x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a lzop compressed data +>9 beshort <0x0940 +>>9 byte&0xf0 =0x00 - version 0. +>>9 beshort&0x0fff x \b%03x, +>>13 byte 1 LZO1X-1, +>>13 byte 2 LZO1X-1(15), +>>13 byte 3 LZO1X-999, +## >>22 bedate >0 last modified: %s, +>>14 byte =0x00 os: MS-DOS +>>14 byte =0x01 os: Amiga +>>14 byte =0x02 os: VMS +>>14 byte =0x03 os: Unix +>>14 byte =0x05 os: Atari +>>14 byte =0x06 os: OS/2 +>>14 byte =0x07 os: MacOS +>>14 byte =0x0A os: Tops/20 +>>14 byte =0x0B os: WinNT +>>14 byte =0x0E os: Win32 +>9 beshort >0x0939 +>>9 byte&0xf0 =0x00 - version 0. +>>9 byte&0xf0 =0x10 - version 1. +>>9 byte&0xf0 =0x20 - version 2. +>>9 beshort&0x0fff x \b%03x, +>>15 byte 1 LZO1X-1, +>>15 byte 2 LZO1X-1(15), +>>15 byte 3 LZO1X-999, +## >>25 bedate >0 last modified: %s, +>>17 byte =0x00 os: MS-DOS +>>17 byte =0x01 os: Amiga +>>17 byte =0x02 os: VMS +>>17 byte =0x03 os: Unix +>>17 byte =0x05 os: Atari +>>17 byte =0x06 os: OS/2 +>>17 byte =0x07 os: MacOS +>>17 byte =0x0A os: Tops/20 +>>17 byte =0x0B os: WinNT +>>17 byte =0x0E os: Win32 + +# 4.3BSD-Quasijarus Strong Compression +# http://minnie.tuhs.org/Quasijarus/compress.html +0 string \037\241 Quasijarus strong compressed data + +# From: Cory Dikkers +0 string XPKF Amiga xpkf.library compressed data +0 string PP11 Power Packer 1.1 compressed data +0 string PP20 Power Packer 2.0 compressed data, +>4 belong 0x09090909 fast compression +>4 belong 0x090A0A0A mediocre compression +>4 belong 0x090A0B0B good compression +>4 belong 0x090A0C0C very good compression +>4 belong 0x090A0C0D best compression + +# 7-zip archiver, from Thomas Klausner (wiz@danbala.tuwien.ac.at) +# http://www.7-zip.org or DOC/7zFormat.txt +# +0 string 7z\274\257\047\034 7-zip archive data, +>6 byte x version %d +>7 byte x \b.%d + +# AFX compressed files (Wolfram Kleff) +2 string -afx- AFX compressed file data + +# Supplementary magic data for the file(1) command to support +# rzip(1). The format is described in magic(5). +# +# Copyright (C) 2003 by Andrew Tridgell. You may do whatever you want with +# this file. +# +0 string RZIP rzip compressed data +>4 byte x - version %d +>5 byte x \b.%d +>6 belong x (%d bytes) +#------------------------------------------------------------------------------ +# Console game magic +# Toby Deshane +# ines: file(1) magic for Marat's iNES Nintendo Entertainment System +# ROM dump format + +0 string NES\032 iNES ROM dump, +>4 byte x %dx16k PRG +>5 byte x \b, %dx8k CHR +>6 byte&0x01 =0x1 \b, [Vert.] +>6 byte&0x01 =0x0 \b, [Horiz.] +>6 byte&0x02 =0x2 \b, [SRAM] +>6 byte&0x04 =0x4 \b, [Trainer] +>6 byte&0x04 =0x8 \b, [4-Scr] + +#------------------------------------------------------------------------------ +# gameboy: file(1) magic for the Nintendo (Color) Gameboy raw ROM format +# +0x104 belong 0xCEED6666 Gameboy ROM: +>0x134 string >\0 "%.16s" +>0x146 byte 0x03 \b,[SGB] +>0x147 byte 0x00 \b, [ROM ONLY] +>0x147 byte 0x01 \b, [ROM+MBC1] +>0x147 byte 0x02 \b, [ROM+MBC1+RAM] +>0x147 byte 0x03 \b, [ROM+MBC1+RAM+BATT] +>0x147 byte 0x05 \b, [ROM+MBC2] +>0x147 byte 0x06 \b, [ROM+MBC2+BATTERY] +>0x147 byte 0x08 \b, [ROM+RAM] +>0x147 byte 0x09 \b, [ROM+RAM+BATTERY] +>0x147 byte 0x0B \b, [ROM+MMM01] +>0x147 byte 0x0C \b, [ROM+MMM01+SRAM] +>0x147 byte 0x0D \b, [ROM+MMM01+SRAM+BATT] +>0x147 byte 0x0F \b, [ROM+MBC3+TIMER+BATT] +>0x147 byte 0x10 \b, [ROM+MBC3+TIMER+RAM+BATT] +>0x147 byte 0x11 \b, [ROM+MBC3] +>0x147 byte 0x12 \b, [ROM+MBC3+RAM] +>0x147 byte 0x13 \b, [ROM+MBC3+RAM+BATT] +>0x147 byte 0x19 \b, [ROM+MBC5] +>0x147 byte 0x1A \b, [ROM+MBC5+RAM] +>0x147 byte 0x1B \b, [ROM+MBC5+RAM+BATT] +>0x147 byte 0x1C \b, [ROM+MBC5+RUMBLE] +>0x147 byte 0x1D \b, [ROM+MBC5+RUMBLE+SRAM] +>0x147 byte 0x1E \b, [ROM+MBC5+RUMBLE+SRAM+BATT] +>0x147 byte 0x1F \b, [Pocket Camera] +>0x147 byte 0xFD \b, [Bandai TAMA5] +>0x147 byte 0xFE \b, [Hudson HuC-3] +>0x147 byte 0xFF \b, [Hudson HuC-1] + +>0x148 byte 0 \b, ROM: 256Kbit +>0x148 byte 1 \b, ROM: 512Kbit +>0x148 byte 2 \b, ROM: 1Mbit +>0x148 byte 3 \b, ROM: 2Mbit +>0x148 byte 4 \b, ROM: 4Mbit +>0x148 byte 5 \b, ROM: 8Mbit +>0x148 byte 6 \b, ROM: 16Mbit +>0x148 byte 0x52 \b, ROM: 9Mbit +>0x148 byte 0x53 \b, ROM: 10Mbit +>0x148 byte 0x54 \b, ROM: 12Mbit + +>0x149 byte 1 \b, RAM: 16Kbit +>0x149 byte 2 \b, RAM: 64Kbit +>0x149 byte 3 \b, RAM: 128Kbit +>0x149 byte 4 \b, RAM: 1Mbit + +#>0x14e long x \b, CRC: %x + +#------------------------------------------------------------------------------ +# genesis: file(1) magic for the Sega MegaDrive/Genesis raw ROM format +# +0x100 string SEGA Sega MegaDrive/Genesis raw ROM dump +>0x120 string >\0 Name: "%.16s" +>0x110 string >\0 %.16s +>0x1B0 string RA with SRAM + +#------------------------------------------------------------------------------ +# genesis: file(1) magic for the Super MegaDrive ROM dump format +# +0x280 string EAGN Super MagicDrive ROM dump +>0 byte x %dx16k blocks +>2 byte 0 \b, last in series or standalone +>2 byte >0 \b, split ROM +>8 byte 0xAA +>9 byte 0xBB + +#------------------------------------------------------------------------------ +# genesis: file(1) alternate magic for the Super MegaDrive ROM dump format +# +0x280 string EAMG Super MagicDrive ROM dump +>0 byte x %dx16k blocks +>2 byte x \b, last in series or standalone +>8 byte 0xAA +>9 byte 0xBB + +#------------------------------------------------------------------------------ +# smsgg: file(1) magic for Sega Master System and Game Gear ROM dumps +# +# Does not detect all images. Very preliminary guesswork. Need more data +# on format. +# +# FIXME: need a little more info...;P +# +#0 byte 0xF3 +#>1 byte 0xED Sega Master System/Game Gear ROM dump +#>1 byte 0x31 Sega Master System/Game Gear ROM dump +#>1 byte 0xDB Sega Master System/Game Gear ROM dump +#>1 byte 0xAF Sega Master System/Game Gear ROM dump +#>1 byte 0xC3 Sega Master System/Game Gear ROM dump + +#------------------------------------------------------------------------------ +# dreamcast: file(1) uncertain magic for the Sega Dreamcast VMU image format +# +0 belong 0x21068028 Sega Dreamcast VMU game image +0 string LCDi Dream Animator file + +#------------------------------------------------------------------------------ +# v64: file(1) uncertain magic for the V64 format N64 ROM dumps +# +0 belong 0x37804012 V64 Nintendo 64 ROM dump + +#------------------------------------------------------------------------------ +# msx: file(1) magic for MSX game cartridge dumps +# Too simple - MPi +#0 beshort 0x4142 MSX game cartridge dump + +#------------------------------------------------------------------------------ +# Sony Playstation executables (Adam Sjoegren ) : +0 string PS-X\ EXE Sony Playstation executable +# Area: +>113 string x (%s) + +#------------------------------------------------------------------------------ +# Microsoft Xbox executables .xbe (Esa HyytiƤ ) +0 string XBEH XBE, Microsoft Xbox executable +# probabilistic checks whether signed or not +>0x0004 ulelong =0x0 +>>&2 ulelong =0x0 +>>>&2 ulelong =0x0 \b, not signed +>0x0004 ulelong >0 +>>&2 ulelong >0 +>>>&2 ulelong >0 \b, signed +# expect base address of 0x10000 +>0x0104 ulelong =0x10000 +>>(0x0118-0x0FF60) ulelong&0x80000007 0x80000007 \b, all regions +>>(0x0118-0x0FF60) ulelong&0x80000007 !0x80000007 +>>>(0x0118-0x0FF60) ulelong >0 (regions: +>>>>(0x0118-0x0FF60) ulelong &0x00000001 NA +>>>>(0x0118-0x0FF60) ulelong &0x00000002 Japan +>>>>(0x0118-0x0FF60) ulelong &0x00000004 Rest_of_World +>>>>(0x0118-0x0FF60) ulelong &0x80000000 Manufacturer +>>>(0x0118-0x0FF60) ulelong >0 \b) + +# -------------------------------- +# Microsoft Xbox data file formats +0 string XIP0 XIP, Microsoft Xbox data +0 string XTF0 XTF, Microsoft Xbox data + +# Atari Lynx cartridge dump (EXE/BLL header) +# From: "Stefan A. Haubenthal" + +0 beshort 0x8008 Lynx cartridge, +>2 beshort x RAM start $%04x +>6 string BS93 + +# Opera file system that is used on the 3DO console +# From: Serge van den Boom +0 string \x01ZZZZZ\x01 3DO "Opera" file system + +# From Gürkan Sengün , www.linuks.mine.nu +0 string GBS Nintendo Gameboy Music/Audio Data +12 string GameBoy\ Music\ Module Nintendo Gameboy Music Module + +# Playstations Patch Files from: From: Thomas Klausner +0 string PPF30 Playstation Patch File version 3.0 +>5 byte 0 \b, PPF 1.0 patch +>5 byte 1 \b, PPF 2.0 patch +>5 byte 2 \b, PPF 3.0 patch +>>56 byte 0 \b, Imagetype BIN (any) +>>56 byte 1 \b, Imagetype GI (PrimoDVD) +>>57 byte 0 \b, Blockcheck disabled +>>57 byte 1 \b, Blockcheck enabled +>>58 byte 0 \b, Undo data not available +>>58 byte 1 \b, Undo data available +>6 string x \b, description: %s + +0 string PPF20 Playstation Patch File version 2.0 +>5 byte 0 \b, PPF 1.0 patch +>5 byte 1 \b, PPF 2.0 patch +>>56 lelong >0 \b, size of file to patch %d +>6 string x \b, description: %s + +0 string PPF10 Playstation Patch File version 1.0 +>5 byte 0 \b, Simple Encoding +>6 string x \b, description: %s +#------------------------------------------------------------------------------ +# convex: file(1) magic for Convex boxes +# +# Convexes are big-endian. +# +# /*\ +# * Below are the magic numbers and tests added for Convex. +# * Added at beginning, because they are expected to be used most. +# \*/ +0 belong 0507 Convex old-style object +>16 belong >0 not stripped +0 belong 0513 Convex old-style demand paged executable +>16 belong >0 not stripped +0 belong 0515 Convex old-style pre-paged executable +>16 belong >0 not stripped +0 belong 0517 Convex old-style pre-paged, non-swapped executable +>16 belong >0 not stripped +0 belong 0x011257 Core file +# +# The following are a series of dump format magic numbers. Each one +# corresponds to a drastically different dump format. The first on is +# the original dump format on a 4.1 BSD or earlier file system. The +# second marks the change between the 4.1 file system and the 4.2 file +# system. The Third marks the changing of the block size from 1K +# to 2K to be compatible with an IDC file system. The fourth indicates +# a dump that is dependent on Convex Storage Manager, because data in +# secondary storage is not physically contained within the dump. +# The restore program uses these number to determine how the data is +# to be extracted. +# +24 belong =60011 dump format, 4.1 BSD or earlier +24 belong =60012 dump format, 4.2 or 4.3 BSD without IDC +24 belong =60013 dump format, 4.2 or 4.3 BSD (IDC compatible) +24 belong =60014 dump format, Convex Storage Manager by-reference dump +# +# what follows is a bunch of bit-mask checks on the flags field of the opthdr. +# If there is no `=' sign, assume just checking for whether the bit is set? +# +0 belong 0601 Convex SOFF +>88 belong&0x000f0000 =0x00000000 c1 +>88 belong &0x00010000 c2 +>88 belong &0x00020000 c2mp +>88 belong &0x00040000 parallel +>88 belong &0x00080000 intrinsic +>88 belong &0x00000001 demand paged +>88 belong &0x00000002 pre-paged +>88 belong &0x00000004 non-swapped +>88 belong &0x00000008 POSIX +# +>84 belong &0x80000000 executable +>84 belong &0x40000000 object +>84 belong&0x20000000 =0 not stripped +>84 belong&0x18000000 =0x00000000 native fpmode +>84 belong&0x18000000 =0x10000000 ieee fpmode +>84 belong&0x18000000 =0x18000000 undefined fpmode +# +0 belong 0605 Convex SOFF core +# +0 belong 0607 Convex SOFF checkpoint +>88 belong&0x000f0000 =0x00000000 c1 +>88 belong &0x00010000 c2 +>88 belong &0x00020000 c2mp +>88 belong &0x00040000 parallel +>88 belong &0x00080000 intrinsic +>88 belong &0x00000008 POSIX +# +>84 belong&0x18000000 =0x00000000 native fpmode +>84 belong&0x18000000 =0x10000000 ieee fpmode +>84 belong&0x18000000 =0x18000000 undefined fpmode + +# ---------------------------------------------------------------------------- +# ctags: file (1) magic for Exuberant Ctags files +# From: Alexander Mai +0 string =!_TAG Exuberant Ctags tag file text + +#------------------------------------------------------------------------------ +# dact: file(1) magic for DACT compressed files +# +0 long 0x444354C3 DACT compressed data +>4 byte >-1 (version %i. +>5 byte >-1 $BS%i. +>6 byte >-1 $BS%i) +>7 long >0 $BS, original size: %i bytes +>15 long >30 $BS, block size: %i bytes + +#------------------------------------------------------------------------------ +# database: file(1) magic for various databases +# +# extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk) +# +# +# GDBM magic numbers +# Will be maintained as part of the GDBM distribution in the future. +# +0 belong 0x13579ace GNU dbm 1.x or ndbm database, big endian +0 lelong 0x13579ace GNU dbm 1.x or ndbm database, little endian +0 string GDBM GNU dbm 2.x database +# +# Berkeley DB +# +# Ian Darwin's file /etc/magic files: big/little-endian version. +# +# Hash 1.85/1.86 databases store metadata in network byte order. +# Btree 1.85/1.86 databases store the metadata in host byte order. +# Hash and Btree 2.X and later databases store the metadata in host byte order. + +0 long 0x00061561 Berkeley DB +>8 belong 4321 +>>4 belong >2 1.86 +>>4 belong <3 1.85 +>>4 belong >0 (Hash, version %d, native byte-order) +>8 belong 1234 +>>4 belong >2 1.86 +>>4 belong <3 1.85 +>>4 belong >0 (Hash, version %d, little-endian) + +0 belong 0x00061561 Berkeley DB +>8 belong 4321 +>>4 belong >2 1.86 +>>4 belong <3 1.85 +>>4 belong >0 (Hash, version %d, big-endian) +>8 belong 1234 +>>4 belong >2 1.86 +>>4 belong <3 1.85 +>>4 belong >0 (Hash, version %d, native byte-order) + +0 long 0x00053162 Berkeley DB 1.85/1.86 +>4 long >0 (Btree, version %d, native byte-order) +0 belong 0x00053162 Berkeley DB 1.85/1.86 +>4 belong >0 (Btree, version %d, big-endian) +0 lelong 0x00053162 Berkeley DB 1.85/1.86 +>4 lelong >0 (Btree, version %d, little-endian) + +12 long 0x00061561 Berkeley DB +>16 long >0 (Hash, version %d, native byte-order) +12 belong 0x00061561 Berkeley DB +>16 belong >0 (Hash, version %d, big-endian) +12 lelong 0x00061561 Berkeley DB +>16 lelong >0 (Hash, version %d, little-endian) + +12 long 0x00053162 Berkeley DB +>16 long >0 (Btree, version %d, native byte-order) +12 belong 0x00053162 Berkeley DB +>16 belong >0 (Btree, version %d, big-endian) +12 lelong 0x00053162 Berkeley DB +>16 lelong >0 (Btree, version %d, little-endian) + +12 long 0x00042253 Berkeley DB +>16 long >0 (Queue, version %d, native byte-order) +12 belong 0x00042253 Berkeley DB +>16 belong >0 (Queue, version %d, big-endian) +12 lelong 0x00042253 Berkeley DB +>16 lelong >0 (Queue, version %d, little-endian) + +# From Max Bowsher. +12 long 0x00040988 Berkeley DB +>16 long >0 (Log, version %d, native byte-order) +12 belong 0x00040988 Berkeley DB +>16 belong >0 (Log, version %d, big-endian) +12 lelong 0x00040988 Berkeley DB +>16 lelong >0 (Log, version %d, little-endian) + +# +# +# Round Robin Database Tool by Tobias Oetiker +0 string RRD RRDTool DB +>4 string x version %s +#---------------------------------------------------------------------- +# ROOT: file(1) magic for ROOT databases +# +0 string root\0 ROOT file +>4 belong x Version %d +>33 belong x (Compression: %d) + +# XXX: Weak magic. +# Alex Ott +## Paradox file formats +#2 leshort 0x0800 Paradox +#>0x39 byte 3 v. 3.0 +#>0x39 byte 4 v. 3.5 +#>0x39 byte 9 v. 4.x +#>0x39 byte 10 v. 5.x +#>0x39 byte 11 v. 5.x +#>0x39 byte 12 v. 7.x +#>>0x04 byte 0 indexed .DB data file +#>>0x04 byte 1 primary index .PX file +#>>0x04 byte 2 non-indexed .DB data file +#>>0x04 byte 3 non-incrementing secondary index .Xnn file +#>>0x04 byte 4 secondary index .Ynn file +#>>0x04 byte 5 incrementing secondary index .Xnn file +#>>0x04 byte 6 non-incrementing secondary index .XGn file +#>>0x04 byte 7 secondary index .YGn file +#>>>0x04 byte 8 incrementing secondary index .XGn file +## XBase database files +#0 byte 0x02 +#>8 leshort >0 +#>>12 leshort 0 FoxBase +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x03 +#>8 leshort >0 +#>>12 leshort 0 FoxBase+, FoxPro, dBaseIII+, dBaseIV, no memo +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x04 +#>8 leshort >0 +#>>12 leshort 0 dBASE IV no memo file +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x05 +#>8 leshort >0 +#>>12 leshort 0 dBASE V no memo file +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x30 +#>8 leshort >0 +#>>12 leshort 0 Visual FoxPro +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x43 +#>8 leshort >0 +#>>12 leshort 0 FlagShip with memo var size +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x7b +#>8 leshort >0 +#>>12 leshort 0 dBASEIV with memo +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x83 +#>8 leshort >0 +#>>12 leshort 0 FoxBase+, dBaseIII+ with memo +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x8b +#>8 leshort >0 +#>>12 leshort 0 dBaseIV with memo +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0x8e +#>8 leshort >0 +#>>12 leshort 0 dBaseIV with SQL Table +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0xb3 +#>8 leshort >0 +#>>12 leshort 0 FlagShip with .dbt memo +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 byte 0xf5 +#>8 leshort >0 +#>>12 leshort 0 FoxPro with memo +#>>>0x04 lelong 0 (no records) +#>>>0x04 lelong >0 (%ld records) +# +#0 leshort 0x0006 DBase 3 index file + +# MS Access database +4 string Standard\ Jet\ DB Microsoft Access Database + +# TDB database from Samba et al - Martin Pool +0 string TDB\ file TDB database +>32 lelong 0x2601196D version 6, little-endian +>>36 lelong x hash size %d bytes + +# SE Linux policy database +0 lelong 0xf97cff8c SE Linux policy +>16 lelong x v%d +>20 lelong 1 MLS +>24 lelong x %d symbols +>28 lelong x %d ocons + +# ICE authority file data (Wolfram Kleff) +2 string ICE ICE authority data + +# X11 Xauthority file (Wolfram Kleff) +10 string MIT-MAGIC-COOKIE-1 X11 Xauthority data +11 string MIT-MAGIC-COOKIE-1 X11 Xauthority data +12 string MIT-MAGIC-COOKIE-1 X11 Xauthority data +13 string MIT-MAGIC-COOKIE-1 X11 Xauthority data +14 string MIT-MAGIC-COOKIE-1 X11 Xauthority data +15 string MIT-MAGIC-COOKIE-1 X11 Xauthority data +16 string MIT-MAGIC-COOKIE-1 X11 Xauthority data +17 string MIT-MAGIC-COOKIE-1 X11 Xauthority data +18 string MIT-MAGIC-COOKIE-1 X11 Xauthority data + +#------------------------------------------------------------------------------ +# diamond: file(1) magic for Diamond system +# +# ... diamond is a multi-media mail and electronic conferencing system.... +# +# XXX - I think it was either renamed Slate, or replaced by Slate.... +# +# The full deal is too long... +#0 string \n Diamond Multimedia Document +0 string =\n\n________64E Alpha archive +>22 string X -- out of date +# +# Alpha COFF Based Executables +# The stripped stuff really needs to be an 8 byte (64 bit) compare, +# but this works +0 leshort 0x183 COFF format alpha +>22 leshort&020000 &010000 sharable library, +>22 leshort&020000 ^010000 dynamically linked, +>24 leshort 0410 pure +>24 leshort 0413 demand paged +>8 lelong >0 executable or object module, not stripped +>8 lelong 0 +>>12 lelong 0 executable or object module, stripped +>>12 lelong >0 executable or object module, not stripped +>27 byte >0 - version %d. +>26 byte >0 %d- +>28 leshort >0 %d +# +# The next is incomplete, we could tell more about this format, +# but its not worth it. +0 leshort 0x188 Alpha compressed COFF +0 leshort 0x18f Alpha u-code object +# +# +# Some other interesting Digital formats, +0 string \377\377\177 ddis/ddif +0 string \377\377\174 ddis/dots archive +0 string \377\377\176 ddis/dtif table data +0 string \033c\033 LN03 output +0 long 04553207 X image +# +0 string =!!\n profiling data file +# +# Locale data tables (MIPS and Alpha). +# +0 short 0x0501 locale data table +>6 short 0x24 for MIPS +>6 short 0x40 for Alpha +# ATSC A/53 aka AC-3 aka Dolby Digital +# from http://www.atsc.org/standards/a_52a.pdf +# corrections, additions, etc. are always welcome! +# +# syncword +0 beshort 0x0b77 ATSC A/52 aka AC-3 aka Dolby Digital stream, +# fscod +>4 byte&0xc0 0x00 48 kHz, +>4 byte&0xc0 0x40 44.1 kHz, +>4 byte&0xc0 0x80 32 kHz, +# is this one used for 96 kHz? +>4 byte&0xc0 0xc0 reserved frequency, +# +>5 byte&7 = 0 \b, complete main (CM) +>5 byte&7 = 1 \b, music and effects (ME) +>5 byte&7 = 2 \b, visually impaired (VI) +>5 byte&7 = 3 \b, hearing impaired (HI) +>5 byte&7 = 4 \b, dialogue (D) +>5 byte&7 = 5 \b, commentary (C) +>5 byte&7 = 6 \b, emergency (E) +# acmod +>6 byte&0xe0 0x00 1+1 front, +>6 byte&0xe0 0x20 1 front/0 rear, +>6 byte&0xe0 0x40 2 front/0 rear, +>6 byte&0xe0 0x60 3 front/0 rear, +>6 byte&0xe0 0x80 2 front/1 rear, +>6 byte&0xe0 0xa0 3 front/1 rear, +>6 byte&0xe0 0xc0 2 front/2 rear, +>6 byte&0xe0 0xe0 3 front/2 rear, +# lfeon (these may be incorrect) +>7 byte&0x40 0x00 LFE off, +>7 byte&0x40 0x40 LFE on, +# +>4 byte&0x3e = 0x00 \b, 32 kbit/s +>4 byte&0x3e = 0x02 \b, 40 kbit/s +>4 byte&0x3e = 0x04 \b, 48 kbit/s +>4 byte&0x3e = 0x06 \b, 56 kbit/s +>4 byte&0x3e = 0x08 \b, 64 kbit/s +>4 byte&0x3e = 0x0a \b, 80 kbit/s +>4 byte&0x3e = 0x0c \b, 96 kbit/s +>4 byte&0x3e = 0x0e \b, 112 kbit/s +>4 byte&0x3e = 0x10 \b, 128 kbit/s +>4 byte&0x3e = 0x12 \b, 160 kbit/s +>4 byte&0x3e = 0x14 \b, 192 kbit/s +>4 byte&0x3e = 0x16 \b, 224 kbit/s +>4 byte&0x3e = 0x18 \b, 256 kbit/s +>4 byte&0x3e = 0x1a \b, 320 kbit/s +>4 byte&0x3e = 0x1c \b, 384 kbit/s +>4 byte&0x3e = 0x1e \b, 448 kbit/s +>4 byte&0x3e = 0x20 \b, 512 kbit/s +>4 byte&0x3e = 0x22 \b, 576 kbit/s +>4 byte&0x3e = 0x24 \b, 640 kbit/s +# dsurmod (these may be incorrect) +>6 beshort&0x0180 0x0000 Dolby Surround not indicated +>6 beshort&0x0180 0x0080 not Dolby Surround encoded +>6 beshort&0x0180 0x0100 Dolby Surround encoded +>6 beshort&0x0180 0x0180 reserved Dolby Surround mode + +#------------------------------------------------------------------------------ +# dump: file(1) magic for dump file format--for new and old dump filesystems +# +# We specify both byte orders in order to recognize byte-swapped dumps. +# +24 belong 60012 new-fs dump file (big endian), +>4 bedate x Previous dump %s, +>8 bedate x This dump %s, +>12 belong >0 Volume %ld, +>692 belong 0 Level zero, type: +>692 belong >0 Level %d, type: +>0 belong 1 tape header, +>0 belong 2 beginning of file record, +>0 belong 3 map of inodes on tape, +>0 belong 4 continuation of file record, +>0 belong 5 end of volume, +>0 belong 6 map of inodes deleted, +>0 belong 7 end of medium (for floppy), +>676 string >\0 Label %s, +>696 string >\0 Filesystem %s, +>760 string >\0 Device %s, +>824 string >\0 Host %s, +>888 belong >0 Flags %x + +24 belong 60011 old-fs dump file (big endian), +#>4 bedate x Previous dump %s, +#>8 bedate x This dump %s, +>12 belong >0 Volume %ld, +>692 belong 0 Level zero, type: +>692 belong >0 Level %d, type: +>0 belong 1 tape header, +>0 belong 2 beginning of file record, +>0 belong 3 map of inodes on tape, +>0 belong 4 continuation of file record, +>0 belong 5 end of volume, +>0 belong 6 map of inodes deleted, +>0 belong 7 end of medium (for floppy), +>676 string >\0 Label %s, +>696 string >\0 Filesystem %s, +>760 string >\0 Device %s, +>824 string >\0 Host %s, +>888 belong >0 Flags %x + +24 lelong 60012 new-fs dump file (little endian), +>4 ledate x This dump %s, +>8 ledate x Previous dump %s, +>12 lelong >0 Volume %ld, +>692 lelong 0 Level zero, type: +>692 lelong >0 Level %d, type: +>0 lelong 1 tape header, +>0 lelong 2 beginning of file record, +>0 lelong 3 map of inodes on tape, +>0 lelong 4 continuation of file record, +>0 lelong 5 end of volume, +>0 lelong 6 map of inodes deleted, +>0 lelong 7 end of medium (for floppy), +>676 string >\0 Label %s, +>696 string >\0 Filesystem %s, +>760 string >\0 Device %s, +>824 string >\0 Host %s, +>888 lelong >0 Flags %x + +24 lelong 60011 old-fs dump file (little endian), +#>4 ledate x Previous dump %s, +#>8 ledate x This dump %s, +>12 lelong >0 Volume %ld, +>692 lelong 0 Level zero, type: +>692 lelong >0 Level %d, type: +>0 lelong 1 tape header, +>0 lelong 2 beginning of file record, +>0 lelong 3 map of inodes on tape, +>0 lelong 4 continuation of file record, +>0 lelong 5 end of volume, +>0 lelong 6 map of inodes deleted, +>0 lelong 7 end of medium (for floppy), +>676 string >\0 Label %s, +>696 string >\0 Filesystem %s, +>760 string >\0 Device %s, +>824 string >\0 Host %s, +>888 lelong >0 Flags %x + +18 leshort 60011 old-fs dump file (16-bit, assuming PDP-11 endianness), +>2 medate x Previous dump %s, +>6 medate x This dump %s, +>10 leshort >0 Volume %ld, +>0 leshort 1 tape header. +>0 leshort 2 beginning of file record. +>0 leshort 3 map of inodes on tape. +>0 leshort 4 continuation of file record. +>0 leshort 5 end of volume. +>0 leshort 6 map of inodes deleted. +>0 leshort 7 end of medium (for floppy). + +#------------------------------------------------------------------------------ +# T602 editor documents +# by David Necas +0 string @CT\ T602 document data, +>4 string 0 Kamenicky +>4 string 1 CP 852 +>4 string 2 KOI8-CS +>4 string >2 unknown encoding + +# Vi IMproved Encrypted file +# by David Necas +0 string VimCrypt~ Vim encrypted file data +# Vi IMproved Swap file +# by Sven Wegener +0 string b0VIM\ Vim swap file +>&0 string >\0 \b, version %s + +#------------------------------------------------------------------------------ +# elf: file(1) magic for ELF executables +# +# We have to check the byte order flag to see what byte order all the +# other stuff in the header is in. +# +# What're the correct byte orders for the nCUBE and the Fujitsu VPP500? +# +# updated by Daniel Quinlan (quinlan@yggdrasil.com) +0 string \177ELF ELF +>4 byte 0 invalid class +>4 byte 1 32-bit +>4 byte 2 64-bit +>5 byte 0 invalid byte order +>5 byte 1 LSB +>>16 leshort 0 no file type, +>>16 leshort 1 relocatable, +>>16 leshort 2 executable, +>>16 leshort 3 shared object, +# Core handling from Peter Tobias +# corrections by Christian 'Dr. Disk' Hechelmann +>>16 leshort 4 core file +# Core file detection is not reliable. +#>>>(0x38+0xcc) string >\0 of '%s' +#>>>(0x38+0x10) lelong >0 (signal %d), +>>16 leshort &0xff00 processor-specific, +>>18 leshort 0 no machine, +>>18 leshort 1 AT&T WE32100 - invalid byte order, +>>18 leshort 2 SPARC - invalid byte order, +>>18 leshort 3 Intel 80386, +>>18 leshort 4 Motorola +>>>36 lelong &0x01000000 68000 - invalid byte order, +>>>36 lelong &0x00810000 CPU32 - invalid byte order, +>>>36 lelong 0 68020 - invalid byte order, +>>18 leshort 5 Motorola 88000 - invalid byte order, +>>18 leshort 6 Intel 80486, +>>18 leshort 7 Intel 80860, +# The official e_machine number for MIPS is now #8, regardless of endianness. +# The second number (#10) will be deprecated later. For now, we still +# say something if #10 is encountered, but only gory details for #8. +>>18 leshort 8 MIPS, +>>>36 lelong &0x20 N32 +>>18 leshort 10 MIPS, +>>>36 lelong &0x20 N32 +>>18 leshort 8 +# only for 32-bit +>>>4 byte 1 +>>>>36 lelong&0xf0000000 0x00000000 MIPS-I +>>>>36 lelong&0xf0000000 0x10000000 MIPS-II +>>>>36 lelong&0xf0000000 0x20000000 MIPS-III +>>>>36 lelong&0xf0000000 0x30000000 MIPS-IV +>>>>36 lelong&0xf0000000 0x40000000 MIPS-V +>>>>36 lelong&0xf0000000 0x60000000 MIPS32 +>>>>36 lelong&0xf0000000 0x70000000 MIPS64 +>>>>36 lelong&0xf0000000 0x80000000 MIPS32 rel2 +>>>>36 lelong&0xf0000000 0x90000000 MIPS64 rel2 +# only for 64-bit +>>>4 byte 2 +>>>>48 lelong&0xf0000000 0x00000000 MIPS-I +>>>>48 lelong&0xf0000000 0x10000000 MIPS-II +>>>>48 lelong&0xf0000000 0x20000000 MIPS-III +>>>>48 lelong&0xf0000000 0x30000000 MIPS-IV +>>>>48 lelong&0xf0000000 0x40000000 MIPS-V +>>>>48 lelong&0xf0000000 0x60000000 MIPS32 +>>>>48 lelong&0xf0000000 0x70000000 MIPS64 +>>>>48 lelong&0xf0000000 0x80000000 MIPS32 rel2 +>>>>48 lelong&0xf0000000 0x90000000 MIPS64 rel2 +>>18 leshort 9 Amdahl - invalid byte order, +>>18 leshort 10 MIPS (deprecated), +>>18 leshort 11 RS6000 - invalid byte order, +>>18 leshort 15 PA-RISC - invalid byte order, +>>>50 leshort 0x0214 2.0 +>>>48 leshort &0x0008 (LP64), +>>18 leshort 16 nCUBE, +>>18 leshort 17 Fujitsu VPP500, +>>18 leshort 18 SPARC32PLUS, +>>18 leshort 20 PowerPC, +>>18 leshort 22 IBM S/390, +>>18 leshort 36 NEC V800, +>>18 leshort 37 Fujitsu FR20, +>>18 leshort 38 TRW RH-32, +>>18 leshort 39 Motorola RCE, +>>18 leshort 40 ARM, +>>18 leshort 41 Alpha, +>>18 leshort 0xa390 IBM S/390 (obsolete), +>>18 leshort 42 Renesas SH, +>>18 leshort 43 SPARC V9 - invalid byte order, +>>18 leshort 44 Siemens Tricore Embedded Processor, +>>18 leshort 45 Argonaut RISC Core, Argonaut Technologies Inc., +>>18 leshort 46 Renesas H8/300, +>>18 leshort 47 Renesas H8/300H, +>>18 leshort 48 Renesas H8S, +>>18 leshort 49 Renesas H8/500, +>>18 leshort 50 IA-64, +>>18 leshort 51 Stanford MIPS-X, +>>18 leshort 52 Motorola Coldfire, +>>18 leshort 53 Motorola M68HC12, +>>18 leshort 62 x86-64, +>>18 leshort 75 Digital VAX, +>>18 leshort 88 Renesas M32R, +>>18 leshort 94 Tensilica Xtensa, +>>18 leshort 97 NatSemi 32k, +>>18 leshort 106 Analog Devices Blackfin, +>>18 leshort 0x9026 Alpha (unofficial), +>>20 lelong 0 invalid version +>>20 lelong 1 version 1 +>>36 lelong 1 MathCoPro/FPU/MAU Required +>5 byte 2 MSB +>>16 beshort 0 no file type, +>>16 beshort 1 relocatable, +>>16 beshort 2 executable, +>>16 beshort 3 shared object, +>>16 beshort 4 core file, +#>>>(0x38+0xcc) string >\0 of '%s' +#>>>(0x38+0x10) belong >0 (signal %d), +>>16 beshort &0xff00 processor-specific, +>>18 beshort 0 no machine, +>>18 beshort 1 AT&T WE32100, +>>18 beshort 2 SPARC, +>>18 beshort 3 Intel 80386 - invalid byte order, +>>18 beshort 4 Motorola +>>>36 belong &0x01000000 68000, +>>>36 belong &0x00810000 CPU32, +>>>36 belong 0 68020, +>>18 beshort 5 Motorola 88000, +>>18 beshort 6 Intel 80486 - invalid byte order, +>>18 beshort 7 Intel 80860, +# only for MIPS - see comment in little-endian section above. +>>18 beshort 8 MIPS, +>>>36 belong &0x20 N32 +>>18 beshort 10 MIPS, +>>>36 belong &0x20 N32 +>>18 beshort 8 +# only for 32-bit +>>>4 byte 1 +>>>>36 belong&0xf0000000 0x00000000 MIPS-I +>>>>36 belong&0xf0000000 0x10000000 MIPS-II +>>>>36 belong&0xf0000000 0x20000000 MIPS-III +>>>>36 belong&0xf0000000 0x30000000 MIPS-IV +>>>>36 belong&0xf0000000 0x40000000 MIPS-V +>>>>36 belong&0xf0000000 0x60000000 MIPS32 +>>>>36 belong&0xf0000000 0x70000000 MIPS64 +>>>>36 belong&0xf0000000 0x80000000 MIPS32 rel2 +>>>>36 belong&0xf0000000 0x90000000 MIPS64 rel2 +# only for 64-bit +>>>4 byte 2 +>>>>48 belong&0xf0000000 0x00000000 MIPS-I +>>>>48 belong&0xf0000000 0x10000000 MIPS-II +>>>>48 belong&0xf0000000 0x20000000 MIPS-III +>>>>48 belong&0xf0000000 0x30000000 MIPS-IV +>>>>48 belong&0xf0000000 0x40000000 MIPS-V +>>>>48 belong&0xf0000000 0x60000000 MIPS32 +>>>>48 belong&0xf0000000 0x70000000 MIPS64 +>>>>48 belong&0xf0000000 0x80000000 MIPS32 rel2 +>>>>48 belong&0xf0000000 0x90000000 MIPS64 rel2 +>>18 beshort 9 Amdahl, +>>18 beshort 10 MIPS (deprecated), +>>18 beshort 11 RS6000, +>>18 beshort 15 PA-RISC +>>>50 beshort 0x0214 2.0 +>>>48 beshort &0x0008 (LP64) +>>18 beshort 16 nCUBE, +>>18 beshort 17 Fujitsu VPP500, +>>18 beshort 18 SPARC32PLUS, +>>>36 belong&0xffff00 &0x000100 V8+ Required, +>>>36 belong&0xffff00 &0x000200 Sun UltraSPARC1 Extensions Required, +>>>36 belong&0xffff00 &0x000400 HaL R1 Extensions Required, +>>>36 belong&0xffff00 &0x000800 Sun UltraSPARC3 Extensions Required, +>>18 beshort 20 PowerPC or cisco 4500, +>>18 beshort 21 64-bit PowerPC or cisco 7500, +>>18 beshort 22 IBM S/390, +>>18 beshort 23 Cell SPU, +>>18 beshort 24 cisco SVIP, +>>18 beshort 25 cisco 7200, +>>18 beshort 36 NEC V800 or cisco 12000, +>>18 beshort 37 Fujitsu FR20, +>>18 beshort 38 TRW RH-32, +>>18 beshort 39 Motorola RCE, +>>18 beshort 40 ARM, +>>18 beshort 41 Alpha, +>>18 beshort 42 Renesas SH, +>>18 beshort 43 SPARC V9, +>>18 beshort 44 Siemens Tricore Embedded Processor, +>>18 beshort 45 Argonaut RISC Core, Argonaut Technologies Inc., +>>18 beshort 46 Renesas H8/300, +>>18 beshort 47 Renesas H8/300H, +>>18 beshort 48 Renesas H8S, +>>18 beshort 49 Renesas H8/500, +>>18 beshort 50 IA-64, +>>18 beshort 51 Stanford MIPS-X, +>>18 beshort 52 Motorola Coldfire, +>>18 beshort 53 Motorola M68HC12, +>>18 beshort 73 Cray NV1, +>>18 beshort 75 Digital VAX, +>>18 beshort 88 Renesas M32R, +>>18 beshort 94 Tensilica Xtensa, +>>18 beshort 97 NatSemi 32k, +>>18 beshort 0x9026 Alpha (unofficial), +>>18 beshort 0xa390 IBM S/390 (obsolete), +>>20 belong 0 invalid version +>>20 belong 1 version 1 +>>36 belong 1 MathCoPro/FPU/MAU Required +# Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed +# like proper ELF, but extracting the string had bad results. +>4 byte <0x80 +>>8 string >\0 (%s) +>8 string \0 +>>7 byte 0 (SYSV) +>>7 byte 1 (HP-UX) +>>7 byte 2 (NetBSD) +>>7 byte 3 (GNU/Linux) +>>7 byte 4 (GNU/Hurd) +>>7 byte 5 (86Open) +>>7 byte 6 (Solaris) +>>7 byte 7 (Monterey) +>>7 byte 8 (IRIX) +>>7 byte 9 (FreeBSD) +>>7 byte 10 (Tru64) +>>7 byte 11 (Novell Modesto) +>>7 byte 12 (OpenBSD) +# VMS Itanium added by gerardo.cacciari@gmail.com +>8 string \2 +>>7 byte 13 (OpenVMS) +>>7 byte 97 (ARM) +>>7 byte 255 (embedded) + +#------------------------------------------------------------------------------ +# encore: file(1) magic for Encore machines +# +# XXX - needs to have the byte order specified (NS32K was little-endian, +# dunno whether they run the 88K in little-endian mode or not). +# +0 short 0x154 Encore +>20 short 0x107 executable +>20 short 0x108 pure executable +>20 short 0x10b demand-paged executable +>20 short 0x10f unsupported executable +>12 long >0 not stripped +>22 short >0 - version %ld +>22 short 0 - +#>4 date x stamp %s +0 short 0x155 Encore unsupported executable +>12 long >0 not stripped +>22 short >0 - version %ld +>22 short 0 - +#>4 date x stamp %s + +#------------------------------------------------------------------------------ +# Epoc 32 : file(1) magic for Epoc Documents [psion/osaris +# Stefan Praszalowicz (hpicollo@worldnet.fr) +#0 lelong 0x10000037 Epoc32 +>4 lelong 0x1000006D +>>8 lelong 0x1000007F Word +>>8 lelong 0x10000088 Sheet +>>8 lelong 0x1000007D Sketch +>>8 lelong 0x10000085 TextEd + +#------------------------------------------------------------------------------ +# ESRI Shapefile format (.shp .shx .dbf=DBaseIII) +# Based on info from +# +0 belong 9994 ESRI Shapefile +>4 belong =0 +>8 belong =0 +>12 belong =0 +>16 belong =0 +>20 belong =0 +>28 lelong x version %d +>24 belong x length %d +>32 lelong =0 type Null Shape +>32 lelong =1 type Point +>32 lelong =3 type PolyLine +>32 lelong =5 type Polygon +>32 lelong =8 type MultiPoint +>32 lelong =11 type PointZ +>32 lelong =13 type PolyLineZ +>32 lelong =15 type PolygonZ +>32 lelong =18 type MultiPointZ +>32 lelong =21 type PointM +>32 lelong =23 type PolyLineM +>32 lelong =25 type PolygonM +>32 lelong =28 type MultiPointM +>32 lelong =31 type MultiPatch + +#------------------------------------------------------------------------------ +# fcs: file(1) magic for FCS (Flow Cytometry Standard) data files +# From Roger Leigh +0 string FCS1.0 Flow Cytometry Standard (FCS) data, version 1.0 +0 string FCS2.0 Flow Cytometry Standard (FCS) data, version 2.0 +0 string FCS3.0 Flow Cytometry Standard (FCS) data, version 3.0 + + +#------------------------------------------------------------------------------ +# filesystems: file(1) magic for different filesystems +# +0 string \366\366\366\366 PC formatted floppy with no filesystem +# Sun disk labels +# From /usr/include/sun/dklabel.h: +0774 beshort 0xdabe +# modified by Joerg Jenderek, because original test +# succeeds for Cabinet archive dao360.dl_ with negative blocks +>0770 long >0 Sun disk label +>>0 string x '%s +>>>31 string >\0 \b%s +>>>>63 string >\0 \b%s +>>>>>95 string >\0 \b%s +>>0 string x \b' +>>0734 short >0 %d rpm, +>>0736 short >0 %d phys cys, +>>0740 short >0 %d alts/cyl, +>>0746 short >0 %d interleave, +>>0750 short >0 %d data cyls, +>>0752 short >0 %d alt cyls, +>>0754 short >0 %d heads/partition, +>>0756 short >0 %d sectors/track, +>>0764 long >0 start cyl %ld, +>>0770 long x %ld blocks +# Is there a boot block written 1 sector in? +>512 belong&077777777 0600407 \b, boot block present +# Joerg Jenderek: Smart Boot Manager backup file is 41 byte header + first sectors of disc +# (http://btmgr.sourceforge.net/docs/user-guide-3.html) +0 string SBMBAKUP_ Smart Boot Manager backup file +>9 string x \b, version %-5.5s +>>14 string =_ +>>>15 string x %-.1s +>>>>16 string =_ \b. +>>>>>17 string x \b%-.1s +>>>>>>18 string =_ \b. +>>>>>>>19 string x \b%-.1s +>>>22 ubyte 0 +>>>>21 ubyte x \b, from drive 0x%x +>>>22 ubyte >0 +>>>>21 string x \b, from drive %s + +# Joerg Jenderek +# DOS Emulator image is 128 byte, null right padded header + harddisc image +0 string DOSEMU\0 +>0x27E leshort 0xAA55 +#offset is 128 +>>19 ubyte 128 +>>>(19.b-1) ubyte 0x0 DOS Emulator image +>>>>7 ulelong >0 \b, %u heads +>>>>11 ulelong >0 \b, %d sectors/track +>>>>15 ulelong >0 \b, %d cylinders + +0x1FE leshort 0xAA55 x86 boot sector +>2 string OSBS \b, OS/BS MBR +# J\xf6rg Jenderek +>0x8C string Invalid\ partition\ table \b, MS-DOS MBR +# dr-dos with some upper-, lowercase variants +>0x9D string Invalid\ partition\ table$ +>>181 string No\ Operating\ System$ +>>>201 string Operating\ System\ load\ error$ \b, DR-DOS MBR, Version 7.01 to 7.03 +>0x9D string Invalid\ partition\ table$ +>>181 string No\ operating\ system$ +>>>201 string Operating\ system\ load\ error$ \b, DR-DOS MBR, Version 7.01 to 7.03 +>342 string Invalid\ partition\ table$ +>>366 string No\ operating\ system$ +>>>386 string Operating\ system\ load\ error$ \b, DR-DOS MBR, version 7.01 to 7.03 +>295 string NEWLDR\0 +>>302 string Bad\ PT\ $ +>>>310 string No\ OS\ $ +>>>>317 string OS\ load\ err$ +>>>>>329 string Moved\ or\ missing\ IBMBIO.LDR\n\r +>>>>>>358 string Press\ any\ key\ to\ continue.\n\r$ +>>>>>>>387 string Copyright\ (c)\ 1984,1998 +>>>>>>>>411 string Caldera\ Inc.\0 \b, DR-DOS MBR (IBMBIO.LDR) +>0x10F string Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 4.10.1998, 4.10.2222 +>>0x1B8 ubelong >0 \b, Serial 0x%-.4x +>0x8B string Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 5.00 to 4.00.950 +>271 string Invalid\ partition\ table\0 +>>295 string Error\ loading\ operating\ system\0 +>>>326 string Missing\ operating\ system\0 \b, mbr +# +>139 string Invalid\ partition\ table\0 +>>163 string Error\ loading\ operating\ system\0 +>>>194 string Missing\ operating\ system\0 \b, Microsoft Windows XP mbr +# http://www.heise.de/ct/05/09/006/ page 184 +#HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\DosDevices\?:=Serial4Bytes+8Bytes +>>>>0x1B8 ulelong >0 \b,Serial 0x%-.4x +>300 string Invalid\ partition\ table\0 +>>324 string Error\ loading\ operating\ system\0 +>>>355 string Missing\ operating\ system\0 \b, Microsoft Windows XP MBR +#??>>>389 string Invalid\ system\ disk +>>>>0x1B8 ulelong >0 \b, Serial 0x%-.4x +>300 string Ung\201ltige\ Partitionstabelle +#split string to avoid error: String too long +>>328 string Fehler\ beim\ Laden\ +>>>346 string des\ Betriebssystems +>>>>366 string Betriebssystem\ nicht\ vorhanden \b, Microsoft Windows XP MBR (german) +>>>>>0x1B8 ulelong >0 \b, Serial 0x%-.4x +>0x145 string Default:\ F \b, FREE-DOS MBR +>64 string no\ active\ partition\ found +>>96 string read\ error\ while\ reading\ drive \b, FREE-DOS Beta 0.9 MBR +>271 string Operating\ system\ loading +>>296 string error\r \b, SYSLINUX MBR (2.10) +# http://www.acronis.de/ +>362 string MBR\ Error\ \0\r +>>376 string ress\ any\ key\ to\ +>>>392 string boot\ from\ floppy...\0 \b, Acronis MBR +# added by Joerg Jenderek +# http://www.visopsys.org/ +# http://partitionlogic.org.uk/ +>309 string No\ bootable\ partition\ found\r +>>339 string I/O\ Error\ reading\ boot\ sector\r \b, Visopsys MBR +>349 string No\ bootable\ partition\ found\r +>>379 string I/O\ Error\ reading\ boot\ sector\r \b, simple Visopsys MBR +# bootloader, bootmanager +>0x40 string SBML +# label with 11 characters of FAT 12 bit filesystem +>>43 string SMART\ BTMGR +>>>430 string SBMK\ Bad!\r +>>>>3 string SBM \b, Smart Boot Manager +>>>>>6 string >\0 \b, version %s +>382 string XOSLLOADXCF \b, eXtended Operating System Loader +>6 string LILO \b, LInux i386 boot LOader +>>120 string LILO \b, version 22.3.4 SuSe +>>172 string LILO \b, version 22.5.8 Debian +# updated by Joerg Jenderek +# variables according to grub-0.97/stage1/stage1.S or +# http://www.gnu.org/software/grub/manual/grub.html#Embedded-data +# usual values are marked with comments to get only informations of strange GRUB loaders +>0 ulelong 0x009048EB +>>0x41 ubyte <2 +>>>0x3E ubyte >2 \b; GRand Unified Bootloader +# 0x3 for 0.5.95,0.93,0.94,0.96 0x4 for 1.90 +>>>>0x3E ubyte x \b, stage1 version 0x%x +#If it is 0xFF, use a drive passed by BIOS +>>>>0x40 ubyte <0xFF \b, boot drive 0x%x +# in most case 0,1,0x2e for GRUB 0.5.95 +>>>>0x41 ubyte >0 \b, LBA flag 0x%x +>>>>0x42 uleshort <0x8000 \b, stage2 address 0x%x +#>>>>0x42 uleshort =0x8000 \b, stage2 address 0x%x (usual) +>>>>0x42 uleshort >0x8000 \b, stage2 address 0x%x +#>>>>0x44 ulelong =1 \b, 1st sector stage2 0x%x (default) +>>>>0x44 ulelong >1 \b, 1st sector stage2 0x%x +>>>>0x48 uleshort <0x800 \b, stage2 segment 0x%x +#>>>>0x48 uleshort =0x800 \b, stage2 segment 0x%x (usual) +>>>>0x48 uleshort >0x800 \b, stage2 segment 0x%x +>>>>402 string Geom\0Hard\ Disk\0Read\0\ Error\0 +>>>>>394 string stage1 \b, GRUB version 0.5.95 +>>>>382 string Geom\0Hard\ Disk\0Read\0\ Error\0 +>>>>>376 string GRUB\ \0 \b, GRUB version 0.93 or 1.94 +>>>>383 string Geom\0Hard\ Disk\0Read\0\ Error\0 +>>>>>377 string GRUB\ \0 \b, GRUB version 0.94 +>>>>385 string Geom\0Hard\ Disk\0Read\0\ Error\0 +>>>>>379 string GRUB\ \0 \b, GRUB version 0.95 or 0.96 +>>>>391 string Geom\0Hard\ Disk\0Read\0\ Error\0 +>>>>>385 string GRUB\ \0 \b, GRUB version 0.97 +#unkown version +>>>343 string Geom\0Read\0\ Error\0 +>>>>321 string Loading\ stage1.5 \b, GRUB version x.y +>>>380 string Geom\0Hard\ Disk\0Read\0\ Error\0 +>>>>374 string GRUB\ \0 \b, GRUB version n.m +# http://syslinux.zytor.com/ +>478 string Boot\ failed\r +>>495 string LDLINUX\ SYS \b, SYSLINUX bootloader (1.62) +>480 string Boot\ failed\r +>>495 string LDLINUX\ SYS \b, SYSLINUX bootloader (2.06 or 2.11) +>484 string Boot\ error\r \b, SYSLINUX bootloader (3.11) +>395 string chksum\0\ ERROR!\0 \b, Gujin bootloader +# http://www.bcdwb.de/bcdw/index_e.htm +>3 string BCDL +>>498 string BCDL\ \ \ \ BIN \b, Bootable CD Loader (1.50Z) +# mbr partion table entries +# OEM-ID not Microsoft,SYSLINUX,or MTOOLs +>3 string !MS +>>3 string !SYSLINUX +>>>3 string !MTOOL +# not FAT (32 bit) +>>>>82 string !FAT32 +#not IO.SYS +>>>>>472 string !IO\ \ \ \ \ \ SYS +#not Linux kernel +>>>>>>514 string !HdrS +# active flag 0 or 0x80 and type > 0 +>>>>>>>446 ubyte <0x81 +>>>>>>>>446 ubyte&0x7F 0 +>>>>>>>>>>>450 ubyte >0 \b; partition 1: ID=0x%x +>>>>>>>>>>446 ubyte 0x80 \b, active +>>>>>>>>>>447 ubyte x \b, starthead %u +#>>>>>>>>>>448 ubyte x \b, start C_S: 0x%x +#>>>>>>>>>>448 ubeshort&1023 x \b, startcylinder? %d +>>>>>>>>>>454 ulelong x \b, startsector %u +>>>>>>>>>>458 ulelong x \b, %u sectors +# +>>>>>>>462 ubyte <0x81 +>>>>>>>>462 ubyte&0x7F 0 +>>>>>>>>>466 ubyte >0 \b; partition 2: ID=0x%x +>>>>>>>>>>462 ubyte 0x80 \b, active +>>>>>>>>>>463 ubyte x \b, starthead %u +#>>>>>>>>>>464 ubyte x \b, start C_S: 0x%x +#>>>>>>>>>>464 ubeshort&1023 x \b, startcylinder? %d +>>>>>>>>>>470 ulelong x \b, startsector %u +>>>>>>>>>>474 ulelong x \b, %u sectors +# +>>>>>>>478 ubyte <0x81 +>>>>>>>>478 ubyte&0x7F 0 +>>>>>>>>>482 ubyte >0 \b; partition 3: ID=0x%x +>>>>>>>>>>478 ubyte 0x80 \b, active +>>>>>>>>>>479 ubyte x \b, starthead %u +#>>>>>>>>>>480 ubyte x \b, start C_S: 0x%x +#>>>>>>>>>>481 ubyte x \b, start C2S: 0x%x +#>>>>>>>>>>480 ubeshort&1023 x \b, startcylinder? %d +>>>>>>>>>>486 ulelong x \b, startsector %u +>>>>>>>>>>490 ulelong x \b, %u sectors +# +>>>>>>>494 ubyte <0x81 +>>>>>>>>494 ubyte&0x7F 0 +>>>>>>>>>498 ubyte >0 \b; partition 4: ID=0x%x +>>>>>>>>>>494 ubyte 0x80 \b, active +>>>>>>>>>>495 ubyte x \b, starthead %u +#>>>>>>>>>>496 ubyte x \b, start C_S: 0x%x +#>>>>>>>>>>496 ubeshort&1023 x \b, startcylinder? %d +>>>>>>>>>>502 ulelong x \b, startsector %u +>>>>>>>>>>506 ulelong x \b, %u sectors +# mbr partion table entries end +# http://www.acronis.de/ +#FAT label=ACRONIS\ SZ +#OEM-ID=BOOTWIZ0 +>442 string Non-system\ disk,\ +>>459 string press\ any\ key...\x7\0 \b, Acronis Startup Recovery Loader +# DOS names like F11.SYS are 8 right space padded bytes+3 bytes +>>>477 ubyte&0xDF >0 +>>>>477 string x \b %-.3s +>>>>>480 ubyte&0xDF >0 +>>>>>>480 string x \b%-.5s +>>>>485 ubyte&0xDF >0 +>>>>>485 string x \b.%-.3s +# +>185 string FDBOOT\ Version\ +>>204 string \rNo\ Systemdisk.\ +>>>220 string Booting\ from\ harddisk.\n\r +>>>245 string Cannot\ load\ from\ harddisk.\n\r +>>>>273 string Insert\ Systemdisk\ +>>>>>291 string and\ press\ any\ key.\n\r \b, FDBOOT harddisk Bootloader +>>>>>>200 string >\0 \b, version %-3s +>242 string Bootsector\ from\ C.H.\ Hochst\204 +>>278 string No\ Systemdisk.\ +>>>293 string Booting\ from\ harddisk.\n\r +>>>441 string Cannot\ load\ from\ harddisk.\n\r +>>>>469 string Insert\ Systemdisk\ +>>>>>487 string and\ press\ any\ key.\n\r \b, WinImage harddisk Bootloader +>>>>>>209 string >\0 \b, version %-4.4s +>(1.b+2) ubyte 0xe +>>(1.b+3) ubyte 0x1f +>>>(1.b+4) ubyte 0xbe +>>>>(1.b+5) ubyte 0x77 +>>>>(1.b+6) ubyte 0x7c +>>>>>(1.b+7) ubyte 0xac +>>>>>>(1.b+8) ubyte 0x22 +>>>>>>>(1.b+9) ubyte 0xc0 +>>>>>>>>(1.b+10) ubyte 0x74 +>>>>>>>>>(1.b+11) ubyte 0xb +>>>>>>>>>>(1.b+12) ubyte 0x56 +>>>>>>>>>>(1.b+13) ubyte 0xb4 \b, mkdosfs boot message display +>103 string This\ is\ not\ a\ bootable\ disk.\ +>>132 string Please\ insert\ a\ bootable\ +>>>157 string floppy\ and\r\n +>>>>169 string press\ any\ key\ to\ try\ again...\r \b, FREE-DOS message display +# +>66 string Solaris\ Boot\ Sector +>>99 string Incomplete\ MDBoot\ load. +>>>89 string Version \b, Sun Solaris Bootloader +>>>>97 byte x version %c +# +>408 string OS/2\ !!\ SYS01475\r\0 +>>429 string OS/2\ !!\ SYS02025\r\0 +>>>450 string OS/2\ !!\ SYS02027\r\0 +>>>469 string OS2BOOT\ \ \ \ \b, IBM OS/2 Warp bootloader +# +>409 string OS/2\ !!\ SYS01475\r\0 +>>430 string OS/2\ !!\ SYS02025\r\0 +>>>451 string OS/2\ !!\ SYS02027\r\0 +>>>470 string OS2BOOT\ \ \ \ \b, IBM OS/2 Warp Bootloader +>112 string This\ disk\ is\ not\ bootable\r +>>142 string If\ you\ wish\ to\ make\ it\ bootable +>>>176 string run\ the\ DOS\ program\ SYS\ +>>>200 string after\ the\r +>>>>216 string system\ has\ been\ loaded\r\n +>>>>>242 string Please\ insert\ a\ DOS\ diskette\ +>>>>>271 string into\r\n\ the\ drive\ and\ +>>>>>>292 string strike\ any\ key...\0 \b, IBM OS/2 Warp message display +# XP +>430 string NTLDR\ is\ missing\xFF\r\n +>>449 string Disk\ error\xFF\r\n +>>>462 string Press\ any\ key\ to\ restart\r \b, Microsoft Windows XP Bootloader +# DOS names like NTLDR,CMLDR,$LDR$ are 8 right space padded bytes+3 bytes +>>>>417 ubyte&0xDF >0 +>>>>>417 string x %-.5s +>>>>>>422 ubyte&0xDF >0 +>>>>>>>422 string x \b%-.3s +>>>>>425 ubyte&0xDF >0 +>>>>>>425 string >\ \b.%-.3s +# +>>>>371 ubyte >0x20 +>>>>>368 ubyte&0xDF >0 +>>>>>>368 string x %-.5s +>>>>>>>373 ubyte&0xDF >0 +>>>>>>>>373 string x \b%-.3s +>>>>>>376 ubyte&0xDF >0 +>>>>>>>376 string x \b.%-.3s +# +>430 string NTLDR\ nicht\ gefunden\xFF\r\n +>>453 string Datentr\204gerfehler\xFF\r\n +>>>473 string Neustart\ mit\ beliebiger\ Taste\r \b, Microsoft Windows XP Bootloader (german) +>>>>417 ubyte&0xDF >0 +>>>>>417 string x %-.5s +>>>>>>422 ubyte&0xDF >0 +>>>>>>>422 string x \b%-.3s +>>>>>425 ubyte&0xDF >0 +>>>>>>425 string >\ \b.%-.3s +# offset variant +>>>>379 string \0 +>>>>>368 ubyte&0xDF >0 +>>>>>>368 string x %-.5s +>>>>>>>373 ubyte&0xDF >0 +>>>>>>>>373 string x \b%-.3s +# +>430 string NTLDR\ fehlt\xFF\r\n +>>444 string Datentr\204gerfehler\xFF\r\n +>>>464 string Neustart\ mit\ beliebiger\ Taste\r \b, Microsoft Windows XP Bootloader (2.german) +>>>>417 ubyte&0xDF >0 +>>>>>417 string x %-.5s +>>>>>>422 ubyte&0xDF >0 +>>>>>>>422 string x \b%-.3s +>>>>>425 ubyte&0xDF >0 +>>>>>>425 string >\ \b.%-.3s +# variant +>>>>371 ubyte >0x20 +>>>>>368 ubyte&0xDF >0 +>>>>>>368 string x %-.5s +>>>>>>>373 ubyte&0xDF >0 +>>>>>>>>373 string x \b%-.3s +>>>>>>376 ubyte&0xDF >0 +>>>>>>>376 string x \b.%-.3s +# +>430 string NTLDR\ fehlt\xFF\r\n +>>444 string Medienfehler\xFF\r\n +>>>459 string Neustart:\ Taste\ dr\201cken\r \b, Microsoft Windows XP Bootloader (3.german) +>>>>371 ubyte >0x20 +>>>>>368 ubyte&0xDF >0 +>>>>>>368 string x %-.5s +>>>>>>>373 ubyte&0xDF >0 +>>>>>>>>373 string x \b%-.3s +>>>>>>376 ubyte&0xDF >0 +>>>>>>>376 string x \b.%-.3s +# variant +>>>>417 ubyte&0xDF >0 +>>>>>417 string x %-.5s +>>>>>>422 ubyte&0xDF >0 +>>>>>>>422 string x \b%-.3s +>>>>>425 ubyte&0xDF >0 +>>>>>>425 string >\ \b.%-.3s +# +>430 string Datentr\204ger\ entfernen\xFF\r\n +>>454 string Medienfehler\xFF\r\n +>>>469 string Neustart:\ Taste\ dr\201cken\r \b, Microsoft Windows XP Bootloader (4.german) +>>>>368 ubyte&0xDF >0 +>>>>>368 string x %-.5s +>>>>>>373 ubyte&0xDF >0 +>>>>>>>373 string x \b%-.3s +>>>>>376 ubyte&0xDF >0 +>>>>>>376 string x \b.%-.3s +#>3 string NTFS\ \ \ \ +>389 string Fehler\ beim\ Lesen\ +>>407 string des\ Datentr\204gers +>>>426 string NTLDR\ fehlt +>>>>440 string NTLDR\ ist\ komprimiert +>>>>>464 string Neustart\ mit\ Strg+Alt+Entf\r \b, Microsoft Windows XP Bootloader NTFS (german) +#>3 string NTFS\ \ \ \ +>313 string A\ disk\ read\ error\ occurred.\r +>>345 string A\ kernel\ file\ is\ missing\ +>>>370 string from\ the\ disk.\r +>>>>484 string NTLDR\ is\ compressed +>>>>>429 string Insert\ a\ system\ diskette\ +>>>>>>454 string and\ restart\r\nthe\ system.\r \b, Microsoft Windows XP Bootloader NTFS +# DOS loader variants different languages,offsets +>472 ubyte&0xDF >0 +>>389 string Invalid\ system\ disk\xFF\r\n +>>>411 string Disk\ I/O\ error +>>>>428 string Replace\ the\ disk,\ and\ +>>>>>455 string press\ any\ key \b, Microsoft Windows 98 Bootloader +#IO.SYS +>>>>>>472 ubyte&0xDF >0 +>>>>>>>472 string x \b %-.2s +>>>>>>>>474 ubyte&0xDF >0 +>>>>>>>>>474 string x \b%-.5s +>>>>>>>>>>479 ubyte&0xDF >0 +>>>>>>>>>>>479 string x \b%-.1s +>>>>>>>480 ubyte&0xDF >0 +>>>>>>>>480 string x \b.%-.3s +#MSDOS.SYS +>>>>>>>483 ubyte&0xDF >0 \b+ +>>>>>>>>483 string x \b%-.5s +>>>>>>>>>488 ubyte&0xDF >0 +>>>>>>>>>>488 string x \b%-.3s +>>>>>>>>491 ubyte&0xDF >0 +>>>>>>>>>491 string x \b.%-.3s +# +>>390 string Invalid\ system\ disk\xFF\r\n +>>>412 string Disk\ I/O\ error\xFF\r\n +>>>>429 string Replace\ the\ disk,\ and\ +>>>>>451 string then\ press\ any\ key\r \b, Microsoft Windows 98 Bootloader +>>388 string Ungueltiges\ System\ \xFF\r\n +>>>410 string E/A-Fehler\ \ \ \ \xFF\r\n +>>>>427 string Datentraeger\ wechseln\ und\ +>>>>>453 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (german) +#WINBOOT.SYS only not spaces (0xDF) +>>>>>>497 ubyte&0xDF >0 +>>>>>>>497 string x %-.5s +>>>>>>>>502 ubyte&0xDF >0 +>>>>>>>>>502 string x \b%-.1s +>>>>>>>>>>503 ubyte&0xDF >0 +>>>>>>>>>>>503 string x \b%-.1s +>>>>>>>>>>>>504 ubyte&0xDF >0 +>>>>>>>>>>>>>504 string x \b%-.1s +>>>>>>505 ubyte&0xDF >0 +>>>>>>>505 string x \b.%-.3s +#IO.SYS +>>>>>>472 ubyte&0xDF >0 or +>>>>>>>472 string x \b %-.2s +>>>>>>>>474 ubyte&0xDF >0 +>>>>>>>>>474 string x \b%-.5s +>>>>>>>>>>479 ubyte&0xDF >0 +>>>>>>>>>>>479 string x \b%-.1s +>>>>>>>480 ubyte&0xDF >0 +>>>>>>>>480 string x \b.%-.3s +#MSDOS.SYS +>>>>>>>483 ubyte&0xDF >0 \b+ +>>>>>>>>483 string x \b%-.5s +>>>>>>>>>488 ubyte&0xDF >0 +>>>>>>>>>>488 string x \b%-.3s +>>>>>>>>491 ubyte&0xDF >0 +>>>>>>>>>491 string x \b.%-.3s +# +>>390 string Ungueltiges\ System\ \xFF\r\n +>>>412 string E/A-Fehler\ \ \ \ \xFF\r\n +>>>>429 string Datentraeger\ wechseln\ und\ +>>>>>455 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (German) +#WINBOOT.SYS only not spaces (0xDF) +>>>>>>497 ubyte&0xDF >0 +>>>>>>>497 string x %-.7s +>>>>>>>>504 ubyte&0xDF >0 +>>>>>>>>>504 string x \b%-.1s +>>>>>>505 ubyte&0xDF >0 +>>>>>>>505 string x \b.%-.3s +#IO.SYS +>>>>>>472 ubyte&0xDF >0 or +>>>>>>>472 string x \b %-.2s +>>>>>>>>474 ubyte&0xDF >0 +>>>>>>>>>474 string x \b%-.6s +>>>>>>>480 ubyte&0xDF >0 +>>>>>>>>480 string x \b.%-.3s +#MSDOS.SYS +>>>>>>>483 ubyte&0xDF >0 \b+ +>>>>>>>>483 string x \b%-.5s +>>>>>>>>>488 ubyte&0xDF >0 +>>>>>>>>>>488 string x \b%-.3s +>>>>>>>>491 ubyte&0xDF >0 +>>>>>>>>>491 string x \b.%-.3s +# +>>389 string Ungueltiges\ System\ \xFF\r\n +>>>411 string E/A-Fehler\ \ \ \ \xFF\r\n +>>>>428 string Datentraeger\ wechseln\ und\ +>>>>>454 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (GERMAN) +# DOS names like IO.SYS,WINBOOT.SYS,MSDOS.SYS,WINBOOT.INI are 8 right space padded bytes+3 bytes +>>>>>>472 string x %-.2s +>>>>>>>474 ubyte&0xDF >0 +>>>>>>>>474 string x \b%-.5s +>>>>>>>>479 ubyte&0xDF >0 +>>>>>>>>>479 string x \b%-.1s +>>>>>>480 ubyte&0xDF >0 +>>>>>>>480 string x \b.%-.3s +>>>>>>483 ubyte&0xDF >0 \b+ +>>>>>>>483 string x \b%-.5s +>>>>>>>488 ubyte&0xDF >0 +>>>>>>>>488 string x \b%-.2s +>>>>>>>>490 ubyte&0xDF >0 +>>>>>>>>>490 string x \b%-.1s +>>>>>>>491 ubyte&0xDF >0 +>>>>>>>>491 string x \b.%-.3s +>479 ubyte&0xDF >0 +>>416 string Kein\ System\ oder\ +>>>433 string Laufwerksfehler +>>>>450 string Wechseln\ und\ Taste\ dr\201cken \b, Microsoft DOS Bootloader (german) +#IO.SYS +>>>>>479 string x \b %-.2s +>>>>>>481 ubyte&0xDF >0 +>>>>>>>481 string x \b%-.6s +>>>>>487 ubyte&0xDF >0 +>>>>>>487 string x \b.%-.3s +#MSDOS.SYS +>>>>>>490 ubyte&0xDF >0 \b+ +>>>>>>>490 string x \b%-.5s +>>>>>>>>495 ubyte&0xDF >0 +>>>>>>>>>495 string x \b%-.3s +>>>>>>>498 ubyte&0xDF >0 +>>>>>>>>498 string x \b.%-.3s +# +>486 ubyte&0xDF >0 +>>416 string Non-System\ disk\ or\ +>>>435 string disk\ error\r +>>>>447 string Replace\ and\ press\ any\ key\ +>>>>>473 string when\ ready\r \b, Microsoft DOS Bootloader +>480 ubyte&0xDF >0 +>>393 string Non-System\ disk\ or\ +>>>412 string disk\ error\r +>>>>424 string Replace\ and\ press\ any\ key\ +>>>>>450 string when\ ready\r \b, Microsoft DOS bootloader +#IO.SYS +>>>>>480 string x \b %-.2s +>>>>>>482 ubyte&0xDF >0 +>>>>>>>48 string x \b%-.6s +>>>>>488 ubyte&0xDF >0 +>>>>>>488 string x \b.%-.3s +#MSDOS.SYS +>>>>>>491 ubyte&0xDF >0 \b+ +>>>>>>>491 string x \b%-.5s +>>>>>>>>496 ubyte&0xDF >0 +>>>>>>>>>496 string x \b%-.3s +>>>>>>>499 ubyte&0xDF >0 +>>>>>>>>499 string x \b.%-.3s +#>43 string \224R-LOADER\ \ SYS =label +>54 string SYS +>>324 string VASKK +>>>495 string NEWLDR\0 \b, DR-DOS Bootloader (LOADER.SYS) +# +>70 string IBMBIO\ \ COM +>>472 string Cannot\ load\ DOS!\ +>>>489 string Any\ key\ to\ retry \b, DR-DOS Bootloader +>>471 string Cannot\ load\ DOS\ +>>487 string press\ key\ to\ retry \b, Open-DOS Bootloader +>444 string KERNEL\ \ SYS +>>314 string BOOT\ error! \b, FREE-DOS Bootloader +>499 string KERNEL\ \ SYS +>>305 string BOOT\ err!\0 \b, Free-DOS Bootloader +>449 string KERNEL\ \ SYS +>>319 string BOOT\ error! \b, FREE-DOS 0.5 Bootloader +>125 string Loading\ FreeDOS...\r +>>311 string BOOT\ error!\r \b, FREE-DOS bootloader +>>>441 ubyte&0xDF >0 +>>>>441 string x \b %-.6s +>>>>>447 ubyte&0xDF >0 +>>>>>>447 string x \b%-.1s +>>>>>>>448 ubyte&0xDF >0 +>>>>>>>>448 string x \b%-.1s +>>>>449 ubyte&0xDF >0 +>>>>>449 string x \b.%-.3s +>124 string FreeDOS\0 +>>331 string \ err\0 \b, FREE-DOS BETa 0.9 Bootloader +# DOS names like KERNEL.SYS,KERNEL16.SYS,KERNEL32.SYS,METAKERN.SYS are 8 right space padded bytes+3 bytes +>>>497 ubyte&0xDF >0 +>>>>497 string x \b %-.6s +>>>>>503 ubyte&0xDF >0 +>>>>>>503 string x \b%-.1s +>>>>>>>504 ubyte&0xDF >0 +>>>>>>>>504 string x \b%-.1s +>>>>505 ubyte&0xDF >0 +>>>>>505 string x \b.%-.3s +>>333 string \ err\0 \b, FREE-DOS BEta 0.9 Bootloader +>>>497 ubyte&0xDF >0 +>>>>497 string x \b %-.6s +>>>>>503 ubyte&0xDF >0 +>>>>>>503 string x \b%-.1s +>>>>>>>504 ubyte&0xDF >0 +>>>>>>>>504 string x \b%-.1s +>>>>505 ubyte&0xDF >0 +>>>>>505 string x \b.%-.3s +>>334 string \ err\0 \b, FREE-DOS Beta 0.9 Bootloader +>>>497 ubyte&0xDF >0 +>>>>497 string x \b %-.6s +>>>>>503 ubyte&0xDF >0 +>>>>>>503 string x \b%-.1s +>>>>>>>504 ubyte&0xDF >0 +>>>>>>>>504 string x \b%-.1s +>>>>505 ubyte&0xDF >0 +>>>>>505 string x \b.%-.3s +>336 string Error!\ +>>343 string Hit\ a\ key\ to\ reboot. \b, FREE-DOS Beta 0.9sr1 Bootloader +>>>497 ubyte&0xDF >0 +>>>>497 string x \b %-.6s +>>>>>503 ubyte&0xDF >0 +>>>>>>503 string x \b%-.1s +>>>>>>>504 ubyte&0xDF >0 +>>>>>>>>504 string x \b%-.1s +>>>>505 ubyte&0xDF >0 +>>>>>505 string x \b.%-.3s +# added by Joerg Jenderek +# http://www.visopsys.org/ +# http://partitionlogic.org.uk/ +# OEM-ID=Visopsys +>478 ulelong 0 +>>(1.b+326) string I/O\ Error\ reading\ +>>>(1.b+344) string Visopsys\ loader\r +>>>>(1.b+361) string Press\ any\ key\ to\ continue.\r \b, Visopsys loader +# http://alexfru.chat.ru/epm.html#bootprog +>494 ubyte >0x4D +>>495 string >E +>>>495 string >>>3 string BootProg +# It just looks for a program file name at the root directory +# and loads corresponding file with following execution. +# DOS names like STARTUP.BIN,STARTUPC.COM,STARTUPE.EXE are 8 right space padded bytes+3 bytes +>>>>499 ubyte&0xDF >0 \b, COM/EXE Bootloader +>>>>>499 string x \b %-.1s +>>>>>>500 ubyte&0xDF >0 +>>>>>>>500 string x \b%-.1s +>>>>>>>>501 ubyte&0xDF >0 +>>>>>>>>>501 string x \b%-.1s +>>>>>>>>>>502 ubyte&0xDF >0 +>>>>>>>>>>>502 string x \b%-.1s +>>>>>>>>>>>>503 ubyte&0xDF >0 +>>>>>>>>>>>>>503 string x \b%-.1s +>>>>>>>>>>>>>>504 ubyte&0xDF >0 +>>>>>>>>>>>>>>>504 string x \b%-.1s +>>>>>>>>>>>>>>>>505 ubyte&0xDF >0 +>>>>>>>>>>>>>>>>>505 string x \b%-.1s +>>>>>>>>>>>>>>>>>>506 ubyte&0xDF >0 +>>>>>>>>>>>>>>>>>>>506 string x \b%-.1s +#name extension +>>>>>507 ubyte&0xDF >0 \b. +>>>>>>507 string x \b%-.1s +>>>>>>>508 ubyte&0xDF >0 +>>>>>>>>508 string x \b%-.1s +>>>>>>>>>509 ubyte&0xDF >0 +>>>>>>>>>>509 string x \b%-.1s +#If the boot sector fails to read any other sector, +#it prints a very short message ("RE") to the screen and hangs the computer. +#If the boot sector fails to find needed program in the root directory, +#it also hangs with another message ("NF"). +>>>>>492 string RENF \b, FAT (12 bit) +>>>>>495 string RENF \b, FAT (16 bit) +# http://alexfru.chat.ru/epm.html#bootprog +>494 ubyte >0x4D +>>495 string >E +>>>495 string >>>3 string BootProg +# It just looks for a program file name at the root directory +# and loads corresponding file with following execution. +# DOS names like STARTUP.BIN,STARTUPC.COM,STARTUPE.EXE are 8 right space padded bytes+3 bytes +>>>>499 ubyte&0xDF >0 \b, COM/EXE Bootloader +>>>>>499 string x \b %-.1s +>>>>>>500 ubyte&0xDF >0 +>>>>>>>500 string x \b%-.1s +>>>>>>>>501 ubyte&0xDF >0 +>>>>>>>>>501 string x \b%-.1s +>>>>>>>>>>502 ubyte&0xDF >0 +>>>>>>>>>>>502 string x \b%-.1s +>>>>>>>>>>>>503 ubyte&0xDF >0 +>>>>>>>>>>>>>503 string x \b%-.1s +>>>>>>>>>>>>>>504 ubyte&0xDF >0 +>>>>>>>>>>>>>>>504 string x \b%-.1s +>>>>>>>>>>>>>>>>505 ubyte&0xDF >0 +>>>>>>>>>>>>>>>>>505 string x \b%-.1s +>>>>>>>>>>>>>>>>>>506 ubyte&0xDF >0 +>>>>>>>>>>>>>>>>>>>506 string x \b%-.1s +#name extension +>>>>>507 ubyte&0xDF >0 \b. +>>>>>>507 string x \b%-.1s +>>>>>>>508 ubyte&0xDF >0 +>>>>>>>>508 string x \b%-.1s +>>>>>>>>>509 ubyte&0xDF >0 +>>>>>>>>>>509 string x \b%-.1s +#If the boot sector fails to read any other sector, +#it prints a very short message ("RE") to the screen and hangs the computer. +#If the boot sector fails to find needed program in the root directory, +#it also hangs with another message ("NF"). +>>>>>492 string RENF \b, FAT (12 bit) +>>>>>495 string RENF \b, FAT (16 bit) +# loader end +# Joerg Jenderek +>446 ubyte 0 +>>450 ubyte >0 +>>>482 ubyte 0 +>>>>498 ubyte 0 +>>>>466 ubyte 0x05 \b, extended partition table +>>>>466 ubyte 0x0F \b, extended partition table (LBA) +>>>>466 ubyte 0x0 \b, extended partition table (last) +# JuMP short bootcodeoffset NOP assembler instructions will usually be EB xx 90 +# older drives may use E9 xx xx +>0 lelong&0x009000EB 0x009000EB +>0 lelong&0x000000E9 0x000000E9 +>>1 ubyte >37 \b, code offset 0x%x +# mtools-3.9.8/msdos.h +# usual values are marked with comments to get only informations of strange FAT systems +# valid sectorsize are from 32 to 2048 +>>>11 uleshort <2049 +>>>>11 uleshort >31 +>>>>>3 string >\0 \b, OEM-ID "%8.8s" +>>>>>11 uleshort >512 \b, Bytes/sector %u +#>>>>>11 uleshort =512 \b, Bytes/sector %u=512 (usual) +>>>>>11 uleshort <512 \b, Bytes/sector %u +>>>>>13 ubyte >1 \b, sectors/cluster %u +#>>>>>13 ubyte =1 \b, sectors/cluster %u (usual on Floppies) +>>>>>14 uleshort >32 \b, reserved sectors %u +#>>>>>14 uleshort =32 \b, reserved sectors %u (usual Fat32) +#>>>>>14 uleshort >1 \b, reserved sectors %u +#>>>>>14 uleshort =1 \b, reserved sectors %u (usual FAT12,FAT16) +>>>>>14 uleshort <1 \b, reserved sectors %u +>>>>>16 ubyte >2 \b, FATs %u +#>>>>>16 ubyte =2 \b, FATs %u (usual) +>>>>>16 ubyte =1 \b, FAT %u +>>>>>16 ubyte >0 +>>>>>17 uleshort >0 \b, root entries %u +#>>>>>17 uleshort =0 \b, root entries %u=0 (usual Fat32) +>>>>>19 uleshort >0 \b, sectors %u (volumes <=32 MB) +#>>>>>19 uleshort =0 \b, sectors %u=0 (usual Fat32) +>>>>>21 ubyte >0xF0 \b, Media descriptor 0x%x +#>>>>>21 ubyte =0xF0 \b, Media descriptor 0x%x (usual floppy) +>>>>>21 ubyte <0xF0 \b, Media descriptor 0x%x +>>>>>22 uleshort >0 \b, sectors/FAT %u +#>>>>>22 uleshort =0 \b, sectors/FAT %u=0 (usual Fat32) +>>>>>26 ubyte >2 \b, heads %u +#>>>>>26 ubyte =2 \b, heads %u (usual floppy) +>>>>>26 ubyte =1 \b, heads %u +>>>>>28 ulelong >0 \b, hidden sectors %u +#>>>>>28 ulelong =0 \b, hidden sectors %u (usual floppy) +>>>>>32 ulelong >0 \b, sectors %u (volumes > 32 MB) +#>>>>>32 ulelong =0 \b, sectors %u (volumes > 32 MB) +# FAT<32 specific +# NOT le FAT3=NOT 3TAF=0xCCABBEB9 +>>>>>82 ulelong&0xCCABBEB9 >0 +>>>>>>36 ubyte >0x80 \b, physical drive 0x%x +#>>>>>>36 ubyte =0x80 \b, physical drive 0x%x=0x80 (usual harddisk) +>>>>>>36 ubyte&0x7F >0 \b, physical drive 0x%x +#>>>>>>36 ubyte =0 \b, physical drive 0x%x=0 (usual floppy) +>>>>>>37 ubyte >0 \b, reserved 0x%x +#>>>>>>37 ubyte =0 \b, reserved 0x%x +>>>>>>38 ubyte >0x29 \b, dos < 4.0 BootSector (0x%x) +>>>>>>38 ubyte <0x29 \b, dos < 4.0 BootSector (0x%x) +>>>>>>38 ubyte =0x29 +>>>>>>>39 ulelong x \b, serial number 0x%x +>>>>>>>43 string >>>>>>43 string >NO\ NAME \b, label: "%11.11s" +>>>>>>>43 string =NO\ NAME \b, unlabeled +>>>>>>54 string FAT \b, FAT +>>>>>>>54 string FAT12 \b (12 bit) +>>>>>>>54 string FAT16 \b (16 bit) +# FAT32 specific +>>>>>82 string FAT32 \b, FAT (32 bit) +>>>>>>36 ulelong x \b, sectors/FAT %u +>>>>>>40 uleshort >0 \b, extension flags %u +#>>>>>>40 uleshort =0 \b, extension flags %u +>>>>>>42 uleshort >0 \b, fsVersion %u +#>>>>>>42 uleshort =0 \b, fsVersion %u (usual) +>>>>>>44 ulelong >2 \b, rootdir cluster %u +#>>>>>>44 ulelong =2 \b, rootdir cluster %u +#>>>>>>44 ulelong =1 \b, rootdir cluster %u +>>>>>>48 uleshort >1 \b, infoSector %u +#>>>>>>48 uleshort =1 \b, infoSector %u (usual) +>>>>>>48 uleshort <1 \b, infoSector %u +>>>>>>50 uleshort >6 \b, Backup boot sector %u +#>>>>>>50 uleshort =6 \b, Backup boot sector %u (usual) +>>>>>>50 uleshort <6 \b, Backup boot sector %u +>>>>>>54 ulelong >0 \b, reserved1 0x%x +>>>>>>58 ulelong >0 \b, reserved2 0x%x +>>>>>>62 ulelong >0 \b, reserved3 0x%x +# same structure as FAT1X +>>>>>>64 ubyte >0x80 \b, physical drive 0x%x +#>>>>>>64 ubyte =0x80 \b, physical drive 0x%x=80 (usual harddisk) +>>>>>>64 ubyte&0x7F >0 \b, physical drive 0x%x +#>>>>>>64 ubyte =0 \b, physical drive 0x%x=0 (usual floppy) +>>>>>>65 ubyte >0 \b, reserved 0x%x +>>>>>>66 ubyte >0x29 \b, dos < 4.0 BootSector (0x%x) +>>>>>>66 ubyte <0x29 \b, dos < 4.0 BootSector (0x%x) +>>>>>>66 ubyte =0x29 +>>>>>>>67 ulelong x \b, serial number 0x%x +>>>>>>>71 string >>>>>71 string >NO\ NAME \b, label: "%11.11s" +>>>>>>71 string =NO\ NAME \b, unlabeled +### FATs end +>0x200 lelong 0x82564557 \b, BSD disklabel +# FATX +0 string FATX FATX filesystem data + + +# Minix filesystems - Juan Cespedes +0x410 leshort 0x137f Minix filesystem +0x410 beshort 0x137f Minix filesystem (big endian), +>0x402 beshort !0 \b, %d zones +>0x1e string minix \b, bootable +0x410 leshort 0x138f Minix filesystem, 30 char names +0x410 leshort 0x2468 Minix filesystem, version 2 +0x410 leshort 0x2478 Minix filesystem, version 2, 30 char names + +# romfs filesystems - Juan Cespedes +0 string -rom1fs-\0 romfs filesystem, version 1 +>8 belong x %d bytes, +>16 string x named %s. + +# netboot image - Juan Cespedes +0 lelong 0x1b031336L Netboot image, +>4 lelong&0xFFFFFF00 0 +>>4 lelong&0x100 0x000 mode 2 +>>4 lelong&0x100 0x100 mode 3 +>4 lelong&0xFFFFFF00 !0 unknown mode + +0x18b string OS/2 OS/2 Boot Manager + +# added by Joerg Jenderek +# In the second sector (+0x200) are variables according to grub-0.97/stage2/asm.S or +# grub-1.94/kern/i386/pc/startup.S +# http://www.gnu.org/software/grub/manual/grub.html#Embedded-data +# usual values are marked with comments to get only informations of strange GRUB loaders +0x200 uleshort 0x70EA +# found only version 3.{1,2} +>0x206 ubeshort >0x0300 +# GRUB version (0.5.)95,0.93,0.94,0.96,0.97 > "00" +>>0x212 ubyte >0x29 +>>>0x213 ubyte >0x29 +# not iso9660_stage1_5 +#>>>0 ulelong&0x00BE5652 0x00BE5652 +>>>>0x213 ubyte >0x29 GRand Unified Bootloader +# config_file for stage1_5 is 0xffffffff + default "/boot/grub/stage2" +>>>>0x217 ubyte 0xFF stage1_5 +>>>>0x217 ubyte <0xFF stage2 +>>>>0x206 ubyte x \b version %u +>>>>0x207 ubyte x \b.%u +# module_size for 1.94 +>>>>0x208 ulelong <0xffffff \b, installed partition %u +#>>>>0x208 ulelong =0xffffff \b, %u (default) +>>>>0x208 ulelong >0xffffff \b, installed partition %u +# GRUB 0.5.95 unofficial +>>>>0x20C ulelong&0x2E300000 0x2E300000 +# 0=stage2 1=ffs 2=e2fs 3=fat 4=minix 5=reiserfs +>>>>>0x20C ubyte x \b, identifier 0x%x +#>>>>>0x20D ubyte =0 \b, LBA flag 0x%x (default) +>>>>>0x20D ubyte >0 \b, LBA flag 0x%x +# GRUB version as string +>>>>>0x20E string >\0 \b, GRUB version %-s +# for stage1_5 is 0xffffffff + config_file "/boot/grub/stage2" default +>>>>>>0x215 ulong 0xffffffff +>>>>>>>0x219 string >\0 \b, configuration file %-s +>>>>>>0x215 ulong !0xffffffff +>>>>>>>0x215 string >\0 \b, configuration file %-s +# newer GRUB versions +>>>>0x20C ulelong&0x2E300000 !0x2E300000 +##>>>>>0x20C ulelong =0 \b, saved entry %d (usual) +>>>>>0x20C ulelong >0 \b, saved entry %d +# for 1.94 contains kernel image size +# for 0.93,0.94,0.96,0.97 +# 0=stage2 1=ffs 2=e2fs 3=fat 4=minix 5=reiserfs 6=vstafs 7=jfs 8=xfs 9=iso9660 a=ufs2 +>>>>>0x210 ubyte x \b, identifier 0x%x +# The flag for LBA forcing is in most cases 0 +#>>>>>0x211 ubyte =0 \b, LBA flag 0x%x (default) +>>>>>0x211 ubyte >0 \b, LBA flag 0x%x +# GRUB version as string +>>>>>0x212 string >\0 \b, GRUB version %-s +# for stage1_5 is 0xffffffff + config_file "/boot/grub/stage2" default +>>>>>0x217 ulong 0xffffffff +>>>>>>0x21b string >\0 \b, configuration file %-s +>>>>>0x217 ulong !0xffffffff +>>>>>>0x217 string >\0 \b, configuration file %-s + +9564 lelong 0x00011954 Unix Fast File system [v1] (little-endian), +>8404 string x last mounted on %s, +#>9504 ledate x last checked at %s, +>8224 ledate x last written at %s, +>8401 byte x clean flag %d, +>8228 lelong x number of blocks %d, +>8232 lelong x number of data blocks %d, +>8236 lelong x number of cylinder groups %d, +>8240 lelong x block size %d, +>8244 lelong x fragment size %d, +>8252 lelong x minimum percentage of free blocks %d, +>8256 lelong x rotational delay %dms, +>8260 lelong x disk rotational speed %drps, +>8320 lelong 0 TIME optimization +>8320 lelong 1 SPACE optimization + +42332 lelong 0x19540119 Unix Fast File system [v2] (little-endian) +>&-1164 string x last mounted on %s, +>&-696 string >\0 volume name %s, +>&-304 leqldate x last written at %s, +>&-1167 byte x clean flag %d, +>&-1168 byte x readonly flag %d, +>&-296 lequad x number of blocks %lld, +>&-288 lequad x number of data blocks %lld, +>&-1332 lelong x number of cylinder groups %d, +>&-1328 lelong x block size %d, +>&-1324 lelong x fragment size %d, +>&-180 lelong x average file size %d, +>&-176 lelong x average number of files in dir %d, +>&-272 lequad x pending blocks to free %lld, +>&-264 lelong x pending inodes to free %ld, +>&-664 lequad x system-wide uuid %0llx, +>&-1316 lelong x minimum percentage of free blocks %d, +>&-1248 lelong 0 TIME optimization +>&-1248 lelong 1 SPACE optimization + +66908 lelong 0x19540119 Unix Fast File system [v2] (little-endian) +>&-1164 string x last mounted on %s, +>&-696 string >\0 volume name %s, +>&-304 leqldate x last written at %s, +>&-1167 byte x clean flag %d, +>&-1168 byte x readonly flag %d, +>&-296 lequad x number of blocks %lld, +>&-288 lequad x number of data blocks %lld, +>&-1332 lelong x number of cylinder groups %d, +>&-1328 lelong x block size %d, +>&-1324 lelong x fragment size %d, +>&-180 lelong x average file size %d, +>&-176 lelong x average number of files in dir %d, +>&-272 lequad x pending blocks to free %lld, +>&-264 lelong x pending inodes to free %ld, +>&-664 lequad x system-wide uuid %0llx, +>&-1316 lelong x minimum percentage of free blocks %d, +>&-1248 lelong 0 TIME optimization +>&-1248 lelong 1 SPACE optimization + +9564 belong 0x00011954 Unix Fast File system [v1] (big-endian), +>7168 belong 0x4c41424c Apple UFS Volume +>>7186 string x named %s, +>>7176 belong x volume label version %d, +>>7180 bedate x created on %s, +>8404 string x last mounted on %s, +#>9504 bedate x last checked at %s, +>8224 bedate x last written at %s, +>8401 byte x clean flag %d, +>8228 belong x number of blocks %d, +>8232 belong x number of data blocks %d, +>8236 belong x number of cylinder groups %d, +>8240 belong x block size %d, +>8244 belong x fragment size %d, +>8252 belong x minimum percentage of free blocks %d, +>8256 belong x rotational delay %dms, +>8260 belong x disk rotational speed %drps, +>8320 belong 0 TIME optimization +>8320 belong 1 SPACE optimization + +42332 belong 0x19540119 Unix Fast File system [v2] (big-endian) +>&-1164 string x last mounted on %s, +>&-696 string >\0 volume name %s, +>&-304 beqldate x last written at %s, +>&-1167 byte x clean flag %d, +>&-1168 byte x readonly flag %d, +>&-296 bequad x number of blocks %lld, +>&-288 bequad x number of data blocks %lld, +>&-1332 belong x number of cylinder groups %d, +>&-1328 belong x block size %d, +>&-1324 belong x fragment size %d, +>&-180 belong x average file size %d, +>&-176 belong x average number of files in dir %d, +>&-272 bequad x pending blocks to free %lld, +>&-264 belong x pending inodes to free %ld, +>&-664 bequad x system-wide uuid %0llx, +>&-1316 belong x minimum percentage of free blocks %d, +>&-1248 belong 0 TIME optimization +>&-1248 belong 1 SPACE optimization + +66908 belong 0x19540119 Unix Fast File system [v2] (big-endian) +>&-1164 string x last mounted on %s, +>&-696 string >\0 volume name %s, +>&-304 beqldate x last written at %s, +>&-1167 byte x clean flag %d, +>&-1168 byte x readonly flag %d, +>&-296 bequad x number of blocks %lld, +>&-288 bequad x number of data blocks %lld, +>&-1332 belong x number of cylinder groups %d, +>&-1328 belong x block size %d, +>&-1324 belong x fragment size %d, +>&-180 belong x average file size %d, +>&-176 belong x average number of files in dir %d, +>&-272 bequad x pending blocks to free %lld, +>&-264 belong x pending inodes to free %ld, +>&-664 bequad x system-wide uuid %0llx, +>&-1316 belong x minimum percentage of free blocks %d, +>&-1248 belong 0 TIME optimization +>&-1248 belong 1 SPACE optimization + +# ext2/ext3 filesystems - Andreas Dilger +0x438 leshort 0xEF53 Linux +>0x44c lelong x rev %d +>0x43e leshort x \b.%d +>0x45c lelong ^0x0000004 ext2 filesystem data +>>0x43a leshort ^0x0000001 (mounted or unclean) +>0x45c lelong &0x0000004 ext3 filesystem data +>>0x460 lelong &0x0000004 (needs journal recovery) +>0x43a leshort &0x0000002 (errors) +>0x460 lelong &0x0000001 (compressed) +#>0x460 lelong &0x0000002 (filetype) +#>0x464 lelong &0x0000001 (sparse_super) +>0x464 lelong &0x0000002 (large files) + +# SGI disk labels - Nathan Scott +0 belong 0x0BE5A941 SGI disk label (volume header) + +# SGI XFS filesystem - Nathan Scott +0 belong 0x58465342 SGI XFS filesystem data +>0x4 belong x (blksz %d, +>0x68 beshort x inosz %d, +>0x64 beshort ^0x2004 v1 dirs) +>0x64 beshort &0x2004 v2 dirs) + +############################################################################ +# Minix-ST kernel floppy +0x800 belong 0x46fc2700 Atari-ST Minix kernel image +>19 string \240\5\371\5\0\011\0\2\0 \b, 720k floppy +>19 string \320\2\370\5\0\011\0\1\0 \b, 360k floppy + +############################################################################ +# Hmmm, is this a better way of detecting _standard_ floppy images ? +19 string \320\2\360\3\0\011\0\1\0 DOS floppy 360k +>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector +19 string \240\5\371\3\0\011\0\2\0 DOS floppy 720k +>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector +19 string \100\013\360\011\0\022\0\2\0 DOS floppy 1440k +>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector + +19 string \240\5\371\5\0\011\0\2\0 DOS floppy 720k, IBM +>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector +19 string \100\013\371\5\0\011\0\2\0 DOS floppy 1440k, mkdosfs +>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector + +19 string \320\2\370\5\0\011\0\1\0 Atari-ST floppy 360k +19 string \240\5\371\5\0\011\0\2\0 Atari-ST floppy 720k + +# Valid media descriptor bytes for MS-DOS: +# +# Byte Capacity Media Size and Type +# ------------------------------------------------- +# +# F0 2.88 MB 3.5-inch, 2-sided, 36-sector +# F0 1.44 MB 3.5-inch, 2-sided, 18-sector +# F9 720K 3.5-inch, 2-sided, 9-sector +# F9 1.2 MB 5.25-inch, 2-sided, 15-sector +# FD 360K 5.25-inch, 2-sided, 9-sector +# FF 320K 5.25-inch, 2-sided, 8-sector +# FC 180K 5.25-inch, 1-sided, 9-sector +# FE 160K 5.25-inch, 1-sided, 8-sector +# FE 250K 8-inch, 1-sided, single-density +# FD 500K 8-inch, 2-sided, single-density +# FE 1.2 MB 8-inch, 2-sided, double-density +# F8 ----- Fixed disk +# +# FC xxxK Apricot 70x1x9 boot disk. +# +# Originally a bitmap: +# xxxxxxx0 Not two sided +# xxxxxxx1 Double sided +# xxxxxx0x Not 8 SPT +# xxxxxx1x 8 SPT +# xxxxx0xx Not Removable drive +# xxxxx1xx Removable drive +# 11111xxx Must be one. +# +# But now it's rather random: +# 111111xx Low density disk +# 00 SS, Not 8 SPT +# 01 DS, Not 8 SPT +# 10 SS, 8 SPT +# 11 DS, 8 SPT +# +# 11111001 Double density 3½ floppy disk, high density 5¼ +# 11110000 High density 3½ floppy disk +# 11111000 Hard disk any format +# + +# CDROM Filesystems +# Modified for UDF by gerardo.cacciari@gmail.com +32769 string CD001 +>38913 string !NSR0 ISO 9660 CD-ROM filesystem data +>38913 string NSR01 UDF filesystem data (version 1.0) +>38913 string NSR02 UDF filesystem data (version 1.5) +>38913 string NSR03 UDF filesystem data (version 2.0) +>38913 string >NSR03 UDF filesystem data (unknown version, +>>38917 byte x id 'NSR0%c') +>38913 string >38917 byte x id 'NSR0%c') +# "application id" which appears to be used as a volume label +>32808 string >\0 '%s' +>34816 string \000CD001\001EL\ TORITO\ SPECIFICATION (bootable) +37633 string CD001 ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors) +32776 string CDROM High Sierra CD-ROM filesystem data + +# cramfs filesystem - russell@coker.com.au +0 lelong 0x28cd3d45 Linux Compressed ROM File System data, little endian +>4 lelong x size %d +>8 lelong &1 version #2 +>8 lelong &2 sorted_dirs +>8 lelong &4 hole_support +>32 lelong x CRC 0x%x, +>36 lelong x edition %d, +>40 lelong x %d blocks, +>44 lelong x %d files + +0 belong 0x28cd3d45 Linux Compressed ROM File System data, big endian +>4 belong x size %d +>8 belong &1 version #2 +>8 belong &2 sorted_dirs +>8 belong &4 hole_support +>32 belong x CRC 0x%x, +>36 belong x edition %d, +>40 belong x %d blocks, +>44 belong x %d files + +# reiserfs - russell@coker.com.au +0x10034 string ReIsErFs ReiserFS V3.5 +0x10034 string ReIsEr2Fs ReiserFS V3.6 +>0x1002c leshort x block size %d +>0x10032 leshort &2 (mounted or unclean) +>0x10000 lelong x num blocks %d +>0x10040 lelong 1 tea hash +>0x10040 lelong 2 yura hash +>0x10040 lelong 3 r5 hash + +# JFFS - russell@coker.com.au +0 lelong 0x34383931 Linux Journalled Flash File system, little endian +0 belong 0x34383931 Linux Journalled Flash File system, big endian + +# EST flat binary format (which isn't, but anyway) +# From: Mark Brown +0 string ESTFBINR EST flat binary + +# Aculab VoIP firmware +# From: Mark Brown +0 string VoIP\ Startup\ and Aculab VoIP firmware +>35 string x format %s + +# u-boot/PPCBoot image file +# From: Mark Brown +0 belong 0x27051956 u-boot/PPCBoot image +>4 string PPCBoot +>>12 string x version %s + +# JFFS2 file system +0 leshort 0x1984 Linux old jffs2 filesystem data little endian +0 leshort 0x1985 Linux jffs2 filesystem data little endian + +# Squashfs +0 string sqsh Squashfs filesystem, big endian, +>28 beshort x version %d. +>30 beshort x \b%d, +>28 beshort <3 +>>8 belong x %d bytes, +>28 beshort >2 +>>63 bequad x %lld bytes, +#>>67 belong x %d bytes, +>4 belong x %d inodes, +>28 beshort <2 +>>32 beshort x blocksize: %d bytes, +>28 beshort >1 +>>51 belong x blocksize: %d bytes, +>39 bedate x created: %s +0 string hsqs Squashfs filesystem, little endian, +>28 leshort x version %d. +>30 leshort x \b%d, +>28 leshort <3 +>>8 lelong x %d bytes, +>28 leshort >2 +>>63 lequad x %lld bytes, +#>>63 lelong x %d bytes, +>4 lelong x %d inodes, +>28 leshort <2 +>>32 leshort x blocksize: %d bytes, +>28 leshort >1 +>>51 lelong x blocksize: %d bytes, +>39 ledate x created: %s + +0 string td\000 floppy image data (TeleDisk) + +# AFS Dump Magic +# From: Ty Sarna +0 string \x01\xb3\xa1\x13\x22 AFS Dump +>&0 belong x (v%d) +>>&0 byte 0x76 +>>>&0 belong x Vol %d, +>>>>&0 byte 0x6e +>>>>>&0 string x %s +>>>>>>&1 byte 0x74 +>>>>>>>&0 beshort 2 +>>>>>>>>&4 bedate x on: %s +>>>>>>>>&0 bedate =0 full dump +>>>>>>>>&0 bedate !0 incremental since: %s + +#---------------------------------------------------------- +# VMS backup savesets - gerardo.cacciari@gmail.com +# +4 string \x01\x00\x01\x00\x01\x00 +>(0.s+16) string \x01\x01 +>>&(&0.b+8) byte 0x42 OpenVMS backup saveset data +>>>40 lelong x (block size %d, +>>>49 string >\0 original name '%s', +>>>2 short 1024 VAX generated) +>>>2 short 2048 AXP generated) +>>>2 short 4096 I64 generated) + +# Compaq/HP RILOE floppy image +# From: Dirk Jagdmann +0 string CPQRFBLO Compaq/HP RILOE floppy image + +#------------------------------------------------------------------------------ +# Files-11 On-Disk Structure (OpenVMS file system) - gerardo.cacciari@gmail.com +# These bits come from LBN 1 (home block) of ODS-2 and ODS-5 volumes, which is +# mapped to VBN 2 of [000000]INDEXF.SYS;1 +# +1008 string DECFILE11B Files-11 On-Disk Structure +>525 byte x Level %d +>525 byte x (ODS-%d OpenVMS file system), +>984 string x volume label is '%-12.12s' + +#------------------------------------------------------------------------------ +# flash: file(1) magic for Macromedia Flash file format +# +# See +# +# http://www.macromedia.com/software/flash/open/ +# +0 string FWS Macromedia Flash data, +>3 byte x version %d +0 string CWS Macromedia Flash data (compressed), +>3 byte x version %d +# From: Cal Peake +0 string FLV Macromedia Flash Video + +# +# From Dave Wilson +0 string AGD4\xbe\xb8\xbb\xcb\x00 Macromedia Freehand 9 Document + +#------------------------------------------------------------------------------ +# fonts: file(1) magic for font data +# +0 string FONT ASCII vfont text +0 short 0436 Berkeley vfont data +0 short 017001 byte-swapped Berkeley vfont data + +# PostScript fonts (must precede "printer" entries), quinlan@yggdrasil.com +0 string %!PS-AdobeFont-1. PostScript Type 1 font text +>20 string >\0 (%s) +6 string %!PS-AdobeFont-1. PostScript Type 1 font program data + +# X11 font files in SNF (Server Natural Format) format +0 belong 00000004 X11 SNF font data, MSB first +0 lelong 00000004 X11 SNF font data, LSB first + +# X11 Bitmap Distribution Format, from Daniel Quinlan (quinlan@yggdrasil.com) +0 string STARTFONT\040 X11 BDF font text + +# X11 fonts, from Daniel Quinlan (quinlan@yggdrasil.com) +# PCF must come before SGI additions ("MIPSEL MIPS-II COFF" collides) +0 string \001fcp X11 Portable Compiled Font data +>12 byte 0x02 \b, LSB first +>12 byte 0x0a \b, MSB first +0 string D1.0\015 X11 Speedo font data + +#------------------------------------------------------------------------------ +# FIGlet fonts and controlfiles +# From figmagic supplied with Figlet version 2.2 +# "David E. O'Brien" +0 string flf FIGlet font +>3 string >2a version %-2.2s +0 string flc FIGlet controlfile +>3 string >2a version %-2.2s + +# libGrx graphics lib fonts, from Albert Cahalan (acahalan@cs.uml.edu) +# Used with djgpp (DOS Gnu C++), sometimes Linux or Turbo C++ +0 belong 0x14025919 libGrx font data, +>8 leshort x %dx +>10 leshort x \b%d +>40 string x %s +# Misc. DOS VGA fonts, from Albert Cahalan (acahalan@cs.uml.edu) +0 belong 0xff464f4e DOS code page font data collection +7 belong 0x00454741 DOS code page font data +7 belong 0x00564944 DOS code page font data (from Linux?) +4098 string DOSFONT DOSFONT2 encrypted font data + +# downloadable fonts for browser (prints type) anthon@mnt.org +0 string PFR1 PFR1 font +>102 string >0 \b: %s + +# True Type fonts +0 string \000\001\000\000\000 TrueType font data + +0 string \007\001\001\000Copyright\ (c)\ 199 Adobe Multiple Master font +0 string \012\001\001\000Copyright\ (c)\ 199 Adobe Multiple Master font + +# Opentype font data from Avi Bercovich +0 string OTTO OpenType font data + +# Gürkan Sengün , www.linuks.mine.nu +0 string SplineFontDB: Spline Font Database +>14 string x version %s + +#------------------------------------------------------------------------------ +# frame: file(1) magic for FrameMaker files +# +# This stuff came on a FrameMaker demo tape, most of which is +# copyright, but this file is "published" as witness the following: +# +0 string \11 string 5.5 (5.5 +>11 string 5.0 (5.0 +>11 string 4.0 (4.0 +>11 string 3.0 (3.0 +>11 string 2.0 (2.0 +>11 string 1.0 (1.0 +>14 byte x %c) +0 string \9 string 4.0 (4.0) +>9 string 3.0 (3.0) +>9 string 2.0 (2.0) +>9 string 1.0 (1.x) +0 string \17 string 3.0 (3.0) +>17 string 2.0 (2.0) +>17 string 1.0 (1.x) +0 string \17 string 1.01 (%s) +0 string \10 string 3.0 (3.0 +>10 string 2.0 (2.0 +>10 string 1.0 (1.0 +>13 byte x %c) +# XXX - this book entry should be verified, if you find one, uncomment this +#0 string \6 string 3.0 (3.0) +#>6 string 2.0 (2.0) +#>6 string 1.0 (1.0) +0 string \= 4096 (or >4095, same thing), then it's +# an executable, and is dynamically-linked if the "has run-time +# loader information" bit is set. +# +# On x86, NetBSD says: +# +# If it's neither pure nor demand-paged: +# +# if it has the "has run-time loader information" bit set, it's +# a dynamically-linked executable; +# +# if it doesn't have that bit set, then: +# +# if it has the "is position-independent" bit set, it's +# position-independent; +# +# if the entry point is non-zero, it's an executable, otherwise +# it's an object file. +# +# If it's pure: +# +# if it has the "has run-time loader information" bit set, it's +# a dynamically-linked executable, otherwise it's just an +# executable. +# +# If it's demand-paged: +# +# if it has the "has run-time loader information" bit set, +# then: +# +# if the entry point is < 4096, it's a shared library; +# +# if the entry point is = 4096 or > 4096 (i.e., >= 4096), +# it's a dynamically-linked executable); +# +# if it doesn't have the "has run-time loader information" bit +# set, then it's just an executable. +# +# (On non-x86, NetBSD does much the same thing, except that it uses +# 8192 on 68K - except for "68k4k", which is presumably "68K with 4K +# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's +# had 8K pages; dunno about MIPS.) +# +# I suspect the two will differ only in perverse and uninteresting cases +# ("shared" libraries that aren't demand-paged and whose pages probably +# won't actually be shared, executables with entry points <4096). +# +# I leave it to those more familiar with FreeBSD and NetBSD to figure out +# what the right answer is (although using ">4095", FreeBSD-style, is +# probably better than separately checking for "=4096" and ">4096", +# NetBSD-style). (The old "netbsd" file analyzed FreeBSD demand paged +# executables using the NetBSD technique.) +# +0 lelong&0377777777 041400407 FreeBSD/i386 +>20 lelong <4096 +>>3 byte&0xC0 &0x80 shared library +>>3 byte&0xC0 0x40 PIC object +>>3 byte&0xC0 0x00 object +>20 lelong >4095 +>>3 byte&0x80 0x80 dynamically linked executable +>>3 byte&0x80 0x00 executable +>16 lelong >0 not stripped + +0 lelong&0377777777 041400410 FreeBSD/i386 pure +>20 lelong <4096 +>>3 byte&0xC0 &0x80 shared library +>>3 byte&0xC0 0x40 PIC object +>>3 byte&0xC0 0x00 object +>20 lelong >4095 +>>3 byte&0x80 0x80 dynamically linked executable +>>3 byte&0x80 0x00 executable +>16 lelong >0 not stripped + +0 lelong&0377777777 041400413 FreeBSD/i386 demand paged +>20 lelong <4096 +>>3 byte&0xC0 &0x80 shared library +>>3 byte&0xC0 0x40 PIC object +>>3 byte&0xC0 0x00 object +>20 lelong >4095 +>>3 byte&0x80 0x80 dynamically linked executable +>>3 byte&0x80 0x00 executable +>16 lelong >0 not stripped + +0 lelong&0377777777 041400314 FreeBSD/i386 compact demand paged +>20 lelong <4096 +>>3 byte&0xC0 &0x80 shared library +>>3 byte&0xC0 0x40 PIC object +>>3 byte&0xC0 0x00 object +>20 lelong >4095 +>>3 byte&0x80 0x80 dynamically linked executable +>>3 byte&0x80 0x00 executable +>16 lelong >0 not stripped + +# XXX gross hack to identify core files +# cores start with a struct tss; we take advantage of the following: +# byte 7: highest byte of the kernel stack pointer, always 0xfe +# 8/9: kernel (ring 0) ss value, always 0x0010 +# 10 - 27: ring 1 and 2 ss/esp, unused, thus always 0 +# 28: low order byte of the current PTD entry, always 0 since the +# PTD is page-aligned +# +7 string \357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 FreeBSD/i386 a.out core file +>1039 string >\0 from '%s' + +# /var/run/ld.so.hints +# What are you laughing about? +0 lelong 011421044151 ld.so hints file (Little Endian +>4 lelong >0 \b, version %d) +>4 belong <=0 \b) +0 belong 011421044151 ld.so hints file (Big Endian +>4 belong >0 \b, version %d) +>4 belong <=0 \b) + +# +# Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities +# +0 string SCRSHOT_ scrshot(1) screenshot, +>8 byte x version %d, +>9 byte 2 %d bytes in header, +>>10 byte x %d chars wide by +>>11 byte x %d chars high + +#------------------------------------------------------------------------------ +# fsav: file(1) magic for datafellows fsav virus definition files +# Anthon van der Neut (anthon@mnt.org) + +# ftp://ftp.f-prot.com/pub/{macrdef2.zip,nomacro.def} +0 beshort 0x1575 fsav macro virus signatures +>8 leshort >0 (%d- +>11 byte >0 \b%02d- +>10 byte >0 \b%02d) +# ftp://ftp.f-prot.com/pub/sign.zip +#10 ubyte <12 +#>9 ubyte <32 +#>>8 ubyte 0x0a +#>>>12 ubyte 0x07 +#>>>>11 uleshort >0 fsav DOS/Windows virus signatures (%d- +#>>>>10 byte 0 \b01- +#>>>>10 byte 1 \b02- +#>>>>10 byte 2 \b03- +#>>>>10 byte 3 \b04- +#>>>>10 byte 4 \b05- +#>>>>10 byte 5 \b06- +#>>>>10 byte 6 \b07- +#>>>>10 byte 7 \b08- +#>>>>10 byte 8 \b09- +#>>>>10 byte 9 \b10- +#>>>>10 byte 10 \b11- +#>>>>10 byte 11 \b12- +#>>>>9 ubyte >0 \b%02d) +# ftp://ftp.f-prot.com/pub/sign2.zip +#0 ubyte 0x62 +#>1 ubyte 0xF5 +#>>2 ubyte 0x1 +#>>>3 ubyte 0x1 +#>>>>4 ubyte 0x0e +#>>>>>13 ubyte >0 fsav virus signatures +#>>>>>>11 ubyte x size 0x%02x +#>>>>>>12 ubyte x \b%02x +#>>>>>>13 ubyte x \b%02x bytes + +# Joerg Jenderek: joerg dot jenderek at web dot de +# http://www.clamav.net/doc/latest/html/node45.html +# .cvd files start with a 512 bytes colon separated header +# ClamAV-VDB:buildDate:version:signaturesNumbers:functionalityLevelRequired:MD5:Signature:builder:buildTime +# + gzipped tarball files +0 string ClamAV-VDB: +>11 string >\0 Clam AntiVirus database %-.23s +>>34 string : +>>>35 regex [^:]+ \b, version +>>>>35 string x \b%-.1s +>>>>>36 string !: +>>>>>>36 string x \b%-.1s +>>>>>>>37 string !: +>>>>>>>>37 string x \b%-.1s +>>>>>>>>>38 string !: +>>>>>>>>>>38 string x \b%-.1s +>>>>512 string \037\213 \b, gzipped +>>>>769 string ustar\0 \b, tared +>512 string \037\213 \b, gzipped +>769 string ustar\0 \b, tared +#------------------------------------------------------------------------------ +# games: file(1) for games + +# Thomas M. Ott (ThMO) +1 string =WAD DOOM data, +>0 string =I main wad +>0 string =P patch wad +>0 byte x unknown junk + +# Fabio Bonelli +# Quake II - III data files +0 string IDP2 Quake II 3D Model file, +>20 long x %lu skin(s), +>8 long x (%lu x +>12 long x %lu), +>40 long x %lu frame(s), +>16 long x Frame size %lu bytes, +>24 long x %lu vertices/frame, +>28 long x %lu texture coordinates, +>32 long x %lu triangles/frame + +0 string IBSP Quake +>4 long 0x26 II Map file (BSP) +>4 long 0x2E III Map file (BSP) + +0 string IDS2 Quake II SP2 sprite file + +#--------------------------------------------------------------------------- +# Doom and Quake +# submitted by Nicolas Patrois + +# DOOM + +0 string IWAD DOOM or DOOM ][ world +0 string PWAD DOOM or DOOM ][ extension world + +0 string \xcb\x1dBoom\xe6\xff\x03\x01 Boom or linuxdoom demo +# some doom lmp files don't match, I've got one beginning with \x6d\x02\x01\x01 + +24 string LxD\ 203 Linuxdoom save +>0 string x , name=%s +>44 string x , world=%s + +# Quake + +0 string PACK Quake I or II world or extension + +#0 string -1\x0a Quake I demo +#>30 string x version %.4s +#>61 string x level %s + +#0 string 5\x0a Quake I save + +# The levels + +# Quake 1 + +0 string 5\x0aIntroduction Quake I save: start Introduction +0 string 5\x0athe_Slipgate_Complex Quake I save: e1m1 The slipgate complex +0 string 5\x0aCastle_of_the_Damned Quake I save: e1m2 Castle of the damned +0 string 5\x0athe_Necropolis Quake I save: e1m3 The necropolis +0 string 5\x0athe_Grisly_Grotto Quake I save: e1m4 The grisly grotto +0 string 5\x0aZiggurat_Vertigo Quake I save: e1m8 Ziggurat vertigo (secret) +0 string 5\x0aGloom_Keep Quake I save: e1m5 Gloom keep +0 string 5\x0aThe_Door_To_Chthon Quake I save: e1m6 The door to Chthon +0 string 5\x0aThe_House_of_Chthon Quake I save: e1m7 The house of Chthon +0 string 5\x0athe_Installation Quake I save: e2m1 The installation +0 string 5\x0athe_Ogre_Citadel Quake I save: e2m2 The ogre citadel +0 string 5\x0athe_Crypt_of_Decay Quake I save: e2m3 The crypt of decay (dopefish lives!) +0 string 5\x0aUnderearth Quake I save: e2m7 Underearth (secret) +0 string 5\x0athe_Ebon_Fortress Quake I save: e2m4 The ebon fortress +0 string 5\x0athe_Wizard's_Manse Quake I save: e2m5 The wizard's manse +0 string 5\x0athe_Dismal_Oubliette Quake I save: e2m6 The dismal oubliette +0 string 5\x0aTermination_Central Quake I save: e3m1 Termination central +0 string 5\x0aVaults_of_Zin Quake I save: e3m2 Vaults of Zin +0 string 5\x0athe_Tomb_of_Terror Quake I save: e3m3 The tomb of terror +0 string 5\x0aSatan's_Dark_Delight Quake I save: e3m4 Satan's dark delight +0 string 5\x0athe_Haunted_Halls Quake I save: e3m7 The haunted halls (secret) +0 string 5\x0aWind_Tunnels Quake I save: e3m5 Wind tunnels +0 string 5\x0aChambers_of_Torment Quake I save: e3m6 Chambers of torment +0 string 5\x0athe_Sewage_System Quake I save: e4m1 The sewage system +0 string 5\x0aThe_Tower_of_Despair Quake I save: e4m2 The tower of despair +0 string 5\x0aThe_Elder_God_Shrine Quake I save: e4m3 The elder god shrine +0 string 5\x0athe_Palace_of_Hate Quake I save: e4m4 The palace of hate +0 string 5\x0aHell's_Atrium Quake I save: e4m5 Hell's atrium +0 string 5\x0athe_Nameless_City Quake I save: e4m8 The nameless city (secret) +0 string 5\x0aThe_Pain_Maze Quake I save: e4m6 The pain maze +0 string 5\x0aAzure_Agony Quake I save: e4m7 Azure agony +0 string 5\x0aShub-Niggurath's_Pit Quake I save: end Shub-Niggurath's pit + +# Quake DeathMatch levels + +0 string 5\x0aPlace_of_Two_Deaths Quake I save: dm1 Place of two deaths +0 string 5\x0aClaustrophobopolis Quake I save: dm2 Claustrophobopolis +0 string 5\x0aThe_Abandoned_Base Quake I save: dm3 The abandoned base +0 string 5\x0aThe_Bad_Place Quake I save: dm4 The bad place +0 string 5\x0aThe_Cistern Quake I save: dm5 The cistern +0 string 5\x0aThe_Dark_Zone Quake I save: dm6 The dark zone + +# Scourge of Armagon + +0 string 5\x0aCommand_HQ Quake I save: start Command HQ +0 string 5\x0aThe_Pumping_Station Quake I save: hip1m1 The pumping station +0 string 5\x0aStorage_Facility Quake I save: hip1m2 Storage facility +0 string 5\x0aMilitary_Complex Quake I save: hip1m5 Military complex (secret) +0 string 5\x0athe_Lost_Mine Quake I save: hip1m3 The lost mine +0 string 5\x0aResearch_Facility Quake I save: hip1m4 Research facility +0 string 5\x0aAncient_Realms Quake I save: hip2m1 Ancient realms +0 string 5\x0aThe_Gremlin's_Domain Quake I save: hip2m6 The gremlin's domain (secret) +0 string 5\x0aThe_Black_Cathedral Quake I save: hip2m2 The black cathedral +0 string 5\x0aThe_Catacombs Quake I save: hip2m3 The catacombs +0 string 5\x0athe_Crypt__ Quake I save: hip2m4 The crypt +0 string 5\x0aMortum's_Keep Quake I save: hip2m5 Mortum's keep +0 string 5\x0aTur_Torment Quake I save: hip3m1 Tur torment +0 string 5\x0aPandemonium Quake I save: hip3m2 Pandemonium +0 string 5\x0aLimbo Quake I save: hip3m3 Limbo +0 string 5\x0athe_Edge_of_Oblivion Quake I save: hipdm1 The edge of oblivion (secret) +0 string 5\x0aThe_Gauntlet Quake I save: hip3m4 The gauntlet +0 string 5\x0aArmagon's_Lair Quake I save: hipend Armagon's lair + +# Malice + +0 string 5\x0aThe_Academy Quake I save: start The academy +0 string 5\x0aThe_Lab Quake I save: d1 The lab +0 string 5\x0aArea_33 Quake I save: d1b Area 33 +0 string 5\x0aSECRET_MISSIONS Quake I save: d3b Secret missions +0 string 5\x0aThe_Hospital Quake I save: d10 The hospital (secret) +0 string 5\x0aThe_Genetics_Lab Quake I save: d11 The genetics lab (secret) +0 string 5\x0aBACK_2_MALICE Quake I save: d4b Back to Malice +0 string 5\x0aArea44 Quake I save: d1c Area 44 +0 string 5\x0aTakahiro_Towers Quake I save: d2 Takahiro towers +0 string 5\x0aA_Rat's_Life Quake I save: d3 A rat's life +0 string 5\x0aInto_The_Flood Quake I save: d4 Into the flood +0 string 5\x0aThe_Flood Quake I save: d5 The flood +0 string 5\x0aNuclear_Plant Quake I save: d6 Nuclear plant +0 string 5\x0aThe_Incinerator_Plant Quake I save: d7 The incinerator plant +0 string 5\x0aThe_Foundry Quake I save: d7b The foundry +0 string 5\x0aThe_Underwater_Base Quake I save: d8 The underwater base +0 string 5\x0aTakahiro_Base Quake I save: d9 Takahiro base +0 string 5\x0aTakahiro_Laboratories Quake I save: d12 Takahiro laboratories +0 string 5\x0aStayin'_Alive Quake I save: d13 Stayin' alive +0 string 5\x0aB.O.S.S._HQ Quake I save: d14 B.O.S.S. HQ +0 string 5\x0aSHOWDOWN! Quake I save: d15 Showdown! + +# Malice DeathMatch levels + +0 string 5\x0aThe_Seventh_Precinct Quake I save: ddm1 The seventh precinct +0 string 5\x0aSub_Station Quake I save: ddm2 Sub station +0 string 5\x0aCrazy_Eights! Quake I save: ddm3 Crazy eights! +0 string 5\x0aEast_Side_Invertationa Quake I save: ddm4 East side invertationa +0 string 5\x0aSlaughterhouse Quake I save: ddm5 Slaughterhouse +0 string 5\x0aDOMINO Quake I save: ddm6 Domino +0 string 5\x0aSANDRA'S_LADDER Quake I save: ddm7 Sandra's ladder + + +0 string MComprHD MAME CHD compressed hard disk image, +>12 belong x version %lu + +#------------------------------------------------------------------------------ +# GEOS files (Vidar Madsen, vidar@gimp.org) +# semi-commonly used in embedded and handheld systems. +0 belong 0xc745c153 GEOS +>40 byte 1 executable +>40 byte 2 VMFile +>40 byte 3 binary +>40 byte 4 directory label +>40 byte <1 unknown +>40 byte >4 unknown +>4 string >\0 \b, name "%s" +#>44 short x \b, version %d +#>46 short x \b.%d +#>48 short x \b, rev %d +#>50 short x \b.%d +#>52 short x \b, proto %d +#>54 short x \br%d +#>168 string >\0 \b, copyright "%s" + +#------------------------------------------------------------------------------ +# gcc: file(1) magic for GCC special files +# +0 string gpch GCC precompiled header + +# The version field is annoying. It's 3 characters, not zero-terminated. +>5 byte x (version %c +>6 byte x \b%c +>7 byte x \b%c) + +# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O' +>4 byte 67 for C +>4 byte 111 for Objective C +>4 byte 43 for C++ +>4 byte 79 for Objective C++ +#------------------------------------------------------------------------------ +# GIMP Gradient: file(1) magic for the GIMP's gradient data files +# by Federico Mena + +0 string GIMP\ Gradient GIMP gradient data + +#------------------------------------------------------------------------------ +# XCF: file(1) magic for the XCF image format used in the GIMP developed +# by Spencer Kimball and Peter Mattis +# ('Bucky' LaDieu, nega@vt.edu) + +0 string gimp\ xcf GIMP XCF image data, +>9 string file version 0, +>9 string v version +>>10 string >\0 %s, +>14 belong x %lu x +>18 belong x %lu, +>22 belong 0 RGB Color +>22 belong 1 Greyscale +>22 belong 2 Indexed Color +>22 belong >2 Unknown Image Type. + +#------------------------------------------------------------------------------ +# XCF: file(1) magic for the patterns used in the GIMP, developed +# by Spencer Kimball and Peter Mattis +# ('Bucky' LaDieu, nega@vt.edu) + +20 string GPAT GIMP pattern data, +>24 string x %s + +#------------------------------------------------------------------------------ +# XCF: file(1) magic for the brushes used in the GIMP, developed +# by Spencer Kimball and Peter Mattis +# ('Bucky' LaDieu, nega@vt.edu) + +20 string GIMP GIMP brush data +#------------------------------------------------------------------------------ +# gnu: file(1) magic for various GNU tools +# +# GNU nlsutils message catalog file format +# +0 string \336\22\4\225 GNU message catalog (little endian), +>4 lelong x revision %d, +>8 lelong x %d messages +0 string \225\4\22\336 GNU message catalog (big endian), +>4 belong x revision %d, +>8 belong x %d messages +# message catalogs, from Mitchum DSouza +0 string *nazgul* Nazgul style compiled message catalog +>8 lelong >0 \b, version %ld + +# GnuPG +# The format is very similar to pgp +0 string \001gpg GPG key trust database +>4 byte x version %d +0 beshort 0x8502 GPG encrypted data +# This magic is not particularly good, as the keyrings don't have true +# magic. Nevertheless, it covers many keyrings. +0 beshort 0x9901 GPG key public ring + +# Gnumeric spreadsheet +# This entry is only semi-helpful, as Gnumeric compresses its files, so +# they will ordinarily reported as "compressed", but at least -z helps +39 string = +# gnu find magic +0 string \0LOCATE GNU findutils locate database data +>7 string >\0 \b, format %s +>7 string 02 \b (frcode) + +#------------------------------------------------------------------------------ +# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE +# +# ACE/gr binary +0 string \000\000\0001\000\000\0000\000\000\0000\000\000\0002\000\000\0000\000\000\0000\000\000\0003 old ACE/gr binary file +>39 byte >0 - version %c +# ACE/gr ascii +0 string #\ xvgr\ parameter\ file ACE/gr ascii file +0 string #\ xmgr\ parameter\ file ACE/gr ascii file +0 string #\ ACE/gr\ parameter\ file ACE/gr ascii file +# Grace projects +0 string #\ Grace\ project\ file Grace project file +>23 string @version\ (version +>>32 byte >0 %c +>>33 string >\0 \b.%.2s +>>35 string >\0 \b.%.2s) +# ACE/gr fit description files +0 string #\ ACE/gr\ fit\ description\ ACE/gr fit description file +# end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE + +#------------------------------------------------------------------------------ +# gringotts: file(1) magic for Gringotts +# http://devel.pluto.linux.it/projects/Gringotts/ +# author: Germano Rizzo +#GRG3????Y +0 string GRG Gringotts data file +#file format 1 +>3 string 1 v.1, MCRYPT S2K, SERPENT crypt, SHA-256 hash, ZLib lvl.9 +#file format 2 +>3 string 2 v.2, MCRYPT S2K, +>>8 byte&0x70 0x00 RIJNDAEL-128 crypt, +>>8 byte&0x70 0x10 SERPENT crypt, +>>8 byte&0x70 0x20 TWOFISH crypt, +>>8 byte&0x70 0x30 CAST-256 crypt, +>>8 byte&0x70 0x40 SAFER+ crypt, +>>8 byte&0x70 0x50 LOKI97 crypt, +>>8 byte&0x70 0x60 3DES crypt, +>>8 byte&0x70 0x70 RIJNDAEL-256 crypt, +>>8 byte&0x08 0x00 SHA1 hash, +>>8 byte&0x08 0x08 RIPEMD-160 hash, +>>8 byte&0x04 0x00 ZLib +>>8 byte&0x04 0x04 BZip2 +>>8 byte&0x03 0x00 lvl.0 +>>8 byte&0x03 0x01 lvl.3 +>>8 byte&0x03 0x02 lvl.6 +>>8 byte&0x03 0x03 lvl.9 +#file format 3 +>3 string 3 v.3, OpenPGP S2K, +>>8 byte&0x70 0x00 RIJNDAEL-128 crypt, +>>8 byte&0x70 0x10 SERPENT crypt, +>>8 byte&0x70 0x20 TWOFISH crypt, +>>8 byte&0x70 0x30 CAST-256 crypt, +>>8 byte&0x70 0x40 SAFER+ crypt, +>>8 byte&0x70 0x50 LOKI97 crypt, +>>8 byte&0x70 0x60 3DES crypt, +>>8 byte&0x70 0x70 RIJNDAEL-256 crypt, +>>8 byte&0x08 0x00 SHA1 hash, +>>8 byte&0x08 0x08 RIPEMD-160 hash, +>>8 byte&0x04 0x00 ZLib +>>8 byte&0x04 0x04 BZip2 +>>8 byte&0x03 0x00 lvl.0 +>>8 byte&0x03 0x01 lvl.3 +>>8 byte&0x03 0x02 lvl.6 +>>8 byte&0x03 0x03 lvl.9 +#file format >3 +>3 string >3 v.%.1s (unknown details) + +#------------------------------------------------------------------------------ +# hitach-sh: file(1) magic for Hitachi Super-H +# +# Super-H COFF +# +0 beshort 0x0500 Hitachi SH big-endian COFF +>18 beshort&0x0002 =0x0000 object +>18 beshort&0x0002 =0x0002 executable +>18 beshort&0x0008 =0x0008 \b, stripped +>18 beshort&0x0008 =0x0000 \b, not stripped +# +0 leshort 0x0550 Hitachi SH little-endian COFF +>18 leshort&0x0002 =0x0000 object +>18 leshort&0x0002 =0x0002 executable +>18 leshort&0x0008 =0x0008 \b, stripped +>18 leshort&0x0008 =0x0000 \b, not stripped + + +#------------------------------------------------------------------------------ +# hp: file(1) magic for Hewlett Packard machines (see also "printer") +# +# XXX - somebody should figure out whether any byte order needs to be +# applied to the "TML" stuff; I'm assuming the Apollo stuff is +# big-endian as it was mostly 68K-based. +# +# I think the 500 series was the old stack-based machines, running a +# UNIX environment atop the "SUN kernel"; dunno whether it was +# big-endian or little-endian. +# +# Daniel Quinlan (quinlan@yggdrasil.com): hp200 machines are 68010 based; +# hp300 are 68020+68881 based; hp400 are also 68k. The following basic +# HP magic is useful for reference, but using "long" magic is a better +# practice in order to avoid collisions. +# +# Guy Harris (guy@netapp.com): some additions to this list came from +# HP-UX 10.0's "/usr/include/sys/unistd.h" (68030, 68040, PA-RISC 1.1, +# 1.2, and 2.0). The 1.2 and 2.0 stuff isn't in the HP-UX 10.0 +# "/etc/magic", though, except for the "archive file relocatable library" +# stuff, and the 68030 and 68040 stuff isn't there at all - are they not +# used in executables, or have they just not yet updated "/etc/magic" +# completely? +# +# 0 beshort 200 hp200 (68010) BSD binary +# 0 beshort 300 hp300 (68020+68881) BSD binary +# 0 beshort 0x20c hp200/300 HP-UX binary +# 0 beshort 0x20d hp400 (68030) HP-UX binary +# 0 beshort 0x20e hp400 (68040?) HP-UX binary +# 0 beshort 0x20b PA-RISC1.0 HP-UX binary +# 0 beshort 0x210 PA-RISC1.1 HP-UX binary +# 0 beshort 0x211 PA-RISC1.2 HP-UX binary +# 0 beshort 0x214 PA-RISC2.0 HP-UX binary + +# +# The "misc" stuff needs a byte order; the archives look suspiciously +# like the old 177545 archives (0xff65 = 0177545). +# +#### Old Apollo stuff +0 beshort 0627 Apollo m68k COFF executable +>18 beshort ^040000 not stripped +>22 beshort >0 - version %ld +0 beshort 0624 apollo a88k COFF executable +>18 beshort ^040000 not stripped +>22 beshort >0 - version %ld +0 long 01203604016 TML 0123 byte-order format +0 long 01702407010 TML 1032 byte-order format +0 long 01003405017 TML 2301 byte-order format +0 long 01602007412 TML 3210 byte-order format +#### PA-RISC 1.1 +0 belong 0x02100106 PA-RISC1.1 relocatable object +0 belong 0x02100107 PA-RISC1.1 executable +>168 belong &0x00000004 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x02100108 PA-RISC1.1 shared executable +>168 belong&0x4 0x4 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x0210010b PA-RISC1.1 demand-load executable +>168 belong&0x4 0x4 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x0210010e PA-RISC1.1 shared library +>96 belong >0 - not stripped + +0 belong 0x0210010d PA-RISC1.1 dynamic load library +>96 belong >0 - not stripped + +#### PA-RISC 2.0 +0 belong 0x02140106 PA-RISC2.0 relocatable object + +0 belong 0x02140107 PA-RISC2.0 executable +>168 belong &0x00000004 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x02140108 PA-RISC2.0 shared executable +>168 belong &0x00000004 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x0214010b PA-RISC2.0 demand-load executable +>168 belong &0x00000004 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x0214010e PA-RISC2.0 shared library +>96 belong >0 - not stripped + +0 belong 0x0214010d PA-RISC2.0 dynamic load library +>96 belong >0 - not stripped + +#### 800 +0 belong 0x020b0106 PA-RISC1.0 relocatable object + +0 belong 0x020b0107 PA-RISC1.0 executable +>168 belong&0x4 0x4 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x020b0108 PA-RISC1.0 shared executable +>168 belong&0x4 0x4 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x020b010b PA-RISC1.0 demand-load executable +>168 belong&0x4 0x4 dynamically linked +>(144) belong 0x054ef630 dynamically linked +>96 belong >0 - not stripped + +0 belong 0x020b010e PA-RISC1.0 shared library +>96 belong >0 - not stripped + +0 belong 0x020b010d PA-RISC1.0 dynamic load library +>96 belong >0 - not stripped + +0 belong 0x213c6172 archive file +>68 belong 0x020b0619 - PA-RISC1.0 relocatable library +>68 belong 0x02100619 - PA-RISC1.1 relocatable library +>68 belong 0x02110619 - PA-RISC1.2 relocatable library +>68 belong 0x02140619 - PA-RISC2.0 relocatable library + +#### 500 +0 long 0x02080106 HP s500 relocatable executable +>16 long >0 - version %ld + +0 long 0x02080107 HP s500 executable +>16 long >0 - version %ld + +0 long 0x02080108 HP s500 pure executable +>16 long >0 - version %ld + +#### 200 +0 belong 0x020c0108 HP s200 pure executable +>4 beshort >0 - version %ld +>8 belong &0x80000000 save fp regs +>8 belong &0x40000000 dynamically linked +>8 belong &0x20000000 debuggable +>36 belong >0 not stripped + +0 belong 0x020c0107 HP s200 executable +>4 beshort >0 - version %ld +>8 belong &0x80000000 save fp regs +>8 belong &0x40000000 dynamically linked +>8 belong &0x20000000 debuggable +>36 belong >0 not stripped + +0 belong 0x020c010b HP s200 demand-load executable +>4 beshort >0 - version %ld +>8 belong &0x80000000 save fp regs +>8 belong &0x40000000 dynamically linked +>8 belong &0x20000000 debuggable +>36 belong >0 not stripped + +0 belong 0x020c0106 HP s200 relocatable executable +>4 beshort >0 - version %ld +>6 beshort >0 - highwater %d +>8 belong &0x80000000 save fp regs +>8 belong &0x20000000 debuggable +>8 belong &0x10000000 PIC + +0 belong 0x020a0108 HP s200 (2.x release) pure executable +>4 beshort >0 - version %ld +>36 belong >0 not stripped + +0 belong 0x020a0107 HP s200 (2.x release) executable +>4 beshort >0 - version %ld +>36 belong >0 not stripped + +0 belong 0x020c010e HP s200 shared library +>4 beshort >0 - version %ld +>6 beshort >0 - highwater %d +>36 belong >0 not stripped + +0 belong 0x020c010d HP s200 dynamic load library +>4 beshort >0 - version %ld +>6 beshort >0 - highwater %d +>36 belong >0 not stripped + +#### MISC +0 long 0x0000ff65 HP old archive +0 long 0x020aff65 HP s200 old archive +0 long 0x020cff65 HP s200 old archive +0 long 0x0208ff65 HP s500 old archive + +0 long 0x015821a6 HP core file + +0 long 0x4da7eee8 HP-WINDOWS font +>8 byte >0 - version %ld +0 string Bitmapfile HP Bitmapfile + +0 string IMGfile CIS compimg HP Bitmapfile +# XXX - see "lif" +#0 short 0x8000 lif file +0 long 0x020c010c compiled Lisp + +0 string msgcat01 HP NLS message catalog, +>8 long >0 %d messages + +# addendum to /etc/magic with HP-48sx file-types by phk@data.fls.dk 1jan92 +0 string HPHP48- HP48 binary +>7 byte >0 - Rev %c +>8 beshort 0x1129 (ADR) +>8 beshort 0x3329 (REAL) +>8 beshort 0x5529 (LREAL) +>8 beshort 0x7729 (COMPLX) +>8 beshort 0x9d29 (LCOMPLX) +>8 beshort 0xbf29 (CHAR) +>8 beshort 0xe829 (ARRAY) +>8 beshort 0x0a2a (LNKARRAY) +>8 beshort 0x2c2a (STRING) +>8 beshort 0x4e2a (HXS) +>8 beshort 0x742a (LIST) +>8 beshort 0x962a (DIR) +>8 beshort 0xb82a (ALG) +>8 beshort 0xda2a (UNIT) +>8 beshort 0xfc2a (TAGGED) +>8 beshort 0x1e2b (GROB) +>8 beshort 0x402b (LIB) +>8 beshort 0x622b (BACKUP) +>8 beshort 0x882b (LIBDATA) +>8 beshort 0x9d2d (PROG) +>8 beshort 0xcc2d (CODE) +>8 beshort 0x482e (GNAME) +>8 beshort 0x6d2e (LNAME) +>8 beshort 0x922e (XLIB) +0 string %%HP: HP48 text +>6 string T(0) - T(0) +>6 string T(1) - T(1) +>6 string T(2) - T(2) +>6 string T(3) - T(3) +>10 string A(D) A(D) +>10 string A(R) A(R) +>10 string A(G) A(G) +>14 string F(.) F(.); +>14 string F(,) F(,); + +# hpBSD magic numbers +0 beshort 200 hp200 (68010) BSD +>2 beshort 0407 impure binary +>2 beshort 0410 read-only binary +>2 beshort 0413 demand paged binary +0 beshort 300 hp300 (68020+68881) BSD +>2 beshort 0407 impure binary +>2 beshort 0410 read-only binary +>2 beshort 0413 demand paged binary +# +# From David Gero +# HP-UX 10.20 core file format from /usr/include/sys/core.h +# Unfortunately, HP-UX uses corehead blocks without specifying the order +# There are four we care about: +# CORE_KERNEL, which starts with the string "HP-UX" +# CORE_EXEC, which contains the name of the command +# CORE_PROC, which contains the signal number that caused the core dump +# CORE_FORMAT, which contains the version of the core file format (== 1) +# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC +# but we include all 6 variations of the order of the first 3, and +# assume that PROC will always be last +# Order 1: KERNEL, EXEC, FORMAT, PROC +0x10 string HP-UX +>0 belong 2 +>>0xC belong 0x3C +>>>0x4C belong 0x100 +>>>>0x58 belong 0x44 +>>>>>0xA0 belong 1 +>>>>>>0xAC belong 4 +>>>>>>>0xB0 belong 1 +>>>>>>>>0xB4 belong 4 core file +>>>>>>>>>0x90 string >\0 from '%s' +>>>>>>>>>0xC4 belong 3 - received SIGQUIT +>>>>>>>>>0xC4 belong 4 - received SIGILL +>>>>>>>>>0xC4 belong 5 - received SIGTRAP +>>>>>>>>>0xC4 belong 6 - received SIGABRT +>>>>>>>>>0xC4 belong 7 - received SIGEMT +>>>>>>>>>0xC4 belong 8 - received SIGFPE +>>>>>>>>>0xC4 belong 10 - received SIGBUS +>>>>>>>>>0xC4 belong 11 - received SIGSEGV +>>>>>>>>>0xC4 belong 12 - received SIGSYS +>>>>>>>>>0xC4 belong 33 - received SIGXCPU +>>>>>>>>>0xC4 belong 34 - received SIGXFSZ +# Order 2: KERNEL, FORMAT, EXEC, PROC +>>>0x4C belong 1 +>>>>0x58 belong 4 +>>>>>0x5C belong 1 +>>>>>>0x60 belong 0x100 +>>>>>>>0x6C belong 0x44 +>>>>>>>>0xB4 belong 4 core file +>>>>>>>>>0xA4 string >\0 from '%s' +>>>>>>>>>0xC4 belong 3 - received SIGQUIT +>>>>>>>>>0xC4 belong 4 - received SIGILL +>>>>>>>>>0xC4 belong 5 - received SIGTRAP +>>>>>>>>>0xC4 belong 6 - received SIGABRT +>>>>>>>>>0xC4 belong 7 - received SIGEMT +>>>>>>>>>0xC4 belong 8 - received SIGFPE +>>>>>>>>>0xC4 belong 10 - received SIGBUS +>>>>>>>>>0xC4 belong 11 - received SIGSEGV +>>>>>>>>>0xC4 belong 12 - received SIGSYS +>>>>>>>>>0xC4 belong 33 - received SIGXCPU +>>>>>>>>>0xC4 belong 34 - received SIGXFSZ +# Order 3: FORMAT, KERNEL, EXEC, PROC +0x24 string HP-UX +>0 belong 1 +>>0xC belong 4 +>>>0x10 belong 1 +>>>>0x14 belong 2 +>>>>>0x20 belong 0x3C +>>>>>>0x60 belong 0x100 +>>>>>>>0x6C belong 0x44 +>>>>>>>>0xB4 belong 4 core file +>>>>>>>>>0xA4 string >\0 from '%s' +>>>>>>>>>0xC4 belong 3 - received SIGQUIT +>>>>>>>>>0xC4 belong 4 - received SIGILL +>>>>>>>>>0xC4 belong 5 - received SIGTRAP +>>>>>>>>>0xC4 belong 6 - received SIGABRT +>>>>>>>>>0xC4 belong 7 - received SIGEMT +>>>>>>>>>0xC4 belong 8 - received SIGFPE +>>>>>>>>>0xC4 belong 10 - received SIGBUS +>>>>>>>>>0xC4 belong 11 - received SIGSEGV +>>>>>>>>>0xC4 belong 12 - received SIGSYS +>>>>>>>>>0xC4 belong 33 - received SIGXCPU +>>>>>>>>>0xC4 belong 34 - received SIGXFSZ +# Order 4: EXEC, KERNEL, FORMAT, PROC +0x64 string HP-UX +>0 belong 0x100 +>>0xC belong 0x44 +>>>0x54 belong 2 +>>>>0x60 belong 0x3C +>>>>>0xA0 belong 1 +>>>>>>0xAC belong 4 +>>>>>>>0xB0 belong 1 +>>>>>>>>0xB4 belong 4 core file +>>>>>>>>>0x44 string >\0 from '%s' +>>>>>>>>>0xC4 belong 3 - received SIGQUIT +>>>>>>>>>0xC4 belong 4 - received SIGILL +>>>>>>>>>0xC4 belong 5 - received SIGTRAP +>>>>>>>>>0xC4 belong 6 - received SIGABRT +>>>>>>>>>0xC4 belong 7 - received SIGEMT +>>>>>>>>>0xC4 belong 8 - received SIGFPE +>>>>>>>>>0xC4 belong 10 - received SIGBUS +>>>>>>>>>0xC4 belong 11 - received SIGSEGV +>>>>>>>>>0xC4 belong 12 - received SIGSYS +>>>>>>>>>0xC4 belong 33 - received SIGXCPU +>>>>>>>>>0xC4 belong 34 - received SIGXFSZ +# Order 5: FORMAT, EXEC, KERNEL, PROC +0x78 string HP-UX +>0 belong 1 +>>0xC belong 4 +>>>0x10 belong 1 +>>>>0x14 belong 0x100 +>>>>>0x20 belong 0x44 +>>>>>>0x68 belong 2 +>>>>>>>0x74 belong 0x3C +>>>>>>>>0xB4 belong 4 core file +>>>>>>>>>0x58 string >\0 from '%s' +>>>>>>>>>0xC4 belong 3 - received SIGQUIT +>>>>>>>>>0xC4 belong 4 - received SIGILL +>>>>>>>>>0xC4 belong 5 - received SIGTRAP +>>>>>>>>>0xC4 belong 6 - received SIGABRT +>>>>>>>>>0xC4 belong 7 - received SIGEMT +>>>>>>>>>0xC4 belong 8 - received SIGFPE +>>>>>>>>>0xC4 belong 10 - received SIGBUS +>>>>>>>>>0xC4 belong 11 - received SIGSEGV +>>>>>>>>>0xC4 belong 12 - received SIGSYS +>>>>>>>>>0xC4 belong 33 - received SIGXCPU +>>>>>>>>>0xC4 belong 34 - received SIGXFSZ +# Order 6: EXEC, FORMAT, KERNEL, PROC +>0 belong 0x100 +>>0xC belong 0x44 +>>>0x54 belong 1 +>>>>0x60 belong 4 +>>>>>0x64 belong 1 +>>>>>>0x68 belong 2 +>>>>>>>0x74 belong 0x2C +>>>>>>>>0xB4 belong 4 core file +>>>>>>>>>0x44 string >\0 from '%s' +>>>>>>>>>0xC4 belong 3 - received SIGQUIT +>>>>>>>>>0xC4 belong 4 - received SIGILL +>>>>>>>>>0xC4 belong 5 - received SIGTRAP +>>>>>>>>>0xC4 belong 6 - received SIGABRT +>>>>>>>>>0xC4 belong 7 - received SIGEMT +>>>>>>>>>0xC4 belong 8 - received SIGFPE +>>>>>>>>>0xC4 belong 10 - received SIGBUS +>>>>>>>>>0xC4 belong 11 - received SIGSEGV +>>>>>>>>>0xC4 belong 12 - received SIGSYS +>>>>>>>>>0xC4 belong 33 - received SIGXCPU +>>>>>>>>>0xC4 belong 34 - received SIGXFSZ + +# From: AMAKAWA Shuhei +0 string HPHP49- HP49 binary + + +#------------------------------------------------------------------------------ +# human68k: file(1) magic for Human68k (X680x0 DOS) binary formats +# Magic too short! +#0 string HU Human68k +#>68 string LZX LZX compressed +#>>72 string >\0 (version %s) +#>(8.L+74) string LZX LZX compressed +#>>(8.L+78) string >\0 (version %s) +#>60 belong >0 binded +#>(8.L+66) string #HUPAIR hupair +#>0 string HU X executable +#>(8.L+74) string #LIBCV1 - linked PD LIBC ver 1 +#>4 belong >0 - base address 0x%x +#>28 belong >0 not stripped +#>32 belong >0 with debug information +#0 beshort 0x601a Human68k Z executable +#0 beshort 0x6000 Human68k object file +#0 belong 0xd1000000 Human68k ar binary archive +#0 belong 0xd1010000 Human68k ar ascii archive +#0 beshort 0x0068 Human68k lib archive +#4 string LZX Human68k LZX compressed +#>8 string >\0 (version %s) +#>4 string LZX R executable +#2 string #HUPAIR Human68k hupair R executable + +#------------------------------------------------------------------------------ +# ibm370: file(1) magic for IBM 370 and compatibles. +# +# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable". +# What the heck *is* "USS/370"? +# AIX 4.1's "/etc/magic" has +# +# 0 short 0535 370 sysV executable +# >12 long >0 not stripped +# >22 short >0 - version %d +# >30 long >0 - 5.2 format +# 0 short 0530 370 sysV pure executable +# >12 long >0 not stripped +# >22 short >0 - version %d +# >30 long >0 - 5.2 format +# +# instead of the "USS/370" versions of the same magic numbers. +# +0 beshort 0537 370 XA sysV executable +>12 belong >0 not stripped +>22 beshort >0 - version %d +>30 belong >0 - 5.2 format +0 beshort 0532 370 XA sysV pure executable +>12 belong >0 not stripped +>22 beshort >0 - version %d +>30 belong >0 - 5.2 format +0 beshort 054001 370 sysV pure executable +>12 belong >0 not stripped +0 beshort 055001 370 XA sysV pure executable +>12 belong >0 not stripped +0 beshort 056401 370 sysV executable +>12 belong >0 not stripped +0 beshort 057401 370 XA sysV executable +>12 belong >0 not stripped +0 beshort 0531 SVR2 executable (Amdahl-UTS) +>12 belong >0 not stripped +>24 belong >0 - version %ld +0 beshort 0534 SVR2 pure executable (Amdahl-UTS) +>12 belong >0 not stripped +>24 belong >0 - version %ld +0 beshort 0530 SVR2 pure executable (USS/370) +>12 belong >0 not stripped +>24 belong >0 - version %ld +0 beshort 0535 SVR2 executable (USS/370) +>12 belong >0 not stripped +>24 belong >0 - version %ld + +#------------------------------------------------------------------------------ +# ibm6000: file(1) magic for RS/6000 and the RT PC. +# +0 beshort 0x01df executable (RISC System/6000 V3.1) or obj module +>12 belong >0 not stripped +# Breaks sun4 statically linked execs. +#0 beshort 0x0103 executable (RT Version 2) or obj module +#>2 byte 0x50 pure +#>28 belong >0 not stripped +#>6 beshort >0 - version %ld +0 beshort 0x0104 shared library +0 beshort 0x0105 ctab data +0 beshort 0xfe04 structured file +0 string 0xabcdef AIX message catalog +0 belong 0x000001f9 AIX compiled message catalog +0 string \ archive +0 string \ archive (big format) + + +#------------------------------------------------------------------------------ +# iff: file(1) magic for Interchange File Format (see also "audio" & "images") +# +# Daniel Quinlan (quinlan@yggdrasil.com) -- IFF was designed by Electronic +# Arts for file interchange. It has also been used by Apple, SGI, and +# especially Commodore-Amiga. +# +# IFF files begin with an 8 byte FORM header, followed by a 4 character +# FORM type, which is followed by the first chunk in the FORM. + +0 string FORM IFF data +#>4 belong x \b, FORM is %d bytes long +# audio formats +>8 string AIFF \b, AIFF audio +>8 string AIFC \b, AIFF-C compressed audio +>8 string 8SVX \b, 8SVX 8-bit sampled sound voice +>8 string 16SV \b, 16SV 16-bit sampled sound voice +>8 string SAMP \b, SAMP sampled audio +>8 string MAUD \b, MAUD MacroSystem audio +>8 string SMUS \b, SMUS simple music +>8 string CMUS \b, CMUS complex music +# image formats +>8 string ILBMBMHD \b, ILBM interleaved image +>>20 beshort x \b, %d x +>>22 beshort x %d +>8 string RGBN \b, RGBN 12-bit RGB image +>8 string RGB8 \b, RGB8 24-bit RGB image +>8 string DEEP \b, DEEP TVPaint/XiPaint image +>8 string DR2D \b, DR2D 2-D object +>8 string TDDD \b, TDDD 3-D rendering +>8 string LWOB \b, LWOB 3-D object +>8 string LWO2 \b, LWO2 3-D object, v2 +>8 string LWLO \b, LWLO 3-D layered object +>8 string REAL \b, REAL Real3D rendering +>8 string MC4D \b, MC4D MaxonCinema4D rendering +>8 string ANIM \b, ANIM animation +>8 string YAFA \b, YAFA animation +>8 string SSA\ \b, SSA super smooth animation +>8 string ACBM \b, ACBM continuous image +>8 string FAXX \b, FAXX fax image +# other formats +>8 string FTXT \b, FTXT formatted text +>8 string CTLG \b, CTLG message catalog +>8 string PREF \b, PREF preferences +>8 string DTYP \b, DTYP datatype description +>8 string PTCH \b, PTCH binary patch +>8 string AMFF \b, AMFF AmigaMetaFile format +>8 string WZRD \b, WZRD StormWIZARD resource +>8 string DOC\ \b, DOC desktop publishing document + +# These go at the end of the iff rules +# +# I don't see why these might collide with anything else. +# +# Interactive Fiction related formats +# +>8 string IFRS \b, Blorb Interactive Fiction +>>24 string Exec with executable chunk +>8 string IFZS \b, Z-machine or Glulx saved game file (Quetzal) + +#------------------------------------------------------------------------------ +# images: file(1) magic for image formats (see also "iff") +# +# originally from jef@helios.ee.lbl.gov (Jef Poskanzer), +# additions by janl@ifi.uio.no as well as others. Jan also suggested +# merging several one- and two-line files into here. +# +# little magic: PCX (first byte is 0x0a) + +# Targa - matches `povray', `ppmtotga' and `xv' outputs +# by Philippe De Muyter +# at 2, byte ImgType must be 1, 2, 3, 9, 10 or 11 +# at 1, byte CoMapType must be 1 if ImgType is 1 or 9, 0 otherwise +# at 3, leshort Index is 0 for povray, ppmtotga and xv outputs +# `xv' recognizes only a subset of the following (RGB with pixelsize = 24) +# `tgatoppm' recognizes a superset (Index may be anything) +1 belong&0xfff7ffff 0x01010000 Targa image data - Map +>2 byte&8 8 - RLE +>12 leshort >0 %hd x +>14 leshort >0 %hd +1 belong&0xfff7ffff 0x00020000 Targa image data - RGB +>2 byte&8 8 - RLE +>12 leshort >0 %hd x +>14 leshort >0 %hd +1 belong&0xfff7ffff 0x00030000 Targa image data - Mono +>2 byte&8 8 - RLE +>12 leshort >0 %hd x +>14 leshort >0 %hd + +# PBMPLUS images +# The next byte following the magic is always whitespace. +0 string P1 Netpbm PBM image text +0 string P2 Netpbm PGM image text +0 string P3 Netpbm PPM image text +0 string P4 Netpbm PBM "rawbits" image data +0 string P5 Netpbm PGM "rawbits" image data +0 string P6 Netpbm PPM "rawbits" image data +0 string P7 Netpbm PAM image file + +# From: bryanh@giraffe-data.com (Bryan Henderson) +0 string \117\072 Solitaire Image Recorder format +>4 string \013 MGI Type 11 +>4 string \021 MGI Type 17 +0 string .MDA MicroDesign data +>21 byte 48 version 2 +>21 byte 51 version 3 +0 string .MDP MicroDesign page data +>21 byte 48 version 2 +>21 byte 51 version 3 + +# NIFF (Navy Interchange File Format, a modification of TIFF) images +0 string IIN1 NIFF image data + +# Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com) +# The second word of TIFF files is the TIFF version number, 42, which has +# never changed. The TIFF specification recommends testing for it. +0 string MM\x00\x2a TIFF image data, big-endian +0 string II\x2a\x00 TIFF image data, little-endian + +# PNG [Portable Network Graphics, or "PNG's Not GIF"] images +# (Greg Roelofs, newt@uchicago.edu) +# (Albert Cahalan, acahalan@cs.uml.edu) +# +# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ... +# +0 string \x89PNG PNG image data, +>4 belong !0x0d0a1a0a CORRUPTED, +>4 belong 0x0d0a1a0a +>>16 belong x %ld x +>>20 belong x %ld, +>>24 byte x %d-bit +>>25 byte 0 grayscale, +>>25 byte 2 \b/color RGB, +>>25 byte 3 colormap, +>>25 byte 4 gray+alpha, +>>25 byte 6 \b/color RGBA, +#>>26 byte 0 deflate/32K, +>>28 byte 0 non-interlaced +>>28 byte 1 interlaced +1 string PNG PNG image data, CORRUPTED + +# GIF +0 string GIF8 GIF image data +>4 string 7a \b, version 8%s, +>4 string 9a \b, version 8%s, +>6 leshort >0 %hd x +>8 leshort >0 %hd +#>10 byte &0x80 color mapped, +#>10 byte&0x07 =0x00 2 colors +#>10 byte&0x07 =0x01 4 colors +#>10 byte&0x07 =0x02 8 colors +#>10 byte&0x07 =0x03 16 colors +#>10 byte&0x07 =0x04 32 colors +#>10 byte&0x07 =0x05 64 colors +#>10 byte&0x07 =0x06 128 colors +#>10 byte&0x07 =0x07 256 colors + +# ITC (CMU WM) raster files. It is essentially a byte-reversed Sun raster, +# 1 plane, no encoding. +0 string \361\0\100\273 CMU window manager raster image data +>4 lelong >0 %d x +>8 lelong >0 %d, +>12 lelong >0 %d-bit + +# Magick Image File Format +0 string id=ImageMagick MIFF image data + +# Artisan +0 long 1123028772 Artisan image data +>4 long 1 \b, rectangular 24-bit +>4 long 2 \b, rectangular 8-bit with colormap +>4 long 3 \b, rectangular 32-bit (24-bit with matte) + +# FIG (Facility for Interactive Generation of figures), an object-based format +0 string #FIG FIG image text +>5 string x \b, version %.3s + +# PHIGS +0 string ARF_BEGARF PHIGS clear text archive +0 string @(#)SunPHIGS SunPHIGS +# version number follows, in the form m.n +>40 string SunBin binary +>32 string archive archive + +# GKS (Graphics Kernel System) +0 string GKSM GKS Metafile +>24 string SunGKS \b, SunGKS + +# CGM image files +0 string BEGMF clear text Computer Graphics Metafile +# XXX - questionable magic +0 beshort&0xffe0 0x0020 binary Computer Graphics Metafile +0 beshort 0x3020 character Computer Graphics Metafile + +# MGR bitmaps (Michael Haardt, u31b3hs@pool.informatik.rwth-aachen.de) +0 string yz MGR bitmap, modern format, 8-bit aligned +0 string zz MGR bitmap, old format, 1-bit deep, 16-bit aligned +0 string xz MGR bitmap, old format, 1-bit deep, 32-bit aligned +0 string yx MGR bitmap, modern format, squeezed + +# Fuzzy Bitmap (FBM) images +0 string %bitmap\0 FBM image data +>30 long 0x31 \b, mono +>30 long 0x33 \b, color + +# facsimile data +1 string PC\ Research,\ Inc group 3 fax data +>29 byte 0 \b, normal resolution (204x98 DPI) +>29 byte 1 \b, fine resolution (204x196 DPI) +# From: Herbert Rosmanith +0 string Sfff structured fax file + + +# PC bitmaps (OS/2, Windoze BMP files) (Greg Roelofs, newt@uchicago.edu) +0 string BM PC bitmap data +>14 leshort 12 \b, OS/2 1.x format +>>18 leshort x \b, %d x +>>20 leshort x %d +>14 leshort 64 \b, OS/2 2.x format +>>18 leshort x \b, %d x +>>20 leshort x %d +>14 leshort 40 \b, Windows 3.x format +>>18 lelong x \b, %d x +>>22 lelong x %d x +>>28 leshort x %d +# Too simple - MPi +#0 string IC PC icon data +#0 string PI PC pointer image data +#0 string CI PC color icon data +#0 string CP PC color pointer image data +# Conflicts with other entries [BABYL] +#0 string BA PC bitmap array data + +# XPM icons (Greg Roelofs, newt@uchicago.edu) +# note possible collision with C/REXX entry in c-lang; currently commented out +0 string /*\ XPM\ */ X pixmap image text + +# Utah Raster Toolkit RLE images (janl@ifi.uio.no) +0 leshort 0xcc52 RLE image data, +>6 leshort x %d x +>8 leshort x %d +>2 leshort >0 \b, lower left corner: %d +>4 leshort >0 \b, lower right corner: %d +>10 byte&0x1 =0x1 \b, clear first +>10 byte&0x2 =0x2 \b, no background +>10 byte&0x4 =0x4 \b, alpha channel +>10 byte&0x8 =0x8 \b, comment +>11 byte >0 \b, %d color channels +>12 byte >0 \b, %d bits per pixel +>13 byte >0 \b, %d color map channels + +# image file format (Robert Potter, potter@cs.rochester.edu) +0 string Imagefile\ version- iff image data +# this adds the whole header (inc. version number), informative but longish +>10 string >\0 %s + +# Sun raster images, from Daniel Quinlan (quinlan@yggdrasil.com) +0 belong 0x59a66a95 Sun raster image data +>4 belong >0 \b, %d x +>8 belong >0 %d, +>12 belong >0 %d-bit, +#>16 belong >0 %d bytes long, +>20 belong 0 old format, +#>20 belong 1 standard, +>20 belong 2 compressed, +>20 belong 3 RGB, +>20 belong 4 TIFF, +>20 belong 5 IFF, +>20 belong 0xffff reserved for testing, +>24 belong 0 no colormap +>24 belong 1 RGB colormap +>24 belong 2 raw colormap +#>28 belong >0 colormap is %d bytes long + +# SGI image file format, from Daniel Quinlan (quinlan@yggdrasil.com) +# +# See +# http://reality.sgi.com/grafica/sgiimage.html +# +0 beshort 474 SGI image data +#>2 byte 0 \b, verbatim +>2 byte 1 \b, RLE +#>3 byte 1 \b, normal precision +>3 byte 2 \b, high precision +>4 beshort x \b, %d-D +>6 beshort x \b, %d x +>8 beshort x %d +>10 beshort x \b, %d channel +>10 beshort !1 \bs +>80 string >0 \b, "%s" + +0 string IT01 FIT image data +>4 belong x \b, %d x +>8 belong x %d x +>12 belong x %d +# +0 string IT02 FIT image data +>4 belong x \b, %d x +>8 belong x %d x +>12 belong x %d +# +2048 string PCD_IPI Kodak Photo CD image pack file +>0xe02 byte&0x03 0x00 , landscape mode +>0xe02 byte&0x03 0x01 , portrait mode +>0xe02 byte&0x03 0x02 , landscape mode +>0xe02 byte&0x03 0x03 , portrait mode +0 string PCD_OPA Kodak Photo CD overview pack file + +# FITS format. Jeff Uphoff +# FITS is the Flexible Image Transport System, the de facto standard for +# data and image transfer, storage, etc., for the astronomical community. +# (FITS floating point formats are big-endian.) +0 string SIMPLE\ \ = FITS image data +>109 string 8 \b, 8-bit, character or unsigned binary integer +>108 string 16 \b, 16-bit, two's complement binary integer +>107 string \ 32 \b, 32-bit, two's complement binary integer +>107 string -32 \b, 32-bit, floating point, single precision +>107 string -64 \b, 64-bit, floating point, double precision + +# other images +0 string This\ is\ a\ BitMap\ file Lisp Machine bit-array-file +0 string =!! Bennet Yee's "face" format + +# From SunOS 5.5.1 "/etc/magic" - appeared right before Sun raster image +# stuff. +# +0 beshort 0x1010 PEX Binary Archive + +# DICOM medical imaging data +128 string DICM DICOM medical imaging data + +# XWD - X Window Dump file. +# As described in /usr/X11R6/include/X11/XWDFile.h +# used by the xwd program. +# Bradford Castalia, idaeim, 1/01 +4 belong 7 XWD X Window Dump image data +>100 string >\0 \b, "%s" +>16 belong x \b, %dx +>20 belong x \b%dx +>12 belong x \b%d + +# PDS - Planetary Data System +# These files use Parameter Value Language in the header section. +# Unfortunately, there is no certain magic, but the following +# strings have been found to be most likely. +0 string NJPL1I00 PDS (JPL) image data +2 string NJPL1I PDS (JPL) image data +0 string CCSD3ZF PDS (CCSD) image data +2 string CCSD3Z PDS (CCSD) image data +0 string PDS_ PDS image data +0 string LBLSIZE= PDS (VICAR) image data + +# pM8x: ATARI STAD compressed bitmap format +# +# from Oskar Schirmer Feb 2, 2001 +# p M 8 5/6 xx yy zz data... +# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed. +# bytes either run horizontally (pM85) or vertically (pM86). yy is the +# most frequent byte, xx and zz are runlength escape codes, where xx is +# used for runs of yy. +# +0 string pM85 Atari ST STAD bitmap image data (hor) +>5 byte 0x00 (white background) +>5 byte 0xFF (black background) +0 string pM86 Atari ST STAD bitmap image data (vert) +>5 byte 0x00 (white background) +>5 byte 0xFF (black background) + +# Gürkan Sengün , www.linuks.mine.nu +# http://www.atarimax.com/jindroush.atari.org/afmtatr.html +0 leshort 0x0296 Atari ATR image + +# XXX: +# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other +# magic. +# SGI RICE image file +#0 beshort 0x5249 RICE image +#>2 beshort x v%d +#>4 beshort x (%d x +#>6 beshort x %d) +#>8 beshort 0 8 bit +#>8 beshort 1 10 bit +#>8 beshort 2 12 bit +#>8 beshort 3 13 bit +#>10 beshort 0 4:2:2 +#>10 beshort 1 4:2:2:4 +#>10 beshort 2 4:4:4 +#>10 beshort 3 4:4:4:4 +#>12 beshort 1 RGB +#>12 beshort 2 CCIR601 +#>12 beshort 3 RP175 +#>12 beshort 4 YUV + +#------------------------------------------------------------------------------ +# +# Marco Schmidt (marcoschmidt@users.sourceforge.net) -- an image file format +# for the EPOC operating system, which is used with PDAs like those from Psion +# +# see http://huizen.dds.nl/~frodol/psiconv/html/Index.html for a description +# of various EPOC file formats + +0 string \x37\x00\x00\x10\x42\x00\x00\x10\x00\x00\x00\x00\x39\x64\x39\x47 EPOC MBM image file + +# PCX image files +# From: Dan Fandrich +0 beshort 0x0a00 PCX ver. 2.5 image data +0 beshort 0x0a02 PCX ver. 2.8 image data, with palette +0 beshort 0x0a03 PCX ver. 2.8 image data, without palette +0 beshort 0x0a04 PCX for Windows image data +0 beshort 0x0a05 PCX ver. 3.0 image data +>4 leshort x bounding box [%hd, +>6 leshort x %hd] - +>8 leshort x [%hd, +>10 leshort x %hd], +>65 byte >1 %d planes each of +>3 byte x %hhd-bit +>68 byte 0 image, +>68 byte 1 colour, +>68 byte 2 grayscale, +>68 byte >2 image, +>68 byte <0 image, +>12 leshort >0 %hd x +>>14 leshort x %hd dpi, +>2 byte 0 uncompressed +>2 byte 1 RLE compressed + +# Adobe Photoshop +0 string 8BPS Adobe Photoshop Image + +# XV thumbnail indicator (ThMO) +0 string P7\ 332 XV thumbnail image data + +# NITF is defined by United States MIL-STD-2500A +0 string NITF National Imagery Transmission Format +>25 string >\0 dated %.14s + +# GEM Image: Version 1, Headerlen 8 (Wolfram Kleff) +0 belong 0x00010008 GEM Image data +>12 beshort x %d x +>14 beshort x %d, +>4 beshort x %d planes, +>8 beshort x %d x +>10 beshort x %d pixelsize + +# GEM Metafile (Wolfram Kleff) +0 lelong 0x0018FFFF GEM Metafile data +>4 leshort x version %d + +# +# SMJPEG. A custom Motion JPEG format used by Loki Entertainment +# Software Torbjorn Andersson . +# +0 string \0\nSMJPEG SMJPEG +>8 belong x %d.x data +# According to the specification you could find any number of _TXT +# headers here, but I can't think of any way of handling that. None of +# the SMJPEG files I tried it on used this feature. Even if such a +# file is encountered the output should still be reasonable. +>16 string _SND \b, +>>24 beshort >0 %d Hz +>>26 byte 8 8-bit +>>26 byte 16 16-bit +>>28 string NONE uncompressed +# >>28 string APCM ADPCM compressed +>>27 byte 1 mono +>>28 byte 2 stereo +# Help! Isn't there any way to avoid writing this part twice? +>>32 string _VID \b, +# >>>48 string JFIF JPEG +>>>40 belong >0 %d frames +>>>44 beshort >0 (%d x +>>>46 beshort >0 %d) +>16 string _VID \b, +# >>32 string JFIF JPEG +>>24 belong >0 %d frames +>>28 beshort >0 (%d x +>>30 beshort >0 %d) + +0 string Paint\ Shop\ Pro\ Image\ File Paint Shop Pro Image File + +# "thumbnail file" (icon) +# descended from "xv", but in use by other applications as well (Wolfram Kleff) +0 string P7\ 332 XV "thumbnail file" (icon) data + +# taken from fkiss: ( ?) +0 string KiSS KISS/GS +>4 byte 16 color +>>5 byte x %d bit +>>8 leshort x %d colors +>>10 leshort x %d groups +>4 byte 32 cell +>>5 byte x %d bit +>>8 leshort x %d x +>>10 leshort x %d +>>12 leshort x +%d +>>14 leshort x +%d + +# Webshots (www.webshots.com), by John Harrison +0 string C\253\221g\230\0\0\0 Webshots Desktop .wbz file + +# Hercules DASD image files +# From Jan Jaeger +0 string CKD_P370 Hercules CKD DASD image file +>8 long x \b, %d heads per cylinder +>12 long x \b, track size %d bytes +>16 byte x \b, device type 33%2.2X + +0 string CKD_C370 Hercules compressed CKD DASD image file +>8 long x \b, %d heads per cylinder +>12 long x \b, track size %d bytes +>16 byte x \b, device type 33%2.2X + +0 string CKD_S370 Hercules CKD DASD shadow file +>8 long x \b, %d heads per cylinder +>12 long x \b, track size %d bytes +>16 byte x \b, device type 33%2.2X + +# Squeak images and - etoffi@softhome.net +0 string \146\031\0\0 Squeak image data +0 string 'From\040Squeak Squeak program text + +# partimage: file(1) magic for PartImage files (experimental, incomplete) +# Author: Hans-Joachim Baader +0 string PaRtImAgE-VoLuMe PartImage +>0x0020 string 0.6.1 file version %s +>>0x0060 lelong >-1 volume %ld +#>>0x0064 8 byte identifier +#>>0x007c reserved +>>0x0200 string >\0 type %s +>>0x1400 string >\0 device %s, +>>0x1600 string >\0 original filename %s, +# Some fields omitted +>>0x2744 lelong 0 not compressed +>>0x2744 lelong 1 gzip compressed +>>0x2744 lelong 2 bzip2 compressed +>>0x2744 lelong >2 compressed with unknown algorithm +>0x0020 string >0.6.1 file version %s +>0x0020 string <0.6.1 file version %s + +# DCX is multi-page PCX, using a simple header of up to 1024 +# offsets for the respective PCX components. +# From: Joerg Wunsch +0 lelong 987654321 DCX multi-page PCX image data + +# Simon Walton +# Kodak Cineon format for scanned negatives +# http://www.kodak.com/US/en/motion/support/dlad/ +0 lelong 0xd75f2a80 Cineon image data +>200 belong >0 \b, %ld x +>204 belong >0 %ld + + +# Bio-Rad .PIC is an image format used by microscope control systems +# and related image processing software used by biologists. +# From: Vebjorn Ljosa +54 leshort 12345 Bio-Rad .PIC Image File +>0 leshort >0 %hd x +>2 leshort >0 %hd, +>4 leshort =1 1 image in file +>4 leshort >1 %hd images in file + +# From Jan "Yenya" Kasprzak +# The description of *.mrw format can be found at +# http://www.dalibor.cz/minolta/raw_file_format.htm +0 string \000MRM Minolta Dimage camera raw image data + +# From: stephane.loeuillet@tiscali.f +# http://www.djvuzone.org/ +0 string AT&TFORM DjVu Image file + +# From: Jason Bacon +0 beshort 0x3020 character Computer Graphics Metafile + +# From Marc Espie +0 lelong 20000630 OpenEXR image data + +# From: Tom Hilinski +# http://www.unidata.ucar.edu/packages/netcdf/ +0 string CDF\001 NetCDF Data Format data + +#----------------------------------------------------------------------- +# Hierarchical Data Format, used to facilitate scientific data exchange +# specifications at http://hdf.ncsa.uiuc.edu/ +0 belong 0x0e031301 Hierarchical Data Format (version 4) data +0 string \211HDF\r\n\032 Hierarchical Data Format (version 5) data + +# From: Tobias Burnus +# Xara (for a while: Corel Xara) is a graphic package, see +# http://www.xara.com/ for Windows and as GPL application for +0 string XARA\243\243 Xara graphics file + +#------------------------------------------------------------------------------ +# intel: file(1) magic for x86 Unix +# +# Various flavors of x86 UNIX executable/object (other than Xenix, which +# is in "microsoft"). DOS is in "msdos"; the ambitious soul can do +# Windows as well. +# +# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and +# whatever comes next (HP-PA Hummingbird?). OS/2 may also go elsewhere +# as well, if, as, and when IBM makes it portable. +# +# The `versions' should be un-commented if they work for you. +# (Was the problem just one of endianness?) +# +0 leshort 0502 basic-16 executable +>12 lelong >0 not stripped +#>22 leshort >0 - version %ld +0 leshort 0503 basic-16 executable (TV) +>12 lelong >0 not stripped +#>22 leshort >0 - version %ld +0 leshort 0510 x86 executable +>12 lelong >0 not stripped +0 leshort 0511 x86 executable (TV) +>12 lelong >0 not stripped +0 leshort =0512 iAPX 286 executable small model (COFF) +>12 lelong >0 not stripped +#>22 leshort >0 - version %ld +0 leshort =0522 iAPX 286 executable large model (COFF) +>12 lelong >0 not stripped +#>22 leshort >0 - version %ld +# SGI labeled the next entry as "iAPX 386 executable" --Dan Quinlan +0 leshort =0514 80386 COFF executable +>12 lelong >0 not stripped +>22 leshort >0 - version %ld + +# rom: file(1) magic for BIOS ROM Extensions found in intel machines +# mapped into memory between 0xC0000 and 0xFFFFF +# From Gürkan Sengün , www.linuks.mine.nu +0 beshort 0x55AA BIOS (ia32) ROM Ext. +>5 string USB USB +>7 string LDR UNDI image +>30 string IBM IBM comp. Video +>26 string Adaptec Adaptec +>28 string Adaptec Adaptec +>42 string PROMISE Promise +>2 byte x (%d*512) + +#------------------------------------------------------------------------------ +# interleaf: file(1) magic for InterLeaf TPS: +# +0 string =\210OPS Interleaf saved data +0 string =5 string ,\ Version\ = \b, version +>>17 string >\0 %.3s + +#------------------------------------------------------------------------------ +# island: file(1) magic for IslandWite/IslandDraw, from SunOS 5.5.1 +# "/etc/magic": +# From: guy@netapp.com (Guy Harris) +# +4 string pgscriptver IslandWrite document +13 string DrawFile IslandDraw document + + +#------------------------------------------------------------------------------ +# ispell: file(1) magic for ispell +# +# Ispell 3.0 has a magic of 0x9601 and ispell 3.1 has 0x9602. This magic +# will match 0x9600 through 0x9603 in *both* little endian and big endian. +# (No other current magic entries collide.) +# +# Updated by Daniel Quinlan (quinlan@yggdrasil.com) +# +0 leshort&0xFFFC 0x9600 little endian ispell +>0 byte 0 hash file (?), +>0 byte 1 3.0 hash file, +>0 byte 2 3.1 hash file, +>0 byte 3 hash file (?), +>2 leshort 0x00 8-bit, no capitalization, 26 flags +>2 leshort 0x01 7-bit, no capitalization, 26 flags +>2 leshort 0x02 8-bit, capitalization, 26 flags +>2 leshort 0x03 7-bit, capitalization, 26 flags +>2 leshort 0x04 8-bit, no capitalization, 52 flags +>2 leshort 0x05 7-bit, no capitalization, 52 flags +>2 leshort 0x06 8-bit, capitalization, 52 flags +>2 leshort 0x07 7-bit, capitalization, 52 flags +>2 leshort 0x08 8-bit, no capitalization, 128 flags +>2 leshort 0x09 7-bit, no capitalization, 128 flags +>2 leshort 0x0A 8-bit, capitalization, 128 flags +>2 leshort 0x0B 7-bit, capitalization, 128 flags +>2 leshort 0x0C 8-bit, no capitalization, 256 flags +>2 leshort 0x0D 7-bit, no capitalization, 256 flags +>2 leshort 0x0E 8-bit, capitalization, 256 flags +>2 leshort 0x0F 7-bit, capitalization, 256 flags +>4 leshort >0 and %d string characters +0 beshort&0xFFFC 0x9600 big endian ispell +>1 byte 0 hash file (?), +>1 byte 1 3.0 hash file, +>1 byte 2 3.1 hash file, +>1 byte 3 hash file (?), +>2 beshort 0x00 8-bit, no capitalization, 26 flags +>2 beshort 0x01 7-bit, no capitalization, 26 flags +>2 beshort 0x02 8-bit, capitalization, 26 flags +>2 beshort 0x03 7-bit, capitalization, 26 flags +>2 beshort 0x04 8-bit, no capitalization, 52 flags +>2 beshort 0x05 7-bit, no capitalization, 52 flags +>2 beshort 0x06 8-bit, capitalization, 52 flags +>2 beshort 0x07 7-bit, capitalization, 52 flags +>2 beshort 0x08 8-bit, no capitalization, 128 flags +>2 beshort 0x09 7-bit, no capitalization, 128 flags +>2 beshort 0x0A 8-bit, capitalization, 128 flags +>2 beshort 0x0B 7-bit, capitalization, 128 flags +>2 beshort 0x0C 8-bit, no capitalization, 256 flags +>2 beshort 0x0D 7-bit, no capitalization, 256 flags +>2 beshort 0x0E 8-bit, capitalization, 256 flags +>2 beshort 0x0F 7-bit, capitalization, 256 flags +>4 beshort >0 and %d string characters +# ispell 4.0 hash files kromJx +# Ispell 4.0 +0 string ISPL ispell +>4 long x hash file version %d, +>8 long x lexletters %d, +>12 long x lexsize %d, +>16 long x hashsize %d, +>20 long x stblsize %d +#------------------------------------------------------------ +# Java ByteCode and Mach-O binaries (e.g., Mac OS X) use the +# same magic number, 0xcafebabe, so they are both handled +# in the entry called "cafebabe". +#------------------------------------------------------------ +# Java serialization +# From Martin Pool (m.pool@pharos.com.au) +0 beshort 0xaced Java serialization data +>2 beshort >0x0004 \b, version %d + +#------------------------------------------------------------------------------ +# JPEG images +# SunOS 5.5.1 had +# +# 0 string \377\330\377\340 JPEG file +# 0 string \377\330\377\356 JPG file +# +# both of which turn into "JPEG image data" here. +# +0 beshort 0xffd8 JPEG image data +>6 string JFIF \b, JFIF standard +# The following added by Erik Rossen 1999-09-06 +# in a vain attempt to add image size reporting for JFIF. Note that these +# tests are not fool-proof since some perfectly valid JPEGs are currently +# impossible to specify in magic(4) format. +# First, a little JFIF version info: +>>11 byte x \b %d. +>>12 byte x \b%02d +# Next, the resolution or aspect ratio of the image: +#>>13 byte 0 \b, aspect ratio +#>>13 byte 1 \b, resolution (DPI) +#>>13 byte 2 \b, resolution (DPCM) +#>>4 beshort x \b, segment length %d +# Next, show thumbnail info, if it exists: +>>18 byte !0 \b, thumbnail %dx +>>>19 byte x \b%d + +# EXIF moved down here to avoid reporting a bogus version number, +# and EXIF version number printing added. +# - Patrik R=E5dman +>6 string Exif \b, EXIF standard +# Look for EXIF IFD offset in IFD 0, and then look for EXIF version tag in EXIF IFD. +# All possible combinations of entries have to be enumerated, since no looping +# is possible. And both endians are possible... +# The combinations included below are from real-world JPEGs. +# Little-endian +>>12 string II +# IFD 0 Entry #5: +>>>70 leshort 0x8769 +# EXIF IFD Entry #1: +>>>>(78.l+14) leshort 0x9000 +>>>>>(78.l+23) byte x %c +>>>>>(78.l+24) byte x \b.%c +>>>>>(78.l+25) byte !0x30 \b%c +# IFD 0 Entry #9: +>>>118 leshort 0x8769 +# EXIF IFD Entry #3: +>>>>(126.l+38) leshort 0x9000 +>>>>>(126.l+47) byte x %c +>>>>>(126.l+48) byte x \b.%c +>>>>>(126.l+49) byte !0x30 \b%c +# IFD 0 Entry #10 +>>>130 leshort 0x8769 +# EXIF IFD Entry #3: +>>>>(138.l+38) leshort 0x9000 +>>>>>(138.l+47) byte x %c +>>>>>(138.l+48) byte x \b.%c +>>>>>(138.l+49) byte !0x30 \b%c +# EXIF IFD Entry #4: +>>>>(138.l+50) leshort 0x9000 +>>>>>(138.l+59) byte x %c +>>>>>(138.l+60) byte x \b.%c +>>>>>(138.l+61) byte !0x30 \b%c +# EXIF IFD Entry #5: +>>>>(138.l+62) leshort 0x9000 +>>>>>(138.l+71) byte x %c +>>>>>(138.l+72) byte x \b.%c +>>>>>(138.l+73) byte !0x30 \b%c +# IFD 0 Entry #11 +>>>142 leshort 0x8769 +# EXIF IFD Entry #3: +>>>>(150.l+38) leshort 0x9000 +>>>>>(150.l+47) byte x %c +>>>>>(150.l+48) byte x \b.%c +>>>>>(150.l+49) byte !0x30 \b%c +# EXIF IFD Entry #4: +>>>>(150.l+50) leshort 0x9000 +>>>>>(150.l+59) byte x %c +>>>>>(150.l+60) byte x \b.%c +>>>>>(150.l+61) byte !0x30 \b%c +# EXIF IFD Entry #5: +>>>>(150.l+62) leshort 0x9000 +>>>>>(150.l+71) byte x %c +>>>>>(150.l+72) byte x \b.%c +>>>>>(150.l+73) byte !0x30 \b%c +# Big-endian +>>12 string MM +# IFD 0 Entry #9: +>>>118 beshort 0x8769 +# EXIF IFD Entry #1: +>>>>(126.L+14) beshort 0x9000 +>>>>>(126.L+23) byte x %c +>>>>>(126.L+24) byte x \b.%c +>>>>>(126.L+25) byte !0x30 \b%c +# EXIF IFD Entry #3: +>>>>(126.L+38) beshort 0x9000 +>>>>>(126.L+47) byte x %c +>>>>>(126.L+48) byte x \b.%c +>>>>>(126.L+49) byte !0x30 \b%c +# IFD 0 Entry #10 +>>>130 beshort 0x8769 +# EXIF IFD Entry #3: +>>>>(138.L+38) beshort 0x9000 +>>>>>(138.L+47) byte x %c +>>>>>(138.L+48) byte x \b.%c +>>>>>(138.L+49) byte !0x30 \b%c +# EXIF IFD Entry #5: +>>>>(138.L+62) beshort 0x9000 +>>>>>(138.L+71) byte x %c +>>>>>(138.L+72) byte x \b.%c +>>>>>(138.L+73) byte !0x30 \b%c +# IFD 0 Entry #11 +>>>142 beshort 0x8769 +# EXIF IFD Entry #4: +>>>>(150.L+50) beshort 0x9000 +>>>>>(150.L+59) byte x %c +>>>>>(150.L+60) byte x \b.%c +>>>>>(150.L+61) byte !0x30 \b%c +# Here things get sticky. We can do ONE MORE marker segment with +# indirect addressing, and that's all. It would be great if we could +# do pointer arithemetic like in an assembler language. Christos? +# And if there was some sort of looping construct to do searches, plus a few +# named accumulators, it would be even more effective... +# At least we can show a comment if no other segments got inserted before: +>(4.S+5) byte 0xFE +>>(4.S+8) string >\0 \b, comment: "%s" +#>(4.S+5) byte 0xFE \b, comment +#>>(4.S+6) beshort x \b length=%d +#>>(4.S+8) string >\0 \b, "%s" +# Or, we can show the encoding type (I've included only the three most common) +# and image dimensions if we are lucky and the SOFn (image segment) is here: +>(4.S+5) byte 0xC0 \b, baseline +>>(4.S+6) byte x \b, precision %d +>>(4.S+7) beshort x \b, %dx +>>(4.S+9) beshort x \b%d +>(4.S+5) byte 0xC1 \b, extended sequential +>>(4.S+6) byte x \b, precision %d +>>(4.S+7) beshort x \b, %dx +>>(4.S+9) beshort x \b%d +>(4.S+5) byte 0xC2 \b, progressive +>>(4.S+6) byte x \b, precision %d +>>(4.S+7) beshort x \b, %dx +>>(4.S+9) beshort x \b%d +# I've commented-out quantisation table reporting. I doubt anyone cares yet. +#>(4.S+5) byte 0xDB \b, quantisation table +#>>(4.S+6) beshort x \b length=%d +#>14 beshort x \b, %d x +#>16 beshort x \b %d + +# HSI is Handmade Software's proprietary JPEG encoding scheme +0 string hsi1 JPEG image data, HSI proprietary + +# From: David Santinoli +0 string \x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A JPEG 2000 image data + +#------------------------------------------------------------------------------ +# karma: file(1) magic for Karma data files +# +# From + +0 string KarmaRHD Version Karma Data Structure Version +>16 belong x %lu +#------------------------------------------------------------------------------ +# DEC SRC Virtual Paper: Lectern files +# Karl M. Hegbloom +0 string lect DEC SRC Virtual Paper Lectern file + +#------------------------------------------------------------------------------ +# lex: file(1) magic for lex +# +# derived empirically, your offsets may vary! +53 string yyprevious C program text (from lex) +>3 string >\0 for %s +# C program text from GNU flex, from Daniel Quinlan +21 string generated\ by\ flex C program text (from flex) +# lex description file, from Daniel Quinlan +0 string %{ lex description text + +#------------------------------------------------------------------------------ +# lif: file(1) magic for lif +# +# (Daniel Quinlan ) +# +0 beshort 0x8000 lif file + +#------------------------------------------------------------------------------ +# linux: file(1) magic for Linux files +# +# Values for Linux/i386 binaries, from Daniel Quinlan +# The following basic Linux magic is useful for reference, but using +# "long" magic is a better practice in order to avoid collisions. +# +# 2 leshort 100 Linux/i386 +# >0 leshort 0407 impure executable (OMAGIC) +# >0 leshort 0410 pure executable (NMAGIC) +# >0 leshort 0413 demand-paged executable (ZMAGIC) +# >0 leshort 0314 demand-paged executable (QMAGIC) +# +0 lelong 0x00640107 Linux/i386 impure executable (OMAGIC) +>16 lelong 0 \b, stripped +0 lelong 0x00640108 Linux/i386 pure executable (NMAGIC) +>16 lelong 0 \b, stripped +0 lelong 0x0064010b Linux/i386 demand-paged executable (ZMAGIC) +>16 lelong 0 \b, stripped +0 lelong 0x006400cc Linux/i386 demand-paged executable (QMAGIC) +>16 lelong 0 \b, stripped +# +0 string \007\001\000 Linux/i386 object file +>20 lelong >0x1020 \b, DLL library +# Linux-8086 stuff: +0 string \01\03\020\04 Linux-8086 impure executable +>28 long !0 not stripped +0 string \01\03\040\04 Linux-8086 executable +>28 long !0 not stripped +# +0 string \243\206\001\0 Linux-8086 object file +# +0 string \01\03\020\20 Minix-386 impure executable +>28 long !0 not stripped +0 string \01\03\040\20 Minix-386 executable +>28 long !0 not stripped +# core dump file, from Bill Reynolds +216 lelong 0421 Linux/i386 core file +>220 string >\0 of '%s' +>200 lelong >0 (signal %d) +# +# LILO boot/chain loaders, from Daniel Quinlan +# this can be overridden by the DOS executable (COM) entry +2 string LILO Linux/i386 LILO boot/chain loader +# +# PSF fonts, from H. Peter Anvin +0 leshort 0x0436 Linux/i386 PC Screen Font data, +>2 byte 0 256 characters, no directory, +>2 byte 1 512 characters, no directory, +>2 byte 2 256 characters, Unicode directory, +>2 byte 3 512 characters, Unicode directory, +>3 byte >0 8x%d +# Linux swap file, from Daniel Quinlan +4086 string SWAP-SPACE Linux/i386 swap file +# From: Jeff Bailey +# Linux swap file with swsusp1 image, from Jeff Bailey +4076 string SWAPSPACE2S1SUSPEND Linux/i386 swap file (new style) with SWSUSP1 image +# according to man page of mkswap (8) March 1999 +4086 string SWAPSPACE2 Linux/i386 swap file (new style) +>0x400 long x %d (4K pages) +>0x404 long x size %d pages +>>4086 string SWAPSPACE2 +>>>1052 string >\0 Label %s +# ECOFF magic for OSF/1 and Linux (only tested under Linux though) +# +# from Erik Troan (ewt@redhat.com) examining od dumps, so this +# could be wrong +# updated by David Mosberger (davidm@azstarnet.com) based on +# GNU BFD and MIPS info found below. +# +0 leshort 0x0183 ECOFF alpha +>24 leshort 0407 executable +>24 leshort 0410 pure +>24 leshort 0413 demand paged +>8 long >0 not stripped +>8 long 0 stripped +>23 leshort >0 - version %ld. +# +# Linux kernel boot images, from Albert Cahalan +# and others such as Axel Kohlmeyer +# and Nicolįs Lichtmaier +# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29 +# Linux kernel boot images (i386 arch) (Wolfram Kleff) +514 string HdrS Linux kernel +>510 leshort 0xAA55 x86 boot executable +>>518 leshort >=0x200 +>>529 byte 0 zImage, +>>>529 byte 1 bzImage, +>>>(526.s+0x200) string >\0 version %s, +>>498 leshort 1 RO-rootFS, +>>498 leshort 0 RW-rootFS, +>>508 leshort >0 root_dev 0x%X, +>>502 leshort >0 swap_dev 0x%X, +>>504 leshort >0 RAMdisksize %u KB, +>>506 leshort 0xFFFF Normal VGA +>>506 leshort 0xFFFE Extended VGA +>>506 leshort 0xFFFD Prompt for Videomode +>>506 leshort >0 Video mode %d +# This also matches new kernels, which were caught above by "HdrS". +0 belong 0xb8c0078e Linux kernel +>0x1e3 string Loading version 1.3.79 or older +>0x1e9 string Loading from prehistoric times + +# System.map files - Nicolįs Lichtmaier +8 string \ A\ _text Linux kernel symbol map text + +# LSM entries - Nicolįs Lichtmaier +0 string Begin3 Linux Software Map entry text +0 string Begin4 Linux Software Map entry text (new format) + +# From Matt Zimmerman +0 belong 0x4f4f4f4d User-mode Linux COW file +>4 belong x \b, version %d +>8 string >\0 \b, backing file %s + +############################################################################ +# Linux kernel versions + +0 string \xb8\xc0\x07\x8e\xd8\xb8\x00\x90 Linux +>497 leshort 0 x86 boot sector +>>514 belong 0x8e of a kernel from the dawn of time! +>>514 belong 0x908ed8b4 version 0.99-1.1.42 +>>514 belong 0x908ed8b8 for memtest86 + +>497 leshort !0 x86 kernel +>>504 leshort >0 RAMdisksize=%u KB +>>502 leshort >0 swap=0x%X +>>508 leshort >0 root=0x%X +>>>498 leshort 1 \b-ro +>>>498 leshort 0 \b-rw +>>506 leshort 0xFFFF vga=normal +>>506 leshort 0xFFFE vga=extended +>>506 leshort 0xFFFD vga=ask +>>506 leshort >0 vga=%d +>>514 belong 0x908ed881 version 1.1.43-1.1.45 +>>514 belong 0x15b281cd +>>>0xa8e belong 0x55AA5a5a version 1.1.46-1.2.13,1.3.0 +>>>0xa99 belong 0x55AA5a5a version 1.3.1,2 +>>>0xaa3 belong 0x55AA5a5a version 1.3.3-1.3.30 +>>>0xaa6 belong 0x55AA5a5a version 1.3.31-1.3.41 +>>>0xb2b belong 0x55AA5a5a version 1.3.42-1.3.45 +>>>0xaf7 belong 0x55AA5a5a version 1.3.46-1.3.72 +>>514 string HdrS +>>>518 leshort >0x1FF +>>>>529 byte 0 \b, zImage +>>>>529 byte 1 \b, bzImage +>>>>(526.s+0x200) string >\0 \b, version %s + +# Linux boot sector thefts. +0 belong 0xb8c0078e Linux +>0x1e6 belong 0x454c4b53 ELKS Kernel +>0x1e6 belong !0x454c4b53 style boot sector + +############################################################################ +# Linux 8086 executable +0 lelong&0xFF0000FF 0xC30000E9 Linux-Dev86 executable, headerless +>5 string . +>>4 string >\0 \b, libc version %s + +0 lelong&0xFF00FFFF 0x4000301 Linux-8086 executable +>2 byte&0x01 !0 \b, unmapped zero page +>2 byte&0x20 0 \b, impure +>2 byte&0x20 !0 +>>2 byte&0x10 !0 \b, A_EXEC +>2 byte&0x02 !0 \b, A_PAL +>2 byte&0x04 !0 \b, A_NSYM +>2 byte&0x08 !0 \b, A_STAND +>2 byte&0x40 !0 \b, A_PURE +>2 byte&0x80 !0 \b, A_TOVLY +>28 long !0 \b, not stripped +>37 string . +>>36 string >\0 \b, libc version %s + +# 0 lelong&0xFF00FFFF 0x10000301 ld86 I80386 executable +# 0 lelong&0xFF00FFFF 0xB000301 ld86 M68K executable +# 0 lelong&0xFF00FFFF 0xC000301 ld86 NS16K executable +# 0 lelong&0xFF00FFFF 0x17000301 ld86 SPARC executable + +# SYSLINUX boot logo files (from 'ppmtolss16' sources) +# http://syslinux.zytor.com/ +# +0 lelong =0x1413f33d SYSLINUX' LSS16 image data +>4 leshort x \b, width %d +>6 leshort x \b, height %d + +0 string OOOM User-Mode-Linux's Copy-On-Write disk image +>4 belong x version %d + +# SE Linux policy database +# From: Mike Frysinger +0 lelong 0xf97cff8c SE Linux policy +>16 lelong x v%d +>20 lelong 1 MLS +>24 lelong x %d symbols +>28 lelong x %d ocons + +# Linux Logical Volume Manager (LVM) +# Emmanuel VARAGNAT +# +# System ID, UUID and volume group name are 128 bytes long +# but they should never be full and initialized with zeros... +# +# LVM1 +# +0x0 string HM\001 LVM1 (Linux Logical Volume Manager), version 1 +>0x12c string >\0 , System ID: %s + +0x0 string HM\002 LVM1 (Linux Logical Volume Manager), version 2 +>0x12c string >\0 , System ID: %s + +# LVM2 +# +# It seems that the label header can be in one the four first sector +# of the disk... (from _find_labeller in lib/label/label.c of LVM2) +# +# 0x200 seems to be the common case + +0x218 string LVM2\ 001 LVM2 (Linux Logical Volume Manager) +# read the offset to add to the start of the header, and the header +# start in 0x200 +>(0x214.l+0x200) string >\0 , UUID: %s + +0x018 string LVM2\ 001 LVM2 (Linux Logical Volume Manager) +>(0x014.l) string >\0 , UUID: %s + +0x418 string LVM2\ 001 LVM2 (Linux Logical Volume Manager) +>(0x414.l+0x400) string >\0 , UUID: %s + +0x618 string LVM2\ 001 LVM2 (Linux Logical Volume Manager) +>(0x614.l+0x600) string >\0 , UUID: %s + +# SE Linux policy database +0 lelong 0xf97cff8c SE Linux policy +>16 lelong x v%d +>20 lelong 1 MLS +>24 lelong x %d symbols +>28 lelong x %d ocons + +# LUKS: Linux Unified Key Setup, On-Disk Format, http://luks.endorphin.org/spec +# Anthon van der Neut (anthon@mnt.org) +0 string LUKS\xba\xbe LUKS encrypted file, +>6 beshort x ver %d +>8 string x [%s, +>40 string x %s, +>72 string x %s] +>168 string x UUID: %s + + +#------------------------------------------------------------------------------ +# lisp: file(1) magic for lisp programs +# +# various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com) + +# updated by Joerg Jenderek +0 string ;; +# windows INF files often begin with semicolon and use CRLF as line end +# lisp files are mainly created on unix system with LF as line end +>2 search/2048 !\r Lisp/Scheme program text +>2 search/2048 \r Windows INF file + +0 search/256 (if\ Lisp/Scheme program text +0 search/256 (setq\ Lisp/Scheme program text +0 search/256 (defvar\ Lisp/Scheme program text +0 search/256 (defparam\ Lisp/Scheme program text +0 search/256 (defun\ Lisp/Scheme program text +0 search/256 (autoload\ Lisp/Scheme program text +0 search/256 (custom-set-variables\ Lisp/Scheme program text + +# Emacs 18 - this is always correct, but not very magical. +0 string \012( Emacs v18 byte-compiled Lisp data +# Emacs 19+ - ver. recognition added by Ian Springer +# Also applies to XEmacs 19+ .elc files; could tell them apart if we had regexp +# support or similar - Chris Chittleborough +0 string ;ELC +>4 byte >19 +>4 byte <32 Emacs/XEmacs v%d byte-compiled Lisp data + +# Files produced by CLISP Common Lisp From: Bruno Haible +0 string (SYSTEM::VERSION\040' CLISP byte-compiled Lisp program text +0 long 0x70768BD2 CLISP memory image data +0 long 0xD28B7670 CLISP memory image data, other endian + +# Files produced by GNU gettext +0 long 0xDE120495 GNU-format message catalog data +0 long 0x950412DE GNU-format message catalog data + +#.com and .bin for MIT scheme +0 string \372\372\372\372 MIT scheme (library?) + +# From: David Allouche +0 string \0 byte 0xcf 64-bit +>12 lelong 1 object +>12 lelong 2 executable +>12 lelong 3 fixed virtual memory shared library +>12 lelong 4 core +>12 lelong 5 preload executable +>12 lelong 6 dynamically linked shared library +>12 lelong 7 dynamic linker +>12 lelong 8 bundle +>12 lelong 9 dynamically linked shared library stub +>12 lelong >9 +>>12 lelong x filetype=%ld +>4 lelong <0 +>>4 lelong x architecture=%ld +>4 lelong 1 vax +>4 lelong 2 romp +>4 lelong 3 architecture=3 +>4 lelong 4 ns32032 +>4 lelong 5 ns32332 +>4 lelong 6 m68k +>4 lelong 7 i386 +>4 lelong 8 mips +>4 lelong 9 ns32532 +>4 lelong 10 architecture=10 +>4 lelong 11 hppa +>4 lelong 12 acorn +>4 lelong 13 m88k +>4 lelong 14 sparc +>4 lelong 15 i860-big +>4 lelong 16 i860 +>4 lelong 17 rs6000 +>4 lelong 18 ppc +>4 lelong 16777234 ppc64 +>4 lelong >16777234 +>>4 lelong x architecture=%ld +# +0 belong&0xfffffffe 0xfeedface Mach-O +>3 byte 0xcf 64-bit +>12 belong 1 object +>12 belong 2 executable +>12 belong 3 fixed virtual memory shared library +>12 belong 4 core +>12 belong 5 preload executable +>12 belong 6 dynamically linked shared library +>12 belong 7 dynamic linker +>12 belong 8 bundle +>12 belong 9 dynamically linked shared library stub +>12 belong >9 +>>12 belong x filetype=%ld +>4 belong <0 +>>4 belong x architecture=%ld +>4 belong 1 vax +>4 belong 2 romp +>4 belong 3 architecture=3 +>4 belong 4 ns32032 +>4 belong 5 ns32332 +>4 belong 6 for m68k architecture +# from NeXTstep 3.0 +# i.e. mc680x0_all, ignore +# >>8 belong 1 (mc68030) +>>8 belong 2 (mc68040) +>>8 belong 3 (mc68030 only) +>4 belong 7 i386 +>4 belong 8 mips +>4 belong 9 ns32532 +>4 belong 10 architecture=10 +>4 belong 11 hppa +>4 belong 12 acorn +>4 belong 13 m88k +>4 belong 14 sparc +>4 belong 15 i860-big +>4 belong 16 i860 +>4 belong 17 rs6000 +>4 belong 18 ppc +>4 belong 16777234 ppc64 +>4 belong >16777234 +>>4 belong x architecture=%ld + +#------------------------------------------------------------------------------ +# macintosh description +# +# BinHex is the Macintosh ASCII-encoded file format (see also "apple") +# Daniel Quinlan, quinlan@yggdrasil.com +11 string must\ be\ converted\ with\ BinHex BinHex binary text +>41 string x \b, version %.3s + +# Stuffit archives are the de facto standard of compression for Macintosh +# files obtained from most archives. (franklsm@tuns.ca) +0 string SIT! StuffIt Archive (data) +>2 string x : %s +0 string SITD StuffIt Deluxe (data) +>2 string x : %s +0 string Seg StuffIt Deluxe Segment (data) +>2 string x : %s + +# Newer StuffIt archives (grant@netbsd.org) +0 string StuffIt StuffIt Archive +#>162 string >0 : %s + +# Macintosh Applications and Installation binaries (franklsm@tuns.ca) +0 string APPL Macintosh Application (data) +>2 string x \b: %s + +# Macintosh System files (franklsm@tuns.ca) +0 string zsys Macintosh System File (data) +0 string FNDR Macintosh Finder (data) +0 string libr Macintosh Library (data) +>2 string x : %s +0 string shlb Macintosh Shared Library (data) +>2 string x : %s +0 string cdev Macintosh Control Panel (data) +>2 string x : %s +0 string INIT Macintosh Extension (data) +>2 string x : %s +0 string FFIL Macintosh Truetype Font (data) +>2 string x : %s +0 string LWFN Macintosh Postscript Font (data) +>2 string x : %s + +# Additional Macintosh Files (franklsm@tuns.ca) +0 string PACT Macintosh Compact Pro Archive (data) +>2 string x : %s +0 string ttro Macintosh TeachText File (data) +>2 string x : %s +0 string TEXT Macintosh TeachText File (data) +>2 string x : %s +0 string PDF Macintosh PDF File (data) +>2 string x : %s + +# MacBinary format (Eric Fischer, enf@pobox.com) +# +# Unfortunately MacBinary doesn't really have a magic number prior +# to the MacBinary III format. The checksum is really the way to +# do it, but the magic file format isn't up to the challenge. +# +# 0 byte 0 +# 1 byte # filename length +# 2 string # filename +# 65 string # file type +# 69 string # file creator +# 73 byte # Finder flags +# 74 byte 0 +# 75 beshort # vertical posn in window +# 77 beshort # horiz posn in window +# 79 beshort # window or folder ID +# 81 byte # protected? +# 82 byte 0 +# 83 belong # length of data segment +# 87 belong # length of resource segment +# 91 belong # file creation date +# 95 belong # file modification date +# 99 beshort # length of comment after resource +# 101 byte # new Finder flags +# 102 string mBIN # (only in MacBinary III) +# 106 byte # char. code of file name +# 107 byte # still more Finder flags +# 116 belong # total file length +# 120 beshort # length of add'l header +# 122 byte 129 # for MacBinary II +# 122 byte 130 # for MacBinary III +# 123 byte 129 # minimum version that can read fmt +# 124 beshort # checksum +# +# This attempts to use the version numbers as a magic number, requiring +# that the first one be 0x80, 0x81, 0x82, or 0x83, and that the second +# be 0x81. This works for the files I have, but maybe not for everyone's. + +# Unfortunately, this magic is quite weak - MPi +#122 beshort&0xFCFF 0x8081 Macintosh MacBinary data + +# MacBinary I doesn't have the version number field at all, but MacBinary II +# has been in use since 1987 so I hope there aren't many really old files +# floating around that this will miss. The original spec calls for using +# the nulls in 0, 74, and 82 as the magic number. +# +# Another possibility, that would also work for MacBinary I, is to use +# the assumption that 65-72 will all be ASCII (0x20-0x7F), that 73 will +# have bits 1 (changed), 2 (busy), 3 (bozo), and 6 (invisible) unset, +# and that 74 will be 0. So something like +# +# 71 belong&0x80804EFF 0x00000000 Macintosh MacBinary data +# +# >73 byte&0x01 0x01 \b, inited +# >73 byte&0x02 0x02 \b, changed +# >73 byte&0x04 0x04 \b, busy +# >73 byte&0x08 0x08 \b, bozo +# >73 byte&0x10 0x10 \b, system +# >73 byte&0x10 0x20 \b, bundle +# >73 byte&0x10 0x40 \b, invisible +# >73 byte&0x10 0x80 \b, locked + +#>65 string x \b, type "%4.4s" + +#>65 string 8BIM (PhotoShop) +#>65 string ALB3 (PageMaker 3) +#>65 string ALB4 (PageMaker 4) +#>65 string ALT3 (PageMaker 3) +#>65 string APPL (application) +#>65 string AWWP (AppleWorks word processor) +#>65 string CIRC (simulated circuit) +#>65 string DRWG (MacDraw) +#>65 string EPSF (Encapsulated PostScript) +#>65 string FFIL (font suitcase) +#>65 string FKEY (function key) +#>65 string FNDR (Macintosh Finder) +#>65 string GIFf (GIF image) +#>65 string Gzip (GNU gzip) +#>65 string INIT (system extension) +#>65 string LIB\ (library) +#>65 string LWFN (PostScript font) +#>65 string MSBC (Microsoft BASIC) +#>65 string PACT (Compact Pro archive) +#>65 string PDF\ (Portable Document Format) +#>65 string PICT (picture) +#>65 string PNTG (MacPaint picture) +#>65 string PREF (preferences) +#>65 string PROJ (Think C project) +#>65 string QPRJ (Think Pascal project) +#>65 string SCFL (Defender scores) +#>65 string SCRN (startup screen) +#>65 string SITD (StuffIt Deluxe) +#>65 string SPn3 (SuperPaint) +#>65 string STAK (HyperCard stack) +#>65 string Seg\ (StuffIt segment) +#>65 string TARF (Unix tar archive) +#>65 string TEXT (ASCII) +#>65 string TIFF (TIFF image) +#>65 string TOVF (Eudora table of contents) +#>65 string WDBN (Microsoft Word word processor) +#>65 string WORD (MacWrite word processor) +#>65 string XLS\ (Microsoft Excel) +#>65 string ZIVM (compress (.Z)) +#>65 string ZSYS (Pre-System 7 system file) +#>65 string acf3 (Aldus FreeHand) +#>65 string cdev (control panel) +#>65 string dfil (Desk Acessory suitcase) +#>65 string libr (library) +#>65 string nX^d (WriteNow word processor) +#>65 string nX^w (WriteNow dictionary) +#>65 string rsrc (resource) +#>65 string scbk (Scrapbook) +#>65 string shlb (shared library) +#>65 string ttro (SimpleText read-only) +#>65 string zsys (system file) + +#>69 string x \b, creator "%4.4s" + +# Somewhere, Apple has a repository of registered Creator IDs. These are +# just the ones that I happened to have files from and was able to identify. + +#>69 string 8BIM (Adobe Photoshop) +#>69 string ALD3 (PageMaker 3) +#>69 string ALD4 (PageMaker 4) +#>69 string ALFA (Alpha editor) +#>69 string APLS (Apple Scanner) +#>69 string APSC (Apple Scanner) +#>69 string BRKL (Brickles) +#>69 string BTFT (BitFont) +#>69 string CCL2 (Common Lisp 2) +#>69 string CCL\ (Common Lisp) +#>69 string CDmo (The Talking Moose) +#>69 string CPCT (Compact Pro) +#>69 string CSOm (Eudora) +#>69 string DMOV (Font/DA Mover) +#>69 string DSIM (DigSim) +#>69 string EDIT (Macintosh Edit) +#>69 string ERIK (Macintosh Finder) +#>69 string EXTR (self-extracting archive) +#>69 string Gzip (GNU gzip) +#>69 string KAHL (Think C) +#>69 string LWFU (LaserWriter Utility) +#>69 string LZIV (compress) +#>69 string MACA (MacWrite) +#>69 string MACS (Macintosh operating system) +#>69 string MAcK (MacKnowledge terminal emulator) +#>69 string MLND (Defender) +#>69 string MPNT (MacPaint) +#>69 string MSBB (Microsoft BASIC (binary)) +#>69 string MSWD (Microsoft Word) +#>69 string NCSA (NCSA Telnet) +#>69 string PJMM (Think Pascal) +#>69 string PSAL (Hunt the Wumpus) +#>69 string PSI2 (Apple File Exchange) +#>69 string R*ch (BBEdit) +#>69 string RMKR (Resource Maker) +#>69 string RSED (Resource Editor) +#>69 string Rich (BBEdit) +#>69 string SIT! (StuffIt) +#>69 string SPNT (SuperPaint) +#>69 string Unix (NeXT Mac filesystem) +#>69 string VIM! (Vim editor) +#>69 string WILD (HyperCard) +#>69 string XCEL (Microsoft Excel) +#>69 string aCa2 (Fontographer) +#>69 string aca3 (Aldus FreeHand) +#>69 string dosa (Macintosh MS-DOS file system) +#>69 string movr (Font/DA Mover) +#>69 string nX^n (WriteNow) +#>69 string pdos (Apple ProDOS file system) +#>69 string scbk (Scrapbook) +#>69 string ttxt (SimpleText) +#>69 string ufox (Foreign File Access) + +# Just in case... + +102 string mBIN MacBinary III data with surprising version number + +# sas magic from Bruce Foster (bef@nwu.edu) +# +#0 string SAS SAS +#>8 string x %s +0 string SAS SAS +>24 string DATA data file +>24 string CATALOG catalog +>24 string INDEX data file index +>24 string VIEW data view +# sas 7+ magic from Reinhold Koch (reinhold.koch@roche.com) +# +0x54 string SAS SAS 7+ +>0x9C string DATA data file +>0x9C string CATALOG catalog +>0x9C string INDEX data file index +>0x9C string VIEW data view + +# spss magic for SPSS system and portable files, +# from Bruce Foster (bef@nwu.edu). + +0 long 0xc1e2c3c9 SPSS Portable File +>40 string x %s + +0 string $FL2 SPSS System File +>24 string x %s + +# Macintosh filesystem data +# From "Tom N Harris" +# Fixed HFS+ and Partition map magic: Ethan Benson +# The MacOS epoch begins on 1 Jan 1904 instead of 1 Jan 1970, so these +# entries depend on the data arithmetic added after v.35 +# There's also some Pascal strings in here, ditto... + +# The boot block signature, according to IM:Files, is +# "for HFS volumes, this field always contains the value 0x4C4B." +# But if this is true for MFS or HFS+ volumes, I don't know. +# Alternatively, the boot block is supposed to be zeroed if it's +# unused, so a simply >0 should suffice. + +0x400 beshort 0xD2D7 Macintosh MFS data +>0 beshort 0x4C4B (bootable) +>0x40a beshort &0x8000 (locked) +>0x402 beldate-0x7C25B080 x created: %s, +>0x406 beldate-0x7C25B080 >0 last backup: %s, +>0x414 belong x block size: %d, +>0x412 beshort x number of blocks: %d, +>0x424 pstring x volume name: %s + +# "BD" is has many false positives +#0x400 beshort 0x4244 Macintosh HFS data +#>0 beshort 0x4C4B (bootable) +#>0x40a beshort &0x8000 (locked) +#>0x40a beshort ^0x0100 (mounted) +#>0x40a beshort &0x0200 (spared blocks) +#>0x40a beshort &0x0800 (unclean) +#>0x47C beshort 0x482B (Embedded HFS+ Volume) +#>0x402 beldate-0x7C25B080 x created: %s, +#>0x406 beldate-0x7C25B080 x last modified: %s, +#>0x440 beldate-0x7C25B080 >0 last backup: %s, +#>0x414 belong x block size: %d, +#>0x412 beshort x number of blocks: %d, +#>0x424 pstring x volume name: %s + +0x400 beshort 0x482B Macintosh HFS Extended +>&0 beshort x version %d data +>0 beshort 0x4C4B (bootable) +>0x404 belong ^0x00000100 (mounted) +>&2 belong &0x00000200 (spared blocks) +>&2 belong &0x00000800 (unclean) +>&2 belong &0x00008000 (locked) +>&6 string x last mounted by: '%.4s', +# really, that should be treated as a belong and we print a string +# based on the value. TN1150 only mentions '8.10' for "MacOS 8.1" +>&14 beldate-0x7C25B080 x created: %s, +# only the creation date is local time, all other timestamps in HFS+ are UTC. +>&18 bedate-0x7C25B080 x last modified: %s, +>&22 bedate-0x7C25B080 >0 last backup: %s, +>&26 bedate-0x7C25B080 >0 last checked: %s, +>&38 belong x block size: %d, +>&42 belong x number of blocks: %d, +>&46 belong x free blocks: %d + +# I don't think this is really necessary since it doesn't do much and +# anything with a valid driver descriptor will also have a valid +# partition map +#0 beshort 0x4552 Apple Device Driver data +#>&24 beshort =1 \b, MacOS + +# Is that the partition type a cstring or a pstring? Well, IM says "strings +# shorter than 32 bytes must be terminated with NULL" so I'll treat it as a +# cstring. Of course, partitions can contain more than four entries, but +# what're you gonna do? +0x200 beshort 0x504D Apple Partition data +>0x2 beshort x block size: %d, +>0x230 string x first type: %s, +>0x210 string x name: %s, +>0x254 belong x number of blocks: %d, +>0x400 beshort 0x504D +>>0x430 string x second type: %s, +>>0x410 string x name: %s, +>>0x454 belong x number of blocks: %d, +>>0x800 beshort 0x504D +>>>0x830 string x third type: %s, +>>>0x810 string x name: %s, +>>>0x854 belong x number of blocks: %d, +>>>0xa00 beshort 0x504D +>>>>0xa30 string x fourth type: %s, +>>>>0xa10 string x name: %s, +>>>>0xa54 belong x number of blocks: %d +# AFAIK, only the signature is different +0x200 beshort 0x5453 Apple Old Partition data +>0x2 beshort x block size: %d, +>0x230 string x first type: %s, +>0x210 string x name: %s, +>0x254 belong x number of blocks: %d, +>0x400 beshort 0x504D +>>0x430 string x second type: %s, +>>0x410 string x name: %s, +>>0x454 belong x number of blocks: %d, +>>0x800 beshort 0x504D +>>>0x830 string x third type: %s, +>>>0x810 string x name: %s, +>>>0x854 belong x number of blocks: %d, +>>>0xa00 beshort 0x504D +>>>>0xa30 string x fourth type: %s, +>>>>0xa10 string x name: %s, +>>>>0xa54 belong x number of blocks: %d + +# From: Remi Mommsen +0 string BOMStore Mac OS X bill of materials (BOM) fil + +#------------------------------------------------------------------------------ +# magic: file(1) magic for magic files +# +0 string #\ Magic magic text file for file(1) cmd +0 lelong 0xF11E041C magic binary file for file(1) cmd +>4 lelong x (version %d) (little endian) +0 belong 0xF11E041C magic binary file for file(1) cmd +>4 belong x (version %d) (big endian) + +#------------------------------------------------------------------------------ +# mail.news: file(1) magic for mail and news +# +# Unfortunately, saved netnews also has From line added in some news software. +#0 string From mail text +# There are tests to ascmagic.c to cope with mail and news. +0 string Relay-Version: old news text +0 string #!\ rnews batched news text +0 string N#!\ rnews mailed, batched news text +0 string Forward\ to mail forwarding text +0 string Pipe\ to mail piping text +0 string Return-Path: smtp mail text +0 string Path: news text +0 string Xref: news text +0 string From: news or mail text +0 string Article saved news text +0 string BABYL Emacs RMAIL text +0 string Received: RFC 822 mail text +0 string MIME-Version: MIME entity text +#0 string Content- MIME entity text + +# TNEF files... +0 lelong 0x223E9F78 Transport Neutral Encapsulation Format + +# From: Kevin Sullivan +0 string *mbx* MBX mail folder + +# From: Simon Matter +0 string \241\002\213\015skiplist\ file\0\0\0 Cyrus skiplist DB + +# JAM(mbp) Fidonet message area databases +# JHR file +0 string JAM\0 JAM message area header file +>12 leshort >0 (%d messages) + +# Squish Fidonet message area databases +# SQD file (requires at least one message in the area) +# XXX: Weak magic +#256 leshort 0xAFAE4453 Squish message area data file +#>4 leshort >0 (%d messages) + +#------------------------------------------------------------------------------ +# maple: file(1) magic for maple files +# "H. Nanosecond" +# Maple V release 4, a multi-purpose math program +# + +# maple library .lib +0 string \000MVR4\nI MapleVr4 library + +# .ind +# no magic for these :-( +# they are compiled indexes for maple files + +# .hdb +0 string \000\004\000\000 Maple help database + +# .mhp +# this has the form +0 string \9 string >\0 version %.1s. +>>>11 string >\0 %.1s + +# .mps +0 string \0\0\001$ Maple something +# from byte 4 it is either 'nul E' or 'soh R' +# I think 'nul E' means a file that was saved as a different name +# a sort of revision marking +# 'soh R' means new +>4 string \000\105 An old revision +>4 string \001\122 The latest save + +# .mpl +# some of these are the same as .mps above +#0000000 000 000 001 044 000 105 same as .mps +#0000000 000 000 001 044 001 122 same as .mps + +0 string #\n##\ Maple something anomalous. + +#------------------------------------------------------------------------------ +# mathematica: file(1) magic for mathematica files +# "H. Nanosecond" +# Mathematica a multi-purpose math program +# versions 2.2 and 3.0 + +#mathematica .mb +0 string \064\024\012\000\035\000\000\000 Mathematica version 2 notebook +0 string \064\024\011\000\035\000\000\000 Mathematica version 2 notebook + +# .ma +# multiple possibilites: + +0 string (*^\n\n::[\011frontEndVersion\ =\ Mathematica notebook +#>41 string >\0 %s + +#0 string (*^\n\n::[\011palette Mathematica notebook version 2.x + +#0 string (*^\n\n::[\011Information Mathematica notebook version 2.x +#>675 string >\0 %s #doesn't work well + +# there may be 'cr' instread of 'nl' in some does this matter? + +# generic: +0 string (*^\r\r::[\011 Mathematica notebook version 2.x +0 string (*^\r\n\r\n::[\011 Mathematica notebook version 2.x +0 string (*^\015 Mathematica notebook version 2.x +0 string (*^\n\r\n\r::[\011 Mathematica notebook version 2.x +0 string (*^\r::[\011 Mathematica notebook version 2.x +0 string (*^\r\n::[\011 Mathematica notebook version 2.x +0 string (*^\n\n::[\011 Mathematica notebook version 2.x +0 string (*^\n::[\011 Mathematica notebook version 2.x + + +# Mathematica .mx files + +#0 string (*This\ is\ a\ Mathematica\ binary\ dump\ file.\ It\ can\ be\ loaded\ with\ Get.*) Mathematica binary file +0 string (*This\ is\ a\ Mathematica\ binary\ Mathematica binary file +#>71 string \000\010\010\010\010\000\000\000\000\000\000\010\100\010\000\000\000 +# >71... is optional +>88 string >\0 from %s + + +# Mathematica files PBF: +# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000 +0 string MMAPBF\000\001\000\000\000\203\000\001\000 Mathematica PBF (fonts I think) + +# .ml files These are menu resources I think +# these start with "[0-9][0-9][0-9]\ A~[0-9][0-9][0-9]\ +# how to put that into a magic rule? +4 string \ A~ MAthematica .ml file + +# .nb files +#too long 0 string (***********************************************************************\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Mathematica-Compatible Notebook Mathematica 3.0 notebook +0 string (*********************** Mathematica 3.0 notebook + +# other (* matches it is a comment start in these langs +0 string (* Mathematica, or Pascal, Modula-2 or 3 code text + +######################### +# MatLab v5 +0 string MATLAB Matlab v5 mat-file +>126 short 0x494d (big endian) +>>124 beshort x version 0x%04x +>126 short 0x4d49 (little endian) +>>124 leshort x version 0x%04x + + +#------------------------------------------------------------------------------ +# matroska: file(1) magic for Matroska files +# +# See http://www.matroska.org/ +# + +# EBML id: +0 belong 0x1a45dfa3 +# DocType id: +>5 beshort 0x4282 +# DocType contents: +>>8 string matroska Matroska data + +#------------------------------------------------------------------------------ +# Mavroyanopoulos Nikos +# mcrypt: file(1) magic for mcrypt 2.2.x; +0 string \0m\3 mcrypt 2.5 encrypted data, +>4 string >\0 algorithm: %s, +>>&1 leshort >0 keysize: %d bytes, +>>>&0 string >\0 mode: %s, + +0 string \0m\2 mcrypt 2.2 encrypted data, +>3 byte 0 algorithm: blowfish-448, +>3 byte 1 algorithm: DES, +>3 byte 2 algorithm: 3DES, +>3 byte 3 algorithm: 3-WAY, +>3 byte 4 algorithm: GOST, +>3 byte 6 algorithm: SAFER-SK64, +>3 byte 7 algorithm: SAFER-SK128, +>3 byte 8 algorithm: CAST-128, +>3 byte 9 algorithm: xTEA, +>3 byte 10 algorithm: TWOFISH-128, +>3 byte 11 algorithm: RC2, +>3 byte 12 algorithm: TWOFISH-192, +>3 byte 13 algorithm: TWOFISH-256, +>3 byte 14 algorithm: blowfish-128, +>3 byte 15 algorithm: blowfish-192, +>3 byte 16 algorithm: blowfish-256, +>3 byte 100 algorithm: RC6, +>3 byte 101 algorithm: IDEA, +>4 byte 0 mode: CBC, +>4 byte 1 mode: ECB, +>4 byte 2 mode: CFB, +>4 byte 3 mode: OFB, +>4 byte 4 mode: nOFB, +>5 byte 0 keymode: 8bit +>5 byte 1 keymode: 4bit +>5 byte 2 keymode: SHA-1 hash +>5 byte 3 keymode: MD5 hash +#------------------------------------------------------------------------------ +# mime: file(1) magic for MIME encoded files +# +0 string Content-Type:\ +>14 string >\0 %s +0 string Content-Type: +>13 string >\0 %s + +#------------------------------------------------------------------------------ +# mips: file(1) magic for Silicon Graphics (MIPS, IRIS, IRIX, etc.) +# Dec Ultrix (MIPS) +# all of SGI's *current* machines and OSes run in big-endian mode on the +# MIPS machines, as far as I know. +# +# XXX - what is the blank "-" line? +# +# kbd file definitions +0 string kbd!map kbd map file +>8 byte >0 Ver %d: +>10 short >0 with %d table(s) +0 belong 0407 old SGI 68020 executable +0 belong 0410 old SGI 68020 pure executable +0 beshort 0x8765 disk quotas file +0 beshort 0x0506 IRIS Showcase file +>2 byte 0x49 - +>3 byte x - version %ld +0 beshort 0x0226 IRIS Showcase template +>2 byte 0x63 - +>3 byte x - version %ld +0 belong 0x5343464d IRIS Showcase file +>4 byte x - version %ld +0 belong 0x5443464d IRIS Showcase template +>4 byte x - version %ld +0 belong 0xdeadbabe IRIX Parallel Arena +>8 belong >0 - version %ld +# +0 beshort 0x0160 MIPSEB ECOFF executable +>20 beshort 0407 (impure) +>20 beshort 0410 (swapped) +>20 beshort 0413 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>22 byte x - version %ld +>23 byte x .%ld +# +0 beshort 0x0162 MIPSEL-BE ECOFF executable +>20 beshort 0407 (impure) +>20 beshort 0410 (swapped) +>20 beshort 0413 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>23 byte x - version %d +>22 byte x .%ld +# +0 beshort 0x6001 MIPSEB-LE ECOFF executable +>20 beshort 03401 (impure) +>20 beshort 04001 (swapped) +>20 beshort 05401 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>23 byte x - version %d +>22 byte x .%ld +# +0 beshort 0x6201 MIPSEL ECOFF executable +>20 beshort 03401 (impure) +>20 beshort 04001 (swapped) +>20 beshort 05401 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>23 byte x - version %ld +>22 byte x .%ld +# +# MIPS 2 additions +# +0 beshort 0x0163 MIPSEB MIPS-II ECOFF executable +>20 beshort 0407 (impure) +>20 beshort 0410 (swapped) +>20 beshort 0413 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>22 byte x - version %ld +>23 byte x .%ld +# +0 beshort 0x0166 MIPSEL-BE MIPS-II ECOFF executable +>20 beshort 0407 (impure) +>20 beshort 0410 (swapped) +>20 beshort 0413 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>22 byte x - version %ld +>23 byte x .%ld +# +0 beshort 0x6301 MIPSEB-LE MIPS-II ECOFF executable +>20 beshort 03401 (impure) +>20 beshort 04001 (swapped) +>20 beshort 05401 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>23 byte x - version %ld +>22 byte x .%ld +# +0 beshort 0x6601 MIPSEL MIPS-II ECOFF executable +>20 beshort 03401 (impure) +>20 beshort 04001 (swapped) +>20 beshort 05401 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>23 byte x - version %ld +>22 byte x .%ld +# +# MIPS 3 additions +# +0 beshort 0x0140 MIPSEB MIPS-III ECOFF executable +>20 beshort 0407 (impure) +>20 beshort 0410 (swapped) +>20 beshort 0413 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>22 byte x - version %ld +>23 byte x .%ld +# +0 beshort 0x0142 MIPSEL-BE MIPS-III ECOFF executable +>20 beshort 0407 (impure) +>20 beshort 0410 (swapped) +>20 beshort 0413 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>22 byte x - version %ld +>23 byte x .%ld +# +0 beshort 0x4001 MIPSEB-LE MIPS-III ECOFF executable +>20 beshort 03401 (impure) +>20 beshort 04001 (swapped) +>20 beshort 05401 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>23 byte x - version %ld +>22 byte x .%ld +# +0 beshort 0x4201 MIPSEL MIPS-III ECOFF executable +>20 beshort 03401 (impure) +>20 beshort 04001 (swapped) +>20 beshort 05401 (paged) +>8 belong >0 not stripped +>8 belong 0 stripped +>23 byte x - version %ld +>22 byte x .%ld +# +0 beshort 0x180 MIPSEB Ucode +0 beshort 0x182 MIPSEL-BE Ucode +# 32bit core file +0 belong 0xdeadadb0 IRIX core dump +>4 belong 1 of +>16 string >\0 '%s' +# 64bit core file +0 belong 0xdeadad40 IRIX 64-bit core dump +>4 belong 1 of +>16 string >\0 '%s' +# N32bit core file +0 belong 0xbabec0bb IRIX N32 core dump +>4 belong 1 of +>16 string >\0 '%s' +# New style crash dump file +0 string \x43\x72\x73\x68\x44\x75\x6d\x70 IRIX vmcore dump of +>36 string >\0 '%s' +# Trusted IRIX info +0 string SGIAUDIT SGI Audit file +>8 byte x - version %d +>9 byte x .%ld +# +0 string WNGZWZSC Wingz compiled script +0 string WNGZWZSS Wingz spreadsheet +0 string WNGZWZHP Wingz help file +# +0 string #Inventor V IRIS Inventor 1.0 file +0 string #Inventor V2 Open Inventor 2.0 file +# GLF is OpenGL stream encoding +0 string glfHeadMagic(); GLF_TEXT +4 belong 0x7d000000 GLF_BINARY_LSB_FIRST +4 belong 0x0000007d GLF_BINARY_MSB_FIRST +# GLS is OpenGL stream encoding; GLS is the successor of GLF +0 string glsBeginGLS( GLS_TEXT +4 belong 0x10000000 GLS_BINARY_LSB_FIRST +4 belong 0x00000010 GLS_BINARY_MSB_FIRST + +#------------------------------------------------------------------------------ +# mirage: file(1) magic for Mirage executables +# +# XXX - byte order? +# +0 long 31415 Mirage Assembler m.out executable +#----------------------------------------------------------------------------- +# misctools: file(1) magic for miscelanous UNIX tools. +# +0 string %%!! X-Post-It-Note text +0 string/c BEGIN:VCALENDAR vCalendar calendar file +0 string/c BEGIN:VCARD vCard visiting card + +# From: Alex Beregszaszi +4 string gtktalog GNOME Catalogue (gtktalog) +>13 string >\0 version %s + +# From: Tomasz Trojanowski +0 search/80 .la\ -\ a\ libtool\ library\ file libtool library file + +#------------------------------------------------------------------------------ +# mkid: file(1) magic for mkid(1) databases +# +# ID is the binary tags database produced by mkid(1). +# +# XXX - byte order? +# +0 string \311\304 ID tags data +>2 short >0 version %d + +#------------------------------------------------------------------------------ +# mlssa: file(1) magic for MLSSA datafiles +# +0 lelong 0xffffabcd MLSSA datafile, +>4 leshort x algorithm %d, +>10 lelong x %d samples + +#------------------------------------------------------------------------------ +# mmdf: file(1) magic for MMDF mail files +# +0 string \001\001\001\001 MMDF mailbox +#------------------------------------------------------------------------------ +# modem: file(1) magic for modem programs +# +# From: Florian La Roche +4 string Research, Digifax-G3-File +>29 byte 1 , fine resolution +>29 byte 0 , normal resolution + +0 short 0x0100 raw G3 data, byte-padded +0 short 0x1400 raw G3 data +# +# Magic data for vgetty voice formats +# (Martin Seine & Marc Eberhard) + +# +# raw modem data version 1 +# +0 string RMD1 raw modem data +>4 string >\0 (%s / +>20 short >0 compression type 0x%04x) + +# +# portable voice format 1 +# +0 string PVF1\n portable voice format +>5 string >\0 (binary %s) + +# +# portable voice format 2 +# +0 string PVF2\n portable voice format +>5 string >\0 (ascii %s) + + +#------------------------------------------------------------------------------ +# motorola: file(1) magic for Motorola 68K and 88K binaries +# +# 68K +# +0 beshort 0520 mc68k COFF +>18 beshort ^00000020 object +>18 beshort &00000020 executable +>12 belong >0 not stripped +>168 string .lowmem Apple toolbox +>20 beshort 0407 (impure) +>20 beshort 0410 (pure) +>20 beshort 0413 (demand paged) +>20 beshort 0421 (standalone) +0 beshort 0521 mc68k executable (shared) +>12 belong >0 not stripped +0 beshort 0522 mc68k executable (shared demand paged) +>12 belong >0 not stripped +# +# Motorola/UniSoft 68K Binary Compatibility Standard (BCS) +# +0 beshort 0554 68K BCS executable +# +# 88K +# +# Motorola/88Open BCS +# +0 beshort 0555 88K BCS executable +# +# Motorola S-Records, from Gerd Truschinski +0 string S0 Motorola S-Record; binary data in text format + +# ATARI ST relocatable PRG +# +# from Oskar Schirmer Feb 3, 2001 +# (according to Roland Waldi, Oct 21, 1987) +# besides the magic 0x601a, the text segment size is checked to be +# not larger than 1 MB (which is a lot on ST). +# The additional 0x601b distinction I took from Doug Lee's magic. +0 belong&0xFFFFFFF0 0x601A0000 Atari ST M68K contiguous executable +>2 belong x (txt=%ld, +>6 belong x dat=%ld, +>10 belong x bss=%ld, +>14 belong x sym=%ld) +0 belong&0xFFFFFFF0 0x601B0000 Atari ST M68K non-contig executable +>2 belong x (txt=%ld, +>6 belong x dat=%ld, +>10 belong x bss=%ld, +>14 belong x sym=%ld) + +# Atari ST/TT... program format (sent by Wolfram Kleff ) +0 beshort 0x601A Atari 68xxx executable, +>2 belong x text len %lu, +>6 belong x data len %lu, +>10 belong x BSS len %lu, +>14 belong x symboltab len %lu, +>18 belong 0 +>22 belong &0x01 fastload flag, +>22 belong &0x02 may be loaded to alternate RAM, +>22 belong &0x04 malloc may be from alternate RAM, +>22 belong x flags: 0x%lX, +>26 beshort 0 no relocation tab +>26 beshort !0 + relocation tab +>30 string SFX [Self-Extracting LZH SFX archive] +>38 string SFX [Self-Extracting LZH SFX archive] +>44 string ZIP! [Self-Extracting ZIP SFX archive] + +0 beshort 0x0064 Atari 68xxx CPX file +>8 beshort x (version %04lx) + +#------------------------------------------------------------------------------ +# msdos: file(1) magic for MS-DOS files +# + +# .BAT files (Daniel Quinlan, quinlan@yggdrasil.com) +# updated by Joerg Jenderek +0 string @ +>1 string/cB \ echo\ off MS-DOS batch file text +>1 string/cB echo\ off MS-DOS batch file text +>1 string/cB rem\ MS-DOS batch file text +>1 string/cB set\ MS-DOS batch file text + + +# OS/2 batch files are REXX. the second regex is a bit generic, oh well +# the matched commands seem to be common in REXX and uncommon elsewhere +100 regex/c =^[\ \t]{0,10}call[\ \t]{1,10}rxfunc OS/2 REXX batch file text +100 regex/c =^[\ \t]{0,10}say\ ['"] OS/2 REXX batch file text + +0 leshort 0x14c MS Windows COFF Intel 80386 object file +#>4 ledate x stamp %s +0 leshort 0x166 MS Windows COFF MIPS R4000 object file +#>4 ledate x stamp %s +0 leshort 0x184 MS Windows COFF Alpha object file +#>4 ledate x stamp %s +0 leshort 0x268 MS Windows COFF Motorola 68000 object file +#>4 ledate x stamp %s +0 leshort 0x1f0 MS Windows COFF PowerPC object file +#>4 ledate x stamp %s +0 leshort 0x290 MS Windows COFF PA-RISC object file +#>4 ledate x stamp %s + +# XXX - according to Microsoft's spec, at an offset of 0x3c in a +# PE-format executable is the offset in the file of the PE header; +# unfortunately, that's a little-endian offset, and there's no way +# to specify an indirect offset with a specified byte order. +# So, for now, we assume the standard MS-DOS stub, which puts the +# PE header at 0x80 = 128. +# +# Required OS version and subsystem version were 4.0 on some NT 3.51 +# executables built with Visual C++ 4.0, so it's not clear that +# they're interesting. The user version was 0.0, but there's +# probably some linker directive to set it. The linker version was +# 3.0, except for one ".exe" which had it as 4.20 (same damn linker!). +# +# many of the compressed formats were extraced from IDARC 1.23 source code +# +0 string MZ MS-DOS executable +>0 string MZ\0\0\0\0\0\0\0\0\0\0PE\0\0 \b, PE for MS Windows +>>&18 leshort&0x2000 >0 (DLL) +>>&88 leshort 0 (unknown subsystem) +>>&88 leshort 1 (native) +>>&88 leshort 2 (GUI) +>>&88 leshort 3 (console) +>>&88 leshort 7 (POSIX) +>>&0 leshort 0x0 unknown processor +>>&0 leshort 0x14c Intel 80386 +>>&0 leshort 0x166 MIPS R4000 +>>&0 leshort 0x184 Alpha +>>&0 leshort 0x268 Motorola 68000 +>>&0 leshort 0x1f0 PowerPC +>>&0 leshort 0x290 PA-RISC +>>&18 leshort&0x0100 >0 32-bit +>>&18 leshort&0x1000 >0 system file +>>&0xf4 search/0x140 \x0\x40\x1\x0 +>>>(&0.l+(4)) string MSCF \b, WinHKI CAB self-extracting archive + +>0x18 leshort >0x3f +>>(0x3c.l) string PE\0\0 PE +# hooray, there's a DOS extender using the PE format, with a valid PE +# executable inside (which just prints a message and exits if run in win) +>>>(8.s*16) string 32STUB for MS-DOS, 32rtm DOS extender +>>>(8.s*16) string !32STUB for MS Windows +>>>>(0x3c.l+22) leshort&0x2000 >0 (DLL) +>>>>(0x3c.l+92) leshort 0 (unknown subsystem) +>>>>(0x3c.l+92) leshort 1 (native) +>>>>(0x3c.l+92) leshort 2 (GUI) +>>>>(0x3c.l+92) leshort 3 (console) +>>>>(0x3c.l+92) leshort 7 (POSIX) +>>>>(0x3c.l+4) leshort 0x0 unknown processor +>>>>(0x3c.l+4) leshort 0x14c Intel 80386 +>>>>(0x3c.l+4) leshort 0x166 MIPS R4000 +>>>>(0x3c.l+4) leshort 0x184 Alpha +>>>>(0x3c.l+4) leshort 0x268 Motorola 68000 +>>>>(0x3c.l+4) leshort 0x1f0 PowerPC +>>>>(0x3c.l+4) leshort 0x290 PA-RISC +>>>>(0x3c.l+22) leshort&0x0100 >0 32-bit +>>>>(0x3c.l+22) leshort&0x1000 >0 system file +>>>>(0x3c.l+232) lelong >0 Mono/.Net assembly + +>>>>(0x3c.l+0xf8) string UPX0 \b, UPX compressed +>>>>(0x3c.l+0xf8) search/0x140 PEC2 \b, PECompact2 compressed +>>>>(0x3c.l+0xf8) search/0x140 UPX2 +>>>>>(&0x10.l+(-4)) string PK\3\4 \b, ZIP self-extracting archive (Info-Zip) +>>>>(0x3c.l+0xf8) search/0x140 .idata +>>>>>(&0xe.l+(-4)) string PK\3\4 \b, ZIP self-extracting archive (Info-Zip) +>>>>>(&0xe.l+(-4)) string ZZ0 \b, ZZip self-extracting archive +>>>>>(&0xe.l+(-4)) string ZZ1 \b, ZZip self-extracting archive +>>>>(0x3c.l+0xf8) search/0x140 .rsrc +>>>>>(&0x0f.l+(-4)) string a\\\4\5 \b, WinHKI self-extracting archive +>>>>>(&0x0f.l+(-4)) string Rar! \b, RAR self-extracting archive +>>>>>(&0x0f.l+(-4)) search/0x3000 MSCF \b, InstallShield self-extracting archive +>>>>>(&0x0f.l+(-4)) search/32 Nullsoft \b, Nullsoft Installer self-extracting archive +>>>>(0x3c.l+0xf8) search/0x140 .data +>>>>>(&0x0f.l) string WEXTRACT \b, MS CAB-Installer self-extracting archive +>>>>(0x3c.l+0xf8) search/0x140 .petite\0 \b, Petite compressed +>>>>>(0x3c.l+0xf7) byte x +>>>>>>(&0x104.l+(-4)) string =!sfx! \b, ACE self-extracting archive +>>>>(0x3c.l+0xf8) search/0x140 .WISE \b, WISE installer self-extracting archive +>>>>(0x3c.l+0xf8) search/0x140 .dz\0\0\0 \b, Dzip self-extracting archive +>>>>(0x3c.l+0xf8) search/0x140 .reloc +>>>>>(&0xe.l+(-4)) search/0x180 PK\3\4 \b, ZIP self-extracting archive (WinZip) + +>>>>&(0x3c.l+0xf8) search/0x100 _winzip_ \b, ZIP self-extracting archive (WinZip) +>>>>&(0x3c.l+0xf8) search/0x100 SharedD \b, Microsoft Installer self-extracting archive +>>>>0x30 string Inno \b, InnoSetup self-extracting archive + +>>(0x3c.l) string NE \b, NE +>>>(0x3c.l+0x36) byte 0 (unknown OS) +>>>(0x3c.l+0x36) byte 1 for OS/2 1.x +>>>(0x3c.l+0x36) byte 2 for MS Windows 3.x +>>>(0x3c.l+0x36) byte 3 for MS-DOS +>>>(0x3c.l+0x36) byte >3 (unknown OS) +>>>(0x3c.l+0x36) byte 0x81 for MS-DOS, Phar Lap DOS extender +>>>(0x3c.l+0x0c) leshort&0x8003 0x8002 (DLL) +>>>(0x3c.l+0x0c) leshort&0x8003 0x8001 (driver) +>>>&(&0x24.s-1) string ARJSFX \b, ARJ self-extracting archive +>>>(0x3c.l+0x70) search/0x80 WinZip(R)\ Self-Extractor \b, ZIP self-extracting archive (WinZip) + +>>(0x3c.l) string LX\0\0 \b, LX +>>>(0x3c.l+0x0a) leshort <1 (unknown OS) +>>>(0x3c.l+0x0a) leshort 1 for OS/2 +>>>(0x3c.l+0x0a) leshort 2 for MS Windows +>>>(0x3c.l+0x0a) leshort 3 for DOS +>>>(0x3c.l+0x0a) leshort >3 (unknown OS) +>>>(0x3c.l+0x10) lelong&0x28000 =0x8000 (DLL) +>>>(0x3c.l+0x10) lelong&0x20000 >0 (device driver) +>>>(0x3c.l+0x10) lelong&0x300 0x300 (GUI) +>>>(0x3c.l+0x10) lelong&0x28300 <0x300 (console) +>>>(0x3c.l+0x08) leshort 1 i80286 +>>>(0x3c.l+0x08) leshort 2 i80386 +>>>(0x3c.l+0x08) leshort 3 i80486 +>>>(8.s*16) string emx \b, emx +>>>>&1 string x %s +>>>&(&0x54.l-3) string arjsfx \b, ARJ self-extracting archive + +# MS Windows system file, supposedly a collection of LE executables +>>(0x3c.l) string W3 \b, W3 for MS Windows + +>>(0x3c.l) string LE\0\0 \b, LE executable +>>>(0x3c.l+0x0a) leshort 1 +# some DOS extenders use LE files with OS/2 header +>>>>0x240 search/0x100 DOS/4G for MS-DOS, DOS4GW DOS extender +>>>>0x240 search/0x200 WATCOM\ C/C++ for MS-DOS, DOS4GW DOS extender +>>>>0x440 search/0x100 CauseWay\ DOS\ Extender for MS-DOS, CauseWay DOS extender +>>>>0x40 search/0x40 PMODE/W for MS-DOS, PMODE/W DOS extender +>>>>0x40 search/0x40 STUB/32A for MS-DOS, DOS/32A DOS extender (stub) +>>>>0x40 search/0x80 STUB/32C for MS-DOS, DOS/32A DOS extender (configurable stub) +>>>>0x40 search/0x80 DOS/32A for MS-DOS, DOS/32A DOS extender (embedded) +# this is a wild guess; hopefully it is a specific signature +>>>>&0x24 lelong <0x50 +>>>>>(&0x4c.l) string \xfc\xb8WATCOM +>>>>>>&0 search/8 3\xdbf\xb9 \b, 32Lite compressed +# another wild guess: if real OS/2 LE executables exist, they probably have higher start EIP +#>>>>(0x3c.l+0x1c) lelong >0x10000 for OS/2 +# fails with DOS-Extenders. +>>>(0x3c.l+0x0a) leshort 2 for MS Windows +>>>(0x3c.l+0x0a) leshort 3 for DOS +>>>(0x3c.l+0x0a) leshort 4 for MS Windows (VxD) +>>>(&0x7c.l+0x26) string UPX \b, UPX compressed +>>>&(&0x54.l-3) string UNACE \b, ACE self-extracting archive + +# looks like ASCII, probably some embedded copyright message. +# and definitely not NE/LE/LX/PE +>>0x3c lelong >0x20000000 +>>>(4.s*512) leshort !0x014c \b, MZ for MS-DOS +# header data too small for extended executable +>2 long !0 +>>0x18 leshort <0x40 +>>>(4.s*512) leshort !0x014c + +>>>>&(2.s-514) string !LE +>>>>>&-2 string !BW \b, MZ for MS-DOS +>>>>&(2.s-514) string LE \b, LE +>>>>>0x240 search/0x100 DOS/4G for MS-DOS, DOS4GW DOS extender +# educated guess since indirection is still not capable enough for complex offset +# calculations (next embedded executable would be at &(&2*512+&0-2) +# I suspect there are only LE executables in these multi-exe files +>>>>&(2.s-514) string BW +>>>>>0x240 search/0x100 DOS/4G ,\b LE for MS-DOS, DOS4GW DOS extender (embedded) +>>>>>0x240 search/0x100 !DOS/4G ,\b BW collection for MS-DOS + +# This sequence skips to the first COFF segment, usually .text +>(4.s*512) leshort 0x014c \b, COFF +>>(8.s*16) string go32stub for MS-DOS, DJGPP go32 DOS extender +>>(8.s*16) string emx +>>>&1 string x for DOS, Win or OS/2, emx %s +>>&(&0x42.l-3) byte x +>>>&0x26 string UPX \b, UPX compressed +# and yet another guess: small .text, and after large .data is unusal, could be 32lite +>>&0x2c search/0xa0 .text +>>>&0x0b lelong <0x2000 +>>>>&0 lelong >0x6000 \b, 32lite compressed + +>(8.s*16) string $WdX \b, WDos/X DOS extender + +# .EXE formats (Greg Roelofs, newt@uchicago.edu) +# +>0x35 string \x8e\xc0\xb9\x08\x00\xf3\xa5\x4a\x75\xeb\x8e\xc3\x8e\xd8\x33\xff\xbe\x30\x00\x05 \b, aPack compressed +>0xe7 string LH/2\ Self-Extract \b, %s +>0x1c string diet \b, diet compressed +>0x1c string LZ09 \b, LZEXE v0.90 compressed +>0x1c string LZ91 \b, LZEXE v0.91 compressed +>0x1c string tz \b, TinyProg compressed +>0x1e string PKLITE \b, %s compressed +>0x64 string W\ Collis\0\0 \b, Compack compressed +>0x24 string LHa's\ SFX \b, LHa self-extracting archive +>0x24 string LHA's\ SFX \b, LHa self-extracting archive +>0x24 string \ $ARX \b, ARX self-extracting archive +>0x24 string \ $LHarc \b, LHarc self-extracting archive +>0x20 string SFX\ by\ LARC \b, LARC self-extracting archive +>1638 string -lh5- \b, LHa self-extracting archive v2.13S +>0x17888 string Rar! \b, RAR self-extracting archive +>0x40 string aPKG \b, aPackage self-extracting archive + +>32 string AIN +>>35 string 2 \b, AIN 2.x compressed +>>35 string <2 \b, AIN 1.x compressed +>>35 string >2 \b, AIN 1.x compressed +>28 string UC2X \b, UCEXE compressed +>28 string WWP\ \b, WWPACK compressed + +# skip to the end of the exe +>(4.s*512) long x +>>&(2.s-517) byte x +>>>&0 string PK\3\4 \b, ZIP self-extracting archive +>>>&0 string Rar! \b, RAR self-extracting archive +>>>&0 string =!\x11 \b, AIN 2.x self-extracting archive +>>>&0 string =!\x12 \b, AIN 2.x self-extracting archive +>>>&0 string =!\x17 \b, AIN 1.x self-extracting archive +>>>&0 string =!\x18 \b, AIN 1.x self-extracting archive +>>>&7 search/400 **ACE** \b, ACE self-extracting archive +>>>&0 search/0x480 UC2SFX\ Header \b, UC2 self-extracting archive + +>0x1c string RJSX \b, ARJ self-extracting archive +# winarj stores a message in the stub instead of the sig in the MZ header +>0x20 search/0xe0 aRJsfX \b, ARJ self-extracting archive + +# a few unknown ZIP sfxes, no idea if they are needed or if they are +# already captured by the generic patterns above +>122 string Windows\ self-extracting\ ZIP \b, ZIP self-extracting archive +>(8.s*16) search/0x20 PKSFX \b, ZIP self-extracting archive (PKZIP) +# TODO: how to add this? >FileSize-34 string Windows\ Self-Installing\ Executable \b, ZIP self-extracting archive +# + +# TELVOX Teleinformatica CODEC self-extractor for OS/2: +>49801 string \x79\xff\x80\xff\x76\xff \b, CODEC archive v3.21 +>>49824 leshort =1 \b, 1 file +>>49824 leshort >1 \b, %u files + +# .COM formats (Daniel Quinlan, quinlan@yggdrasil.com) +# Uncommenting only the first two lines will cover about 2/3 of COM files, +# but it isn't feasible to match all COM files since there must be at least +# two dozen different one-byte "magics". +0 byte 0xe9 DOS executable (COM) +>0x1FE leshort 0xAA55 \b, boot code +>6 string SFX\ of\ LHarc (%s) +0 belong 0xffffffff DOS executable (device driver) +#CMD640X2.SYS +>10 string >\x23 +>>10 string !\x2e +>>>17 string <\x5B +>>>>10 string x \b, name: %.8s +#UDMA.SYS KEYB.SYS CMD640X2.SYS +>10 string <\x41 +>>12 string >\x40 +>>>10 string !$ +>>>>12 string x \b, name: %.8s +#BTCDROM.SYS ASPICD.SYS +>22 string >\x40 +>>22 string <\x5B +>>>23 string <\x5B +>>>>22 string x \b, name: %.8s +#ATAPICD.SYS +>76 string \0 +>>77 string >\x40 +>>>77 string <\x5B +>>>>77 string x \b, name: %.8s +0 byte 0x8c DOS executable (COM) +# 0xeb conflicts with "sequent" magic +0 byte 0xeb DOS executable (COM) +>0x1FE leshort 0xAA55 \b, boot code +>85 string UPX \b, UPX compressed +>4 string \ $ARX \b, ARX self-extracting archive +>4 string \ $LHarc \b, LHarc self-extracting archive +>0x20e string SFX\ by\ LARC \b, LARC self-extracting archive +0 byte 0xb8 COM executable +# modified by Joerg Jenderek +>1 lelong !0x21cd4cff for DOS +# http://syslinux.zytor.com/comboot.php +# (32-bit COMBOOT) programs *.C32 contain 32-bit code and run in flat-memory 32-bit protected mode +# start with assembler instructions mov eax,21cd4cffh +>1 lelong 0x21cd4cff (32-bit COMBOOT) +0 string \x81\xfc +>4 string \x77\x02\xcd\x20\xb9 +>>36 string UPX! FREE-DOS executable (COM), UPX compressed +252 string Must\ have\ DOS\ version DR-DOS executable (COM) +# GRR search is not working +#2 search/28 \xcd\x21 COM executable for MS-DOS +#WHICHFAT.cOM +2 string \xcd\x21 COM executable for DOS +#DELTREE.cOM DELTREE2.cOM +4 string \xcd\x21 COM executable for DOS +#IFMEMDSK.cOM ASSIGN.cOM COMP.cOM +5 string \xcd\x21 COM executable for DOS +#DELTMP.COm HASFAT32.cOM +7 string \xcd\x21 +>0 byte !0xb8 COM executable for DOS +#COMP.cOM MORE.COm +10 string \xcd\x21 +>5 string !\xcd\x21 COM executable for DOS +#comecho.com +13 string \xcd\x21 COM executable for DOS +#HELP.COm EDIT.coM +18 string \xcd\x21 COM executable for MS-DOS +#NWRPLTRM.COm +23 string \xcd\x21 COM executable for MS-DOS +#LOADFIX.cOm LOADFIX.cOm +30 string \xcd\x21 COM executable for MS-DOS +#syslinux.com 3.11 +70 string \xcd\x21 COM executable for DOS +# many compressed/converted COMs start with a copy loop instead of a jump +0x6 search/0xa \xfc\x57\xf3\xa5\xc3 COM executable for MS-DOS +0x6 search/0xa \xfc\x57\xf3\xa4\xc3 COM executable for DOS +>0x18 search/0x10 \x50\xa4\xff\xd5\x73 \b, aPack compressed +0x3c string W\ Collis\0\0 COM executable for MS-DOS, Compack compressed +# FIXME: missing diet .com compression + +# miscellaneous formats +0 string LZ MS-DOS executable (built-in) +#0 byte 0xf0 MS-DOS program library data +# + +# +# Windows Registry files. +# updated by Joerg Jenderek +0 string regf Windows NT/XP registry file +0 string CREG Windows 95/98/ME registry file +0 string SHCC3 Windows 3.1 registry file + + +# AAF files: +# Stuart Cunningham +0 string \320\317\021\340\241\261\032\341AAFB\015\000OM\006\016\053\064\001\001\001\377 AAF legacy file using MS Structured Storage +>30 byte 9 (512B sectors) +>30 byte 12 (4kB sectors) +0 string \320\317\021\340\241\261\032\341\001\002\001\015\000\002\000\000\006\016\053\064\003\002\001\001 AAF file using MS Structured Storage +>30 byte 9 (512B sectors) +>30 byte 12 (4kB sectors) + +# Popular applications +# False positive with PPT +#0 string \xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xFE\xFF Microsoft Installer +2080 string Microsoft\ Word\ 6.0\ Document %s +2080 string Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data +# Pawel Wiecek (for polish Word) +2112 string MSWordDoc Microsoft Word document data +# +0 belong 0x31be0000 Microsoft Word Document +# +0 string PO^Q` Microsoft Word 6.0 Document +# +0 string \376\067\0\043 Microsoft Office Document +0 string \333\245-\0\0\0 Microsoft Office Document +# +2080 string Microsoft\ Excel\ 5.0\ Worksheet %s +2080 string Foglio\ di\ lavoro\ Microsoft\ Exce %s +# +# Pawel Wiecek (for polish Excel) +2114 string Biff5 Microsoft Excel 5.0 Worksheet +# Italian MS-Excel +2121 string Biff5 Microsoft Excel 5.0 Worksheet +0 string \x09\x04\x06\x00\x00\x00\x10\x00 Microsoft Excel Worksheet +# +0 belong 0x00001a00 Lotus 1-2-3 +>4 belong 0x00100400 wk3 document data +>4 belong 0x02100400 wk4 document data +>4 belong 0x07800100 fm3 or fmb document data +>4 belong 0x07800000 fm3 or fmb document data +# +0 belong 0x00000200 Lotus 1-2-3 +>4 belong 0x06040600 wk1 document data +>4 belong 0x06800200 fmt document data + +# Help files +0 string ?_\3\0 MS Windows Help Data + +# DeIsL1.isu what this is I don't know +0 string \161\250\000\000\001\002 DeIsL1.isu whatever that is + +# Winamp .avs +#0 string Nullsoft\ AVS\ Preset\ \060\056\061\032 A plug in for Winamp ms-windows Freeware media player +0 string Nullsoft\ AVS\ Preset\ Winamp plug in + +# Hyper terminal: +0 string HyperTerminal\ hyperterm +>15 string 1.0\ --\ HyperTerminal\ data\ file MS-windows Hyperterminal + +# Windows Metafont .WMF +0 string \327\315\306\232 ms-windows metafont .wmf +0 string \002\000\011\000 ms-windows metafont .wmf +0 string \001\000\011\000 ms-windows metafont .wmf + +#tz3 files whatever that is (MS Works files) +0 string \003\001\001\004\070\001\000\000 tz3 ms-works file +0 string \003\002\001\004\070\001\000\000 tz3 ms-works file +0 string \003\003\001\004\070\001\000\000 tz3 ms-works file + +# PGP sig files .sig +#0 string \211\000\077\003\005\000\063\237\127 065 to \027\266\151\064\005\045\101\233\021\002 PGP sig +0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig +0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig +0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig +0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig +0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig +0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig + +# windows zips files .dmf +0 string MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 MS Windows special zipped file + + +# Windows help file FTG FTS +0 string \164\146\115\122\012\000\000\000\001\000\000\000 MS Windows help cache + +# grp old windows 3.1 group files +0 string \120\115\103\103 MS Windows 3.1 group files + + +# lnk files windows symlinks +0 string \114\000\000\000\001\024\002\000\000\000\000\000\300\000\000\000\000\000\000\106 MS Windows shortcut + +#ico files +0 string \102\101\050\000\000\000\056\000\000\000\000\000\000\000 Icon for MS Windows + +# Windows icons (Ian Springer ) +0 string \000\000\001\000 MS Windows icon resource +>4 byte 1 - 1 icon +>4 byte >1 - %d icons +>>6 byte >0 \b, %dx +>>>7 byte >0 \b%d +>>8 byte 0 \b, 256-colors +>>8 byte >0 \b, %d-colors + + +# .chr files +0 string PK\010\010BGI Borland font +>4 string >\0 %s +# then there is a copyright notice + + +# .bgi files +0 string pk\010\010BGI Borland device +>4 string >\0 %s +# then there is a copyright notice + + +# recycled/info the windows trash bin index +9 string \000\000\000\030\001\000\000\000 MS Windows recycled bin info + + +##### put in Either Magic/font or Magic/news +# Acroread or something files wrongly identified as G3 .pfm +# these have the form \000 \001 any? \002 \000 \000 +# or \000 \001 any? \022 \000 \000 +#0 string \000\001 pfm? +#>3 string \022\000\000Copyright\ yes +#>3 string \002\000\000Copyright\ yes +#>3 string >\0 oops, not a font file. Cancel that. +#it clashes with ttf files so put it lower down. + +# From Doug Lee via a FreeBSD pr +9 string GERBILDOC First Choice document +9 string GERBILDB First Choice database +9 string GERBILCLIP First Choice database +0 string GERBIL First Choice device file +9 string RABBITGRAPH RabbitGraph file +0 string DCU1 Borland Delphi .DCU file +0 string =! MKS Spell hash list (old format) +0 string =! MKS Spell hash list +# Too simple - MPi +#0 string AH Halo(TM) bitmapped font file +0 lelong 0x08086b70 TurboC BGI file +0 lelong 0x08084b50 TurboC Font file + +# WARNING: below line conflicts with Infocom game data Z-machine 3 +0 byte 0x03 DBase 3 data file +>0x04 lelong 0 (no records) +>0x04 lelong >0 (%ld records) +0 byte 0x83 DBase 3 data file with memo(s) +>0x04 lelong 0 (no records) +>0x04 lelong >0 (%ld records) +0 leshort 0x0006 DBase 3 index file +0 string PMCC Windows 3.x .GRP file +1 string RDC-meg MegaDots +>8 byte >0x2F version %c +>9 byte >0x2F \b.%c file +0 lelong 0x4C +>4 lelong 0x00021401 Windows shortcut file + +# DOS EPS Binary File Header +# From: Ed Sznyter +0 belong 0xC5D0D3C6 DOS EPS Binary File +>4 long >0 Postscript starts at byte %d +>>8 long >0 length %d +>>>12 long >0 Metafile starts at byte %d +>>>>16 long >0 length %d +>>>20 long >0 TIFF starts at byte %d +>>>>24 long >0 length %d + +# TNEF magic From "Joomy" +0 leshort 0x223e9f78 TNEF + +# HtmlHelp files (.chm) +0 string ITSF\003\000\000\000\x60\000\000\000\001\000\000\000 MS Windows HtmlHelp Data + +# GFA-BASIC (Wolfram Kleff) +2 string GFA-BASIC3 GFA-BASIC 3 data + +#------------------------------------------------------------------------------ +# From Stuart Caie (developer of cabextract) +# Microsoft Cabinet files +0 string MSCF\0\0\0\0 Microsoft Cabinet archive data +>8 lelong x \b, %u bytes +>28 leshort 1 \b, 1 file +>28 leshort >1 \b, %u files + +# InstallShield Cabinet files +0 string ISc( InstallShield Cabinet archive data +>5 byte&0xf0 =0x60 version 6, +>5 byte&0xf0 !0x60 version 4/5, +>(12.l+40) lelong x %u files + +# Windows CE package files +0 string MSCE\0\0\0\0 Microsoft WinCE install header +>20 lelong 0 \b, architecture-independent +>20 lelong 103 \b, Hitachi SH3 +>20 lelong 104 \b, Hitachi SH4 +>20 lelong 0xA11 \b, StrongARM +>20 lelong 4000 \b, MIPS R4000 +>20 lelong 10003 \b, Hitachi SH3 +>20 lelong 10004 \b, Hitachi SH3E +>20 lelong 10005 \b, Hitachi SH4 +>20 lelong 70001 \b, ARM 7TDMI +>52 leshort 1 \b, 1 file +>52 leshort >1 \b, %u files +>56 leshort 1 \b, 1 registry entry +>56 leshort >1 \b, %u registry entries + +# Outlook Personal Folders +0 lelong 0x4E444221 Microsoft Outlook binary email folder +>10 leshort 0x0e (Outlook <=2002) +>10 leshort 0x17 (Outlook >=2003) + + +# From: Dirk Jagdmann +0 lelong 0x00035f3f Windows 3.x help file + +# Christophe Monniez +0 string Client\ UrlCache\ MMF Microsoft Internet Explorer Cache File +>20 string >\0 Version %s +0 string \xCF\xAD\x12\xFE Microsoft Outlook Express DBX File +>4 byte =0xC5 Message database +>4 byte =0xC6 Folder database +>4 byte =0xC7 Accounts informations +>4 byte =0x30 Offline database + + +# Windows Enhanced Metafile (EMF) +# See msdn.microsoft.com/archive/en-us/dnargdi/html/msdn_enhmeta.asp +# for further information. Note that "0 lelong 1" should be true i.e. +# the first double word in the file should be 1. With the extended +# syntax available by some file commands you could write: +# 0 lelong 1 +# &40 ulelong 0x464D4520 Windows Enhanced Metafile (EMF) image data +40 ulelong 0x464D4520 Windows Enhanced Metafile (EMF) image data +>44 ulelong x version 0x%x. +# If the description has a length greater than zero, it exists and is +# found at offset (*64). +>64 ulelong >0 Description available at offset 0x%x +>>60 ulelong >0 (length 0x%x) +# Note it would be better to print out the description, which is found +# as below. Unfortunately the following only prints out the first couple +# of characters instead of all the "description length" +# number of characters -- indicated by the ulelong at offset 60. +>>(64.l) lestring16 >0 Description: %15.15s + +# From: Alex Beregszaszi +0 string COWD VMWare3 +>4 byte 3 disk image +>>32 lelong x (%d/ +>>36 lelong x \b%d/ +>>40 lelong x \b%d) +>4 byte 2 undoable disk image +>>32 string >\0 (%s) + +0 string VMDK VMware4 disk image +0 string KDMV VMware4 disk image + +0 belong 0x514649fb QEMU Copy-On-Write disk image +>4 belong x version %d, +>24 belong x size %d + +>28 belong x %d + +0 string QEVM QEMU's suspend to disk image + +0 string Bochs\ Virtual\ HD\ Image Bochs disk image, +>32 string x type %s, +>48 string x subtype %s + +0 lelong 0x02468ace Bochs Sparse disk image + +# from http://filext.com by Derek M Jones +0 string \xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xFE\xFF Microsoft Installer +0 string \320\317\021\340\241\261\032\341 Microsoft Office Document + +#------------------------------------------------------------------------------ +# msvc: file(1) magic for msvc +# "H. Nanosecond" +# Microsoft visual C +# +# I have version 1.0 + +# .aps +0 string HWB\000\377\001\000\000\000 Microsoft Visual C .APS file + +# .ide +#too long 0 string \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157\152\145\143\164\040\106\151\154\145\012\000\032\000\002\000\262\000\272\276\372\316 MSVC .ide +0 string \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157 MSVC .ide + +# .res +0 string \000\000\000\000\040\000\000\000\377 MSVC .res +0 string \377\003\000\377\001\000\020\020\350 MSVC .res +0 string \377\003\000\377\001\000\060\020\350 MSVC .res + +#.lib +0 string \360\015\000\000 Microsoft Visual C library +0 string \360\075\000\000 Microsoft Visual C library +0 string \360\175\000\000 Microsoft Visual C library + +#.pch +0 string DTJPCH0\000\022\103\006\200 Microsoft Visual C .pch + +# .pdb +# too long 0 string Microsoft\ C/C++\ program\ database\ +0 string Microsoft\ C/C++\ MSVC program database +>18 string program\ database\ +>33 string >\0 ver %s + +#.sbr +0 string \000\002\000\007\000 MSVC .sbr +>5 string >\0 %s + +#.bsc +0 string \002\000\002\001 MSVC .bsc + +#.wsp +0 string 1.00\ .0000.0000\000\003 MSVC .wsp version 1.0000.0000 +# these seem to start with the version and contain menus +# ------------------------------------------------------------------------ +# mup: file(1) magic for Mup (Music Publisher) input file. +# +# From: Abel Cheung +# +# NOTE: This header is mainly proposed in the Arkkra mailing list, +# and is not a mandatory header because of old mup input file +# compatibility. Noteedit also use mup format, but is not forcing +# user to use any header as well. +# +0 string //!Mup Mup music publication program input text +>6 string -Arkkra (Arkkra) +>>13 string - +>>>16 string . +>>>>14 string x \b, need V%.4s +>>>15 string . +>>>>14 string x \b, need V%.3s +>6 string - +>>9 string . +>>>7 string x \b, need V%.4s +>>8 string . +>>>7 string x \b, need V%.3s + +#----------------------------------------------------------------------------- +# natinst: file(1) magic for National Instruments Code Files + +# +# From Enrique Gįmez-Flores +# version 1 +# Many formats still missing, we use, for the moment LabVIEW +# We guess VXI format file. VISA, LabWindowsCVI, BridgeVIEW, etc, are missing +# +0 string RSRC National Instruments, +# Check if it's a LabVIEW File +>8 string LV LabVIEW File, +# Check wich kind of file is +>>10 string SB Code Resource File, data +>>10 string IN Virtual Instrument Program, data +>>10 string AR VI Library, data +# This is for Menu Libraries +>8 string LMNULBVW Portable File Names, data +# This is for General Resources +>8 string rsc Resources File, data +# This is for VXI Package +0 string VMAP National Instruments, VXI File, data + +#------------------------------------------------------------------------------ +# ncr: file(1) magic for NCR Tower objects +# +# contributed by +# Michael R. Wayne *** TMC & Associates *** INTERNET: wayne@ford-vax.arpa +# uucp: {philabs | pyramid} !fmsrl7!wayne OR wayne@fmsrl7.UUCP +# +0 beshort 000610 Tower/XP rel 2 object +>12 belong >0 not stripped +>20 beshort 0407 executable +>20 beshort 0410 pure executable +>22 beshort >0 - version %ld +0 beshort 000615 Tower/XP rel 2 object +>12 belong >0 not stripped +>20 beshort 0407 executable +>20 beshort 0410 pure executable +>22 beshort >0 - version %ld +0 beshort 000620 Tower/XP rel 3 object +>12 belong >0 not stripped +>20 beshort 0407 executable +>20 beshort 0410 pure executable +>22 beshort >0 - version %ld +0 beshort 000625 Tower/XP rel 3 object +>12 belong >0 not stripped +>20 beshort 0407 executable +>20 beshort 0410 pure executable +>22 beshort >0 - version %ld +0 beshort 000630 Tower32/600/400 68020 object +>12 belong >0 not stripped +>20 beshort 0407 executable +>20 beshort 0410 pure executable +>22 beshort >0 - version %ld +0 beshort 000640 Tower32/800 68020 +>18 beshort &020000 w/68881 object +>18 beshort &040000 compatible object +>18 beshort &060000 object +>20 beshort 0407 executable +>20 beshort 0413 pure executable +>12 belong >0 not stripped +>22 beshort >0 - version %ld +0 beshort 000645 Tower32/800 68010 +>18 beshort &040000 compatible object +>18 beshort &060000 object +>20 beshort 0407 executable +>20 beshort 0413 pure executable +>12 belong >0 not stripped +>22 beshort >0 - version %ld + +#------------------------------------------------------------------------------ +# netbsd: file(1) magic for NetBSD objects +# +# All new-style magic numbers are in network byte order. +# + +0 lelong 000000407 a.out NetBSD little-endian object file +>16 lelong >0 not stripped +0 belong 000000407 a.out NetBSD big-endian object file +>16 belong >0 not stripped + +0 belong&0377777777 041400413 a.out NetBSD/i386 demand paged +>0 byte &0x80 +>>20 lelong <4096 shared library +>>20 lelong =4096 dynamically linked executable +>>20 lelong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 041400410 a.out NetBSD/i386 pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 041400407 a.out NetBSD/i386 +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 lelong !0 executable +>>20 lelong =0 object file +>16 lelong >0 not stripped +0 belong&0377777777 041400507 a.out NetBSD/i386 core +>12 string >\0 from '%s' +>32 lelong !0 (signal %d) + +0 belong&0377777777 041600413 a.out NetBSD/m68k demand paged +>0 byte &0x80 +>>20 belong <8192 shared library +>>20 belong =8192 dynamically linked executable +>>20 belong >8192 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +0 belong&0377777777 041600410 a.out NetBSD/m68k pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +0 belong&0377777777 041600407 a.out NetBSD/m68k +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 belong !0 executable +>>20 belong =0 object file +>16 belong >0 not stripped +0 belong&0377777777 041600507 a.out NetBSD/m68k core +>12 string >\0 from '%s' +>32 belong !0 (signal %d) + +0 belong&0377777777 042000413 a.out NetBSD/m68k4k demand paged +>0 byte &0x80 +>>20 belong <4096 shared library +>>20 belong =4096 dynamically linked executable +>>20 belong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +0 belong&0377777777 042000410 a.out NetBSD/m68k4k pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +0 belong&0377777777 042000407 a.out NetBSD/m68k4k +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 belong !0 executable +>>20 belong =0 object file +>16 belong >0 not stripped +0 belong&0377777777 042000507 a.out NetBSD/m68k4k core +>12 string >\0 from '%s' +>32 belong !0 (signal %d) + +0 belong&0377777777 042200413 a.out NetBSD/ns32532 demand paged +>0 byte &0x80 +>>20 lelong <4096 shared library +>>20 lelong =4096 dynamically linked executable +>>20 lelong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 042200410 a.out NetBSD/ns32532 pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 042200407 a.out NetBSD/ns32532 +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 lelong !0 executable +>>20 lelong =0 object file +>16 lelong >0 not stripped +0 belong&0377777777 042200507 a.out NetBSD/ns32532 core +>12 string >\0 from '%s' +>32 lelong !0 (signal %d) + +0 belong&0377777777 045200507 a.out NetBSD/powerpc core +>12 string >\0 from '%s' + +0 belong&0377777777 042400413 a.out NetBSD/sparc demand paged +>0 byte &0x80 +>>20 belong <8192 shared library +>>20 belong =8192 dynamically linked executable +>>20 belong >8192 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +0 belong&0377777777 042400410 a.out NetBSD/sparc pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +0 belong&0377777777 042400407 a.out NetBSD/sparc +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 belong !0 executable +>>20 belong =0 object file +>16 belong >0 not stripped +0 belong&0377777777 042400507 a.out NetBSD/sparc core +>12 string >\0 from '%s' +>32 belong !0 (signal %d) + +0 belong&0377777777 042600413 a.out NetBSD/pmax demand paged +>0 byte &0x80 +>>20 lelong <4096 shared library +>>20 lelong =4096 dynamically linked executable +>>20 lelong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 042600410 a.out NetBSD/pmax pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 042600407 a.out NetBSD/pmax +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 lelong !0 executable +>>20 lelong =0 object file +>16 lelong >0 not stripped +0 belong&0377777777 042600507 a.out NetBSD/pmax core +>12 string >\0 from '%s' +>32 lelong !0 (signal %d) + +0 belong&0377777777 043000413 a.out NetBSD/vax 1k demand paged +>0 byte &0x80 +>>20 lelong <4096 shared library +>>20 lelong =4096 dynamically linked executable +>>20 lelong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 043000410 a.out NetBSD/vax 1k pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 043000407 a.out NetBSD/vax 1k +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 lelong !0 executable +>>20 lelong =0 object file +>16 lelong >0 not stripped +0 belong&0377777777 043000507 a.out NetBSD/vax 1k core +>12 string >\0 from '%s' +>32 lelong !0 (signal %d) + +0 belong&0377777777 045400413 a.out NetBSD/vax 4k demand paged +>0 byte &0x80 +>>20 lelong <4096 shared library +>>20 lelong =4096 dynamically linked executable +>>20 lelong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 045400410 a.out NetBSD/vax 4k pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 045400407 a.out NetBSD/vax 4k +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 lelong !0 executable +>>20 lelong =0 object file +>16 lelong >0 not stripped +0 belong&0377777777 045400507 a.out NetBSD/vax 4k core +>12 string >\0 from '%s' +>32 lelong !0 (signal %d) + +# NetBSD/alpha does not support (and has never supported) a.out objects, +# so no rules are provided for them. NetBSD/alpha ELF objects are +# dealt with in "elf". +0 lelong 0x00070185 ECOFF NetBSD/alpha binary +>10 leshort 0x0001 not stripped +>10 leshort 0x0000 stripped +0 belong&0377777777 043200507 a.out NetBSD/alpha core +>12 string >\0 from '%s' +>32 lelong !0 (signal %d) + +0 belong&0377777777 043400413 a.out NetBSD/mips demand paged +>0 byte &0x80 +>>20 belong <8192 shared library +>>20 belong =8192 dynamically linked executable +>>20 belong >8192 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +0 belong&0377777777 043400410 a.out NetBSD/mips pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped +0 belong&0377777777 043400407 a.out NetBSD/mips +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 belong !0 executable +>>20 belong =0 object file +>16 belong >0 not stripped +0 belong&0377777777 043400507 a.out NetBSD/mips core +>12 string >\0 from '%s' +>32 belong !0 (signal %d) + +0 belong&0377777777 043600413 a.out NetBSD/arm32 demand paged +>0 byte &0x80 +>>20 lelong <4096 shared library +>>20 lelong =4096 dynamically linked executable +>>20 lelong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 043600410 a.out NetBSD/arm32 pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 lelong >0 not stripped +0 belong&0377777777 043600407 a.out NetBSD/arm32 +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 +>>0 byte &0x40 position independent +>>20 lelong !0 executable +>>20 lelong =0 object file +>16 lelong >0 not stripped +# NetBSD/arm26 has always used ELF objects, but it shares a core file +# format with NetBSD/arm32. +0 belong&0377777777 043600507 a.out NetBSD/arm core +>12 string >\0 from '%s' +>32 lelong !0 (signal %d) + +#------------------------------------------------------------------------------ +# netscape: file(1) magic for Netscape files +# "H. Nanosecond" +# version 3 and 4 I think +# + +# Netscape Address book .nab +0 string \000\017\102\104\000\000\000\000\000\000\001\000\000\000\000\002\000\000\000\002\000\000\004\000 Netscape Address book + +# Netscape Communicator address book +0 string \000\017\102\111 Netscape Communicator address book + +# .snm Caches +0 string #\ Netscape\ folder\ cache Netscape folder cache +0 string \000\036\204\220\000 Netscape folder cache +# .n2p +# Net 2 Phone +#0 string 123\130\071\066\061\071\071\071\060\070\061\060\061\063\060 +0 string SX961999 Net2phone + +# +#This is files ending in .art, FIXME add more rules +0 string JG\004\016\0\0\0\0 ART + +#------------------------------------------------------------------------------ +# news: file(1) magic for SunOS NeWS fonts (not "news" as in "netnews") +# +0 string StartFontMetrics ASCII font metrics +0 string StartFont ASCII font bits +0 belong 0x137A2944 NeWS bitmap font +0 belong 0x137A2947 NeWS font family +0 belong 0x137A2950 scalable OpenFont binary +0 belong 0x137A2951 encrypted scalable OpenFont binary +8 belong 0x137A2B45 X11/NeWS bitmap font +8 belong 0x137A2B48 X11/NeWS font family +#------------------------------------------------------------------------------ +# nitpicker: file(1) magic for Flowfiles. +# From: Christian Jachmann http://www.nitpicker.de +0 string NPFF NItpicker Flow File +>4 byte x V%d. +>5 byte x %d +>6 bedate x started: %s +>10 bedate x stopped: %s +>14 belong x Bytes: %u +>18 belong x Bytes1: %u +>22 belong x Flows: %u +>26 belong x Pkts: %u + +#------------------------------------------------------------------------------ +# ocaml: file(1) magic for Objective Caml files. +0 string Caml1999 Objective caml +>8 string X exec file +>8 string I interface file (.cmi) +>8 string O object file (.cmo) +>8 string A library file (.cma) +>8 string Y native object file (.cmx) +>8 string Z native library file (.cmxa) +>8 string M abstract syntax tree implementation file +>8 string N abstract syntax tree interface file +>9 string >\0 (Version %3.3s). +#------------------------------------------------------------------------------ +# octave binary data file(1) magic, from Dirk Eddelbuettel +0 string Octave-1-L Octave binary data (little endian) +0 string Octave-1-B Octave binary data (big endian) + +#------------------------------------------------------------------------------ +# olf: file(1) magic for OLF executables +# +# We have to check the byte order flag to see what byte order all the +# other stuff in the header is in. +# +# MIPS R3000 may also be for MIPS R2000. +# What're the correct byte orders for the nCUBE and the Fujitsu VPP500? +# +# Created by Erik Theisen +# Based on elf from Daniel Quinlan +0 string \177OLF OLF +>4 byte 0 invalid class +>4 byte 1 32-bit +>4 byte 2 64-bit +>7 byte 0 invalid os +>7 byte 1 OpenBSD +>7 byte 2 NetBSD +>7 byte 3 FreeBSD +>7 byte 4 4.4BSD +>7 byte 5 Linux +>7 byte 6 SVR4 +>7 byte 7 esix +>7 byte 8 Solaris +>7 byte 9 Irix +>7 byte 10 SCO +>7 byte 11 Dell +>7 byte 12 NCR +>5 byte 0 invalid byte order +>5 byte 1 LSB +>>16 leshort 0 no file type, +>>16 leshort 1 relocatable, +>>16 leshort 2 executable, +>>16 leshort 3 shared object, +# Core handling from Peter Tobias +# corrections by Christian 'Dr. Disk' Hechelmann +>>16 leshort 4 core file +>>>(0x38+0xcc) string >\0 of '%s' +>>>(0x38+0x10) lelong >0 (signal %d), +>>16 leshort &0xff00 processor-specific, +>>18 leshort 0 no machine, +>>18 leshort 1 AT&T WE32100 - invalid byte order, +>>18 leshort 2 SPARC - invalid byte order, +>>18 leshort 3 Intel 80386, +>>18 leshort 4 Motorola 68000 - invalid byte order, +>>18 leshort 5 Motorola 88000 - invalid byte order, +>>18 leshort 6 Intel 80486, +>>18 leshort 7 Intel 80860, +>>18 leshort 8 MIPS R3000_BE - invalid byte order, +>>18 leshort 9 Amdahl - invalid byte order, +>>18 leshort 10 MIPS R3000_LE, +>>18 leshort 11 RS6000 - invalid byte order, +>>18 leshort 15 PA-RISC - invalid byte order, +>>18 leshort 16 nCUBE, +>>18 leshort 17 VPP500, +>>18 leshort 18 SPARC32PLUS, +>>18 leshort 20 PowerPC, +>>18 leshort 0x9026 Alpha, +>>20 lelong 0 invalid version +>>20 lelong 1 version 1 +>>36 lelong 1 MathCoPro/FPU/MAU Required +>8 string >\0 (%s) +>5 byte 2 MSB +>>16 beshort 0 no file type, +>>16 beshort 1 relocatable, +>>16 beshort 2 executable, +>>16 beshort 3 shared object, +>>16 beshort 4 core file, +>>>(0x38+0xcc) string >\0 of '%s' +>>>(0x38+0x10) belong >0 (signal %d), +>>16 beshort &0xff00 processor-specific, +>>18 beshort 0 no machine, +>>18 beshort 1 AT&T WE32100, +>>18 beshort 2 SPARC, +>>18 beshort 3 Intel 80386 - invalid byte order, +>>18 beshort 4 Motorola 68000, +>>18 beshort 5 Motorola 88000, +>>18 beshort 6 Intel 80486 - invalid byte order, +>>18 beshort 7 Intel 80860, +>>18 beshort 8 MIPS R3000_BE, +>>18 beshort 9 Amdahl, +>>18 beshort 10 MIPS R3000_LE - invalid byte order, +>>18 beshort 11 RS6000, +>>18 beshort 15 PA-RISC, +>>18 beshort 16 nCUBE, +>>18 beshort 17 VPP500, +>>18 beshort 18 SPARC32PLUS, +>>18 beshort 20 PowerPC or cisco 4500, +>>18 beshort 21 cisco 7500, +>>18 beshort 24 cisco SVIP, +>>18 beshort 25 cisco 7200, +>>18 beshort 36 cisco 12000, +>>18 beshort 0x9026 Alpha, +>>20 belong 0 invalid version +>>20 belong 1 version 1 +>>36 belong 1 MathCoPro/FPU/MAU Required + +#------------------------------------------------------------------------------ +# os2: file(1) magic for OS/2 files +# + +# Provided 1998/08/22 by +# David Mediavilla +1 string InternetShortcut MS Windows 95 Internet shortcut text +>24 string >\ (URL=<%s>) + +# OS/2 URL objects +# Provided 1998/08/22 by +# David Mediavilla +#0 string http: OS/2 URL object text +#>5 string >\ (WWW) +#0 string mailto: OS/2 URL object text +#>7 string >\ (email) <%s> +#0 string news: OS/2 URL object text +#>5 string >\ (Usenet) <%s> +#0 string ftp: OS/2 URL object text +#>4 string >\ (FTP) +#0 string file: OS/2 URL object text +#>5 string >\ (Local file) <%s> + +# >>>>> OS/2 INF/HLP <<<<< (source: Daniel Dissett ddissett@netcom.com) +# Carl Hauser (chauser.parc@xerox.com) and +# Marcus Groeber (marcusg@ph-cip.uni-koeln.de) +# list the following header format in inf02a.doc: +# +# int16 ID; // ID magic word (5348h = "HS") +# int8 unknown1; // unknown purpose, could be third letter of ID +# int8 flags; // probably a flag word... +# // bit 0: set if INF style file +# // bit 4: set if HLP style file +# // patching this byte allows reading HLP files +# // using the VIEW command, while help files +# // seem to work with INF settings here as well. +# int16 hdrsize; // total size of header +# int16 unknown2; // unknown purpose +# +0 string HSP\x01\x9b\x00 OS/2 INF +>107 string >0 (%s) +0 string HSP\x10\x9b\x00 OS/2 HLP +>107 string >0 (%s) + +# OS/2 INI (this is a guess) +0 string \xff\xff\xff\xff\x14\0\0\0 OS/2 INI +#------------------------------------------------------------------------------ +# os400: file(1) magic for IBM OS/400 files +# +# IBM OS/400 (i5/OS) Save file (SAVF) - gerardo.cacciari@gmail.com +# In spite of its quite variable format (due to internal memory page +# length differences between CISC and RISC versions of the OS) the +# SAVF structure hasn't suitable offsets to identify the catalog +# header in the first descriptor where there are some useful infos, +# so we must search in a somewhat large area for a particular string +# that represents the EBCDIC encoding of 'QSRDSSPC' (save/restore +# descriptor space) preceded by a two byte constant. +# +1090 search/7393 \x19\xDB\xD8\xE2\xD9\xC4\xE2\xE2\xD7\xC3 IBM OS/400 save file data +>&212 byte 0x01 \b, created with SAVOBJ +>&212 byte 0x02 \b, created with SAVLIB +>&212 byte 0x07 \b, created with SAVCFG +>&212 byte 0x08 \b, created with SAVSECDTA +>&212 byte 0x0A \b, created with SAVSECDTA +>&212 byte 0x0B \b, created with SAVDLO +>&212 byte 0x0D \b, created with SAVLICPGM +>&212 byte 0x11 \b, created with SAVCHGOBJ +>&213 byte 0x44 \b, at least V5R4 to open +>&213 byte 0x43 \b, at least V5R3 to open +>&213 byte 0x42 \b, at least V5R2 to open +>&213 byte 0x41 \b, at least V5R1 to open +>&213 byte 0x40 \b, at least V4R5 to open +>&213 byte 0x3F \b, at least V4R4 to open +>&213 byte 0x3E \b, at least V4R3 to open +>&213 byte 0x3C \b, at least V4R2 to open +>&213 byte 0x3D \b, at least V4R1M4 to open +>&213 byte 0x3B \b, at least V4R1 to open +>&213 byte 0x3A \b, at least V3R7 to open +>&213 byte 0x35 \b, at least V3R6 to open +>&213 byte 0x36 \b, at least V3R2 to open +>&213 byte 0x34 \b, at least V3R1 to open +>&213 byte 0x31 \b, at least V3R0M5 to open +>&213 byte 0x30 \b, at least V2R3 to open +# +# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Ignatios Souvatzis for +# the NetBSD project. +# 4. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# +# +# OS9/6809 module descriptions: +# +0 beshort 0x87CD OS9/6809 module: +# +>6 byte&0x0f 0x00 non-executable +>6 byte&0x0f 0x01 machine language +>6 byte&0x0f 0x02 BASIC I-code +>6 byte&0x0f 0x03 Pascal P-code +>6 byte&0x0f 0x04 C I-code +>6 byte&0x0f 0x05 COBOL I-code +>6 byte&0x0f 0x06 Fortran I-code +# +>6 byte&0xf0 0x10 program executable +>6 byte&0xf0 0x20 subroutine +>6 byte&0xf0 0x30 multi-module +>6 byte&0xf0 0x40 data module +# +>6 byte&0xf0 0xC0 system module +>6 byte&0xf0 0xD0 file manager +>6 byte&0xf0 0xE0 device driver +>6 byte&0xf0 0xF0 device descriptor +# +# OS9/m68k stuff (to be continued) +# +0 beshort 0x4AFC OS9/68K module: +# +# attr +>0x14 byte&0x80 0x80 re-entrant +>0x14 byte&0x40 0x40 ghost +>0x14 byte&0x20 0x20 system-state +# +# lang: +# +>0x13 byte 1 machine language +>0x13 byte 2 BASIC I-code +>0x13 byte 3 Pascal P-code +>0x13 byte 4 C I-code +>0x13 byte 5 COBOL I-code +>0x13 byte 6 Fortran I-code +# +# +# type: +# +>0x12 byte 1 program executable +>0x12 byte 2 subroutine +>0x12 byte 3 multi-module +>0x12 byte 4 data module +>0x12 byte 11 trap library +>0x12 byte 12 system module +>0x12 byte 13 file manager +>0x12 byte 14 device driver +>0x12 byte 15 device descriptor +# +# Mach magic number info +# +0 long 0xefbe OSF/Rose object +# I386 magic number info +# +0 short 0565 i386 COFF object + +#------------------------------------------------------------------------------ +# palm: file(1) magic for PalmOS {.prc,.pdb}: applications, docfiles, and hacks +# +# Brian Lalor + +# appl +60 belong 0x6170706c PalmOS application +>0 string >\0 "%s" +# TEXt +60 belong 0x54455874 AportisDoc file +>0 string >\0 "%s" +# HACK +60 belong 0x4841434b HackMaster hack +>0 string >\0 "%s" + +# Variety of PalmOS document types +# Michael-John Turner +# Thanks to Hasan Umit Ezerce for his DocType +60 string BVokBDIC BDicty PalmOS document +>0 string >\0 "%s" +60 string DB99DBOS DB PalmOS document +>0 string >\0 "%s" +60 string vIMGView FireViewer/ImageViewer PalmOS document +>0 string >\0 "%s" +60 string PmDBPmDB HanDBase PalmOS document +>0 string >\0 "%s" +60 string InfoINDB InfoView PalmOS document +>0 string >\0 "%s" +60 string ToGoToGo iSilo PalmOS document +>0 string >\0 "%s" +60 string JfDbJBas JFile PalmOS document +>0 string >\0 "%s" +60 string JfDbJFil JFile Pro PalmOS document +>0 string >\0 "%s" +60 string DATALSdb List PalmOS document +>0 string >\0 "%s" +60 string Mdb1Mdb1 MobileDB PalmOS document +>0 string >\0 "%s" +60 string PNRdPPrs PeanutPress PalmOS document +>0 string >\0 "%s" +60 string DataPlkr Plucker PalmOS document +>0 string >\0 "%s" +60 string DataSprd QuickSheet PalmOS document +>0 string >\0 "%s" +60 string SM01SMem SuperMemo PalmOS document +>0 string >\0 "%s" +60 string DataTlPt TealDoc PalmOS document +>0 string >\0 "%s" +60 string InfoTlIf TealInfo PalmOS document +>0 string >\0 "%s" +60 string DataTlMl TealMeal PalmOS document +>0 string >\0 "%s" +60 string DataTlPt TealPaint PalmOS document +>0 string >\0 "%s" +60 string dataTDBP ThinkDB PalmOS document +>0 string >\0 "%s" +60 string TdatTide Tides PalmOS document +>0 string >\0 "%s" +60 string ToRaTRPW TomeRaider PalmOS document +>0 string >\0 "%s" + +# A GutenPalm zTXT etext for use on Palm Pilots (http://gutenpalm.sf.net) +# For version 1.xx zTXTs, outputs version and numbers of bookmarks and +# annotations. +# For other versions, just outputs version. +# +60 string zTXT A GutenPalm zTXT e-book +>0 string >\0 "%s" +>(0x4E.L) byte 0 +>>(0x4E.L+1) byte x (v0.%02d) +>(0x4E.L) byte 1 +>>(0x4E.L+1) byte x (v1.%02d) +>>>(0x4E.L+10) beshort >0 +>>>>(0x4E.L+10) beshort <2 - 1 bookmark +>>>>(0x4E.L+10) beshort >1 - %d bookmarks +>>>(0x4E.L+14) beshort >0 +>>>>(0x4E.L+14) beshort <2 - 1 annotation +>>>>(0x4E.L+14) beshort >1 - %d annotations +>(0x4E.L) byte >1 (v%d. +>>(0x4E.L+1) byte x %02d) + +# Palm OS .prc file types +60 string libr Palm OS dynamic library data +>0 string >\0 "%s" +60 string ptch Palm OS operating system patch data +>0 string >\0 "%s" + +# Mobipocket (www.mobipocket.com), donated by Carl Witty +60 string BOOKMOBI Mobipocket E-book +>0 string >\0 "%s" + +#------------------------------------------------------------------------------ +# +# Parix COFF executables +# From: Ignatios Souvatzis +# +0 beshort&0xfff 0xACE PARIX +>0 byte&0xf0 0x80 T800 +>0 byte&0xf0 0x90 T9000 +>19 byte&0x02 0x02 executable +>19 byte&0x02 0x00 object +>19 byte&0x0c 0x00 not stripped + +#------------------------------------------------------------------------------ +# pbm: file(1) magic for Portable Bitmap files +# +# XXX - byte order? +# +0 short 0x2a17 "compact bitmap" format (Poskanzer) +#------------------------------------------------------------------------------ +# pdf: file(1) magic for Portable Document Format +# + +0 string %PDF- PDF document +>5 byte x \b, version %c +>7 byte x \b.%c + +#------------------------------------------------------------------------------ +# pdp: file(1) magic for PDP-11 executable/object and APL workspace +# +0 lelong 0101555 PDP-11 single precision APL workspace +0 lelong 0101554 PDP-11 double precision APL workspace +# +# PDP-11 a.out +# +0 leshort 0407 PDP-11 executable +>8 leshort >0 not stripped +>15 byte >0 - version %ld + +0 leshort 0401 PDP-11 UNIX/RT ldp +0 leshort 0405 PDP-11 old overlay + +0 leshort 0410 PDP-11 pure executable +>8 leshort >0 not stripped +>15 byte >0 - version %ld + +0 leshort 0411 PDP-11 separate I&D executable +>8 leshort >0 not stripped +>15 byte >0 - version %ld + +0 leshort 0437 PDP-11 kernel overlay + +# These last three are derived from 2.11BSD file(1) +0 leshort 0413 PDP-11 demand-paged pure executable +>8 leshort >0 not stripped + +0 leshort 0430 PDP-11 overlaid pure executable +>8 leshort >0 not stripped + +0 leshort 0431 PDP-11 overlaid separate executable +>8 leshort >0 not stripped + +#------------------------------------------------------------------------------ +# perl: file(1) magic for Larry Wall's perl language. +# +# The ``eval'' line recognizes an outrageously clever hack for USG systems. +# Keith Waclena +# Send additions to +0 string/b #!\ /bin/perl perl script text executable +0 string eval\ "exec\ /bin/perl perl script text +0 string/b #!\ /usr/bin/perl perl script text executable +0 string eval\ "exec\ /usr/bin/perl perl script text +0 string/b #!\ /usr/local/bin/perl perl script text +0 string eval\ "exec\ /usr/local/bin/perl perl script text executable +0 string eval\ '(exit\ $?0)'\ &&\ eval\ 'exec perl script text + + +# by Dmitry V. Levin and Alexey Tourbin +# check the first line +0 string package +>1 regex \^package[\ \t]+[A-Za-z_] +>>1 regex \^package[\ \t]+[0-9A-Za-z_:]*\ *; Perl5 module source text +# not 'p', check other lines +0 byte !0x70 +>0 regex \^package[\ \t]+[0-9A-Za-z_:]+\ *; +>>0 regex \^1\ *;|\^(use|sub|my)\ .*[(;{=] Perl5 module source text + + + +# Perl POD documents +# From: Tom Hukins +0 string/B \=pod\n Perl POD document +0 string/B \n\=pod\n Perl POD document +0 string/B \=head1\ Perl POD document +0 string/B \n\=head1\ Perl POD document +0 string/B \=head2\ Perl POD document +0 string/B \n\=head2\ Perl POD document + +# Perl Storable data files. +0 string perl-store perl Storable(v0.6) data +>4 byte >0 (net-order %d) +>>4 byte &01 (network-ordered) +>>4 byte =3 (major 1) +>>4 byte =2 (major 1) + +0 string pst0 perl Storable(v0.7) data +>4 byte >0 +>>4 byte &01 (network-ordered) +>>4 byte =5 (major 2) +>>4 byte =4 (major 2) +>>5 byte >0 (minor %d) + +#------------------------------------------------------------------------------ +# pgp: file(1) magic for Pretty Good Privacy +# +0 beshort 0x9900 PGP key public ring +0 beshort 0x9501 PGP key security ring +0 beshort 0x9500 PGP key security ring +0 beshort 0xa600 PGP encrypted data +0 string -----BEGIN\040PGP PGP armored data +>15 string PUBLIC\040KEY\040BLOCK- public key block +>15 string MESSAGE- message +>15 string SIGNED\040MESSAGE- signed message +>15 string PGP\040SIGNATURE- signature + +#------------------------------------------------------------------------------ +# pkgadd: file(1) magic for SysV R4 PKG Datastreams +# +0 string #\ PaCkAgE\ DaTaStReAm pkg Datastream (SVR4) + +#------------------------------------------------------------------------------ +# plan9: file(1) magic for AT&T Bell Labs' Plan 9 executables +# From: "Stefan A. Haubenthal" +# +0 belong 0x00000107 Plan 9 executable, Motorola 68k +0 belong 0x000001EB Plan 9 executable, Intel 386 +0 belong 0x00000247 Plan 9 executable, Intel 960 +0 belong 0x000002AB Plan 9 executable, SPARC +0 belong 0x00000407 Plan 9 executable, MIPS R3000 +0 belong 0x0000048B Plan 9 executable, AT&T DSP 3210 +0 belong 0x00000517 Plan 9 executable, MIPS R4000 BE +0 belong 0x000005AB Plan 9 executable, AMD 29000 +0 belong 0x00000647 Plan 9 executable, ARM 7-something +0 belong 0x000006EB Plan 9 executable, PowerPC +0 belong 0x00000797 Plan 9 executable, MIPS R4000 LE +0 belong 0x0000084B Plan 9 executable, DEC Alpha + +#------------------------------------------------------------------------------ +# plus5: file(1) magic for Plus Five's UNIX MUMPS +# +# XXX - byte order? Paging Hokey.... +# +0 short 0x259 mumps avl global +>2 byte >0 (V%d) +>6 byte >0 with %d byte name +>7 byte >0 and %d byte data cells +0 short 0x25a mumps blt global +>2 byte >0 (V%d) +>8 short >0 - %d byte blocks +>15 byte 0x00 - P/D format +>15 byte 0x01 - P/K/D format +>15 byte 0x02 - K/D format +>15 byte >0x02 - Bad Flags + +#------------------------------------------------------------------------------ +# printer: file(1) magic for printer-formatted files +# + +# PostScript, updated by Daniel Quinlan (quinlan@yggdrasil.com) +0 string %! PostScript document text +>2 string PS-Adobe- conforming +>>11 string >\0 at level %.3s +>>>15 string EPS - type %s +>>>15 string Query - type %s +>>>15 string ExitServer - type %s +# Some PCs have the annoying habit of adding a ^D as a document separator +0 string \004%! PostScript document text +>3 string PS-Adobe- conforming +>>12 string >\0 at level %.3s +>>>16 string EPS - type %s +>>>16 string Query - type %s +>>>16 string ExitServer - type %s +0 string \033%-12345X%!PS PostScript document + + +# DOS EPS Binary File Header +# From: Ed Sznyter +0 belong 0xC5D0D3C6 DOS EPS Binary File +>4 long >0 Postscript starts at byte %d +>>8 long >0 length %d +>>>12 long >0 Metafile starts at byte %d +>>>>16 long >0 length %d +>>>20 long >0 TIFF starts at byte %d +>>>>24 long >0 length %d + +# Adobe's PostScript Printer Description (PPD) files +# Yves Arrouye +# +0 string *PPD-Adobe: PPD file +>13 string x \b, ve + +# HP Printer Job Language +0 string \033%-12345X@PJL HP Printer Job Language data +# HP Printer Job Language +# The header found on Win95 HP plot files is the "Silliest Thing possible" +# (TM) +# Every driver puts the language at some random position, with random case +# (LANGUAGE and Language) +# For example the LaserJet 5L driver puts the "PJL ENTER LANGUAGE" in line 10 +# From: Uwe Bonnes +# +0 string \033%-12345X@PJL HP Printer Job Language data +>&0 string >\0 %s +>>&0 string >\0 %s +>>>&0 string >\0 %s +>>>>&0 string >\0 %s +#>15 string \ ENTER\ LANGUAGE\ = +#>31 string PostScript PostScript + +# HP Printer Control Language, Daniel Quinlan (quinlan@yggdrasil.com) +0 string \033E\033 HP PCL printer data +>3 string \&l0A - default page size +>3 string \&l1A - US executive page size +>3 string \&l2A - US letter page size +>3 string \&l3A - US legal page size +>3 string \&l26A - A4 page size +>3 string \&l80A - Monarch envelope size +>3 string \&l81A - No. 10 envelope size +>3 string \&l90A - Intl. DL envelope size +>3 string \&l91A - Intl. C5 envelope size +>3 string \&l100A - Intl. B5 envelope size +>3 string \&l-81A - No. 10 envelope size (landscape) +>3 string \&l-90A - Intl. DL envelope size (landscape) + +# IMAGEN printer-ready files: +0 string @document( Imagen printer +# this only works if "language xxx" is first item in Imagen header. +>10 string language\ impress (imPRESS data) +>10 string language\ daisy (daisywheel text) +>10 string language\ diablo (daisywheel text) +>10 string language\ printer (line printer emulation) +>10 string language\ tektronix (Tektronix 4014 emulation) +# Add any other languages that your Imagen uses - remember +# to keep the word `text' if the file is human-readable. +# [GRR 950115: missing "postscript" or "ultrascript" (whatever it was called)] +# +# Now magic for IMAGEN font files... +0 string Rast RST-format raster font data +>45 string >0 face %s +# From Jukka Ukkonen +0 string \033[K\002\0\0\017\033(a\001\0\001\033(g Canon Bubble Jet BJC formatted data + +# From +# These are the /etc/magic entries to decode data sent to an Epson printer. +0 string \x1B\x40\x1B\x28\x52\x08\x00\x00REMOTE1P Epson Stylus Color 460 data + + +#------------------------------------------------------------------------------ +# zenographics: file(1) magic for Zenographics ZjStream printer data +# Rick Richardson rickr@mn.rr.com +0 string JZJZ +>0x12 string ZZ Zenographics ZjStream printer data (big-endian) +0 string ZJZJ +>0x12 string ZZ Zenographics ZjStream printer data (little-endian) + + +#------------------------------------------------------------------------------ +# Oak Technologies printer stream +# Rick Richardson +0 string OAK +>0x07 byte 0 +>0x0b byte 0 Oak Technologies printer stream + +# This would otherwise be recognized as PostScript - nick@debian.org +0 string %!VMF SunClock's Vector Map Format data + +#------------------------------------------------------------------------------ +# HP LaserJet 1000 series downloadable firmware file +0 string \xbe\xefABCDEFGH HP LaserJet 1000 series downloadable firmware + +# From: Paolo +# Epson ESC/Page, ESC/PageColor +0 string \x1b\x01@EJL Epson ESC/Page language printer data + +#------------------------------------------------------------------------------ +# project: file(1) magic for Project management +# +# Magic strings for ftnchek project files. Alexander Mai +0 string FTNCHEK_\ P project file for ftnchek +>10 string 1 version 2.7 +>10 string 2 version 2.8 to 2.10 +>10 string 3 version 2.11 or later + +#------------------------------------------------------------------------------ +# psdbms: file(1) magic for psdatabase +# +0 belong&0xff00ffff 0x56000000 ps database +>1 string >\0 version %s +>4 string >\0 from kernel %s + +#------------------------------------------------------------------------------ +# psion: file(1) magic for Psion handhelds data +# from: Peter Breitenlohner +# +0 lelong 0x10000037 Psion Series 5 +>4 lelong 0x10000039 font file +>4 lelong 0x1000003A printer driver +>4 lelong 0x1000003B clipboard +>4 lelong 0x10000042 multi-bitmap image +>4 lelong 0x1000006A application information file +>4 lelong 0x1000006D +>>8 lelong 0x1000007D sketch image +>>8 lelong 0x1000007E voice note +>>8 lelong 0x1000007F word file +>>8 lelong 0x10000085 OPL program +>>8 lelong 0x10000088 sheet file +>>8 lelong 0x100001C4 EasyFax initialisation file +>4 lelong 0x10000073 OPO module +>4 lelong 0x10000074 OPL application +>4 lelong 0x1000008A exported multi-bitmap image + +0 lelong 0x10000041 Psion Series 5 ROM multi-bitmap image + +0 lelong 0x10000050 Psion Series 5 +>4 lelong 0x1000006D database +>4 lelong 0x100000E4 ini file + +0 lelong 0x10000079 Psion Series 5 binary: +>4 lelong 0x00000000 DLL +>4 lelong 0x10000049 comms hardware library +>4 lelong 0x1000004A comms protocol library +>4 lelong 0x1000005D OPX +>4 lelong 0x1000006C application +>4 lelong 0x1000008D DLL +>4 lelong 0x100000AC logical device driver +>4 lelong 0x100000AD physical device driver +>4 lelong 0x100000E5 file transfer protocol +>4 lelong 0x100000E5 file transfer protocol +>4 lelong 0x10000140 printer definition +>4 lelong 0x10000141 printer definition + +0 lelong 0x1000007A Psion Series 5 executable + +#------------------------------------------------------------------------------ +# pulsar: file(1) magic for Pulsar POP3 daemon binary files +# +# http://pulsar.sourceforge.net +# mailto:rok.papez@lugos.si +# + +0 belong 0x1ee7f11e Pulsar POP3 daemon mailbox cache file. +>4 ubelong x Version: %d. +>8 ubelong x \b%d + + +#------------------------------------------------------------------------------ +# pyramid: file(1) magic for Pyramids +# +# XXX - byte order? +# +0 long 0x50900107 Pyramid 90x family executable +0 long 0x50900108 Pyramid 90x family pure executable +>16 long >0 not stripped +0 long 0x5090010b Pyramid 90x family demand paged pure executable +>16 long >0 not stripped + +#------------------------------------------------------------------------------ +# python: file(1) magic for python +# +# From: David Necas +# often the module starts with a multiline string +0 string """ a python script text executable +# MAGIC as specified in Python/import.c (1.5 to 2.3.0a) +# 20121 ( YEAR - 1995 ) + MONTH + DAY (little endian followed by "\r\n" +0 belong 0x994e0d0a python 1.5/1.6 byte-compiled +0 belong 0x87c60d0a python 2.0 byte-compiled +0 belong 0x2aeb0d0a python 2.1 byte-compiled +0 belong 0x2ded0d0a python 2.2 byte-compiled +0 belong 0x3bf20d0a python 2.3 byte-compiled +0 belong 0x6df20d0a python 2.4 byte-compiled +0 belong 0xb3f20d0a python 2.5 byte-compiled + +0 string/b #!\ /usr/bin/python python script text executable + + +#------------------------------------------------------------------------------ +# file(1) magic for revision control files +# From Hendrik Scholz +0 string /1\ :pserver: cvs password text file + +# Conary changesets +# From: Jonathan Smith +0 belong 0xea3f81bb Conary changeset data + +#------------------------------------------------------------------------------ +# riff: file(1) magic for RIFF format +# See +# +# http://www.seanet.com/users/matts/riffmci/riffmci.htm +# +# AVI section extended by Patrik Rådman +# +0 string RIFF RIFF (little-endian) data +# RIFF Palette format +>8 string PAL \b, palette +>>16 leshort x \b, version %d +>>18 leshort x \b, %d entries +# RIFF Device Independent Bitmap format +>8 string RDIB \b, device-independent bitmap +>>16 string BM +>>>30 leshort 12 \b, OS/2 1.x format +>>>>34 leshort x \b, %d x +>>>>36 leshort x %d +>>>30 leshort 64 \b, OS/2 2.x format +>>>>34 leshort x \b, %d x +>>>>36 leshort x %d +>>>30 leshort 40 \b, Windows 3.x format +>>>>34 lelong x \b, %d x +>>>>38 lelong x %d x +>>>>44 leshort x %d +# RIFF MIDI format +>8 string RMID \b, MIDI +# RIFF Multimedia Movie File format +>8 string RMMP \b, multimedia movie +# RIFF wrapper for MP3 +>8 string RMP3 \b, MPEG Layer 3 audio +# Microsoft WAVE format (*.wav) +>8 string WAVE \b, WAVE audio +>>20 leshort 1 \b, Microsoft PCM +>>>34 leshort >0 \b, %d bit +>>20 leshort 2 \b, Microsoft ADPCM +>>20 leshort 6 \b, ITU G.711 A-law +>>20 leshort 7 \b, ITU G.711 mu-law +>>20 leshort 17 \b, IMA ADPCM +>>20 leshort 20 \b, ITU G.723 ADPCM (Yamaha) +>>20 leshort 49 \b, GSM 6.10 +>>20 leshort 64 \b, ITU G.721 ADPCM +>>20 leshort 80 \b, MPEG +>>20 leshort 85 \b, MPEG Layer 3 +>>22 leshort =1 \b, mono +>>22 leshort =2 \b, stereo +>>22 leshort >2 \b, %d channels +>>24 lelong >0 %d Hz +# Corel Draw Picture +>8 string CDRA \b, Corel Draw Picture +# AVI == Audio Video Interleave +>8 string AVI\040 \b, AVI +>>12 string LIST +>>>20 string hdrlavih +>>>>&36 lelong x \b, %lu x +>>>>&40 lelong x %lu, +>>>>&4 lelong >1000000 <1 fps, +>>>>&4 lelong 1000000 1.00 fps, +>>>>&4 lelong 500000 2.00 fps, +>>>>&4 lelong 333333 3.00 fps, +>>>>&4 lelong 250000 4.00 fps, +>>>>&4 lelong 200000 5.00 fps, +>>>>&4 lelong 166667 6.00 fps, +>>>>&4 lelong 142857 7.00 fps, +>>>>&4 lelong 125000 8.00 fps, +>>>>&4 lelong 111111 9.00 fps, +>>>>&4 lelong 100000 10.00 fps, +# ]9.9,10.1[ +>>>>&4 lelong <101010 +>>>>>&-4 lelong >99010 +>>>>>>&-4 lelong !100000 ~10 fps, +>>>>&4 lelong 83333 12.00 fps, +# ]11.9,12.1[ +>>>>&4 lelong <84034 +>>>>>&-4 lelong >82645 +>>>>>>&-4 lelong !83333 ~12 fps, +>>>>&4 lelong 66667 15.00 fps, +# ]14.9,15.1[ +>>>>&4 lelong <67114 +>>>>>&-4 lelong >66225 +>>>>>>&-4 lelong !66667 ~15 fps, +>>>>&4 lelong 50000 20.00 fps, +>>>>&4 lelong 41708 23.98 fps, +>>>>&4 lelong 41667 24.00 fps, +# ]23.9,24.1[ +>>>>&4 lelong <41841 +>>>>>&-4 lelong >41494 +>>>>>>&-4 lelong !41708 +>>>>>>>&-4 lelong !41667 ~24 fps, +>>>>&4 lelong 40000 25.00 fps, +# ]24.9,25.1[ +>>>>&4 lelong <40161 +>>>>>&-4 lelong >39841 +>>>>>>&-4 lelong !40000 ~25 fps, +>>>>&4 lelong 33367 29.97 fps, +>>>>&4 lelong 33333 30.00 fps, +# ]29.9,30.1[ +>>>>&4 lelong <33445 +>>>>>&-4 lelong >33223 +>>>>>>&-4 lelong !33367 +>>>>>>>&-4 lelong !33333 ~30 fps, +>>>>&4 lelong <32224 >30 fps, +##>>>>&4 lelong x (%lu) +##>>>>&20 lelong x %lu frames, +# Note: The tests below assume that the AVI has 1 or 2 streams, +# "vids" optionally followed by "auds". +# (Should cover 99.9% of all AVIs.) +# assuming avih length = 56 +>>>88 string LIST +>>>>96 string strlstrh +>>>>>108 string vids video: +>>>>>>&0 lelong 0 uncompressed +# skip past vids strh +>>>>>>(104.l+108) string strf +>>>>>>>(104.l+132) lelong 1 RLE 8bpp +>>>>>>>(104.l+132) string/c cvid Cinepak +>>>>>>>(104.l+132) string/c i263 Intel I.263 +>>>>>>>(104.l+132) string/c iv32 Indeo 3.2 +>>>>>>>(104.l+132) string/c iv41 Indeo 4.1 +>>>>>>>(104.l+132) string/c iv50 Indeo 5.0 +>>>>>>>(104.l+132) string/c mp42 Microsoft MPEG-4 v2 +>>>>>>>(104.l+132) string/c mp43 Microsoft MPEG-4 v3 +>>>>>>>(104.l+132) string/c fmp4 FFMpeg MPEG-4 +>>>>>>>(104.l+132) string/c mjpg Motion JPEG +>>>>>>>(104.l+132) string/c div3 DivX 3 +>>>>>>>>112 string/c div3 Low-Motion +>>>>>>>>112 string/c div4 Fast-Motion +>>>>>>>(104.l+132) string/c divx DivX 4 +>>>>>>>(104.l+132) string/c dx50 DivX 5 +>>>>>>>(104.l+132) string/c xvid XviD +>>>>>>>(104.l+132) string/c wmv3 Windows Media Video 9 +>>>>>>>(104.l+132) string/c h264 X.264 +>>>>>>>(104.l+132) lelong 0 +##>>>>>>>(104.l+132) string x (%.4s) +# skip past first (video) LIST +>>>>(92.l+96) string LIST +>>>>>(92.l+104) string strlstrh +>>>>>>(92.l+116) string auds \b, audio: +# auds strh length = 56: +>>>>>>>(92.l+172) string strf +>>>>>>>>(92.l+180) leshort 0x0001 uncompressed PCM +>>>>>>>>(92.l+180) leshort 0x0002 ADPCM +>>>>>>>>(92.l+180) leshort 0x0006 aLaw +>>>>>>>>(92.l+180) leshort 0x0007 uLaw +>>>>>>>>(92.l+180) leshort 0x0050 MPEG-1 Layer 1 or 2 +>>>>>>>>(92.l+180) leshort 0x0055 MPEG-1 Layer 3 +>>>>>>>>(92.l+180) leshort 0x2000 Dolby AC3 +>>>>>>>>(92.l+180) leshort 0x0161 DivX +##>>>>>>>>(92.l+180) leshort x (0x%.4x) +>>>>>>>>(92.l+182) leshort 1 (mono, +>>>>>>>>(92.l+182) leshort 2 (stereo, +>>>>>>>>(92.l+182) leshort >2 (%d channels, +>>>>>>>>(92.l+184) lelong x %d Hz) +# auds strh length = 64: +>>>>>>>(92.l+180) string strf +>>>>>>>>(92.l+188) leshort 0x0001 uncompressed PCM +>>>>>>>>(92.l+188) leshort 0x0002 ADPCM +>>>>>>>>(92.l+188) leshort 0x0055 MPEG-1 Layer 3 +>>>>>>>>(92.l+188) leshort 0x2000 Dolby AC3 +>>>>>>>>(92.l+188) leshort 0x0161 DivX +##>>>>>>>>(92.l+188) leshort x (0x%.4x) +>>>>>>>>(92.l+190) leshort 1 (mono, +>>>>>>>>(92.l+190) leshort 2 (stereo, +>>>>>>>>(92.l+190) leshort >2 (%d channels, +>>>>>>>>(92.l+192) lelong x %d Hz) +# Animated Cursor format +>8 string ACON \b, animated cursor +# SoundFont 2 +>8 string sfbk SoundFont/Bank +# MPEG-1 wrapped in a RIFF, apparently +>8 string CDXA \b, wrapped MPEG-1 (CDXA) +>8 string 4XMV \b, 4X Movie file + +# +# XXX - some of the below may only appear in little-endian form. +# +# Also "MV93" appears to be for one form of Macromedia Director +# files, and "GDMF" appears to be another multimedia format. +# +0 string RIFX RIFF (big-endian) data +# RIFF Palette format +>8 string PAL \b, palette +>>16 beshort x \b, version %d +>>18 beshort x \b, %d entries +# RIFF Device Independent Bitmap format +>8 string RDIB \b, device-independent bitmap +>>16 string BM +>>>30 beshort 12 \b, OS/2 1.x format +>>>>34 beshort x \b, %d x +>>>>36 beshort x %d +>>>30 beshort 64 \b, OS/2 2.x format +>>>>34 beshort x \b, %d x +>>>>36 beshort x %d +>>>30 beshort 40 \b, Windows 3.x format +>>>>34 belong x \b, %d x +>>>>38 belong x %d x +>>>>44 beshort x %d +# RIFF MIDI format +>8 string RMID \b, MIDI +# RIFF Multimedia Movie File format +>8 string RMMP \b, multimedia movie +# Microsoft WAVE format (*.wav) +>8 string WAVE \b, WAVE audio +>>20 leshort 1 \b, Microsoft PCM +>>>34 leshort >0 \b, %d bit +>>22 beshort =1 \b, mono +>>22 beshort =2 \b, stereo +>>22 beshort >2 \b, %d channels +>>24 belong >0 %d Hz +# Corel Draw Picture +>8 string CDRA \b, Corel Draw Picture +# AVI == Audio Video Interleave +>8 string AVI\040 \b, AVI +# Animated Cursor format +>8 string ACON \b, animated cursor +# Notation Interchange File Format (big-endian only) +>8 string NIFF \b, Notation Interchange File Format +# SoundFont 2 +>8 string sfbk SoundFont/Bank +#------------------------------------------------------------------------------ +# +# RPM: file(1) magic for Red Hat Packages Erik Troan (ewt@redhat.com) +# +0 beshort 0xedab +>2 beshort 0xeedb RPM +>>4 byte x v%d +>>6 beshort 0 bin +>>6 beshort 1 src +>>8 beshort 1 i386 +>>8 beshort 2 Alpha +>>8 beshort 3 Sparc +>>8 beshort 4 MIPS +>>8 beshort 5 PowerPC +>>8 beshort 6 68000 +>>8 beshort 7 SGI +>>8 beshort 8 RS6000 +>>8 beshort 9 IA64 +>>8 beshort 10 Sparc64 +>>8 beshort 11 MIPSel +>>8 beshort 12 ARM +>>10 string x %s + +#------------------------------------------------------------------------------ +# rtf: file(1) magic for Rich Text Format (RTF) +# +# Duncan P. Simpson, D.P.Simpson@dcs.warwick.ac.uk +# +0 string {\\rtf Rich Text Format data, +>5 byte x version %c, +>6 string \\ansi ANSI +>6 string \\mac Apple Macintosh +>6 string \\pc IBM PC, code page 437 +>6 string \\pca IBM PS/2, code page 850 + +#------------------------------------------------------------------------------ +# sc: file(1) magic for "sc" spreadsheet +# +38 string Spreadsheet sc spreadsheet file + +#------------------------------------------------------------------------------ +# sccs: file(1) magic for SCCS archives +# +# SCCS archive structure: +# \001h01207 +# \001s 00276/00000/00000 +# \001d D 1.1 87/09/23 08:09:20 ian 1 0 +# \001c date and time created 87/09/23 08:09:20 by ian +# \001e +# \001u +# \001U +# ... etc. +# Now '\001h' happens to be the same as the 3B20's a.out magic number (0550). +# *Sigh*. And these both came from various parts of the USG. +# Maybe we should just switch everybody from SCCS to RCS! +# Further, you can't just say '\001h0', because the five-digit number +# is a checksum that could (presumably) have any leading digit, +# and we don't have regular expression matching yet. +# Hence the following official kludge: +8 string \001s\ SCCS archive data + +#------------------------------------------------------------------------------ +# sendmail: file(1) magic for sendmail config files +# +# XXX - byte order? +# +0 byte 046 Sendmail frozen configuration +>16 string >\0 - version %s +0 short 0x271c Sendmail frozen configuration +>16 string >\0 - version %s + +#------------------------------------------------------------------------------ +# sendmail: file(1) magic for sendmail m4(1) files +# +# From Hendrik Scholz +# i.e. files in /usr/share/sendmail/cf/ +# +0 string divert(-1)\n sendmail m4 text file + + +#------------------------------------------------------------------------------ +# sequent: file(1) magic for Sequent machines +# +# Sequent information updated by Don Dwiggins . +# For Sequent's multiprocessor systems (incomplete). +0 lelong 0x00ea BALANCE NS32000 .o +>16 lelong >0 not stripped +>124 lelong >0 version %ld +0 lelong 0x10ea BALANCE NS32000 executable (0 @ 0) +>16 lelong >0 not stripped +>124 lelong >0 version %ld +0 lelong 0x20ea BALANCE NS32000 executable (invalid @ 0) +>16 lelong >0 not stripped +>124 lelong >0 version %ld +0 lelong 0x30ea BALANCE NS32000 standalone executable +>16 lelong >0 not stripped +>124 lelong >0 version %ld +# +# Symmetry information added by Jason Merrill . +# Symmetry magic nums will not be reached if DOS COM comes before them; +# byte 0xeb is matched before these get a chance. +0 leshort 0x12eb SYMMETRY i386 .o +>16 lelong >0 not stripped +>124 lelong >0 version %ld +0 leshort 0x22eb SYMMETRY i386 executable (0 @ 0) +>16 lelong >0 not stripped +>124 lelong >0 version %ld +0 leshort 0x32eb SYMMETRY i386 executable (invalid @ 0) +>16 lelong >0 not stripped +>124 lelong >0 version %ld +0 leshort 0x42eb SYMMETRY i386 standalone executable +>16 lelong >0 not stripped +>124 lelong >0 version %ld + +#------------------------------------------------------------------------------ +# sgi: file(1) magic for Silicon Graphics applications + +# +# +# Performance Co-Pilot file types +0 string PmNs PCP compiled namespace (V.0) +0 string PmN PCP compiled namespace +>3 string >\0 (V.%1.1s) +3 lelong 0x84500526 PCP archive +>7 byte x (V.%d) +>20 lelong -2 temporal index +>20 lelong -1 metadata +>20 lelong 0 log volume #0 +>20 lelong >0 log volume #%ld +>24 string >\0 host: %s +0 string PCPFolio PCP +>9 string Version: Archive Folio +>18 string >\0 (V.%s) +0 string #pmchart PCP pmchart view +>9 string Version +>17 string >\0 (V%-3.3s) +0 string pmview PCP pmview config +>7 string Version +>15 string >\0 (V%-3.3s) +0 string #pmlogger PCP pmlogger config +>10 string Version +>18 string >\0 (V%1.1s) +0 string PcPh PCP Help +>4 string 1 Index +>4 string 2 Text +>5 string >\0 (V.%1.1s) +0 string #pmieconf-rules PCP pmieconf rules +>16 string >\0 (V.%1.1s) +3 string pmieconf-pmie PCP pmie config +>17 string >\0 (V.%1.1s) + +# SpeedShop data files +0 lelong 0x13130303 SpeedShop data file + +# mdbm files +0 lelong 0x01023962 mdbm file, version 0 (obsolete) +0 string mdbm mdbm file, +>5 byte x version %d, +>6 byte x 2^%d pages, +>7 byte x pagesize 2^%d, +>17 byte x hash %d, +>11 byte x dataformat %d + +# Alias Maya files +0 string //Maya ASCII Alias Maya Ascii File, +>13 string >\0 version %s +8 string MAYAFOR4 Alias Maya Binary File, +>32 string >\0 version %s scene +8 string MayaFOR4 Alias Maya Binary File, +>32 string >\0 version %s scene +8 string CIMG Alias Maya Image File +8 string DEEP Alias Maya Image File + +#------------------------------------------------------------------------------ +# sgml: file(1) magic for Standard Generalized Markup Language +# HyperText Markup Language (HTML) is an SGML document type, +# from Daniel Quinlan (quinlan@yggdrasil.com) +# adapted to string extenstions by Anthon van der Neut 33 byte 2 (compressed) +>23 leshort x - version %d +>25 leshort x \b.%d +>32 byte 0 (Token Ring) +>32 byte 1 (Ethernet) +>32 byte 2 (ARCNET) +>32 byte 3 (StarLAN) +>32 byte 4 (PC Network broadband) +>32 byte 5 (LocalTalk) +>32 byte 6 (Znet) +>32 byte 7 (Internetwork Analyzer) +>32 byte 9 (FDDI) +>32 byte 10 (ATM) + +# +# Cinco Networks NetXRay capture files. +# Sorry, make that "Network General Sniffer Basic capture files." +# Sorry, make that "Network Associates Sniffer Basic capture files." +# Sorry, make that "Network Associates Sniffer Basic, and Windows +# Sniffer Pro", capture files." +# Sorry, make that "Network General Sniffer capture files." +# +0 string XCP\0 NetXRay capture file +>4 string >\0 - version %s +>44 leshort 0 (Ethernet) +>44 leshort 1 (Token Ring) +>44 leshort 2 (FDDI) +>44 leshort 3 (WAN) +>44 leshort 8 (ATM) +>44 leshort 9 (802.11) + +# +# "libpcap" capture files. +# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is +# the main program that uses that format, but there are other programs +# that use "libpcap", or that use the same capture file format.) +# +0 ubelong 0xa1b2c3d4 tcpdump capture file (big-endian) +>4 beshort x - version %d +>6 beshort x \b.%d +>20 belong 0 (No link-layer encapsulation +>20 belong 1 (Ethernet +>20 belong 2 (3Mb Ethernet +>20 belong 3 (AX.25 +>20 belong 4 (ProNET +>20 belong 5 (CHAOS +>20 belong 6 (Token Ring +>20 belong 7 (BSD ARCNET +>20 belong 8 (SLIP +>20 belong 9 (PPP +>20 belong 10 (FDDI +>20 belong 11 (RFC 1483 ATM +>20 belong 12 (raw IP +>20 belong 13 (BSD/OS SLIP +>20 belong 14 (BSD/OS PPP +>20 belong 19 (Linux ATM Classical IP +>20 belong 50 (PPP or Cisco HDLC +>20 belong 51 (PPP-over-Ethernet +>20 belong 99 (Symantec Enterprise Firewall +>20 belong 100 (RFC 1483 ATM +>20 belong 101 (raw IP +>20 belong 102 (BSD/OS SLIP +>20 belong 103 (BSD/OS PPP +>20 belong 104 (BSD/OS Cisco HDLC +>20 belong 105 (802.11 +>20 belong 106 (Linux Classical IP over ATM +>20 belong 107 (Frame Relay +>20 belong 108 (OpenBSD loopback +>20 belong 109 (OpenBSD IPsec encrypted +>20 belong 112 (Cisco HDLC +>20 belong 113 (Linux "cooked" +>20 belong 114 (LocalTalk +>20 belong 117 (OpenBSD PFLOG +>20 belong 119 (802.11 with Prism header +>20 belong 122 (RFC 2625 IP over Fibre Channel +>20 belong 123 (SunATM +>20 belong 127 (802.11 with radiotap header +>20 belong 129 (Linux ARCNET +>20 belong 138 (Apple IP over IEEE 1394 +>20 belong 140 (MTP2 +>20 belong 141 (MTP3 +>20 belong 143 (DOCSIS +>20 belong 144 (IrDA +>20 belong 147 (Private use 0 +>20 belong 148 (Private use 1 +>20 belong 149 (Private use 2 +>20 belong 150 (Private use 3 +>20 belong 151 (Private use 4 +>20 belong 152 (Private use 5 +>20 belong 153 (Private use 6 +>20 belong 154 (Private use 7 +>20 belong 155 (Private use 8 +>20 belong 156 (Private use 9 +>20 belong 157 (Private use 10 +>20 belong 158 (Private use 11 +>20 belong 159 (Private use 12 +>20 belong 160 (Private use 13 +>20 belong 161 (Private use 14 +>20 belong 162 (Private use 15 +>20 belong 163 (802.11 with AVS header +>16 belong x \b, capture length %d) +0 ulelong 0xa1b2c3d4 tcpdump capture file (little-endian) +>4 leshort x - version %d +>6 leshort x \b.%d +>20 lelong 0 (No link-layer encapsulation +>20 lelong 1 (Ethernet +>20 lelong 2 (3Mb Ethernet +>20 lelong 3 (AX.25 +>20 lelong 4 (ProNET +>20 lelong 5 (CHAOS +>20 lelong 6 (Token Ring +>20 lelong 7 (ARCNET +>20 lelong 8 (SLIP +>20 lelong 9 (PPP +>20 lelong 10 (FDDI +>20 lelong 11 (RFC 1483 ATM +>20 lelong 12 (raw IP +>20 lelong 13 (BSD/OS SLIP +>20 lelong 14 (BSD/OS PPP +>20 lelong 19 (Linux ATM Classical IP +>20 lelong 50 (PPP or Cisco HDLC +>20 lelong 51 (PPP-over-Ethernet +>20 lelong 99 (Symantec Enterprise Firewall +>20 lelong 100 (RFC 1483 ATM +>20 lelong 101 (raw IP +>20 lelong 102 (BSD/OS SLIP +>20 lelong 103 (BSD/OS PPP +>20 lelong 104 (BSD/OS Cisco HDLC +>20 lelong 105 (802.11 +>20 lelong 106 (Linux Classical IP over ATM +>20 lelong 107 (Frame Relay +>20 lelong 108 (OpenBSD loopback +>20 lelong 109 (OpenBSD IPsec encrypted +>20 lelong 112 (Cisco HDLC +>20 lelong 113 (Linux "cooked" +>20 lelong 114 (LocalTalk +>20 lelong 117 (OpenBSD PFLOG +>20 lelong 119 (802.11 with Prism header +>20 lelong 122 (RFC 2625 IP over Fibre Channel +>20 lelong 123 (SunATM +>20 lelong 127 (802.11 with radiotap header +>20 lelong 129 (Linux ARCNET +>20 lelong 138 (Apple IP over IEEE 1394 +>20 lelong 140 (MTP2 +>20 lelong 141 (MTP3 +>20 lelong 143 (DOCSIS +>20 lelong 144 (IrDA +>20 lelong 147 (Private use 0 +>20 lelong 148 (Private use 1 +>20 lelong 149 (Private use 2 +>20 lelong 150 (Private use 3 +>20 lelong 151 (Private use 4 +>20 lelong 152 (Private use 5 +>20 lelong 153 (Private use 6 +>20 lelong 154 (Private use 7 +>20 lelong 155 (Private use 8 +>20 lelong 156 (Private use 9 +>20 lelong 157 (Private use 10 +>20 lelong 158 (Private use 11 +>20 lelong 159 (Private use 12 +>20 lelong 160 (Private use 13 +>20 lelong 161 (Private use 14 +>20 lelong 162 (Private use 15 +>20 lelong 163 (802.11 with AVS header +>16 lelong x \b, capture length %d) + +# +# "libpcap"-with-Alexey-Kuznetsov's-patches capture files. +# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is +# the main program that uses that format, but there are other programs +# that use "libpcap", or that use the same capture file format.) +# +0 ubelong 0xa1b2cd34 extended tcpdump capture file (big-endian) +>4 beshort x - version %d +>6 beshort x \b.%d +>20 belong 0 (No link-layer encapsulation +>20 belong 1 (Ethernet +>20 belong 2 (3Mb Ethernet +>20 belong 3 (AX.25 +>20 belong 4 (ProNET +>20 belong 5 (CHAOS +>20 belong 6 (Token Ring +>20 belong 7 (ARCNET +>20 belong 8 (SLIP +>20 belong 9 (PPP +>20 belong 10 (FDDI +>20 belong 11 (RFC 1483 ATM +>20 belong 12 (raw IP +>20 belong 13 (BSD/OS SLIP +>20 belong 14 (BSD/OS PPP +>16 belong x \b, capture length %d) +0 ulelong 0xa1b2cd34 extended tcpdump capture file (little-endian) +>4 leshort x - version %d +>6 leshort x \b.%d +>20 lelong 0 (No link-layer encapsulation +>20 lelong 1 (Ethernet +>20 lelong 2 (3Mb Ethernet +>20 lelong 3 (AX.25 +>20 lelong 4 (ProNET +>20 lelong 5 (CHAOS +>20 lelong 6 (Token Ring +>20 lelong 7 (ARCNET +>20 lelong 8 (SLIP +>20 lelong 9 (PPP +>20 lelong 10 (FDDI +>20 lelong 11 (RFC 1483 ATM +>20 lelong 12 (raw IP +>20 lelong 13 (BSD/OS SLIP +>20 lelong 14 (BSD/OS PPP +>16 lelong x \b, capture length %d) + +# +# AIX "iptrace" capture files. +# +0 string iptrace\ 1.0 "iptrace" capture file +0 string iptrace\ 2.0 "iptrace" capture file + +# +# Novell LANalyzer capture files. +# +0 leshort 0x1001 LANalyzer capture file +0 leshort 0x1007 LANalyzer capture file + +# +# HP-UX "nettl" capture files. +# +0 string \x54\x52\x00\x64\x00 "nettl" capture file + +# +# RADCOM WAN/LAN Analyzer capture files. +# +0 string \x42\xd2\x00\x34\x12\x66\x22\x88 RADCOM WAN/LAN Analyzer capture file + +# +# NetStumbler log files. Not really packets, per se, but about as +# close as you can get. These are log files from NetStumbler, a +# Windows program, that scans for 802.11b networks. +# +0 string NetS NetStumbler log file +>8 lelong x \b, %d stations found + +# +# EtherPeek/AiroPeek "version 9" capture files. +# +0 string \177ver EtherPeek/AiroPeek capture file + +# +# Visual Networks traffic capture files. +# +0 string \x05VNF Visual Networks traffic capture file + +# +# Network Instruments Observer capture files. +# +0 string ObserverPktBuffe Network Instruments Observer capture file + +# +# Files from Accellent Group's 5View products. +# +0 string \xaa\xaa\xaa\xaa 5View capture file + +#------------------------------------------------------------------------------ +# Dyadic: file(1) magic for Dyalog APL. +# +0 byte 0xaa +>1 byte <4 Dyalog APL +>>1 byte 0x00 incomplete workspace +>>1 byte 0x01 component file +>>1 byte 0x02 external variable +>>1 byte 0x03 workspace +>>2 byte x version %d +>>3 byte x .%d + +#------------------------------------------------------------------------------ +# scientific: file(1) magic for scientific formats +# +# From: Joe Krahn + +######################################################## +# CCP4 data and plot files: +0 string MTZ\040 MTZ reflection file + +92 string PLOT%%84 Plot84 plotting file +>52 byte 1 , Little-endian +>55 byte 1 , Big-endian + +######################################################## +# Electron density MAP/MASK formats + +0 string EZD_MAP NEWEZD Electron Density Map +109 string MAP\040( Old EZD Electron Density Map + +0 string/c :-)\040Origin BRIX Electron Density Map +>170 string >0 , Sigma:%.12s +#>4 string >0 %.178s +#>4 addr x %.178s + +7 string 18\040!NTITLE XPLOR ASCII Electron Density Map +9 string \040!NTITLE\012\040REMARK CNS ASCII electron density map + +208 string MAP\040 CCP4 Electron Density Map +# Assumes same stamp for float and double (normal case) +>212 byte 17 \b, Big-endian +>212 byte 34 \b, VAX format +>212 byte 68 \b, Little-endian +>212 byte 85 \b, Convex native + +############################################################ +# X-Ray Area Detector images +0 string R-AXIS4\ \ \ R-Axis Area Detector Image: +>796 lelong <20 Little-endian, IP #%d, +>>768 lelong >0 Size=%dx +>>772 lelong >0 \b%d +>796 belong <20 Big-endian, IP #%d, +>>768 belong >0 Size=%dx +>>772 belong >0 \b%d + +0 string RAXIS\ \ \ \ \ R-Axis Area Detector Image, Win32: +>796 lelong <20 Little-endian, IP #%d, +>>768 lelong >0 Size=%dx +>>772 lelong >0 \b%d +>796 belong <20 Big-endian, IP #%d, +>>768 belong >0 Size=%dx +>>772 belong >0 \b%d + + +1028 string MMX\000\000\000\000\000\000\000\000\000\000\000\000\000 MAR Area Detector Image, +>1072 ulong >1 Compressed(%d), +>1100 ulong >1 %d headers, +>1104 ulong >0 %d x +>1108 ulong >0 %d, +>1120 ulong >0 %d bits/pixel + +#------------------------------------------------------------------------------ +# softquad: file(1) magic for SoftQuad Publishing Software +# +# Author/Editor and RulesBuilder +# +# XXX - byte order? +# +0 string \ Compiled SGML rules file +>9 string >\0 Type %s +0 string \ A/E SGML Document binary +>9 string >\0 Type %s +0 string \ A/E SGML binary styles file +>9 string >\0 Type %s +0 short 0xc0de Compiled PSI (v1) data +0 short 0xc0da Compiled PSI (v2) data +>3 string >\0 (%s) +# Binary sqtroff font/desc files... +0 short 0125252 SoftQuad DESC or font file binary +>2 short >0 - version %d +# Bitmaps... +0 string SQ\ BITMAP1 SoftQuad Raster Format text +#0 string SQ\ BITMAP2 SoftQuad Raster Format data +# sqtroff intermediate language (replacement for ditroff int. lang.) +0 string X\ SoftQuad troff Context intermediate +>2 string 495 for AT&T 495 laser printer +>2 string hp for Hewlett-Packard LaserJet +>2 string impr for IMAGEN imPRESS +>2 string ps for PostScript + +#------------------------------------------------------------------------------ +# spectrum: file(1) magic for Spectrum emulator files. +# +# John Elliott + +# +# Spectrum +3DOS header +# +0 string PLUS3DOS\032 Spectrum +3 data +>15 byte 0 - BASIC program +>15 byte 1 - number array +>15 byte 2 - character array +>15 byte 3 - memory block +>>16 belong 0x001B0040 (screen) +>15 byte 4 - Tasword document +>15 string TAPEFILE - ZXT tapefile +# +# Tape file. This assumes the .TAP starts with a Spectrum-format header, +# which nearly all will. +# +0 string \023\000\000 Spectrum .TAP data +>4 string x "%-10.10s" +>3 byte 0 - BASIC program +>3 byte 1 - number array +>3 byte 2 - character array +>3 byte 3 - memory block +>>14 belong 0x001B0040 (screen) + +# The following three blocks are from pak21-spectrum@srcf.ucam.org +# TZX tape images +0 string ZXTape!\x1a Spectrum .TZX data +>8 byte x version %d +>9 byte x .%d + +# RZX input recording files +0 string RZX! Spectrum .RZX data +>4 byte x version %d +>5 byte x .%d + +# And three sorts of disk image +0 string MV\ -\ CPCEMU\ Disk-Fil Amstrad/Spectrum .DSK data +0 string MV\ -\ CPC\ format\ Dis Amstrad/Spectrum DU54 .DSK data +0 string EXTENDED\ CPC\ DSK\ Fil Amstrad/Spectrum Extended .DSK data + +#------------------------------------------------------------------------------ +# sql: file(1) magic for SQL files +# +# From: "Marty Leisner" +# Recognize some MySQL files. +# +0 beshort 0xfe01 MySQL table definition file +>2 byte x Version %d +0 belong&0xffffff00 0xfefe0300 MySQL MISAM index file +>3 byte x Version %d +0 belong&0xffffff00 0xfefe0700 MySQL MISAM compressed data file +>3 byte x Version %d +0 belong&0xffffff00 0xfefe0500 MySQL ISAM index file +>3 byte x Version %d +0 belong&0xffffff00 0xfefe0600 MySQL ISAM compressed data file +>3 byte x Version %d +0 string \376bin MySQL replication log + +#------------------------------------------------------------------------------ +# iRiver H Series database file +# From Ken Guest +# As observed from iRivNavi.iDB and unencoded firmware +# +0 string iRivDB iRiver Database file +>11 string >\0 Version %s +>39 string iHP-100 [H Series] + +#------------------------------------------------------------------------------ +# SQLite database files +# Ken Guest , Ty Sarna, Zack Weinberg +# +# Version 1 used GDBM internally; its files cannot be distinguished +# from other GDBM files. +# +# Version 2 used this format: +0 string **\ This\ file\ contains\ an\ SQLite SQLite 2.x database + +# Version 3 of SQLite allows applications to embed their own "user version" +# number in the database. Detect this and distinguish those files. + +0 string SQLite\ format\ 3 +>60 string _MTN Monotone source repository +>60 belong !0 SQLite 3.x database, user version %u +>60 belong 0 SQLite 3.x database + +#------------------------------------------------------------------------------ +# sun: file(1) magic for Sun machines +# +# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x +# releases. (5.x uses ELF.) +# +0 belong&077777777 0600413 sparc demand paged +>0 byte &0x80 +>>20 belong <4096 shared library +>>20 belong =4096 dynamically linked executable +>>20 belong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +0 belong&077777777 0600410 sparc pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +0 belong&077777777 0600407 sparc +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +0 belong&077777777 0400413 mc68020 demand paged +>0 byte &0x80 +>>20 belong <4096 shared library +>>20 belong =4096 dynamically linked executable +>>20 belong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +0 belong&077777777 0400410 mc68020 pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +0 belong&077777777 0400407 mc68020 +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +0 belong&077777777 0200413 mc68010 demand paged +>0 byte &0x80 +>>20 belong <4096 shared library +>>20 belong =4096 dynamically linked executable +>>20 belong >4096 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +0 belong&077777777 0200410 mc68010 pure +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +0 belong&077777777 0200407 mc68010 +>0 byte &0x80 dynamically linked executable +>0 byte ^0x80 executable +>16 belong >0 not stripped + +# reworked these to avoid anything beginning with zero becoming "old sun-2" +0 belong 0407 old sun-2 executable +>16 belong >0 not stripped +0 belong 0410 old sun-2 pure executable +>16 belong >0 not stripped +0 belong 0413 old sun-2 demand paged executable +>16 belong >0 not stripped + +# +# Core files. "SPARC 4.x BCP" means "core file from a SunOS 4.x SPARC +# binary executed in compatibility mode under SunOS 5.x". +# +0 belong 0x080456 SunOS core file +>4 belong 432 (SPARC) +>>132 string >\0 from '%s' +>>116 belong =3 (quit) +>>116 belong =4 (illegal instruction) +>>116 belong =5 (trace trap) +>>116 belong =6 (abort) +>>116 belong =7 (emulator trap) +>>116 belong =8 (arithmetic exception) +>>116 belong =9 (kill) +>>116 belong =10 (bus error) +>>116 belong =11 (segmentation violation) +>>116 belong =12 (bad argument to system call) +>>116 belong =29 (resource lost) +>>120 belong x (T=%dK, +>>124 belong x D=%dK, +>>128 belong x S=%dK) +>4 belong 826 (68K) +>>128 string >\0 from '%s' +>4 belong 456 (SPARC 4.x BCP) +>>152 string >\0 from '%s' +# Sun SunPC +0 long 0xfa33c08e SunPC 4.0 Hard Disk +0 string #SUNPC_CONFIG SunPC 4.0 Properties Values +# Sun snoop (see RFC 1761, which describes the capture file format). +# +0 string snoop Snoop capture file +>8 belong >0 - version %ld +>12 belong 0 (IEEE 802.3) +>12 belong 1 (IEEE 802.4) +>12 belong 2 (IEEE 802.5) +>12 belong 3 (IEEE 802.6) +>12 belong 4 (Ethernet) +>12 belong 5 (HDLC) +>12 belong 6 (Character synchronous) +>12 belong 7 (IBM channel-to-channel adapter) +>12 belong 8 (FDDI) +>12 belong 9 (Unknown) + +# Microsoft ICM color profile +36 string acspMSFT Microsoft ICM Color Profile +# Sun KCMS +36 string acsp Kodak Color Management System, ICC Profile + +#--------------------------------------------------------------------------- +# The following entries have been tested by Duncan Laurie (a +# lead Sun/Cobalt developer) who agrees that they are good and worthy of +# inclusion. + +# Boot ROM images for Sun/Cobalt Linux server appliances +0 string Cobalt\ Networks\ Inc.\nFirmware\ v Paged COBALT boot rom +>38 string x V%.4s + +# New format for Sun/Cobalt boot ROMs is annoying, it stores the version code +# at the very end where file(1) can't get it. +0 string CRfs COBALT boot rom data (Flat boot rom or file system) + + +#------------------------------------------------------------------------ +# sysex: file(1) magic for MIDI sysex files +# +# +0 byte 0xF0 SysEx File - + +# North American Group +>1 byte 0x01 Sequential +>1 byte 0x02 IDP +>1 byte 0x03 OctavePlateau +>1 byte 0x04 Moog +>1 byte 0x05 Passport +>1 byte 0x06 Lexicon +>1 byte 0x07 Kurzweil/Future Retro +>>3 byte 0x77 777 +>>4 byte 0x00 Bank +>>4 byte 0x01 Song +>>5 byte 0x0f 16 +>>5 byte 0x0e 15 +>>5 byte 0x0d 14 +>>5 byte 0x0c 13 +>>5 byte 0x0b 12 +>>5 byte 0x0a 11 +>>5 byte 0x09 10 +>>5 byte 0x08 9 +>>5 byte 0x07 8 +>>5 byte 0x06 7 +>>5 byte 0x05 6 +>>5 byte 0x04 5 +>>5 byte 0x03 4 +>>5 byte 0x02 3 +>>5 byte 0x01 2 +>>5 byte 0x00 1 +>>5 byte 0x10 (ALL) +>>2 byte x \b, Channel %d +>1 byte 0x08 Fender +>1 byte 0x09 Gulbransen +>1 byte 0x0a AKG +>1 byte 0x0b Voyce +>1 byte 0x0c Waveframe +>1 byte 0x0d ADA +>1 byte 0x0e Garfield +>1 byte 0x0f Ensoniq +>1 byte 0x10 Oberheim +>>2 byte 0x06 Matrix 6 series +>>3 byte 0x0A Dump (All) +>>3 byte 0x01 Dump (Bank) +>>4 belong 0x0002040E Matrix 1000 +>>>11 byte <2 User bank %d +>>>11 byte >1 Preset bank %d +>1 byte 0x11 Apple +>1 byte 0x12 GreyMatter +>1 byte 0x14 PalmTree +>1 byte 0x15 JLCooper +>1 byte 0x16 Lowrey +>1 byte 0x17 AdamsSmith +>1 byte 0x18 E-mu +>1 byte 0x19 Harmony +>1 byte 0x1a ART +>1 byte 0x1b Baldwin +>1 byte 0x1c Eventide +>1 byte 0x1d Inventronics +>1 byte 0x1f Clarity + +# European Group +>1 byte 0x21 SIEL +>1 byte 0x22 Synthaxe +>1 byte 0x24 Hohner +>1 byte 0x25 Twister +>1 byte 0x26 Solton +>1 byte 0x27 Jellinghaus +>1 byte 0x28 Southworth +>1 byte 0x29 PPG +>1 byte 0x2a JEN +>1 byte 0x2b SSL +>1 byte 0x2c AudioVertrieb + +>1 byte 0x2f ELKA +>>3 byte 0x09 EK-44 + +>1 byte 0x30 Dynacord +>1 byte 0x31 Jomox +>1 byte 0x33 Clavia +>1 byte 0x39 Soundcraft +# Some Waldorf info from http://Stromeko.Synth.net/Downloads#WaldorfDocs +>1 byte 0x3e Waldorf +>>2 byte 0x00 microWave +>>2 byte 0x0E microwave2 / XT +>>2 byte 0x0F Q / Q+ +>>3 byte =0 (default id) +>>3 byte >0 ( +>>>3 byte <0x7F \bdevice %d) +>>>3 byte =0x7F \bbroadcast id) +>>3 byte 0x7f Microwave I +>>>4 byte 0x00 SNDR (Sound Request) +>>>4 byte 0x10 SNDD (Sound Dump) +>>>4 byte 0x20 SNDP (Sound Parameter Change) +>>>4 byte 0x30 SNDQ (Sound Parameter Inquiry) +>>>4 byte 0x70 BOOT (Sound Reserved) +>>>4 byte 0x01 MULR (Multi Request) +>>>4 byte 0x11 MULD (Multi Dump) +>>>4 byte 0x21 MULP (Multi Parameter Change) +>>>4 byte 0x31 MULQ (Multi Parameter Inquiry) +>>>4 byte 0x71 OS (Multi Reserved) +>>>4 byte 0x02 DRMR (Drum Map Request) +>>>4 byte 0x12 DRMD (Drum Map Dump) +>>>4 byte 0x22 DRMP (Drum Map Parameter Change) +>>>4 byte 0x32 DRMQ (Drum Map Parameter Inquiry) +>>>4 byte 0x72 BIN (Drum Map Reserved) +>>>4 byte 0x03 PATR (Sequencer Pattern Request) +>>>4 byte 0x13 PATD (Sequencer Pattern Dump) +>>>4 byte 0x23 PATP (Sequencer Pattern Parameter Change) +>>>4 byte 0x33 PATQ (Sequencer Pattern Parameter Inquiry) +>>>4 byte 0x73 AFM (Sequencer Pattern Reserved) +>>>4 byte 0x04 GLBR (Global Parameter Request) +>>>4 byte 0x14 GLBD (Global Parameter Dump) +>>>4 byte 0x24 GLBP (Global Parameter Parameter Change) +>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry) +>>>4 byte 0x07 MODR (Mode Parameter Request) +>>>4 byte 0x17 MODD (Mode Parameter Dump) +>>>4 byte 0x27 MODP (Mode Parameter Parameter Change) +>>>4 byte 0x37 MODQ (Mode Parameter Parameter Inquiry) +>>2 byte 0x10 microQ +>>>4 byte 0x00 SNDR (Sound Request) +>>>4 byte 0x10 SNDD (Sound Dump) +>>>4 byte 0x20 SNDP (Sound Parameter Change) +>>>4 byte 0x30 SNDQ (Sound Parameter Inquiry) +>>>4 byte 0x70 (Sound Reserved) +>>>4 byte 0x01 MULR (Multi Request) +>>>4 byte 0x11 MULD (Multi Dump) +>>>4 byte 0x21 MULP (Multi Parameter Change) +>>>4 byte 0x31 MULQ (Multi Parameter Inquiry) +>>>4 byte 0x71 OS (Multi Reserved) +>>>4 byte 0x02 DRMR (Drum Map Request) +>>>4 byte 0x12 DRMD (Drum Map Dump) +>>>4 byte 0x22 DRMP (Drum Map Parameter Change) +>>>4 byte 0x32 DRMQ (Drum Map Parameter Inquiry) +>>>4 byte 0x72 BIN (Drum Map Reserved) +>>>4 byte 0x04 GLBR (Global Parameter Request) +>>>4 byte 0x14 GLBD (Global Parameter Dump) +>>>4 byte 0x24 GLBP (Global Parameter Parameter Change) +>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry) +>>2 byte 0x11 rackAttack +>>>4 byte 0x00 SNDR (Sound Parameter Request) +>>>4 byte 0x10 SNDD (Sound Parameter Dump) +>>>4 byte 0x20 SNDP (Sound Parameter Parameter Change) +>>>4 byte 0x30 SNDQ (Sound Parameter Parameter Inquiry) +>>>4 byte 0x01 PRGR (Program Parameter Request) +>>>4 byte 0x11 PRGD (Program Parameter Dump) +>>>4 byte 0x21 PRGP (Program Parameter Parameter Change) +>>>4 byte 0x31 PRGQ (Program Parameter Parameter Inquiry) +>>>4 byte 0x71 OS (Program Parameter Reserved) +>>>4 byte 0x03 PATR (Pattern Parameter Request) +>>>4 byte 0x13 PATD (Pattern Parameter Dump) +>>>4 byte 0x23 PATP (Pattern Parameter Parameter Change) +>>>4 byte 0x33 PATQ (Pattern Parameter Parameter Inquiry) +>>>4 byte 0x04 GLBR (Global Parameter Request) +>>>4 byte 0x14 GLBD (Global Parameter Dump) +>>>4 byte 0x24 GLBP (Global Parameter Parameter Change) +>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry) +>>>4 byte 0x05 EFXR (FX Parameter Request) +>>>4 byte 0x15 EFXD (FX Parameter Dump) +>>>4 byte 0x25 EFXP (FX Parameter Parameter Change) +>>>4 byte 0x35 EFXQ (FX Parameter Parameter Inquiry) +>>>4 byte 0x07 MODR (Mode Command Request) +>>>4 byte 0x17 MODD (Mode Command Dump) +>>>4 byte 0x27 MODP (Mode Command Parameter Change) +>>>4 byte 0x37 MODQ (Mode Command Parameter Inquiry) +>>2 byte 0x03 Wave +>>>4 byte 0x00 SBPR (Soundprogram) +>>>4 byte 0x01 SAPR (Performance) +>>>4 byte 0x02 SWAVE (Wave) +>>>4 byte 0x03 SWTBL (Wave control table) +>>>4 byte 0x04 SVT (Velocity Curve) +>>>4 byte 0x05 STT (Tuning Table) +>>>4 byte 0x06 SGLB (Global Parameters) +>>>4 byte 0x07 SARRMAP (Performance Program Change Map) +>>>4 byte 0x08 SBPRMAP (Sound Program Change Map) +>>>4 byte 0x09 SBPRPAR (Sound Parameter) +>>>4 byte 0x0A SARRPAR (Performance Parameter) +>>>4 byte 0x0B SINSPAR (Instrument/External Parameter) +>>>4 byte 0x0F SBULK (Bulk Switch on/off) + +# Japanese Group +>1 byte 0x40 Kawai +>>3 byte 0x20 K1 +>>3 byte 0x22 K4 + +>1 byte 0x41 Roland +>>3 byte 0x14 D-50 +>>3 byte 0x2b U-220 +>>3 byte 0x02 TR-707 + +>1 byte 0x42 Korg +>>3 byte 0x19 M1 + +>1 byte 0x43 Yamaha +>1 byte 0x44 Casio +>1 byte 0x46 Kamiya +>1 byte 0x47 Akai +>1 byte 0x48 Victor +>1 byte 0x49 Mesosha +>1 byte 0x4b Fujitsu +>1 byte 0x4c Sony +>1 byte 0x4e Teac +>1 byte 0x50 Matsushita +>1 byte 0x51 Fostex +>1 byte 0x52 Zoom +>1 byte 0x54 Matsushita +>1 byte 0x57 Acoustic tech. lab. + +>1 belong&0xffffff00 0x00007400 Ta Horng +>1 belong&0xffffff00 0x00007500 e-Tek +>1 belong&0xffffff00 0x00007600 E-Voice +>1 belong&0xffffff00 0x00007700 Midisoft +>1 belong&0xffffff00 0x00007800 Q-Sound +>1 belong&0xffffff00 0x00007900 Westrex +>1 belong&0xffffff00 0x00007a00 Nvidia* +>1 belong&0xffffff00 0x00007b00 ESS +>1 belong&0xffffff00 0x00007c00 Mediatrix +>1 belong&0xffffff00 0x00007d00 Brooktree +>1 belong&0xffffff00 0x00007e00 Otari +>1 belong&0xffffff00 0x00007f00 Key Electronics +>1 belong&0xffffff00 0x00010000 Shure +>1 belong&0xffffff00 0x00010100 AuraSound +>1 belong&0xffffff00 0x00010200 Crystal +>1 belong&0xffffff00 0x00010300 Rockwell +>1 belong&0xffffff00 0x00010400 Silicon Graphics +>1 belong&0xffffff00 0x00010500 Midiman +>1 belong&0xffffff00 0x00010600 PreSonus +>1 belong&0xffffff00 0x00010800 Topaz +>1 belong&0xffffff00 0x00010900 Cast Lightning +>1 belong&0xffffff00 0x00010a00 Microsoft +>1 belong&0xffffff00 0x00010b00 Sonic Foundry +>1 belong&0xffffff00 0x00010c00 Line 6 +>1 belong&0xffffff00 0x00010d00 Beatnik Inc. +>1 belong&0xffffff00 0x00010e00 Van Koerving +>1 belong&0xffffff00 0x00010f00 Altech Systems +>1 belong&0xffffff00 0x00011000 S & S Research +>1 belong&0xffffff00 0x00011100 VLSI Technology +>1 belong&0xffffff00 0x00011200 Chromatic +>1 belong&0xffffff00 0x00011300 Sapphire +>1 belong&0xffffff00 0x00011400 IDRC +>1 belong&0xffffff00 0x00011500 Justonic Tuning +>1 belong&0xffffff00 0x00011600 TorComp +>1 belong&0xffffff00 0x00011700 Newtek Inc. +>1 belong&0xffffff00 0x00011800 Sound Sculpture +>1 belong&0xffffff00 0x00011900 Walker Technical +>1 belong&0xffffff00 0x00011a00 Digital Harmony +>1 belong&0xffffff00 0x00011b00 InVision +>1 belong&0xffffff00 0x00011c00 T-Square +>1 belong&0xffffff00 0x00011d00 Nemesys +>1 belong&0xffffff00 0x00011e00 DBX +>1 belong&0xffffff00 0x00011f00 Syndyne +>1 belong&0xffffff00 0x00012000 Bitheadz +>1 belong&0xffffff00 0x00012100 Cakewalk +>1 belong&0xffffff00 0x00012200 Staccato +>1 belong&0xffffff00 0x00012300 National Semicon. +>1 belong&0xffffff00 0x00012400 Boom Theory +>1 belong&0xffffff00 0x00012500 Virtual DSP Corp +>1 belong&0xffffff00 0x00012600 Antares +>1 belong&0xffffff00 0x00012700 Angel Software +>1 belong&0xffffff00 0x00012800 St Louis Music +>1 belong&0xffffff00 0x00012900 Lyrrus dba G-VOX +>1 belong&0xffffff00 0x00012a00 Ashley Audio +>1 belong&0xffffff00 0x00012b00 Vari-Lite +>1 belong&0xffffff00 0x00012c00 Summit Audio +>1 belong&0xffffff00 0x00012d00 Aureal Semicon. +>1 belong&0xffffff00 0x00012e00 SeaSound +>1 belong&0xffffff00 0x00012f00 U.S. Robotics +>1 belong&0xffffff00 0x00013000 Aurisis +>1 belong&0xffffff00 0x00013100 Nearfield Multimedia +>1 belong&0xffffff00 0x00013200 FM7 Inc. +>1 belong&0xffffff00 0x00013300 Swivel Systems +>1 belong&0xffffff00 0x00013400 Hyperactive +>1 belong&0xffffff00 0x00013500 MidiLite +>1 belong&0xffffff00 0x00013600 Radical +>1 belong&0xffffff00 0x00013700 Roger Linn +>1 belong&0xffffff00 0x00013800 Helicon +>1 belong&0xffffff00 0x00013900 Event +>1 belong&0xffffff00 0x00013a00 Sonic Network +>1 belong&0xffffff00 0x00013b00 Realtime Music +>1 belong&0xffffff00 0x00013c00 Apogee Digital + +>1 belong&0xffffff00 0x00202b00 Medeli Electronics +>1 belong&0xffffff00 0x00202c00 Charlie Lab +>1 belong&0xffffff00 0x00202d00 Blue Chip Music +>1 belong&0xffffff00 0x00202e00 BEE OH Corp +>1 belong&0xffffff00 0x00202f00 LG Semicon America +>1 belong&0xffffff00 0x00203000 TESI +>1 belong&0xffffff00 0x00203100 EMAGIC +>1 belong&0xffffff00 0x00203200 Behringer +>1 belong&0xffffff00 0x00203300 Access Music +>1 belong&0xffffff00 0x00203400 Synoptic +>1 belong&0xffffff00 0x00203500 Hanmesoft Corp +>1 belong&0xffffff00 0x00203600 Terratec +>1 belong&0xffffff00 0x00203700 Proel SpA +>1 belong&0xffffff00 0x00203800 IBK MIDI +>1 belong&0xffffff00 0x00203900 IRCAM +>1 belong&0xffffff00 0x00203a00 Propellerhead Software +>1 belong&0xffffff00 0x00203b00 Red Sound Systems +>1 belong&0xffffff00 0x00203c00 Electron ESI AB +>1 belong&0xffffff00 0x00203d00 Sintefex Audio +>1 belong&0xffffff00 0x00203e00 Music and More +>1 belong&0xffffff00 0x00203f00 Amsaro +>1 belong&0xffffff00 0x00204000 CDS Advanced Technology +>1 belong&0xffffff00 0x00204100 Touched by Sound +>1 belong&0xffffff00 0x00204200 DSP Arts +>1 belong&0xffffff00 0x00204300 Phil Rees Music +>1 belong&0xffffff00 0x00204400 Stamer Musikanlagen GmbH +>1 belong&0xffffff00 0x00204500 Soundart +>1 belong&0xffffff00 0x00204600 C-Mexx Software +>1 belong&0xffffff00 0x00204700 Klavis Tech. +>1 belong&0xffffff00 0x00204800 Noteheads AB + +0 string T707 Roland TR-707 Data +#------------------------------------------------------------------------------ +# teapot: file(1) magic for "teapot" spreadsheet +# +0 string #!teapot\012xdr teapot work sheet (XDR format) + +#------------------------------------------------------------------------------ +# terminfo: file(1) magic for terminfo +# +# XXX - byte order for screen images? +# +0 string \032\001 Compiled terminfo entry +0 short 0433 Curses screen image +0 short 0434 Curses screen image + +#------------------------------------------------------------------------------ +# tex: file(1) magic for TeX files +# +# From + +# Although we may know the offset of certain text fields in TeX DVI +# and font files, we can't use them reliably because they are not +# zero terminated. [but we do anyway, christos] +0 string \367\002 TeX DVI file +>16 string >\0 (%s) +0 string \367\203 TeX generic font data +0 string \367\131 TeX packed font data +>3 string >\0 (%s) +0 string \367\312 TeX virtual font data +0 string This\ is\ TeX, TeX transcript text +0 string This\ is\ METAFONT, METAFONT transcript text + +# There is no way to detect TeX Font Metric (*.tfm) files without +# breaking them apart and reading the data. The following patterns +# match most *.tfm files generated by METAFONT or afm2tfm. +2 string \000\021 TeX font metric data +>33 string >\0 (%s) +2 string \000\022 TeX font metric data +>33 string >\0 (%s) + +# Texinfo and GNU Info, from Daniel Quinlan (quinlan@yggdrasil.com) +0 string \\input\ texinfo Texinfo source text +0 string This\ is\ Info\ file GNU Info text + +# TeX documents, from Daniel Quinlan (quinlan@yggdrasil.com) +0 search/400 \\input TeX document text +0 search/400 \\section LaTeX document text +0 search/400 \\setlength LaTeX document text +0 search/400 \\documentstyle LaTeX document text +0 search/400 \\chapter LaTeX document text +0 search/400 \\documentclass LaTeX 2e document text +0 search/400 \\relax LaTeX auxiliary file +0 search/400 \\contentsline LaTeX table of contents +0 search/400 %\ -*-latex-*- LaTeX document text + +# Tex document, from Hendrik Scholz +0 string \\ifx TeX document text + +# Index and glossary files +0 search/400 \\indexentry LaTeX raw index file +0 search/400 \\begin{theindex} LaTeX sorted index +0 search/400 \\glossaryentry LaTeX raw glossary +0 search/400 \\begin{theglossary} LaTeX sorted glossary +0 search/400 This\ is\ makeindex Makeindex log file + +# End of TeX + +#------------------------------------------------------------------------------ +# file(1) magic for BibTex text files +# From Hendrik Scholz + +0 string/c @article{ BibTeX text file +0 string/c @book{ BibTeX text file +0 string/c @inbook{ BibTeX text file +0 string/c @incollection{ BibTeX text file +0 string/c @inproceedings{ BibTeX text file +0 string/c @manual{ BibTeX text file +0 string/c @misc{ BibTeX text file +0 string/c @preamble{ BibTeX text file +0 string/c @phdthesis{ BibTeX text file +0 string/c @techreport{ BibTeX text file +0 string/c @unpublished{ BibTeX text file + +73 string %%%\ \ BibTeX-file{ BibTex text file (with full header) + +73 string %%%\ \ @BibTeX-style-file{ BibTeX style text file (with full header) + +0 string %\ BibTeX\ standard\ bibliography\ BibTeX standard bibliography style text file + +0 string %\ BibTeX\ ` BibTeX custom bibliography style text file + +0 string @c\ @mapfile{ TeX font aliases text file + +#------------------------------------------------------------------------------ +# file(1) magic for tgif(1) files +# From Hendrik Scholz + +0 string %TGIF\ x Tgif file version %s + +# ------------------------------------------------------------------------ +# ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators. +# +# From: Ryan McGuire (rmcguire@freenet.columbus.oh.us). +# +# Update: Romain Lievin (roms@lpg.ticalc.org). +# +# NOTE: This list is not complete. +# Files for the TI-80 and TI-81 are pretty rare. I'm not going to put the +# program/group magic numbers in here because I cannot find any. +0 string **TI80** TI-80 Graphing Calculator File. +0 string **TI81** TI-81 Graphing Calculator File. +# +# Magic Numbers for the TI-73 +# +0 string **TI73** TI-73 Graphing Calculator +>0x00003B byte 0x00 (real number) +>0x00003B byte 0x01 (list) +>0x00003B byte 0x02 (matrix) +>0x00003B byte 0x03 (equation) +>0x00003B byte 0x04 (string) +>0x00003B byte 0x05 (program) +>0x00003B byte 0x06 (assembly program) +>0x00003B byte 0x07 (picture) +>0x00003B byte 0x08 (gdb) +>0x00003B byte 0x0C (complex number) +>0x00003B byte 0x0F (window settings) +>0x00003B byte 0x10 (zoom) +>0x00003B byte 0x11 (table setup) +>0x00003B byte 0x13 (backup) + +# Magic Numbers for the TI-82 +# +0 string **TI82** TI-82 Graphing Calculator +>0x00003B byte 0x00 (real) +>0x00003B byte 0x01 (list) +>0x00003B byte 0x02 (matrix) +>0x00003B byte 0x03 (Y-variable) +>0x00003B byte 0x05 (program) +>0x00003B byte 0x06 (protected prgm) +>0x00003B byte 0x07 (picture) +>0x00003B byte 0x08 (gdb) +>0x00003B byte 0x0B (window settings) +>0x00003B byte 0x0C (window settings) +>0x00003B byte 0x0D (table setup) +>0x00003B byte 0x0E (screenshot) +>0x00003B byte 0x0F (backup) +# +# Magic Numbers for the TI-83 +# +0 string **TI83** TI-83 Graphing Calculator +>0x00003B byte 0x00 (real) +>0x00003B byte 0x01 (list) +>0x00003B byte 0x02 (matrix) +>0x00003B byte 0x03 (Y-variable) +>0x00003B byte 0x04 (string) +>0x00003B byte 0x05 (program) +>0x00003B byte 0x06 (protected prgm) +>0x00003B byte 0x07 (picture) +>0x00003B byte 0x08 (gdb) +>0x00003B byte 0x0B (window settings) +>0x00003B byte 0x0C (window settings) +>0x00003B byte 0x0D (table setup) +>0x00003B byte 0x0E (screenshot) +>0x00003B byte 0x13 (backup) +# +# Magic Numbers for the TI-83+ +# +0 string **TI83F* TI-83+ Graphing Calculator +>0x00003B byte 0x00 (real number) +>0x00003B byte 0x01 (list) +>0x00003B byte 0x02 (matrix) +>0x00003B byte 0x03 (equation) +>0x00003B byte 0x04 (string) +>0x00003B byte 0x05 (program) +>0x00003B byte 0x06 (assembly program) +>0x00003B byte 0x07 (picture) +>0x00003B byte 0x08 (gdb) +>0x00003B byte 0x0C (complex number) +>0x00003B byte 0x0F (window settings) +>0x00003B byte 0x10 (zoom) +>0x00003B byte 0x11 (table setup) +>0x00003B byte 0x13 (backup) +>0x00003B byte 0x15 (application variable) +>0x00003B byte 0x17 (group of variable) + +# +# Magic Numbers for the TI-85 +# +0 string **TI85** TI-85 Graphing Calculator +>0x00003B byte 0x00 (real number) +>0x00003B byte 0x01 (complex number) +>0x00003B byte 0x02 (real vector) +>0x00003B byte 0x03 (complex vector) +>0x00003B byte 0x04 (real list) +>0x00003B byte 0x05 (complex list) +>0x00003B byte 0x06 (real matrix) +>0x00003B byte 0x07 (complex matrix) +>0x00003B byte 0x08 (real constant) +>0x00003B byte 0x09 (complex constant) +>0x00003B byte 0x0A (equation) +>0x00003B byte 0x0C (string) +>0x00003B byte 0x0D (function GDB) +>0x00003B byte 0x0E (polar GDB) +>0x00003B byte 0x0F (parametric GDB) +>0x00003B byte 0x10 (diffeq GDB) +>0x00003B byte 0x11 (picture) +>0x00003B byte 0x12 (program) +>0x00003B byte 0x13 (range) +>0x00003B byte 0x17 (window settings) +>0x00003B byte 0x18 (window settings) +>0x00003B byte 0x19 (window settings) +>0x00003B byte 0x1A (window settings) +>0x00003B byte 0x1B (zoom) +>0x00003B byte 0x1D (backup) +>0x00003B byte 0x1E (unknown) +>0x00003B byte 0x2A (equation) +>0x000032 string ZS4 - ZShell Version 4 File. +>0x000032 string ZS3 - ZShell Version 3 File. +# +# Magic Numbers for the TI-86 +# +0 string **TI86** TI-86 Graphing Calculator +>0x00003B byte 0x00 (real number) +>0x00003B byte 0x01 (complex number) +>0x00003B byte 0x02 (real vector) +>0x00003B byte 0x03 (complex vector) +>0x00003B byte 0x04 (real list) +>0x00003B byte 0x05 (complex list) +>0x00003B byte 0x06 (real matrix) +>0x00003B byte 0x07 (complex matrix) +>0x00003B byte 0x08 (real constant) +>0x00003B byte 0x09 (complex constant) +>0x00003B byte 0x0A (equation) +>0x00003B byte 0x0C (string) +>0x00003B byte 0x0D (function GDB) +>0x00003B byte 0x0E (polar GDB) +>0x00003B byte 0x0F (parametric GDB) +>0x00003B byte 0x10 (diffeq GDB) +>0x00003B byte 0x11 (picture) +>0x00003B byte 0x12 (program) +>0x00003B byte 0x13 (range) +>0x00003B byte 0x17 (window settings) +>0x00003B byte 0x18 (window settings) +>0x00003B byte 0x19 (window settings) +>0x00003B byte 0x1A (window settings) +>0x00003B byte 0x1B (zoom) +>0x00003B byte 0x1D (backup) +>0x00003B byte 0x1E (unknown) +>0x00003B byte 0x2A (equation) +# +# Magic Numbers for the TI-89 +# +0 string **TI89** TI-89 Graphing Calculator +>0x000048 byte 0x00 (expression) +>0x000048 byte 0x04 (list) +>0x000048 byte 0x06 (matrix) +>0x000048 byte 0x0A (data) +>0x000048 byte 0x0B (text) +>0x000048 byte 0x0C (string) +>0x000048 byte 0x0D (graphic data base) +>0x000048 byte 0x0E (figure) +>0x000048 byte 0x10 (picture) +>0x000048 byte 0x12 (program) +>0x000048 byte 0x13 (function) +>0x000048 byte 0x14 (macro) +>0x000048 byte 0x1C (zipped) +>0x000048 byte 0x21 (assembler) +# +# Magic Numbers for the TI-92 +# +0 string **TI92** TI-92 Graphing Calculator +>0x000048 byte 0x00 (expression) +>0x000048 byte 0x04 (list) +>0x000048 byte 0x06 (matrix) +>0x000048 byte 0x0A (data) +>0x000048 byte 0x0B (text) +>0x000048 byte 0x0C (string) +>0x000048 byte 0x0D (graphic data base) +>0x000048 byte 0x0E (figure) +>0x000048 byte 0x10 (picture) +>0x000048 byte 0x12 (program) +>0x000048 byte 0x13 (function) +>0x000048 byte 0x14 (macro) +>0x000048 byte 0x1D (backup) +# +# Magic Numbers for the TI-92+/V200 +# +0 string **TI92P* TI-92+/V200 Graphing Calculator +>0x000048 byte 0x00 (expression) +>0x000048 byte 0x04 (list) +>0x000048 byte 0x06 (matrix) +>0x000048 byte 0x0A (data) +>0x000048 byte 0x0B (text) +>0x000048 byte 0x0C (string) +>0x000048 byte 0x0D (graphic data base) +>0x000048 byte 0x0E (figure) +>0x000048 byte 0x10 (picture) +>0x000048 byte 0x12 (program) +>0x000048 byte 0x13 (function) +>0x000048 byte 0x14 (macro) +>0x000048 byte 0x1C (zipped) +>0x000048 byte 0x21 (assembler) +# +# Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades +# +0x0000016 string Advanced TI-XX Graphing Calculator (FLASH) +0 string **TIFL** TI-XX Graphing Calculator (FLASH) +>8 byte >0 - Revision %d +>>9 byte x \b.%d, +>12 byte >0 Revision date %02x +>>13 byte x \b/%02x +>>14 beshort x \b/%04x, +>17 string >/0 name: '%s', +>48 byte 0x74 device: TI-73, +>48 byte 0x73 device: TI-83+, +>48 byte 0x98 device: TI-89, +>48 byte 0x88 device: TI-92+, +>49 byte 0x23 type: OS upgrade, +>49 byte 0x24 type: application, +>49 byte 0x25 type: certificate, +>49 byte 0x3e type: license, +>74 lelong >0 size: %ld bytes + +# VTi & TiEmu skins (TI Graphing Calculators). +# From: Romain Lievin (roms@lpg.ticalc.org). +# Magic Numbers for the VTi skins +0 string VTI Virtual TI skin +>3 string v - Version +>>4 byte >0 \b %c +>>6 byte x \b.%c +# Magic Numbers for the TiEmu skins +0 string TiEmu TiEmu skin +>6 string v - Version +>>7 byte >0 \b %c +>>9 byte x \b.%c +>>10 byte x \b%c + +#------------------------------------------------------------------------------ +# timezone: file(1) magic for timezone data +# +# from Daniel Quinlan (quinlan@yggdrasil.com) +# this should work on Linux, SunOS, and maybe others +# Added new official magic number for recent versions of the Olson code +0 string TZif timezone data +0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0 old timezone data +0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0 old timezone data +0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0 old timezone data +0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0 old timezone data +0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0 old timezone data +0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0 old timezone data + +#------------------------------------------------------------------------------ +# troff: file(1) magic for *roff +# +# updated by Daniel Quinlan (quinlan@yggdrasil.com) + +# troff input +0 string .\\" troff or preprocessor input text +0 string '\\" troff or preprocessor input text +0 string '.\\" troff or preprocessor input text +0 string \\" troff or preprocessor input text +0 string ''' troff or preprocessor input text + +# ditroff intermediate output text +0 string x\ T ditroff output text +>4 string cat for the C/A/T phototypesetter +>4 string ps for PostScript +>4 string dvi for DVI +>4 string ascii for ASCII +>4 string lj4 for LaserJet 4 +>4 string latin1 for ISO 8859-1 (Latin 1) +>4 string X75 for xditview at 75dpi +>>7 string -12 (12pt) +>4 string X100 for xditview at 100dpi +>>8 string -12 (12pt) + +# output data formats +0 string \100\357 very old (C/A/T) troff output data +# +#------------------------------------------------------------------------------ +# tuxedo: file(1) magic for BEA TUXEDO data files +# +# from Ian Springer +# +0 string \0\0\1\236\0\0\0\0\0\0\0\0\0\0\0\0 BEA TUXEDO DES mask data + +#------------------------------------------------------------------------------ +# typeset: file(1) magic for other typesetting +# +0 string Interpress/Xerox Xerox InterPress data +>16 string / (version +>>17 string >\0 %s) + +#------------------------------------------------------------------------------ +# unknown: file(1) magic for unknown machines +# +# XXX - this probably should be pruned, as it'll match PDP-11 and +# VAX image formats. +# +# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure, +# respectively). +# +# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't +# have the "version %ld", which may be a bogus COFFism (I don't think +# there ever was COFF for the PDP-11). +# +# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a +# long, as it would be on a VAX. +# +# 0x10C is 0414 and 0x10E is 416; those *are* unknown. +# +0 short 0x107 unknown machine executable +>8 short >0 not stripped +>15 byte >0 - version %ld +0 short 0x108 unknown pure executable +>8 short >0 not stripped +>15 byte >0 - version %ld +0 short 0x109 PDP-11 separate I&D +>8 short >0 not stripped +>15 byte >0 - version %ld +0 short 0x10b unknown pure executable +>8 short >0 not stripped +>15 byte >0 - version %ld +0 long 0x10c unknown demand paged pure executable +>16 long >0 not stripped +0 long 0x10e unknown readable demand paged pure executable + +#--------------------------------------------------------------------------- +# Unicode: BOM prefixed text files - Adrian Havill +# +0 string +/v8 Unicode text, UTF-7 +0 string +/v9 Unicode text, UTF-7 +0 string +/v+ Unicode text, UTF-7 +0 string +/v/ Unicode text, UTF-7 +0 string \357\273\277 Unicode text, UTF-8 +0 string \335\163\146\163 Unicode text, UTF-8-EBCDIC +0 string \376\377\000\000 Unicode text, UTF-32, big-endian +0 string \377\376\000\000 Unicode text, UTF-32, little-endian +0 string \376\377 Unicode text, UTF-16, big-endian +0 string \377\376 Unicode text, UTF-16, little-endian +0 string \016\376\377 Unicode text, SCSU (Standard Compression Scheme for Unicode) + +#------------------------------------------------------------------------------ +# uuencode: file(1) magic for ASCII-encoded files +# + +# GRR: the first line of xxencoded files is identical to that in uuencoded +# files, but the first character in most subsequent lines is 'h' instead of +# 'M'. (xxencoding uses lowercase letters in place of most of uuencode's +# punctuation and survives BITNET gateways better.) If regular expressions +# were supported, this entry could possibly be split into two with +# "begin\040\.\*\012M" or "begin\040\.\*\012h" (where \. and \* are REs). +0 string begin\040 uuencoded or xxencoded text + +# btoa(1) is an alternative to uuencode that requires less space. +0 string xbtoa\ Begin btoa'd text + +# ship(1) is another, much cooler alternative to uuencode. +# Greg Roelofs, newt@uchicago.edu +0 string $\012ship ship'd binary text + +# bencode(8) is used to encode compressed news batches (Bnews/Cnews only?) +# Greg Roelofs, newt@uchicago.edu +0 string Decode\ the\ following\ with\ bdeco bencoded News text + +# BinHex is the Macintosh ASCII-encoded file format (see also "apple") +# Daniel Quinlan, quinlan@yggdrasil.com +11 string must\ be\ converted\ with\ BinHex BinHex binary text +>41 string x \b, version %.3s + +# GRR: is MIME BASE64 encoding handled somewhere? + +#------------------------------------------------------------------------------ +# varied.out: file(1) magic for various USG systems +# +# Herewith many of the object file formats used by USG systems. +# Most have been moved to files for a particular processor, +# and deleted if they duplicate other entries. +# +0 short 0610 Perkin-Elmer executable +# AMD 29K +0 beshort 0572 amd 29k coff noprebar executable +0 beshort 01572 amd 29k coff prebar executable +0 beshort 0160007 amd 29k coff archive +# Cray +6 beshort 0407 unicos (cray) executable +# Ultrix 4.3 +596 string \130\337\377\377 Ultrix core file +>600 string >\0 from '%s' +# BeOS and MAcOS PEF executables +# From: hplus@zilker.net (Jon Watte) +0 string Joy!peffpwpc header for PowerPC PEF executable +# +# ava assembler/linker Uros Platise +0 string avaobj AVR assembler object code +>7 string >\0 version '%s' +# gnu gmon magic From: Eugen Dedu +0 string gmon GNU prof performance data +>4 long x - version %ld +# From: Dave Pearson +# Harbour HRB files. +0 string \xc0HRB Harbour HRB file +>4 short x version %d + +# From: Alex Beregszaszi +# 0 string exec BugOS executable +# 0 string pack BugOS archive + +# From: Jason Spence +# Generated by the "examples" in STM's ST40 devkit, and derived code. +0 lelong 0x13a9f17e ST40 component image format +>4 string >\0 \b, name '%s' + +#------------------------------------------------------------------------------ +# varied.script: file(1) magic for various interpreter scripts + +0 string #!\ / a +>3 string >\0 %s script text executable +0 string #!\t/ a +>3 string >\0 %s script text executable +0 string #!/ a +>2 string >\0 %s script text executable +0 string #!\ script text executable +>3 string >\0 for %s + + +#------------------------------------------------------------------------------ +# vax: file(1) magic for VAX executable/object and APL workspace +# +0 lelong 0101557 VAX single precision APL workspace +0 lelong 0101556 VAX double precision APL workspace + +# +# VAX a.out (32V, BSD) +# +0 lelong 0407 VAX executable +>16 lelong >0 not stripped + +0 lelong 0410 VAX pure executable +>16 lelong >0 not stripped + +0 lelong 0413 VAX demand paged pure executable +>16 lelong >0 not stripped + +0 lelong 0420 VAX demand paged (first page unmapped) pure executable +>16 lelong >0 not stripped + +# +# VAX COFF +# +# The `versions' should be un-commented if they work for you. +# (Was the problem just one of endianness?) +# +0 leshort 0570 VAX COFF executable +>12 lelong >0 not stripped +>22 leshort >0 - version %ld +0 leshort 0575 VAX COFF pure executable +>12 lelong >0 not stripped +>22 leshort >0 - version %ld + +#------------------------------------------------------------------------------ +# vicar: file(1) magic for VICAR files. +# +# From: Ossama Othman 32 string BYTE \b, 8 bits = VAX byte +>32 string HALF \b, 16 bits = VAX word = Fortran INTEGER*2 +>32 string FULL \b, 32 bits = VAX longword = Fortran INTEGER*4 +>32 string REAL \b, 32 bits = VAX longword = Fortran REAL*4 +>32 string DOUB \b, 64 bits = VAX quadword = Fortran REAL*8 +>32 string COMPLEX \b, 64 bits = VAX quadword = Fortran COMPLEX*8 +# VICAR label file +43 string SFDU_LABEL VICAR label file +#------------------------------------------------------------------------------ +# Virtutech Compressed Random Access File Format +# +# From +0 string \211\277\036\203 Virtutech CRAFF +>4 belong x v%d +>20 belong 0 uncompressed +>20 belong 1 bzipp2ed +>20 belong 2 gzipped +>24 belong 0 not clean + +#------------------------------------------------------------------------------ +# visx: file(1) magic for Visx format files +# +0 short 0x5555 VISX image file +>2 byte 0 (zero) +>2 byte 1 (unsigned char) +>2 byte 2 (short integer) +>2 byte 3 (float 32) +>2 byte 4 (float 64) +>2 byte 5 (signed char) +>2 byte 6 (bit-plane) +>2 byte 7 (classes) +>2 byte 8 (statistics) +>2 byte 10 (ascii text) +>2 byte 15 (image segments) +>2 byte 100 (image set) +>2 byte 101 (unsigned char vector) +>2 byte 102 (short integer vector) +>2 byte 103 (float 32 vector) +>2 byte 104 (float 64 vector) +>2 byte 105 (signed char vector) +>2 byte 106 (bit plane vector) +>2 byte 121 (feature vector) +>2 byte 122 (feature vector library) +>2 byte 124 (chain code) +>2 byte 126 (bit vector) +>2 byte 130 (graph) +>2 byte 131 (adjacency graph) +>2 byte 132 (adjacency graph library) +>2 string .VISIX (ascii text) + +#------------------------------------------------------------------------------ +# vms: file(1) magic for VMS executables (experimental) +# +# VMS .exe formats, both VAX and AXP (Greg Roelofs, newt@uchicago.edu) + +# GRR 950122: I'm just guessing on these, based on inspection of the headers +# of three executables each for Alpha and VAX architectures. The VAX files +# all had headers similar to this: +# +# 00000 b0 00 30 00 44 00 60 00 00 00 00 00 30 32 30 35 ..0.D.`.....0205 +# 00010 01 01 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 ................ +# +0 string \xb0\0\x30\0 VMS VAX executable +>44032 string PK\003\004 \b, Info-ZIP SFX archive v5.12 w/decryption +# +# The AXP files all looked like this, except that the byte at offset 0x22 +# was 06 in some of them and 07 in others: +# +# 00000 03 00 00 00 00 00 00 00 ec 02 00 00 10 01 00 00 ................ +# 00010 68 00 00 00 98 00 00 00 b8 00 00 00 00 00 00 00 h............... +# 00020 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +# 00030 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 ................ +# 00040 00 00 00 00 ff ff ff ff ff ff ff ff 02 00 00 00 ................ +# +0 belong 0x03000000 VMS Alpha executable +>75264 string PK\003\004 \b, Info-ZIP SFX archive v5.12 w/decryption + +# ----------------------------------------------------------- +# VMware specific files (deducted from version 1.1 and log file entries) +# Anthon van der Neut (anthon@mnt.org) +0 belong 0x4d52564e VMware nvram + +#------------------------------------------------------------------------------ +# vorbis: file(1) magic for Ogg/Vorbis files +# +# From Felix von Leitner +# Extended by Beni Cherniavsky +# Further extended by Greg Wooledge +# +# Most (everything but the number of channels and bitrate) is commented +# out with `##' as it's not interesting to the average user. The most +# probable things advanced users would want to uncomment are probably +# the number of comments and the encoder version. +# +# --- Ogg Framing --- +0 string OggS Ogg data +>4 byte !0 UNKNOWN REVISION %u +##>4 byte 0 revision 0 +>4 byte 0 +##>>14 lelong x (Serial %lX) +# non-Vorbis content: FLAC (Free Lossless Audio Codec, http://flac.sourceforge.net) +>>28 string fLaC \b, FLAC audio +# non-Vorbis content: Theora +>>28 string \x80theora \b, Theora video +# non-Vorbis content: Speex +>>28 string Speex\ \ \ \b, Speex audio +# non-Vorbis content: OGM +>>28 string \x01video\0\0\0 \b, OGM video +>>>37 string/c div3 (DivX 3) +>>>37 string/c divx (DivX 4) +>>>37 string/c dx50 (DivX 5) +>>>37 string/c xvid (XviD) +# --- First vorbis packet - general header --- +>>28 string \x01vorbis \b, Vorbis audio, +>>>35 lelong !0 UNKNOWN VERSION %lu, +##>>>35 lelong 0 version 0, +>>>35 lelong 0 +>>>>39 ubyte 1 mono, +>>>>39 ubyte 2 stereo, +>>>>39 ubyte >2 %u channels, +>>>>40 lelong x %lu Hz +# Minimal, nominal and maximal bitrates specified when encoding +>>>>48 string <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff \b, +# The above tests if at least one of these is specified: +>>>>>52 lelong !-1 +# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields +# instead of -1. +# Vorbis 1.0 uses 0 instead of -1. +>>>>>>52 lelong !0 +>>>>>>>52 lelong !-1000 +>>>>>>>>52 lelong x <%lu +>>>>>48 lelong !-1 +>>>>>>48 lelong x ~%lu +>>>>>44 lelong !-1 +>>>>>>44 lelong !-1000 +>>>>>>>44 lelong !0 +>>>>>>>>44 lelong x >%lu +>>>>>48 string <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff bps +# -- Second vorbis header packet - the comments +# A kludge to read the vendor string. It's a counted string, not a +# zero-terminated one, so file(1) can't read it in a generic way. +# libVorbis is the only one existing currently, so I detect specifically +# it. The interesting value is the cvs date (8 digits decimal). +# Post-RC1 Ogg files have the second header packet (and thus the version) +# in a different place, so we must use an indirect offset. +>>>(84.b+85) string \x03vorbis +>>>>(84.b+96) string/c Xiphophorus\ libVorbis\ I \b, created by: Xiphophorus libVorbis I +>>>>>(84.b+120) string >00000000 +# Map to beta version numbers: +>>>>>>(84.b+120) string <20000508 (>>>>>(84.b+120) string 20000508 (1.0 beta 1 or beta 2) +>>>>>>(84.b+120) string >20000508 +>>>>>>>(84.b+120) string <20001031 (beta2-3) +>>>>>>(84.b+120) string 20001031 (1.0 beta 3) +>>>>>>(84.b+120) string >20001031 +>>>>>>>(84.b+120) string <20010225 (beta3-4) +>>>>>>(84.b+120) string 20010225 (1.0 beta 4) +>>>>>>(84.b+120) string >20010225 +>>>>>>>(84.b+120) string <20010615 (beta4-RC1) +>>>>>>(84.b+120) string 20010615 (1.0 RC1) +>>>>>>(84.b+120) string 20010813 (1.0 RC2) +>>>>>>(84.b+120) string 20010816 (RC2 - Garf tuned v1) +>>>>>>(84.b+120) string 20011014 (RC2 - Garf tuned v2) +>>>>>>(84.b+120) string 20011217 (1.0 RC3) +>>>>>>(84.b+120) string 20011231 (1.0 RC3) +# Some pre-1.0 CVS snapshots still had "Xiphphorus"... +>>>>>>(84.b+120) string >20011231 (pre-1.0 CVS) +# For the 1.0 release, Xiphophorus is replaced by Xiph.Org +>>>>(84.b+96) string/c Xiph.Org\ libVorbis\ I \b, created by: Xiph.Org libVorbis I +>>>>>(84.b+117) string >00000000 +>>>>>>(84.b+117) string <20020717 (pre-1.0 CVS) +>>>>>>(84.b+117) string 20020717 (1.0) +>>>>>>(84.b+117) string 20030909 (1.0.1) +>>>>>>(84.b+117) string 20040629 (1.1.0 RC1) + +#------------------------------------------------------------------------------ +# VXL: file(1) magic for VXL binary IO data files +# +# from Ian Scott +# +# VXL is a collection of C++ libraries for Computer Vision. +# See the vsl chapter in the VXL Book for more info +# http://www.isbe.man.ac.uk/public_vxl_doc/books/vxl/book.html +# http:/vxl.sf.net + +2 lelong 0x472b2c4e VXL data file, +>0 leshort >0 schema version no %d + +#------------------------------------------------------------------------------ +# wordprocessors: file(1) magic fo word processors. +# +####### PWP file format used on Smith Corona Personal Word Processors: +2 string \040\040\040\040\040\040\040\040\040\040\040ML4D\040'92 Smith Corona PWP +>24 byte 2 \b, single spaced +>24 byte 3 \b, 1.5 spaced +>24 byte 4 \b, double spaced +>25 byte 0x42 \b, letter +>25 byte 0x54 \b, legal +>26 byte 0x46 \b, A4 + +#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE +0 string \377WPC\020\000\000\000\022\012\001\001\000\000\000\000 (WP) loadable text +>15 byte 0 Optimized for Intel +>15 byte 1 Optimized for Non-Intel +1 string WPC (Corel/WP) +>8 short 257 WordPerfect macro +>8 short 258 WordPerfect help file +>8 short 259 WordPerfect keyboard file +>8 short 266 WordPerfect document +>8 short 267 WordPerfect dictionary +>8 short 268 WordPerfect thesaurus +>8 short 269 WordPerfect block +>8 short 270 WordPerfect rectangular block +>8 short 271 WordPerfect column block +>8 short 272 WordPerfect printer data +>8 short 275 WordPerfect printer data +>8 short 276 WordPerfect driver resource data +>8 short 279 WordPerfect hyphenation code +>8 short 280 WordPerfect hyphenation data +>8 short 281 WordPerfect macro resource data +>8 short 283 WordPerfect hyphenation lex +>8 short 285 WordPerfect wordlist +>8 short 286 WordPerfect equation resource data +>8 short 289 WordPerfect spell rules +>8 short 290 WordPerfect dictionary rules +>8 short 295 WordPerfect spell rules (Microlytics) +>8 short 299 WordPerfect settings file +>8 short 301 WordPerfect 4.2 document +>8 short 325 WordPerfect dialog file +>8 short 332 WordPerfect button bar +>8 short 513 Shell macro +>8 short 522 Shell definition +>8 short 769 Notebook macro +>8 short 770 Notebook help file +>8 short 771 Notebook keyboard file +>8 short 778 Notebook definition +>8 short 1026 Calculator help file +>8 short 1538 Calendar help file +>8 short 1546 Calendar data file +>8 short 1793 Editor macro +>8 short 1794 Editor help file +>8 short 1795 Editor keyboard file +>8 short 1817 Editor macro resource file +>8 short 2049 Macro editor macro +>8 short 2050 Macro editor help file +>8 short 2051 Macro editor keyboard file +>8 short 2305 PlanPerfect macro +>8 short 2306 PlanPerfect help file +>8 short 2307 PlanPerfect keyboard file +>8 short 2314 PlanPerfect worksheet +>8 short 2319 PlanPerfect printer definition +>8 short 2322 PlanPerfect graphic definition +>8 short 2323 PlanPerfect data +>8 short 2324 PlanPerfect temporary printer +>8 short 2329 PlanPerfect macro resource data +>8 byte 11 Mail +>8 short 2818 help file +>8 short 2821 distribution list +>8 short 2826 out box +>8 short 2827 in box +>8 short 2836 users archived mailbox +>8 short 2837 archived message database +>8 short 2838 archived attachments +>8 short 3083 Printer temporary file +>8 short 3330 Scheduler help file +>8 short 3338 Scheduler in file +>8 short 3339 Scheduler out file +>8 short 3594 GroupWise settings file +>8 short 3601 GroupWise directory services +>8 short 3627 GroupWise settings file +>8 short 4362 Terminal resource data +>8 short 4363 Terminal resource data +>8 short 4395 Terminal resource data +>8 short 4619 GUI loadable text +>8 short 4620 graphics resource data +>8 short 4621 printer settings file +>8 short 4622 port definition file +>8 short 4623 print queue parameters +>8 short 4624 compressed file +>8 short 5130 Network service msg file +>8 short 5131 Network service msg file +>8 short 5132 Async gateway login msg +>8 short 5134 GroupWise message file +>8 short 7956 GroupWise admin domain database +>8 short 7957 GroupWise admin host database +>8 short 7959 GroupWise admin remote host database +>8 short 7960 GroupWise admin ADS deferment data file +>8 short 8458 IntelliTAG (SGML) compiled DTD +>8 long 18219264 WordPerfect graphic image (1.0) +>8 long 18219520 WordPerfect graphic image (2.0) +#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE + +# Hangul (Korean) Word Processor File +0 string HWP\ Document\ File Hangul (Korean) Word Processor File 3.0 +# From: Won-Kyu Park +512 string R\0o\0o\0t\0 Hangul (Korean) Word Processor File 2000 + +# CosmicBook, from Benoīt Rouits +0 string CSBK Ted Neslson's CosmicBook hypertext file + +2 string EYWR AmigaWriter file + +# chi: file(1) magic for ChiWriter files +0 string \\1cw\ ChiWriter file +>5 string >\0 version %s +0 string \\1cw ChiWriter file + +# Quark Express from http://www.garykessler.net/library/file_sigs.html +2 string IIXPR3 Intel Quark Express Document (English) +2 string IIXPRa Intel Quark Express Document (Korean) +2 string MMXPR3 Motorola Quark Express Document (English) +2 string MMXPRa Motorola Quark Express Document (Korean) + +# adobe indesign (document, whatever...) from querkan +0 belong 0x0606edf5 Adobe InDesign +>16 string DOCUMENT Document + +# From: Michael Piefel +# sqtroff intermediate language (replacement for ditroff int. lang.) +0 string X\ 495 SoftQuad troff Context intermediate for AT&T 495 laser printer +0 string X\ hp SoftQuad troff Context intermediate for HP LaserJet +0 string X\ impr SoftQuad troff Context intermediate for IMAGEN imPRESS +0 string X\ ps SoftQuad troff Context intermediate for PostScript + +#------------------------------------------------------------------------------ +# file(1) magic(5) data for xdelta Josh MacDonald +# +0 string %XDELTA% XDelta binary patch file 0.14 +0 string %XDZ000% XDelta binary patch file 0.18 +0 string %XDZ001% XDelta binary patch file 0.20 +0 string %XDZ002% XDelta binary patch file 1.0 +0 string %XDZ003% XDelta binary patch file 1.0.4 +0 string %XDZ004% XDelta binary patch file 1.1 + +#------------------------------------------------------------------------------ +# xenix: file(1) magic for Microsoft Xenix +# +# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small +# model" lifted from "magic.xenix", with comment "derived empirically; +# treat as folklore until proven" +# +# "small model", "large model", "huge model" stuff lifted from XXX +# +# XXX - "x.out" collides with PDP-11 archives +# +0 string core core file (Xenix) +0 byte 0x80 8086 relocatable (Microsoft) +0 leshort 0xff65 x.out +>2 string __.SYMDEF randomized +>0 byte x archive +0 leshort 0x206 Microsoft a.out +>8 leshort 1 Middle model +>0x1e leshort &0x10 overlay +>0x1e leshort &0x2 separate +>0x1e leshort &0x4 pure +>0x1e leshort &0x800 segmented +>0x1e leshort &0x400 standalone +>0x1e leshort &0x8 fixed-stack +>0x1c byte &0x80 byte-swapped +>0x1c byte &0x40 word-swapped +>0x10 lelong >0 not-stripped +>0x1e leshort ^0xc000 pre-SysV +>0x1e leshort &0x4000 V2.3 +>0x1e leshort &0x8000 V3.0 +>0x1c byte &0x4 86 +>0x1c byte &0xb 186 +>0x1c byte &0x9 286 +>0x1c byte &0xa 386 +>0x1f byte <0x040 small model +>0x1f byte =0x048 large model +>0x1f byte =0x049 huge model +>0x1e leshort &0x1 executable +>0x1e leshort ^0x1 object file +>0x1e leshort &0x40 Large Text +>0x1e leshort &0x20 Large Data +>0x1e leshort &0x120 Huge Objects Enabled +>0x10 lelong >0 not stripped + +0 leshort 0x140 old Microsoft 8086 x.out +>0x3 byte &0x4 separate +>0x3 byte &0x2 pure +>0 byte &0x1 executable +>0 byte ^0x1 relocatable +>0x14 lelong >0 not stripped + +0 lelong 0x206 b.out +>0x1e leshort &0x10 overlay +>0x1e leshort &0x2 separate +>0x1e leshort &0x4 pure +>0x1e leshort &0x800 segmented +>0x1e leshort &0x400 standalone +>0x1e leshort &0x1 executable +>0x1e leshort ^0x1 object file +>0x1e leshort &0x4000 V2.3 +>0x1e leshort &0x8000 V3.0 +>0x1c byte &0x4 86 +>0x1c byte &0xb 186 +>0x1c byte &0x9 286 +>0x1c byte &0x29 286 +>0x1c byte &0xa 386 +>0x1e leshort &0x4 Large Text +>0x1e leshort &0x2 Large Data +>0x1e leshort &0x102 Huge Objects Enabled + +0 leshort 0x580 XENIX 8086 relocatable or 80286 small model + +#------------------------------------------------------------------------------ +# xo65 object files +# From: "Ullrich von Bassewitz" +# +0 string \x55\x7A\x6E\x61 xo65 object, +>4 leshort x version %d, +>6 leshort&0x0001 =0x0001 with debug info +>6 leshort&0x0001 =0x0000 no debug info + +# xo65 library files +0 string \x6E\x61\x55\x7A xo65 library, +>4 leshort x version %d + +# o65 object files +0 string \x01\x00\x6F\x36\x35 o65 +>6 leshort&0x1000 =0x0000 executable, +>6 leshort&0x1000 =0x1000 object, +>5 byte x version %d, +>6 leshort&0x8000 =0x8000 65816, +>6 leshort&0x8000 =0x0000 6502, +>6 leshort&0x2000 =0x2000 32 bit, +>6 leshort&0x2000 =0x0000 16 bit, +>6 leshort&0x4000 =0x4000 page reloc, +>6 leshort&0x4000 =0x0000 byte reloc, +>6 leshort&0x0003 =0x0000 alignment 1 +>6 leshort&0x0003 =0x0001 alignment 2 +>6 leshort&0x0003 =0x0002 alignment 4 +>6 leshort&0x0003 =0x0003 alignment 256 + +#------------------------------------------------------------------------------ +# xwindows: file(1) magic for various X/Window system file formats. + +# Compiled X Keymap +# XKM (compiled X keymap) files (including version and byte ordering) +1 string mkx Compiled XKB Keymap: lsb, +>0 byte >0 version %d +>0 byte =0 obsolete +0 string xkm Compiled XKB Keymap: msb, +>3 byte >0 version %d +>0 byte =0 obsolete + +# xfsdump archive +0 string xFSdump0 xfsdump archive +>8 belong x (version %d) + +# Jaleo XFS files +0 long 395726 Jaleo XFS file +>4 long x - version %ld +>8 long x - [%ld - +>20 long x %ldx +>24 long x %ldx +>28 long 1008 YUV422] +>28 long 1000 RGB24] + +#------------------------------------------------------------------------------ +# zilog: file(1) magic for Zilog Z8000. +# +# Was it big-endian or little-endian? My Product Specification doesn't +# say. +# +0 long 0xe807 object file (z8000 a.out) +0 long 0xe808 pure object file (z8000 a.out) +0 long 0xe809 separate object file (z8000 a.out) +0 long 0xe805 overlay object file (z8000 a.out) + +#------------------------------------------------------------------------------ +# zyxel: file(1) magic for ZyXEL modems +# +# From +# These are the /etc/magic entries to decode datafiles as used for the +# ZyXEL U-1496E DATA/FAX/VOICE modems. (This header conforms to a +# ZyXEL-defined standard) + +0 string ZyXEL\002 ZyXEL voice data +>10 byte 0 - CELP encoding +>10 byte&0x0B 1 - ADPCM2 encoding +>10 byte&0x0B 2 - ADPCM3 encoding +>10 byte&0x0B 3 - ADPCM4 encoding +>10 byte&0x0B 8 - New ADPCM3 encoding +>10 byte&0x04 4 with resync diff --git a/config/siteMap.inc b/config/siteMap.inc new file mode 100644 index 0000000..7c395df --- /dev/null +++ b/config/siteMap.inc @@ -0,0 +1,83 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +require_once(KT_LIB_DIR . '/session/SiteMap.inc'); +$default->siteMap = new SiteMap(false); + +// action, page, section, group with access, link text + +// general pages +$default->siteMap->addPage('login', '/login.php', 'General', None, ''); + +// dashboard +$default->siteMap->addPage('dashboard', '/dashboard.php', 'General', Guest, 'dashboard'); + +// old dashboard +$default->siteMap->addPage('olddashboard', '/olddashboard.php', 'General', Guest, 'olddashboard'); +// dashboard news + +//pages for manage documents section +$default->siteMap->addPage('browse', '/browse.php', 'Manage Documents', Guest, _kt('browse documents')); +$default->siteMap->addPage('viewDocument', '/view.php', 'Manage Documents', Guest, _kt('View Document'), false); +$default->siteMap->addPage('editDocument', '/edit.php', 'Manage Documents', Guest, _kt('Edit Document'), false); + +// pages for administration section +$default->siteMap->addDefaultPage('administration', '/admin.php', 'Administration', UnitAdmin, _kt('Administration')); + +// pages for advanced search section +$default->siteMap->addDefaultPage('advancedSearch', '/search/advancedSearchBL.php', 'Advanced Search', Guest, _kt('Advanced Search'), true); +$default->siteMap->addPage('booleanSearch', '/search/booleanSearch.php', 'Boolean Search', Guest, _kt('Boolean Search'), false); + +$default->siteMap->addSectionColour('Advanced Search', 'th', 'A1571B'); +$default->siteMap->addSectionColour('Standard Search', 'th', 'A1571B'); + +// pages for prefs section +$default->siteMap->addDefaultPage('preferences', '/preferences.php', 'Preferences', User, _kt('Preferences')); + +// pages for about section +$default->siteMap->addDefaultPage('aboutkt', '/about.php', 'About', Guest, _kt('About')); + +// pages for Help section +$default->siteMap->addDefaultPage('help', '/presentation/lookAndFeel/knowledgeTree/help.php', 'Help', Guest, _kt('Help')); + +// pages for logout section section +$default->siteMap->addDefaultPage('logout', '/presentation/logout.php', 'Logout', Guest, _kt('Logout')); + +?> diff --git a/config/stopwords.txt b/config/stopwords.txt new file mode 100644 index 0000000..92c520c --- /dev/null +++ b/config/stopwords.txt @@ -0,0 +1,544 @@ +a's +able +about +above +according +accordingly +across +actually +after +afterwards +again +against +ain't +all +allow +allows +almost +alone +along +already +also +although +always +am +among +amongst +an +and +another +any +anybody +anyhow +anyone +anything +anyway +anyways +anywhere +apart +appear +appreciate +appropriate +are +aren't +around +as +aside +ask +asking +associated +at +available +away +awfully +be +became +because +become +becomes +becoming +been +before +beforehand +behind +being +believe +below +beside +besides +best +better +between +beyond +both +brief +but +by +c'mon +c's +came +can +can't +cannot +cant +cause +causes +certain +certainly +changes +clearly +co +com +come +comes +concerning +consequently +consider +considering +contain +containing +contains +corresponding +could +couldn't +course +currently +definitely +described +despite +did +didn't +different +do +does +doesn't +doing +don't +done +down +downwards +during +each +edu +eg +eight +either +else +elsewhere +enough +entirely +especially +et +etc +even +ever +every +everybody +everyone +everything +everywhere +ex +exactly +example +except +far +few +fifth +first +five +followed +following +follows +for +former +formerly +forth +four +from +further +furthermore +get +gets +getting +given +gives +go +goes +going +gone +got +gotten +greetings +had +hadn't +happens +hardly +has +hasn't +have +haven't +having +he +he's +hello +help +hence +her +here +here's +hereafter +hereby +herein +hereupon +hers +herself +hi +him +himself +his +hither +hopefully +how +howbeit +however +i'd +i'll +i'm +i've +ie +if +ignored +immediate +in +inasmuch +inc +indeed +indicate +indicated +indicates +inner +insofar +instead +into +inward +is +isn't +it +it'd +it'll +it's +its +itself +just +keep +keeps +kept +know +knows +known +last +lately +later +latter +latterly +least +less +lest +let +let's +like +liked +likely +little +look +looking +looks +ltd +mainly +many +may +maybe +me +mean +meanwhile +merely +might +more +moreover +most +mostly +much +must +my +myself +name +namely +nd +near +nearly +necessary +need +needs +neither +never +nevertheless +new +next +nine +no +nobody +non +none +noone +nor +normally +not +nothing +novel +now +nowhere +obviously +of +off +often +oh +ok +okay +old +on +once +one +ones +only +onto +or +other +others +otherwise +ought +our +ours +ourselves +out +outside +over +overall +own +particular +particularly +per +perhaps +placed +please +plus +possible +presumably +probably +provides +que +quite +qv +rather +rd +re +really +reasonably +regarding +regardless +regards +relatively +respectively +right +said +same +saw +say +saying +says +second +secondly +see +seeing +seem +seemed +seeming +seems +seen +self +selves +sensible +sent +serious +seriously +seven +several +shall +she +should +shouldn't +since +six +so +some +somebody +somehow +someone +something +sometime +sometimes +somewhat +somewhere +soon +sorry +specified +specify +specifying +still +sub +such +sup +sure +t's +take +taken +tell +tends +th +than +thank +thanks +thanx +that +that's +thats +the +their +theirs +them +themselves +then +thence +there +there's +thereafter +thereby +therefore +therein +theres +thereupon +these +they +they'd +they'll +they're +they've +think +third +this +thorough +thoroughly +those +though +three +through +throughout +thru +thus +to +together +too +took +toward +towards +tried +tries +truly +try +trying +twice +two +un +under +unfortunately +unless +unlikely +until +unto +up +upon +us +use +used +useful +uses +using +usually +value +various +very +via +viz +vs +want +wants +was +wasn't +way +we +we'd +we'll +we're +we've +welcome +well +went +were +weren't +what +what's +whatever +when +whence +whenever +where +where's +whereafter +whereas +whereby +wherein +whereupon +wherever +whether +which +while +whither +who +who's +whoever +whole +whom +whose +why +will +willing +wish +with +within +without +won't +wonder +would +would +wouldn't +yes +yet +you +you'd +you'll +you're +you've +your +yours +yourself +yourselves +zero diff --git a/config/tableMappings.inc b/config/tableMappings.inc new file mode 100644 index 0000000..0a78d93 --- /dev/null +++ b/config/tableMappings.inc @@ -0,0 +1,171 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +// Table mappings +// session information +$default->sessions_table = 'active_sessions'; +//data types table +$default->data_types_table ='data_types'; +// document type fields +$default->document_fields_table = 'document_fields'; +$default->fieldsets_table = 'fieldsets'; +// links document +$default->document_fields_link_table = 'document_fields_link'; +// document subscriptions +$default->document_subscriptions_table = 'document_subscriptions'; +// document transaction types +$default->transaction_types_table = 'document_transaction_types_lookup'; +// document transactions +$default->document_transactions_table = 'document_transactions'; +// links document types to document type fields +$default->document_type_fields_table = 'document_type_fields_link'; +// links document types to document type fields +$default->document_type_fieldsets_table = 'document_type_fieldsets_link'; +// document type information +$default->document_types_table = 'document_types_lookup'; +// stores documents +$default->documents_table = 'documents'; +//link folders to doc types +$default->folder_doctypes_table = 'folder_doctypes_link'; +// stores folder subscriptions +$default->folder_subscriptions_table = 'folder_subscriptions'; +// stores folders +$default->folders_table = 'folders'; +// stores group information +$default->groups_table = 'groups_lookup'; +// links groups to units +$default->groups_units_table = 'groups_units_link'; +// links -- DEPRECATED +//$default->quicklinks_table = 'links'; +// Table with metadata +$default->metadata_table = 'metadata_lookup'; +// Table with mime info +$default->mimetypes_table = 'mime_types'; +// dashboard news table +$default->news_table = 'news'; +// organisation information +$default->organisations_table = 'organisations_lookup'; +// stores role information (name and access) +$default->roles_table = 'roles'; +// sitemap access classes +$default->site_access_table = 'site_access_lookup'; +// sitemap sections +$default->site_sections_table = 'site_sections_lookup'; +// sitemap definition +$default->sitemap_table = 'sitemap'; +// stores default system settings +$default->system_settings_table = 'system_settings'; +// Table with discussion threads +$default->discussion_threads_table = 'discussion_threads'; +// Table with discussion comments +$default->discussion_comments_table = 'discussion_comments'; +// Table with unit information +$default->units_table = 'units_lookup'; +// Table with unit organisation link tables +$default->units_organisations_table = 'units_organisations_link'; +// Table with user info +$default->users_table = 'users'; +// links groups to users +$default->users_groups_table = 'users_groups_link'; +// Table with web documents info for web publishing +$default->web_documents_table = 'web_documents'; +// Table with web documents info for web publishing +$default->web_documents_status_table = 'web_documents_status_lookup'; +// stores websites for web publishing +$default->web_sites_table = 'web_sites'; +//stores help text +$default->help_table = 'help'; +$default->document_text_table = 'document_text'; +$default->document_link_table = 'document_link'; +// archive settings +$default->document_archiving_table = 'document_archiving_link'; +$default->archiving_type_lookup_table = 'archiving_type_lookup'; +$default->archiving_settings_table = 'archiving_settings'; +$default->time_period_table = 'time_period'; +$default->time_unit_lookup_table = 'time_unit_lookup'; +$default->archive_restoration_table = 'archive_restoration_request'; +$default->status_table = 'status_lookup'; +$default->search_permissions_table = 'search_document_user_link'; +$default->document_link_types_table = 'document_link_types'; +$default->upgrades_table = 'upgrades'; +$default->help_replacement_table = 'help_replacement'; +$default->permissions_table = 'permissions'; +$default->permission_objects_table = 'permission_objects'; +$default->permission_descriptors_table = 'permission_descriptors'; +$default->permission_assignments_table = 'permission_assignments'; +$default->permission_descriptor_groups_table = 'permission_descriptor_groups'; +$default->permission_descriptor_roles_table = 'permission_descriptor_roles'; +$default->permission_descriptor_users_table = 'permission_descriptor_users'; +$default->permission_lookups_table = 'permission_lookups'; +$default->permission_lookup_assignments_table = 'permission_lookup_assignments'; +$default->groups_groups_table = 'groups_groups_link'; +$default->metadata_treenode_table = 'metadata_lookup_tree'; +$default->metadata_condition_table = 'metadata_lookup_condition'; +$default->md_condition_table = 'metadata_lookup_condition'; +$default->md_condition_chain_table = 'metadata_lookup_condition_chain'; +$default->field_orders_table = 'field_orders'; +$default->workflows_table = 'workflows'; +$default->workflow_states_table = 'workflow_states'; +$default->workflow_transitions_table = 'workflow_transitions'; +$default->workflow_state_transitions_table = 'workflow_state_transitions'; +$default->workflow_documents_table = 'workflow_documents'; +$default->workflow_actions_table = 'workflow_actions'; +$default->workflow_state_actions_table = 'workflow_state_actions'; +$default->field_value_instances_table = 'field_value_instances'; +$default->field_behaviours_table = 'field_behaviours'; +$default->field_behaviour_options_table = 'field_behaviour_options'; +$default->document_transaction_text_table = 'document_transaction_text'; +$default->document_searchable_text_table = 'document_searchable_text'; +$default->saved_searches_table = 'saved_searches'; +$default->permission_dynamic_conditions_table = 'permission_dynamic_conditions'; +$default->permission_dynamic_assignments_table = 'permission_dynamic_assignments'; +$default->notifications_table = 'notifications'; +$default->authentication_sources_table = 'authentication_sources'; +$default->dashlet_disable_table = 'dashlet_disables'; +$default->role_allocations_table = 'role_allocations'; +$default->document_role_allocations_table = 'document_role_allocations'; +$default->plugins_table = 'plugins'; +$default->document_metadata_version_table = 'document_metadata_version'; +$default->document_content_version_table = 'document_content_version'; +$default->trigger_selection_table = 'trigger_selection'; +$default->type_workflow_map_table = 'type_workflow_map'; +$default->folder_workflow_map_table = 'folder_workflow_map'; +$default->workflow_state_permission_assignments_table = 'workflow_state_permission_assignments'; +?> diff --git a/config/test.ini b/config/test.ini new file mode 100644 index 0000000..7698842 --- /dev/null +++ b/config/test.ini @@ -0,0 +1,10 @@ +[db] +; The Database Engine to use. Currently mysql is the only +; supported type. +dbType = mysql + +dbHost = localhost +dbName = dms-test +dbUser = dmsadmin +dbPass = js9281djw +dbPort = default diff --git a/control.php b/control.php new file mode 100644 index 0000000..9355453 --- /dev/null +++ b/control.php @@ -0,0 +1,167 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +// check if system has been installed +require_once("setup/wizard/installUtil.php"); +// Check if system has been installed +$iu = new InstallUtil(); +if(!$iu->isSystemInstalled()) { + $iu->redirect("setup/wizard"); + exit(0); +} + +// main library routines and defaults +require_once('config/dmsDefaults.php'); + +/** + * Controller page -- controls the web application by responding to a set of + * defined actions. The controller performs session handling, page-level + * authentication and forwards the request to the appropriate handling + * page. + */ + +// ------------------------------- +// page start +// ------------------------------- + +$action = $_REQUEST['action']; + +if ($action != 'login') { + + // check the session, but don't redirect if the check fails + $ret = checkSessionAndRedirect(false); + if ($ret === true) { + //get around the problem with search + if (strcmp($_REQUEST['fForStandardSearch'], 'yes') == 0) { + $action = 'standardSearch'; + } else if (!isset($action)) { + // session check succeeds, so default action should be the dashboard if no action was specified + $action = 'dashboard'; + } + } else { + // session check fails, so default action should be the login form if no action was specified + $oKTConfig = KTConfig::getSingleton(); + $dest = 'login'; + if ($oKTConfig->get('allowAnonymousLogin', false)) { $dest = 'dashboard'; } + + if (!isset($action)) { + $action = $dest; + } elseif ($action <> $dest) { + // we have a controller link and auth has failed, so redirect to the login page + // with the controller link as the redirect + $url = generateControllerUrl('login'); + $redirect = urlencode($_SERVER[PHP_SELF] . '?' . $_SERVER['QUERY_STRING']); + if ((strlen($redirect) > 1)) { + $url = $url . '&redirect=' . $redirect; + } + if (PEAR::isError($ret)) { + $url = $url . '&errorMessage=' . urlencode($ret->getMessage()); + session_start(); + $_SESSION['errormessage']['login'] = $ret->getMessage(); + } + redirect($url); + exit(0); + } + } +} + +// we appear to have some encoding/decoding issues, so we need to force-check for %30 type situations +$queryString = KTUtil::arrayGet($_REQUEST, 'qs', ''); +if (is_array($queryString)) { + $aStrings = array(); + foreach ($queryString as $k => $v) { + $aStrings[] = $k . '=' . $v; + } + $queryString = join('&', $aStrings); +} elseif (count(preg_match('#\%#', $queryString) != 0)) { + $queryString = urldecode($queryString); +} + +if (empty($queryString)) { + // need to strip query string params from action before attempting to retrieve from sitemap + $queryString = ''; + // check for the presence of additional params + if (strstr($_SERVER['QUERY_STRING'], '&')) { + // strip and save the querystring + $queryString = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], '&')+1, strlen($_SERVER['QUERY_STRING'])); + } else if (strstr($_SERVER['QUERY_STRING'], '?')) { + // strip and save the querystring + $queryString = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], '?')+1, strlen($_SERVER['QUERY_STRING'])); + // update + $action = substr($_SERVER['QUERY_STRING'], 0, strpos($_SERVER['QUERY_STRING'], '?')); + } +} + +if ($action == 'dashboard') { + $oKTConfig = KTConfig::getSingleton(); + if(!$oKTConfig->get('useNewDashboard')) $action = 'olddashboard'; +} + +// retrieve the page from the sitemap (checks whether this user has access to the requested page) +$page = $default->siteMap->getPage($action, isset($_SESSION['userID']) ? $_SESSION['userID'] : ''); + +if (!$page) { + // this user doesn't have permission to access the page + // or there is no page mapping for the requested action + // redirect to no permission page + $default->log->error("control.php getPage failed for ($action, " . $_SESSION['userID'] . ")"); + redirect("$default->uiUrl/noAccess.php"); +} else { + $page = $default->rootUrl . $page; + // set authorised flag and redirect + // strip querystring from the page returned from the sitemap + // before setting page authorisation flag (since checkSession checks page level + // access by checking $_SESSION["pageAccess"][$_SERVER["PHP_SELF"] ie. without querystring(?) + + $paramStart=strpos($page, '?'); + if ($paramStart !== false) { + $accessPage = substr($page, 0, $paramStart); + } else { + $accessPage = $page; + } + $_SESSION['pageAccess'][$accessPage] = true; + // if we have a querystring add it on + if (strlen($queryString) > 0) { + $page .= ($paramStart !== false)?'&':'?'; + $page .= $queryString; + $default->log->info("control.php: about to redirect to $page"); + } + redirect($page); +} + +?> diff --git a/customerrorpage.php b/customerrorpage.php new file mode 100644 index 0000000..b8da3fc --- /dev/null +++ b/customerrorpage.php @@ -0,0 +1,86 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + */ + +session_start(); + +// Get the error message +$error = isset($_POST['fatal']) ? $_POST['fatal'] : ''; +$error = isset($_SESSION['sErrorMessage']) ? $_SESSION['sErrorMessage'] : $error; +unset($_SESSION['sErrorMessage']); +//Finding root Url +$sHost = $_SERVER['HTTP_HOST']; +$sScriptName = dirname($_SERVER['SCRIPT_NAME']); +$sRoot = $sHost.$sScriptName; +$sLastChar = substr($sScriptName, -1, 1); +$sScriptName = ($sLastChar == '\\' || $sLastChar == '/') ? substr($sScriptName, 0, -1) : $sScriptName; +$bSSLEnabled = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? true : false; +$sRootUrl = ($bSSLEnabled ? 'https://' : 'http://').$sRoot; + +$error = strip_tags($error); + +?> + + + + Knowledgetree - Desklet + + + + + +
+
+ +

An Error Has Occurred

+

You have encountered a problem with your document management system.

+

Please contact your systems administrator.

+

For more information on the error click here: +

+

+ +
+
+ + diff --git a/dashboard.php b/dashboard.php new file mode 100644 index 0000000..80e9c88 --- /dev/null +++ b/dashboard.php @@ -0,0 +1,183 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + */ + +// main library routines and defaults +require_once('config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/unitmanagement/Unit.inc'); + +require_once(KT_LIB_DIR . '/dashboard/dashletregistry.inc.php'); +require_once(KT_LIB_DIR . '/dashboard/dashlet.inc.php'); +require_once(KT_LIB_DIR . '/templating/templating.inc.php'); +require_once(KT_LIB_DIR . '/templating/kt3template.inc.php'); +require_once(KT_LIB_DIR . '/dispatcher.inc.php'); + +require_once(KT_LIB_DIR . '/dashboard/DashletDisables.inc.php'); + +$sectionName = 'dashboard'; + +class DashboardDispatcher extends KTStandardDispatcher { + + var $notifications = array(); + var $sHelpPage = 'ktcore/dashboard.html'; + + function DashboardDispatcher() { + $this->aBreadcrumbs = array( + array('action' => 'dashboard', 'name' => _kt('Dashboard')), + ); + return parent::KTStandardDispatcher(); + } + function do_main() { + $this->oPage->setShowPortlets(false); + // retrieve action items for the user. + // FIXME what is the userid? + + + $oDashletRegistry =& KTDashletRegistry::getSingleton(); + $aDashlets = $oDashletRegistry->getDashlets($this->oUser); + + $this->sSection = 'dashboard'; + $this->oPage->setBreadcrumbDetails(_kt('Home')); + $this->oPage->title = _kt('Dashboard'); + + // simplistic improvement over the standard rendering: float half left + // and half right. +Involves no JS -can leave lots of white-space at the bottom. + + $aDashletsLeft = array(); + $aDashletsRight = array(); + + $i = 0; + foreach ($aDashlets as $oDashlet) { + if(strpos(strtolower($oDashlet->sTitle), 'welcome to knowledgetree') !== false && !empty($aDashletsLeft)){ + array_unshift($aDashletsLeft, $oDashlet); + }else{ + if ($i == 0) { $aDashletsLeft[] = $oDashlet; } + else {$aDashletsRight[] = $oDashlet; } + } + $i += 1; + $i %= 2; + } + + // javascript - broken input focus + // using this code causes focus problems in the Go To Document dashlet: + // while the input can be focused, it requires clicking the text to the LEFT + // of the input, which is not expected nor obvious nor user friendly + /* + $this->oPage->requireJSResource('thirdpartyjs/extjs/adapter/yui/yui-utilities.js'); + $this->oPage->requireJSResource('resources/js/DDList.js'); + */ + + // javascript - working input focus - restoring yui fixes the focus problem + // yahoo + $this->oPage->requireJSResource('thirdpartyjs/yui/yahoo/yahoo.js'); + $this->oPage->requireJSResource('thirdpartyjs/yui/event/event.js'); + $this->oPage->requireJSResource('thirdpartyjs/yui/dom/dom.js'); + $this->oPage->requireJSResource('thirdpartyjs/yui/dragdrop/dragdrop.js'); + $this->oPage->requireJSResource('resources/js/DDList.js'); + + $this->oUser->refreshDashboadState(); + + // dashboard + $sDashboardState = $this->oUser->getDashboardState(); + $sDSJS = 'var savedState = '; + if($sDashboardState == null) { + $sDSJS .= 'false'; + $sDashboardState = false; + } else { + $sDSJS .= $sDashboardState; + } + $sDSJS .= ';'; + $this->oPage->requireJSStandalone($sDSJS); + $this->oPage->requireJSResource('resources/js/dashboard.js'); + + // render + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('kt3/dashboard'); + $aTemplateData = array( + 'context' => $this, + 'dashlets_left' => $aDashletsLeft, + 'dashlets_right' => $aDashletsRight, + ); + return $oTemplate->render($aTemplateData); + } + + // return some kind of ID for each dashlet + // currently uses the class name + function _getDashletId($oDashlet) { + return get_class($oDashlet); + } + + // disable a dashlet. + // FIXME this very slightly violates the separation of concerns, but its not that flagrant. + function do_disableDashlet() { + $sNamespace = KTUtil::arrayGet($_REQUEST, 'fNamespace'); + $iUserId = $this->oUser->getId(); + + if (empty($sNamespace)) { + $this->errorRedirectToMain('No dashlet specified.'); + exit(0); + } + + // do the "delete" + + $this->startTransaction(); + $aParams = array('sNamespace' => $sNamespace, 'iUserId' => $iUserId); + $oDD = KTDashletDisable::createFromArray($aParams); + if (PEAR::isError($oDD)) { + $this->errorRedirectToMain('Failed to disable the dashlet.'); + } + + $this->commitTransaction(); + $this->successRedirectToMain('Dashlet disabled.'); + } + + + function json_saveDashboardState() { + $sState = KTUtil::arrayGet($_REQUEST, 'state', array('error'=>true)); + $this->oUser->setDashboardState($sState); + return array('success' => true); + } +} + +$oDispatcher = new DashboardDispatcher(); +$oDispatcher->dispatch(); + +?> + diff --git a/default.htm b/default.htm new file mode 100644 index 0000000..0e77600 --- /dev/null +++ b/default.htm @@ -0,0 +1,5 @@ + + + + + diff --git a/dmsctl.bat b/dmsctl.bat new file mode 100644 index 0000000..8802d4b --- /dev/null +++ b/dmsctl.bat @@ -0,0 +1,105 @@ +@echo off + +rem KnowledgeTree Control Script + +rem ============= SET ENVIRONMENT VARIABLES ============== +set INSTALL_PATH=%~dp0 +cd .. +cd .. +set ZEND_PATH=%CD% +cd %INSTALL_PATH% +cd .. +set KTDMS_PATH=%CD% +cd %INSTALL_PATH% +set JAVA_BIN=%KTDMS_PATH%\jre\bin\java.exe +set SOFFICE_PATH=%KTDMS_PATH%\openoffice +set SOFFICE_BIN=%SOFFICE_PATH%\program\soffice.exe +set SOFFICE_PORT=8100 + +set OpenofficeServiceName=KTOpenoffice +set SchedulerServiceName=KTScheduler +set LuceneServiceName=KTLucene +set MySQLServiceName=MySQL_ZendServer51 + +rem ============= MAIN ============== +IF NOT ""%1"" == ""start"" IF NOT ""%1"" == ""path"" IF NOT ""%1"" == ""stop"" IF NOT ""%1"" == ""restart"" IF NOT ""%1"" == ""install"" IF NOT ""%1"" == ""uninstall"" goto help +goto %1 + +:help +echo USAGE: +echo. +echo dmsctl.bat ^ [servicename] +echo. +echo help - this screen +echo. +echo start - start the services +echo stop - stop the services +echo restart - restart the services +echo. +echo install - install the services +echo uninstall - uninstall the services +echo. +echo servicename - optional service name to start/stop only that service. +echo only mysql is supported for individual control at this time. +echo. + +goto end + +:start +IF ""%2"" == ""mysql"" goto start_mysql +echo Starting services +sc start %OpenofficeServiceName% +sc start %LuceneServiceName% +ping -n 7 127.0.0.1 > null +sc start %SchedulerServiceName% +goto end + +:stop +IF ""%2"" == ""mysql"" goto stop_mysql +echo Stopping services +sc stop %LuceneServiceName% +sc stop %SchedulerServiceName% +sc stop %OpenofficeServiceName% +ping -n 7 127.0.0.1 > null +IF ""%1"" == ""restart"" goto start +goto end + +:start_mysql +echo Starting MySQL Service +sc start %MySQLServiceName% +goto end + +:stop_mysql +echo Stopping MySQL Service +sc stop %MySQLServiceName% +goto end + +:restart +goto stop + +:uninstall +echo Uninstalling services +sc delete %LuceneServiceName% +sc delete %SchedulerServiceName% +sc delete %OpenofficeServiceName% +goto end + +:path +echo ZEND_PATH == %ZEND_PATH% +echo KTDMS_PATH == %KTDMS_PATH% +echo INSTALL_PATH == %INSTALL_PATH% +echo JAVA_BIN == %JAVA_BIN% +echo SOFFICE_PATH == %SOFFICE_PATH% +echo SOFFICE_BIN == %SOFFICE_BIN% +goto end + +:install +echo Installing services +IF EXIST "%INSTALL_PATH%\var\bin\officeinstall.bat" call "%INSTALL_PATH%\var\bin\officeinstall.bat" +IF EXIST "%INSTALL_PATH%\var\bin\officeinstall.bat" echo The Open Office automatic service was successfully installed. +IF EXIST "%INSTALL_PATH%\var\bin\schedulerinstall.bat" call "%INSTALL_PATH%\var\bin\schedulerinstall.bat" +IF EXIST "%INSTALL_PATH%\var\bin\schedulerinstall.bat" echo The Scheduler automatic service was successfully installed. +IF EXIST "%INSTALL_PATH%\var\bin\luceneinstall.bat" call "%INSTALL_PATH%\var\bin\luceneinstall.bat" +goto end + +:end diff --git a/dmsctl.sh b/dmsctl.sh new file mode 100644 index 0000000..b84946e --- /dev/null +++ b/dmsctl.sh @@ -0,0 +1,486 @@ +#!/bin/bash + +# Boot KnowledgeTree services +# chkconfig: 2345 55 25 +# description: KnowledgeTree Services +# +# processname: ktdms + +cd $(dirname $0) + +HOSTNAME=`hostname` +RETVAL=0 +PID="" +ERROR=0 +SERVER=all +VDISPLAY="99" +INSTALL_PATH=`pwd` +JAVABIN=/usr/bin/java +ZEND_DIR=/usr/local/zend + +# exits if the UID is not 0 [root] +check_root_privileges() +{ + ID="id -u" + MYUID=`$ID 2> /dev/null` + if [ ! -z "$MYUID" ]; then + if [ $MYUID != 0 ]; then + echo "You need root privileges to run this script!"; + exit 1 + fi + else + echo "Could not detect UID"; + exit 1 + fi +} + + +if [ -f /etc/zce.rc ];then + . /etc/zce.rc +else + echo "/etc/zce.rc doesn't exist!" + exit 1; +fi +check_root_privileges + +# OpenOffice +SOFFICEFILE=soffice +SOFFICE_PIDFILE=$INSTALL_PATH/var/log/soffice.bin.pid +SOFFICE_PID="" +SOFFICE_PORT="8100" +SOFFICEBIN=/usr/share/ktdms-office/ktdms-office/openoffice/program/soffice +SOFFICE="$SOFFICEBIN -nofirststartwizard -nologo -headless -accept=socket,host=127.0.0.1,port=$SOFFICE_PORT;urp;StarOffice.ServiceManager" +SOFFICE_STATUS="" + +# Lucene +LUCENE_PIDFILE=$INSTALL_PATH/var/log/lucene.pid +LUCENE_PID="" +LUCENE="$JAVABIN -Xms512M -Xmx512M -jar ktlucene.jar" +LUCENE_STATUS="" + +# Scheduler +SCHEDULER_PATH="$INSTALL_PATH/bin/" +SCHEDULER_PIDFILE=$INSTALL_PATH/var/log/scheduler.pid +SCHEDULER_PID="" +SCHEDULERBIN="$INSTALL_PATH/var/bin/schedulerTask.sh" +SCHEDULER="$SCHEDULERBIN" +SCHEDULER_STATUS="" + +# MySQL: modify if needed for your installation +MYSQL_PATH=/etc/init.d +MYSQLBIN=mysql +MYSQL_PIDFILE=/var/run/mysqld/mysqld.pid +MYSQL_PID="" +MYSQL_STATUS="" + +get_pid() { + PID="" + PIDFILE=$1 + # check for pidfile + if [ -f $PIDFILE ] ; then + exec 6<&0 + exec < $PIDFILE + read pid + PID=$pid + exec 0<&6 6<&- + fi +} + +get_soffice_pid() { + get_pid $SOFFICE_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + SOFFICE_PID=$PID + fi +} + +get_lucene_pid() { + get_pid $LUCENE_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + LUCENE_PID=$PID + fi +} + +get_scheduler_pid() { + get_pid $SCHEDULER_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + SCHEDULER_PID=$PID + fi +} + +get_mysql_pid() { + get_pid $MYSQL_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + MYSQL_PID=$PID + fi +} + +is_service_running() { + PID=$1 + if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null ; then + RUNNING=1 + else + RUNNING=0 + fi + return $RUNNING +} + +is_soffice_running() { + get_soffice_pid + is_service_running $SOFFICE_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + SOFFICE_STATUS="openoffice not running" + else + SOFFICE_STATUS="openoffice already running" + fi + return $RUNNING +} + +is_lucene_running() { + get_lucene_pid + is_service_running $LUCENE_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + LUCENE_STATUS="lucene not running" + else + LUCENE_STATUS="lucene already running" + fi + return $RUNNING +} + +is_scheduler_running() { + get_scheduler_pid + is_service_running $SCHEDULER_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + SCHEDULER_STATUS="scheduler not running" + else + SCHEDULER_STATUS="scheduler already running" + fi + return $RUNNING +} + +is_mysql_running() { + get_mysql_pid + is_service_running $MYSQL_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + MYSQL_STATUS="mysql not running" + else + MYSQL_STATUS="mysql already running" + fi + return $RUNNING +} + +start_soffice() { + is_soffice_running + RUNNING=$? + + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: openoffice (pid $SOFFICE_PID) already running" + else + if [ -x $SOFFICEBIN ]; then + nohup $SOFFICE &> $INSTALL_PATH/var/log/dmsctl.log & + if [ $? -eq 0 ]; then + echo "$0 $ARG: openoffice started at port $SOFFICE_PORT" + ps ax | grep $SOFFICEBIN | awk {'print $1'} > $SOFFICE_PIDFILE + sleep 2 + else + echo "$0 $ARG: openoffice could not be started" + ERROR=3 + fi + else + echo "$0 $ARG: path to openoffice binary ($SOFFICEBIN) could not be found" + ERROR=3 + fi +fi +} + +stop_soffice() { + NO_EXIT_ON_ERROR=$1 + is_soffice_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $SOFFICE_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_soffice_pid + if killall $SOFFICEFILE; then + echo "$0 $ARG: openoffice stopped" + else + echo "$0 $ARG: openoffice could not be stopped" + ERROR=4 + fi +} + +start_lucene() { + is_lucene_running + RUNNING=$? + + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: lucene (pid $LUCENE_PID) already running" + else + cd $INSTALL_PATH/bin/luceneserver + nohup $LUCENE &> $INSTALL_PATH/var/log/dmsctl.log & + if [ $? -eq 0 ]; then + echo "$0 $ARG: lucene started" + ps ax | grep ktlucene.jar | awk {'print $1'} > $LUCENE_PIDFILE + sleep 2 + else + echo "$0 $ARG: lucene could not be started" + ERROR=3 + fi + cd $INSTALL_PATH +fi +} + +stop_lucene() { + NO_EXIT_ON_ERROR=$1 + is_lucene_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $LUCENE_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_lucene_pid + cd $INSTALL_PATH/search2/indexing/bin + $ZEND_DIR/bin/php shutdown.php positive &> $INSTALL_PATH/var/log/dmsctl.log + exit=$? + sleep 5 + if [ $exit -eq 0 ]; then + echo "$0 $ARG: lucene stopped" + else + echo "$0 $ARG: lucene could not be stopped" + ERROR=4 + fi +} + +start_scheduler() { + is_scheduler_running + RUNNING=$? + + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: scheduler (pid $SCHEDULER_PID) already running" + else + cd $SCHEDULER_PATH + nohup $SCHEDULER &> $INSTALL_PATH/var/log/dmsctl.log & + if [ $? -eq 0 ]; then + echo "$0 $ARG: scheduler started" + ps ax | grep $SCHEDULERBIN | awk {'print $1'} > $SCHEDULER_PIDFILE + sleep 2 + else + echo "$0 $ARG: scheduler could not be started" + ERROR=3 + fi + fi +} + +stop_scheduler() { + NO_EXIT_ON_ERROR=$1 + is_scheduler_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $SCHEDULER_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_scheduler_pid + if kill $SCHEDULER_PID ; then + echo "$0 $ARG: scheduler stopped" + else + echo "$0 $ARG: scheduler could not be stopped" + ERROR=4 + fi +} + +start_mysql() { + is_mysql_running + RUNNING=$? + + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: mysql (pid $MYSQL_PID) already running" + else + nohup $MYSQL_PATH/$MYSQLBIN start &> $INSTALL_PATH/var/log/dmsctl.log & + if [ $? -eq 0 ]; then + echo "$0 $ARG: mysql started" + ps ax | grep $MYSQLBIN | awk {'print $1'} > $MYSQL_PIDFILE + sleep 2 + else + echo "$0 $ARG: mysql could not be started" + ERROR=3 + fi + fi +} + +stop_mysql() { + NO_EXIT_ON_ERROR=$1 + is_mysql_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $MYSQL_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_mysql_pid + if kill $MYSQL_PID ; then + echo "$0 $ARG: mysql stopped" + else + echo "$0 $ARG: mysql could not be stopped" + ERROR=4 + fi +} + +help() { + echo "usage: $0 help" + echo " $0 (start|stop|restart)" + echo " $0 (start|stop|restart) scheduler" + echo " $0 (start|stop|restart) soffice" + echo " $0 (start|stop|restart) lucene" + echo " $0 (start|stop|restart) mysql" + cat <> /etc/zce.rc + if [ -z $LD_LIBRARY_PATH ] ; then + echo "LD_LIBRARY_PATH=$ZEND_DIR/lib" >> /etc/zce.rc + else + echo "LD_LIBRARY_PATH=$ZEND_DIR/lib:$LD_LIBRARY_PATH" >> /etc/zce.rc + fi + fi + + touch $INSTALL_PATH/var/bin/dmsinit.lock + + $ZEND_DIR/bin/zendctl.sh restart +} + +[ $# -lt 1 ] && help + +if [ ! -z ${2} ]; then + [ "${2}" != "mysql" ] && [ "${2}" != "apache" ] && [ "${2}" != "agent" ] && [ "${2}" != "scheduler" ] && [ "${2}" != "soffice" ] && [ "${2}" != "lucene" ] && noserver $2 + SERVER=$2 +fi + + +if [ "x$3" != "x" ]; then + MYSQL_PASSWORD=$3 +fi + +# Are we running for first time +if [ -e "/usr/share/knowledgetree/var/bin/dmsinit.lock" ] +then +echo ""; +else + if grep --quiet LD_LIBRARAY_PATH /etc/zce.rc ; then + echo "Nothing to be done ... maybe" + else + echo "PATH=/usr/local/zend/bin:$PATH" >> /etc/zce.rc + if [ -z $LD_LIBRARY_PATH ] ; then + echo "LD_LIBRARY_PATH=$ZEND_DIR/lib" >> /etc/zce.rc + else + echo "LD_LIBRARY_PATH=$ZEND_DIR/lib:$LD_LIBRARY_PATH" >> /etc/zce.rc + fi + fi + touch $INSTALL_PATH/var/bin/dmsinit.lock + $ZEND_DIR/bin/zendctl.sh restart +fi + +#if [ "ls /usr/share/knowledgetree/var/bin/dmsinit.lock" != "" ] ; then +# echo "No lock" +#e#lse +# echo "lock" +#f#i + +#if [ -f "/usr/share/knowledgetree/var/bin/dmsinit.lock"] ; then +# firstrun +#else +# echo 'safd'; +# exit 1; +#fi + +#[[ -e $INSTALL_PATH/var/bin/dmsinit.lock ]] || firstrun + +case $1 in + help) help + ;; + start) + if [ "${SERVER}" != "all" ]; then + start_${2} + else + start_soffice + start_lucene + start_scheduler + #[[ -e $ZEND_DIR/bin/zendctl.sh ]] && $ZEND_DIR/bin/zendctl.sh restart + fi + ;; + stop) if [ "${SERVER}" != "all" ]; then + stop_${2} + else + stop_scheduler "no_exit" + stop_lucene "no_exit" + stop_soffice "no_exit" + fi + ;; + restart) if [ "${SERVER}" != "all" ]; then + stop_${2} "no_exit" + sleep 2 + start_${2} + else + stop_scheduler "no_exit" + stop_lucene "no_exit" + stop_soffice "no_exit" + start_soffice + start_lucene + start_scheduler + fi + ;; +esac + +exit $ERROR diff --git a/dmsctl.vbs b/dmsctl.vbs new file mode 100644 index 0000000..e32f011 --- /dev/null +++ b/dmsctl.vbs @@ -0,0 +1,739 @@ +' +' KnowledgeTree +' +' +' + +' Service Name Consts +Const KTOFFICE = "KTOpenoffice" +Const KTSCHEDULER = "KTScheduler" +Const KTLUCENE = "KTLucene" + +' Service Control Manager Error Code Consts +Const SVC_SUCCESS = 0 ' Success +Const SVC_NOT_SUPPORTED = 1 ' Not Supported +Const SVC_ACCESS_DENIED = 2 ' Access Denied +Const SVC_DEPENDENT_SERVICES_RUNNING = 3 ' Dependent Services Running +Const SVC_INVALID_SERVICE_CONTROL = 4 ' Invalid Service Control +Const SVC_SERVICE_CANNOT_ACCEPT_CONTROL = 5 ' Service Cannot Accept Control +Const SVC_SERVICE_NOT_ACTIVE = 6 ' Service Not Active +Const SVC_SERVICE_REQUEST_TIMEOUT = 7 ' Service Request Timeout +Const SVC_UNKNOWN_FAILURE = 8 ' Unknown Failure +Const SVC_PATH_NOT_FOUND = 9 ' Path Not Found +Const SVC_SERVICE_ALREADY_RUNNING = 10 ' Service Already Running +Const SVC_SERVICE_DATABASE_LOCKED = 11 ' Service Database Locked +Const SVC_SERVICE_DEPENDENCY_DELETED = 12 ' Service Dependency Deleted +Const SVC_SERVICE_DEPENDENCY_FAILURE = 13 ' Service Dependency Failure +Const SVC_SERVICE_DISABLED = 14 ' Service Disabled +Const SVC_SERVICE_LOGON_FAILURE = 15 ' Service Logon Failure +Const SVC_SERVICE_MARKED_FOR_DELETION = 16 ' Service Marked For Deletion +Const SVC_SERVICES_NO_THREAD = 17 ' Service No Thread +Const SVC_STATUS_CIRCULAR_DEPENDENCY = 18 ' Status Circular Dependency +Const SVC_STATUS_DUPLICATE_NAME = 19 ' Status Duplicate Name +Const SVC_INVALID_NAME = 20 ' Status Invalid Name +Const SVC_STATUS_INVALID_PARAMETER = 21 ' Status Invalid Parameter +Const SVC_INVALID_SERVICES_ACCOUNT = 22 ' Status Invalid Service Account +Const SVC_STATUS_SERVICE_EXISTS = 23 ' Status Service Exists +Const SVC_SERVICE_ALREADY_PAUSED = 24 ' Service Already Paused + +Dim strComputer, currOS, currDir, doRunAs, lastErrorCode + +' Detecting the current directory +Set oFso = CreateObject("Scripting.FileSystemObject") +currDir = oFso.GetParentFolderName(Wscript.ScriptFullName) + +strComputer = "." +currOS = "" +doRunAs = false + +' Detecting the current OS +Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") +Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem") + +For Each objOperatingSystem in colOperatingSystems + currOS = objOperatingSystem.Caption & " " & objOperatingSystem.Version + currOS = trim(currOS) +Next + +Public Function isWindowsVista() + isWindowsVista = false + If left(currOS, 19) = "Microsoft Windows Vista" Then + isWindowsVista = TRUE + End If +End Function + +Public Function isWindows7() + isWindows7 = false + If left(currOS, 19) = "Microsoft Windows 7" Then + isWindows7 = TRUE + End If +End Function + +Public Function isWindows2008() + isWindows2008 = false + If mid(currOS, 27, 42) = "2008 Enterprise" Then + isWindows2008 = TRUE + End If +End Function + +' Will call this further down when the individual services need starting +If doRunAs = TRUE Then + 'runAs "C:\Program Files (x86)\Zend\ktdms\knowledgetree", "dmsctl_install.bat" +End If + +Public Sub runAs(ByVal strFolder, ByVal strFile) + Set objShell = CreateObject("Shell.Application") + Set objFolder = objShell.Namespace(strFolder) + Set objFolderItem = objFolder.ParseName(strFile) + objFolderItem.InvokeVerb "runas" +End Sub + +dim objArgs, errMsg, result, strUsage, isSuccess + +strUsage = "USAGE:" &_ +"dmsctl.vbs [servicename]" & vbNewLine &_ +vbNewLine &_ +"help - this screen " & vbNewLine &_ +"start - start the services" & vbNewLine &_ +"stop - stop the services" & vbNewLine &_ +"restart - restart the services" & vbNewLine &_ +"install - install the services" & vbNewLine &_ +"uninstall - uninstall the services" & vbNewLine &_ +vbNewLine &_ +"servicename - optional service name to start/stop only that service." & vbNewLine &_ +" only mysql is supported for individual control at this time." + +Set objArgs = WScript.Arguments +If (objArgs.count < 1) Then + Wscript.Echo strUsage +Else + Select Case objArgs.Item(0) + Case "install" + isSuccess = TRUE ' Track if anything went wrong + + ' Installing KTOffice + result = exec(currDir & "\var\bin\officeinstall.bat") + + 'Install Failed + If result = 0 Then + isSuccess = false + writeLog "The " & KTOFFICE & " KnowledgeTree service could not be installed." + Else + writeLog "The " & KTOFFICE & " KnowledgeTree service was successfully installed." + End If + + ' Installing KTScheduler + result = exec(currDir & "\var\bin\schedulerinstall.bat") + + 'Install Failed + If result = 0 Then + isSuccess = false + writeLog "The " & KTSCHEDULER & " KnowledgeTree service could not be installed." + Else + writeLog "The " & KTSCHEDULER & " KnowledgeTree service was successfully installed." + End If + + ' Installing KTLucene + result = exec(currDir & "\var\bin\luceneinstall.bat") + + 'Install Failed + If result = 0 Then + isSuccess = false + writeLog "The " & KTLUCENE & " KnowledgeTree service could not be installed." + Else + writeLog "The " & KTLUCENE & " KnowledgeTree service was successfully installed." + End If + + If (isSuccess) Then + Wscript.Echo "The KnowledgeTree services were successfully installed" + Else + Wscript.Echo "There were errors installing the KnowledgeTree services please see the log for details ('knowledgetree/var/log/dmsctl.log')" + End If + + Case "start" + If (objArgs.count > 1) Then + Select Case objArgs.Item(1) + Case "soffice" + isSuccess = TRUE + svcName = KTOFFICE + If (NOT isServiceStarted(svcName)) Then + If (NOT startService(svcName)) Then + isSuccess = FALSE + writeLog "The " & KTOFFICE & " KnowledgeTree service could not be started. Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "The " & KTOFFICE & " KnowledgeTree service was successfully started" + End If + + writeLog "Successfully started " & KTOFFICE + Else + writeLog KTOFFICE & " already started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + If (isSuccess) Then + Wscript.Echo "The " & KTOFFICE & " KnowledgeTree service was successfully started" + Else + Wscript.Echo "The " & KTOFFICE & " KnowledgeTree service could not be started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + Case "scheduler" + isSuccess = TRUE + svcName = KTSCHEDULER + If (NOT isServiceStarted(svcName)) Then + If (NOT startService(svcName)) Then + isSuccess = FALSE + writeLog "The " & KTSCHEDULER & " KnowledgeTree service could not be started. Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "The " & KTSCHEDULER & " KnowledgeTree service was successfully started" + End If + + writeLog "Successfully started " & KTSCHEDULER + Else + writeLog KTSCHEDULER & " already started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + If (isSuccess) Then + Wscript.Echo "The " & KTSCHEDULER & " KnowledgeTree service was successfully started" + Else + Wscript.Echo "The " & KTSCHEDULER & " KnowledgeTree service could not be started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + Case "lucene" + isSuccess = TRUE + svcName = KTLUCENE + If (NOT isServiceStarted(svcName)) Then + If (NOT startService(svcName)) Then + isSuccess = false + writeLog "The " & KTLUCENE & " KnowledgeTree service could not be started. Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "The " & KTLUCENE & " KnowledgeTree service was successfully started" + End If + + writeLog "Successfully started " & KTLUCENE + Else + writeLog KTLUCENE & " already started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + If (isSuccess) Then + Wscript.Echo "The " & KTLUCENE & " KnowledgeTree service was successfully started" + Else + Wscript.Echo "The " & KTLUCENE & " KnowledgeTree service could not be started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + End Select + Else + isSuccess = TRUE + + svcName = KTOFFICE + If (NOT isServiceStarted(svcName)) Then + If (NOT startService(svcName)) Then + isSuccess = false + writeLog "Couldn't start. " & KTOFFICE & " Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "Successfully started " & KTOFFICE + End If + Else + writeLog KTOFFICE & " already started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + svcName = KTSCHEDULER + If (NOT isServiceStarted(svcName)) Then + If (NOT startService(svcName)) Then + isSuccess = false + writeLog "Couldn't start " & KTSCHEDULER & " Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "Successfully started " & KTSCHEDULER + End If + Else + writeLog KTSCHEDULER & " already started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + svcName = KTLUCENE + If (NOT isServiceStarted(svcName)) Then + If (NOT startService(svcName)) Then + isSuccess = false + writeLog "Couldn't start " & KTLUCENE & " Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "Successfully started " & KTLUCENE + End If + Else + writeLog KTLUCENE & " already started. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + If (isSuccess) Then + Wscript.Echo "The KnowledgeTree services were successfully started" + Else + Wscript.Echo "There were errors starting the KnowledgeTree services please see the log for details ('knowledgetree/var/log/dmsctl.log')" + End If + End If + Case "stop" + If (objArgs.count > 1) Then + Select Case objArgs.Item(1) + Case "soffice" + isSuccess = TRUE + svcName = KTOFFICE + If (isServiceStarted(svcName)) Then + If (NOT stopService(svcName)) Then + isSuccess = false + writeLog "The " & KTOFFICE & " KnowledgeTree service could not be stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "The " & KTOFFICE & " KnowledgeTree service was successfully stopped" + End If + + writeLog "Successfully stopped " & KTOFFICE + Else + writeLog KTOFFICE & " already stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + If (isSuccess) Then + Wscript.Echo "The " & KTOFFICE & " KnowledgeTree service was successfully stopped" + Else + Wscript.Echo "The " & KTOFFICE & " KnowledgeTree service could not be stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + Case "scheduler" + isSuccess = TRUE + svcName = KTSCHEDULER + If (isServiceStarted(svcName)) Then + If (NOT stopService(svcName)) Then + isSuccess = false + writeLog "The " & KTSCHEDULER & " KnowledgeTree service could not be stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "The " & KTSCHEDULER & " KnowledgeTree service was successfully stopped" + End If + + writeLog "Successfully stopped " & KTSCHEDULER + Else + writeLog KTSCHEDULER & " already stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + If (isSuccess) Then + Wscript.Echo "The " & KTSCHEDULER & " KnowledgeTree service was successfully stopped" + Else + Wscript.Echo "The " & KTSCHEDULER & " KnowledgeTree service could not be stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + Case "lucene" + isSuccess = TRUE + svcName = KTLUCENE + If (isServiceStarted(svcName)) Then + If (NOT stopService(svcName)) Then + isSuccess = false + writeLog "The " & KTLUCENE & " KnowledgeTree service could not be stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "The " & KTLUCENE & " KnowledgeTree service was successfully stopped" + End If + + writeLog "Successfully stopped " & KTLUCENE + Else + writeLog KTLUCENE & " already stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + If (isSuccess) Then + Wscript.Echo "The " & KTLUCENE & " KnowledgeTree service was successfully stopped" + Else + Wscript.Echo "The " & KTLUCENE & " KnowledgeTree service could not be stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + End Select + Else + 'Stopping all the services + isSuccess = TRUE + + svcName = KTOFFICE + If (isServiceStarted(svcName)) Then + If (NOT stopService(svcName)) Then + isSuccess = false + writeLog "Couldn't stop." & KTOFFICE & " Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "Successfully stopped " & KTOFFICE + End If + Else + writeLog KTOFFICE & " already stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + svcName = KTSCHEDULER + If (isServiceStarted(svcName)) Then + If (NOT stopService(svcName)) Then + isSuccess = false + writeLog "Couldn't stop." & KTSCHEDULER & " Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "Successfully stopped " & KTSCHEDULER + End If + Else + writeLog KTSCHEDULER & " already stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + svcName = KTLUCENE + If (isServiceStarted(svcName)) Then + If (NOT stopService(svcName)) Then + isSuccess = false + writeLog "Couldn't stop." & KTLUCENE & " Result Code: " & getServiceErrorMessage(lastErrorCode) + Else + writeLog "Successfully stopped " & KTLUCENE + End If + Else + writeLog KTLUCENE & " already stopped. Result Code: " & getServiceErrorMessage(lastErrorCode) + End If + + If (isSuccess) Then + Wscript.Echo "The KnowledgeTree services were successfully stopped" + Else + Wscript.Echo "There were errors sopping the KnowledgeTree services please see the log for details ('knowledgetree/var/log/dmsctl.log')" + End If + End If + + Case "uninstall" + isSuccess = TRUE + + svcName = KTOFFICE + If (NOT uninstallService(svcName)) Then + isSuccess = false + writeLog "The KnowledgeTree KTOffice service could not be uninstalled" + End If + + svcName = KTSCHEDULER + If (NOT uninstallService(svcName)) Then + isSuccess = false + writeLog "The KnowledgeTree KTScheduler service could not be uninstalled" + End If + + svcName = KTLUCENE + If (NOT uninstallService(svcName)) Then + isSuccess = false + writeLog "The KnowledgeTree KTLucene service could not be uninstalled" + End If + + If (isSuccess) Then + Wscript.Echo "The KnowledgeTree services were uninstalled" + Else + Wscript.Echo "There were errors uninstalling the KnowledgeTree services please see the log for details ('knowledgetree/var/log/dmsctl.log')" + End If + + Case "uninstall_old" 'Depricated : This method prevents verbose error logging, using WMI to uninstall instead + isSuccess = TRUE ' Track if anything went wrong + + ' Stopping Then FALSE + 'svcName = KTOFFICE + 'If (isServiceStarted(svcName)) Then + ' If (NOT stopService(svcName)) Then + ' isSuccess = false + ' End If + 'End If + + ' FALSE KTOffice + result = exec("sc delete " & KTOFFICE) + + 'Uninstall Failed + If result = 0 Then + isSuccess = false + writeLog "The KnowledgeTree KTOffice service could not be uninstalled" + End If + + ' Stopping Then FALSE + 'svcName = KTSCHEDULER + 'If (isServiceStarted(svcName)) Then + ' If (NOT stopService(svcName)) Then + ' isSuccess = false + ' End If + 'End If + + ' FALSE KTScheduler + result = exec("sc delete " & KTSCHEDULER) + + 'Uninstall Failed + If result = 0 Then + isSuccess = false + writeLog "The KnowledgeTree KTScheduler service could not be uninstalled" + End If + + ' Stopping Then FALSE + 'svcName = KTLUCENE + 'If (isServiceStarted(svcName)) Then + ' If (NOT stopService(svcName)) Then + ' isSuccess = FALSE + ' End If + 'End If + + ' FALSE KTLucene + result = exec("sc delete " & KTLUCENE) + + 'Uninstall Failed + If result = 0 Then + isSuccess = FALSE + writeLog "The KnowledgeTree KTLucene service could not be uninstalled" + End If + + If (isSuccess) Then + Wscript.Echo "The KnowledgeTree services were uninstalled" + Else + Wscript.Echo "There were errors uninstalling the KnowledgeTree services please see the log for details ('knowledgetree/var/log/dmsctl.log')" + End If + + + Case Else + Wscript.Echo strUsage + End Select + +End If + +' Method to check if a service is installed +Public Function isServiceInstalled(ByVal svcName) + strComputer = "." + Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") + + ' Obtain an instance of the the class + ' using a key property value. + + isServiceInstalled = FALSE + + svcQry = "SELECT * from Win32_Service" + Set objOutParams = objWMIService.ExecQuery(svcQry) + + For Each objSvc in objOutParams + + Select Case objSvc.Name + Case svcName + isServiceInstalled = TRUE + End Select + + Next + + If (Not isServiceInstalled) Then + lastErrorCode = SVC_INVALID_NAME + End If + +End Function + +' Method to interrogate a service +Public Function isServiceStarted(ByVal svcName) + If (NOT isServiceInstalled( svcName )) Then + isServiceStarted = FALSE + Exit Function + End If + + strComputer = "." + Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") + + ' Obtain an instance of the the class + ' using a key property value. + Set objShare = objWMIService.Get("Win32_Service.Name='" & svcName & "'") + + ' no InParameters to define + + ' Execute the method and obtain the return status. + ' The OutParameters object in objOutParams + ' is created by the provider. + Set objOutParams = objWMIService.ExecMethod("Win32_Service.Name='" & svcName & "'", "InterrogateService") + + lastErrorCode = objOutParams.ReturnValue + + If (objOutParams.ReturnValue = SVC_SERVICE_NOT_ACTIVE) Then + isServiceStarted = FALSE + Else + isServiceStarted = TRUE + End If + +end Function + +' Method to start a service +Public Function startService(ByVal svcName) + If (NOT isServiceInstalled( svcName )) Then + writeLog "The KnowledgeTree " & svcName & " service could not be started because it isn't installed. Run 'dmsctl.vbs install' to correct." + startService = FALSE + Exit Function + End If + + strComputer = "." + Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") + ' Obtain an instance of the the class + ' using a key property value. + Set objShare = objWMIService.Get("Win32_Service.Name='" & svcName &"'") + + ' no InParameters to define + + ' Execute the method and obtain the return status. + ' The OutParameters object in objOutParams + ' is created by the provider. + Set objOutParams = objWMIService.ExecMethod("Win32_Service.Name='" & svcName & "'", "StartService") + + lastErrorCode = objOutParams.ReturnValue + + If (objOutParams.ReturnValue = SVC_SUCCESS) Then + startService = TRUE + Else + startService = FALSE + End If + +End Function + +' Method to stop a service +Public Function stopService(ByVal svcName) + If (NOT isServiceInstalled( svcName )) Then + writeLog "The KnowledgeTree " & svcName & " service could not be stopped because it isn't installed. Run 'dmsctl.vbs install' to correct." + stopService = FALSE + Exit Function + End If + + strComputer = "." + Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") + ' Obtain an instance of the the class + ' using a key property value. + Set objShare = objWMIService.Get("Win32_Service.Name='" & svcName &"'") + + ' no InParameters to define + + ' Execute the method and obtain the return status. + ' The OutParameters object in objOutParams + ' is created by the provider. + Set objOutParams = objWMIService.ExecMethod("Win32_Service.Name='" & svcName & "'", "StopService") + + lastErrorCode = objOutParams.ReturnValue + + If (objOutParams.ReturnValue = SVC_SUCCESS) Then + stopService = TRUE + Else + stopService = FALSE + End If + +End Function + +' Method to uninstall a service +Public Function uninstallService(ByVal svcName) + If (NOT isServiceInstalled( svcName )) Then + uninstallService = TRUE ' Service already uninstalled so return TRUE + Exit Function + End If + + wasStopped = TRUE + If (NOT stopService(svcName)) Then + wasStopped = FALSE + End If + + strComputer = "." + Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") + ' Obtain an instance of the the class + ' using a key property value. + Set objShare = objWMIService.Get("Win32_Service.Name='" & svcName & "'") + + ' no InParameters to define + + ' Execute the method and obtain the return status. + ' The OutParameters object in objOutParams + ' is created by the provider. + Set objOutParams = objWMIService.ExecMethod("Win32_Service.Name='" & svcName & "'", "Delete") + + lastErrorCode = objOutParams.ReturnValue + + If (objOutParams.ReturnValue = SVC_SUCCESS) Then + uninstallService = TRUE + Else + uninstallService = FALSE + + ' Extra Event logging to assist the Administrator + If (wasStopped) Then + writeLog "The KnowledgeTree " & svcName & " service could not be uninstalled because it could not be stopped. Stop this service manually before uninstalling." + uninstallService = FALSE ' Must be stop service before it can be uninstalled + End If + + End If + +End Function + + +' Execute a command +Public Function exec(ByVal cmd) + + Dim WshShell, oExec + Set WshShell = CreateObject("WScript.Shell") + + Set oExec = WshShell.Exec(cmd) + + Do While oExec.Status = 0 + WScript.Sleep 100 + Loop + + exec = oExec.Status + +End Function + +Public Sub createCustomEventLog(ByVal strName) + Const NO_VALUE = Empty + + Set WshShell = WScript.CreateObject("WScript.Shell") + WshShell.RegWrite _ + "HKLM\System\CurrentControlSet\Services\EventLog\" & strName & "\", NO_VALUE +End Sub + +' Event logging only works on Server 2003, 2000 and XP +Public Sub logEvent(ByVal strMessage) + ' Disabled until Windows Vista detection has been tested. + 'If (NOT isWindowsVista() AND NOT isWindows7() AND NOT isWindows2008()) Then + ' Const EVENT_SUCCESS = 0 + ' Set objShell = Wscript.CreateObject("Wscript.Shell") + ' objShell.LogEvent EVENT_SUCCESS, strMessage + 'End If +End Sub + +' Event logging only works on Server 2003, 2000 and XP +Public Sub writeLog(ByVal strMessage) + Set objFSO = CreateObject("Scripting.FileSystemObject") + ForAppending = 8 + Set objTextFile = objFSO.OpenTextFile (currDir & "\var\log\dmsctl.log", ForAppending, True) + objTextFile.WriteLine strMessage + objTextFile.Close +End Sub + +Public Function getServiceErrorMessage(ByVal errCode) + Select Case errCode + Case SVC_SUCCESS + getServiceErrorMessage = "Success" + Case SVC_NOT_SUPPORTED + getServiceErrorMessage = "Not Supported" + Case SVC_ACCESS_DENIED + getServiceErrorMessage = "Access Denied" + Case SVC_DEPENDENT_SERVICES_RUNNING + getServiceErrorMessage = "Dependent Services Running" + Case SVC_INVALID_SERVICE_CONTROL + getServiceErrorMessage = "Invalid Service Control" + Case SVC_SERVICE_CANNOT_ACCEPT_CONTROL + getServiceErrorMessage = "Service Cannot Accept Control" + Case SVC_SERVICE_NOT_ACTIVE + getServiceErrorMessage = "Service Not Active" + Case SVC_SERVICE_REQUEST_TIMEOUT + getServiceErrorMessage = "Service Request Timeout" + Case SVC_UNKNOWN_FAILURE + getServiceErrorMessage = "Unknown Failure" + Case SVC_PATH_NOT_FOUND + getServiceErrorMessage = "Path Not Found" + Case SVC_SERVICE_ALREADY_RUNNING + getServiceErrorMessage = "Service Already Running" + Case SVC_SERVICE_DATABASE_LOCKED + getServiceErrorMessage = "Service Database Locked" + Case SVC_SERVICE_DEPENDENCY_DELETED + getServiceErrorMessage = "Service Dependency Deleted" + Case SVC_SERVICE_DEPENDENCY_FAILURE + getServiceErrorMessage = "Service Dependency Failure" + Case SVC_SERVICE_DISABLED + getServiceErrorMessage = "Service Disabled" + Case SVC_SERVICE_LOGON_FAILURE + getServiceErrorMessage = "Service Logon Failure" + Case SVC_SERVICE_MARKED_FOR_DELETION + getServiceErrorMessage = "Service Marked For Deletion" + Case SVC_SERVICES_NO_THREAD + getServiceErrorMessage = "Service No Thread" + Case SVC_STATUS_CIRCULAR_DEPENDENCY + getServiceErrorMessage = "Status Circular Dependency" + Case SVC_STATUS_DUPLICATE_NAME + getServiceErrorMessage = "Status Duplicate Name" + Case SVC_INVALID_NAME + getServiceErrorMessage = "Status Invalid Name" + Case SVC_STATUS_INVALID_PARAMETER + getServiceErrorMessage = "Status Invalid Parameter" + Case SVC_INVALID_SERVICES_ACCOUNT + getServiceErrorMessage = "Status Invalid Service Account" + Case SVC_STATUS_SERVICE_EXISTS + getServiceErrorMessage = "Status Service Exists" + Case SVC_SERVICE_ALREADY_PAUSED + getServiceErrorMessage = "Service Already Paused" + Case Else + getServiceErrorMessage = "Unknown Failure" + End Select +End Function diff --git a/dmsctl_install.bat b/dmsctl_install.bat new file mode 100644 index 0000000..112b1f1 --- /dev/null +++ b/dmsctl_install.bat @@ -0,0 +1,3 @@ +rem KnowledgeTree UAC Run installer as Administrator for Windows 7 and Vista +@echo off +call dmsctl.bat install \ No newline at end of file diff --git a/docs/.htaccess b/docs/.htaccess new file mode 100644 index 0000000..93169e4 --- /dev/null +++ b/docs/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/docs/COPYING b/docs/COPYING new file mode 100644 index 0000000..2bedb6b --- /dev/null +++ b/docs/COPYING @@ -0,0 +1,651 @@ +KnowledgeTree Community Edition +Document Management Made Simple +Copyright (C) 2008, 2009 KnowledgeTree Inc. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License version 3 as published by the +Free Software Foundation. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, +California 94120-7775, or email info@knowledgetree.com. + +The interactive user interfaces in modified source and object code versions +of this program must display Appropriate Legal Notices, as required under +Section 5 of the GNU General Public License version 3. + +In accordance with Section 7(b) of the GNU General Public License version 3, +these Appropriate Legal Notices must retain the display of the "Powered by +KnowledgeTree" logo and retain the original copyright notice. If the display of the +logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices +must display the words "Powered by KnowledgeTree" and retain the original +copyright notice. + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + diff --git a/docs/README.txt b/docs/README.txt new file mode 100644 index 0000000..b00eb8d --- /dev/null +++ b/docs/README.txt @@ -0,0 +1,58 @@ +===================================== + Welcome to the KnowledgeTree family +===================================== + +Thank you for downloading KnowledgeTree! + + +For further information and documents please refer to the following resources: + + +KnowledgeTree User and Developer Documentation: +----------------------------------------------- + + http://www.knowledgetree.com/documentation + + +Forums: +------- + + http://forums.knowledgetree.com + + +Community Wiki: +--------------- + + http://wiki.knowledgetree.com + + +Community forge: +---------------- + + http://forge.knowledgetree.com + + +Blogs: +------ + + http://people.knowledgetree.com + + +Partners: +--------- + + http://www.knowledgetree.com/Partners + + + +* Should you have any questions please contact us on: + + support@knowledgetree.com + + or + + sales@knowledgetree.com + + +Kind Regards +The KnowledgeTree Team diff --git a/docs/VERSION-NAME.txt b/docs/VERSION-NAME.txt new file mode 100644 index 0000000..c739cb0 --- /dev/null +++ b/docs/VERSION-NAME.txt @@ -0,0 +1 @@ +3.7.0.2 \ No newline at end of file diff --git a/docs/VERSION-OSS-DEV.txt b/docs/VERSION-OSS-DEV.txt new file mode 100644 index 0000000..c739cb0 --- /dev/null +++ b/docs/VERSION-OSS-DEV.txt @@ -0,0 +1 @@ +3.7.0.2 \ No newline at end of file diff --git a/docs/VERSION-OSS.txt b/docs/VERSION-OSS.txt new file mode 100644 index 0000000..c739cb0 --- /dev/null +++ b/docs/VERSION-OSS.txt @@ -0,0 +1 @@ +3.7.0.2 \ No newline at end of file diff --git a/docs/VERSION.txt b/docs/VERSION.txt new file mode 100644 index 0000000..c739cb0 --- /dev/null +++ b/docs/VERSION.txt @@ -0,0 +1 @@ +3.7.0.2 \ No newline at end of file diff --git a/docs/gendocs.sh b/docs/gendocs.sh new file mode 100644 index 0000000..5b87a78 --- /dev/null +++ b/docs/gendocs.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +rm -rf phpdoc/* + +DATETIME=`date` +VERSION=`cat VERSION-NAME.txt` + +cp kt-phpdoc.ini kt-phpdoc.ini.orig +sed -i -e "s/##VERSION##/$VERSION($DATETIME)/" kt-phpdoc.ini +phpdoc -c kt-phpdoc.ini +mv kt-phpdoc.ini.orig kt-phpdoc.ini + diff --git a/docs/kt-phpdoc.ini b/docs/kt-phpdoc.ini new file mode 100644 index 0000000..efbae1a --- /dev/null +++ b/docs/kt-phpdoc.ini @@ -0,0 +1,104 @@ +;; phpDocumentor parse configuration file +;; +;; This file is designed to cut down on repetitive typing on the command-line or web interface +;; You can copy this file to create a number of configuration files that can be used with the +;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web +;; interface will automatically generate a list of .ini files that can be used. +;; +;; default.ini is used to generate the online manual at http://www.phpdoc.org/docs +;; +;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini +;; +;; Copyright 2002, Greg Beaver +;; +;; WARNING: do not change the name of any command-line parameters, phpDocumentor will ignore them + +[Parse Data] +;; title of all the documentation +;; legal values: any string +title = KnowledgeTree ##VERSION## + +;; parse files that start with a . like .bash_profile +;; legal values: true, false +hidden = true + +;; show elements marked @access private in documentation by setting this to on +;; legal values: on, off +parseprivate = on + +;; parse with javadoc-like description (first sentence is always the short description) +;; legal values: on, off +javadocdesc = off + +;; add any custom @tags separated by commas here +;; legal values: any legal tagname separated by commas. +;customtags = mytag1,mytag2 + +;; This is only used by the XML:DocBook/peardoc2 converter +defaultcategoryname = Documentation + +;; what is the main package? +;; legal values: alphanumeric string plus - and _ +defaultpackagename = KnowledgeTree + +;; output any parsing information? set to on for cron jobs +;; legal values: on +;quiet = on + +;; parse a PEAR-style repository. Do not turn this on if your project does +;; not have a parent directory named "pear" +;; legal values: on/off +;pear = on + +;; where should the documentation be written? +;; legal values: a legal path +;target = /home/cellog/output +target = phpdoc + +;; Which files should be parsed out as special documentation files, such as README, +;; INSTALL and CHANGELOG? This overrides the default files found in +;; phpDocumentor.ini (this file is not a user .ini file, but the global file) +readmeinstallchangelog = README, INSTALL, FAQ, LICENSE, COPYING, CHANGELOG, LICENSE + +;; limit output to the specified packages, even if others are parsed +;; legal values: package names separated by commas +;packageoutput = package1,package2 + +;; comma-separated list of files to parse +;; legal values: paths separated by commas +;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory + +;; comma-separated list of directories to parse +;; legal values: directory paths separated by commas +;directory = /path1,/path2,.,..,subdirectory +;directory = /home/jeichorn/cvs/pear +;directory = /home/cellog/workspace/phpdoc +directory = ../ + +;; template base directory (the equivalent directory of /phpDocumentor) +;templatebase = /path/to/my/templates + +;; directory to find any example files in through @example and {@example} tags +;examplesdir = /path/to/my/templates + +;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore +;; legal values: any wildcard strings separated by commas +;; remember, this pathing is RELATIVE to the top-most directory in your "directory" value +;ignore = path/to/ignore*,*list.php,myfile.php,subdirectory/ +ignore = thirdparty/ + +;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format +;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib, +;; HTML:frames:earthli, +;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de, +;; HTML:frames:DOM/phphtmllib,HTML:frames:DOM/earthli +;; HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS +;; PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default +;output=HTML:frames:earthli,HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib,HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,HTML:frames:DOM/earthli,HTML:frames:DOM/phphtmllib,HTML:frames:phpedit,HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS +;output=HTML:frames:earthli,HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib,HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,HTML:frames:DOM/earthli,HTML:frames:DOM/phphtmllib,HTML:frames:phpedit,HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS +output=HTML:Smarty:PHP +;output=HTML:frames:DOM/earthli + +;; turn this option on if you want highlighted source code for every file +;; legal values: on/off +sourcecode = on diff --git a/docs/phpdoc/.empty b/docs/phpdoc/.empty new file mode 100644 index 0000000..e69de29 diff --git a/examples/fieldsynchronisation/syncFieldFromLDAP.php b/examples/fieldsynchronisation/syncFieldFromLDAP.php new file mode 100644 index 0000000..b160e00 --- /dev/null +++ b/examples/fieldsynchronisation/syncFieldFromLDAP.php @@ -0,0 +1,97 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +require_once('../../config/dmsDefaults.php'); + +require_once(KT_LIB_DIR . '/metadata/metadatautil.inc.php'); +require_once(KT_LIB_DIR . '/authentication/authenticationsource.inc.php'); +require_once(KT_LIB_DIR . '/authentication/authenticationutil.inc.php'); + +$sSourceName = "ActiveDirectory"; +$sFieldsetNamespace = "http://ktcvs.local/local/fieldsets/synctestfieldset"; +$sFieldName = "synctest"; +$sSearch = "(objectClass=organizationalPerson)"; +$sAttribute = "cn"; +$sRootDN = null; + +$aAuthenticationSources =& KTAuthenticationSource::getList(); +$oSource = null; +foreach($aAuthenticationSources as $oPotentialSource) { + if ($oPotentialSource->getName() == $sSourceName) { + $oSource =& $oPotentialSource; + } +} +if (empty($oSource)) { + printf("No authentication source named %s found\n", $sSourceName); + exit(1); +} + +$oFieldset =& KTFieldset::getByNamespace($sFieldsetNamespace); +if (PEAR::isError($oFieldset)) { + printf("No fieldset named %s found\n", $sFieldsetNamespace); + exit(1); +} +$oField = DocumentField::getByFieldsetAndName($oFieldset, $sFieldName); +if (PEAR::isError($oField)) { + printf("No field named %s found in fieldset %s\n", $sFieldName, $sFieldsetNamespace); + exit(1); +} + +$oAuthenticator =& KTAuthenticationUtil::getAuthenticatorForSource($oSource); +$oLdap =& $oAuthenticator->oLdap; + +$aParams = array( + 'scope' => 'sub', + 'attributes' => array($sAttribute), +); + +$aResults = $oLdap->search($sRootDn, $sSearch, $aParams); + +$aValues = array(); +foreach ($aResults->entries() as $oEntry) { + // print $oEntry->dn() . "\n"; + $sValue = $oEntry->get_value($sAttribute, 'single'); + // print $sValue . "\n"; + if (!empty($sValue)) { + $aValues[] = $sValue; + } +} + +$aValues = array_unique($aValues); + +KTMetadataUtil::synchroniseMetadata($oField, $aValues); diff --git a/examples/linux/init/dmsctl.sh b/examples/linux/init/dmsctl.sh new file mode 100644 index 0000000..b485dc8 --- /dev/null +++ b/examples/linux/init/dmsctl.sh @@ -0,0 +1,572 @@ +#!/bin/sh + +# Boot KnowledgeTree services +# chkconfig: 2345 55 25 +# description: KnowledgeTree Services +# +# processname: ktdms + +HOSTNAME=`hostname` +RETVAL=0 +PID="" +ERROR=0 +SERVER=all +VDISPLAY="99" +INSTALL_PATH=/opt/ktdms +JAVABIN=$INSTALL_PATH/java/jre/bin/java +export MAGICK_HOME=$INSTALL_PATH/common +export LD_LIBRARY_PATH="$INSTALL_PATH/apache2/lib:$INSTALL_PATH/common/lib:$INSTALL_PATH/mysql/lib:$LD_LIBRARY_PATH" +export PATH=$PATH:$INSTALL_PATH/php/bin +export PHPRC=$INSTALL_PATH/php/etc + +# LDAP +export LDAPCONF=$INSTALL_PATH/common/etc/openldap/ldap.conf + +# Apache +HTTPD_PIDFILE=$INSTALL_PATH/apache2/logs/httpd.pid +HTTPD_PID="" +HTTPD="$INSTALL_PATH/apache2/bin/httpd -f $INSTALL_PATH/apache2/conf/httpd.conf" +HTTPD_STATUS="" + +# MySQL +MYSQL_PIDFILE=$INSTALL_PATH/mysql/data/mysqld.pid +MYSQL_PID="" +#MYSQL_START="$INSTALL_PATH/mysql/bin/safe_mysqld --port=3306 --socket=$INSTALL_PATH/mysql/tmp/mysql.sock --old-passwords --datadir=$INSTALL_PATH/mysql/data --pid-file=$INSTALL_PATH/mysql/data/mysqld.pid" +MYSQL_START="$INSTALL_PATH/mysql/bin/safe_mysqld --defaults-file=${INSTALL_PATH}/mysql/my.cnf --old-passwords --datadir=$INSTALL_PATH/mysql/data --log-error=$INSTALL_PATH/mysql/data/mysqld.log --pid-file=$INSTALL_PATH/mysql/data/mysqld.pid" +MYSQL_STOP="$INSTALL_PATH/mysql/bin/mysqladmin --defaults-file=${INSTALL_PATH}/mysql/my.cnf -u root -p shutdown" +MYSQL_STATUS="" +MYSQL_PASSWORD="" + +# Agent +AGENT_PIDFILE="$INSTALL_PATH/updates/agent.pid" +AGENT_PID="" +AGENT="$INSTALL_PATH/updates/agent.bin" +AGENT_STATUS="" +AGENT_BIN=agent.bin + +# OpenOffice +SOFFICE_PATH="$INSTALL_PATH/openoffice/program" +SOFFICE_PIDFILE=$INSTALL_PATH/openoffice/soffice.bin.pid +SOFFICE_PID="" +SOFFICE_PORT="8100" +SOFFICEBIN=$INSTALL_PATH/openoffice/program/soffice.bin +#SOFFICE="$SOFFICEBIN -nofirststartwizard -nologo -headless -accept=pipe,name=pypipe;urp;StarOffice.ServiceManager" +SOFFICE="$SOFFICEBIN -nofirststartwizard -nologo -headless -accept=socket,host=127.0.0.1,port=$SOFFICE_PORT;urp;StarOffice.ServiceManager" +SOFFICE_STATUS="" + +# Lucene +LUCENE_PIDFILE=$INSTALL_PATH/knowledgeTree/bin/luceneserver/lucene.pid +LUCENE_PID="" +LUCENE="$JAVABIN -Xms512M -Xmx512M -jar ktlucene.jar" +LUCENE_STATUS="" + +# Scheduler +SCHEDULER_PATH="$INSTALL_PATH/bin/" +SCHEDULER_PIDFILE=$INSTALL_PATH/bin/scheduler.pid +SCHEDULER_PID="" +SCHEDULERBIN="$INSTALL_PATH/bin/schedulerTask.sh" +SCHEDULER="$SCHEDULERBIN" +SCHEDULER_STATUS="" + +get_pid() { + PID="" + PIDFILE=$1 + # check for pidfile + if [ -f $PIDFILE ] ; then + exec 6<&0 + exec < $PIDFILE + read pid + PID=$pid + exec 0<&6 6<&- + fi +} + +get_apache_pid() { + get_pid $HTTPD_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + HTTPD_PID=$PID + fi +} + +get_agent_pid() { + get_pid $AGENT_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + AGENT_PID=$PID + fi +} + +get_mysql_pid() { + get_pid $MYSQL_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + MYSQL_PID=$PID + fi +} + +get_soffice_pid() { + get_pid $SOFFICE_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + SOFFICE_PID=$PID + fi +} + +get_lucene_pid() { + get_pid $LUCENE_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + LUCENE_PID=$PID + fi +} + +get_scheduler_pid() { + get_pid $SCHEDULER_PIDFILE + if [ ! $PID ]; then + return + fi + if [ $PID -gt 0 ]; then + SCHEDULER_PID=$PID + fi +} + +is_service_running() { + PID=$1 + if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null ; then + RUNNING=1 + else + RUNNING=0 + fi + return $RUNNING +} + +is_mysql_running() { + get_mysql_pid + is_service_running $MYSQL_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + MYSQL_STATUS="mysql not running" + else + MYSQL_STATUS="mysql already running" + fi + return $RUNNING +} + +is_agent_running() { + get_agent_pid + is_service_running $AGENT_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + AGENT_STATUS="agent not running" + else + AGENT_STATUS="agent already running" + fi + return $RUNNING +} + +is_apache_running() { + get_apache_pid + is_service_running $HTTPD_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + HTTPD_STATUS="apache not running" + else + HTTPD_STATUS="apache already running" + fi + return $RUNNING +} + +is_soffice_running() { + get_soffice_pid + is_service_running $SOFFICE_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + SOFFICE_STATUS="openoffice not running" + else + SOFFICE_STATUS="openoffice already running" + fi + return $RUNNING +} + +is_lucene_running() { + get_lucene_pid + is_service_running $LUCENE_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + LUCENE_STATUS="lucene not running" + else + LUCENE_STATUS="lucene already running" + fi + return $RUNNING +} + +is_scheduler_running() { + get_scheduler_pid + is_service_running $SCHEDULER_PID + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + SCHEDULER_STATUS="scheduler not running" + else + SCHEDULER_STATUS="scheduler already running" + fi + return $RUNNING +} + +test_apache_config() { + if $HTTPD -t; then + ERROR=0 + else + ERROR=8 + echo "apache config test fails, aborting" + exit $ERROR + fi +} + +start_mysql() { + is_mysql_running + RUNNING=$? + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: mysql (pid $MYSQL_PID) already running" + else + $MYSQL_START &> $INSTALL_PATH/var/log/dmsctl.log & + if [ $? -eq 0 ]; then + echo "$0 $ARG: mysql started at port 3306" + sleep 2 + else + echo "$0 $ARG: mysql could not be started" + ERROR=3 + fi + fi +} + +stop_mysql() { + NO_EXIT_ON_ERROR=$1 + is_mysql_running + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $MYSQL_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + kill -15 $MYSQL_PID + sleep 5 + + is_mysql_running + RUNNING=$? + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: mysql stopped" + else + echo "$0 $ARG: mysql could not be stopped" + ERROR=4 + fi +} + +start_agent() { + is_agent_running + RUNNING=$? + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: agent (pid $AGENT_PID) already running" + else + $AGENT &> $INSTALL_PATH/var/log/dmsctl.log & + sleep 5 + get_agent_pid + if [ $AGENT_PID -gt 0 ]; then + echo "$0 $ARG: agent started" + else + echo "$0 $ARG: agent could not be started" + ERROR=3 + fi + fi +} + +stop_agent() { + NO_EXIT_ON_ERROR=$1 + is_agent_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $AGENT_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_agent_pid + if kill $AGENT_PID ; then + echo "$0 $ARG: agent stopped" + else + echo "$0 $ARG: agent could not be stopped" + ERROR=4 + fi +} + +start_apache() { + test_apache_config + is_apache_running + RUNNING=$? + + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: httpd (pid $HTTPD_PID) already running" + else + if $HTTPD &> $INSTALL_PATH/var/log/dmsctl.log; then + echo "$0 $ARG: httpd started at port 8080" + else + echo "$0 $ARG: httpd could not be started" + ERROR=3 + fi +fi +} + +stop_apache() { + NO_EXIT_ON_ERROR=$1 + test_apache_config + is_apache_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $HTTPD_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_apache_pid + if kill $HTTPD_PID ; then + echo "$0 $ARG: httpd stopped" + else + echo "$0 $ARG: httpd could not be stopped" + ERROR=4 + fi +} + +start_soffice() { + is_soffice_running + RUNNING=$? + + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: openoffice (pid $SOFFICE_PID) already running" + else + nohup $SOFFICE &> $INSTALL_PATH/var/log/dmsctl.log & + if [ $? -eq 0 ]; then + echo "$0 $ARG: openoffice started at port $SOFFICE_PORT" + ps ax | grep $SOFFICEBIN | awk {'print $1'} > $SOFFICE_PIDFILE + sleep 2 + else + echo "$0 $ARG: openoffice could not be started" + ERROR=3 + fi +fi +} + +stop_soffice() { + NO_EXIT_ON_ERROR=$1 + is_soffice_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $SOFFICE_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_soffice_pid + if killall $SOFFICEBIN ; then + echo "$0 $ARG: openoffice stopped" + else + echo "$0 $ARG: openoffice could not be stopped" + ERROR=4 + fi +} + +start_lucene() { + is_lucene_running + RUNNING=$? + + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: lucene (pid $LUCENE_PID) already running" + else + cd $INSTALL_PATH/knowledgeTree/bin/luceneserver + nohup $LUCENE &> $INSTALL_PATH/var/log/dmsctl.log & + if [ $? -eq 0 ]; then + echo "$0 $ARG: lucene started" + ps ax | grep ktlucene.jar | awk {'print $1'} > $LUCENE_PIDFILE + sleep 2 + else + echo "$0 $ARG: lucene could not be started" + ERROR=3 + fi + cd $INSTALL_PATH +fi +} + +stop_lucene() { + NO_EXIT_ON_ERROR=$1 + is_lucene_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $LUCENE_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_lucene_pid + cd $INSTALL_PATH/knowledgeTree/search2/indexing/bin + $INSTALL_PATH/php/bin/php shutdown.php positive &> $INSTALL_PATH/var/log/dmsctl.log + sleep 5 + if [ $? -eq 0 ]; then + echo "$0 $ARG: lucene stopped" + else + echo "$0 $ARG: lucene could not be stopped" + ERROR=4 + fi +} + +start_scheduler() { + is_scheduler_running + RUNNING=$? + + if [ $RUNNING -eq 1 ]; then + echo "$0 $ARG: scheduler (pid $SCHEDULER_PID) already running" + else + cd $SCHEDULER_PATH + nohup $SCHEDULER &> $INSTALL_PATH/var/log/dmsctl.log & + if [ $? -eq 0 ]; then + echo "$0 $ARG: scheduler started" + ps ax | grep $SCHEDULERBIN | awk {'print $1'} > $SCHEDULER_PIDFILE + sleep 2 + else + echo "$0 $ARG: scheduler could not be started" + ERROR=3 + fi + fi +} + +stop_scheduler() { + NO_EXIT_ON_ERROR=$1 + is_scheduler_running + RUNNING=$? + + if [ $RUNNING -eq 0 ]; then + echo "$0 $ARG: $SCHEDULER_STATUS" + if [ "x$NO_EXIT_ON_ERROR" != "xno_exit" ]; then + exit + else + return + fi + fi + get_scheduler_pid + if kill $SCHEDULER_PID ; then + echo "$0 $ARG: scheduler stopped" + else + echo "$0 $ARG: scheduler could not be stopped" + ERROR=4 + fi +} + +help() { + echo "usage: $0 help" + echo " $0 (start|stop|restart)" + echo " $0 (start|stop|restart) apache" + echo " $0 (start|stop|restart) mysql" + echo " $0 (start|stop|restart) agent" + echo " $0 (start|stop|restart) scheduler" + echo " $0 (start|stop|restart) soffice" + echo " $0 (start|stop|restart) lucene" + cat < +echo. +echo help - this screen +echo. +echo start - start the services +echo stop - stop the services +echo restart - restart the services +echo. +echo install - install the services +echo uninstall - uninstall the services +echo. + +goto end + +:start +echo Starting services +sc start %MysqlServiceName% +sc start %ApacheServiceName% +sc start %OpenofficeServiceName% +sc start %LuceneServiceName% +ping -n 7 127.0.0.1 > null +sc start %SchedulerServiceName% +IF EXIST "%INSTALL_PATH%\bin\networkservice.bat" call "%INSTALL_PATH%\bin\networkservice.bat" start + +goto end + +:stop +echo Stopping services +IF EXIST "%INSTALL_PATH%\bin\networkservice.bat" call "%INSTALL_PATH%\bin\networkservice.bat" stop +sc stop %LuceneServiceName% +sc stop %SchedulerServiceName% +sc stop %OpenofficeServiceName% +sc stop %ApacheServiceName% +ping -n 7 127.0.0.1 > null +sc stop %MysqlServiceName% +IF ""%1"" == ""restart"" goto start +goto end + +:restart +goto stop + +:install +echo Installing services +"%INSTALL_PATH%\mysql\bin\mysqld.exe" --install %MysqlServiceName% --defaults-file="%INSTALL_PATH%\mysql\my.ini" +"%INSTALL_PATH%\apache2\bin\httpd.exe" -k install -n "%ApacheServiceName%" -f "%INSTALL_PATH%\apache2\conf\httpd.conf" +"%INSTALL_PATH%\bin\winserv.exe" install %OpenofficeServiceName% -displayname "%OpenofficeServiceName%" -start auto %SOFFICE_BIN% "-accept=socket,host=127.0.0.1,port=%SOFFICE_PORT%;urp;StarOffice.ServiceManager" -nologo -headless -nofirststartwizard + +call "%INSTALL_PATH%\bin\schedulerserviceinstall.bat" +call "%INSTALL_PATH%\bin\luceneserviceinstall.bat" +IF EXIST "%INSTALL_PATH%\bin\networkservice.bat" call "%INSTALL_PATH%\bin\networkservice.bat" install + +goto end + +:uninstall +echo Uninstalling services +IF EXIST "%INSTALL_PATH%\bin\networkservice.bat" call "%INSTALL_PATH%\bin\networkservice.bat" uninstall +sc delete %LuceneServiceName% +sc delete %SchedulerServiceName% +sc delete %OpenofficeServiceName% +sc delete %ApacheServiceName% +sc delete %MysqlServiceName% +goto end + +:end diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..72a0594 Binary files /dev/null and b/favicon.ico differ diff --git a/help.php b/help.php new file mode 100644 index 0000000..291c82e --- /dev/null +++ b/help.php @@ -0,0 +1,219 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +// main library routines and defaults +require_once('config/dmsDefaults.php'); +require_once(KT_LIB_DIR . '/templating/templating.inc.php'); +require_once(KT_LIB_DIR . '/templating/kt3template.inc.php'); +require_once(KT_LIB_DIR . '/dispatcher.inc.php'); +require_once(KT_LIB_DIR . '/util/ktutil.inc'); + +require_once(KT_LIB_DIR . '/security/Permission.inc'); + +require_once(KT_LIB_DIR . '/help/helpreplacement.inc.php'); +require_once(KT_LIB_DIR . '/help/help.inc.php'); + +/* + * KT3 Help functionality. + * + * The KT3 help works slightly differently to the previous versions of KT. + * This page takes subpath-info, and uses that to resolve the help documentation + * as appropriate. + * + * This documentation should be placed into KT_DIR/kthelp/COMPONENT_NAME/LANG/... + * Currently images and html files are the ONLY supported types. + * + * Within these directories, local addressing is _relative_ as expected. + * + * File names _should not be changed_ from their reference values when translating, + * since files are referred to WITHOUT the lang-code (e.g. EN, IT). + */ + + +class HelpDispatcher extends KTStandardDispatcher { + + var $sSection = 'dashboard'; + var $bIsReplacement = false; + + function HelpDispatcher() { + $this->aBreadcrumbs[] = array('action' => 'dashboard', 'name' => _kt('Dashboard')); + $this->aBreadcrumbs[] = array('name' => _kt('Help')); + parent::KTStandardDispatcher(); + } + + function is_replacement() { return $this->bIsReplacement; } + + function do_main() { + // store referer + $sBackKey = KTUtil::arrayGet($_REQUEST, 'back_key', false); + $sSubPath = KTUtil::arrayGet($_SERVER, 'PATH_INFO'); + + // we want to be able to say "i left the system at point x. go back there" + if(!$sBackKey) { + $sReferer = KTUtil::arrayGet($_SERVER ,'HTTP_REFERER'); + $sBackKey = KTUtil::randomString(); + $_SESSION[$sBackKey] = $sReferer; + } + + // no path specified + if (empty($sSubPath)) { + $this->oPage->setTitle(_kt('No help page specified.')); + $this->oPage->addError(_kt('No help page specified.')); + return ' '; + } + + // simple test to see if this user is active. + $bCanEdit = Permission::userIsSystemAdministrator($_SESSION['userID']); + + global $default; + $sLangCode = $default->defaultLanguage; + /* + now we need to know a few things. + 1. can we find this help file? + 2. if we can, display it + 2.1 images directly + 2.2 html wrapped. + 3. if now, fail out. + + this is essentially handled by asking help.inc.php for the + subpath we've been given, PLUS THE LANGUAGE, and checking for + a PEAR::raiseError. + + The "Correct" response we care about is a dictionary: + + { + 'is_image': string + 'title': string + 'body': string + } + */ + + $aHelpData = KTHelp::getHelpInfo($sSubPath); + + if (PEAR::isError($aHelpData)) { + $this->oPage->setTitle($aHelpData->getMessage()); + $this->oPage->addError($aHelpData->getMessage()); + return ' '; + } + + $aLocInfo = KTHelp::_getLocationInfo($sSubPath); + + if ($aHelpData['is_image']) { + KTHelp::outputHelpImage($sSubPath); + exit(0); // done. + } else { + $this->oPage->setTitle($aHelpData['title']); + $this->aBreadcrumbs[] = array('url' => $_SERVER['PHP_SELF'], 'name' => $aHelpData['title']); + $oTemplating =& KTTemplating::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('ktcore/help_with_edit'); + $aTemplateData = array( + 'context' => $this, + 'help_body' => $aHelpData['body'], + 'help_title' => $aHelpData['title'], + 'target_name' => KTUtil::arrayGet($aLocInfo, 'subpath'), + 'back_key' => $sBackKey, + 'can_edit' => $bCanEdit, + ); + return $oTemplate->render($aTemplateData); + } + /* + $help_path = KTHelp::getHelpSubPath($pathinfo); + + if ($help_path == false) { + $this->oPage->setTitle(_kt('Invalid help location specified.')); + $this->oPage->addError(_kt('Invalid help location specified.')); + return ' '; + } + + // We now check for substitute help files. try to generate an error. + $oReplacementHelp = KTHelpReplacement::getByName($help_path); + + if (KTHelp::isImageFile($help_path)) { + KTHelp::outputHelpImage($help_path); + } else { + // not an image, so: + $aHelpInfo = KTHelp::getHelpFromFile($pathinfo) + } + + + // NORMAL users never see edit-option. + if (!$can_edit) { + if (!PEAR::isError($oReplacementHelp)) { + $this->oPage->setTitle($oReplacementHelp->getTitle()); + //return $oReplacementHelp->getDescription(); + } elseif ($aHelpInfo != false) { + $this->oPage->setTitle($aHelpInfo['title']); + //return $aHelpInfo['body']; + } else { + $this->oPage->setTitle(_kt('Invalid help location specified.')); + $this->oPage->addError(_kt('Invalid help location specified.')); + return ' '; + } + } + + if (!PEAR::isError($oReplacementHelp)) { + $aHelpInfo['title'] = $oReplacementHelp->getTitle(); + $aHelpInfo['body'] = $oReplacementHelp->getDescription(); + } + // we now _can_ edit. + + + $this->oPage->setTitle($aHelpInfo['title']); + $this->aBreadcrumbs[] = array('url' => $_SERVER['PHP_SELF'], 'name' => $aHelpInfo['title']); + + */ + } + + function do_go_back() { + // get referer + $sBackKey = KTUtil::arrayGet($_REQUEST, 'back_key', false); + if($sBackKey) { + $sReferer = $_SESSION[$sBackKey]; + redirect($sReferer); + exit(0); + } else { + $this->errorRedirectToMain(_kt('Invalid return key from help system.')); + } + } +} + +$oDispatcher = new HelpDispatcher(); +$oDispatcher->dispatch(); + +?> + diff --git a/i18n/knowledgeTree.pot b/i18n/knowledgeTree.pot new file mode 100644 index 0000000..8defbdb --- /dev/null +++ b/i18n/knowledgeTree.pot @@ -0,0 +1,16810 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-11-06 07:51+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/util/ktutil.inc:221 +#, php-format +msgid " %d day(s)" +msgstr "" + +#: lib/util/ktutil.inc:222 +#, php-format +msgid " %d hour(s)" +msgstr "" + +#: lib/util/ktutil.inc:223 +#, php-format +msgid " %d minute(s)" +msgstr "" + +#: lib/util/ktutil.inc:228 +#, php-format +msgid " %d second(s)" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:224 +#: lib/foldermanagement/folderutil.inc.php:630 +#, php-format +msgid " (reason: %s)" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:196 +msgid " Note: group is set as unit administrator, but is not assigned to a unit." +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:344 +msgid " View All" +msgstr "" + +#: lib/browse/Criteria.inc:1021 +msgid " ago" +msgstr "" + +#: lib/browse/Criteria.inc:447 +msgid " and " +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:592 +#: lib/subscriptions/subscriptions.inc.php:594 +msgid " from the folder \"" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:595 +#: lib/subscriptions/subscriptions.inc.php:600 +#: lib/subscriptions/subscriptions.inc.php:601 +#: lib/subscriptions/subscriptions.inc.php:602 +msgid " in the folder \"" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:591 +#: lib/subscriptions/subscriptions.inc.php:593 +msgid " to \"" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:598 +#: lib/subscriptions/subscriptions.inc.php:599 +msgid " to the folder \"" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:715 +msgid " users enabled at one time." +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:585 +#: lib/subscriptions/subscriptions.inc.php:587 +#: lib/subscriptions/subscriptions.inc.php:591 +#: lib/subscriptions/subscriptions.inc.php:592 +#: lib/subscriptions/subscriptions.inc.php:593 +#: lib/subscriptions/subscriptions.inc.php:595 +#: lib/subscriptions/subscriptions.inc.php:596 +#: lib/subscriptions/subscriptions.inc.php:597 +#: lib/subscriptions/subscriptions.inc.php:598 +#: lib/subscriptions/subscriptions.inc.php:599 +#: lib/subscriptions/subscriptions.inc.php:602 +msgid "\"" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:588 +msgid "\" has been added or modified" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:600 +msgid "\" has been archived" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:580 +msgid "\" has been changed" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:581 +msgid "\" has been checked in" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:582 +msgid "\" has been checked out" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:584 +msgid "\" has been copied" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:601 +msgid "\" has been downloaded" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:583 +msgid "\" has been moved" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:576 +#: lib/subscriptions/subscriptions.inc.php:579 +msgid "\" has been removed" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:586 +msgid "\" has been restored by an administrator" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:594 +msgid "\" to which you are subscribed" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:575 +#: lib/subscriptions/subscriptions.inc.php:578 +msgid "\" to which you were subscribed, has been removed" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:574 +#: lib/subscriptions/subscriptions.inc.php:577 +msgid "\" was added" +msgstr "" + +#: plugins/ktcore/KTValidators.php:381 +#, php-format +msgid "\"%s\" are not valid selections." +msgstr "" + +#: plugins/ktcore/KTValidators.php:397 +#, php-format +msgid "\"%s\"is not a valid selection." +msgstr "" + +#: i18n/templates.c:77 +msgid "#app#: #name# alert triggered" +msgstr "" + +#: i18n/templates.c:176 +msgid "#app#: #name# has been archived" +msgstr "" + +#: i18n/templates.c:173 +msgid "#app#: #name# has been deleted" +msgstr "" + +#: i18n/templates.c:5963 +msgid "#appname# #versionname#" +msgstr "" + +#: i18n/templates.c:7328 +msgid "#appname# Database Counters Report" +msgstr "" + +#: i18n/templates.c:7325 +msgid "#appname# Database Schema (the structure of the database only)" +msgstr "" + +#: i18n/templates.c:7331 +msgid "#appname# Database Storage Engine Report" +msgstr "" + +#: i18n/templates.c:7304 +msgid "#appname# Issue Tracker" +msgstr "" + +#: i18n/templates.c:1757 +msgid "#appname# RSS" +msgstr "" + +#: i18n/templates.c:521 +msgid "#appname# Recent Documents" +msgstr "" + +#: i18n/templates.c:7319 +msgid "#appname# System Settings" +msgstr "" + +#: i18n/templates.c:1727 i18n/templates.c:5015 +msgid "#appname# Version" +msgstr "" + +#: i18n/templates.c:7322 +msgid "#appname# Version Files" +msgstr "" + +#: i18n/templates.c:2447 +msgid "#appname# Version: #version#" +msgstr "" + +#: i18n/templates.c:2444 +msgid "#appname# Version: #version# is licensed free of charge and supplied with \t\t\t\t\t\t\tno support, \t\t\t\t\t\t\tno maintenance \t\t\t\t\t\t\tand no warranty." +msgstr "" + +#: i18n/templates.c:3005 +msgid "#appname# administrator's Guide" +msgstr "" + +#: i18n/templates.c:6329 +msgid "#appname# allows administrators the ability to create Units that model the organisation's business units. Units may have their own administrators and groups may be assigned to these units." +msgstr "" + +#: i18n/templates.c:7697 +msgid "#appname# has a powerful security model, in which users can only see documents they have permissions to see. Workflow is the finest-grained way to allocate permissions to a document, since it can override the permissions assigned at a folder level." +msgstr "" + +#: i18n/templates.c:1910 +msgid "#itemCount# items, #batchSize# per page" +msgstr "" + +#: i18n/templates.c:6140 +msgid "#name#'s authentication is handled by the #provider#." +msgstr "" + +#: i18n/templates.c:182 +msgid "#user# has archived a document of which you are the owner" +msgstr "" + +#: i18n/templates.c:188 +msgid "#user# has archived a document on which you have an alert" +msgstr "" + +#: i18n/templates.c:179 +msgid "#user# has deleted a document of which you are the owner" +msgstr "" + +#: i18n/templates.c:185 +msgid "#user# has deleted a document on which you have an alert" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:198 +#, php-format +msgid "%d documents expunged." +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:195 +#, php-format +msgid "%d documents made active." +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:293 +#, php-format +msgid "%d documents restored." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:452 +#: plugins/multiselect/inetbasic.inc.php:639 +#, php-format +msgid "%d lookups added." +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:619 +#, php-format +msgid "%d successful, %d failures" +msgstr "" + +#: lib/metadata/metadatautil.inc.php:576 +#, php-format +msgid "%d values for the Master Field are not assigned to behaviours." +msgstr "" + +#: lib/mime.inc.php:138 lib/plugins/pluginutil.inc.php:331 +#: lib/plugins/pluginutil.inc.php:336 lib/plugins/pluginutil.inc.php:337 +#: lib/plugins/pluginutil.inc.php:345 lib/plugins/pluginutil.inc.php:346 +#: lib/plugins/pluginutil.inc.php:396 lib/plugins/pluginutil.inc.php:401 +#: lib/widgets/fieldsetDisplay.inc.php:536 +#: plugins/ktcore/admin/configSettings.php:219 +#: plugins/ktcore/admin/managePermissions.php:89 +#: plugins/ktcore/admin/managePermissions.php:95 +#: plugins/ktcore/admin/managePermissions.php:100 +#: plugins/ktcore/admin/managePermissions.php:122 +#: plugins/ktcore/admin/managePermissions.php:131 +#: plugins/ktcore/admin/managePermissions.php:140 +#: plugins/ktcore/admin/managePermissions.php:147 search2.php:704 +#: search2/indexing/extractorCore.inc.php:654 +#: search2/indexing/indexerCore.inc.php:262 search2/search/expr.inc.php:2090 +#, php-format +msgid "%s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1695 +#: plugins/ktcore/admin/workflowsv2.php:1917 +#, php-format +msgid "%s (%s)" +msgstr "" + +#: lib/workflow/workflowtransition.inc.php:148 +#, php-format +msgid "%s (to state %s)" +msgstr "" + +#: lib/mime.inc.php:140 lib/widgets/fieldsetDisplay.inc.php:187 +#, php-format +msgid "%s File" +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:188 +#, php-format +msgid "%s could not be made \"live\"." +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:251 +#, php-format +msgid "%s from %s to %s" +msgstr "" + +#: lib/groups/GroupUtil.php:420 +#, php-format +msgid "%s is a direct member." +msgstr "" + +#: lib/groups/GroupUtil.php:443 +#, php-format +msgid "%s is a member of %s" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:128 +#: plugins/ktcore/admin/deletedDocuments.php:152 +#: plugins/ktcore/admin/deletedDocuments.php:218 +#, php-format +msgid "%s is not a deleted document. Aborting expunge" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:242 +#, php-format +msgid "%s is not a deleted document. Aborting restore" +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:148 +#: plugins/ktcore/admin/archivedDocuments.php:174 +#, php-format +msgid "%s is not an archived document. Aborting restore." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:894 +#, php-format +msgid "%s problem: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:382 +#, php-format +msgid "%s successfully copied as %s" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:154 +#, php-format +msgid "%s wants to share a document using KnowledgeTree" +msgstr "" + +#: i18n/templates.c:5969 +msgid "© 2008, 2009 KnowledgeTree Inc." +msgstr "" + +#: i18n/templates.c:1733 i18n/templates.c:5021 +msgid "© 2008, 2009 KnowledgeTree Inc." +msgstr "" + +#: i18n/templates.c:2453 +msgid "© 2008, 2009 KnowledgeTree Inc." +msgstr "" + +#: i18n/templates.c:2525 +msgid "'There was an error connecting to the server. Please refresh the page.'" +msgstr "" + +#: i18n/templates.c:8357 +msgid "(Closed at metadata version: #ver#)" +msgstr "" + +#: config/dmsDefaults.php:657 +msgid "(Community Edition)" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:494 +#: plugins/commercial/wintools/baobabkeyutil.inc.php:498 +msgid "(Evaluation)" +msgstr "" + +#: i18n/templates.c:7706 i18n/templates.c:7712 +msgid "(by state)" +msgstr "" + +#: i18n/templates.c:7439 +msgid "(e.g. which transitions lead to which states)" +msgstr "" + +#: i18n/templates.c:7784 +msgid "(e.g. workflow name, starting state)" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:713 +msgid ", by " +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:597 +msgid ", from the folder \"" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:596 +msgid ", in the folder \"" +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:80 +#: plugins/ktcore/folder/BulkUpload.php:82 +#: plugins/ktcore/folder/addDocument.php:145 +#: plugins/multiselect/BulkImport.php:159 +#: plugins/multiselect/BulkUpload.php:184 +#: plugins/multiselect/addDocument.php:171 +msgid "- Please select a document type -" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:875 +#: plugins/ktcore/admin/groupManagement.php:289 +#: plugins/ktcore/admin/groupManagement.php:432 +#: plugins/ktcore/admin/userManagement.php:405 +#: plugins/ktcore/admin/workflowsv2.php:1453 +#: plugins/ktcore/admin/workflowsv2.php:2361 +#: plugins/ktcore/admin/workflowsv2.php:2364 +#: plugins/ktcore/folder/Permissions.php:398 +#: plugins/ktstandard/KTEmail.php:450 plugins/ktstandard/KTEmail.php:474 +msgid "-- Please filter --" +msgstr "" + +#: i18n/templates.c:50 +msgid "--- Please filter ---" +msgstr "" + +#: lib/workflow/workflowutil.inc.php:598 +msgid "; Reason given was: " +msgstr "" + +#: i18n/templates.c:1730 i18n/templates.c:5018 +msgid "Document Management Software" +msgstr "" + +#: i18n/templates.c:131 +msgid "Add other users to this alert..." +msgstr "" + +#: i18n/templates.c:41 +msgid "Add users to this alert..." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:169 +msgid "KnowledgeTree is easy to use open source document management software
    that helps businesses collaborate, securely store all critical documents, address
    compliance challenges, and improve business processes." +msgstr "" + +#: lib/widgets/forms.inc.php:361 plugins/ktcore/KTWidgets.php:462 +#, php-format +msgid "

Unable to show widget — %s

" +msgstr "" + +#: i18n/templates.c:8426 +msgid " Warning! This action cannot be undone. No further content changes will be allowed, and only the system administrator, working in Administration Mode, may edit the metadata of an immutable document." +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:129 +msgid "" +"

The folder given below is where the unit folder will be created. Use the folder collection and path below to browse to the folder you wish to create the unit folder into.

The unit administrators have additional rights within that portion of the document management system.\n" +"

" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:193 +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:286 +msgid " You do not have any dropped documents


" +msgstr "" + +#: i18n/templates.c:5351 +msgid "Deleted, which completely removes the selected items from the lookup. Note that this may not be possible if some other aspect of the system depends on a particular lookup." +msgstr "" + +#: i18n/templates.c:5345 +msgid "Enabled, which means that users can specify this as an option when editing or creating documents." +msgstr "" + +#: i18n/templates.c:8153 i18n/templates.c:8195 +msgid "Please Note: you can only delete states or transitions while the workflow has no documents or document-versions assigned to the workflow." +msgstr "" + +#: i18n/templates.c:5348 +msgid "Sticky, which is used if you have some external plugin controlling this lookup set. This will then tell that plugin not to remove the \"sticky\" value, even if it no longer available in the remote source." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:598 +msgid "The folder required for this trigger has been deleted, so the transition cannot be performed." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:594 +msgid "This transition cannot be performed: no folder has been selected." +msgstr "" + +#: plugins/commercial/wintools/BaobabPlugin.php:52 +#, php-format +msgid "You are using an evaluation copy of %s Commercial. Please consider upgrading to a full version, and supporting the continued development of this application." +msgstr "" + +#: i18n/templates.c:5510 +msgid "or to a new behaviour called" +msgstr "" + +#: i18n/templates.c:2684 i18n/templates.c:2702 +msgid "A user, #user#, has requested help on the document #name#, and you are the owner or an admin of this document." +msgstr "" + +#: i18n/templates.c:5783 +msgid "A conditional fieldset contains only lookup fields. The values for each field can depend on the user's selections for the others." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:160 +#, php-format +msgid "A KnowledgeTree user, %s, wants to share a document with you entitled \"%s\"." +msgstr "" + +#: i18n/templates.c:3020 +msgid "A checked-out document may not be modified by others. Please ensure that you check-in your documents to the repository as soon as you have finished working with them." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:122 +msgid "A conditional fieldset must have a master field before it can be used. To correct this, please use the \"manage field ordering\" link below. This fieldset will display as a normal, non-conditional fieldset until this problem is corrected." +msgstr "" + +#: i18n/templates.c:8159 +msgid "A critical part of workflow is the creation of various different states for documents." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:342 +msgid "A document cannot be linked to itself." +msgstr "" + +#: i18n/templates.c:4970 +msgid "A document with the same title already exists in the folder." +msgstr "" + +#: i18n/templates.c:4967 +msgid "A document with the same title already exists in the target folder" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1330 +#: plugins/ktcore/KTDocumentActions.php:1569 +msgid "A document with this filename already exists in your chosen folder. Please choose a different folder, or specify a new filename for the copied document." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1319 +#: plugins/ktcore/KTDocumentActions.php:1557 +msgid "A document with this title already exists in your chosen folder. Please choose a different folder, or specify a new title for the copied document." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:180 +#: plugins/multiselect/inetbasic.inc.php:255 +msgid "A field with that name already exists in this fieldset." +msgstr "" + +#: i18n/templates.c:5813 +msgid "A fieldset is a collection of fields that comprise a defined set of document metadata. You may add, edit or delete members of this fieldset collection below." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:411 +#: plugins/multiselect/InetdocumentFieldsv2.php:486 +msgid "A fieldset with that name already exists." +msgstr "" + +#: plugins/ktcore/KTFolderActions.php:176 plugins/ktcore/folder/Rename.php:105 +msgid "A folder with that name already exists." +msgstr "" + +#: plugins/ktcore/KTAssist.php:59 +msgid "A full description of the assistance that you with to receive. Provide all necessary information to assist in your request." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:127 +#: plugins/ktcore/admin/documentFieldsv2.php:365 +#: plugins/multiselect/InetdocumentFieldsv2.php:147 +#: plugins/multiselect/InetdocumentFieldsv2.php:430 +msgid "A generic fieldset is one that is available for every document by default. These fieldsets will be available for users to edit and add for every document in the document management system." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:124 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:250 +#: plugins/multiselect/inetbasic.inc.php:187 +#: plugins/multiselect/inetbasic.inc.php:349 +#: plugins/multiselect/inetbasic.inc.php:403 +msgid "A good description can be the difference between useful metadata and poor metadata. At the same time, overly long descriptions are far less valuable than concise ones." +msgstr "" + +#: i18n/templates.c:143 +msgid "A list of existing alerts for this document" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:431 +msgid "A message for those who receive the document" +msgstr "" + +#: i18n/templates.c:4541 +msgid "A newer version of this document is available. Would you like to open it instead?" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:264 +msgid "A non-numeric value was given" +msgstr "" + +#: plugins/ktcore/KTAssist.php:58 +msgid "A one-line description introducing the assistance that you wish to receive" +msgstr "" + +#: i18n/templates.c:7661 +msgid "A particular workflow state can override some, all, or none of the permissions that would normally apply to a document. In this way you can (for example) let the folder's permissions decide who can see the document (with Read permissions), while having the workflow restrict access to the \"edit\" permission." +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:174 +msgid "A problem occured while loading the property preview." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:528 +#: plugins/ktstandard/KTDocumentLinks.php:557 +msgid "A short brief description of the relationship implied by this link type." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:127 +#: plugins/ktcore/admin/groupManagement.php:554 +msgid "A short name for the group. e.g. administrators." +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:82 +#: plugins/ktcore/admin/unitManagement.php:139 +#: plugins/ktcore/admin/unitManagement.php:190 +msgid "A short name for the unit. e.g. Accounting." +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:54 +msgid "A short name that is shown to users whenever permissions must be assigned." +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:58 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:84 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:137 +msgid "A short name which helps identify this source of authentication data." +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:67 +#: plugins/ktcore/admin/documentTypes.php:63 +msgid "A short, human-readable name for the document type." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:527 +#: plugins/ktstandard/KTDocumentLinks.php:556 +msgid "A short, human-readable name for the link type." +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:68 +#: plugins/ktcore/admin/roleManagement.php:74 +msgid "A short, human-readable name for the role." +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:102 +#: plugins/ktcore/admin/unitManagement.php:167 +#: plugins/ktcore/admin/unitManagement.php:208 +msgid "A unit with that name already exists." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:462 +#: plugins/ktcore/admin/userManagement.php:544 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:327 +msgid "A user with that username already exists" +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:452 +msgid "A verification email has been sent to your email address." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:158 +#: plugins/ktcore/admin/workflowsv2.php:226 +msgid "A workflow with that name already exists. Please choose a different name for this workflow." +msgstr "" + +#: search2/search/exprConstants.inc.php:65 +msgid "AND" +msgstr "" + +#: plugins/search2/openSearch.php:420 +msgid "API could not be authenticated" +msgstr "" + +#: about.php:53 config/siteMap.inc:75 lib/templating/kt3template.inc.php:410 +msgid "About" +msgstr "" + +#: browse.php:171 lib/actions/folderaction.inc.php:156 +msgid "About this folder" +msgstr "" + +#: lib/browse/BrowseColumns.inc.php:70 +msgid "Abstract" +msgstr "" + +#: i18n/templates.c:1268 +msgid "Access to the DMS requires that the user be allocated one of the organisation's keys. You currently have #keys# licenses available." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1692 +#: plugins/ktcore/admin/workflowsv2.php:1912 i18n/templates.c:506 +#: i18n/templates.c:590 i18n/templates.c:683 i18n/templates.c:791 +#: i18n/templates.c:1013 i18n/templates.c:1025 i18n/templates.c:1340 +#: i18n/templates.c:2474 i18n/templates.c:3632 i18n/templates.c:7724 +msgid "Action" +msgstr "" + +#: i18n/templates.c:7709 +msgid "Action Restrictions" +msgstr "" + +#: lib/actions/bulkaction.php:622 +msgid "Action component not implemented" +msgstr "" + +#: lib/actions/bulkaction.php:642 +msgid "Action is disabled by workflow" +msgstr "" + +#: i18n/templates.c:440 +msgid "Action taken" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1922 +msgid "Action/Effect Type" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1542 i18n/templates.c:5078 +#: i18n/templates.c:8549 +msgid "Actions" +msgstr "" + +#: i18n/templates.c:7814 +msgid "Actions Allowed" +msgstr "" + +#: i18n/templates.c:7379 +msgid "Actions Overview" +msgstr "" + +#: i18n/templates.c:7958 +msgid "Actions allowed" +msgstr "" + +#: browse.php:176 lib/actions/folderaction.inc.php:161 +msgid "Actions on this folder" +msgstr "" + +#: i18n/templates.c:7364 +msgid "Actions which are checked on this page will not be available to users." +msgstr "" + +#: i18n/templates.c:8027 +msgid "Actions which are performed when the document follows the transition." +msgstr "" + +#: i18n/templates.c:7094 +msgid "Active" +msgstr "" + +#: plugins/ktstandard/KTLDAPAuthenticationPlugin.php:56 +msgid "ActiveDirectory Authentication" +msgstr "" + +#: plugins/ktstandard/ldap/activedirectoryauthenticationprovider.inc.php:52 +msgid "ActiveDirectory authentication provider" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:93 +#: plugins/multiselect/BulkImport.php:184 +#: plugins/multiselect/BulkUpload.php:209 +#: plugins/multiselect/addDocument.php:119 i18n/templates.c:2843 +#: i18n/templates.c:2888 i18n/templates.c:2933 i18n/templates.c:3155 +#: i18n/templates.c:3164 i18n/templates.c:3983 i18n/templates.c:4001 +#: i18n/templates.c:4103 i18n/templates.c:4493 i18n/templates.c:5726 +#: i18n/templates.c:8513 i18n/templates.c:8534 +msgid "Add" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1897 +msgid "Add Action" +msgstr "" + +#: i18n/templates.c:5927 +msgid "Add Column to View" +msgstr "" + +#: i18n/templates.c:4517 +msgid "Add Dashlet" +msgstr "" + +#: i18n/templates.c:4520 +msgid "Add Dashlets" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:54 +#: plugins/multiselect/addDocument.php:64 +msgid "Add Document" +msgstr "" + +#: i18n/templates.c:8444 +msgid "Add External Link" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:104 +#: plugins/multiselect/inetbasic.inc.php:167 +msgid "Add Field" +msgstr "" + +#: i18n/templates.c:3815 i18n/templates.c:3863 +msgid "Add Field to set" +msgstr "" + +#: plugins/ktcore/KTFolderActions.php:90 i18n/permissions.c:11 +#: i18n/templates.c:4790 +msgid "Add Folder" +msgstr "" + +#: i18n/templates.c:6152 +msgid "Add Group" +msgstr "" + +#: i18n/templates.c:8432 i18n/templates.c:8462 +msgid "Add Link" +msgstr "" + +#: i18n/templates.c:3320 +msgid "Add Link Type" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:353 +#: plugins/multiselect/inetbasic.inc.php:531 i18n/templates.c:1637 +#: i18n/templates.c:1640 i18n/templates.c:5312 i18n/templates.c:5315 +msgid "Add Lookup Values" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:354 +#: plugins/multiselect/inetbasic.inc.php:532 +msgid "Add Lookups" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:103 +#: plugins/multiselect/inetbasic.inc.php:166 i18n/templates.c:1352 +#: i18n/templates.c:1355 i18n/templates.c:5144 i18n/templates.c:5147 +#: i18n/templates.c:5393 i18n/templates.c:5396 +msgid "Add New Field" +msgstr "" + +#: i18n/templates.c:6146 +msgid "Add New Group" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:721 i18n/templates.c:7445 +#: i18n/templates.c:7448 +msgid "Add New States" +msgstr "" + +#: i18n/templates.c:5213 +msgid "Add New Subcategory to #category#" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1893 +msgid "Add New Transition Action" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1671 +msgid "Add New Transition Restriction" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:829 i18n/templates.c:7469 +#: i18n/templates.c:7472 +msgid "Add New Transitions" +msgstr "" + +#: i18n/templates.c:6332 +msgid "Add New Unit" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:122 +#: plugins/ktcore/admin/userManagement.php:185 +msgid "Add New User" +msgstr "" + +#: i18n/templates.c:872 +msgid "Add Quicklink" +msgstr "" + +#: i18n/templates.c:1790 +msgid "Add RSS feeds" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1675 +msgid "Add Restriction" +msgstr "" + +#: i18n/templates.c:4328 +msgid "Add Shortcut" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:722 +#: plugins/ktcore/admin/workflowsv2.php:752 +msgid "Add States" +msgstr "" + +#: i18n/templates.c:7397 +msgid "Add States to Workflow" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:830 +#: plugins/ktcore/admin/workflowsv2.php:859 +msgid "Add Transitions" +msgstr "" + +#: i18n/templates.c:7400 +msgid "Add Transitions to Workflow" +msgstr "" + +#: i18n/templates.c:6338 +msgid "Add Unit" +msgstr "" + +#: i18n/templates.c:5924 +msgid "Add a Column" +msgstr "" + +#: plugins/ktcore/KTFolderActions.php:76 +msgid "Add a Folder" +msgstr "" + +#: i18n/templates.c:6293 +msgid "Add a Role" +msgstr "" + +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:47 +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:92 +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:93 +msgid "Add a Shortcut" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:86 +#: plugins/ktcore/folder/addDocument.php:221 +#: plugins/multiselect/addDocument.php:112 +#: plugins/multiselect/addDocument.php:258 i18n/templates.c:3146 +#: i18n/templates.c:3149 +msgid "Add a document" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:223 +#: plugins/multiselect/addDocument.php:260 +msgid "Add a document to: " +msgstr "" + +#: plugins/ktcore/KTFolderActions.php:89 +msgid "Add a folder" +msgstr "" + +#: i18n/templates.c:2483 +msgid "Add a folder to" +msgstr "" + +#: i18n/templates.c:5999 +msgid "Add a group from an authentication source" +msgstr "" + +#: i18n/templates.c:3314 +msgid "Add a link type" +msgstr "" + +#: i18n/templates.c:35 i18n/templates.c:128 +msgid "Add a message for this alert" +msgstr "" + +#: i18n/templates.c:2762 +msgid "Add a new authentication source" +msgstr "" + +#: i18n/templates.c:4094 +msgid "Add a new dynamic permission" +msgstr "" + +#: i18n/templates.c:3920 i18n/templates.c:5675 i18n/templates.c:5834 +msgid "Add a new field" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:617 i18n/templates.c:5993 +#: i18n/templates.c:6155 +msgid "Add a new group" +msgstr "" + +#: i18n/templates.c:8405 i18n/templates.c:8408 i18n/templates.c:8411 +msgid "Add a new link" +msgstr "" + +#: i18n/templates.c:2729 +msgid "Add a new source" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:78 +#: plugins/ktcore/admin/unitManagement.php:79 +#: plugins/ktcore/admin/unitManagement.php:94 +#: plugins/ktcore/admin/unitManagement.php:95 i18n/templates.c:6023 +#: i18n/templates.c:6041 i18n/templates.c:6341 +msgid "Add a new unit" +msgstr "" + +#: i18n/templates.c:6395 i18n/templates.c:6398 +msgid "Add a new user" +msgstr "" + +#: i18n/templates.c:6056 +msgid "Add a user" +msgstr "" + +#: i18n/templates.c:6401 +msgid "Add a user from an authentication source" +msgstr "" + +#: i18n/templates.c:38 +msgid "Add alert comment here ..." +msgstr "" + +#: i18n/templates.c:98 +msgid "Add an Alert on this Document" +msgstr "" + +#: i18n/templates.c:2726 +msgid "Add an authentication source" +msgstr "" + +#: i18n/templates.c:8414 +msgid "Add an external link" +msgstr "" + +#: i18n/templates.c:1619 i18n/templates.c:2846 i18n/templates.c:6818 +msgid "Add another set of criteria" +msgstr "" + +#: i18n/templates.c:2759 +msgid "Add authentication source" +msgstr "" + +#: i18n/templates.c:3938 i18n/templates.c:5693 i18n/templates.c:5840 +msgid "Add field" +msgstr "" + +#: i18n/templates.c:6005 i18n/templates.c:6407 +msgid "Add from source" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:126 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:127 +msgid "Add new alert" +msgstr "" + +#: i18n/templates.c:1271 +msgid "Add new key" +msgstr "" + +#: i18n/templates.c:6389 +msgid "Add new users" +msgstr "" + +#: i18n/templates.c:5723 +msgid "Add new values" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:265 +msgid "Add or remove groups from the system." +msgstr "" + +#: plugins/commercial/wintools/BaobabPlugin.php:88 +msgid "Add or remove keys, and review their expiry dates." +msgstr "" + +#: i18n/templates.c:4298 +msgid "Add or remove users for this role." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:262 +msgid "Add or remove users from the system." +msgstr "" + +#: i18n/templates.c:4334 +msgid "Add shortcut" +msgstr "" + +#: i18n/templates.c:3824 i18n/templates.c:3833 i18n/templates.c:3872 +#: i18n/templates.c:3881 +msgid "Add to Fieldset" +msgstr "" + +#: i18n/templates.c:62 +msgid "Add to assigned entities" +msgstr "" + +#: i18n/templates.c:5237 +msgid "Add to category" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:372 +#: plugins/ktcore/admin/groupManagement.php:527 +msgid "Added" +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:141 +msgid "Added Entry" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:601 +msgid "Added dynamic permissions" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:659 +msgid "Added to groups" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:403 +msgid "Added users" +msgstr "" + +#: i18n/templates.c:5204 +msgid "Additional Information" +msgstr "" + +#: i18n/templates.c:3158 +msgid "Additional Information about this Document" +msgstr "" + +#: i18n/templates.c:4898 +msgid "Adds your open Office document to KnowledgeTree, and closes the document in Office. You must have 'write' permissions on the folder." +msgstr "" + +#: i18n/templates.c:4787 +msgid "Adds your open Office document to KnowledgeTree. You must have 'write' permissions on the folder." +msgstr "" + +#: i18n/templates.c:4826 +msgid "Adds your open document as a new version of the KnowledgeTree document selected in the tree." +msgstr "" + +#: admin.php:52 admin.php:79 admin.php:116 admin.php:148 config/siteMap.inc:62 +#: lib/dispatcher.inc.php:526 lib/templating/kt3template.inc.php:161 +#: lib/templating/kt3template.inc.php:305 +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:270 +#: plugins/ktcore/KTPortlets.php:171 +msgid "Administration" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerDashlet.php:181 +msgid "Administration page" +msgstr "" + +#: plugins/search2/ExternalDashlet.php:77 +#: plugins/search2/ExternalDashlet.php:78 +#: plugins/search2/IndexingStatusDashlet.php:88 +msgid "Administrator Guide" +msgstr "" + +#: plugins/ktcore/KTPortlets.php:124 +msgid "Administrator mode" +msgstr "" + +#: browse.php:426 browse.php:431 browse.php:433 +msgid "Administrator mode disabled" +msgstr "" + +#: browse.php:385 browse.php:390 browse.php:392 +msgid "Administrator mode enabled" +msgstr "" + +#: i18n/templates.c:2345 +msgid "Administrator mode is
enabled." +msgstr "" + +#: i18n/templates.c:2357 +msgid "Administrator mode is
not currently enabled." +msgstr "" + +#: i18n/templates.c:6851 +msgid "Advanced Query" +msgstr "" + +#: config/siteMap.inc:65 search/booleanSearch.php:67 +#: search/booleanSearch.php:251 search2.php:713 search2.php:714 +#: i18n/templates.c:1562 i18n/templates.c:2381 i18n/templates.c:2411 +#: i18n/templates.c:6761 i18n/templates.c:6830 i18n/templates.c:7022 +#: i18n/templates.c:7187 i18n/templates.c:8582 +msgid "Advanced Search" +msgstr "" + +#: i18n/templates.c:6935 +msgid "Affected file formats" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:115 +msgid "Al fields must be assigned to an order in the conditional system. To correct this, please use the \"manage field ordering\" link below. This fieldset will display as a normal, non-conditional fieldset until this problem is corrected." +msgstr "" + +#: i18n/templates.c:104 +msgid "Alert" +msgstr "" + +#: i18n/templates.c:125 +msgid "Alert Message" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:288 +msgid "Alert Triggered for " +msgstr "" + +#: plugins/commercial/alerts/alerts.php:611 +#, php-format +msgid "Alert cannot be found: %s" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:484 +msgid "Alert cleared." +msgstr "" + +#: plugins/commercial/alerts/alerts.php:692 +msgid "Alert created" +msgstr "" + +#: i18n/templates.c:14 +msgid "Alert date" +msgstr "" + +#: i18n/templates.c:107 +msgid "Alert in" +msgstr "" + +#: i18n/templates.c:32 +msgid "Alert message" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:683 +msgid "Alert modified" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:342 +msgid "Alert notification cleared." +msgstr "" + +#: i18n/templates.c:122 +msgid "Alert on" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:270 +msgid "Alert triggered" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:583 +#: plugins/commercial/alerts/alerts.php:798 +msgid "Alerts" +msgstr "" + +#: plugins/commercial/alerts/alertPlugin.php:48 i18n/templates.c:197 +msgid "Alerts by Document Types" +msgstr "" + +#: i18n/templates.c:473 i18n/templates.c:557 i18n/templates.c:650 +#: i18n/templates.c:758 +msgid "All Actions" +msgstr "" + +#: i18n/templates.c:6908 +msgid "All Services are running normally" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:497 +msgid "All document types" +msgstr "" + +#: search2/indexing/bin/recreateIndex.php:105 +msgid "All documents are scheduled for indexing." +msgstr "" + +#: plugins/search2/FolderIndexAction.php:52 +#, php-format +msgid "All documents under the folder '%s' have been scheduled for indexing." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:849 +msgid "All done..." +msgstr "" + +#: i18n/templates.c:4916 +msgid "All error reports are submitted anonymously.rnrnTo help us resolve this error, please use this comment box to provide a brief description of the task you were performing when this error occurred." +msgstr "" + +#: i18n/templates.c:3035 +msgid "All indexers claim to be working correctly." +msgstr "" + +#: i18n/templates.c:7676 +msgid "All of these must allow the user to perform the transition." +msgstr "" + +#: i18n/templates.c:3401 i18n/templates.c:3419 +msgid "All paths are relative to your Documents directory." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1170 +msgid "All references will be changed, including on old documents." +msgstr "" + +#: i18n/templates.c:1739 i18n/templates.c:2456 i18n/templates.c:5027 +#: i18n/templates.c:5972 +msgid "All rights reserved." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:228 +#: plugins/multiselect/InetdocumentFieldsv2.php:264 +msgid "All types use this generic fieldset." +msgstr "" + +#: i18n/templates.c:7055 +msgid "All users" +msgstr "" + +#: i18n/templates.c:4271 +msgid "Allocate Groups" +msgstr "" + +#: i18n/templates.c:4265 +msgid "Allocate Groups to Role: #rolename#" +msgstr "" + +#: i18n/templates.c:1154 +msgid "Allocate Key" +msgstr "" + +#: plugins/commercial/wintools/baobabUserManagement.php:44 +#: plugins/commercial/wintools/baobabUserManagement.php:83 +msgid "Allocate Keys" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1388 +msgid "Allocate Permissions" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:297 plugins/ktcore/KTPermissions.php:301 +#: plugins/ktcore/KTPermissions.php:302 +msgid "Allocate Roles" +msgstr "" + +#: i18n/templates.c:4202 +msgid "Allocate Roles for" +msgstr "" + +#: i18n/templates.c:4295 i18n/templates.c:4301 +msgid "Allocate User to Role" +msgstr "" + +#: i18n/templates.c:7625 i18n/templates.c:7628 +msgid "Allocate permissions" +msgstr "" + +#: i18n/templates.c:4217 +msgid "Allocated users" +msgstr "" + +#: i18n/templates.c:2672 +msgid "Allocated users and groups" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:747 plugins/ktcore/KTPermissions.php:802 +msgid "Allocation changed." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:439 +msgid "Allow for multiple users to be selected to be added (will not get to manually verify the details if selected)" +msgstr "" + +#: i18n/templates.c:3503 i18n/templates.c:3512 i18n/templates.c:3521 +#: i18n/templates.c:3614 i18n/templates.c:4088 i18n/templates.c:4136 +#: i18n/templates.c:4145 i18n/templates.c:4154 i18n/templates.c:4196 +#: i18n/templates.c:4379 i18n/templates.c:4388 i18n/templates.c:4397 +#: i18n/templates.c:4412 +msgid "Allowed" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:391 +msgid "Allows you to specify the columns that are to be used by a particular view (e.g. Browse documents, Search)" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:166 +msgid "Already checked out." +msgstr "" + +#: plugins/ktcore/KTPermissions.php:511 +msgid "Already using a different descriptor." +msgstr "" + +#: i18n/templates.c:6920 +msgid "Also affects" +msgstr "" + +#: i18n/templates.c:6008 +msgid "Alternatively, you can manually create a user within #appname# below." +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:588 +msgid "An alert on the document \"" +msgstr "" + +#: i18n/templates.c:152 +msgid "An alert on the document \"#object_name#\" has been added or modified" +msgstr "" + +#: i18n/templates.c:80 +msgid "An alert was triggered on the following document" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:273 +msgid "An alert was triggered on the following document: " +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:177 +msgid "An authentication source with that name already exists" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:220 +#: lib/validation/dispatchervalidation.inc.php:239 +msgid "An empty string was given" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:259 +msgid "An empty value was given" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:432 +#, php-format +msgid "An entity with that name already exists: class %s, name %s" +msgstr "" + +#: lib/widgets/forms.inc.php:559 +msgid "An error occured, and no error handlers were configured." +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:367 +#, php-format +msgid "An error occurred generating the PDF - please contact the system administrator. %s" +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:308 +msgid "An error occurred generating the PDF - please contact the system administrator. Python binary not found." +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:374 +msgid "An error occurred generating the PDF - please contact the system administrator. The path to the document did not exist." +msgstr "" + +#: lib/groups/Group.inc:332 +msgid "An error occurred while removing the sub-group." +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:455 +#: plugins/passwordResetPlugin/loginResetDispatcher.php:511 +msgid "An error occurred while sending the email, please try again or contact the System Administrator." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:473 +#: lib/documentmanagement/documentutil.inc.php:1353 +msgid "An error occurred while storing the new file" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:114 +#: lib/documentmanagement/documentutil.inc.php:501 +#: lib/documentmanagement/documentutil.inc.php:1376 +msgid "An error occurred while storing this document in the database" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:800 +msgid "An error occurred while trying to check in the document" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:129 +msgid "An error occurred, and no error message was given" +msgstr "" + +#: i18n/templates.c:8123 +msgid "An important part of workflow is controlling which actions are available to users at various stages. For example, it may be necessary to prevent the \"Edit Metadata\" action from being used when a document is \"published\". Doing this is a two step process: first, you need to specify that \"Edit Metadata\" is an action you wish to control within this workflow; second, you need to specify that the action is not to be made available when documents are in the \"published\" state." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:288 +msgid "An internal error occurred receiving the uploaded document" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:437 +msgid "An invalid group was selected" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:416 +msgid "An item with this name already exists" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:172 +msgid "An unexpected error has occured." +msgstr "" + +#: lib/session/Session.inc:267 thirdparty/pear/PEAR.php:883 +msgid "Anonymous logins are no longer allowed by the system administrator. Please login." +msgstr "" + +#: ktapi/KTAPISession.inc.php:510 +msgid "Anonymous user not allowed" +msgstr "" + +#: i18n/templates.c:1823 i18n/templates.c:1832 +msgid "Another way of quickly accessing an RSS feed for a document or folder is by using the RSS icon #linkIcon#, which you will find in your actions portlet on the left." +msgstr "" + +#: search2/search/fields/AnyMetadataField.inc.php:51 +msgid "Any Metadata" +msgstr "" + +#: i18n/templates.c:4754 +msgid "Any unsaved changes will be lost! Are you sure you want to continue?" +msgstr "" + +#: i18n/templates.c:7679 i18n/templates.c:8012 +msgid "Anybody (with the ability to see the document) can perform this transition." +msgstr "" + +#: i18n/templates.c:8654 +msgid "Apply" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:809 plugins/ktcore/KTBulkActions.php:819 +#: plugins/ktcore/KTDocumentActions.php:1617 +msgid "Archive" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1635 +#: plugins/ktcore/KTDocumentActions.php:1646 +#: plugins/ktcore/KTDocumentActions.php:1650 +#: plugins/ktcore/KTDocumentActions.php:1709 i18n/templates.c:2489 +#: i18n/templates.c:2495 +msgid "Archive Document" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:818 +msgid "Archive Items" +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:80 +#: plugins/multiselect/BulkUpload.php:176 +msgid "Archive file" +msgstr "" + +#: lib/import/zipimportstorage.inc.php:114 +msgid "Archive file given does not exist" +msgstr "" + +#: lib/documentmanagement/Document.inc:744 +msgid "Archived" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:308 +msgid "Archived Document Restoration" +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:71 +#: plugins/ktcore/admin/archivedDocuments.php:134 i18n/templates.c:3167 +msgid "Archived Documents" +msgstr "" + +#: view.php:470 +msgid "Archived document request" +msgstr "" + +#: i18n/templates.c:2492 +msgid "Archiving a document changes the document's state to invisible to non-administrative users. Only an Administrator may unarchive a document. Please note that this is a non-permanent change and does not delete the document from the repository." +msgstr "" + +#: i18n/templates.c:4769 +msgid "Are you sure you want to cancel your edit?" +msgstr "" + +#: i18n/templates.c:1328 +msgid "Are you sure you want to clear" +msgstr "" + +#: search2/indexing/bin/recreateIndex.php:86 +#: search2/indexing/bin/shutdown.php:75 +msgid "Are you sure you want to do this? Add 'positive' as a parameter to continue." +msgstr "" + +#: i18n/templates.c:407 +msgid "Are you sure you want to restore your document to it's previous state?" +msgstr "" + +#: i18n/templates.c:3068 i18n/templates.c:3074 +msgid "Are you sure you wish to clear all notifications?" +msgstr "" + +#: i18n/templates.c:2102 i18n/templates.c:2156 i18n/templates.c:2177 +#: i18n/templates.c:2192 i18n/templates.c:2213 i18n/templates.c:2219 +#: i18n/templates.c:2258 i18n/templates.c:2282 i18n/templates.c:2303 +#: i18n/templates.c:2315 i18n/templates.c:2327 i18n/templates.c:2336 +#: i18n/templates.c:2693 i18n/templates.c:2696 i18n/templates.c:2717 +#: i18n/templates.c:2720 +msgid "Are you sure you wish to clear the notification?" +msgstr "" + +#: i18n/templates.c:3791 +msgid "Are you sure you wish to delete this document type? It will be permanently removed from the system." +msgstr "" + +#: lib/templating/kt3template.inc.php:141 +msgid "Are you sure you wish to delete this item?" +msgstr "" + +#: i18n/templates.c:3782 +msgid "Are you sure you wish to disable this document type?" +msgstr "" + +#: i18n/templates.c:4361 +msgid "Are you sure you wish to override the permissions?" +msgstr "" + +#: i18n/templates.c:4043 +msgid "Are you sure you wish to reinstate inherited permissions?" +msgstr "" + +#: i18n/templates.c:4253 +msgid "Are you sure you wish to remove this role allocation?" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:191 plugins/ktcore/KTBulkActions.php:961 +#: plugins/ktcore/KTDocumentActions.php:1014 +#: plugins/ktcore/KTDocumentActions.php:1630 +#: plugins/ktstandard/ImmutableActionPlugin.php:99 +msgid "Are you sure?" +msgstr "" + +#: i18n/templates.c:7553 +msgid "As a document moves through a workflow, it can cause varies other actions to occur. For example, you can attach a \"Move\" action to a transition, which will cause any document moving through that workflow to be moved to a particular folder. Or you can specify that when a document reaches the \"Pending Review\" state, users with the role \"Reviewer\" on that document are informed." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:164 +#: plugins/ktcore/admin/userManagement.php:226 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:301 +msgid "As a safety precaution, it is useful to limit the number of times a given account can log in, before logging out. This prevents a single account being used by many different people." +msgstr "" + +#: i18n/templates.c:5219 +msgid "As an example, if you are creating a tree of the countries in the world, the actual countries would be keywords (e.g. South Africa, England, Pakistan, India, etc.). The highest group of categories would be continents — e.g. Africa, Europe, Asia, The Americas — followed by subcategories that contain actual countries — e.g. Western Europe, Sub-Saharan Africa, Australasia." +msgstr "" + +#: i18n/templates.c:7793 i18n/templates.c:7904 i18n/templates.c:8150 +msgid "As documents move through their lifecycle, they are placed in certain states. For example, an invoice which has been mailed might be in the \"Pending\" state after the \"sent\" transition has been performed by a user." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:731 +msgid "As documents progress through their lifecycle, they pass through a number of states. These states describe a step in the process the document must follow. Examples of states include \"reviewed\",\"submitted\" or \"pending\". Note that the first state you list is the one in which documents will start the workflow - this can be changed later on." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:85 +msgid "As documents progress through their lifecycle, they pass through a number of states. These states describe a step in the process the document must follow. Examples of states include \"reviewed\",\"submitted\" or \"pending\". Please enter a list of states, one per line. State names must be unique." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:960 +msgid "As documents progress through their lifecycle, they pass through a number of states. These states describe a step in the process the document must follow. Examples of states include \"reviewed\",\"submitted\" or \"pending\". State names must be unique, and this includes states already in this workflow." +msgstr "" + +#: i18n/templates.c:1220 i18n/templates.c:3725 +msgid "Assign" +msgstr "" + +#: i18n/templates.c:8135 +msgid "Assign Actions to States" +msgstr "" + +#: i18n/templates.c:7367 +msgid "Assign Blocked Actions" +msgstr "" + +#: i18n/templates.c:8219 +msgid "Assign Transition Availability" +msgstr "" + +#: i18n/templates.c:8627 +msgid "Assign Workflow" +msgstr "" + +#: i18n/templates.c:7361 +msgid "Assign blocked actions" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:246 +msgid "Assign permissions to users and groups, and specify which permissions are required to interact with various parts of the Document Management System." +msgstr "" + +#: i18n/templates.c:5504 +msgid "Assign to behaviour" +msgstr "" + +#: i18n/templates.c:1937 i18n/templates.c:4427 +msgid "Assigned" +msgstr "" + +#: i18n/templates.c:68 i18n/templates.c:4055 i18n/templates.c:7409 +msgid "Assigned Entities" +msgstr "" + +#: i18n/templates.c:5492 +msgid "Assigned Items" +msgstr "" + +#: i18n/templates.c:7931 +msgid "Assigned Permissions" +msgstr "" + +#: plugins/ktcore/KTAssist.php:241 +msgid "Assistance Request cleared." +msgstr "" + +#: plugins/ktcore/KTAssist.php:177 +#, php-format +msgid "Assistance request: %s" +msgstr "" + +#: i18n/templates.c:1190 i18n/templates.c:1193 i18n/templates.c:3695 +#: i18n/templates.c:3698 +msgid "Associate Fieldsets" +msgstr "" + +#: i18n/templates.c:1247 i18n/templates.c:3752 +msgid "Associated Fieldsets" +msgstr "" + +#: i18n/templates.c:4463 +msgid "Assuming this field has behaviour \"" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:419 +msgid "Attach document" +msgstr "" + +#: i18n/templates.c:5231 +msgid "Attach keywords to #category#" +msgstr "" + +#: search2/indexing/indexers/PHPLuceneIndexer.inc.php:126 +#: search2/indexing/indexers/PHPLuceneIndexer.inc.php:150 +#, php-format +msgid "Attempting to index %d %s but it is not available." +msgstr "" + +#: i18n/templates.c:398 +msgid "Authenticating signature, please wait" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:123 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:50 +#: i18n/templates.c:6137 +msgid "Authentication" +msgstr "" + +#: i18n/templates.c:2732 i18n/templates.c:2753 +msgid "Authentication Sources" +msgstr "" + +#: plugins/commercial/electronic-signatures/Esignature.inc.php:220 +msgid "Authentication failed. Please check your username and password and try again." +msgstr "" + +#: plugins/commercial/electronic-signatures/Esignature.inc.php:338 +msgid "Authentication failed. The username does not match the currently logged in user." +msgstr "" + +#: login.php:276 plugins/passwordResetPlugin/loginResetDispatcher.php:225 +msgid "Authentication failure. Please try again." +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:67 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:93 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:146 +msgid "Authentication provider" +msgstr "" + +#: lib/authentication/authenticationproviderregistry.inc.php:93 +#, php-format +msgid "Authentication provider class does not exist. %s " +msgstr "" + +#: i18n/templates.c:2771 +msgid "Authentication source" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:226 +msgid "Authentication source deleted" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:229 +msgid "Authentication source is still in use, not deleted" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:110 +#, php-format +msgid "Authentication source: %s" +msgstr "" + +#: plugins/rssplugin/KTrss.inc.php:399 +msgid "Author" +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:144 +msgid "Automatic Workflow" +msgstr "" + +#: plugins/ktstandard/KTWorkflowAssociation.php:69 +#: plugins/ktstandard/workflow/adminpage.php:54 +msgid "Automatic Workflow Assignments" +msgstr "" + +#: i18n/templates.c:8603 +msgid "Automatic Workflow Selection" +msgstr "" + +#: i18n/templates.c:1319 i18n/templates.c:1934 i18n/templates.c:4424 +msgid "Available" +msgstr "" + +#: i18n/templates.c:1598 i18n/templates.c:6797 +msgid "Available Criteria" +msgstr "" + +#: i18n/templates.c:47 i18n/templates.c:4052 i18n/templates.c:7406 +msgid "Available Entities" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:248 +#: plugins/ktcore/admin/documentTypes.php:173 i18n/templates.c:1601 +#: i18n/templates.c:6800 +msgid "Available Fieldsets" +msgstr "" + +#: i18n/templates.c:4277 +msgid "Available Groups" +msgstr "" + +#: i18n/templates.c:3662 +msgid "Available Transitions" +msgstr "" + +#: i18n/templates.c:4310 +msgid "Available Users" +msgstr "" + +#: i18n/templates.c:1604 i18n/templates.c:6803 +msgid "Available Workflows" +msgstr "" + +#: lib/util/ktutil.inc:280 +msgid "B" +msgstr "" + +#: i18n/templates.c:1703 +msgid "Back" +msgstr "" + +#: i18n/templates.c:1223 i18n/templates.c:3728 +msgid "Back to folder" +msgstr "" + +#: lib/browse/advancedcolumns.inc.php:20 +msgid "Base Column" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:55 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:163 +msgid "Base DN" +msgstr "" + +#: lib/workflow/workflowtrigger.inc.php:62 +msgid "Base class for workflow triggers" +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:177 +msgid "Base file could not be copied to tmp directory for comparison." +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:502 +msgid "Basic" +msgstr "" + +#: i18n/templates.c:5804 +msgid "Become conditional" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:534 +msgid "Behaviour Overview" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:638 +msgid "Behaviour names changed." +msgstr "" + +#: i18n/templates.c:1277 +msgid "Below you can see a list of the keys that are currently active for your organisation." +msgstr "" + +#: i18n/templates.c:7373 +msgid "Block actions" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:138 +#: plugins/ktstandard/KTDiscussion.php:263 +msgid "Body" +msgstr "" + +#: config/siteMap.inc:66 i18n/templates.c:2810 i18n/templates.c:2852 +#: i18n/templates.c:2897 +msgid "Boolean Search" +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:155 +msgid "Both names not given" +msgstr "" + +#: browse.php:83 browse.php:136 lib/actions/bulkaction.php:90 +#: lib/actions/documentaction.inc.php:86 lib/actions/folderaction.inc.php:62 +#: search/booleanSearch.php:61 search/simpleSearch.php:141 view.php:72 +msgid "Browse" +msgstr "" + +#: lib/templating/kt3template.inc.php:160 +#: lib/templating/kt3template.inc.php:312 plugins/ktcore/KTCorePlugin.php:154 +msgid "Browse Documents" +msgstr "" + +#: plugins/ktcore/KTPortlets.php:86 +msgid "Browse by..." +msgstr "" + +#: i18n/templates.c:2438 +msgid "Browse view format" +msgstr "" + +#: plugins/ktstandard/contents/OpenDocumentIndexer.php:98 +#: i18n/templates.c:5135 +msgid "Built-in" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:47 +msgid "Built-in authentication provider" +msgstr "" + +#: i18n/templates.c:5048 +msgid "Built-in set." +msgstr "" + +#: lib/actions/bulkaction.php:285 +msgid "Bulk Actions" +msgstr "" + +#: plugins/ktstandard/KTBulkExportPlugin.php:70 +msgid "Bulk Download" +msgstr "" + +#: i18n/transactions.c:19 +msgid "Bulk Export" +msgstr "" + +#: plugins/ktstandard/KTBulkExportPlugin.php:53 +msgid "Bulk Export Plugin" +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:56 +#: plugins/multiselect/BulkUpload.php:78 +#: plugins/multiselect/BulkUpload.php:154 +msgid "Bulk Upload" +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:158 +#: plugins/multiselect/BulkUpload.php:390 +msgid "Bulk Upload failed" +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:149 +#, php-format +msgid "Bulk Upload failed. Archive is not an accepted format. Accepted formats are: %s" +msgstr "" + +#: plugins/multiselect/BulkUpload.php:372 +#, php-format +msgid "Bulk Upload failed. Archive is not an accepted format. Accepted formats are: .%s" +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:161 +#: plugins/multiselect/BulkUpload.php:393 +msgid "Bulk Upload successful" +msgstr "" + +#: plugins/commercial/electronic-signatures/Esignature.inc.php:210 +msgid "Bulk action in folder" +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:159 +#: plugins/multiselect/BulkImport.php:374 +msgid "Bulk import failed" +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:162 +#: plugins/multiselect/BulkImport.php:377 +msgid "Bulk import succeeded" +msgstr "" + +#: i18n/templates.c:3992 +msgid "Bulk upload" +msgstr "" + +#: i18n/templates.c:2756 +msgid "By default, #appname# controls its own users and groups and stores all information about them inside the database. In many situations, an organisation will already have a list of users and groups, and needs to use that existing information to allow access to the DMS. These Authentication Sources allow the system administrator to specify additional sources of authentication data." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:123 +#, php-format +msgid "By default, %s controls its own users and groups and stores all information about them inside the database. In many situations, an organisation will already have a list of users and groups, and needs to use that existing information to allow access to the DMS. These Authentication Sources allow the system administrator to specify additional sources of authentication data." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:420 +msgid "By default, documents are sent as links into the document management system. Select this option if you want the document contents to be sent as an attachment in the email." +msgstr "" + +#: search2/bin/cronIndexStats.php:48 +msgid "Cache index stats and diagnostics" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:81 +msgid "Can not add user: can not determine number of current users." +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:78 +msgid "Can not add user: can not determine number of licenses available." +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:90 +msgid "Can not add user: insufficient licenses." +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:226 +msgid "Can not use the same password as before." +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:162 +msgid "Can't delete built-in permission" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1536 +msgid "Can't delete version: content is the same as the current document content." +msgstr "" + +#: lib/authentication/interceptorregistry.inc.php:78 +#, php-format +msgid "Can't find interceptor: %s" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:476 +#: plugins/multiselect/inetbasic.inc.php:668 i18n/templates.c:74 +#: i18n/templates.c:137 i18n/templates.c:395 i18n/templates.c:413 +#: i18n/templates.c:854 i18n/templates.c:920 i18n/templates.c:1724 +#: i18n/templates.c:1754 i18n/templates.c:1784 i18n/templates.c:1904 +#: i18n/templates.c:2567 i18n/templates.c:2579 i18n/templates.c:2636 +#: i18n/templates.c:2657 i18n/templates.c:3305 i18n/templates.c:4025 +#: i18n/templates.c:4070 i18n/templates.c:4118 i18n/templates.c:4292 +#: i18n/templates.c:4325 i18n/templates.c:4418 i18n/templates.c:4652 +#: i18n/templates.c:5387 i18n/templates.c:6020 i18n/templates.c:6038 +#: i18n/templates.c:6053 i18n/templates.c:6068 i18n/templates.c:6083 +#: i18n/templates.c:6101 i18n/templates.c:6119 i18n/templates.c:6134 +#: i18n/templates.c:6218 i18n/templates.c:6233 i18n/templates.c:6305 +#: i18n/templates.c:6482 i18n/templates.c:6512 i18n/templates.c:7376 +#: i18n/templates.c:7424 i18n/templates.c:7655 i18n/templates.c:8477 +#: i18n/templates.c:8486 +msgid "Cancel" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:819 +#: plugins/ktcore/KTDocumentActions.php:873 +#: plugins/ktcore/KTDocumentActions.php:877 i18n/templates.c:2528 +msgid "Cancel Checkout" +msgstr "" + +#: i18n/templates.c:4847 +msgid "Cancel Edit" +msgstr "" + +#: i18n/templates.c:4595 +msgid "Cancel checkout failed" +msgstr "" + +#: i18n/templates.c:4601 +msgid "Cancel checkout succeeded" +msgstr "" + +#: i18n/templates.c:4625 +msgid "Cancelling edit of document (check-in)" +msgstr "" + +#: lib/workflow/workflowutil.inc.php:173 +msgid "Cannot assign workflow with no starting state set" +msgstr "" + +#: search2/search/search.inc.php:97 +#, php-format +msgid "Cannot connect to Open Office Server on host '%s:%s'." +msgstr "" + +#: plugins/pdfConverter/pdfConverter.php:96 +msgid "Cannot connect to Open Office Server." +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:86 +msgid "" +"Cannot connect to Open Office Server.\n" +"Please consult the Administrator Guide for more information on configuring Open Office Server." +msgstr "" + +#: search2/indexing/indexers/JavaXMLRPCLuceneIndexer.inc.php:234 +#, php-format +msgid "Cannot connect to the %s on '%s'." +msgstr "" + +#: search2/indexing/extractors/TikaApacheExtractor.inc.php:178 +#, php-format +msgid "Cannot connect to the Tika Extractor on '%s'." +msgstr "" + +#: plugins/ktcore/KTPermissions.php:542 +msgid "Cannot create allocation for non-root locations." +msgstr "" + +#: lib/documentmanagement/Document.inc:657 +msgid "Cannot create new version of document: Document is immutable" +msgstr "" + +#: notify.php:69 +msgid "Cannot find the notification you requested. Notification may already have been cleared." +msgstr "" + +#: search2/indexing/extractors/StarOfficeExtractor.inc.php:210 +msgid "Cannot locate DocumentConverter.py" +msgstr "" + +#: search2/indexing/extractorCore.inc.php:682 +#, php-format +msgid "Cannot locate binary for %s (%s)." +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:100 +#: search2/indexing/extractors/StarOfficeExtractor.inc.php:205 +msgid "Cannot locate python" +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:111 +msgid "Cannot locate python script DocumentCompare.py" +msgstr "" + +#: lib/triggers/triggerregistry.inc.php:83 +#, php-format +msgid "Cannot locate trigger class '%s' for action '%s' slot '%s'." +msgstr "" + +#: search2/indexing/extractors/OpenOfficeTextExtractor.inc.php:130 +#: search2/indexing/extractors/OpenXmlTextExtractor.inc.php:315 +#, php-format +msgid "Cannot locate unzip: %s." +msgstr "" + +#: search2/search/bin/search.php:108 +msgid "Cannot locate user:" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:134 +msgid "Cannot move folder into a descendant folder!" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:122 +msgid "Cannot move root folder!" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:356 +#, php-format +msgid "Cannot remove unit folder: %s." +msgstr "" + +#: search/booleanSearch.php:128 +msgid "Cannot save searches as anonymous user" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:676 +#: plugins/multiselect/inetbasic.inc.php:914 +msgid "Category added" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:681 +#: plugins/multiselect/inetbasic.inc.php:919 +msgid "Category removed." +msgstr "" + +#: i18n/templates.c:1172 i18n/templates.c:3677 i18n/templates.c:3908 +#: i18n/templates.c:5663 i18n/templates.c:5714 i18n/templates.c:5777 +msgid "Change" +msgstr "" + +#: i18n/templates.c:6470 i18n/templates.c:6476 +msgid "Change #name#'s Groups" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:61 +#, php-format +msgid "Change %s's password" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:2018 +#: plugins/ktcore/KTDocumentActions.php:2024 +msgid "Change Document Ownership" +msgstr "" + +#: plugins/ktcore/document/edit.php:331 plugins/ktcore/document/edit.php:371 +#: i18n/templates.c:3386 i18n/templates.c:3392 +msgid "Change Document Type" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:334 +#: plugins/multiselect/InetdocumentFieldsv2.php:399 +msgid "Change Fieldset Details" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:218 +msgid "Change Frequency" +msgstr "" + +#: i18n/templates.c:6092 +msgid "Change Group Details" +msgstr "" + +#: i18n/templates.c:3329 +msgid "Change Link Type" +msgstr "" + +#: i18n/templates.c:3593 +msgid "Change Ownership" +msgstr "" + +#: i18n/templates.c:6212 +msgid "Change Sub-Groups in #name#" +msgstr "" + +#: i18n/templates.c:6110 +msgid "Change Unit Details" +msgstr "" + +#: i18n/templates.c:6125 +msgid "Change User Details" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:70 +#: lib/authentication/builtinauthenticationprovider.inc.php:71 +#: plugins/ktcore/admin/userManagement.php:254 +msgid "Change User Password" +msgstr "" + +#: i18n/templates.c:6374 i18n/templates.c:6377 +msgid "Change User's Password" +msgstr "" + +#: i18n/templates.c:7889 +msgid "Change Workflow" +msgstr "" + +#: i18n/templates.c:6299 +msgid "Change a role's details" +msgstr "" + +#: plugins/ktstandard/KTDisclaimers.php:62 +msgid "Change disclaimers displayed on login and at the bottom of each page." +msgstr "" + +#: i18n/templates.c:5609 +msgid "Change master field" +msgstr "" + +#: i18n/templates.c:6257 +msgid "Change organisation details" +msgstr "" + +#: i18n/templates.c:8348 +msgid "Change state" +msgstr "" + +#: i18n/templates.c:1895 +msgid "Change the document type" +msgstr "" + +#: i18n/templates.c:3530 +msgid "Change the document type. The current type is \"#name#\"" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:379 +msgid "Change the help files that are displayed to users." +msgstr "" + +#: i18n/templates.c:887 +msgid "Change the order in which quicklinks are shown." +msgstr "" + +#: plugins/commercial/network/quicklinks/QuicklinksPlugin.php:52 +msgid "Change the quicklinks that are displayed on user's dashboards." +msgstr "" + +#: i18n/templates.c:8345 +msgid "Change the state of this thread" +msgstr "" + +#: i18n/templates.c:6089 +msgid "Change the system's information about group #name#" +msgstr "" + +#: i18n/templates.c:6107 +msgid "Change the system's information about unit #name#" +msgstr "" + +#: i18n/templates.c:6380 +msgid "Change the user's password. Password rules may have been defined that this new password must abide by." +msgstr "" + +#: i18n/templates.c:5585 +msgid "Change to complex" +msgstr "" + +#: i18n/templates.c:7880 +msgid "Change workflow on document" +msgstr "" + +#: preferences.php:123 i18n/templates.c:2741 i18n/templates.c:2744 +msgid "Change your password" +msgstr "" + +#: i18n/templates.c:6284 +msgid "Change your password." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:505 +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:518 +msgid "Changed to simple" +msgstr "" + +#: i18n/templates.c:5483 i18n/templates.c:5531 +msgid "Changes made here are stored immediately, without you needing to refresh the page." +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:293 +#: plugins/commercial/wintools/email/emailDocumentTypes.php:312 +#: plugins/ktcore/admin/documentTypes.php:219 +#: plugins/ktcore/admin/documentTypes.php:238 +msgid "Changes not saved" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:668 +#: plugins/multiselect/inetbasic.inc.php:906 +msgid "Changes saved." +msgstr "" + +#: i18n/templates.c:4880 +msgid "Changes the status of a KnowledgeTree document opened for viewing in Office to 'read only' so that you may edit the document in Office. You must have 'write' permissions." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:2055 +msgid "Changing Ownership" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:2025 +msgid "Changing document ownership allows you to keep the \"owner\" role relevant, even when the original user no longer is an appropriate choice." +msgstr "" + +#: i18n/templates.c:5588 +msgid "Changing the conditional type set will remove all existing field ordering!" +msgstr "" + +#: plugins/ktcore/document/edit.php:332 +msgid "Changing the document type will allow different metadata to be associated with it." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:307 +msgid "" +"Changing the master field set will remove all existing field\n" +"ordering!" +msgstr "" + +#: i18n/templates.c:5606 +msgid "Changing the master field set will remove all existing field ordering!" +msgstr "" + +#: i18n/transactions.c:7 +msgid "Check In" +msgstr "" + +#: i18n/transactions.c:8 +msgid "Check Out" +msgstr "" + +#: i18n/templates.c:5948 +msgid "Check the plugins that require activation and then click \"Update\". To disable a plugin, uncheck the plugin and click \"Update\"." +msgstr "" + +#: i18n/templates.c:476 i18n/templates.c:560 i18n/templates.c:653 +#: i18n/templates.c:761 +msgid "Check-ins/Check-outs" +msgstr "" + +#: search2/search/fields/CheckedOutField.inc.php:44 +msgid "Checked Out" +msgstr "" + +#: plugins/ktcore/KTColumns.inc.php:488 plugins/ktcore/KTCorePlugin.php:145 +#: search2/search/fields/CheckedOutByField.inc.php:44 +msgid "Checked Out By" +msgstr "" + +#: search2/search/fields/CheckedOutDeltaField.inc.php:46 +msgid "Checked Out Delta" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:304 +msgid "Checked Out Document Control" +msgstr "" + +#: i18n/templates.c:3179 +msgid "Checked Out Documents" +msgstr "" + +#: i18n/templates.c:3197 i18n/templates.c:3296 +msgid "Checked out by" +msgstr "" + +#: i18n/templates.c:7280 +msgid "Checked out by:" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:249 +msgid "Checked out by: " +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:588 +#: plugins/ktcore/KTDocumentActions.php:645 +#: plugins/ktcore/KTDocumentActions.php:748 +msgid "Checkin" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:593 +#: plugins/ktcore/KTDocumentActions.php:640 i18n/templates.c:2534 +msgid "Checkin Document" +msgstr "" + +#: i18n/templates.c:4577 +msgid "Checkin failed" +msgstr "" + +#: i18n/templates.c:4583 +msgid "Checkin succeeded" +msgstr "" + +#: i18n/templates.c:2537 +msgid "Checking in a document updates the document and allows others to make changes to the document and its metadata." +msgstr "" + +#: i18n/templates.c:2546 +msgid "Checking out a document reserves it for your exclusive use. This ensures that you can edit the document without anyone else changing the document and placing it into the document management system." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:836 +msgid "Checking permissions..." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1296 plugins/ktcore/KTBulkActions.php:1340 +#: plugins/ktcore/KTDocumentActions.php:403 +#: plugins/ktcore/KTDocumentActions.php:436 +msgid "Checkout" +msgstr "" + +#: i18n/templates.c:2543 i18n/templates.c:2549 +msgid "Checkout Document" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:653 +msgid "Checkout Guard" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1339 +msgid "Checkout Items" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:440 +msgid "Checkout document" +msgstr "" + +#: i18n/templates.c:4565 +msgid "Checkout failed" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:175 +#: plugins/ktcore/KTBulkActions.php:1319 plugins/ktcore/KTBulkActions.php:1629 +msgid "Checkout is restricted by the workflow state." +msgstr "" + +#: i18n/templates.c:4571 +msgid "Checkout succeeded" +msgstr "" + +#: i18n/templates.c:6044 +msgid "Choose unit folder location" +msgstr "" + +#: i18n/templates.c:6863 i18n/templates.c:8555 +msgid "Clear" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:615 +#: lib/subscriptions/subscriptions.inc.php:620 +#: lib/subscriptions/subscriptions.inc.php:627 +#: lib/subscriptions/subscriptions.inc.php:634 +#: lib/subscriptions/subscriptions.inc.php:639 +#: lib/subscriptions/subscriptions.inc.php:644 +#: lib/subscriptions/subscriptions.inc.php:651 +#: lib/subscriptions/subscriptions.inc.php:658 +#: lib/subscriptions/subscriptions.inc.php:665 +#: lib/subscriptions/subscriptions.inc.php:673 +#: lib/subscriptions/subscriptions.inc.php:681 +#: lib/subscriptions/subscriptions.inc.php:686 +#: lib/subscriptions/subscriptions.inc.php:693 +#: lib/subscriptions/subscriptions.inc.php:700 +#: lib/subscriptions/subscriptions.inc.php:707 +#: plugins/commercial/alerts/alerts.php:265 i18n/templates.c:167 +#: i18n/templates.c:2105 i18n/templates.c:2123 i18n/templates.c:2138 +#: i18n/templates.c:2159 i18n/templates.c:2180 i18n/templates.c:2195 +#: i18n/templates.c:2216 i18n/templates.c:2222 i18n/templates.c:2240 +#: i18n/templates.c:2261 i18n/templates.c:2285 i18n/templates.c:2306 +#: i18n/templates.c:2318 i18n/templates.c:2330 i18n/templates.c:2339 +#: i18n/templates.c:2699 i18n/templates.c:2723 i18n/templates.c:8231 +msgid "Clear Alert" +msgstr "" + +#: i18n/templates.c:92 i18n/templates.c:194 +msgid "Clear alert" +msgstr "" + +#: i18n/templates.c:3071 i18n/templates.c:3077 +msgid "Clear all notifications" +msgstr "" + +#: lib/dashboard/Notification.inc.php:340 +msgid "Cleared notification." +msgstr "" + +#: search2/indexing/bin/registerTypes.php:70 +msgid "Clearing mime type associations." +msgstr "" + +#: i18n/templates.c:8333 +msgid "Click below to view all discussion threads on this document, including those that are closed." +msgstr "" + +#: i18n/templates.c:1616 i18n/templates.c:6815 +msgid "Click on a field above to add it to the criteria group." +msgstr "" + +#: i18n/templates.c:8213 +msgid "Click on any transition below to edit it directly, or use the checkboxes to assign which states the transition is available from." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:248 plugins/ktstandard/KTEmail.php:313 +msgid "Click on the hyperlink below to view it." +msgstr "" + +#: i18n/templates.c:4955 +msgid "Click to enter" +msgstr "" + +#: i18n/templates.c:4964 +msgid "Click to select" +msgstr "" + +#: i18n/templates.c:5456 +msgid "Clicking on a given behaviour below will show you which fields and values can be selected when the clicked behaviour is active." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:362 +msgid "Client Tools" +msgstr "" + +#: plugins/commercial/clienttools/clientToolsPlugin.php:34 +msgid "Client Tools Plugin" +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:308 +#: plugins/ktcore/admin/configSettings.php:312 +msgid "Client Tools Settings" +msgstr "" + +#: plugins/commercial/electronic-signatures/KTElectronicSignatures.php:188 +msgid "Close" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:122 +msgid "Closed" +msgstr "" + +#: i18n/templates.c:4850 +msgid "Closes a KnowledgeTree document currently open in Office for editing. Your changes are not saved to KnowledgeTree." +msgstr "" + +#: i18n/templates.c:4892 +msgid "Closes the currently open document in Office and opens the currently stored version from KnowledgeTree in Office. Any changes you make to the document may be saved only to the local copy, or add the edited document to KnowledgeTree as a new document." +msgstr "" + +#: i18n/templates.c:4868 +msgid "Closes the currently open document in Office and opens the currently stored version from KnowledgeTree in Office. Any changes you make to the document may be saved only to the local copy, or add the edited document to KnowledgeTree as a new document." +msgstr "" + +#: i18n/templates.c:4901 +msgid "Closes the document currently open in Office. Any changes you made to the document are not saved to KnowledgeTree." +msgstr "" + +#: i18n/transactions.c:14 +msgid "Collaboration Step Approve" +msgstr "" + +#: i18n/transactions.c:9 +msgid "Collaboration Step Rollback" +msgstr "" + +#: i18n/templates.c:5249 i18n/templates.c:5846 +msgid "Collections of fields are associated into fieldsets. These represent a set of related information which can be associated with a document and thus comprise part of the document's metadata." +msgstr "" + +#: i18n/templates.c:5903 +msgid "Column" +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:86 +msgid "Columns" +msgstr "" + +#: search2/search/bin/search.php:92 +msgid "Command line search" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:276 plugins/ktstandard/KTEmail.php:430 +#: i18n/templates.c:83 i18n/templates.c:191 i18n/templates.c:386 +#: i18n/templates.c:515 i18n/templates.c:599 i18n/templates.c:692 +#: i18n/templates.c:800 i18n/templates.c:2480 i18n/templates.c:3641 +msgid "Comment" +msgstr "" + +#: i18n/templates.c:4661 +msgid "Comment Required" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:253 plugins/ktstandard/KTEmail.php:318 +#: i18n/templates.c:1016 i18n/templates.c:1028 +msgid "Comments" +msgstr "" + +#: plugins/commercial/i18n/japanese/JapanesePlugin.php:39 +msgid "Commercial Japanese translation plugin" +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:143 i18n/templates.c:1670 +#: i18n/templates.c:4997 +msgid "Community Edition" +msgstr "" + +#: i18n/templates.c:356 i18n/templates.c:368 i18n/templates.c:3464 +msgid "Compare" +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:184 +msgid "Compare file could not be copied to tmp directory for comparison." +msgstr "" + +#: i18n/templates.c:3554 +msgid "Compare with Current" +msgstr "" + +#: i18n/templates.c:3557 +msgid "Compare with Other Version" +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:218 +msgid "Comparison produced no content. The document may be an unsupported mime type." +msgstr "" + +#: i18n/templates.c:2576 +msgid "Complete Copy" +msgstr "" + +#: i18n/templates.c:5477 +msgid "Complex Conditional Metadata depends on what are called \"behaviours\". Essentially, behaviours are assigned to a single field, and can contain any number of values that are available in that field. Each field can have multiple behaviours assigned to it." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:121 i18n/templates.c:8354 +msgid "Conclusion" +msgstr "" + +#: i18n/templates.c:4082 i18n/templates.c:4100 i18n/templates.c:4409 +msgid "Condition" +msgstr "" + +#: i18n/templates.c:6530 +msgid "Condition Name" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:211 +msgid "Condition is a saved search, but not a condition" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:109 +#: plugins/multiselect/InetdocumentFieldsv2.php:129 i18n/templates.c:5786 +msgid "Conditional" +msgstr "" + +#: i18n/templates.c:5405 +msgid "Conditional Fieldset Management" +msgstr "" + +#: i18n/templates.c:5438 +msgid "Conditional Metadata Overview" +msgstr "" + +#: plugins/commercial/conditional-metadata/ConditionalMetadataPlugin.php:36 +msgid "Conditional Metadata Plugin" +msgstr "" + +#: i18n/templates.c:5441 +msgid "Conditional Metadata is made up of fields, values and behaviours. For a given behaviour, various values in other fields can be selected. Depending on both the behaviour and the newly selected value, additional fields and values may be selected, which cause a new behaviour to be \"active\"." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:366 +msgid "Conditional Restrictions" +msgstr "" + +#: i18n/templates.c:5567 +msgid "Conditional fieldsets allow you to restrict the options a user has for values in some fields based on the values in other fields, allowing you to say that the values of one field are restricted to a certain subset of values if another field has a specific value. For example, you could say that if the field \"Street\" is \"Jeffrey\", then the field \"Residents\" must be one of \"Jones\",\"Smith\" or \"Friedman\"." +msgstr "" + +#: i18n/templates.c:5582 +msgid "Conditional type" +msgstr "" + +#: i18n/templates.c:5780 +msgid "Conditionality" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:49 +msgid "Conditions Management" +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:273 +msgid "Config settings modified: " +msgstr "" + +#: i18n/templates.c:7691 i18n/templates.c:7733 i18n/templates.c:8018 +#: i18n/templates.c:8036 +msgid "Configuration" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:259 +msgid "Configuration updated" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:584 i18n/templates.c:7433 +#: i18n/templates.c:7436 +msgid "Configure Workflow Process" +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:119 +msgid "Configure Workflows" +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:123 +#: plugins/ktstandard/workflow/FolderAssociator.php:124 +msgid "Configure Workflows for Folder" +msgstr "" + +#: i18n/templates.c:8615 +msgid "Configure Workflows for this Folder" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:299 +msgid "Configure automated Workflows that map to document life-cycles." +msgstr "" + +#: i18n/templates.c:200 +msgid "Configure document alerts to recieve a notification when action is required on a document of a specific type." +msgstr "" + +#: plugins/ktstandard/KTWorkflowAssociation.php:70 +msgid "Configure how documents are allocated to workflows." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:252 +msgid "Configure the document metadata: Document Types, Document Fieldsets, Link Types and Workflows." +msgstr "" + +#: i18n/templates.c:4439 +msgid "Confirm #label#" +msgstr "" + +#: i18n/templates.c:3209 i18n/templates.c:3224 +msgid "Confirm De-archival" +msgstr "" + +#: i18n/templates.c:3263 i18n/templates.c:3275 +msgid "Confirm Expunge" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:118 +#, php-format +msgid "Confirm Expunge of %d documents" +msgstr "" + +#: i18n/templates.c:3281 +msgid "Confirm Forced Check-in" +msgstr "" + +#: plugins/ktstandard/ImmutableActionPlugin.php:189 +msgid "Confirm Making Document Immutable" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:82 +#: lib/authentication/builtinauthenticationprovider.inc.php:192 +#: plugins/ktcore/admin/userManagement.php:161 +#: plugins/ktcore/admin/userManagement.php:270 +msgid "Confirm Password" +msgstr "" + +#: i18n/templates.c:3365 i18n/templates.c:3380 +msgid "Confirm Restore" +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:138 +#: plugins/ktcore/admin/deletedDocuments.php:208 +#: plugins/ktcore/admin/deletedDocuments.php:210 +#, php-format +msgid "Confirm Restore of %d documents" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:987 +#: plugins/ktcore/KTDocumentActions.php:1722 +msgid "Confirm archive" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:217 +#: plugins/ktcore/KTDocumentActions.php:1104 +msgid "Confirm delete" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:62 +#: plugins/ktcore/admin/conditions.php:63 +msgid "Confirm deletion" +msgstr "" + +#: i18n/templates.c:1718 +msgid "Confirm new password" +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:446 +msgid "Confirm password reset" +msgstr "" + +#: preferences.php:133 +msgid "Confirm the new password you specified above." +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:82 +#: lib/authentication/builtinauthenticationprovider.inc.php:192 +#: plugins/ktcore/admin/userManagement.php:161 +#: plugins/ktcore/admin/userManagement.php:270 +msgid "Confirm the password specified above." +msgstr "" + +#: i18n/templates.c:3575 i18n/templates.c:3581 +msgid "Content" +msgstr "" + +#: i18n/templates.c:353 i18n/templates.c:3551 +msgid "Content Version" +msgstr "" + +#: i18n/templates.c:512 i18n/templates.c:596 i18n/templates.c:689 +#: i18n/templates.c:797 i18n/templates.c:3638 +msgid "Content version" +msgstr "" + +#: lib/actions/bulkaction.php:481 plugins/ktcore/KTBulkActions.php:196 +#: plugins/ktcore/KTBulkActions.php:966 +msgid "Continue" +msgstr "" + +#: i18n/templates.c:4631 +msgid "Continue Editing (check-out)" +msgstr "" + +#: i18n/templates.c:281 i18n/templates.c:7670 +msgid "Control" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:268 +msgid "Control Units" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:244 +msgid "Control which users can log in, and are part of which groups and organisational units, from these management panels." +msgstr "" + +#: i18n/templates.c:8069 i18n/templates.c:8177 +msgid "Controlled Actions available" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1291 i18n/templates.c:7967 +msgid "Controlled Permissions" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1370 +msgid "Controlled permission updated." +msgstr "" + +#: i18n/templates.c:5111 +msgid "Convert" +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:138 +msgid "Convert Document" +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:134 +msgid "Convert Document to PDF" +msgstr "" + +#: i18n/templates.c:5105 +msgid "Convert to Trees." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1300 +#, php-format +msgid "Copied from original in folder \"%s\". %s" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1296 +#, php-format +msgid "Copied to folder \"%s\". %s" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:631 +msgid "Copies Document" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:632 +msgid "Copies the document to another folder." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:559 plugins/ktcore/KTBulkActions.php:569 +#: plugins/ktcore/KTDocumentActions.php:1387 +#: plugins/ktcore/KTDocumentActions.php:1418 +#: plugins/ktcore/KTDocumentActions.php:1535 i18n/templates.c:2561 +#: i18n/templates.c:2564 i18n/templates.c:2573 i18n/templates.c:7508 +#: i18n/templates.c:7598 +msgid "Copy" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1417 +#: plugins/ktcore/KTDocumentActions.php:1537 +msgid "Copy Document" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:568 +msgid "Copy Items" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:180 i18n/templates.c:7499 +msgid "Copy Workflow" +msgstr "" + +#: i18n/templates.c:2558 i18n/templates.c:2570 +msgid "Copy document" +msgstr "" + +#: i18n/templates.c:4913 +msgid "Copy to clipboard" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:51 +msgid "Core Application Functionality" +msgstr "" + +#: plugins/ktcore/KTCoreLanguagePlugin.php:51 +msgid "Core Language Support" +msgstr "" + +#: i18n/permissions.c:3 +msgid "Core: Add Folder" +msgstr "" + +#: i18n/permissions.c:5 +msgid "Core: Delete" +msgstr "" + +#: i18n/permissions.c:7 +msgid "Core: Folder details" +msgstr "" + +#: i18n/permissions.c:4 +msgid "Core: Manage security" +msgstr "" + +#: i18n/permissions.c:6 +msgid "Core: Manage workflow" +msgstr "" + +#: i18n/permissions.c:1 +msgid "Core: Read" +msgstr "" + +#: i18n/permissions.c:2 +msgid "Core: Write" +msgstr "" + +#: search2/indexing/extractorCore.inc.php:429 +msgid "Could change permission on exec script: " +msgstr "" + +#: lib/util/ktutil.inc:671 lib/util/ktutil.inc:702 lib/util/ktutil.inc:707 +#, php-format +msgid "Could not copy to destination: %s" +msgstr "" + +#: lib/util/ktutil.inc:578 +#, php-format +msgid "Could not create destination directory: %s" +msgstr "" + +#: lib/storage/ondiskhashedstoragemanager.inc.php:167 +#, php-format +msgid "Could not create directory for storage: %s" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:446 +msgid "Could not create document link" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:126 +#: plugins/ktcore/admin/documentTypes.php:90 +msgid "Could not create document type" +msgstr "" + +#: search2/indexing/extractorCore.inc.php:415 +msgid "Could not create exec script: " +msgstr "" + +#: plugins/ktcore/KTFolderActions.php:183 +msgid "Could not create folder in the document management system" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1371 +#, php-format +msgid "Could not create intermediate file from document %d" +msgstr "" + +#: ktapi/KTAPIDocument.inc.php:289 +msgid "Could not create link" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:174 +msgid "Could not create quicklink" +msgstr "" + +#: lib/import/zipimportstorage.inc.php:111 +msgid "Could not create temporary directory for archive storage" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:145 +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:235 +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:263 +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:313 +msgid "Could not create workflow." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:489 +msgid "Could not delete document link" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:325 +#: plugins/multiselect/InetdocumentFieldsv2.php:385 +msgid "Could not delete fieldset" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:114 +#: plugins/ktstandard/admin/manageDisclaimers.php:156 +msgid "Could not delete specified item" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:246 +msgid "Could not delete this unit because it has groups assigned to it" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:201 +#: plugins/ktcore/admin/documentTypes.php:126 +msgid "Could not disable document type" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:216 +#: plugins/ktcore/admin/documentTypes.php:141 +msgid "Could not enable document type" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1448 +#, php-format +msgid "Could not extract contents from document %d" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:101 +#: plugins/ktcore/admin/manageHelp.php:110 +#: plugins/ktcore/admin/manageHelp.php:123 +#: plugins/ktstandard/admin/manageDisclaimers.php:76 +#: plugins/ktstandard/admin/manageDisclaimers.php:96 +#: plugins/ktstandard/admin/manageDisclaimers.php:152 +msgid "Could not find specified item" +msgstr "" + +#: lib/templating/templating.inc.php:117 +msgid "Could not find template language" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:280 +msgid "Could not find user in LDAP server" +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:1739 +msgid "Could not inherit allocation from parent." +msgstr "" + +#: lib/util/ktutil.inc:680 +#, php-format +msgid "Could not move to destination: %s" +msgstr "" + +#: lib/util/ktutil.inc:574 +#, php-format +msgid "Could not open source directory: %s" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:201 +msgid "Could not perform key maintenance successfully" +msgstr "" + +#: ktapi/ktapi.inc.php:4220 ktwebservice/webservice.php:4282 search2.php:277 +#: search2/search/search.inc.php:765 +msgid "Could not process query." +msgstr "" + +#: lib/import/fsimportstorage.inc.php:76 +#: lib/import/fsimportstorage.inc.php:109 +#, php-format +msgid "Could not read file: %s" +msgstr "" + +#: ktapi/KTAPIDocument.inc.php:307 +msgid "Could not remove link" +msgstr "" + +#: lib/util/ktutil.inc:675 +#, php-format +msgid "Could not remove source: %s" +msgstr "" + +#: lib/import/zipimportstorage.inc.php:143 +msgid "Could not retrieve contents from zip storage" +msgstr "" + +#: search2/indexing/extractors/OpenXmlTextExtractor.inc.php:291 +msgid "Could not save content to file: " +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:281 +#: plugins/ktcore/admin/documentTypes.php:207 +msgid "Could not save document type changes" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:430 +#: plugins/ktcore/admin/documentFieldsv2.php:440 +#: plugins/multiselect/InetdocumentFieldsv2.php:505 +#: plugins/multiselect/InetdocumentFieldsv2.php:515 +msgid "Could not save fieldset changes" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:459 +msgid "Could not to complete" +msgstr "" + +#: lib/storage/ondiskpathstoragemanager.inc.php:152 +msgid "Couldn't create folder" +msgstr "" + +#: lib/util/ktutil.inc:664 +#, php-format +msgid "Couldn't move file to destination: %s" +msgstr "" + +#: lib/util/ktutil.inc:659 lib/util/ktutil.inc:697 +#, php-format +msgid "Couldn't stat destination location: %s" +msgstr "" + +#: lib/util/ktutil.inc:655 lib/util/ktutil.inc:693 +#, php-format +msgid "Couldn't stat source file: %s" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:920 +#: lib/documentmanagement/documentutil.inc.php:932 +#: lib/documentmanagement/documentutil.inc.php:950 +#: lib/documentmanagement/documentutil.inc.php:953 +#, php-format +msgid "Couldn't store contents: %s" +msgstr "" + +#: i18n/templates.c:3131 +msgid "Crash Course in #appname#" +msgstr "" + +#: i18n/templates.c:1235 i18n/templates.c:1751 i18n/templates.c:3740 +#: i18n/templates.c:3968 i18n/templates.c:5123 i18n/templates.c:5894 +#: i18n/templates.c:8090 i18n/transactions.c:1 +msgid "Create" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:80 +#: plugins/multiselect/InetdocumentFieldsv2.php:100 i18n/templates.c:5060 +msgid "Create Fieldset" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:79 +#: plugins/ktcore/admin/documentFieldsv2.php:161 +#: plugins/multiselect/InetdocumentFieldsv2.php:99 +#: plugins/multiselect/InetdocumentFieldsv2.php:186 i18n/templates.c:5255 +msgid "Create New Fieldset" +msgstr "" + +#: i18n/templates.c:7568 i18n/templates.c:7571 +msgid "Create New Workflow" +msgstr "" + +#: i18n/templates.c:7652 +msgid "Create Workflow" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:130 i18n/templates.c:1796 +msgid "Create a link to a new RSS feed" +msgstr "" + +#: i18n/templates.c:5051 +msgid "Create a new Fieldset" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:129 +msgid "Create a new RSS feed" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:104 +#: plugins/ktcore/admin/conditions.php:105 +#: plugins/ktcore/admin/conditions.php:114 i18n/templates.c:6521 +msgid "Create a new condition" +msgstr "" + +#: i18n/templates.c:3965 +msgid "Create a new document field set" +msgstr "" + +#: i18n/templates.c:5891 +msgid "Create a new document fieldset" +msgstr "" + +#: i18n/templates.c:3734 +msgid "Create a new document type" +msgstr "" + +#: i18n/templates.c:1229 +msgid "Create a new email document type" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:543 i18n/templates.c:8471 +msgid "Create a new group" +msgstr "" + +#: i18n/templates.c:5120 +msgid "Create a new permission" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:95 +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:96 +#: i18n/templates.c:881 +msgid "Create a new quicklink" +msgstr "" + +#: i18n/templates.c:875 +msgid "Create a new quicklink that will appear on users' dashboards." +msgstr "" + +#: i18n/templates.c:878 +msgid "Create a new quicklink that will appear on your dashboard." +msgstr "" + +#: i18n/templates.c:1748 +msgid "Create a new rss feed" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:74 i18n/templates.c:6560 +msgid "Create a new saved search" +msgstr "" + +#: i18n/templates.c:7031 +msgid "Create a new saved search using #options#." +msgstr "" + +#: i18n/templates.c:7796 i18n/templates.c:8156 i18n/templates.c:8162 +msgid "Create a new state" +msgstr "" + +#: i18n/templates.c:8324 +msgid "Create a new thread" +msgstr "" + +#: i18n/templates.c:7835 i18n/templates.c:8198 i18n/templates.c:8201 +#: i18n/templates.c:8204 +msgid "Create a new transition" +msgstr "" + +#: i18n/templates.c:6062 i18n/templates.c:8480 +msgid "Create a new user" +msgstr "" + +#: i18n/templates.c:8087 +msgid "Create a new workflow" +msgstr "" + +#: i18n/templates.c:1745 +msgid "Create a rss feed which will be displayed on the dashboard" +msgstr "" + +#: i18n/templates.c:101 +msgid "Create an alert to receive a dashboard notification and an email when action is required on this document." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:544 +msgid "Create group" +msgstr "" + +#: i18n/templates.c:5252 +msgid "Create new Fieldset" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:273 +msgid "Create or delete permissions." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:275 +msgid "Create or delete roles" +msgstr "" + +#: i18n/templates.c:7823 +msgid "Create state" +msgstr "" + +#: i18n/templates.c:8327 +msgid "Create thread" +msgstr "" + +#: i18n/templates.c:7844 +msgid "Create transition" +msgstr "" + +#: i18n/templates.c:8483 +msgid "Create user" +msgstr "" + +#: plugins/ktcore/KTColumns.inc.php:271 +#: search2/search/fields/CreatedField.inc.php:44 +msgid "Created" +msgstr "" + +#: search2/search/fields/CreatedByField.inc.php:44 +msgid "Created By" +msgstr "" + +#: i18n/templates.c:7271 +msgid "Created By:" +msgstr "" + +#: search2/search/fields/CreatedDeltaField.inc.php:46 +msgid "Created Delta" +msgstr "" + +#: i18n/templates.c:317 i18n/templates.c:1988 i18n/templates.c:2027 +msgid "Created by" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:206 +msgid "Created by: " +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:590 +msgid "Created new group" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:179 +msgid "Created new quicklink" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:161 +#, php-format +msgid "Created new rss feed: %s" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:567 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:355 +msgid "Created new user" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:174 +msgid "Created replacement." +msgstr "" + +#: i18n/templates.c:6518 +msgid "Creating a Dynamic Condition involves setting up criteria that filters content in the DMS for the purposes of selectively assigning permissions associated with the Dynamic Condition, according to the specified criteria. Dynamic conditions are assigned on the folder's Permissions management page in Browse Documents. Dynamic Conditions are also used to create Guard permissions, which are required to perform transitions on Workflows." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:297 +msgid "Creating database entry" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:800 +msgid "Creating transaction" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1203 +#: plugins/ktstandard/KTBulkExportPlugin.php:199 i18n/templates.c:2510 +msgid "Creating zip file. Compressing and archiving in progress ..." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:146 +msgid "Creation Date" +msgstr "" + +#: lib/browse/Criteria.inc:379 plugins/ktcore/KTColumns.inc.php:345 +#: plugins/ktcore/KTCorePlugin.php:148 i18n/templates.c:8303 +msgid "Creator" +msgstr "" + +#: i18n/templates.c:2834 i18n/templates.c:2876 i18n/templates.c:2921 +#: i18n/templates.c:4499 +msgid "Criteria" +msgstr "" + +#: i18n/templates.c:1580 i18n/templates.c:2822 i18n/templates.c:2864 +#: i18n/templates.c:2909 i18n/templates.c:4496 i18n/templates.c:6779 +msgid "Criteria Group" +msgstr "" + +#: i18n/templates.c:6881 +msgid "Criteria may be built up using the following grammar:" +msgstr "" + +#: i18n/templates.c:5642 +msgid "Current Conditional Fieldsets" +msgstr "" + +#: i18n/templates.c:3803 i18n/templates.c:3851 +msgid "Current Fields in Set" +msgstr "" + +#: i18n/templates.c:6437 +msgid "Current Groups" +msgstr "" + +#: i18n/templates.c:5465 +msgid "Current Name" +msgstr "" + +#: plugins/ktcore/document/Rename.php:86 +msgid "Current file name" +msgstr "" + +#: i18n/templates.c:5063 +msgid "Current help assignments" +msgstr "" + +#: i18n/templates.c:6251 +msgid "Current users" +msgstr "" + +#: i18n/templates.c:7859 +msgid "Current workflow settings" +msgstr "" + +#: plugins/commercial/custom-numbering/CustomNumberingColumn.inc.php:35 +#: plugins/commercial/custom-numbering/CustomNumberingPlugin.php:64 +#: plugins/commercial/custom-numbering/search-3.5plus/CustomDocumentNoField.inc.php:33 +#: i18n/templates.c:308 +msgid "Custom Document No" +msgstr "" + +#: plugins/commercial/custom-numbering/CustomNumberingPlugin.php:49 +msgid "Custom Numbering" +msgstr "" + +#: dashboard.php:63 dashboard.php:78 help.php:74 +#: lib/templating/kt3template.inc.php:159 +#: lib/templating/kt3template.inc.php:309 +#: lib/templating/kt3template.inc.php:324 olddashboard.php:68 +#: olddashboard.php:83 plugins/ktcore/KTAssist.php:214 +#: plugins/tagcloud/TagCloudRedirectPage.php:100 preferences.php:158 +#: preferences.php:180 +msgid "Dashboard" +msgstr "" + +#: lib/validation/errorviewer.inc.php:142 +msgid "Database error" +msgstr "" + +#: lib/session/Session.inc:233 +#, php-format +msgid "Database incompatibility error:
Please ensure that you have completed the database upgrade procedure.
Please click here to complete." +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:253 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:88 +#: plugins/multiselect/inetbasic.inc.php:112 i18n/templates.c:509 +#: i18n/templates.c:593 i18n/templates.c:686 i18n/templates.c:794 +#: i18n/templates.c:1010 i18n/templates.c:1022 i18n/templates.c:2477 +#: i18n/templates.c:3635 +msgid "Date" +msgstr "" + +#: lib/browse/Criteria.inc:431 i18n/templates.c:3560 +msgid "Date Created" +msgstr "" + +#: lib/browse/Criteria.inc:989 +msgid "Date Created Delta" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:297 +msgid "Date Dropped" +msgstr "" + +#: lib/browse/Criteria.inc:770 +msgid "Date Modified" +msgstr "" + +#: lib/browse/Criteria.inc:1048 +msgid "Date Modified Delta" +msgstr "" + +#: i18n/templates.c:452 i18n/templates.c:536 i18n/templates.c:629 +#: i18n/templates.c:737 +msgid "Date Range" +msgstr "" + +#: i18n/templates.c:224 +msgid "Day" +msgstr "" + +#: lib/browse/Criteria.inc:993 i18n/templates.c:20 i18n/templates.c:227 +msgid "Days" +msgstr "" + +#: i18n/templates.c:1157 +msgid "De-allocate Key" +msgstr "" + +#: i18n/templates.c:4958 +msgid "Default" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:350 +msgid "Define the sending email server address, email password, email port, and user name, and view and modify policies for emailing documents and attachments from KnowledgeTree." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:51 plugins/ktcore/KTBulkActions.php:124 +#: plugins/ktcore/KTDocumentActions.php:987 +#: plugins/ktcore/KTDocumentActions.php:1089 i18n/permissions.c:13 +#: i18n/templates.c:221 i18n/templates.c:257 i18n/templates.c:902 +#: i18n/templates.c:905 i18n/templates.c:1295 i18n/templates.c:1307 +#: i18n/templates.c:1364 i18n/templates.c:1808 i18n/templates.c:1814 +#: i18n/templates.c:2378 i18n/templates.c:2780 i18n/templates.c:2789 +#: i18n/templates.c:3353 i18n/templates.c:3761 i18n/templates.c:3794 +#: i18n/templates.c:3956 i18n/templates.c:4022 i18n/templates.c:4085 +#: i18n/templates.c:4688 i18n/templates.c:5045 i18n/templates.c:5081 +#: i18n/templates.c:5132 i18n/templates.c:5156 i18n/templates.c:5279 +#: i18n/templates.c:5297 i18n/templates.c:5384 i18n/templates.c:5426 +#: i18n/templates.c:5870 i18n/templates.c:5888 i18n/templates.c:5906 +#: i18n/templates.c:5912 i18n/templates.c:6176 i18n/templates.c:6194 +#: i18n/templates.c:6314 i18n/templates.c:6320 i18n/templates.c:6350 +#: i18n/templates.c:6359 i18n/templates.c:6464 i18n/templates.c:6509 +#: i18n/templates.c:6536 i18n/templates.c:6545 i18n/templates.c:6578 +#: i18n/templates.c:6587 i18n/templates.c:7046 i18n/templates.c:7061 +#: i18n/templates.c:7457 i18n/templates.c:7481 i18n/templates.c:7487 +#: i18n/templates.c:7688 i18n/templates.c:7730 i18n/templates.c:8024 +#: i18n/templates.c:8042 i18n/templates.c:8063 i18n/templates.c:8171 +#: i18n/templates.c:8216 i18n/templates.c:8375 i18n/templates.c:8378 +#: i18n/templates.c:8384 i18n/templates.c:8387 i18n/templates.c:8393 +#: i18n/templates.c:8396 i18n/transactions.c:3 +msgid "Delete" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:624 +msgid "Delete Aborted. Unexpected failure to copydocument: " +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:406 +msgid "Delete Aborted. Unexpected failure to delete document: " +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1019 +#: plugins/ktcore/KTDocumentActions.php:1030 +#: plugins/ktcore/KTDocumentActions.php:1034 i18n/templates.c:2582 +#: i18n/templates.c:2588 +msgid "Delete Document" +msgstr "" + +#: i18n/templates.c:3473 +msgid "Delete Document Version" +msgstr "" + +#: i18n/templates.c:6497 +msgid "Delete Dynamic Condition" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1154 +msgid "Delete Existing State" +msgstr "" + +#: i18n/templates.c:4007 +msgid "Delete Files and Folders" +msgstr "" + +#: i18n/templates.c:4736 +msgid "Delete Folder" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:123 +msgid "Delete Items" +msgstr "" + +#: i18n/templates.c:5138 +msgid "Delete Permission" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1159 +#: plugins/ktcore/admin/workflowsv2.php:1188 +#: plugins/ktcore/admin/workflowsv2.php:1190 i18n/templates.c:7463 +msgid "Delete State" +msgstr "" + +#: i18n/templates.c:6071 i18n/templates.c:6077 +msgid "Delete Unit" +msgstr "" + +#: i18n/templates.c:3563 +msgid "Delete Version" +msgstr "" + +#: i18n/templates.c:6503 +msgid "Delete a condition" +msgstr "" + +#: i18n/templates.c:254 +msgid "Delete document type alert." +msgstr "" + +#: i18n/templates.c:3788 +msgid "Delete document type." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:291 +msgid "Delete document version" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:229 +msgid "Delete folder" +msgstr "" + +#: i18n/templates.c:6080 +msgid "Delete unit" +msgstr "" + +#: i18n/templates.c:6074 +msgid "Delete unit #name# from the system" +msgstr "" + +#: lib/documentmanagement/Document.inc:743 +msgid "Deleted" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:53 +#: plugins/ktcore/admin/deletedDocuments.php:109 +#: plugins/ktcore/admin/deletedDocuments.php:204 i18n/templates.c:3230 +msgid "Deleted Documents" +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:123 +msgid "Deleted Entry" +msgstr "" + +#: i18n/templates.c:2585 +msgid "Deleting a document marks it as no longer being displayed. The document management system does not remove the document entirely, and it can be restored at a later stage." +msgstr "" + +#: i18n/templates.c:6500 +msgid "Deleting a dynamic condition will potentially change the permissions on a number of items in the document management system. Users may experience a lack of access to documents that they usually have access to if you continue with this action." +msgstr "" + +#: plugins/ktcore/admin/expungeList.php:79 i18n/templates.c:3245 +msgid "Deletion Comment" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:992 +#: lib/documentmanagement/documentutil.inc.php:1513 +msgid "Deletion requires a reason" +msgstr "" + +#: lib/documentmanagement/DocumentType.inc:196 +msgid "Demo Delegator" +msgstr "" + +#: i18n/templates.c:3506 i18n/templates.c:3515 i18n/templates.c:3524 +#: i18n/templates.c:3617 i18n/templates.c:4091 i18n/templates.c:4139 +#: i18n/templates.c:4148 i18n/templates.c:4157 i18n/templates.c:4199 +#: i18n/templates.c:4382 i18n/templates.c:4391 i18n/templates.c:4400 +#: i18n/templates.c:4415 i18n/templates.c:7394 +msgid "Denied" +msgstr "" + +#: i18n/templates.c:4469 +msgid "Dependencies for value \"" +msgstr "" + +#: i18n/templates.c:4466 +msgid "Dependencies saved (" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:272 +msgid "Describe the reason for the state change, or the conclusion reached through discussion" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1824 +msgid "Describe why this document qualifies to be changed from its current state to the destination state of the transition chosen." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:98 +#: plugins/ktcore/admin/documentFieldsv2.php:354 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:121 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:246 +#: plugins/ktstandard/KTDocumentLinks.php:528 +#: plugins/ktstandard/KTDocumentLinks.php:557 +#: plugins/multiselect/InetdocumentFieldsv2.php:118 +#: plugins/multiselect/InetdocumentFieldsv2.php:419 +#: plugins/multiselect/inetbasic.inc.php:184 +#: plugins/multiselect/inetbasic.inc.php:345 +#: plugins/multiselect/inetbasic.inc.php:399 i18n/templates.c:1331 +#: i18n/templates.c:3347 i18n/templates.c:5183 i18n/templates.c:5705 +#: i18n/templates.c:7100 +msgid "Description" +msgstr "" + +#: lib/util/ktutil.inc:555 +msgid "Destination directory already exists." +msgstr "" + +#: lib/util/ktutil.inc:569 +msgid "Destination of move is within source" +msgstr "" + +#: plugins/ktcore/KTAssist.php:59 i18n/templates.c:2708 +msgid "Details" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:167 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:140 +msgid "Details updated" +msgstr "" + +#: search2/indexing/bin/diagnose.php:50 +msgid "Diagnosing the text extractors" +msgstr "" + +#: i18n/templates.c:3041 +msgid "Diagnostic" +msgstr "" + +#: i18n/templates.c:1634 i18n/templates.c:1658 i18n/templates.c:5309 +#: i18n/templates.c:5333 +msgid "Different fields have different actions and options available." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:130 +#: plugins/multiselect/inetbasic.inc.php:193 +msgid "Different types of fields may be available, depending on the system." +msgstr "" + +#: i18n/templates.c:239 i18n/templates.c:251 i18n/templates.c:1262 +#: i18n/templates.c:3785 i18n/templates.c:5738 i18n/templates.c:6461 +#: i18n/templates.c:8117 +msgid "Disable" +msgstr "" + +#: i18n/templates.c:2348 i18n/templates.c:2351 +msgid "Disable Admin Mode" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:250 +msgid "Disable Task" +msgstr "" + +#: i18n/templates.c:3779 +msgid "Disable document type." +msgstr "" + +#: i18n/templates.c:248 +msgid "Disable repeat after action" +msgstr "" + +#: i18n/templates.c:236 +msgid "Disable reset alert on check-in" +msgstr "" + +#: i18n/templates.c:1253 i18n/templates.c:3758 +msgid "Disable/Enable" +msgstr "" + +#: i18n/templates.c:6443 i18n/templates.c:6446 i18n/templates.c:7592 +#: i18n/templates.c:8108 +msgid "Disabled" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1629 +msgid "Disabled actions updated." +msgstr "" + +#: i18n/templates.c:5747 +msgid "Disabled values" +msgstr "" + +#: i18n/templates.c:1184 i18n/templates.c:3689 +msgid "Disassociate Fieldsets" +msgstr "" + +#: i18n/templates.c:8537 +msgid "Disclaimers" +msgstr "" + +#: plugins/ktstandard/KTDisclaimers.php:52 +msgid "Disclaimers Plugin" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:128 i18n/templates.c:8294 +msgid "Discussion" +msgstr "" + +#: search2/search/fields/DiscussionTextField.inc.php:47 +msgid "Discussion Text" +msgstr "" + +#: lib/actions/documentaction.inc.php:227 lib/actions/folderaction.inc.php:180 +msgid "Dispatcher component of action not implemented." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:62 +#: plugins/ktcore/KTFolderActions.php:63 +msgid "Display Details" +msgstr "" + +#: i18n/templates.c:4718 +msgid "Display Language" +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:54 i18n/templates.c:5129 +msgid "Display Name" +msgstr "" + +#: i18n/templates.c:8510 i18n/templates.c:8531 +msgid "Distinguished Name (LDAP DN)" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:118 +msgid "Distinguished name" +msgstr "" + +#: i18n/templates.c:6506 +msgid "Do you still wish to continue with deleting this item?" +msgstr "" + +#: i18n/templates.c:4766 +msgid "Do you want to add the currently open Office document as a new version of [-doctitle-]?" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:296 +#: plugins/commercial/electronic-signatures/Esignature.inc.php:202 +#: i18n/templates.c:431 i18n/templates.c:503 i18n/templates.c:587 +#: i18n/templates.c:680 i18n/templates.c:788 i18n/templates.c:926 +#: i18n/templates.c:3194 +msgid "Document" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1130 +#, php-format +msgid "Document \"%s\" Deleted." +msgstr "" + +#: plugins/ktcore/document/Rename.php:125 +#, php-format +msgid "Document \"%s\" renamed." +msgstr "" + +#: plugins/search2/DocumentIndexAction.php:58 +#, php-format +msgid "Document '%s' has been added to the indexing queue." +msgstr "" + +#: plugins/search2/DocumentIndexAction.php:53 +#, php-format +msgid "Document '%s' has been removed from the indexing queue." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:255 +#, php-format +msgid "Document (ID %s): %s from %s" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:124 +#: plugins/commercial/alerts/alerts.php:158 +msgid "Document Alert Modified" +msgstr "" + +#: plugins/commercial/alerts/alertPlugin.php:36 +msgid "Document Alerts Plugin" +msgstr "" + +#: plugins/ktcore/admin/documentCheckout.php:53 +#: plugins/ktcore/admin/documentCheckout.php:69 +msgid "Document Checkout" +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparisonPlugin.php:37 +msgid "Document Comparison Plugin" +msgstr "" + +#: lib/templating/kt3template.inc.php:315 i18n/templates.c:3287 +#: i18n/templates.c:3644 +msgid "Document Details" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:55 +msgid "Document Discussions Plugin" +msgstr "" + +#: lib/dashboard/Notification.inc.php:226 +#: lib/subscriptions/subscriptions.inc.php:554 +msgid "Document Discussions updated" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:51 +#: plugins/ktcore/admin/manageConditionals.php:61 +#: plugins/multiselect/InetdocumentFieldsv2.php:58 i18n/templates.c:1202 +#: i18n/templates.c:3707 +msgid "Document Field Management" +msgstr "" + +#: i18n/templates.c:3941 +msgid "Document Fields" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:288 +#: plugins/multiselect/MultiSelectPlugin.php:124 i18n/templates.c:5246 +#: i18n/templates.c:5843 +msgid "Document Fieldsets" +msgstr "" + +#: lib/browse/Criteria.inc:293 i18n/templates.c:305 i18n/templates.c:1979 +#: i18n/templates.c:2018 +msgid "Document Filename" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:192 +msgid "Document Filename: " +msgstr "" + +#: plugins/commercial/guidInserter/guidInserterPlugin.php:33 +msgid "Document GUID Inserter (Experimental)" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:107 +#: plugins/ktcore/KTDocumentActions.php:163 +msgid "Document History" +msgstr "" + +#: i18n/templates.c:344 i18n/templates.c:3455 i18n/templates.c:3542 +#: i18n/templates.c:3626 +msgid "Document History for #appname# New UI Presentation" +msgstr "" + +#: lib/browse/Criteria.inc:332 plugins/ktcore/KTColumns.inc.php:572 +#: plugins/ktcore/KTCorePlugin.php:150 +#: search2/search/fields/DocumentIdField.inc.php:47 i18n/templates.c:335 +#: i18n/templates.c:833 i18n/templates.c:2006 i18n/templates.c:2054 +msgid "Document ID" +msgstr "" + +#: i18n/templates.c:7262 +msgid "Document ID:" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:256 +msgid "Document ID: " +msgstr "" + +#: plugins/housekeeper/HouseKeeper.inc.php:240 +msgid "Document Index" +msgstr "" + +#: plugins/search2/DocumentIndexAction.php:20 +#: plugins/search2/FolderIndexAction.php:20 +msgid "Document Indexer" +msgstr "" + +#: search2/indexing/indexers/PHPLuceneIndexer.inc.php:298 +msgid "Document Indexer Library" +msgstr "" + +#: search2/indexing/indexers/JavaXMLRPCLuceneIndexer.inc.php:249 +msgid "Document Indexer Service" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:342 +#: plugins/search2/LuceneStatisticsDashlet.php:48 +#: plugins/search2/reporting/LuceneStatistics.php:49 i18n/templates.c:6971 +msgid "Document Indexer Statistics" +msgstr "" + +#: plugins/search2/IndexingStatusDashlet.php:48 +msgid "Document Indexer Status" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:338 +msgid "Document Indexer and External Resource Dependancy Status" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:324 +#: plugins/search2/reporting/IndexErrors.php:48 i18n/templates.c:7112 +msgid "Document Indexing Diagnostics" +msgstr "" + +#: plugins/commercial/network/gotodocumentid/GoToDocumentIdPlugin.php:43 +msgid "Document Jump Dashlet" +msgstr "" + +#: i18n/templates.c:3308 +msgid "Document Link Type Management" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:520 +#: plugins/ktstandard/KTDocumentLinks.php:549 i18n/templates.c:8360 +msgid "Document Links" +msgstr "" + +#: i18n/templates.c:3161 +msgid "Document Metadata allows you to provide additional, important information about this document that can be used to classify and report on its contents. The exact information required depends on the Document Type you selected above. Some of this information may be required, so please review the list of requested information carefully before finishing the process." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:251 +#: plugins/ktcore/admin/manageConditionals.php:60 i18n/templates.c:1199 +#: i18n/templates.c:3704 +msgid "Document Metadata and Workflow Configuration" +msgstr "" + +#: plugins/ktcore/admin/expungeList.php:77 i18n/templates.c:3218 +#: i18n/templates.c:3236 i18n/templates.c:3272 i18n/templates.c:3290 +#: i18n/templates.c:3374 +msgid "Document Name" +msgstr "" + +#: plugins/commercial/custom-numbering/CustomNumberingAdminPage.inc.php:39 +#: plugins/commercial/custom-numbering/CustomNumberingPlugin.php:82 +#: i18n/templates.c:263 +msgid "Document Numbering Schemes" +msgstr "" + +#: plugins/pdfConverter/pdfConverterPlugin.php:63 +msgid "Document PDF Converter" +msgstr "" + +#: i18n/templates.c:3239 +msgid "Document Path" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:72 +#: plugins/ktcore/admin/workflowsv2.php:1310 +#: plugins/ktcore/admin/workflowsv2.php:1381 i18n/templates.c:7703 +msgid "Document Permissions" +msgstr "" + +#: i18n/templates.c:4700 +msgid "Document Sent" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:249 +msgid "Document Storage" +msgstr "" + +#: plugins/ktcore/admin/manageCleanup.php:75 i18n/templates.c:3395 +msgid "Document Storage Verification" +msgstr "" + +#: i18n/templates.c:719 +msgid "Document Summary for \"#name#\"" +msgstr "" + +#: search2/search/fields/DocumentTextField.inc.php:44 +msgid "Document Text" +msgstr "" + +#: lib/browse/Criteria.inc:352 lib/widgets/fieldsetDisplay.inc.php:372 +#: plugins/ktcore/KTDocumentActions.php:1266 +#: plugins/ktcore/KTDocumentActions.php:1501 +#: plugins/ktcore/document/edit.php:103 +#: plugins/ktcore/folder/addDocument.php:133 +#: plugins/multiselect/addDocument.php:159 i18n/templates.c:2015 +msgid "Document Title" +msgstr "" + +#: i18n/templates.c:3620 +msgid "Document Transaction History" +msgstr "" + +#: lib/browse/Criteria.inc:530 plugins/ktcore/KTColumns.inc.php:518 +#: plugins/ktcore/KTCorePlugin.php:152 plugins/ktcore/KTPortlets.php:96 +#: plugins/ktcore/folder/BulkImport.php:88 +#: plugins/ktcore/folder/BulkUpload.php:89 +#: plugins/ktcore/folder/addDocument.php:140 +#: plugins/multiselect/BulkImport.php:168 +#: plugins/multiselect/BulkUpload.php:193 +#: plugins/multiselect/addDocument.php:166 +#: search2/search/fields/DocumentTypeField.inc.php:44 i18n/templates.c:272 +#: i18n/templates.c:326 i18n/templates.c:1169 i18n/templates.c:1244 +#: i18n/templates.c:1997 i18n/templates.c:2042 i18n/templates.c:3674 +#: i18n/templates.c:3749 i18n/templates.c:8645 +msgid "Document Type" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:88 +msgid "Document Type Alert Management" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:62 +#: plugins/commercial/wintools/email/emailDocumentTypes.php:226 +#: plugins/ktcore/admin/documentTypes.php:58 +#: plugins/ktcore/admin/documentTypes.php:151 +msgid "Document Type Management" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:229 +msgid "Document Type: " +msgstr "" + +#: browse.php:234 plugins/ktcore/KTCorePlugin.php:284 i18n/templates.c:1217 +#: i18n/templates.c:3722 i18n/templates.c:3731 i18n/templates.c:5273 +#: i18n/templates.c:5864 +msgid "Document Types" +msgstr "" + +#: i18n/templates.c:8636 +msgid "Document Types with no pre-allocated workflow will either have no workflow set (for new documents) or keep their old workflow (for documents which have had their type changed)." +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:88 +#: plugins/ktcore/folder/BulkUpload.php:89 +#: plugins/ktcore/folder/addDocument.php:141 +#: plugins/multiselect/BulkImport.php:170 +#: plugins/multiselect/BulkUpload.php:195 +#: plugins/multiselect/addDocument.php:167 +msgid "Document Types, defined by the administrator, are used to categorise documents. Please select a Document Type from the list below." +msgstr "" + +#: i18n/templates.c:314 i18n/templates.c:1985 i18n/templates.c:2024 +msgid "Document Version" +msgstr "" + +#: i18n/templates.c:3536 +msgid "Document Version History" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:202 +msgid "Document Version: " +msgstr "" + +#: lib/actions/documentaction.inc.php:217 view.php:96 +msgid "Document actions" +msgstr "" + +#: lib/dashboard/Notification.inc.php:217 +#: lib/subscriptions/subscriptions.inc.php:541 +#: plugins/ktcore/folder/addDocument.php:391 +#: plugins/multiselect/addDocument.php:455 +msgid "Document added" +msgstr "" + +#: i18n/templates.c:4730 +msgid "Document already open" +msgstr "" + +#: lib/dashboard/Notification.inc.php:224 +#: lib/subscriptions/subscriptions.inc.php:551 +msgid "Document archived" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1751 +msgid "Document archived." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:248 +#, php-format +msgid "Document archived: %s" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:882 plugins/ktcore/KTBulkActions.php:895 +msgid "Document cannot be archived" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1161 +msgid "Document cannot be archived as it is checked out." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:220 +#: lib/documentmanagement/documentutil.inc.php:1165 +msgid "Document cannot be archived as it is restricted by the workflow." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1322 +msgid "Document cannot be checked out" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:170 +#: plugins/ktcore/KTBulkActions.php:1303 plugins/ktcore/KTBulkActions.php:1511 +#: plugins/ktcore/KTBulkActions.php:1623 +msgid "Document cannot be checked out as it is immutable" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:679 +msgid "Document cannot be copied" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1116 +msgid "Document cannot be copied as it is checked out." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1120 +msgid "Document cannot be copied as it is restricted by the workflow." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:61 +msgid "Document cannot be deleted" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1149 +msgid "Document cannot be deleted as it is checked out." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1145 +msgid "Document cannot be deleted as it is immutable." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1004 +#: lib/documentmanagement/documentutil.inc.php:1153 +msgid "Document cannot be deleted as it is restricted by the workflow." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1124 +msgid "Document cannot be exported" +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:721 +#: plugins/ktcore/KTBulkActions.php:1134 +#: plugins/ktstandard/KTBulkExportPlugin.php:168 +msgid "Document cannot be exported as it is restricted by the workflow." +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:628 +msgid "Document cannot be exported, an error occurred: " +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:424 +msgid "Document cannot be moved" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1132 +msgid "Document cannot be moved as it is checked out." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1128 +msgid "Document cannot be moved as it is immutable." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1136 +msgid "Document cannot be moved as it is restricted by the workflow." +msgstr "" + +#: lib/dashboard/Notification.inc.php:221 +#: lib/subscriptions/subscriptions.inc.php:545 +msgid "Document checked in" +msgstr "" + +#: i18n/templates.c:4589 +msgid "Document checked in." +msgstr "" + +#: lib/dashboard/Notification.inc.php:222 +#: lib/subscriptions/subscriptions.inc.php:546 +msgid "Document checked out" +msgstr "" + +#: plugins/ktcore/admin/documentCheckout.php:123 +msgid "Document checked out cancelled" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:542 i18n/templates.c:4592 +msgid "Document checked out." +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:549 +#: lib/subscriptions/subscriptions.inc.php:550 +msgid "Document copied" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1602 +msgid "Document copied." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:291 +#, php-format +msgid "Document copy emailed to %s. " +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1649 +msgid "Document could not be checked out. " +msgstr "" + +#: plugins/ktcore/KTAssist.php:257 +msgid "Document could not be restored" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:771 +#: lib/documentmanagement/documentutil.inc.php:803 +msgid "Document created" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1074 +msgid "Document deleted: " +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1474 +#, php-format +msgid "Document docid: %d was not removed from the queue as it looks like there was a problem with the extraction process" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:552 +#: plugins/ktcore/KTDocumentActions.php:375 +msgid "Document downloaded" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:170 +msgid "Document expunged" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1313 plugins/ktcore/KTBulkActions.php:1520 +#: plugins/ktcore/KTBulkActions.php:1641 +msgid "Document has already been checked out by " +msgstr "" + +#: i18n/templates.c:4703 +msgid "Document has been emailed to recipients" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:310 +#: plugins/commercial/alerts/alerts.php:447 +msgid "Document has been expunged" +msgstr "" + +#: i18n/templates.c:7856 +msgid "Document has no assigned workflow." +msgstr "" + +#: lib/workflow/workflowutil.inc.php:559 +msgid "Document has no workflow" +msgstr "" + +#: i18n/templates.c:4709 +msgid "Document has not been emailed to recipients." +msgstr "" + +#: lib/actions/documentaction.inc.php:212 view.php:91 +msgid "Document info" +msgstr "" + +#: lib/actions/bulkaction.php:646 +msgid "Document is archived or deleted" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:469 +msgid "Document is checkout and cannot be overwritten" +msgstr "" + +#: i18n/templates.c:89 i18n/templates.c:164 i18n/templates.c:2099 +#: i18n/templates.c:2153 i18n/templates.c:2174 i18n/templates.c:2189 +#: i18n/templates.c:2210 i18n/templates.c:2237 i18n/templates.c:2690 +#: i18n/templates.c:8228 +msgid "Document is no longer available" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:454 +msgid "Document link created" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:497 +msgid "Document link deleted" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:350 +#, php-format +msgid "Document link emailed to %s. " +msgstr "" + +#: plugins/ktstandard/KTEmail.php:219 +#, php-format +msgid "Document link emailed to external addresses %s. " +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:493 +msgid "Document link not deleted. Document link does not exists, or previously deleted." +msgstr "" + +#: plugins/ktcore/document/edit.php:311 +msgid "Document metadata updated" +msgstr "" + +#: lib/dashboard/Notification.inc.php:220 +#: lib/subscriptions/subscriptions.inc.php:544 +msgid "Document modified" +msgstr "" + +#: lib/dashboard/Notification.inc.php:223 +#: lib/subscriptions/subscriptions.inc.php:547 +#: lib/subscriptions/subscriptions.inc.php:548 +msgid "Document moved" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:435 +msgid "Document must be a symbolic link entity" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:549 +#: plugins/commercial/network/extendedtransactioninfo/adminReports.php:245 +#: plugins/commercial/network/extendedtransactioninfo/latestchanges.php:80 +#: plugins/commercial/network/extendedtransactioninfo/latestchanges.php:93 +#: plugins/commercial/network/extendedtransactioninfo/rssfeed.php:73 +#: plugins/commercial/network/extendedtransactioninfo/standardReports.php:410 +#: plugins/commercial/network/topdownloads/TopDownloadsPlugin.php:182 +#: plugins/commercial/network/topdownloads/TopDownloadsPlugin.php:195 +#: plugins/commercial/network/userhistory/UserHistoryEntities.inc.php:86 +#: plugins/commercial/network/userhistory/UserHistoryEntities.inc.php:166 +msgid "Document no longer exists." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:431 +msgid "Document not specified" +msgstr "" + +#: lib/permissions/permissionutil.inc.php:690 +msgid "Document or Folder doesn't own its permission object" +msgstr "" + +#: i18n/templates.c:3482 +msgid "Document permissions" +msgstr "" + +#: lib/dashboard/Notification.inc.php:218 +#: lib/dashboard/Notification.inc.php:219 +#: lib/subscriptions/subscriptions.inc.php:542 +#: lib/subscriptions/subscriptions.inc.php:543 +msgid "Document removed" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1380 +msgid "Document renamed" +msgstr "" + +#: lib/dashboard/Notification.inc.php:225 +#: lib/subscriptions/subscriptions.inc.php:553 +msgid "Document restored" +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:190 +msgid "Document restored." +msgstr "" + +#: i18n/templates.c:8 +msgid "Document type" +msgstr "" + +#: plugins/commercial/alerts/alertTask.php:143 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:804 +msgid "Document type alert created: Due every " +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:864 +msgid "Document type alert reset on check-in: Due every " +msgstr "" + +#: plugins/commercial/alerts/alertTask.php:243 +msgid "Document type alert updated: Due every " +msgstr "" + +#: i18n/templates.c:3797 +msgid "Document type cannot be deleted" +msgstr "" + +#: i18n/templates.c:4532 +msgid "Document type changed" +msgstr "" + +#: i18n/templates.c:4922 +msgid "Document type could not be changed" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:186 +#: plugins/ktcore/admin/documentTypes.php:105 +msgid "Document type could not be deleted" +msgstr "" + +#: i18n/templates.c:4925 +msgid "Document type could not be reset" +msgstr "" + +#: plugins/ktcore/admin/documentTypes.php:93 +msgid "Document type created" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:190 +#: plugins/ktcore/admin/documentTypes.php:109 +msgid "Document type deleted" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:205 +#: plugins/ktcore/admin/documentTypes.php:130 +msgid "Document type disabled" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:220 +#: plugins/ktcore/admin/documentTypes.php:145 +msgid "Document type enabled" +msgstr "" + +#: search2/ajax/metadata.php:51 +msgid "Document type id is not specified." +msgstr "" + +#: lib/documentmanagement/DocumentType.inc:88 +msgid "Document type still in use" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:181 +#: plugins/ktcore/admin/documentTypes.php:100 +msgid "Document type still in use, could not be deleted" +msgstr "" + +#: i18n/templates.c:1205 i18n/templates.c:3710 +msgid "Document types" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:326 +msgid "Document version deleted" +msgstr "" + +#: plugins/housekeeper/HouseKeeper.inc.php:229 i18n/templates.c:941 +#: i18n/templates.c:2954 i18n/templates.c:2975 i18n/templates.c:2990 +msgid "Documents" +msgstr "" + +#: i18n/templates.c:6989 +msgid "Documents Indexed:" +msgstr "" + +#: i18n/templates.c:617 +msgid "Documents by Workflow and Document Type" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:425 +msgid "Documents can be emailed to external users by entering their email addresses below" +msgstr "" + +#: i18n/templates.c:6992 +msgid "Documents in Indexing Queue:" +msgstr "" + +#: i18n/templates.c:8609 +msgid "Documents may be associated on creation or modification with a workflow. Workflow assignment may occur on a per Folder or per Document Type basis and only one mode may be selected for the system. In order to automatically associate documents with a workflow, please select the appropriate plugin from the list below." +msgstr "" + +#: i18n/templates.c:6941 +msgid "Documents processed in a single migration run:" +msgstr "" + +#: i18n/templates.c:3233 +msgid "Documents which are deleted by users are hidden from view but still available for restoration. Since \"soft deletes\" consume system resources, it is possible to expunge these documents. Alternatively, you can restore them as necessary." +msgstr "" + +#: i18n/templates.c:6995 +msgid "Documents with Indexing Problems:" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:393 +#: lib/foldermanagement/folderutil.inc.php:531 +msgid "Documents: " +msgstr "" + +#: i18n/templates.c:7070 +msgid "Don't Share" +msgstr "" + +#: i18n/templates.c:3017 i18n/templates.c:3143 +msgid "Don't show me this again." +msgstr "" + +#: plugins/commercial/alerts/alerts.php:975 +msgid "Done" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1470 +#, php-format +msgid "Done indexing docid: %d" +msgstr "" + +#: search2/indexing/bin/diagnose.php:71 search2/indexing/bin/optimise.php:59 +#: search2/indexing/bin/recreateIndex.php:108 +#: search2/indexing/bin/registerTypes.php:86 +#: search2/indexing/bin/shutdown.php:87 search2/search/bin/search.php:144 +#: search2/search/bin/search2graphviz.php:93 +msgid "Done." +msgstr "" + +#: i18n/templates.c:4934 +msgid "Double-click to Edit" +msgstr "" + +#: i18n/templates.c:4931 +msgid "Double-click to Select" +msgstr "" + +#: i18n/templates.c:2390 +msgid "Down" +msgstr "" + +#: plugins/ktcore/KTColumns.inc.php:563 +#: plugins/ktcore/KTDocumentActions.php:341 i18n/transactions.c:6 +msgid "Download" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1119 +msgid "Download All" +msgstr "" + +#: lib/browse/BrowseColumns.inc.php:429 plugins/ktcore/KTColumns.inc.php:560 +#: plugins/ktcore/KTDocumentActions.php:346 +msgid "Download Document" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:149 +#: plugins/ktcore/KTDocumentActions.php:470 +msgid "Download File" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1375 +msgid "Download Files" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:199 +msgid "Download Free Trial" +msgstr "" + +#: i18n/templates.c:7340 i18n/templates.c:7343 +msgid "Download Support information" +msgstr "" + +#: i18n/templates.c:2519 +msgid "Download Zipped File" +msgstr "" + +#: i18n/templates.c:4553 +msgid "Download failed" +msgstr "" + +#: i18n/templates.c:4559 +msgid "Download succeeded" +msgstr "" + +#: i18n/templates.c:932 +msgid "Downloads" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:278 i18n/templates.c:4403 +#: i18n/templates.c:6515 +msgid "Dynamic Conditions" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:100 +msgid "Dynamic condition deleted" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:222 +#: plugins/ktcore/admin/conditions.php:257 +msgid "Dynamic condition saved" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:621 +msgid "Dynamic permission added" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:651 +msgid "Dynamic permission removed" +msgstr "" + +#: i18n/templates.c:4073 +msgid "Dynamic permissions" +msgstr "" + +#: i18n/templates.c:5480 +msgid "Each behaviour can cause a number of other behaviours — in the field's child fields — to become available. By assigning values to behaviours, and creating relationships between behaviours, you can create extremely complex relationships between available lookup values." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:95 +#: plugins/ktcore/admin/documentFieldsv2.php:350 +#: plugins/multiselect/InetdocumentFieldsv2.php:115 +#: plugins/multiselect/InetdocumentFieldsv2.php:415 +msgid "Each fieldset needs a unique name." +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:229 +msgid "Each unit has an associated folder. While the unit is being deleted, there may be some documents within the associated folder. By unselecting this option, they will not be removed." +msgstr "" + +#: i18n/templates.c:626 i18n/templates.c:734 +msgid "Each user will have performed a large number of different actions. In order to make the report more useful, please specify more details about the information you need." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:79 +#: plugins/ktcore/admin/workflowsv2.php:462 +msgid "Each workflow must have a unique name." +msgstr "" + +#: i18n/templates.c:218 i18n/templates.c:1250 i18n/templates.c:1256 +#: i18n/templates.c:1361 i18n/templates.c:1805 i18n/templates.c:1811 +#: i18n/templates.c:1862 i18n/templates.c:2774 i18n/templates.c:2783 +#: i18n/templates.c:2786 i18n/templates.c:3350 i18n/templates.c:3755 +#: i18n/templates.c:3770 i18n/templates.c:4811 i18n/templates.c:5042 +#: i18n/templates.c:5153 i18n/templates.c:5276 i18n/templates.c:5294 +#: i18n/templates.c:5363 i18n/templates.c:5423 i18n/templates.c:5648 +#: i18n/templates.c:5822 i18n/templates.c:5867 i18n/templates.c:5885 +#: i18n/templates.c:6173 i18n/templates.c:6191 i18n/templates.c:6266 +#: i18n/templates.c:6269 i18n/templates.c:6311 i18n/templates.c:6317 +#: i18n/templates.c:6347 i18n/templates.c:6356 i18n/templates.c:6428 +#: i18n/templates.c:6440 i18n/templates.c:6533 i18n/templates.c:6542 +#: i18n/templates.c:6575 i18n/templates.c:6584 i18n/templates.c:7043 +#: i18n/templates.c:7058 i18n/templates.c:7454 i18n/templates.c:7478 +#: i18n/templates.c:7484 i18n/templates.c:7586 i18n/templates.c:7595 +#: i18n/templates.c:7610 i18n/templates.c:7685 i18n/templates.c:7727 +#: i18n/templates.c:7745 i18n/templates.c:7751 i18n/templates.c:7766 +#: i18n/templates.c:7772 i18n/templates.c:8021 i18n/templates.c:8039 +#: i18n/templates.c:8105 i18n/templates.c:8114 i18n/templates.c:8552 +msgid "Edit" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:358 +#, php-format +msgid "Edit %s's groups" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1575 i18n/templates.c:7385 +#: i18n/templates.c:7388 +msgid "Edit Actions" +msgstr "" + +#: i18n/templates.c:5516 +msgid "Edit Behaviour" +msgstr "" + +#: i18n/templates.c:5102 +msgid "Edit Categorisation" +msgstr "" + +#: i18n/templates.c:5474 +msgid "Edit Complex Conditional Metadata" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:506 +msgid "Edit Details" +msgstr "" + +#: plugins/ktstandard/KTDisclaimers.php:62 +#: plugins/ktstandard/admin/manageDisclaimers.php:52 +#: plugins/ktstandard/admin/manageDisclaimers.php:54 +#: plugins/ktstandard/admin/manageDisclaimers.php:79 +msgid "Edit Disclaimers" +msgstr "" + +#: config/siteMap.inc:59 +msgid "Edit Document" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:170 +msgid "Edit Dynamic Condition" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:229 +#: plugins/multiselect/inetbasic.inc.php:325 i18n/templates.c:5696 +msgid "Edit Field" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:395 +#: plugins/multiselect/InetdocumentFieldsv2.php:465 i18n/templates.c:3800 +#: i18n/templates.c:3848 +msgid "Edit Fieldset" +msgstr "" + +#: i18n/templates.c:5177 +msgid "Edit Fieldset: #fieldset_name#" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:124 +#, php-format +msgid "Edit Group (%s)" +msgstr "" + +#: i18n/templates.c:6086 +msgid "Edit Group Details" +msgstr "" + +#: i18n/templates.c:4223 i18n/templates.c:4247 i18n/templates.c:4250 +msgid "Edit Groups" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:379 +msgid "Edit Help files" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:96 +msgid "Edit LDAP info" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:712 +#: plugins/multiselect/inetbasic.inc.php:950 i18n/templates.c:5207 +msgid "Edit Lookup Tree" +msgstr "" + +#: plugins/ktcore/document/edit.php:71 plugins/ktcore/document/edit.php:81 +#: plugins/ktcore/document/edit.php:163 i18n/templates.c:1892 +#: i18n/templates.c:3527 +msgid "Edit Metadata" +msgstr "" + +#: i18n/templates.c:2777 +msgid "Edit Provider Information" +msgstr "" + +#: plugins/commercial/network/quicklinks/QuicklinksPlugin.php:51 +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:53 +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:94 +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:185 +msgid "Edit Quicklinks" +msgstr "" + +#: i18n/templates.c:1772 +msgid "Edit RSS Feed" +msgstr "" + +#: i18n/templates.c:1778 +msgid "Edit RSS feed" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1780 +msgid "Edit Restriction" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:151 search/booleanSearch.php:243 +msgid "Edit Search" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:949 i18n/templates.c:7460 +msgid "Edit State" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2288 +msgid "Edit State Notifications" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2253 +msgid "Edit State Notifications." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1040 +msgid "Edit Transition" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2048 +msgid "Edit Transition Action" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:605 +msgid "Edit Transition Connections" +msgstr "" + +#: i18n/templates.c:6104 +msgid "Edit Unit Details" +msgstr "" + +#: i18n/templates.c:6122 +msgid "Edit User Details" +msgstr "" + +#: i18n/templates.c:4220 i18n/templates.c:4241 i18n/templates.c:4244 +msgid "Edit Users" +msgstr "" + +#: i18n/templates.c:5897 +msgid "Edit View" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:455 i18n/templates.c:7781 +msgid "Edit Workflow Details" +msgstr "" + +#: i18n/templates.c:7511 +msgid "Edit Workflow Details: #name#" +msgstr "" + +#: i18n/templates.c:1775 +msgid "Edit a RSS feed" +msgstr "" + +#: i18n/templates.c:3323 +msgid "Edit a link type" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:112 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:113 +msgid "Edit alert" +msgstr "" + +#: i18n/templates.c:2735 +msgid "Edit an authentication source" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:163 +#: plugins/ktcore/admin/savedSearch.php:144 search/booleanSearch.php:236 +msgid "Edit an existing condition" +msgstr "" + +#: i18n/templates.c:3767 +msgid "Edit document type." +msgstr "" + +#: i18n/templates.c:3764 +msgid "Edit fieldset." +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:87 +msgid "Edit help item" +msgstr "" + +#: i18n/templates.c:4178 i18n/templates.c:4346 +msgid "Edit permissions" +msgstr "" + +#: i18n/templates.c:2807 +msgid "Edit provider configuration" +msgstr "" + +#: i18n/templates.c:1856 +msgid "Edit search" +msgstr "" + +#: i18n/templates.c:2801 +msgid "Edit standard configuration" +msgstr "" + +#: i18n/templates.c:7907 +msgid "Edit state properties" +msgstr "" + +#: i18n/templates.c:3059 +msgid "Edit the Email Settings in DMS Administration >> System Configuration to set up emailing on this server." +msgstr "" + +#: i18n/templates.c:3113 +msgid "Edit the crontab:" +msgstr "" + +#: i18n/templates.c:5198 i18n/templates.c:5201 +msgid "Edit these details" +msgstr "" + +#: i18n/templates.c:4448 i18n/templates.c:4451 +msgid "Edit this help page." +msgstr "" + +#: i18n/templates.c:3047 i18n/templates.c:3050 +msgid "Edit this introduction." +msgstr "" + +#: i18n/templates.c:7991 +msgid "Edit transition properties" +msgstr "" + +#: i18n/templates.c:5375 +msgid "Edit value" +msgstr "" + +#: i18n/templates.c:8048 +msgid "Edit workflow properties" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:133 +#: i18n/templates.c:4940 +msgid "Editing" +msgstr "" + +#: i18n/templates.c:4637 +msgid "Editing Document (check-out)" +msgstr "" + +#: i18n/templates.c:5525 +msgid "Editing Fieldset Rules (Simple)" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:132 +#, php-format +msgid "Editing authentication source: %s" +msgstr "" + +#: i18n/templates.c:5489 +msgid "Editing behaviour Jack" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:79 +#: plugins/ktstandard/admin/manageDisclaimers.php:81 +msgid "Editing: " +msgstr "" + +#: i18n/templates.c:7748 +msgid "Effects" +msgstr "" + +#: i18n/templates.c:458 i18n/templates.c:542 +msgid "Either select a range in which to view the actions, or specify the number of days into the past to view." +msgstr "" + +#: i18n/templates.c:635 i18n/templates.c:743 +msgid "Either select a range in which to view the users actions, or specify the number of days into the past to view." +msgstr "" + +#: plugins/commercial/electronic-signatures/Esignature.inc.php:231 +msgid "Electronic Signature - Failed Authentication: " +msgstr "" + +#: plugins/commercial/electronic-signatures/Esignature.inc.php:243 +msgid "Electronic Signature: " +msgstr "" + +#: plugins/commercial/electronic-signatures/KTElectronicSignaturesPlugin.php:97 +msgid "Electronic Signatures" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:350 plugins/ktstandard/KTEmail.php:378 +#: i18n/templates.c:8420 +msgid "Email" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:158 +#: plugins/ktcore/admin/userManagement.php:223 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:298 +#: preferences.php:83 i18n/templates.c:1697 i18n/templates.c:1712 +msgid "Email Address" +msgstr "" + +#: i18n/transactions.c:15 +msgid "Email Attachment" +msgstr "" + +#: i18n/templates.c:4712 +msgid "Email Document" +msgstr "" + +#: plugins/commercial/wintools/BaobabPlugin.php:92 +#: plugins/ktcore/KTCorePlugin.php:294 i18n/templates.c:1226 +msgid "Email Document Types" +msgstr "" + +#: i18n/templates.c:4829 +msgid "Email Document to users." +msgstr "" + +#: i18n/transactions.c:13 +msgid "Email Link" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:159 +#: plugins/ktcore/admin/userManagement.php:224 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:299 +#: preferences.php:90 +msgid "Email Notifications" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:591 +msgid "Email Plugin" +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:322 +#: plugins/ktcore/admin/configSettings.php:326 +msgid "Email Settings" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:424 +msgid "Email addresses" +msgstr "" + +#: i18n/templates.c:8417 +msgid "Email document" +msgstr "" + +#: i18n/templates.c:3056 +msgid "Email has not been configured on this server. Emailing of documents and sending of notifications are disabled." +msgstr "" + +#: lib/email/Email.inc:106 lib/email/Email.inc:162 lib/email/Email.inc:224 +#: lib/email/Email.inc:262 lib/email/Email.inc:286 +msgid "Email is not configured." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:578 +msgid "Email sent" +msgstr "" + +#: i18n/templates.c:233 i18n/templates.c:245 i18n/templates.c:1259 +#: i18n/templates.c:3776 i18n/templates.c:5753 i18n/templates.c:6458 +msgid "Enable" +msgstr "" + +#: i18n/templates.c:2360 i18n/templates.c:2363 +msgid "Enable Admin Mode" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:251 +msgid "Enable Task" +msgstr "" + +#: i18n/templates.c:3773 +msgid "Enable document type." +msgstr "" + +#: i18n/templates.c:242 +msgid "Enable repeat after action" +msgstr "" + +#: i18n/templates.c:230 +msgid "Enable reset alert on check-in" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:477 i18n/templates.c:1151 +#: i18n/templates.c:5357 i18n/templates.c:6431 i18n/templates.c:6449 +#: i18n/templates.c:6452 i18n/templates.c:7589 i18n/templates.c:8111 +msgid "Enabled" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:191 +msgid "Enter a new password for the account." +msgstr "" + +#: i18n/templates.c:17 +msgid "Enter number and select frequecy" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:87 +msgid "Enter part of the group's name. e.g. ad will match administrators." +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/adminReports.php:72 +#: plugins/commercial/network/extendedtransactioninfo/standardReports.php:90 +#: plugins/commercial/professional-reporting/admin/userReporting.php:57 +#: plugins/commercial/wintools/baobabUserManagement.php:101 +#: plugins/ktcore/admin/userManagement.php:80 +msgid "Enter part of the person's username. e.g. ra will match brad." +msgstr "" + +#: i18n/templates.c:2429 +msgid "Enter search criteria..." +msgstr "" + +#: i18n/templates.c:8447 +msgid "Enter the URL to the external document or site." +msgstr "" + +#: i18n/templates.c:1691 +msgid "Enter your username and email address. A link will be mailed to you in order to verify your email address." +msgstr "" + +#: plugins/commercial/alerts/alerts.php:814 +msgid "Entities" +msgstr "" + +#: lib/browse/Criteria.inc:803 +msgid "Equal to" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:66 +#: i18n/templates.c:4757 +msgid "Error" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:215 +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:240 +msgid "Error - could not create the DropppedDocuments folder: " +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:166 +msgid "Error - could not create the personal folder: " +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:185 +msgid "Error - could not get permission object for the personal folder: " +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:143 +msgid "Error - could not get the DropppedDocuments folder: " +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:134 +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:207 +msgid "Error - could not get the root folder: " +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:397 +msgid "Error adding Fields" +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:177 +msgid "Error assigning workflow." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:701 +#: plugins/multiselect/inetbasic.inc.php:939 +msgid "Error building tree. Is this a valid tree-lookup field?" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:471 +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:499 +msgid "Error changing to simple" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:461 +msgid "Error creating allocation" +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:166 +msgid "Error deleting permission" +msgstr "" + +#: search/booleanSearch.php:188 +msgid "Error deleting search" +msgstr "" + +#: lib/actions/bulkaction.php:358 +msgid "Error fetching document name" +msgstr "" + +#: lib/actions/bulkaction.php:389 +msgid "Error fetching folder name" +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:159 +msgid "Error finding permission" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:385 +msgid "Error getting permission" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:721 +#: plugins/ktcore/admin/userManagement.php:736 +#: plugins/ktcore/admin/userManagement.php:750 +msgid "Error getting user object" +msgstr "" + +#: i18n/templates.c:4910 +msgid "Error has been submitted. Thank you!" +msgstr "" + +#: lib/filelike/fsfilelike.inc.php:65 +msgid "Error opening file" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:250 +msgid "Error re-ordering quicklinks" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:234 +#: plugins/multiselect/InetdocumentFieldsv2.php:270 +msgid "Error retrieving list of types." +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:233 +msgid "Error retrieving username" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:285 plugins/ktstandard/KTEmail.php:341 +#, php-format +msgid "Error sending email (%s) to %s" +msgstr "" + +#: lib/email/Email.inc:139 lib/email/Email.inc:196 +#, php-format +msgid "Error sending mail to %s; mailer error code=%s" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:140 +#: plugins/ktstandard/admin/manageDisclaimers.php:112 +msgid "Error updating item" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:266 +#: plugins/ktcore/folder/Permissions.php:542 +#: plugins/ktcore/folder/Permissions.php:575 +#: plugins/ktcore/folder/Permissions.php:607 +#: plugins/ktcore/folder/Permissions.php:644 +msgid "Error updating permissions" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:724 +#: plugins/ktcore/admin/userManagement.php:739 +#: plugins/ktcore/admin/userManagement.php:753 +msgid "Error updating user" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:508 +msgid "Error: Cannot create WorkSpaceOwner role allocation on personal folder" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:231 +msgid "Error: Failed to create WorkSpaceOwner Role" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:177 +msgid "Error: WorkSpaceOwner Role not setup, cannot assign to Personal Folder" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:406 +msgid "Error: cannot create WorkSpaceOwner role allocation" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:421 +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:522 +msgid "Error: cannot create role allocation" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:452 +msgid "Error: cannot find WorkSpaceOwner role allocation" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:154 +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:246 +msgid "Error: cannot set user role permissions: more than one role named 'WorkSpaceOwner' exists" +msgstr "" + +#: i18n/templates.c:6959 +msgid "Estimated completion time:" +msgstr "" + +#: i18n/templates.c:6962 +msgid "Estimated migration time remaining:" +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:155 +#: plugins/commercial/wintools/key.inc.php:167 +msgid "Evaluation" +msgstr "" + +#: i18n/templates.c:296 +msgid "Example" +msgstr "" + +#: search2/indexing/extractors/ExcelExtractor.inc.php:12 +msgid "Excel Extractor" +msgstr "" + +#: search2/indexing/extractors/ExifExtractor.inc.php:44 +msgid "Exif Extractor" +msgstr "" + +#: i18n/templates.c:140 +msgid "Existing Alerts" +msgstr "" + +#: i18n/templates.c:6527 +msgid "Existing Conditions" +msgstr "" + +#: i18n/templates.c:5030 +msgid "Existing Fieldsets" +msgstr "" + +#: i18n/templates.c:7613 +msgid "Existing Notifications" +msgstr "" + +#: i18n/templates.c:7769 +msgid "Existing Restrictions" +msgstr "" + +#: i18n/templates.c:7034 +msgid "Existing Saved Search Criteria" +msgstr "" + +#: i18n/templates.c:6566 +msgid "Existing Searches" +msgstr "" + +#: i18n/templates.c:5069 +msgid "Existing customized help pages" +msgstr "" + +#: i18n/templates.c:8543 +msgid "Existing disclaimers" +msgstr "" + +#: i18n/templates.c:5258 i18n/templates.c:5849 +msgid "Existing document fieldsets" +msgstr "" + +#: i18n/templates.c:1238 i18n/templates.c:3743 +msgid "Existing document types" +msgstr "" + +#: i18n/templates.c:3944 +msgid "Existing generic document fields" +msgstr "" + +#: i18n/templates.c:3914 i18n/templates.c:5669 i18n/templates.c:5816 +msgid "Existing members" +msgstr "" + +#: i18n/templates.c:5546 i18n/templates.c:5615 +msgid "Existing ordering" +msgstr "" + +#: i18n/templates.c:5114 +msgid "Existing permissions" +msgstr "" + +#: search/booleanSearch.php:335 +msgid "Existing search" +msgstr "" + +#: i18n/templates.c:8297 +msgid "Existing threads" +msgstr "" + +#: i18n/templates.c:5732 +msgid "Existing values" +msgstr "" + +#: i18n/templates.c:7574 i18n/templates.c:8093 +msgid "Existing workflows" +msgstr "" + +#: lib/ktentity.inc:295 +msgid "Expected an array!" +msgstr "" + +#: i18n/templates.c:1289 +msgid "Expires" +msgstr "" + +#: i18n/templates.c:3251 i18n/transactions.c:11 +msgid "Expunge" +msgstr "" + +#: i18n/templates.c:3257 +msgid "Expunge All" +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/adminReports.php:45 +msgid "Extended Transaction History Information" +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/ExtendedTransactionInfoPlugin.php:46 +#: plugins/commercial/network/extendedtransactioninfo/ExtendedTransactionInfoPlugin.php:55 +#: plugins/commercial/network/extendedtransactioninfo/adminReports.php:36 +#: plugins/commercial/network/extendedtransactioninfo/standardReports.php:46 +#: i18n/templates.c:416 +msgid "Extended Transaction Information" +msgstr "" + +#: i18n/templates.c:7106 +msgid "Extensions" +msgstr "" + +#: i18n/templates.c:8573 +msgid "External Links from this document" +msgstr "" + +#: plugins/search2/ExternalDashlet.php:47 +msgid "External Resource Dependancy Status" +msgstr "" + +#: i18n/templates.c:6893 i18n/templates.c:6905 i18n/templates.c:6911 +msgid "External Resource Dependency Status" +msgstr "" + +#: i18n/templates.c:8399 +msgid "External link from this document" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1388 +#, php-format +msgid "Extra Info docid: %d Source File: '%s' Target File: '%s'" +msgstr "" + +#: i18n/templates.c:1631 i18n/templates.c:1655 i18n/templates.c:5306 +#: i18n/templates.c:5330 +msgid "Extra Options" +msgstr "" + +#: i18n/templates.c:7121 i18n/templates.c:7166 +msgid "Extractor" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:320 +#: plugins/search2/reporting/ExtractorInfo.php:49 i18n/templates.c:7088 +msgid "Extractor Information" +msgstr "" + +#: search2/indexing/bin/diagnose.php:66 +msgid "Extractor:" +msgstr "" + +#: i18n/templates.c:6926 +msgid "Extractors" +msgstr "" + +#: lib/actions/bulkaction.php:317 lib/actions/bulkaction.php:335 +msgid "Failed (unknown reason)" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:509 +#, php-format +msgid "Failed to add %s to %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1526 +#: plugins/ktcore/admin/workflowsv2.php:1530 +msgid "Failed to allocate as specified." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:634 +msgid "Failed to change name of behaviour." +msgstr "" + +#: plugins/ktcore/KTPermissions.php:729 plugins/ktcore/KTPermissions.php:784 +msgid "Failed to change the role allocation." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:534 +#, php-format +msgid "Failed to check out the document: %s" +msgstr "" + +#: notify.php:98 +msgid "Failed to clear notifications." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1145 +#, php-format +msgid "Failed to clear transition: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1139 +#, php-format +msgid "Failed to clear trigger: %s" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1588 +#: plugins/ktcore/KTDocumentActions.php:1597 +msgid "Failed to copy document: " +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:339 +#, php-format +msgid "Failed to copy transition: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:308 +#, php-format +msgid "Failed to copy workflow controlled actions: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1355 +#: plugins/ktcore/admin/workflowsv2.php:1365 +#, php-format +msgid "Failed to create assignment: %s" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:219 +#: plugins/multiselect/InetdocumentFieldsv2.php:249 +#, php-format +msgid "Failed to create fieldset: %s" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:448 +#: plugins/multiselect/inetbasic.inc.php:635 +#, php-format +msgid "Failed to create lookup: %s" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:347 +#, php-format +msgid "Failed to create state: %s" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:450 plugins/ktcore/KTPermissions.php:489 +#: plugins/ktcore/KTPermissions.php:559 +msgid "Failed to create the role allocation." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:377 +#, php-format +msgid "Failed to create transition: %s" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:335 +#, php-format +msgid "Failed to create workflow: %s" +msgstr "" + +#: plugins/commercial/wintools/baobabKeyManagement.php:125 +#, php-format +msgid "Failed to delete key: %s" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:93 +msgid "Failed to delete search" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1224 +#, php-format +msgid "Failed to delete state: %s" +msgstr "" + +#: search2/indexing/extractors/OpenOfficeTextExtractor.inc.php:105 +#: search2/indexing/extractors/OpenXmlTextExtractor.inc.php:169 +#: search2/indexing/extractors/OpenXmlTextExtractor.inc.php:215 +msgid "Failed to execute command: " +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:199 +msgid "Failed to expunge" +msgstr "" + +#: search2/indexing/extractors/OpenOfficeTextExtractor.inc.php:112 +#: search2/indexing/extractors/OpenXmlTextExtractor.inc.php:176 +msgid "Failed to find file: " +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:962 +#: plugins/ktcore/KTDocumentActions.php:970 +#: plugins/ktcore/admin/documentCheckout.php:119 +#: plugins/ktcore/admin/documentCheckout.php:127 +msgid "Failed to force the document's checkin." +msgstr "" + +#: plugins/ktstandard/workflow/TypeAssociator.php:146 +msgid "Failed to get type mapping: " +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:148 +msgid "Failed to locate template" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1348 +#: plugins/ktcore/KTDocumentActions.php:1357 +msgid "Failed to move document: " +msgstr "" + +#: search2/indexing/extractors/OpenXmlTextExtractor.inc.php:222 +msgid "Failed to open file: " +msgstr "" + +#: lib/import/fsimportstorage.inc.php:68 +#: lib/import/fsimportstorage.inc.php:101 +msgid "Failed to open folder" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:520 +#, php-format +msgid "Failed to remove %s from %s" +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:120 +#, php-format +msgid "Failed to remove that column: %s" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:294 +msgid "Failed to restore" +msgstr "" + +#: lib/browse/DocumentCollection.inc.php:522 +#, php-format +msgid "Failed to retrieve documents: %s" +msgstr "" + +#: lib/browse/DocumentCollection.inc.php:516 +#, php-format +msgid "Failed to retrieve folders: %s" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:185 +msgid "Failed to set group details." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:392 +#: plugins/ktcore/admin/workflowsv2.php:355 +#: plugins/ktcore/admin/workflowsv2.php:710 +#, php-format +msgid "Failed to set transition origins: %s" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:214 +msgid "Failed to set unit details." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:2084 +#: plugins/ktcore/KTDocumentActions.php:2090 +#, php-format +msgid "Failed to update document: %s" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:311 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:343 +#: plugins/multiselect/inetbasic.inc.php:470 +#: plugins/multiselect/inetbasic.inc.php:516 +#, php-format +msgid "Failed to update field: %s" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:104 +msgid "Failed to update user" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:138 +#: plugins/ktcore/admin/userManagement.php:319 +#: plugins/ktcore/admin/userManagement.php:482 preferences.php:215 +msgid "Failed to update user." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:357 +#: plugins/ktcore/admin/workflowsv2.php:299 +#: plugins/ktcore/admin/workflowsv2.php:534 +#: plugins/ktcore/admin/workflowsv2.php:1218 +#, php-format +msgid "Failed to update workflow: %s" +msgstr "" + +#: preferences.php:252 +msgid "Failed to update your details." +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:429 +msgid "Failure deleting folders." +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:350 +#: lib/foldermanagement/folderutil.inc.php:502 +#, php-format +msgid "Failure resolving child folder with id = %d." +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:1792 +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:664 +#: plugins/ktcore/KTPermissions.php:838 +msgid "Failure to generate folderlisting." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:81 +#: i18n/templates.c:1547 i18n/templates.c:6746 +msgid "False" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:115 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:239 +#: plugins/multiselect/inetbasic.inc.php:178 +#: plugins/multiselect/inetbasic.inc.php:338 +#: plugins/multiselect/inetbasic.inc.php:392 i18n/templates.c:1358 +#: i18n/templates.c:5150 i18n/templates.c:5420 i18n/templates.c:5819 +msgid "Field Name" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:127 +#: plugins/multiselect/inetbasic.inc.php:190 +msgid "Field Type" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:391 +msgid "Field cannot be its own parent field" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:222 +#: plugins/multiselect/inetbasic.inc.php:312 +msgid "Field created." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:872 +#: plugins/multiselect/inetbasic.inc.php:1173 +msgid "Field deleted." +msgstr "" + +#: i18n/templates.c:3836 i18n/templates.c:3884 +msgid "Field has conditions attached to it." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:902 +#: plugins/multiselect/inetbasic.inc.php:1207 +msgid "Field moved down." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:887 +#: plugins/multiselect/inetbasic.inc.php:1190 +msgid "Field moved up." +msgstr "" + +#: i18n/templates.c:5612 +msgid "Field ordering" +msgstr "" + +#: i18n/templates.c:5699 +msgid "Field properties" +msgstr "" + +#: search2/ajax/metadata.php:56 +msgid "Field set id is not specified." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:314 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:346 +#: plugins/multiselect/inetbasic.inc.php:473 +#: plugins/multiselect/inetbasic.inc.php:519 +msgid "Field updated." +msgstr "" + +#: i18n/templates.c:3953 i18n/templates.c:5270 i18n/templates.c:5861 +#: i18n/templates.c:6887 +msgid "Fields" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:403 +msgid "Fields ordered." +msgstr "" + +#: i18n/templates.c:5099 +msgid "Fields that have lookup categories." +msgstr "" + +#: i18n/templates.c:3806 i18n/templates.c:3818 i18n/templates.c:3854 +#: i18n/templates.c:3866 +msgid "Fields which are currently not included in any set can be added to this set." +msgstr "" + +#: i18n/templates.c:1181 i18n/templates.c:3686 i18n/templates.c:3896 +#: i18n/templates.c:5651 i18n/templates.c:5762 +msgid "Fieldset" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:92 +#: plugins/ktcore/admin/documentFieldsv2.php:347 +#: plugins/multiselect/InetdocumentFieldsv2.php:112 +#: plugins/multiselect/InetdocumentFieldsv2.php:412 +msgid "Fieldset Name" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:113 +#: plugins/multiselect/InetdocumentFieldsv2.php:133 +msgid "Fieldset Type" +msgstr "" + +#: i18n/templates.c:3845 i18n/templates.c:3893 +msgid "Fieldset cannot be made conditional. One of the fields must not be a lookup." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:222 +#: plugins/multiselect/InetdocumentFieldsv2.php:252 +msgid "Fieldset created." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:327 +#: plugins/multiselect/InetdocumentFieldsv2.php:387 +msgid "Fieldset deleted" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:444 +#: plugins/multiselect/InetdocumentFieldsv2.php:519 +msgid "Fieldset details updated." +msgstr "" + +#: i18n/templates.c:3911 i18n/templates.c:5666 i18n/templates.c:5810 +msgid "Fieldset members" +msgstr "" + +#: i18n/templates.c:3899 i18n/templates.c:5654 i18n/templates.c:5771 +msgid "Fieldset properties" +msgstr "" + +#: search2/search/search.inc.php:506 +msgid "Fieldset was not found" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:315 +#: plugins/ktcore/admin/documentTypes.php:241 +msgid "Fieldsets associated." +msgstr "" + +#: i18n/templates.c:1349 i18n/templates.c:5141 +msgid "Fieldsets bring together different fields into a collection of related information." +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:296 +#: plugins/ktcore/admin/documentTypes.php:222 +msgid "Fieldsets removed." +msgstr "" + +#: i18n/templates.c:5645 +msgid "Fieldsets that are marked as conditional." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:656 +#: plugins/ktcore/folder/addDocument.php:126 +#: plugins/multiselect/addDocument.php:152 +msgid "File" +msgstr "" + +#: ktoffice/controllers/list.php:339 lib/browse/Criteria.inc:799 +msgid "File Size" +msgstr "" + +#: i18n/templates.c:4943 +msgid "File Type" +msgstr "" + +#: i18n/templates.c:311 i18n/templates.c:1982 i18n/templates.c:2021 +msgid "File is a" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:196 +msgid "File is a: " +msgstr "" + +#: i18n/templates.c:6923 +msgid "File types" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:270 +#: plugins/multiselect/addDocument.php:312 +msgid "File uploaded successfully. Please fill in the metadata below." +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:265 +#: plugins/multiselect/addDocument.php:307 +msgid "File uploaded successfully. Processing." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:293 +msgid "File uploads are disabled in your PHP configuration" +msgstr "" + +#: ktoffice/controllers/list.php:336 plugins/ktcore/KTDocumentActions.php:1282 +#: plugins/ktcore/KTDocumentActions.php:1517 +#: plugins/rssplugin/KTrss.inc.php:396 +#: search2/search/fields/FilenameField.inc.php:47 i18n/templates.c:7118 +#: i18n/templates.c:7163 +msgid "Filename" +msgstr "" + +#: i18n/templates.c:7256 +msgid "Filename:" +msgstr "" + +#: i18n/templates.c:1334 +msgid "Files" +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:168 +msgid "Files could not be created in the tmp directory for comparison." +msgstr "" + +#: search2/search/fields/FilesizeField.inc.php:44 +msgid "Filesize" +msgstr "" + +#: lib/import/fsimportstorage.inc.php:50 +msgid "Filesystem location given does not exist" +msgstr "" + +#: lib/import/fsimportstorage.inc.php:53 +msgid "Filesystem location given is not a directory" +msgstr "" + +#: i18n/templates.c:53 i18n/templates.c:1940 i18n/templates.c:1946 +#: i18n/templates.c:4058 i18n/templates.c:4064 i18n/templates.c:4283 +#: i18n/templates.c:4286 i18n/templates.c:4316 i18n/templates.c:4319 +#: i18n/templates.c:4430 i18n/templates.c:4436 i18n/templates.c:7418 +msgid "Filter" +msgstr "" + +#: ktapi/ktapi.inc.php:1385 +msgid "Filter should be a string." +msgstr "" + +#: i18n/templates.c:7412 +msgid "Filter<" +msgstr "" + +#: i18n/templates.c:3014 +msgid "Find out what's new in KT 3." +msgstr "" + +#: i18n/templates.c:4460 +msgid "Finish with this column's behaviours." +msgstr "" + +#: plugins/commercial/electronic-signatures/Esignature.inc.php:206 +#: plugins/ktcore/KTPortlets.php:95 +#: search2/search/fields/FolderField.inc.php:44 i18n/templates.c:1211 +#: i18n/templates.c:3716 i18n/templates.c:6353 +msgid "Folder" +msgstr "" + +#: plugins/ktcore/folder/Rename.php:116 +#, php-format +msgid "Folder \"%s\" renamed to \"%s\"." +msgstr "" + +#: ktoffice/controllers/list.php:1361 +msgid "Folder Created" +msgstr "" + +#: ktoffice/controllers/list.php:1379 +msgid "Folder Deleted" +msgstr "" + +#: plugins/ktcore/folder/Transactions.php:89 i18n/templates.c:2468 +msgid "Folder History" +msgstr "" + +#: search2/search/fields/FolderFieldID.inc.php:44 +msgid "Folder ID" +msgstr "" + +#: i18n/templates.c:7268 +msgid "Folder ID:" +msgstr "" + +#: ktoffice/controllers/list.php:1342 +msgid "Folder Renamed" +msgstr "" + +#: i18n/templates.c:2462 +msgid "Folder Transaction History" +msgstr "" + +#: lib/dashboard/Notification.inc.php:214 +#: lib/subscriptions/subscriptions.inc.php:538 +msgid "Folder added" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:921 plugins/ktcore/KTBulkActions.php:942 +msgid "Folder cannot be archived" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:705 plugins/ktcore/KTBulkActions.php:726 +msgid "Folder cannot be copied" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:87 plugins/ktcore/KTBulkActions.php:108 +msgid "Folder cannot be deleted" +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:659 +msgid "Folder cannot be exported, an error occurred: " +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:450 plugins/ktcore/KTBulkActions.php:471 +msgid "Folder cannot be moved" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:628 +#, php-format +msgid "Folder copied from %s to %s" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:105 +msgid "Folder created" +msgstr "" + +#: i18n/permissions.c:15 +msgid "Folder details" +msgstr "" + +#: ktoffice/controllers/list.php:1361 +msgid "Folder has been successfully created" +msgstr "" + +#: ktoffice/controllers/list.php:1379 +msgid "Folder has been successfully deleted" +msgstr "" + +#: ktoffice/controllers/list.php:1342 +msgid "Folder has been successfully renamed" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:146 +msgid "Folder has no parent" +msgstr "" + +#: search2/ajax/treeNodes.php:43 +msgid "Folder id is not specified." +msgstr "" + +#: ktapi/ktapi.inc.php:1493 ktapi/ktapi.inc.php:1670 +msgid "Folder id must be numeric." +msgstr "" + +#: i18n/templates.c:2120 i18n/templates.c:2279 +msgid "Folder is no longer available" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:222 +#, php-format +msgid "Folder moved from %s to %s" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:750 +msgid "Folder must be a symbolic link entity" +msgstr "" + +#: ktoffice/controllers/list.php:144 ktoffice/controllers/list.php:297 +#: plugins/ktcore/KTFolderActions.php:97 +msgid "Folder name" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:746 +msgid "Folder not specified" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:152 +msgid "Folder parent does not exist" +msgstr "" + +#: lib/dashboard/Notification.inc.php:215 +#: lib/dashboard/Notification.inc.php:216 +#: lib/subscriptions/subscriptions.inc.php:539 +#: lib/subscriptions/subscriptions.inc.php:540 +msgid "Folder removed" +msgstr "" + +#: plugins/ktcore/folder/Transactions.php:53 +#: plugins/ktcore/folder/Transactions.php:58 +msgid "Folder transactions" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:137 +#: lib/foldermanagement/folderutil.inc.php:462 +msgid "Folder with the same name already exists in the new parent folder" +msgstr "" + +#: lib/browse/browseutil.inc.php:201 i18n/templates.c:938 +#: i18n/templates.c:2945 i18n/templates.c:2966 i18n/templates.c:2987 +msgid "Folders" +msgstr "" + +#: i18n/templates.c:2486 +msgid "Folders are one way of organising documents in the document management system. Folders provide meaning in the traditional file storage way - through a file path." +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:396 +#: lib/foldermanagement/folderutil.inc.php:534 +msgid "Folders: " +msgstr "" + +#: i18n/templates.c:4646 +msgid "For historical purposes, describe the changes you made to this document.

" +msgstr "" + +#: plugins/search2/IndexingHelp.php:72 plugins/search2/IndexingHelp.php:88 +msgid "For more information, please see" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:189 +#: plugins/ktcore/admin/groupManagement.php:377 +#: plugins/ktcore/admin/groupManagement.php:721 +#: plugins/ktcore/admin/userManagement.php:664 +msgid "For security purposes, you cannot remove your own administration priviledges." +msgstr "" + +#: i18n/templates.c:5447 +msgid "For the majority of conditional cases, simply walking through a test is sufficient. You can do that below for the fieldset you have selected." +msgstr "" + +#: i18n/transactions.c:12 +msgid "Force CheckIn" +msgstr "" + +#: i18n/templates.c:3302 +msgid "Force Checkin" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:728 +msgid "Force Original Filename" +msgstr "" + +#: i18n/templates.c:6368 +msgid "Force the user to change their password on their next login." +msgstr "" + +#: i18n/templates.c:6362 i18n/templates.c:6365 +msgid "Force user to change password" +msgstr "" + +#: i18n/templates.c:1688 +msgid "Forgot your password?" +msgstr "" + +#: lib/ktentity.inc:221 +#, php-format +msgid "Found and testing object cache for class %s, id %d" +msgstr "" + +#: i18n/templates.c:1325 +msgid "Free Space" +msgstr "" + +#: plugins/i18n/french/FrenchPlugin.php:51 +msgid "French translation" +msgstr "" + +#: plugins/ktcore/scheduler/taskScheduler.php:66 i18n/templates.c:203 +msgid "Frequency" +msgstr "" + +#: i18n/templates.c:6944 +msgid "Frequency at which migration batch task runs:" +msgstr "" + +#: i18n/templates.c:3335 +msgid "From this panel you can edit or delete existing link types." +msgstr "" + +#: search2/search/fields/FullPathField.inc.php:47 +msgid "Full Path" +msgstr "" + +#: i18n/templates.c:1109 +msgid "Full login history for users" +msgstr "" + +#: plugins/ktstandard/KTIndexer.php:46 +msgid "Full-text Content Indexing" +msgstr "" + +#: lib/util/ktutil.inc:268 +msgid "GB" +msgstr "" + +#: i18n/templates.c:614 +msgid "General Activity" +msgstr "" + +#: lib/browse/Criteria.inc:737 +msgid "General Metadata" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:366 +#: plugins/ktcore/admin/configSettings.php:336 +#: plugins/ktcore/admin/configSettings.php:340 +msgid "General Settings" +msgstr "" + +#: search2/search/fields/GeneralTextField.inc.php:64 +msgid "General Text" +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:73 +#: plugins/ktstandard/PDFGeneratorAction.php:178 +#: plugins/ktstandard/PDFGeneratorAction.php:388 +#: plugins/ktstandard/PDFGeneratorAction.php:408 +msgid "Generate PDF" +msgstr "" + +#: i18n/templates.c:8576 +msgid "Generate PDF of" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:125 +#: plugins/ktcore/admin/documentFieldsv2.php:363 +#: plugins/multiselect/InetdocumentFieldsv2.php:145 +#: plugins/multiselect/InetdocumentFieldsv2.php:428 i18n/templates.c:3950 +#: i18n/templates.c:5186 i18n/templates.c:5264 i18n/templates.c:5855 +msgid "Generic" +msgstr "" + +#: plugins/ktcore/KTColumns.inc.php:229 +msgid "Generic Date Function" +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:382 +msgid "Generic Document Information" +msgstr "" + +#: i18n/templates.c:299 i18n/templates.c:1973 i18n/templates.c:2009 +msgid "Generic Information" +msgstr "" + +#: plugins/i18n/german/GermanPlugin.php:51 +msgid "German translation plugin" +msgstr "" + +#: i18n/templates.c:443 +msgid "Global Activity" +msgstr "" + +#: i18n/templates.c:425 +msgid "Global Activity Information" +msgstr "" + +#: i18n/templates.c:527 +msgid "Global Activity in \"#folder#\"" +msgstr "" + +#: i18n/templates.c:836 +msgid "Go" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1475 +#, php-format +msgid "Go here to download the zip file if you are not automatically redirected there" +msgstr "" + +#: plugins/commercial/network/gotodocumentid/GoToDocumentIdPlugin.php:87 +msgid "Go to Document ID" +msgstr "" + +#: i18n/templates.c:6878 +msgid "Grammar" +msgstr "" + +#: i18n/templates.c:1292 +msgid "Granted to" +msgstr "" + +#: lib/browse/Criteria.inc:802 +msgid "Greater than" +msgstr "" + +#: plugins/commercial/alerts/KTDocTypeAlerts.php:173 +#: plugins/commercial/alerts/KTDocTypeAlerts.php:252 +#: plugins/commercial/alerts/alerts.php:900 +#: plugins/ktcore/folder/Permissions.php:425 +#: plugins/ktcore/folder/Permissions.php:432 i18n/templates.c:1850 +#: i18n/templates.c:3509 i18n/templates.c:4079 i18n/templates.c:4097 +#: i18n/templates.c:4142 i18n/templates.c:4385 i18n/templates.c:4406 +#: i18n/templates.c:7979 +msgid "Group" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:696 +#, php-format +msgid "Group \"%s\" created." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:725 +#, php-format +msgid "Group \"%s\" deleted." +msgstr "" + +#: i18n/templates.c:6143 +msgid "Group Administration" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:59 +#: plugins/ktcore/admin/groupManagement.php:66 +#: plugins/ktcore/admin/groupManagement.php:738 +msgid "Group Management" +msgstr "" + +#: i18n/templates.c:6434 +msgid "Group Memberships" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:87 +#: plugins/ktcore/admin/groupManagement.php:127 +#: plugins/ktcore/admin/groupManagement.php:553 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:549 +#: i18n/templates.c:6167 i18n/templates.c:8507 +msgid "Group Name" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:277 +msgid "Group Restrictions" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:754 +msgid "Group currently has no subgroups." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:196 +#: plugins/ktcore/admin/groupManagement.php:198 +msgid "Group details updated." +msgstr "" + +#: ktapi/ktapi.inc.php:1559 ktapi/ktapi.inc.php:1611 +msgid "Group id must be numeric." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:512 +msgid "Group's name" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:632 +msgid "Group: " +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2227 +#, php-format +msgid "Group: %s" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:410 +#: plugins/ktcore/admin/userManagement.php:381 +#: plugins/ktcore/admin/workflowsv2.php:2184 +#: plugins/ktstandard/KTEmail.php:403 i18n/templates.c:2678 +#: i18n/templates.c:4235 i18n/templates.c:7811 i18n/templates.c:7922 +msgid "Groups" +msgstr "" + +#: i18n/templates.c:6149 +msgid "Groups allow you to assign permissions and roles to a number of different users at once." +msgstr "" + +#: i18n/templates.c:6209 +msgid "Groups may contain other groups, allowing for a convenient way to build tree's of users and efficiently assign security privileges." +msgstr "" + +#: i18n/templates.c:4268 +msgid "Groups must be allocated to roles to ensure that the workflow transition this role is supposed to support can be acted upon by a user." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:652 +msgid "Groups without units cannot be Unit Administrators." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1687 +#: plugins/ktcore/admin/workflowsv2.php:1909 +msgid "Guard" +msgstr "" + +#: i18n/templates.c:8237 +msgid "Guard Condition" +msgstr "" + +#: i18n/templates.c:8234 +msgid "Guard Condition for Transition" +msgstr "" + +#: i18n/templates.c:8249 +msgid "Guard Groups" +msgstr "" + +#: i18n/templates.c:8246 +msgid "Guard Groups for Transition" +msgstr "" + +#: i18n/templates.c:8273 +msgid "Guard Permissions" +msgstr "" + +#: i18n/templates.c:8285 +msgid "Guard Roles" +msgstr "" + +#: i18n/templates.c:8282 +msgid "Guard Roles for Transition" +msgstr "" + +#: i18n/templates.c:8270 +msgid "Guard permissions for Transition" +msgstr "" + +#: i18n/templates.c:8006 +msgid "Guards" +msgstr "" + +#: i18n/templates.c:3107 +msgid "Guide to using cron:" +msgstr "" + +#: plugins/ktstandard/workflow/adminpage.php:98 +msgid "Handler removed." +msgstr "" + +#: plugins/ktstandard/workflow/adminpage.php:117 +msgid "Handler set." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:157 +msgid "Hello" +msgstr "" + +#: config/siteMap.inc:78 help.php:75 +msgid "Help" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:59 +#: plugins/ktcore/admin/manageHelp.php:61 +#: plugins/ktcore/admin/manageHelp.php:76 +msgid "Help Administration" +msgstr "" + +#: i18n/templates.c:5090 +msgid "Help content" +msgstr "" + +#: plugins/ktcore/KTAssist.php:215 +msgid "Help request" +msgstr "" + +#: i18n/templates.c:2402 +msgid "Hint" +msgstr "" + +#: dashboard.php:77 olddashboard.php:82 +msgid "Home" +msgstr "" + +#: lib/browse/Criteria.inc:992 +msgid "Hours" +msgstr "" + +#: plugins/housekeeper/HouseKeeperPlugin.php:53 +msgid "Housekeeper" +msgstr "" + +#: i18n/templates.c:2369 i18n/templates.c:2372 +msgid "How do I search?" +msgstr "" + +#: i18n/templates.c:5033 +msgid "Human Name" +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:335 +msgid "IConv PHP extension not installed. The zip file compression could not handle output filename encoding conversion !" +msgstr "" + +#: i18n/templates.c:7157 +msgid "If a document is not associated with an extractor, no content will be added to the index. These documents can be identified in the list by the extractor column reflecting n/a." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:478 +msgid "If a workflow is disabled, no new documents may be placed in it. Documents which were previously in the workflow continue to be able to change state, however." +msgstr "" + +#: i18n/templates.c:3980 +msgid "If there are metadata fields associated with this document type they will appear below and allow you to set metadata on all imported documents. If there is no metadata associated, or you do not wish to modify it, you can simply click \"Add\" here to finish the process and import the documents." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:729 +#, php-format +msgid "If this is checked, the uploaded document must have the same filename as the original: %s" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:664 +#, php-format +msgid "If this is checked, then the document's version number will be increased to %s. Otherwise, it will be considered a minor update, and the version number will be %s." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:224 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:299 +msgid "If this is specified then the user will have notifications sent to the email address entered above. If it is not set, then the user will only see notifications on the Dashboard" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:159 +msgid "If this is specified then the user will have notifications sent to the email address entered above. If it isn't set, then the user will only see notifications on the Dashboard" +msgstr "" + +#: preferences.php:91 +msgid "If this is specified then the you will receive certain notifications. If it is not set, then you will only see notifications on the Dashboard" +msgstr "" + +#: i18n/templates.c:3008 +msgid "If this is your first #appname# installation, or if you've just upgraded from #appname# 2.x, we've put together some information which might help you get to grips with the new system." +msgstr "" + +#: i18n/templates.c:2501 +msgid "If you are unable to perform an action on this document that you think you should be able to, or wish to request a change in location, metadata values, or workflow status, you can use this form to contact the owner of the document and/or the administrators to request this change." +msgstr "" + +#: i18n/templates.c:2540 +msgid "If you do not intend to change the document, or you do not wish to prevent others from changing the document, you should rather use the action menu to cancel this checkout." +msgstr "" + +#: i18n/templates.c:2627 +msgid "If you do not intend to move this document, you should cancel the move." +msgstr "" + +#: plugins/multiselect/BulkImport.php:186 +#: plugins/multiselect/BulkUpload.php:211 i18n/templates.c:3152 +#: i18n/templates.c:3998 +msgid "If you do not need to modify any the metadata for this document (see below), then you can simply click \"Add\" here to finish the process and add the document." +msgstr "" + +#: i18n/templates.c:2531 +msgid "If you do not want to have this document be checked-out, please give a reason and cancel the checkout." +msgstr "" + +#: i18n/templates.c:7346 +msgid "If you feel that the information presents to much specific information about your system (e.g. you feel that it would be a security risk to reveal aspects of it), please do sanitise the information, or ask us if you can mail it directly to the developer who is dealing with your issue." +msgstr "" + +#: lib/dispatcher.inc.php:335 +msgid "If you feel that this is incorrect, please report both the action and your username to a system administrator." +msgstr "" + +#: i18n/templates.c:5462 +msgid "If you have converted a simple conditional fieldset to a complex one, it may be useful to rename some of the system-generated names. You can do that here." +msgstr "" + +#: i18n/templates.c:5957 +msgid "If you have moved the location of #appname# on your server filesystem, or installed or removed plugins, the plugins must be re-read from the filesystem" +msgstr "" + +#: i18n/templates.c:830 +msgid "If you know the numeric ID of a document, type it in here and press \"go\"" +msgstr "" + +#: i18n/templates.c:3659 +msgid "If you require assistance from an administrator to perform one of these tasks, use the Request Assistance action." +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:144 +msgid "If you specify an automatic workflow, new documents will automatically enter that workflow's starting state. Setting this to \"No Automatic Workflow\" will mean that users can choose the appropriate workflow." +msgstr "" + +#: i18n/templates.c:1274 +msgid "If you've purchased a new key from KnowledgeTree.com or one of our partners, you can upload it here." +msgstr "" + +#: plugins/ktstandard/ImmutableActionPlugin.php:174 +#: search2/indexing/indexerCore.inc.php:286 +msgid "Immutable" +msgstr "" + +#: plugins/ktstandard/ImmutableActionPlugin.php:47 +msgid "Immutable action plugin" +msgstr "" + +#: plugins/multiselect/BulkImport.php:130 i18n/templates.c:3986 +msgid "Import" +msgstr "" + +#: i18n/templates.c:3971 +msgid "Import files into" +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:58 +#: plugins/multiselect/BulkImport.php:74 +#: plugins/multiselect/BulkImport.php:129 i18n/templates.c:3974 +msgid "Import from Server Location" +msgstr "" + +#: i18n/templates.c:7382 +msgid "In addition to restricting permissions, it is also possible to block certain actions at any given point. Actions which are not blocked are still controlled by the usual permissions." +msgstr "" + +#: i18n/templates.c:2663 i18n/templates.c:4205 +msgid "In many cases, workflow actions will be assigned to certain roles (e.g. Manager, Interviewer, Researcher, Journalist). You can assign these roles to specific groups in particular areas of the document management system." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:101 +#: plugins/ktcore/admin/documentFieldsv2.php:357 +#: plugins/multiselect/InetdocumentFieldsv2.php:121 +#: plugins/multiselect/InetdocumentFieldsv2.php:422 +msgid "In order to ensure that the data that users enter is useful, it is essential that you provide a good example." +msgstr "" + +#: i18n/templates.c:7757 +msgid "In order to ensure that the workflow is followed correctly, it is often necessary to restrict the situations in which a transition can be followed. This can include things like the permissions the user has on the document, the user's groups or roles, or whether the document is checked-out or not." +msgstr "" + +#: i18n/templates.c:5603 +msgid "In order to have a chain of conditions, one initial field must be shown to the user. This is called the master field." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:315 +msgid "In order to have a chain of conditions, one initial field must be shown to the user. This is called the master field." +msgstr "" + +#: i18n/templates.c:3170 +msgid "In order to keep the documents which are visible useful to end users it is possible to archive old documents. Users who want to see these old documents need to request their restoration. These requests will typically be done within the system and will generate a notification to you." +msgstr "" + +#: i18n/templates.c:7643 +msgid "In order to move between states, the transitions you specified earlier must be configured to move from a set of states to a \"destination\" states. Use the table below to configure this behaviour." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:93 +msgid "In order to move between states, users will cause \"transitions\" to occur. These transitions represent processes followed, e.g. \"review document\", \"distribute invoice\" or \"publish\". Please enter a list of transitions, one per line. Transition names must be unique. You'll assign transitions to states in the next step." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1051 +msgid "In order to move between states, users will cause \"transitions\" to occur. These transitions represent processes followed, e.g. \"review document\", \"distribute invoice\" or \"publish\". Transition names must be unique within the workflow (e.g. within this workflow, you can only have one transition called \"publish\")" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:839 +msgid "In order to move between states, users will cause \"transitions\" to occur. These transitions represent processes followed, e.g. \"review document\", \"distribute invoice\" or \"publish\". You'll assign transitions to states in the next step." +msgstr "" + +#: i18n/templates.c:5216 +msgid "In order to organise the options into a \"tree\", you need to add subcategories at each level. The \"top\" level is called the root, and holds all the top-level items. \"Root\" will not be shown to the final user, but provides a single \"parent\" to the top-level items." +msgstr "" + +#: i18n/templates.c:7532 +msgid "In order to progress through a workflow, a document will usually require collaboration between a number of different users. One way to help this process is to inform certain groups or roles about the document's current state." +msgstr "" + +#: i18n/templates.c:449 i18n/templates.c:533 +msgid "In order to refine the kind of information shown to you, please provide further information below." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1169 +msgid "In order to remove this state from the system, please select a new state which will take its place. All references to the state you are deleting will be replaced by this new state." +msgstr "" + +#: i18n/templates.c:1889 +msgid "In some circumstances it is useful to view all documents of a given document type. Select a document type from the list below to view all relevant documents." +msgstr "" + +#: i18n/templates.c:1883 +msgid "In some circumstances it is useful to view all documents with a given value for a lookup field. Select the value from the list below to view all relevant documents." +msgstr "" + +#: i18n/templates.c:1877 +msgid "In some circumstances it is useful to view all documents with a given value for a lookup field. Select the lookup field from the list below to view all relevant documents." +msgstr "" + +#: i18n/templates.c:7097 +msgid "Inactive" +msgstr "" + +#: lib/documentmanagement/Document.inc:745 i18n/templates.c:5765 +msgid "Incomplete" +msgstr "" + +#: i18n/templates.c:6998 +msgid "Index Coverage:" +msgstr "" + +#: i18n/templates.c:7124 i18n/templates.c:7169 +msgid "Index Date" +msgstr "" + +#: plugins/ktcore/KTDashlets.php:226 +msgid "Indexer Status" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:876 +msgid "Indexer problem: " +msgstr "" + +#: i18n/templates.c:7001 +msgid "Indexing coverage percentage may vary from total - not all documents contain text." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1287 +#, php-format +msgid "Indexing docid: %d extension: '%s' mimetype: '%s' extractor: '%s'" +msgstr "" + +#: i18n/templates.c:7013 +msgid "Indexing has not run yet. Please check that the KTScheduler is running." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1376 +msgid "Indicate whether you would like to download these file as part of the checkout." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:471 +msgid "Indicate whether you would like to download this file as part of the checkout." +msgstr "" + +#: i18n/templates.c:7913 +msgid "Inform Which Users?" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:385 +msgid "Information about this system and how to get support." +msgstr "" + +#: i18n/templates.c:7802 +msgid "Informed Users" +msgstr "" + +#: i18n/templates.c:4046 +msgid "Inherit permissions" +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:892 plugins/ktcore/folder/Permissions.php:569 +msgid "Inherit permissions from parent" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:228 +msgid "Initial data stored." +msgstr "" + +#: i18n/templates.c:839 +msgid "Inline View" +msgstr "" + +#: plugins/commercial/network/inlineview/InlineViewPlugin.php:96 +msgid "Inline View of Documents" +msgstr "" + +#: i18n/templates.c:7787 +msgid "Install the GraphViz module to get a useful visualisation of your graph here." +msgstr "" + +#: plugins/commercial/instaView/instaViewLinkAction.php:86 +msgid "Instant View" +msgstr "" + +#: plugins/commercial/instaView/instaViewPlugin.php:37 +msgid "Instant View Document Viewer" +msgstr "" + +#: i18n/templates.c:6002 +msgid "Instead of manually creating the group within the document management system, the group can be found within an authentication source (such as an LDAP directory) that has already been configured. This ensures that the group is correctly set up with limited intervention from the administrator, and that the group's membership will be maintained as it is in the authentication source." +msgstr "" + +#: i18n/templates.c:6404 +msgid "Instead of manually creating the user within the document management system, the user can be found within an authentication source (such as an LDAP directory) that has already been configured. This ensures that the user is correctly set up with limited intervention from the administrator, and that the user will not need to remember an additional password for the document management system." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:70 +msgid "Insufficient permissions to perform action" +msgstr "" + +#: search2/search/fields/DocumentOemNoField.inc.php:44 +msgid "Integration Id" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:56 +msgid "Inter-document linking" +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:350 +#: plugins/ktcore/admin/configSettings.php:354 +msgid "Internationalisation Settings" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:370 +msgid "Internationalization" +msgstr "" + +#: i18n/templates.c:4748 +msgid "Introduction" +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:144 +#: plugins/commercial/wintools/key.inc.php:156 +#: plugins/commercial/wintools/key.inc.php:168 +msgid "Invalid Key" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:433 plugins/ktcore/KTPermissions.php:504 +msgid "Invalid Role." +msgstr "" + +#: plugins/ktstandard/workflow/adminpage.php:101 +msgid "Invalid assignment" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:326 +msgid "Invalid authentication source" +msgstr "" + +#: lib/search/searchutil.inc.php:69 lib/search/searchutil.inc.php:75 +#: lib/search/searchutil.inc.php:182 lib/search/searchutil.inc.php:188 +msgid "Invalid criteria specified." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1528 +msgid "Invalid document content version object." +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:126 +#: plugins/ktcore/admin/deletedDocuments.php:150 +#: plugins/ktcore/admin/deletedDocuments.php:216 +msgid "Invalid document id specified. Aborting expunge" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:240 +msgid "Invalid document id specified. Aborting restore" +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:146 +#: plugins/ktcore/admin/archivedDocuments.php:172 +msgid "Invalid document id specified. Aborting restore." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:474 +msgid "Invalid document link selected." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:996 +#: lib/documentmanagement/documentutil.inc.php:1517 +msgid "Invalid document object." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:479 +msgid "Invalid document selected." +msgstr "" + +#: view.php:316 +msgid "Invalid document to compare against." +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:128 +#: plugins/ktcore/folder/BulkUpload.php:127 +#: plugins/multiselect/BulkImport.php:246 +#: plugins/multiselect/BulkUpload.php:260 +msgid "Invalid document type provided" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1521 +msgid "Invalid document version object." +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:202 +msgid "Invalid expiry" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:654 +#: plugins/multiselect/inetbasic.inc.php:892 +msgid "Invalid field." +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:158 +msgid "Invalid folder chosen" +msgstr "" + +#: action.php:147 action.php:151 +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:100 +#: plugins/ktcore/KTWidgets.php:741 +#: plugins/ktcore/admin/archivedDocuments.php:77 +#: plugins/ktstandard/KTDocumentLinks.php:228 +msgid "Invalid folder selected." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:79 +#, php-format +msgid "Invalid identifier provided for: %s" +msgstr "" + +#: i18n/templates.c:1298 +msgid "Invalid key" +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:198 +msgid "Invalid license key" +msgstr "" + +#: plugins/commercial/wintools/baobabKeyManagement.php:101 +msgid "Invalid license:" +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:203 +msgid "Invalid licenses" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:419 +msgid "Invalid link type selected." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:527 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:547 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:572 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:602 +#: plugins/multiselect/inetbasic.inc.php:733 +#: plugins/multiselect/inetbasic.inc.php:760 +#: plugins/multiselect/inetbasic.inc.php:789 +#: plugins/multiselect/inetbasic.inc.php:826 +msgid "Invalid lookup selected" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:623 +#: plugins/multiselect/inetbasic.inc.php:854 +msgid "Invalid lookups selected" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:222 +msgid "Invalid parent document selected." +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:131 +#: plugins/multiselect/BulkImport.php:256 +msgid "Invalid path provided" +msgstr "" + +#: help.php:210 +msgid "Invalid return key from help system." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:509 plugins/ktcore/KTBulkActions.php:763 +msgid "Invalid target folder selected" +msgstr "" + +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:114 +msgid "Invalid target folder selected." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:515 +msgid "Invalid target folder selected: Target folder is the same as the current folder." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:395 +msgid "Invalid transition" +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/adminReports.php:97 +#: plugins/commercial/network/extendedtransactioninfo/standardReports.php:117 +msgid "Invalid user selected." +msgstr "" + +#: search2/search/fields/IsArchivedField.inc.php:44 +msgid "Is Archived" +msgstr "" + +#: search2/search/fields/IsCheckedOutField.inc.php:44 +msgid "Is Checked Out" +msgstr "" + +#: search2/search/fields/IsDeletedField.inc.php:44 +msgid "Is Deleted" +msgstr "" + +#: search2/search/fields/IsImmutableField.inc.php:44 +msgid "Is Immutable" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:903 +msgid "Issues with the indexer have been resolved!" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:886 +msgid "It is not possible to archive a shortcut. Please archive the target document or folder instead." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:215 +msgid "It is not possible to archive a shortcut. Please archive the target document." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:115 +#: plugins/multiselect/InetdocumentFieldsv2.php:135 +msgid "It is possible to create different types of fieldsets. The most common kind is a \"normal\" fieldset, which can be configured to have different kinds of fields. The administrator may have installed additional plugins which provide different types of fieldsets." +msgstr "" + +#: i18n/templates.c:3182 +msgid "It may be necessary to override the checked-out status of a document if" +msgstr "" + +#: plugins/i18n/italian/ItalianPlugin.php:51 +msgid "Italian translation plugin" +msgstr "" + +#: i18n/templates.c:2384 +msgid "Item" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:116 +#: plugins/ktstandard/admin/manageDisclaimers.php:158 +msgid "Item deleted" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:142 +#: plugins/ktstandard/admin/manageDisclaimers.php:114 +msgid "Item updated" +msgstr "" + +#: plugins/ktcore/KTDashlets.php:140 plugins/ktcore/KTMiscPages.php:82 +#: i18n/templates.c:5936 +msgid "Items that require your attention" +msgstr "" + +#: i18n/templates.c:4016 +msgid "Items to delete" +msgstr "" + +#: i18n/templates.c:2597 i18n/templates.c:2615 +msgid "Items to move" +msgstr "" + +#: i18n/templates.c:8009 +msgid "Items which control whether a given user can perform this transition on a specific document. All of these must allow the user to perform the transition." +msgstr "" + +#: i18n/templates.c:428 +msgid "Items you've added or changed recently within the DMS." +msgstr "" + +#: i18n/templates.c:935 +msgid "Items you've viewed recently within the DMS." +msgstr "" + +#: i18n/templates.c:827 +msgid "Jump To Document" +msgstr "" + +#: lib/util/ktutil.inc:276 +msgid "KB" +msgstr "" + +#: i18n/templates.c:1160 +msgid "Key Assigned" +msgstr "" + +#: plugins/commercial/wintools/baobabKeyManagement.php:129 +msgid "Key deleted" +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:169 +msgid "Key in use." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:694 +#: plugins/multiselect/inetbasic.inc.php:932 +msgid "Keyword moved to base of tree." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:689 +#: plugins/multiselect/inetbasic.inc.php:927 +msgid "Keywords added to category." +msgstr "" + +#: i18n/templates.c:5234 +msgid "Keywords which are directly below the Root are considered \"free\" — they are not attached to a subcategory. Only free keywords can be associated with a subcategory. To free a keyword, click on the \"unlink\" command next to it in the preview tree below." +msgstr "" + +#: i18n/templates.c:5225 +msgid "Keywords which are directly below the Root are considered \"free\" — they are not attached to a subcategory. Only free keywords can be associated with a subcategory. To free a keyword, click on the \"unlink\" command next to it in the preview tree below. Deleting a subcategory will automatically unlink all keywords below it (including those in subcategories of the subcategory)." +msgstr "" + +#: i18n/templates.c:5981 +msgid "KnowledgeTree Community Edition is supplied with no support, \tno maintenance, \tand no warranty." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:243 +#: lib/documentmanagement/documentutil.inc.php:1069 +msgid "KnowledgeTree Notification" +msgstr "" + +#: ktapi/ktapi.inc.php:4197 +msgid "Knowledgetree client policies retrieval succeeded." +msgstr "" + +#: plugins/ktstandard/KTLDAPAuthenticationPlugin.php:53 +msgid "LDAP Authentication" +msgstr "" + +#: plugins/ktstandard/KTLDAPAuthenticationPlugin.php:48 +msgid "LDAP Authentication Plugin" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:295 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:548 +msgid "LDAP DN" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:57 +msgid "LDAP Search Password" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:56 +msgid "LDAP Search User" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:53 +msgid "LDAP Server" +msgstr "" + +#: plugins/ktstandard/ldap/ldapauthenticationprovider.inc.php:51 +msgid "LDAP authentication provider" +msgstr "" + +#: i18n/templates.c:1682 i18n/templates.c:5009 +msgid "Language" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:255 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:87 +#: plugins/multiselect/inetbasic.inc.php:111 +msgid "Large Text" +msgstr "" + +#: i18n/templates.c:3671 +msgid "Last Comment" +msgstr "" + +#: i18n/templates.c:6980 +msgid "Last Indexing Date:" +msgstr "" + +#: plugins/ktcore/admin/expungeList.php:78 i18n/templates.c:3242 +msgid "Last Modification" +msgstr "" + +#: i18n/templates.c:6974 +msgid "Last Optimization Date:" +msgstr "" + +#: i18n/templates.c:8312 +msgid "Last activity" +msgstr "" + +#: i18n/templates.c:989 +msgid "Last login" +msgstr "" + +#: i18n/templates.c:944 i18n/templates.c:947 i18n/templates.c:1037 +msgid "Last login information" +msgstr "" + +#: plugins/commercial/professional-reporting/admin/userReporting.php:85 +msgid "Last login reporting" +msgstr "" + +#: i18n/templates.c:323 i18n/templates.c:1994 i18n/templates.c:2039 +msgid "Last update by" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:222 +msgid "Last updated by: " +msgstr "" + +#: i18n/templates.c:7496 i18n/templates.c:7649 +msgid "Leads to state" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:197 +msgid "Learn More" +msgstr "" + +#: i18n/templates.c:3140 +msgid "Learn about #appname# 3." +msgstr "" + +#: lib/groups/GroupUtil.php:168 +#, php-format +msgid "Legacy error creating group, may be: %s" +msgstr "" + +#: lib/browse/Criteria.inc:801 +msgid "Less than" +msgstr "" + +#: plugins/commercial/wintools/BaobabPlugin.php:85 +msgid "License Administration" +msgstr "" + +#: plugins/commercial/wintools/licenseDashlet.php:35 +msgid "License Expiry" +msgstr "" + +#: i18n/templates.c:1286 +msgid "Licenses" +msgstr "" + +#: i18n/templates.c:851 i18n/templates.c:8438 i18n/templates.c:8456 +#: i18n/templates.c:8468 +msgid "Link" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:321 +#, php-format +msgid "Link (ID %s): %s from %s" +msgstr "" + +#: i18n/templates.c:8450 +msgid "Link Name" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:63 +msgid "Link Title" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:385 +msgid "Link Type" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:66 +msgid "Link Type Management" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:607 +msgid "Link Type created." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:591 +msgid "Link Type updated." +msgstr "" + +#: i18n/templates.c:8453 +msgid "Link URL" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:634 +msgid "Link types deleted." +msgstr "" + +#: i18n/templates.c:8381 +msgid "Linked from this document" +msgstr "" + +#: i18n/templates.c:1178 i18n/templates.c:3683 +msgid "Linked Fieldsets" +msgstr "" + +#: lib/foldermanagement/Folder.inc:168 +msgid "Linked folder can't be found: " +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:167 +#: plugins/ktstandard/KTDocumentLinks.php:173 +#: plugins/ktstandard/KTDocumentLinks.php:174 +msgid "Links" +msgstr "" + +#: i18n/templates.c:8390 +msgid "Links to this document" +msgstr "" + +#: i18n/templates.c:8567 +msgid "Links from this document" +msgstr "" + +#: i18n/templates.c:8570 +msgid "Links to this document" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerUtil.php:375 +msgid "List of tasks can't be retrieved." +msgstr "" + +#: lib/documentmanagement/Document.inc:741 +msgid "Live" +msgstr "" + +#: i18n/templates.c:4904 +msgid "Loading" +msgstr "" + +#: i18n/templates.c:4475 +msgid "Loading Dependencies for value \"" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreviewPlugin.php:69 +msgid "Loading..." +msgstr "" + +#: i18n/templates.c:434 i18n/templates.c:929 i18n/templates.c:3200 +#: i18n/templates.c:3221 i18n/templates.c:3293 +msgid "Location" +msgstr "" + +#: i18n/templates.c:2255 i18n/templates.c:2300 +msgid "Location is no longer available" +msgstr "" + +#: i18n/templates.c:7316 +msgid "Log Files (#appname#, Apache, Mysql)" +msgstr "" + +#: lib/templating/kt3template.inc.php:414 +#: plugins/passwordResetPlugin/loginResetDispatcher.php:502 +#: i18n/templates.c:1685 i18n/templates.c:4727 i18n/templates.c:5012 +msgid "Login" +msgstr "" + +#: plugins/commercial/professional-reporting/admin/userReporting.php:162 +#: i18n/templates.c:1073 +msgid "Login activity" +msgstr "" + +#: i18n/templates.c:4613 +msgid "Login failed" +msgstr "" + +#: i18n/templates.c:4616 +msgid "Login failed." +msgstr "" + +#: login.php:265 login.php:281 +#: plugins/passwordResetPlugin/loginResetDispatcher.php:214 +#: plugins/passwordResetPlugin/loginResetDispatcher.php:230 +msgid "Login failed. Please check your username and password, and try again." +msgstr "" + +#: plugins/commercial/professional-reporting/admin/userReporting.php:148 +#: i18n/templates.c:992 i18n/templates.c:1004 i18n/templates.c:1124 +msgid "Login history" +msgstr "" + +#: i18n/templates.c:1019 +msgid "Login history for" +msgstr "" + +#: i18n/templates.c:1667 i18n/templates.c:4994 +msgid "Login | #appname#" +msgstr "" + +#: config/siteMap.inc:81 lib/templating/kt3template.inc.php:396 +#: lib/templating/kt3template.inc.php:411 i18n/templates.c:4982 +msgid "Logout" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:261 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:85 +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:148 +#: plugins/multiselect/inetbasic.inc.php:109 i18n/templates.c:3932 +#: i18n/templates.c:5687 +msgid "Lookup" +msgstr "" + +#: plugins/ktcore/KTPortlets.php:97 i18n/templates.c:5354 +msgid "Lookup Value" +msgstr "" + +#: browse.php:210 plugins/ktcore/admin/fieldsets/basic.inc.php:363 +#: plugins/multiselect/inetbasic.inc.php:541 i18n/templates.c:5720 +msgid "Lookup Values" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:577 +#: plugins/multiselect/inetbasic.inc.php:794 +msgid "Lookup cannot be empty" +msgstr "" + +#: i18n/templates.c:5717 +msgid "Lookup fields may be composed of an arbitrary number of values. These values may be added to the Lookup field by entering them in below. If these values are being generated by, or synchronised to, an external datasource, toggling the Sticky attribute of a value will ensure that it will not be modified by changes in the external datasource list." +msgstr "" + +#: i18n/templates.c:5108 +msgid "Lookup fields without categories." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:629 +#: plugins/multiselect/inetbasic.inc.php:860 +msgid "Lookup stickiness toggled" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:366 +#: plugins/multiselect/inetbasic.inc.php:544 +msgid "Lookup values are what a user can select from a dropdown. These pre-created lookup values are useful, since they help you keep the metadata in the system organised." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:587 +#: plugins/multiselect/inetbasic.inc.php:804 +msgid "Lookup values saved" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:552 +#: plugins/multiselect/inetbasic.inc.php:765 +msgid "Lookups disabled" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:531 +#: plugins/multiselect/inetbasic.inc.php:737 +msgid "Lookups removed" +msgstr "" + +#: plugins/search2/MigrationDashlet.php:44 +msgid "Lucene Migration Status" +msgstr "" + +#: lib/util/ktutil.inc:272 +msgid "MB" +msgstr "" + +#: i18n/templates.c:7337 +msgid "MD5 Checksum of files (used to ensure files have not been tampered with)" +msgstr "" + +#: plugins/ktcore/KTDashlets.php:293 +msgid "Mail Server Status" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:663 +msgid "Major Update" +msgstr "" + +#: plugins/ktstandard/ImmutableActionPlugin.php:104 +#: plugins/ktstandard/ImmutableActionPlugin.php:115 +#: plugins/ktstandard/ImmutableActionPlugin.php:119 i18n/templates.c:8423 +#: i18n/templates.c:8429 +msgid "Make Immutable" +msgstr "" + +#: plugins/ktstandard/ImmutableActionPlugin.php:65 +msgid "Make immutable" +msgstr "" + +#: i18n/templates.c:3827 i18n/templates.c:3875 +msgid "Make this fieldset conditional" +msgstr "" + +#: i18n/templates.c:5039 +msgid "Manage" +msgstr "" + +#: i18n/templates.c:8120 +msgid "Manage Actions" +msgstr "" + +#: i18n/templates.c:5408 i18n/templates.c:5411 +msgid "Manage Conditional Behaviours" +msgstr "" + +#: i18n/templates.c:3332 +msgid "Manage Existing Link Types" +msgstr "" + +#: plugins/rssplugin/RSSDashlet.php:74 plugins/rssplugin/manageRSSFeeds.php:51 +msgid "Manage External RSS Feeds" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:338 +#: i18n/templates.c:5414 i18n/templates.c:5417 i18n/templates.c:5543 +msgid "Manage Field Ordering" +msgstr "" + +#: i18n/templates.c:1625 i18n/templates.c:5300 +msgid "Manage Field: #field_name#" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:265 i18n/templates.c:6455 +msgid "Manage Groups" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:644 +msgid "Manage Groups for Role" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:645 +#, php-format +msgid "Manage Groups for Role \"%s\"" +msgstr "" + +#: plugins/commercial/wintools/BaobabPlugin.php:88 +#: plugins/commercial/wintools/baobabKeyManagement.php:49 +#: plugins/commercial/wintools/baobabKeyManagement.php:54 +msgid "Manage Keys" +msgstr "" + +#: i18n/templates.c:1649 i18n/templates.c:1652 i18n/templates.c:5324 +#: i18n/templates.c:5327 +msgid "Manage Lookup Tree Structure" +msgstr "" + +#: i18n/templates.c:5096 +msgid "Manage Lookup Trees" +msgstr "" + +#: i18n/templates.c:1643 i18n/templates.c:1646 i18n/templates.c:5318 +#: i18n/templates.c:5321 +msgid "Manage Lookup Values" +msgstr "" + +#: i18n/templates.c:5339 +msgid "Manage Lookups" +msgstr "" + +#: i18n/templates.c:5336 +msgid "Manage Lookups for \"#field_name#\"" +msgstr "" + +#: plugins/search2/reporting/ManageMimeTypes.php:47 i18n/templates.c:7145 +msgid "Manage Mime Types" +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:49 +#: plugins/ktcore/admin/managePermissions.php:50 +#: plugins/ktcore/admin/workflowsv2.php:1317 +msgid "Manage Permissions" +msgstr "" + +#: i18n/templates.c:7616 +msgid "Manage Permissions: #statename#" +msgstr "" + +#: i18n/templates.c:860 i18n/templates.c:863 +msgid "Manage Quicklinks" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:128 i18n/templates.c:1787 +msgid "Manage RSS Feeds" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1719 +msgid "Manage Restrictions" +msgstr "" + +#: i18n/templates.c:7193 +msgid "Manage Saved Search" +msgstr "" + +#: i18n/templates.c:7016 i18n/templates.c:7220 +msgid "Manage Saved Search Criteria" +msgstr "" + +#: search2.php:605 search2.php:606 +msgid "Manage Saved Searches" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:988 i18n/templates.c:7514 +msgid "Manage State" +msgstr "" + +#: i18n/templates.c:8147 +msgid "Manage States" +msgstr "" + +#: i18n/templates.c:6206 +msgid "Manage Sub-Groups in #name#" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:122 +msgid "Manage Task Scheduler" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1079 i18n/templates.c:7535 +msgid "Manage Transition" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1986 +msgid "Manage Transition Actions" +msgstr "" + +#: i18n/templates.c:7826 i18n/templates.c:8189 +msgid "Manage Transitions" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:262 i18n/templates.c:6179 +#: i18n/templates.c:6197 +msgid "Manage Users" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:580 plugins/ktcore/KTPermissions.php:581 +msgid "Manage Users for Role" +msgstr "" + +#: i18n/templates.c:6221 i18n/templates.c:6227 i18n/templates.c:6236 +msgid "Manage Users in #name#" +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:48 +msgid "Manage Views" +msgstr "" + +#: plugins/commercial/alerts/alertPlugin.php:48 +msgid "Manage alerts for the different document types within the system." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:250 +msgid "Manage checked-out, archived and deleted documents." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:282 +#: plugins/ktcore/admin/manageConditionals.php:211 +msgid "Manage complex conditional" +msgstr "" + +#: i18n/templates.c:5798 +msgid "Manage conditional" +msgstr "" + +#: plugins/ktcore/admin/manageConditionals.php:101 +#: plugins/ktcore/admin/manageConditionals.php:174 i18n/templates.c:5564 +msgid "Manage conditional fieldset" +msgstr "" + +#: i18n/templates.c:3839 i18n/templates.c:3887 +msgid "Manage conditions." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:279 +msgid "Manage criteria which determine whether a user is permitted to perform a system action." +msgstr "" + +#: i18n/templates.c:1265 +msgid "Manage keys" +msgstr "" + +#: i18n/templates.c:5729 +msgid "Manage lookup tree" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:399 +#, php-format +msgid "Manage members of %s" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:243 +#, php-format +msgid "Manage members of group %s" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:382 +msgid "Manage plugins" +msgstr "" + +#: i18n/permissions.c:12 i18n/templates.c:3488 i18n/templates.c:4031 +#: i18n/templates.c:4175 i18n/templates.c:4184 i18n/templates.c:4343 +#: i18n/templates.c:4352 +msgid "Manage security" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:184 +#: plugins/ktcore/admin/manageConditionals.php:103 +msgid "Manage simple conditional" +msgstr "" + +#: i18n/templates.c:6182 i18n/templates.c:6200 +msgid "Manage sub-groups" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:192 +msgid "Manage subscriptions" +msgstr "" + +#: plugins/commercial/wintools/BaobabPlugin.php:93 +#: plugins/ktcore/KTCorePlugin.php:295 +msgid "Manage the addition of Email document types to the system." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:285 +msgid "Manage the different classes of document which can be added to the system." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:289 +msgid "Manage the different types of information that can be associated with classes of documents." +msgstr "" + +#: plugins/multiselect/MultiSelectPlugin.php:125 +msgid "Manage the different types of information with multiselect functionality that can be associated with classes of documents." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:67 +msgid "Manage the different ways documents can be associated with one another." +msgstr "" + +#: plugins/commercial/wintools/BaobabPlugin.php:86 +msgid "Manage the keys you have purchased." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:122 +msgid "Manage the task scheduler" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:391 +msgid "Manage views" +msgstr "" + +#: i18n/permissions.c:14 +msgid "Manage workflow" +msgstr "" + +#: i18n/templates.c:5210 +msgid "Many \"lookup\" fields make sense in a hierachy: countries are part of continents and sub-continents, school classes are part of grades and programs, Powerbooks are Apple Macs, while Thinkpads are made by Lenovo. This page will allow you to arrange the lookups in the field in a hierachy. All changes are immediately stored, so when you are done simply navigate back to the field menu." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:438 +msgid "Mass import" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:314 +msgid "Master Field" +msgstr "" + +#: i18n/templates.c:5591 i18n/templates.c:5600 +msgid "Master field" +msgstr "" + +#: lib/metadata/metadatautil.inc.php:561 +msgid "Master field has no values which are assigned to behaviours." +msgstr "" + +#: i18n/templates.c:1847 +msgid "Match #join# of the following" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:164 +#: plugins/ktcore/admin/userManagement.php:226 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:301 +msgid "Maximum Sessions" +msgstr "" + +#: i18n/templates.c:4280 +msgid "Member groups" +msgstr "" + +#: i18n/templates.c:4313 +msgid "Member users" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:163 i18n/templates.c:209 +#: i18n/templates.c:6917 i18n/templates.c:6932 +msgid "Message" +msgstr "" + +#: i18n/templates.c:4673 +msgid "Message:" +msgstr "" + +#: i18n/templates.c:3569 i18n/templates.c:3578 +msgid "Metadata" +msgstr "" + +#: i18n/templates.c:350 i18n/templates.c:3461 i18n/templates.c:3548 +msgid "Metadata Version" +msgstr "" + +#: search2/search/expr.inc.php:1473 +msgid "Metadata field expected" +msgstr "" + +#: i18n/templates.c:6950 +msgid "Migration process has taken:" +msgstr "" + +#: i18n/templates.c:6947 +msgid "Migration process started on:" +msgstr "" + +#: i18n/templates.c:6938 +msgid "Migration to using the new search requires text to be moved from the database full text indexes into the Document Indexer Service. This may take some time depending on the size of the repository. For this reason, the process is a background task." +msgstr "" + +#: search2/search/fields/MimeTypeField.inc.php:44 +msgid "Mime Type" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:316 i18n/templates.c:3038 +#: i18n/templates.c:7103 +msgid "Mime Types" +msgstr "" + +#: lib/browse/Criteria.inc:991 +msgid "Minutes" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:257 +msgid "Miscellaneous" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:163 +#: plugins/ktcore/admin/userManagement.php:225 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:300 +msgid "Mobile Number" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:147 +msgid "Modification Date" +msgstr "" + +#: ktoffice/controllers/list.php:342 plugins/ktcore/KTColumns.inc.php:284 +#: search2/search/fields/ModifiedField.inc.php:44 +msgid "Modified" +msgstr "" + +#: search2/search/fields/ModifiedByField.inc.php:44 +msgid "Modified By" +msgstr "" + +#: search2/search/fields/ModifiedDeltaField.inc.php:46 +msgid "Modified Delta" +msgstr "" + +#: i18n/templates.c:7286 +msgid "Modified by:" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:742 +msgid "Modify Group Details" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:194 +msgid "Modify User Details" +msgstr "" + +#: lib/browse/Criteria.inc:994 i18n/templates.c:26 +msgid "Months" +msgstr "" + +#: i18n/templates.c:1310 +msgid "Mount" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:300 plugins/ktcore/KTBulkActions.php:310 +#: plugins/ktcore/KTDocumentActions.php:1147 +#: plugins/ktcore/KTDocumentActions.php:1183 i18n/templates.c:2594 +#: i18n/templates.c:2606 i18n/templates.c:2612 i18n/templates.c:2621 +#: i18n/templates.c:2630 i18n/templates.c:2633 i18n/templates.c:8261 +#: i18n/transactions.c:5 +msgid "Move" +msgstr "" + +#: i18n/templates.c:8258 +msgid "Move Action for Transition" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1176 +#: plugins/ktcore/KTDocumentActions.php:1182 i18n/templates.c:2639 +msgid "Move Document" +msgstr "" + +#: i18n/templates.c:2591 i18n/templates.c:2609 +msgid "Move Files and Folders" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:309 +msgid "Move Items" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1461 +#, php-format +msgid "Moved from %s/%s to %s/%s. %s" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:616 +msgid "Moves Document" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:617 +msgid "Moves the document to another folder." +msgstr "" + +#: i18n/templates.c:2642 +msgid "Moving a document relocates the document within the DMS." +msgstr "" + +#: i18n/templates.c:2624 +msgid "Moving a document relocates the document within the document repository." +msgstr "" + +#: plugins/multiselect/MultiSelectPlugin.php:56 +msgid "Multi-select Plugin" +msgstr "" + +#: plugins/ktcore/KTColumns.inc.php:399 +msgid "Multiple Selection" +msgstr "" + +#: lib/ktentity.inc:278 +msgid "Multiple matches for ID: " +msgstr "" + +#: lib/ktentity.inc:841 +msgid "Multiple objects returned" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:248 +#: plugins/multiselect/inetbasic.inc.php:113 +msgid "Multiselect" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:146 +#: plugins/multiselect/inetbasic.inc.php:128 +msgid "Multiselect with a list" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:150 +#: plugins/multiselect/inetbasic.inc.php:129 +msgid "Multiselect with checkboxes" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:672 +#: plugins/multiselect/inetbasic.inc.php:910 +msgid "Must enter a name for the new category." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:652 +#: plugins/multiselect/inetbasic.inc.php:890 +msgid "Must select a field to edit." +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPlugin.php:41 +msgid "My Drop Documents" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsDashlet.php:44 +msgid "My Dropped Documents" +msgstr "" + +#: plugins/search2/MigrationDashlet.php:81 +#: search2/indexing/indexerCore.inc.php:1074 +#: search2/indexing/indexerCore.inc.php:1088 i18n/templates.c:1346 +msgid "N/A" +msgstr "" + +#: lib/browse/Criteria.inc:96 search2/search/expr.inc.php:2096 +msgid "NOT" +msgstr "" + +#: i18n/templates.c:7259 +msgid "NOT AVAILABLE" +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:397 +msgid "NOT IMPLEMENTED YET: This will create a pdf copy of the document as a new document." +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:417 +msgid "NOT IMPLEMENTED YET: This will replace the document with a pdf copy of the document." +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:67 +#: plugins/ktcore/admin/documentTypes.php:63 +#: plugins/ktcore/admin/roleManagement.php:68 +#: plugins/ktcore/admin/roleManagement.php:74 +#: plugins/ktcore/admin/userManagement.php:157 +#: plugins/ktcore/admin/userManagement.php:222 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:58 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:84 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:137 +#: plugins/ktstandard/KTDocumentLinks.php:527 +#: plugins/ktstandard/KTDocumentLinks.php:556 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:297 +#: preferences.php:76 i18n/templates.c:710 i18n/templates.c:818 +#: i18n/templates.c:983 i18n/templates.c:1118 i18n/templates.c:1145 +#: i18n/templates.c:2795 i18n/templates.c:2948 i18n/templates.c:2957 +#: i18n/templates.c:2969 i18n/templates.c:2978 i18n/templates.c:3344 +#: i18n/templates.c:3902 i18n/templates.c:3923 i18n/templates.c:3947 +#: i18n/templates.c:5054 i18n/templates.c:5075 i18n/templates.c:5180 +#: i18n/templates.c:5261 i18n/templates.c:5657 i18n/templates.c:5678 +#: i18n/templates.c:5702 i18n/templates.c:5852 i18n/templates.c:6422 +#: i18n/templates.c:7037 i18n/templates.c:7580 i18n/templates.c:8099 +#: i18n/templates.c:8528 i18n/templates.c:8546 +msgid "Name" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:284 +#: plugins/ktcore/admin/documentTypes.php:210 +msgid "Name changed." +msgstr "" + +#: plugins/ktcore/admin/conditions.php:115 +msgid "Name of condition" +msgstr "" + +#: i18n/templates.c:3905 i18n/templates.c:5036 i18n/templates.c:5057 +#: i18n/templates.c:5660 +msgid "Namespace" +msgstr "" + +#: i18n/templates.c:995 +msgid "Never" +msgstr "" + +#: i18n/templates.c:6524 i18n/templates.c:6563 +msgid "New" +msgstr "" + +#: plugins/ktcore/document/edit.php:346 +msgid "New Document Type" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:295 +#: plugins/ktstandard/KTDocumentLinks.php:296 +msgid "New External Link" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:161 +#: plugins/ktcore/admin/manageHelp.php:162 +msgid "New Help File" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:209 +#: plugins/ktstandard/KTDocumentLinks.php:210 +msgid "New Link" +msgstr "" + +#: i18n/templates.c:5468 +msgid "New Name" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:2034 +msgid "New Owner" +msgstr "" + +#: i18n/templates.c:842 i18n/templates.c:845 +msgid "New Quicklink" +msgstr "" + +#: i18n/templates.c:1742 +msgid "New RSS Feed" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:78 +msgid "New Saved Search" +msgstr "" + +#: i18n/templates.c:7790 +msgid "New State" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:730 +msgid "New States" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:821 +msgid "New States Created." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:941 +msgid "New Transitions Created." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2031 +msgid "New action added. This action requires configuration: please specify this below." +msgstr "" + +#: plugins/ktcore/document/Rename.php:87 +msgid "New file name" +msgstr "" + +#: i18n/templates.c:4805 +msgid "New folder" +msgstr "" + +#: plugins/ktcore/folder/Rename.php:65 +msgid "New folder name" +msgstr "" + +#: i18n/templates.c:1715 +msgid "New password" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1773 +#: plugins/ktcore/admin/workflowsv2.php:2033 +msgid "New restriction added." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1771 +msgid "New restriction added. This restriction requires configuration: please specify this below." +msgstr "" + +#: search/booleanSearch.php:325 +msgid "New search" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:233 +msgid "New thread created" +msgstr "" + +#: i18n/templates.c:3134 +msgid "New to Document Management, or to #appname#? We've written some quick documentation to help you along" +msgstr "" + +#: i18n/templates.c:7502 +msgid "New workflow information" +msgstr "" + +#: i18n/templates.c:7505 +msgid "New workflow name" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:72 i18n/templates.c:6035 +msgid "Next" +msgstr "" + +#: plugins/ktcore/scheduler/taskScheduler.php:66 +msgid "Next run time" +msgstr "" + +#: i18n/templates.c:287 i18n/templates.c:3962 i18n/templates.c:4667 +#: i18n/templates.c:5192 i18n/templates.c:5285 i18n/templates.c:5291 +#: i18n/templates.c:5369 i18n/templates.c:5792 i18n/templates.c:5876 +#: i18n/templates.c:5882 +msgid "No" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:236 +msgid "No Base DN provided" +msgstr "" + +#: i18n/templates.c:6551 +msgid "No Conditions have been defined." +msgstr "" + +#: lib/ktentity.inc:211 +msgid "No ID given" +msgstr "" + +#: i18n/templates.c:1163 +msgid "No Key Assigned" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:252 +msgid "No Object Classes provided" +msgstr "" + +#: i18n/templates.c:4985 +msgid "No Read permissions" +msgstr "" + +#: i18n/templates.c:4697 +msgid "No Recipients" +msgstr "" + +#: i18n/templates.c:6593 i18n/templates.c:7085 +msgid "No Saved Searches have been defined." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:248 +msgid "No Search Attributes provided" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:244 +msgid "No Search Password provided" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:240 +msgid "No Search User provided" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:88 +msgid "No Such search" +msgstr "" + +#: i18n/templates.c:518 i18n/templates.c:602 i18n/templates.c:695 +#: i18n/templates.c:803 +msgid "No Transactions matched your query." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:137 +msgid "No Unit" +msgstr "" + +#: plugins/rssplugin/KTrss.inc.php:373 i18n/templates.c:725 +msgid "No Workflow" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:71 +msgid "No Workflow Selected." +msgstr "" + +#: action.php:73 +msgid "No action given" +msgstr "" + +#: action.php:136 +msgid "No action selected." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:505 +#: plugins/multiselect/inetbasic.inc.php:704 +msgid "No action specified" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:105 +#: plugins/ktcore/admin/workflowsv2.php:176 +msgid "No action specified." +msgstr "" + +#: i18n/templates.c:7964 +msgid "No actions are controlled by this workflow, so all actions are available when documents are in this state." +msgstr "" + +#: i18n/templates.c:7820 +msgid "No actions are controlled by this workflow." +msgstr "" + +#: i18n/templates.c:8141 +msgid "No actions are controlled by this workflow. All actions will be available at all states." +msgstr "" + +#: i18n/templates.c:8030 +msgid "No actions are performed when this transition occurs." +msgstr "" + +#: i18n/templates.c:2768 +msgid "No additional authentication sources have been defined." +msgstr "" + +#: i18n/templates.c:149 +msgid "No alerts have been configured for this document." +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:180 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:202 +msgid "No authentication provider chosen" +msgstr "" + +#: plugins/ktstandard/workflow/adminpage.php:65 +msgid "No automatic assignment" +msgstr "" + +#: i18n/templates.c:8651 +msgid "No automatic workflow" +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:130 +msgid "No automatic workflow." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:170 +#: plugins/ktstandard/KTDiscussion.php:308 +msgid "No body provided" +msgstr "" + +#: lib/templating/smartytemplate.inc.php:330 +msgid "No breadcrumbs available" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1009 +#: plugins/ktcore/admin/workflowsv2.php:1100 +msgid "No change in name." +msgstr "" + +#: plugins/ktcore/KTWidgets.php:603 +msgid "No collection specified." +msgstr "" + +#: i18n/templates.c:5921 +msgid "No columns have been added to this view" +msgstr "" + +#: view.php:310 +#, php-format +msgid "No comparison version was requested. Please select a version." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:426 +msgid "No condition must be fulfilled before this transition becomes available." +msgstr "" + +#: lib/workflow/workflowtrigger.inc.php:111 +msgid "No configuration has been implemented for this plugin." +msgstr "" + +#: i18n/templates.c:4445 +msgid "No content specified for this help file yet. Edit it first." +msgstr "" + +#: i18n/templates.c:1592 i18n/templates.c:6791 +msgid "No criteria have been selected for the criteria group." +msgstr "" + +#: i18n/templates.c:7895 +msgid "No defined workflows" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:127 +#: plugins/ktstandard/admin/manageDisclaimers.php:100 +msgid "No description given" +msgstr "" + +#: i18n/templates.c:260 +msgid "No document type alerts have been configured at present" +msgstr "" + +#: view.php:111 view.php:277 +#, php-format +msgid "No document was requested. Please browse for one." +msgstr "" + +#: i18n/templates.c:3206 +msgid "No documents are currently checked out." +msgstr "" + +#: i18n/templates.c:3260 +msgid "No documents are marked as deleted." +msgstr "" + +#: plugins/ktstandard/KTBulkExportPlugin.php:153 +msgid "No documents found to export" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:367 +msgid "No documents have been selected." +msgstr "" + +#: plugins/tagcloud/TagCloudRedirectPage.php:147 search/booleanSearch.php:314 +#: search/simpleSearch.php:179 search2.php:415 +msgid "No documents or folders match this query." +msgstr "" + +#: ktapi/ktapi.inc.php:2891 ktwebservice/webservice.php:2425 +msgid "No documents were found matching the specified document no" +msgstr "" + +#: i18n/templates.c:3227 i18n/templates.c:3278 i18n/templates.c:3383 +msgid "No documents were selected." +msgstr "" + +#: plugins/ktcore/KTValidators.php:160 +msgid "No entity class specified." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1301 +#, php-format +msgid "No extractor for docid: %d" +msgstr "" + +#: i18n/templates.c:3809 i18n/templates.c:3857 +msgid "No fields associated with this fieldset." +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:322 +#: plugins/ktcore/admin/documentTypes.php:248 +msgid "No fieldsets" +msgstr "" + +#: i18n/templates.c:1196 i18n/templates.c:3701 +msgid "No fieldsets are available to be added. To add a fieldset, please go to DMS Administration" +msgstr "" + +#: i18n/templates.c:1187 i18n/templates.c:3692 +msgid "No fieldsets are currently associated with this type." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:287 +msgid "No file was selected to be uploaded to the document management system" +msgstr "" + +#: plugins/ktcore/document/Rename.php:114 +msgid "No filename given" +msgstr "" + +#: plugins/ktcore/folder/Rename.php:92 +msgid "No folder name given" +msgstr "" + +#: ktapi/ktapi.inc.php:1318 +msgid "No folder or document items found to perform the action on." +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:122 +msgid "No folders available in this location." +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:207 +msgid "No folders or documents found to compress" +msgstr "" + +#: lib/browse/DocumentCollection.inc.php:81 +#: lib/browse/DocumentCollection.inc.php:336 +msgid "No folders or documents in this location." +msgstr "" + +#: i18n/templates.c:3821 i18n/templates.c:3830 i18n/templates.c:3869 +#: i18n/templates.c:3878 +msgid "No free fields." +msgstr "" + +#: i18n/templates.c:5228 +msgid "No free keywords. Use the \"unlink\" action on a keyword to make it available." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:342 +msgid "No group is required to perform this transition" +msgstr "" + +#: i18n/templates.c:7925 +msgid "No groups or roles are defined in the DMS." +msgstr "" + +#: i18n/templates.c:5084 +msgid "No help files have been customized." +msgstr "" + +#: help.php:95 help.php:96 +msgid "No help page specified." +msgstr "" + +#: i18n/templates.c:3044 +msgid "No indicated problem." +msgstr "" + +#: plugins/ktcore/KTWidgets.php:606 +msgid "No initial folder specified specified." +msgstr "" + +#: i18n/templates.c:1766 +msgid "No internal feeds available" +msgstr "" + +#: i18n/templates.c:1763 +msgid "No internal or external feeds available" +msgstr "" + +#: ktapi/ktapi.inc.php:1274 +msgid "No items found to perform the action on." +msgstr "" + +#: i18n/templates.c:5498 +msgid "No items have been assigned with the current \t\t parent behaviour." +msgstr "" + +#: i18n/templates.c:1841 +msgid "No items in the category." +msgstr "" + +#: i18n/templates.c:5942 +msgid "No items require your attention" +msgstr "" + +#: i18n/templates.c:3080 +msgid "No items require your attention." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:685 +#: plugins/multiselect/inetbasic.inc.php:923 +msgid "No keywords selected" +msgstr "" + +#: plugins/ktcore/KTWidgets.php:296 plugins/ktcore/KTWidgets.php:815 +msgid "No label method specified." +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:427 +#: plugins/commercial/wintools/baobabkeyutil.inc.php:523 +#: thirdparty/pear/PEAR.php:879 +msgid "No licenses have been installed" +msgstr "" + +#: i18n/templates.c:3362 +msgid "No link administrator changeable link types available." +msgstr "" + +#: i18n/templates.c:8441 i18n/templates.c:8459 +msgid "No link types are defined. Please ask the administrator to add them." +msgstr "" + +#: lib/authentication/interceptor.inc.php:92 +msgid "No local user with that username" +msgstr "" + +#: browse.php:294 +msgid "No lookup fields available." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:522 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:542 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:597 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:618 +#: plugins/multiselect/inetbasic.inc.php:728 +#: plugins/multiselect/inetbasic.inc.php:755 +#: plugins/multiselect/inetbasic.inc.php:821 +#: plugins/multiselect/inetbasic.inc.php:849 +msgid "No lookups selected" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:565 +#: plugins/multiselect/inetbasic.inc.php:782 +msgid "No lookups were selected for editing" +msgstr "" + +#: i18n/templates.c:5594 +msgid "No master field is set, please select the master field" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:99 +#: plugins/ktcore/admin/unitManagement.php:164 +#: plugins/ktcore/admin/unitManagement.php:205 +msgid "No name given" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:174 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:198 +msgid "No name provided" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:413 +msgid "No name was given for this item" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2194 +msgid "No notifications." +msgstr "" + +#: plugins/ktcore/KTWidgets.php:195 +msgid "No options available for this field." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:442 +msgid "No password confirmation was provided" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:440 +msgid "No password was provided" +msgstr "" + +#: i18n/templates.c:4778 +msgid "No permission" +msgstr "" + +#: i18n/templates.c:7619 +msgid "No permissions are controlled by this state. Indicate below which permissions are controlled to allocate them." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:137 +#: plugins/ktcore/KTWorkflowTriggers.inc.php:146 +msgid "No permissions are required to perform this transition" +msgstr "" + +#: i18n/templates.c:7985 +msgid "No permissions have been created within #appname#." +msgstr "" + +#: i18n/templates.c:3413 +msgid "No problems found - database is consistent with the contents of the repository." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:950 +msgid "No reason given" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:399 +msgid "No reason provided" +msgstr "" + +#: plugins/ktstandard/KTEmail.php:548 +msgid "No recipients set" +msgstr "" + +#: ktapi/ktapi.inc.php:2651 +msgid "No recipients were provided. The list of recipients should be in the format: array('users' => array(1,2), 'groups' => array(3,1), 'external' => array('name@email.com'))." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1656 +msgid "No restrictions in place for this transition." +msgstr "" + +#: i18n/templates.c:1001 i18n/templates.c:1130 i18n/templates.c:1166 +#: i18n/templates.c:6203 i18n/templates.c:6467 +msgid "No results for your search." +msgstr "" + +#: ktoffice/controllers/list.php:1039 +msgid "No results found" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:253 +msgid "No role is required to perform this transition" +msgstr "" + +#: i18n/templates.c:2681 i18n/templates.c:4262 +msgid "No roles defined in the Role Administration area." +msgstr "" + +#: i18n/templates.c:3494 +msgid "No roles or groups have been defined or have permissions." +msgstr "" + +#: i18n/templates.c:4028 +msgid "No roles or groups have been defined. Permissions can only be allocated to roles and groups." +msgstr "" + +#: i18n/templates.c:4127 i18n/templates.c:4370 +msgid "No roles, groups, or users have been defined or have permissions." +msgstr "" + +#: ktapi/ktapi.inc.php:4292 ktapi/ktapi.inc.php:4328 +msgid "No saved searches found" +msgstr "" + +#: lib/search/searchutil.inc.php:148 lib/search/searchutil.inc.php:279 +msgid "No search criteria were specified" +msgstr "" + +#: search/booleanSearch.php:105 +msgid "No search parameters given" +msgstr "" + +#: i18n/templates.c:8504 +msgid "No search specified, or no results for your search. Please choose some criteria from the list above to find groups." +msgstr "" + +#: i18n/templates.c:8525 +msgid "No search specified, or no results for your search. Please choose some criteria from the list above to find users." +msgstr "" + +#: lib/metadata/fieldsetregistry.inc.php:179 +#: lib/metadata/fieldsetregistry.inc.php:242 +#: lib/metadata/fieldsetregistry.inc.php:315 +#: plugins/ktcore/folder/addDocument.php:338 +#: plugins/multiselect/BulkImport.php:332 +#: plugins/multiselect/BulkUpload.php:347 +#: plugins/multiselect/addDocument.php:396 +msgid "No selection." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:232 +msgid "No server name provided" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:407 +msgid "No start state is specified for this workflow. No new documents can be assigned to this workflow until one is assigned. To change this, please edit the workflow's base properties." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:415 +msgid "No starting state." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1207 +msgid "No state selected" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:984 +msgid "No state specified." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:166 +#: plugins/ktstandard/KTDiscussion.php:304 +msgid "No subject provided" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:587 +msgid "No subscriptions were chosen" +msgstr "" + +#: lib/ktentity.inc:274 +msgid "No such ID: " +msgstr "" + +#: lib/actions/entitylist.php:81 +msgid "No such KTEntityList" +msgstr "" + +#: action.php:79 +#, php-format +msgid "No such action exists in %s" +msgstr "" + +#: action.php:171 +msgid "No such action." +msgstr "" + +#: lib/browse/columnregistry.inc.php:75 +#, php-format +msgid "No such column: %s" +msgstr "" + +#: lib/actions/bulkaction.php:305 +msgid "No such document" +msgstr "" + +#: lib/ktentity.inc:366 +msgid "No such element" +msgstr "" + +#: lib/actions/bulkaction.php:328 +msgid "No such folder" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:237 +#: plugins/ktcore/admin/groupManagement.php:310 +#: plugins/ktcore/admin/groupManagement.php:394 +msgid "No such group." +msgstr "" + +#: plugins/ktcore/KTValidators.php:196 +#, php-format +msgid "No such id's: %s" +msgstr "" + +#: plugins/ktcore/KTValidators.php:201 +#, php-format +msgid "No such id: %s" +msgstr "" + +#: plugins/commercial/wintools/baobabKeyManagement.php:118 +msgid "No such key." +msgstr "" + +#: plugins/ktcore/KTPermissions.php:576 plugins/ktcore/KTPermissions.php:640 +#: plugins/ktcore/KTPermissions.php:700 plugins/ktcore/KTPermissions.php:755 +msgid "No such role allocation." +msgstr "" + +#: search/booleanSearch.php:144 search/booleanSearch.php:181 +msgid "No such search" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:351 +msgid "No such user." +msgstr "" + +#: lib/validation/validatorfactory.inc.php:67 +#, php-format +msgid "No such validator: %s" +msgstr "" + +#: lib/browse/columnregistry.inc.php:86 +#, php-format +msgid "No such view: %s" +msgstr "" + +#: lib/widgets/widgetfactory.inc.php:66 +#, php-format +msgid "No such widget: %s" +msgstr "" + +#: ktapi/ktapi.inc.php:1328 +msgid "No target folder has been specified." +msgstr "" + +#: i18n/templates.c:3089 +msgid "No tasks have been run yet." +msgstr "" + +#: i18n/templates.c:6491 +msgid "No tasks have been scheduled" +msgstr "" + +#: lib/templating/templating.inc.php:93 +msgid "No template found" +msgstr "" + +#: i18n/templates.c:4976 +msgid "No text entered" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:133 +#: plugins/ktstandard/admin/manageDisclaimers.php:106 +msgid "No title given" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1131 +msgid "No transition selected" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1075 +msgid "No transition specified." +msgstr "" + +#: i18n/templates.c:3668 +msgid "No transitions are available while the document is checked out." +msgstr "" + +#: i18n/templates.c:7955 +msgid "No transitions have been defined for this workflow." +msgstr "" + +#: i18n/templates.c:7946 +msgid "No transitions lead to this state." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:588 +msgid "No unit" +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:533 +msgid "No user id has been set, the archive cannot be created." +msgstr "" + +#: i18n/templates.c:3605 i18n/templates.c:4172 +msgid "No users have permissions on this item." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:502 +msgid "No valid LDAP group chosen" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:427 +msgid "No valid LDAP user chosen" +msgstr "" + +#: lib/email/Email.inc:146 lib/email/Email.inc:203 +msgid "No valid email addresses supplied" +msgstr "" + +#: i18n/templates.c:332 i18n/templates.c:2003 i18n/templates.c:2045 +#: i18n/templates.c:2048 i18n/templates.c:7853 +msgid "No workflow" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:165 +msgid "No workflow selected." +msgstr "" + +#: lib/util/ktutil.inc:733 lib/util/ktutil.inc:740 lib/util/ktutil.inc:753 +msgid "Non-entity object" +msgstr "" + +#: lib/search/searchutil.inc.php:713 lib/search/searchutil.inc.php:760 +msgid "Non-integer returned when looking for count" +msgstr "" + +#: lib/documentmanagement/Document.inc:299 lib/ktentity.inc:605 +msgid "Non-numeric identifier" +msgstr "" + +#: lib/groups/GroupUtil.php:174 +msgid "Non-true and non-error return value" +msgstr "" + +#: lib/templating/smartytemplate.inc.php:201 +#: plugins/ktcore/admin/documentFieldsv2.php:237 +#: plugins/multiselect/InetdocumentFieldsv2.php:273 +#: plugins/rssplugin/KTrss.inc.php:362 +msgid "None" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:258 +#: plugins/ktcore/admin/documentFieldsv2.php:108 +#: plugins/multiselect/InetdocumentFieldsv2.php:128 i18n/templates.c:3929 +#: i18n/templates.c:5684 +msgid "Normal" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:84 +#: plugins/multiselect/inetbasic.inc.php:108 +msgid "Normal (String)" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1118 +#: search2/indexing/indexerCore.inc.php:1126 +#: search2/indexing/indexers/JavaXMLRPCLuceneIndexer.inc.php:263 +msgid "Not Available" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:157 +#: lib/documentmanagement/DocumentField.inc:299 +msgid "Not Required" +msgstr "" + +#: i18n/templates.c:7067 i18n/templates.c:7076 +msgid "Not Shared" +msgstr "" + +#: lib/browse/Criteria.inc:804 +msgid "Not equal to" +msgstr "" + +#: lib/filelike/filelike.inc.php:49 lib/filelike/filelike.inc.php:56 +#: lib/filelike/filelike.inc.php:63 lib/filelike/filelike.inc.php:70 +#: lib/filelike/filelike.inc.php:77 lib/filelike/filelike.inc.php:84 +#: lib/filelike/filelike.inc.php:91 lib/filelike/filelike.inc.php:98 +#: lib/filelike/filelike.inc.php:105 lib/import/importstorage.inc.php:43 +#: lib/import/importstorage.inc.php:47 lib/import/importstorage.inc.php:51 +#: lib/storage/storagemanager.inc.php:52 lib/storage/storagemanager.inc.php:63 +#: lib/storage/storagemanager.inc.php:72 lib/storage/storagemanager.inc.php:80 +#: lib/storage/storagemanager.inc.php:89 +#: lib/storage/storagemanager.inc.php:105 +#: lib/storage/storagemanager.inc.php:113 +#: lib/storage/storagemanager.inc.php:117 +#: lib/storage/storagemanager.inc.php:125 +#: lib/storage/storagemanager.inc.php:133 +#: lib/storage/storagemanager.inc.php:147 +#: lib/storage/storagemanager.inc.php:155 +#: lib/storage/storagemanager.inc.php:159 +#: lib/storage/storagemanager.inc.php:163 +#: lib/storage/storagemanager.inc.php:167 +#: lib/storage/storagemanager.inc.php:171 +#: lib/storage/storagemanager.inc.php:175 +msgid "Not implemented" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1297 +#, php-format +msgid "Not indexing docid: %d content because extractor could not be resolve. Still indexing discussion." +msgstr "" + +#: lib/filelike/fsfilelike.inc.php:74 +msgid "Not open" +msgstr "" + +#: plugins/search2/MigrationDashlet.php:80 +msgid "Not started" +msgstr "" + +#: search2/search/expr.inc.php:230 +#, php-format +msgid "Not yet implemented in %s" +msgstr "" + +#: i18n/templates.c:3212 i18n/templates.c:3266 i18n/templates.c:3338 +#: i18n/templates.c:3368 +msgid "Note" +msgstr "" + +#: i18n/templates.c:8621 +msgid "Note that documents which are moved into this folder will change to use this workflow, and if their previous workflow was different they will lose any progress they have made in that workflow." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:116 +#: plugins/multiselect/InetdocumentFieldsv2.php:136 +msgid "Note that it is not possible to convert between different types of fieldsets, so please choose carefully." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:594 +msgid "Note that its not possible to set a group without a unit as having unit administration privileges." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:86 +msgid "Note that the first state you list is the one in which documents will start the workflow - this can be changed later on. " +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:537 +msgid "Note that the options which are available depends on previous choices within this fieldset." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1206 +#: plugins/ktstandard/KTBulkExportPlugin.php:202 i18n/templates.c:2516 +msgid "Note: Closing the page before the download link displays will cancel your Bulk Download." +msgstr "" + +#: i18n/templates.c:3101 +msgid "Note: The stack install uses its own service for task scheduling and the following is only for source installs." +msgstr "" + +#: i18n/templates.c:3098 +msgid "Note: The stack install uses its own service for task scheduling. To check if this service has been installed and is running, open the Control Panel, go to Administrative Tools and open the list of Services. The scheduler service is called KTScheduler. For further information on this service, please refer to the documentation." +msgstr "" + +#: i18n/templates.c:6965 +msgid "Note:
Search results will not be accurate until the migration process is complete." +msgstr "" + +#: search2/ajax/metadata.php:59 +msgid "Nothing else is available" +msgstr "" + +#: plugins/ktcore/KTMiscPages.php:44 plugins/ktcore/admin/workflowsv2.php:2130 +#: plugins/ktcore/admin/workflowsv2.php:2282 i18n/templates.c:7529 +#: i18n/templates.c:7559 +msgid "Notifications" +msgstr "" + +#: notify.php:103 +msgid "Notifications cleared." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2355 +msgid "Notifications updated." +msgstr "" + +#: i18n/templates.c:8066 i18n/templates.c:8174 +msgid "Notified groups & roles" +msgstr "" + +#: i18n/templates.c:206 +msgid "Notify" +msgstr "" + +#: i18n/templates.c:4472 +msgid "Now editing field \"" +msgstr "" + +#: i18n/templates.c:266 +msgid "Numbering Schemes" +msgstr "" + +#: i18n/templates.c:71 i18n/templates.c:392 i18n/templates.c:4649 +msgid "OK" +msgstr "" + +#: search2/search/exprConstants.inc.php:66 +msgid "OR" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:59 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:171 +msgid "Object Classes" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerUtil.php:211 +#: plugins/ktcore/scheduler/schedulerUtil.php:231 +#: plugins/ktcore/scheduler/schedulerUtil.php:245 +msgid "Object can't be created" +msgstr "" + +#: plugins/commercial/network/quicklinks/Quicklink.inc.php:80 +msgid "Object no longer exists" +msgstr "" + +#: plugins/commercial/officeaddin/officeaddinPlugin.php:44 +msgid "Office Add-In" +msgstr "" + +#: plugins/commercial/officeaddin/officeaddinPlugin.php:34 +msgid "Office Add-In Plugin" +msgstr "" + +#: plugins/commercial/officeaddin/dispatcher/officeaddindispatcher.php:29 +#: plugins/commercial/officeaddin/dispatcher/officeaddindispatcher.php:33 +msgid "Office Add-In Settings" +msgstr "" + +#: search2/indexing/extractors/PowerpointExtractor.inc.php:12 +msgid "Office Powerpoint Text Extractor" +msgstr "" + +#: i18n/templates.c:3476 +msgid "On deleting a document version the version history will remain but the document will be permanently deleted." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1477 +#, php-format +msgid "Once downloaded, return to the original folder" +msgstr "" + +#: i18n/templates.c:2555 +msgid "Once the document has been downloaded, you should return to the document view." +msgstr "" + +#: i18n/templates.c:7622 +msgid "Once you've selected the permissions you want to control for this workflow state, you should allocate these to the appropriate groups and roles." +msgstr "" + +#: plugins/ktstandard/KTBulkExportPlugin.php:204 +msgid "Once your download is complete, click here to return to the original folder" +msgstr "" + +#: i18n/templates.c:7778 +msgid "One of the most powerful features of #appname# is the workflow system. This allows you to direct the lifecycle of a document from start to finish. The \"Workflow Administration\" menu on the left allows you to access and update information about states, transitions, security and notifications as they apply to this workflow." +msgstr "" + +#: i18n/templates.c:7547 +msgid "One of the powerful aspects of transitions is that you can specify a set of \"effects\" which occur when the transition is followed. This list can be extended by plugins, and includes things like automatically moving the document to a particular folder." +msgstr "" + +#: i18n/templates.c:7520 +msgid "One of the reasons that workflow is so key to the way #appname# is used is that states can have a variety of effects on the way other systems work. For example: workflow states can override the permissions on a document, and reaching a state can cause notifications to be sent out." +msgstr "" + +#: i18n/templates.c:2765 +msgid "Only the standard database authentication is currently available. If you need to use a different authentication type (e.g. LDAP) you will need to ensure that the Plugin is enabled." +msgstr "" + +#: i18n/templates.c:4859 +msgid "Open Another Document" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:151 +msgid "Open Containing Folder" +msgstr "" + +#: search2/indexing/extractors/OpenOfficeTextExtractor.inc.php:59 +msgid "Open Office Text Extractor" +msgstr "" + +#: search2/indexing/extractors/OpenXmlTextExtractor.inc.php:60 +msgid "Open Xml Text Extractor" +msgstr "" + +#: i18n/templates.c:4820 +msgid "Open the selected KnowledgeTree document for viewing in Office. Changing the local copy does not update the KnowledgeTree version." +msgstr "" + +#: search2/indexing/extractors/OOPresentationExtractor.inc.php:44 +msgid "OpenOffice Presentation Extractor" +msgstr "" + +#: search2/indexing/extractors/OOSpreadsheetExtractor.inc.php:44 +msgid "OpenOffice Spreadsheet Extractor" +msgstr "" + +#: search2/indexing/extractors/OOTextExtractor.inc.php:44 +msgid "OpenOffice Writer Extractor" +msgstr "" + +#: plugins/ktcore/KTColumns.inc.php:603 +msgid "Opening Containing Folder" +msgstr "" + +#: i18n/templates.c:4895 +msgid "Opens a new instance of Microsoft Office and KnowledgeTree Office Add-in, where you can view / edit another KnowledgeTree document in Office." +msgstr "" + +#: i18n/templates.c:4814 +msgid "Opens the selected KnowledgeTree document in Office for editing and sets the version in KnowledgeTree to 'read only'. You must have 'write' permissions." +msgstr "" + +#: search2/indexing/bin/optimise.php:54 +msgid "Optimising Lucene index" +msgstr "" + +#: i18n/templates.c:5561 i18n/templates.c:5630 +msgid "Order" +msgstr "" + +#: i18n/templates.c:5552 i18n/templates.c:5621 +msgid "Order Fields" +msgstr "" + +#: i18n/templates.c:6263 +msgid "Organisation Name" +msgstr "" + +#: i18n/templates.c:6254 +msgid "Orgnisation Administration" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:303 +msgid "Original folder no longer exists. Document will be restored in the root folder." +msgstr "" + +#: plugins/browseabledashlet/BrowseableDashlet.php:46 +msgid "Orphaned Folders" +msgstr "" + +#: plugins/browseabledashlet/BrowseableDashletPlugin.php:47 +msgid "Orphaned Folders Plugin" +msgstr "" + +#: i18n/templates.c:5342 +msgid "Over time, the lookup values which make sense will change and evolve as your organisation does. You may thus need to change the lookup values associated with a given field. There are a number of different states that are possible for a given lookup" +msgstr "" + +#: i18n/templates.c:4238 +msgid "Override Parent Allocation" +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:1639 plugins/ktcore/KTPermissions.php:455 +msgid "Override parent allocation" +msgstr "" + +#: i18n/templates.c:4364 +msgid "Override permissions" +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:908 plugins/ktcore/folder/Permissions.php:260 +msgid "Override permissions from parent" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:305 +msgid "Override the checked-out status of documents if a user has failed to do so." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:74 +#: plugins/ktcore/admin/workflowsv2.php:400 +#: plugins/ktcore/admin/workflowsv2.php:551 +#: plugins/ktcore/admin/workflowsv2.php:1634 +#: plugins/ktcore/admin/workflowsv2.php:1946 +msgid "Overview" +msgstr "" + +#: i18n/templates.c:320 i18n/templates.c:1991 i18n/templates.c:2033 +msgid "Owned by" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:213 +msgid "Owned by: " +msgstr "" + +#: ktoffice/controllers/list.php:345 plugins/rssplugin/KTrss.inc.php:402 +msgid "Owner" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:2093 +msgid "Ownership changed." +msgstr "" + +#: lib/util/ktutil.inc:260 +msgid "PB" +msgstr "" + +#: plugins/ktstandard/PDFGeneratorPlugin.php:50 +msgid "PDF Generator Plugin" +msgstr "" + +#: search2/indexing/extractors/PDFExtractor.inc.php:47 +msgid "PDF Text Extractor" +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:248 +#: plugins/ktstandard/PDFGeneratorAction.php:268 +msgid "PDF file could not be downloaded because it doesn't exist" +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:284 +msgid "PDF file could not be generated. The format may not be supported by your version of OpenOffice. Please contact your System Administrator for assistance" +msgstr "" + +#: i18n/templates.c:7313 +msgid "PHP Information" +msgstr "" + +#: i18n/templates.c:5939 +msgid "Page: #batch#" +msgstr "" + +#: i18n/templates.c:1844 +msgid "Parameters" +msgstr "" + +#: i18n/templates.c:6857 +msgid "Parse" +msgstr "" + +#: search2/search/search.inc.php:662 +#, php-format +msgid "Parsing problem near '%s' in '%s' of expression." +msgstr "" + +#: search2/search/search.inc.php:688 +#, php-format +msgid "Parsing problem near '%s' of expression '%s'." +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:82 +#: lib/authentication/builtinauthenticationprovider.inc.php:191 +#: plugins/ktcore/KTBulkActions.php:145 plugins/ktcore/KTBulkActions.php:378 +#: plugins/ktcore/KTBulkActions.php:635 plugins/ktcore/KTBulkActions.php:840 +#: plugins/ktcore/KTBulkActions.php:1361 +#: plugins/ktcore/KTDocumentActions.php:458 +#: plugins/ktcore/KTDocumentActions.php:684 +#: plugins/ktcore/KTDocumentActions.php:895 +#: plugins/ktcore/KTDocumentActions.php:1052 +#: plugins/ktcore/KTDocumentActions.php:1221 +#: plugins/ktcore/KTDocumentActions.php:1456 +#: plugins/ktcore/KTDocumentActions.php:1668 +#: plugins/ktcore/KTDocumentActions.php:1933 +#: plugins/ktcore/KTFolderActions.php:117 +#: plugins/ktcore/admin/userManagement.php:160 +#: plugins/ktcore/admin/userManagement.php:269 +#: plugins/ktcore/document/edit.php:137 +#: plugins/ktcore/folder/addDocument.php:166 +#: plugins/ktstandard/ImmutableActionPlugin.php:137 +#: plugins/multiselect/addDocument.php:192 preferences.php:131 +#: i18n/templates.c:380 i18n/templates.c:1679 i18n/templates.c:4724 +#: i18n/templates.c:5006 i18n/templates.c:6272 +msgid "Password" +msgstr "" + +#: plugins/passwordResetPlugin/passwordResetPlugin.php:74 +msgid "Password Reset Plugin" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:447 +msgid "Password and confirmation password do not match" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:244 +msgid "Password changed" +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:78 +#: plugins/multiselect/BulkImport.php:151 +msgid "Path" +msgstr "" + +#: lib/import/fsimportstorage.inc.php:64 lib/import/fsimportstorage.inc.php:97 +msgid "Path is not a folder" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:328 +#: plugins/search2/reporting/PendingDocuments.php:47 i18n/templates.c:7151 +msgid "Pending Documents Indexing Queue" +msgstr "" + +#: i18n/templates.c:611 +msgid "Per-User Activity" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1911 +msgid "Perform Quick Transition" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1912 i18n/templates.c:7871 +msgid "Perform Transition" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1981 +#, php-format +msgid "Perform Transition: %s" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:388 +msgid "Performs a check to see if the documents in your repositories all are stored on the back-end storage (usually on disk)." +msgstr "" + +#: i18n/templates.c:6983 +msgid "Period Since Last Indexing:" +msgstr "" + +#: i18n/templates.c:6977 +msgid "Period Since Last Optimization:" +msgstr "" + +#: i18n/templates.c:5126 +msgid "Permission" +msgstr "" + +#: lib/dispatcher.inc.php:334 +msgid "Permission Denied" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:59 +msgid "Permission Restrictions" +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:149 +msgid "Permission created" +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:168 +msgid "Permission deleted" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:273 plugins/ktcore/KTPermissions.php:68 +#: plugins/ktcore/KTPermissions.php:195 +#: plugins/ktcore/folder/Permissions.php:56 +#: plugins/ktcore/folder/Permissions.php:60 +#: plugins/ktcore/folder/Permissions.php:193 i18n/templates.c:4121 +msgid "Permissions" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1535 +msgid "Permissions Allocated." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1255 i18n/templates.c:7658 +msgid "Permissions Overview" +msgstr "" + +#: i18n/templates.c:5117 +msgid "Permissions are descriptors used to ascertain whether groups of users have access to certain functionality. The built-in permissions below facilitate the default functionality of the DMS and can't be changed. Plugin developers may choose to add additional permissions below that manage access to their plugins functionality." +msgstr "" + +#: i18n/transactions.c:17 +msgid "Permissions changed" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:556 +msgid "Permissions on folder updated" +msgstr "" + +#: i18n/templates.c:8072 i18n/templates.c:8180 +msgid "Permissions overridden" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:581 +msgid "Permissions updated" +msgstr "" + +#: ktoffice/controllers/list.php:177 ktoffice/controllers/list.php:301 +#: ktoffice/controllers/list.php:372 +msgid "Permissions:" +msgstr "" + +#: plugins/multiselect/inetbasic.inc.php:361 +msgid "Permits to create a multiselect or single select choices." +msgstr "" + +#: search2/indexing/extractors/PlainTextExtractor.inc.php:44 +msgid "Plain Text Extractor" +msgstr "" + +#: i18n/templates.c:7355 +msgid "Please be aware that - depending on your selections - new values may become available." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1606 +msgid "Please be sure to enter information for all the Required fields below" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1943 +msgid "Please bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:427 +#: plugins/passwordResetPlugin/loginResetDispatcher.php:475 +msgid "Please check that you have entered a valid username and email address." +msgstr "" + +#: i18n/templates.c:6047 +msgid "Please choose a location to place your unit folder." +msgstr "" + +#: i18n/templates.c:4760 +msgid "Please close all open editors." +msgstr "" + +#: i18n/templates.c:4937 +msgid "Please complete all required fields." +msgstr "" + +#: i18n/templates.c:5774 +msgid "Please complete the following fields to edit the fieldset's properties and then click Change. Required fields are marked with a red square." +msgstr "" + +#: i18n/templates.c:6059 +msgid "Please complete the form below to add a new user. Fields marked with a red square are required. By default, users are created using #appname#'s builtin authentication provider. Should you wish to use an external authentication provider such as LDAP, please ensure that the provider's plugin is registered and use the form on the User Management page." +msgstr "" + +#: i18n/templates.c:6128 +msgid "Please complete the form below to edit the user. Fields marked with a red square are required. By default, users are created using #appname#'s builtin authentication provider. Should you wish to use an external authentication provider such as LDAP, please ensure that the provider's plugin is registered and enabled." +msgstr "" + +#: i18n/templates.c:3284 +msgid "Please confirm that this is the document that you wish to check-in." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:747 +msgid "Please consult your system administrator. The authentication parameters are corrupt. (authentication_detail_s1 is null)" +msgstr "" + +#: i18n/templates.c:1139 +msgid "Please contact #email# to purchase a new subscription, or renew your existing one." +msgstr "" + +#: i18n/templates.c:5984 +msgid "Please contact the KnowledgeTree Sales team should you wish to learn more about commercially supported editions of KnowledgeTree." +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:261 +msgid "Please contact your System Administrator for assistance." +msgstr "" + +#: lib/widgets/forms.inc.php:551 +msgid "Please correct the errors indicated." +msgstr "" + +#: i18n/templates.c:269 +msgid "Please define an appropriate numbering scheme for each document type:" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:692 +msgid "Please describe the changes you made to the document. Bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: search/booleanSearch.php:123 +msgid "Please either enter a name, or select a search to save over" +msgstr "" + +#: i18n/templates.c:3104 +msgid "Please ensure that the scheduler is listed in your cron jobs. The line to be added to the crontab to implement the cron job is:" +msgstr "" + +#: plugins/commercial/electronic-signatures/KTElectronicSignatures.php:228 +#: i18n/templates.c:4655 +msgid "Please enter a comment" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:732 +msgid "Please enter a list of states, one per line. State names must be unique, and this includes states already in this workflow." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:840 +msgid "Please enter a list of transitions, one per line. Transition names must be unique." +msgstr "" + +#: i18n/templates.c:4691 +msgid "Please enter a message" +msgstr "" + +#: i18n/templates.c:7226 +msgid "Please enter a name for the search expression." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:582 +#: plugins/ktstandard/KTDocumentLinks.php:599 +msgid "Please enter information for all fields." +msgstr "" + +#: i18n/templates.c:4694 +msgid "Please enter some recipients" +msgstr "" + +#: i18n/templates.c:2405 +msgid "Please enter some search criteria!" +msgstr "" + +#: i18n/templates.c:6014 +msgid "Please enter the Group's details below and then click create group. Fields marked with a red square are required." +msgstr "" + +#: i18n/templates.c:6032 +msgid "Please enter the Unit's details below and then click create unit. Fields marked with a red square are required." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:367 +#: plugins/multiselect/inetbasic.inc.php:545 +msgid "Please enter the lookup values you wish to add, one per line." +msgstr "" + +#: i18n/templates.c:1673 i18n/templates.c:5000 +msgid "Please enter your details below to login." +msgstr "" + +#: login.php:270 plugins/passwordResetPlugin/loginResetDispatcher.php:219 +msgid "Please enter your password." +msgstr "" + +#: i18n/templates.c:1706 +msgid "Please enter your username and email address." +msgstr "" + +#: login.php:257 plugins/passwordResetPlugin/loginResetDispatcher.php:206 +msgid "Please enter your username." +msgstr "" + +#: i18n/templates.c:4013 +msgid "Please give a reason for deleting these files. This will be recorded in the documents' \"Transaction History\"" +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:92 +#: plugins/ktcore/admin/roleManagement.php:114 +msgid "Please give the role a name." +msgstr "" + +#: i18n/templates.c:2603 +msgid "Please give these final details." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1284 +#: plugins/ktcore/KTDocumentActions.php:1519 +msgid "Please indicate a new filename to use to resolve any conflicts." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1268 +#: plugins/ktcore/KTDocumentActions.php:1503 +msgid "Please indicate a new title to use to resolve any title conflicts." +msgstr "" + +#: i18n/templates.c:3437 i18n/templates.c:3443 +msgid "Please note" +msgstr "" + +#: i18n/templates.c:7799 +msgid "Please note that additional configuration is possible on states beyond what is specified here (e.g. which users to notify about the document, etc). Please edit the state to access and modify these other properties." +msgstr "" + +#: i18n/templates.c:4211 +msgid "Please note that changing role allocations may take a some time, depending on the number of folders below this one." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:2036 +msgid "Please note that changing the owner may affect access to this document." +msgstr "" + +#: i18n/templates.c:7883 +msgid "Please note that changing the workflow on a document will start the workflow at the beginning of the new workflow. This is true even if the new workflow is identical to the old one." +msgstr "" + +#: i18n/templates.c:1280 +msgid "Please note that only 1 key is ever active - the key which expires first (listed at the top). If you need more active users, you will need to purchase additional user licenses. If you have upgraded from Basic to Plus or Premium, please add your new license and then delete the old license." +msgstr "" + +#: i18n/templates.c:7181 +msgid "Please note that rescheduling all documents may take a long time, depending on the size of the repository." +msgstr "" + +#: i18n/templates.c:7739 i18n/templates.c:7760 +msgid "Please note that the plugins that are installed will affect the available options" +msgstr "" + +#: search/simpleSearch.php:150 +msgid "Please provide a search term" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:136 plugins/ktcore/KTBulkActions.php:369 +#: plugins/ktcore/KTBulkActions.php:626 plugins/ktcore/KTBulkActions.php:831 +#: plugins/ktcore/KTBulkActions.php:1352 +#: plugins/ktcore/KTDocumentActions.php:449 +#: plugins/ktcore/KTDocumentActions.php:675 +#: plugins/ktcore/KTDocumentActions.php:886 +#: plugins/ktcore/KTDocumentActions.php:1043 +#: plugins/ktcore/KTDocumentActions.php:1212 +#: plugins/ktcore/KTDocumentActions.php:1447 +#: plugins/ktcore/KTDocumentActions.php:1659 +#: plugins/ktcore/KTDocumentActions.php:1924 +#: plugins/ktcore/KTFolderActions.php:108 plugins/ktcore/document/edit.php:128 +#: plugins/ktcore/folder/addDocument.php:157 +#: plugins/ktstandard/ImmutableActionPlugin.php:128 +#: plugins/multiselect/addDocument.php:183 +msgid "Please provide your user credentials as confirmation of this action." +msgstr "" + +#: search2.php:312 +msgid "Please reattempt the query. The query is missing." +msgstr "" + +#: i18n/templates.c:5990 +msgid "Please refer to the documentation provided to you at subscription to learn more about how to access KnowledgeTree's professional support team." +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:231 +#: plugins/multiselect/addDocument.php:273 +msgid "Please reselect the file to upload." +msgstr "" + +#: ktoffice/controllers/list.php:1043 +msgid "Please retry your search" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:594 +msgid "Please review this document." +msgstr "" + +#: i18n/templates.c:8540 +msgid "Please select a disclaimer to customize." +msgstr "" + +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:172 +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:180 +msgid "Please select a document or folder to make a shortcut to first." +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:77 +#: plugins/ktcore/admin/userManagement.php:202 +#: plugins/ktcore/admin/userManagement.php:262 +#: plugins/ktcore/admin/userManagement.php:575 +#: plugins/ktcore/admin/userManagement.php:590 +msgid "Please select a user first." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:308 +#: plugins/ktcore/admin/userManagement.php:456 +msgid "Please select a user to modify first." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:121 +#: plugins/ktcore/admin/groupManagement.php:162 +msgid "Please select a valid group." +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:109 +#: plugins/ktcore/admin/roleManagement.php:131 +msgid "Please select a valid role first." +msgstr "" + +#: action.php:158 action.php:162 +msgid "Please select documents or folders first." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:614 +msgid "Please select one or more link types to delete." +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:596 +msgid "Please select one or more permissions." +msgstr "" + +#: i18n/templates.c:1559 i18n/templates.c:6758 +msgid "Please select some search criteria" +msgstr "" + +#: i18n/templates.c:8642 +msgid "Please select the appropriate workflows for each document type." +msgstr "" + +#: plugins/ktcore/document/edit.php:347 +msgid "Please select the new type for this document." +msgstr "" + +#: i18n/templates.c:7604 +msgid "Please select which roles or groups should be informed when each state is reached." +msgstr "" + +#: i18n/templates.c:7805 i18n/templates.c:7916 +msgid "Please select which roles or groups should be informed when this state is reached." +msgstr "" + +#: i18n/templates.c:7841 +msgid "Please select which states this transition should be available from. Note that transitions are never available from their target state, even if you specify it below." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:544 +msgid "Please specify a link type to edit." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:575 +msgid "Please specify a link type to update." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:165 +msgid "Please specify a name for the group." +msgstr "" + +#: search2/search/bin/search.php:96 +msgid "Please specify a username!" +msgstr "" + +#: search2/search/bin/search.php:101 +msgid "Please specify search criteria!" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:657 +#, php-format +msgid "Please specify the file you wish to upload. Unless you also indicate that you are changing its filename (see \"Force Original Filename\" below), this will need to be called %s" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1676 +msgid "Please specify why you are archiving this document. Please bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:903 +msgid "Please specify why you are cancelling this document's checked-out status. Please bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1370 +msgid "Please specify why you are checking out these documents. It will assist other users in understanding why you have locked these files." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:466 +#: plugins/ktcore/KTFolderActions.php:123 +#: plugins/ktcore/folder/addDocument.php:172 +#: plugins/multiselect/addDocument.php:198 +msgid "Please specify why you are checking out this document. It will assist other users in understanding why you have locked this file. Please bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1464 +msgid "Please specify why you are copying this document. Bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1060 +msgid "Please specify why you are deleting this document. Please bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: plugins/ktstandard/ImmutableActionPlugin.php:145 +msgid "Please specify why you are making this document immutable. Please bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1230 +msgid "Please specify why you are moving this document. Bear in mind that you can use a maximum of 250 characters." +msgstr "" + +#: i18n/templates.c:4622 +msgid "Please verify your
Internet connection,
and try again." +msgstr "" + +#: plugins/ktcore/admin/plugins.php:56 i18n/templates.c:5945 +msgid "Plugins" +msgstr "" + +#: plugins/ktstandard/workflow/adminpage.php:69 +msgid "Plugins providing workflow allocators." +msgstr "" + +#: plugins/ktcore/admin/plugins.php:162 +msgid "Plugins read from the filesystem" +msgstr "" + +#: plugins/ktcore/admin/plugins.php:153 +msgid "Plugins updated" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:502 +msgid "Plus" +msgstr "" + +#: i18n/templates.c:5975 +msgid "." +msgstr "" + +#: i18n/templates.c:1370 i18n/templates.c:5162 i18n/templates.c:5909 +msgid "Position" +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:138 +msgid "Possible cause" +msgstr "" + +#: i18n/templates.c:8339 +msgid "Post a reply" +msgstr "" + +#: i18n/templates.c:8342 +msgid "Post reply" +msgstr "" + +#: search2/indexing/extractors/PSExtractor.inc.php:50 +msgid "PostScript Text Extractor" +msgstr "" + +#: config/siteMap.inc:72 lib/templating/kt3template.inc.php:321 +#: lib/templating/kt3template.inc.php:409 preferences.php:56 +#: i18n/templates.c:6278 +msgid "Preferences" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:502 +msgid "Premium" +msgstr "" + +#: i18n/templates.c:3119 +msgid "Press 'i' to edit a line." +msgstr "" + +#: i18n/templates.c:3116 +msgid "Press 'o' to start a new line." +msgstr "" + +#: i18n/templates.c:3122 +msgid "Press the 'esc' key to exit the edit mode." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:654 +msgid "Prevents a transition from being followed if the document is checked out.." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:367 +msgid "Prevents this transition from occuring if the condition specified is not met for the document." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:278 +msgid "Prevents users who are not members of the specified group from using this transition." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:60 +msgid "Prevents users who do not have the specified permission from using this transition." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:168 +msgid "Prevents users who do not have the specified role from using this transition." +msgstr "" + +#: i18n/templates.c:5240 +msgid "Preview" +msgstr "" + +#: i18n/templates.c:2414 +msgid "Previous Search Results" +msgstr "" + +#: plugins/ktcore/scheduler/taskScheduler.php:66 +msgid "Previous run time" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:795 +msgid "Problem assigning role groups" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:530 +msgid "Problem assigning role to parent allocation" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:740 +msgid "Problem assigning role users" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1408 +#: search2/indexing/indexerCore.inc.php:1426 +#, php-format +msgid "Problem filtering document %d" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1435 +#, php-format +msgid "Problem indexing document %d - indexDocument" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1416 +#, php-format +msgid "Problem indexing document %d - indexDocumentAndDiscussion" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:239 +msgid "Problem retrieving quicklinks" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1319 +#, php-format +msgid "Processing docid: %d.\n" +msgstr "" + +#: plugins/commercial/professional-reporting/ProfessionalReportingPlugin.php:38 +msgid "Professional Reporting" +msgstr "" + +#: i18n/templates.c:7352 +msgid "Project Details" +msgstr "" + +#: i18n/templates.c:4607 +msgid "Properties could not be saved." +msgstr "" + +#: i18n/templates.c:4610 +msgid "Properties have been saved." +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreviewPlugin.php:68 +#: plugins/ktstandard/documentpreview/documentPreviewPlugin.php:95 +#: plugins/ktstandard/documentpreview/documentPreviewPlugin.php:108 +msgid "Property Preview" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreviewPlugin.php:103 +msgid "Property Preview Plugin" +msgstr "" + +#: i18n/templates.c:4628 +msgid "Provide a reason for cancelling this edit.

" +msgstr "" + +#: i18n/templates.c:4640 +msgid "Provide a reason for editing this document.

" +msgstr "" + +#: i18n/templates.c:4634 +msgid "Provide a reason for this edit.

" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:388 +#, php-format +msgid "Provided variable %s is not a valid %s" +msgstr "" + +#: i18n/templates.c:2798 +msgid "Provider" +msgstr "" + +#: i18n/templates.c:2804 +msgid "Provider configuration" +msgstr "" + +#: lib/authentication/authenticationprovider.inc.php:95 +#: lib/authentication/authenticationprovider.inc.php:99 +msgid "Provider does not support editing" +msgstr "" + +#: i18n/templates.c:4793 +msgid "Provides an interface to create a new folder under the current folder. You must have 'add' permissions on the folder." +msgstr "" + +#: i18n/templates.c:4802 +msgid "Provides an interface to delete the current folder. You must have 'delete' permissions on the folder." +msgstr "" + +#: i18n/templates.c:4799 +msgid "Provides an interface to rename the current folder. You must have 'rename' permissions on the folder." +msgstr "" + +#: lib/documentmanagement/Document.inc:742 +msgid "Published" +msgstr "" + +#: search2.php:745 search2.php:746 +msgid "Query Editor" +msgstr "" + +#: search2/ajax/parseExpr.php:43 search2/ajax/saveExpr.php:42 +msgid "Query is empty" +msgstr "" + +#: search2/ajax/saveExpr.php:60 +msgid "Query name is empty" +msgstr "" + +#: i18n/templates.c:7004 +msgid "Queue Coverage :" +msgstr "" + +#: i18n/templates.c:7007 +msgid "Queue coverage indicates percentage of documents currently queued for indexing in relation to total repository size." +msgstr "" + +#: plugins/search2/openSearchDescription.php:14 +msgid "Quick Search" +msgstr "" + +#: i18n/templates.c:2393 i18n/templates.c:2417 +msgid "Quick Search Options" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:88 +msgid "Quicklink deleted" +msgstr "" + +#: plugins/commercial/network/quicklinks/QuicklinksDashlet.php:34 +msgid "Quicklinks" +msgstr "" + +#: plugins/commercial/network/quicklinks/QuicklinksPlugin.php:41 +msgid "Quicklinks Plugin" +msgstr "" + +#: i18n/templates.c:866 +msgid "Quicklinks allow the administrator to create and order a collection of links to documents and folders, which will display on users' dashboards." +msgstr "" + +#: i18n/templates.c:869 +msgid "Quicklinks are links to documents and folders which you use often." +msgstr "" + +#: plugins/rssplugin/RSSDashlet.php:47 +msgid "RSS Feeds" +msgstr "" + +#: plugins/rssplugin/RSSPlugin.php:53 +msgid "RSS Plugin" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:78 +msgid "RSS feed deleted" +msgstr "" + +#: i18n/templates.c:1769 +msgid "RSS feed unavailable." +msgstr "" + +#: i18n/templates.c:1817 +msgid "RSS for Document" +msgstr "" + +#: i18n/templates.c:1826 +msgid "RSS for folder" +msgstr "" + +#: search2/indexing/extractors/RTFExtractor.inc.php:44 +msgid "RTF Extractor" +msgstr "" + +#: i18n/templates.c:917 +msgid "Re-order" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:186 +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:187 +#: i18n/templates.c:884 i18n/templates.c:908 i18n/templates.c:911 +msgid "Re-order Quicklinks" +msgstr "" + +#: i18n/templates.c:890 +msgid "Re-order quicklinks" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:256 +msgid "Re-ordered quicklinks" +msgstr "" + +#: i18n/permissions.c:9 +msgid "Read" +msgstr "" + +#: i18n/templates.c:5954 +msgid "Read plugins from filesystem" +msgstr "" + +#: i18n/templates.c:3011 +msgid "Read the admin introduction." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:153 plugins/ktcore/KTBulkActions.php:388 +#: plugins/ktcore/KTBulkActions.php:644 plugins/ktcore/KTBulkActions.php:849 +#: plugins/ktcore/KTBulkActions.php:1369 +#: plugins/ktcore/KTDocumentActions.php:465 +#: plugins/ktcore/KTDocumentActions.php:691 +#: plugins/ktcore/KTDocumentActions.php:902 +#: plugins/ktcore/KTDocumentActions.php:1059 +#: plugins/ktcore/KTDocumentActions.php:1229 +#: plugins/ktcore/KTDocumentActions.php:1463 +#: plugins/ktcore/KTDocumentActions.php:1675 +#: plugins/ktcore/KTDocumentActions.php:1941 +#: plugins/ktcore/KTFolderActions.php:122 plugins/ktcore/document/edit.php:142 +#: plugins/ktcore/folder/addDocument.php:171 +#: plugins/ktstandard/ImmutableActionPlugin.php:144 +#: plugins/ktstandard/KTDiscussion.php:272 +#: plugins/multiselect/addDocument.php:197 view.php:423 +msgid "Reason" +msgstr "" + +#: i18n/templates.c:2972 i18n/templates.c:2981 +msgid "Reason for failure" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1824 +msgid "Reason for transition" +msgstr "" + +#: i18n/templates.c:479 i18n/templates.c:563 i18n/templates.c:656 +#: i18n/templates.c:764 +msgid "Recent Downloads" +msgstr "" + +#: i18n/templates.c:482 i18n/templates.c:566 i18n/templates.c:659 +#: i18n/templates.c:767 +msgid "Recent Uploads" +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/latestchanges.php:35 +msgid "Recently Added/Changed Documents" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:291 +msgid "Recently Dropped Documents" +msgstr "" + +#: plugins/commercial/network/userhistory/UserHistoryDashlet.inc.php:36 +msgid "Recently Viewed Items" +msgstr "" + +#: bin/recreateIndexes.php:51 +msgid "Recreate DB Indexes" +msgstr "" + +#: search2/indexing/bin/recreateIndex.php:53 +msgid "Recreate Lucene index" +msgstr "" + +#: i18n/templates.c:278 +msgid "Regenerate On Checkin" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:382 +msgid "Register new plugins, disable plugins, and so forth" +msgstr "" + +#: search2/indexing/bin/registerTypes.php:55 +msgid "Registering Extractor mapping to Mime types" +msgstr "" + +#: search2/indexing/bin/reportUnindexedDocuments.php:76 +msgid "Reindexing documents when they are encountered." +msgstr "" + +#: i18n/templates.c:8372 +msgid "Relationship" +msgstr "" + +#: i18n/templates.c:2882 i18n/templates.c:2927 i18n/templates.c:3812 +#: i18n/templates.c:3860 i18n/templates.c:4076 i18n/templates.c:4487 +#: i18n/templates.c:5744 i18n/templates.c:5759 i18n/templates.c:7136 +msgid "Remove" +msgstr "" + +#: i18n/templates.c:7139 +msgid "Remove All" +msgstr "" + +#: i18n/templates.c:1595 i18n/templates.c:6794 +msgid "Remove Criteria Group" +msgstr "" + +#: i18n/templates.c:5801 +msgid "Remove conditional" +msgstr "" + +#: i18n/templates.c:3917 i18n/templates.c:5672 i18n/templates.c:5831 +msgid "Remove fields" +msgstr "" + +#: i18n/templates.c:65 +msgid "Remove from assigned entities" +msgstr "" + +#: i18n/templates.c:8600 +msgid "Remove subscription" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:373 +#: plugins/ktcore/admin/groupManagement.php:528 +msgid "Removed" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:638 +msgid "Removed dynamic permissions" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:660 +msgid "Removed from groups" +msgstr "" + +#: search2/indexing/extractors/StarOfficeExtractor.inc.php:172 +#, php-format +msgid "Removing document from queue: documentId %d" +msgstr "" + +#: plugins/ktcore/document/Rename.php:58 plugins/ktcore/document/Rename.php:82 +#: plugins/ktcore/folder/Rename.php:52 i18n/templates.c:2651 +#: i18n/templates.c:2654 i18n/templates.c:4115 i18n/transactions.c:4 +msgid "Rename" +msgstr "" + +#: i18n/templates.c:5459 i18n/templates.c:5471 i18n/templates.c:5633 +#: i18n/templates.c:5636 +msgid "Rename Behaviours" +msgstr "" + +#: i18n/templates.c:2645 +msgid "Rename Document" +msgstr "" + +#: i18n/templates.c:4106 i18n/templates.c:4112 i18n/templates.c:4796 +msgid "Rename Folder" +msgstr "" + +#: plugins/ktcore/folder/Rename.php:61 +msgid "Rename folder" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:299 +#, php-format +msgid "Renamed from \"%s\" to \"%s\"" +msgstr "" + +#: i18n/templates.c:1382 i18n/templates.c:5174 i18n/templates.c:5918 +msgid "Reorder down" +msgstr "" + +#: i18n/templates.c:1379 i18n/templates.c:5171 i18n/templates.c:5915 +msgid "Reorder up" +msgstr "" + +#: i18n/templates.c:215 +msgid "Repeated after
notification" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1168 +msgid "Replacement State" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:155 +msgid "Replacement already exists. Editing the existing copy instead of replacing." +msgstr "" + +#: i18n/templates.c:8309 +msgid "Replies" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:364 +msgid "Reply posted" +msgstr "" + +#: plugins/commercial/professional-reporting/ProfessionalReportingPlugin.php:47 +#, php-format +msgid "Report on usage of %s" +msgstr "" + +#: plugins/commercial/professional-reporting/ProfessionalReportingPlugin.php:46 +msgid "Reporting" +msgstr "" + +#: plugins/commercial/professional-reporting/ProfessionalReportingPlugin.php:51 +msgid "Reports on user activities - login history and last login information." +msgstr "" + +#: plugins/ktcore/KTAssist.php:51 i18n/templates.c:2498 i18n/templates.c:2504 +#: i18n/templates.c:2507 +msgid "Request Assistance" +msgstr "" + +#: i18n/templates.c:2450 i18n/templates.c:2459 +msgid "Request created in #timing#s" +msgstr "" + +#: view.php:452 +msgid "Request for an archived document to be restored" +msgstr "" + +#: view.php:413 +msgid "Request restoration of document" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:155 +#: lib/documentmanagement/DocumentField.inc:297 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:135 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:253 +#: plugins/multiselect/inetbasic.inc.php:198 +#: plugins/multiselect/inetbasic.inc.php:352 +#: plugins/multiselect/inetbasic.inc.php:406 i18n/templates.c:455 +#: i18n/templates.c:467 i18n/templates.c:539 i18n/templates.c:551 +#: i18n/templates.c:632 i18n/templates.c:644 i18n/templates.c:740 +#: i18n/templates.c:752 i18n/templates.c:1661 i18n/templates.c:1664 +#: i18n/templates.c:1925 i18n/templates.c:1928 i18n/templates.c:1931 +#: i18n/templates.c:1949 i18n/templates.c:1952 i18n/templates.c:1955 +#: i18n/templates.c:1958 i18n/templates.c:1961 i18n/templates.c:4421 +#: i18n/templates.c:4442 i18n/templates.c:5711 +msgid "Required" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:137 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:256 +#: plugins/multiselect/inetbasic.inc.php:200 +#: plugins/multiselect/inetbasic.inc.php:355 +#: plugins/multiselect/inetbasic.inc.php:409 +msgid "Required fields must be filled in, or the adding process will be rejected." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:343 +#, php-format +msgid "Required value %s not set" +msgstr "" + +#: i18n/templates.c:5960 +msgid "Reread plugins" +msgstr "" + +#: i18n/templates.c:7130 +msgid "Reschedule" +msgstr "" + +#: i18n/templates.c:7133 i18n/templates.c:7184 +msgid "Reschedule All" +msgstr "" + +#: i18n/templates.c:7175 +msgid "Reschedule All Documents" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:332 +#: plugins/search2/reporting/RescheduleDocuments.php:47 +msgid "Reschedule all documents" +msgstr "" + +#: i18n/templates.c:6860 +msgid "Reset" +msgstr "" + +#: i18n/templates.c:212 +msgid "Reset on
check-in" +msgstr "" + +#: i18n/templates.c:1721 +msgid "Reset password" +msgstr "" + +#: i18n/templates.c:3596 i18n/templates.c:4163 +msgid "Resolved permissions per user" +msgstr "" + +#: i18n/templates.c:6899 +msgid "Resource" +msgstr "" + +#: i18n/templates.c:3176 i18n/templates.c:3254 +msgid "Restore" +msgstr "" + +#: plugins/commercial/guidInserter/GuidInserter.php:423 i18n/templates.c:401 +#: i18n/templates.c:410 i18n/templates.c:2711 +msgid "Restore Document" +msgstr "" + +#: i18n/templates.c:3377 +msgid "Restore To" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:308 +msgid "Restore old (archived) documents, usually at a user's request." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:311 +msgid "Restore or Expunge Deleted Documents" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:311 +msgid "Restore previously deleted documents, or permanently expunge them." +msgstr "" + +#: plugins/ktcore/KTAssist.php:310 +#: plugins/ktcore/admin/deletedDocuments.php:282 +#, php-format +msgid "Restored from deleted state by %s" +msgstr "" + +#: i18n/templates.c:4856 +msgid "Restores document properties to previously saved values." +msgstr "" + +#: i18n/templates.c:4883 +msgid "Restores previously saved document properties." +msgstr "" + +#: i18n/templates.c:1214 i18n/templates.c:3719 +msgid "Restrict document types" +msgstr "" + +#: i18n/templates.c:7682 +msgid "Restriction" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1700 +msgid "Restriction Type" +msgstr "" + +#: lib/actions/bulkaction.php:530 +msgid "Return" +msgstr "" + +#: i18n/templates.c:4505 +msgid "Return items which match" +msgstr "" + +#: i18n/templates.c:1577 i18n/templates.c:6776 +msgid "Return items which match #options# of the criteria groups specified." +msgstr "" + +#: i18n/templates.c:1589 i18n/templates.c:6788 +msgid "Return items which match #options# of the criteria specified below." +msgstr "" + +#: i18n/templates.c:2819 i18n/templates.c:2861 i18n/templates.c:2906 +msgid "Return items which match  #options# of the criteria groups specified." +msgstr "" + +#: i18n/templates.c:2831 +msgid "Return items which match  #options# of the criteria specified below." +msgstr "" + +#: i18n/templates.c:2873 i18n/templates.c:2918 +msgid "Return items which match  #options# of the criteria specified." +msgstr "" + +#: i18n/templates.c:2522 +msgid "Return to Folder" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1437 +#, php-format +msgid "Return to the original folder" +msgstr "" + +#: i18n/templates.c:4454 i18n/templates.c:4457 +msgid "Return to where you came from." +msgstr "" + +#: i18n/templates.c:4865 +msgid "Revert" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:449 +#: plugins/ktcore/folder/Permissions.php:456 i18n/templates.c:2669 +#: i18n/templates.c:3500 i18n/templates.c:4133 i18n/templates.c:4214 +#: i18n/templates.c:4376 i18n/templates.c:7976 +msgid "Role" +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:102 +#, php-format +msgid "Role \"%s\" created." +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:141 +#, php-format +msgid "Role \"%s\" deleted. " +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:124 +#, php-format +msgid "Role \"%s\" updated." +msgstr "" + +#: i18n/templates.c:6287 +msgid "Role Administration" +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:54 +#: plugins/ktcore/admin/roleManagement.php:55 +msgid "Role Management" +msgstr "" + +#: i18n/templates.c:6308 +msgid "Role Name" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:167 +msgid "Role Restrictions" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:497 +msgid "Role allocation created." +msgstr "" + +#: i18n/transactions.c:18 +msgid "Role allocations changed" +msgstr "" + +#: ktapi/ktapi.inc.php:1427 ktapi/ktapi.inc.php:1675 +msgid "Role id must be numeric." +msgstr "" + +#: ktapi/ktapi.inc.php:1460 +msgid "Role name must be a string." +msgstr "" + +#: plugins/ktcore/KTPermissions.php:537 +msgid "Role now uses parent." +msgstr "" + +#: i18n/templates.c:3497 i18n/templates.c:4130 i18n/templates.c:4373 +#: i18n/templates.c:4526 i18n/templates.c:7973 +msgid "Role or Group" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2242 +#, php-format +msgid "Role: %s" +msgstr "" + +#: plugins/commercial/alerts/KTDocTypeAlerts.php:265 +#: plugins/commercial/alerts/alerts.php:915 +#: plugins/ktcore/KTCorePlugin.php:275 +#: plugins/ktcore/admin/workflowsv2.php:2190 i18n/templates.c:7808 +#: i18n/templates.c:7919 +msgid "Roles" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:819 +#: plugins/multiselect/inetbasic.inc.php:1105 +msgid "Root" +msgstr "" + +#: i18n/templates.c:6548 +msgid "Run Condition" +msgstr "" + +#: i18n/templates.c:6590 i18n/templates.c:7082 +msgid "Run Search" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:234 +msgid "Run on Next Iteration" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:117 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:475 +#: plugins/ktcore/admin/savedSearch.php:76 +#: plugins/multiselect/inetbasic.inc.php:667 i18n/templates.c:134 +#: i18n/templates.c:1871 i18n/templates.c:2738 i18n/templates.c:4784 +#: i18n/templates.c:6494 i18n/templates.c:6866 i18n/templates.c:6872 +#: i18n/templates.c:7238 i18n/templates.c:7910 i18n/templates.c:7952 +#: i18n/templates.c:7997 i18n/templates.c:8489 i18n/templates.c:8492 +msgid "Save" +msgstr "" + +#: i18n/templates.c:4871 +msgid "Save As" +msgstr "" + +#: i18n/templates.c:4823 +msgid "Save As New Version" +msgstr "" + +#: i18n/templates.c:1901 +msgid "Save Changes" +msgstr "" + +#: i18n/templates.c:2999 +msgid "Save Config Settings" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:278 +#: plugins/multiselect/addDocument.php:326 +msgid "Save Document" +msgstr "" + +#: i18n/templates.c:4832 +msgid "Save Properties" +msgstr "" + +#: i18n/templates.c:8243 i18n/templates.c:8255 i18n/templates.c:8267 +#: i18n/templates.c:8279 i18n/templates.c:8291 +msgid "Save Trigger" +msgstr "" + +#: i18n/templates.c:4841 +msgid "Save and Close" +msgstr "" + +#: i18n/templates.c:4886 +msgid "Save as" +msgstr "" + +#: i18n/templates.c:1781 +msgid "Save changes" +msgstr "" + +#: i18n/templates.c:1865 +msgid "Save this search" +msgstr "" + +#: i18n/templates.c:6875 +msgid "Saved" +msgstr "" + +#: search/booleanSearch.php:258 i18n/templates.c:7214 i18n/templates.c:8588 +msgid "Saved Search" +msgstr "" + +#: search/booleanSearch.php:259 +#, php-format +msgid "Saved Search: %s" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:52 i18n/templates.c:2375 +#: i18n/templates.c:2408 i18n/templates.c:8585 +msgid "Saved Searches" +msgstr "" + +#: search2/ajax/saveExpr.php:48 +msgid "Saved search ID is missing" +msgstr "" + +#: search2/ajax/saveExpr.php:52 +msgid "Saved search ID is not numeric" +msgstr "" + +#: i18n/templates.c:7019 +msgid "Saved search criteria are criteria that are particular to your location. For example, you could define criteria that returns all documents in a particular workflow state, or all documents which are considered \"common\" within your organisation (leave policy, newsletters, etc.) based on a category or fieldset value." +msgstr "" + +#: i18n/templates.c:6554 +msgid "Saved searches" +msgstr "" + +#: i18n/templates.c:6557 +msgid "Saved searches are searches which are particular to your location. For example, you could define a search which returns all documents in a particular workflow state, or all documents which are considered \"common\" within your organisation (leave policy, newsletters, etc.) based on a category or fieldset value." +msgstr "" + +#: i18n/templates.c:4874 +msgid "Saves a KnowledgeTree document currently open for viewing in Office as a new document in KnowledgeTree." +msgstr "" + +#: i18n/templates.c:4808 +msgid "Saves active document to a new folder. You must have 'write' permissions on the folder." +msgstr "" + +#: i18n/templates.c:4835 +msgid "Saves edited document properties to KnowledgeTree." +msgstr "" + +#: i18n/templates.c:4889 +msgid "Saves the document you downloaded from KnowledgeTree as a new document in KnowledgeTree." +msgstr "" + +#: i18n/templates.c:4838 +msgid "Saves your changes to KnowledgeTree and allows you to continue editing the document in Office." +msgstr "" + +#: i18n/templates.c:4844 +msgid "Saves your changes to KnowledgeTree and closes the document in Office." +msgstr "" + +#: i18n/templates.c:4643 +msgid "Saving Document (check-in)" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:323 +msgid "Saving metadata" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:776 +msgid "Scanning file" +msgstr "" + +#: plugins/search2/DocumentIndexAction.php:15 +#: plugins/search2/DocumentIndexAction.php:36 +#: plugins/search2/FolderIndexAction.php:15 +#: plugins/search2/FolderIndexAction.php:30 +msgid "Schedule Indexing" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerDashlet.php:48 +msgid "Scheduler" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerUtil.php:109 +#: plugins/ktcore/scheduler/schedulerUtil.php:136 +msgid "Scheduler object can't be created" +msgstr "" + +#: i18n/templates.c:290 +msgid "Schema guide" +msgstr "" + +#: i18n/templates.c:275 +msgid "Scheme" +msgstr "" + +#: search2/indexing/extractors/ScriptExtractor.inc.php:44 +msgid "Script Extractor" +msgstr "" + +#: lib/templating/kt3template.inc.php:318 plugins/ktcore/KTCorePlugin.php:155 +#: plugins/ktcore/KTPortlets.php:45 plugins/search2/Search2Portlet.php:8 +#: search/booleanSearch.php:238 i18n/templates.c:1622 i18n/templates.c:2849 +#: i18n/templates.c:2894 i18n/templates.c:2939 i18n/templates.c:4685 +#: i18n/templates.c:6821 i18n/templates.c:6854 +msgid "Search" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:58 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:170 +msgid "Search Attributes" +msgstr "" + +#: i18n/templates.c:7196 i18n/templates.c:7199 +msgid "Search Criteria" +msgstr "" + +#: i18n/templates.c:1565 i18n/templates.c:6764 i18n/templates.c:6824 +#: i18n/templates.c:7028 i18n/templates.c:7190 i18n/templates.c:7202 +#: i18n/templates.c:7247 +msgid "Search Criteria Editor" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:96 +msgid "Search Deleted" +msgstr "" + +#: i18n/templates.c:6419 +msgid "Search For Users" +msgstr "" + +#: i18n/templates.c:6569 +msgid "Search Name" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:165 +msgid "Search Password" +msgstr "" + +#: plugins/tagcloud/TagCloudRedirectPage.php:122 search/booleanSearch.php:252 +#: search2.php:390 search2.php:391 search2.php:470 search2.php:471 +#: i18n/templates.c:7241 +msgid "Search Results" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:164 +msgid "Search User" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:253 plugins/ktcore/KTCorePlugin.php:358 +msgid "Search and Indexing" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:254 +#: plugins/ktcore/admin/configSettings.php:364 +#: plugins/ktcore/admin/configSettings.php:368 +msgid "Search and Indexing Settings" +msgstr "" + +#: i18n/templates.c:2435 +msgid "Search engine format" +msgstr "" + +#: i18n/templates.c:4991 +msgid "Search for documents" +msgstr "" + +#: i18n/templates.c:8498 +msgid "Search for group" +msgstr "" + +#: i18n/templates.c:6158 +msgid "Search for groups" +msgstr "" + +#: i18n/templates.c:8519 +msgid "Search for user" +msgstr "" + +#: i18n/templates.c:701 i18n/templates.c:809 i18n/templates.c:6413 +msgid "Search for users" +msgstr "" + +#: ktwebservice/webservice.php:4275 +msgid "Search has not been implemented for this version of KnowledgeTree" +msgstr "" + +#: plugins/search2/openSearchDescription.php:15 +msgid "Search metadata and content on KnowledgeTree" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:88 +msgid "Search not deleted" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:206 +#: plugins/ktcore/admin/conditions.php:255 +#: plugins/ktcore/admin/savedSearch.php:188 +#: plugins/ktcore/admin/savedSearch.php:224 search/booleanSearch.php:167 +msgid "Search not saved" +msgstr "" + +#: i18n/templates.c:7253 +msgid "Search results found: #count#" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:190 +#: plugins/ktcore/admin/savedSearch.php:226 search/booleanSearch.php:171 +msgid "Search saved" +msgstr "" + +#: search2/ajax/ajax.inc.php:168 +msgid "Search with this name already exists" +msgstr "" + +#: i18n/templates.c:2399 +msgid "Searches will now only search metadata" +msgstr "" + +#: i18n/templates.c:2396 +msgid "Searches will now search both content and metadata" +msgstr "" + +#: i18n/templates.c:4682 +msgid "Searching..." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:374 plugins/ktcore/admin/workflowsv2.php:76 +#: plugins/ktcore/admin/workflowsv2.php:1233 i18n/templates.c:7523 +msgid "Security" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:245 +msgid "Security Management" +msgstr "" + +#: i18n/templates.c:7694 +msgid "Security Overview: #name#" +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:378 +#: plugins/ktcore/admin/configSettings.php:382 +msgid "Security Settings" +msgstr "" + +#: search2/indexing/extractors/PDFExtractor.inc.php:70 +msgid "Security properties on the PDF document prevent text from being extracted." +msgstr "" + +#: i18n/templates.c:7292 +msgid "Select All" +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:50 +#: plugins/ktcore/KTDocumentActions.php:236 i18n/templates.c:338 +#: i18n/templates.c:3449 +msgid "Select Document Version to compare against" +msgstr "" + +#: i18n/templates.c:1760 +msgid "Select External RSS Feed" +msgstr "" + +#: i18n/templates.c:5639 +msgid "Select Fieldset" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:298 +msgid "Select Master Field" +msgstr "" + +#: i18n/templates.c:698 i18n/templates.c:806 +msgid "Select User" +msgstr "" + +#: i18n/templates.c:5930 +msgid "Select View" +msgstr "" + +#: i18n/templates.c:1874 +msgid "Select a Field" +msgstr "" + +#: i18n/templates.c:1880 +msgid "Select a Value" +msgstr "" + +#: i18n/templates.c:5507 i18n/templates.c:5522 +msgid "Select a behaviour" +msgstr "" + +#: i18n/templates.c:5519 +msgid "Select a behaviour from this list to change the items which are available." +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:86 +msgid "Select a column to add to the view. Please note that while you can add multiple copies of a column, they will all behave as a single column" +msgstr "" + +#: i18n/templates.c:4331 +msgid "Select a document or folder to make a shortcut to." +msgstr "" + +#: i18n/templates.c:1886 i18n/templates.c:4961 +msgid "Select a document type" +msgstr "" + +#: i18n/templates.c:1241 i18n/templates.c:3746 +msgid "Select a document type from the list below to change its details, or use the enable/disable buttons to change its availability state." +msgstr "" + +#: i18n/templates.c:1610 i18n/templates.c:6809 +msgid "Select a fieldset" +msgstr "" + +#: i18n/templates.c:8465 +msgid "Select a link type." +msgstr "" + +#: i18n/templates.c:8435 +msgid "Select a target document to link to." +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:95 +msgid "Select a value" +msgstr "" + +#: i18n/templates.c:1613 i18n/templates.c:6812 +msgid "Select a workflow" +msgstr "" + +#: i18n/templates.c:7577 i18n/templates.c:8096 +msgid "Select a workflow to modify. To enable a disabled workflow, edit it and set a proper starting state." +msgstr "" + +#: i18n/templates.c:8624 +msgid "Select appropriate workflow" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:78 +msgid "Select different workflow" +msgstr "" + +#: i18n/templates.c:11 +msgid "Select document type for alert" +msgstr "" + +#: i18n/templates.c:1208 i18n/templates.c:3713 +msgid "Select document types allowed in folder" +msgstr "" + +#: i18n/templates.c:44 +msgid "Select members to be added to this alert" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:815 +msgid "Select other users or groups to include in this alert" +msgstr "" + +#: i18n/templates.c:4049 i18n/templates.c:7403 +msgid "Select roles and groups for whom you wish to change permission assignment from the box on the left, and move them over to the box on the right using the button with right-pointing arrows. You can then allocate or remove permissions from these entities and save by pressing the 'Update Permission Assignments' button'." +msgstr "" + +#: i18n/templates.c:1607 i18n/templates.c:6806 +msgid "Select some criteria" +msgstr "" + +#: i18n/templates.c:8129 +msgid "Select the actions you want this workflow to control from the list below. Actions you do not specify will be available no matter what the state of the document." +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:248 +#: plugins/ktcore/admin/documentTypes.php:173 +msgid "Select the fieldsets which you wish to associate with this document type" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:411 +msgid "Select the groups from the left-hand list that you would like to add to this group and then click the right pointing arrows. Once you have added all the groups that you require, press save changes. Only groups that are logically capable of being included in this group will be available to be added." +msgstr "" + +#: i18n/templates.c:4274 +msgid "Select the groups which should be part of this role." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:382 +msgid "Select the groups which this user should belong to from the left-hand list and then click the right pointing arrows. Once you have added all the groups that you require, press save changes." +msgstr "" + +#: i18n/templates.c:7634 +msgid "Select the permissions you want controlled by this state." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:271 +msgid "Select the state to move this discussion into" +msgstr "" + +#: i18n/templates.c:7994 +msgid "Select the target state of the transition, and select the permission, group, and/or role necessary to perform the transition. Selecting more than one of permission, group, or role will require that the user wishing to perform the transition fulfil every requirement." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:267 +msgid "Select the users which should be part of this group from the left-hand list and then click the right pointing arrows. Once you have added all the users that you require, press save changes." +msgstr "" + +#: i18n/templates.c:470 i18n/templates.c:554 i18n/templates.c:647 +#: i18n/templates.c:755 +msgid "Select what kind of report you'd like to view." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2264 +msgid "Select which users, groups and roles to be notified." +msgstr "" + +#: i18n/templates.c:4928 +msgid "Select..." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:142 +msgid "Selection" +msgstr "" + +#: i18n/templates.c:4907 +msgid "Send" +msgstr "" + +#: i18n/templates.c:4670 +msgid "Send Email" +msgstr "" + +#: i18n/templates.c:1700 +msgid "Send password link" +msgstr "" + +#: view.php:414 +msgid "Send request" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:810 +msgid "Sending subscriptions" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:161 +msgid "Server Port" +msgstr "" + +#: i18n/templates.c:4715 +msgid "Server Settings" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:160 +msgid "Server name" +msgstr "" + +#: plugins/commercial/alerts/KTDocTypeAlerts.php:292 +#: search2/ajax/ajax.inc.php:83 +msgid "Session has expired." +msgstr "" + +#: lib/session/Session.inc:280 lib/session/Session.inc:310 +#: thirdparty/pear/PEAR.php:880 +msgid "Session timed out" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:302 +msgid "Set Master Field" +msgstr "" + +#: i18n/templates.c:7961 +msgid "Set allowed actions" +msgstr "" + +#: i18n/templates.c:8132 +msgid "Set controlled actions" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1292 i18n/templates.c:7970 +msgid "Set controlled permissions" +msgstr "" + +#: i18n/templates.c:5597 +msgid "Set master field" +msgstr "" + +#: preferences.php:124 +msgid "Set password" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:789 +msgid "Set role groups" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:734 +msgid "Set role users" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:453 +msgid "Set to complete" +msgstr "" + +#: lib/ktentity.inc:301 +msgid "Setting a non-existent field: " +msgstr "" + +#: i18n/templates.c:7064 +msgid "Share" +msgstr "" + +#: i18n/templates.c:7049 +msgid "Share With All" +msgstr "" + +#: i18n/templates.c:7073 i18n/templates.c:7079 +msgid "Shared" +msgstr "" + +#: lib/actions/bulkaction.php:169 lib/actions/bulkaction.php:366 +#: lib/actions/bulkaction.php:397 +msgid "Shortcut" +msgstr "" + +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:192 +msgid "Shortcut added" +msgstr "" + +#: plugins/commercial/shortcuts/ShortcutsPlugin.php:40 +msgid "Shortcuts" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:129 +#: plugins/ktcore/admin/groupManagement.php:561 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:551 +msgid "Should all the members of this group be given system administration privileges?" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:128 +#: plugins/ktcore/admin/groupManagement.php:593 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:550 +msgid "Should all the members of this group be given unit administration privileges?" +msgstr "" + +#: i18n/templates.c:980 i18n/templates.c:1070 i18n/templates.c:1106 +msgid "Show" +msgstr "" + +#: i18n/templates.c:497 i18n/templates.c:581 i18n/templates.c:674 +#: i18n/templates.c:782 +msgid "Show #max# of #total# transactions." +msgstr "" + +#: i18n/templates.c:56 i18n/templates.c:59 i18n/templates.c:1943 +#: i18n/templates.c:4061 i18n/templates.c:4433 i18n/templates.c:7295 +#: i18n/templates.c:7298 i18n/templates.c:7415 +msgid "Show All" +msgstr "" + +#: i18n/templates.c:485 i18n/templates.c:569 i18n/templates.c:662 +#: i18n/templates.c:770 +msgid "Show Items" +msgstr "" + +#: i18n/templates.c:953 i18n/templates.c:1043 +msgid "Show all users" +msgstr "" + +#: i18n/templates.c:3590 +msgid "Show deleted versions" +msgstr "" + +#: i18n/templates.c:1094 +msgid "Show login activity between" +msgstr "" + +#: i18n/templates.c:1079 +msgid "Show login activity for the last" +msgstr "" + +#: i18n/templates.c:956 i18n/templates.c:1046 +msgid "Show users that" +msgstr "" + +#: plugins/ktcore/KTMiscPages.php:80 +#, php-format +msgid "Showing Notifications %d - %d of %d" +msgstr "" + +#: i18n/templates.c:3062 +msgid "Showing first #visible# of #count# notifications." +msgstr "" + +#: search2/indexing/bin/shutdown.php:51 +msgid "Shutdown the Document Indexer" +msgstr "" + +#: plugins/commercial/electronic-signatures/Esignature.inc.php:312 +msgid "Signature could not be created. Please consult your System Administration for more information." +msgstr "" + +#: search/simpleSearch.php:142 +msgid "Simple Search" +msgstr "" + +#: i18n/templates.c:8495 +msgid "Since there may be many groups in the system, please provide a few letters from the groups's name to begin." +msgstr "" + +#: i18n/templates.c:6161 +msgid "Since there may be many groups in the system, please type a few letters from the group's name to begin. Alternatively, view all groups (note that this action may take some time if you have many groups)." +msgstr "" + +#: i18n/templates.c:8516 +msgid "Since there may be many users in the system, please provide a few letters from the person's user name to begin." +msgstr "" + +#: i18n/templates.c:704 i18n/templates.c:812 +msgid "Since there may be many users in the system, please select a group from the list below, or type a few letters from the person's username to begin." +msgstr "" + +#: i18n/templates.c:6416 +msgid "Since there may be many users in the system, please select a group from the list below, or type a few letters from the person's username to begin. Alternatively, view all users (note that this may be very slow if you have many users)." +msgstr "" + +#: i18n/templates.c:1112 +msgid "Since there may be many users in the system, please select a user from the list below, or type a few letters from the person's username to begin. Alternatively, view all users (note that this may be very slow if you have many users)." +msgstr "" + +#: plugins/ktcore/KTDashlets.php:90 +msgid "Since you are a system administrator, you can see this message. Please click \"edit\" below here to create some welcome content, since there is no welcome content available in your language." +msgstr "" + +#: plugins/ktcore/KTColumns.inc.php:449 plugins/ktcore/KTCorePlugin.php:143 +msgid "Single Selection" +msgstr "" + +#: i18n/templates.c:1313 +msgid "Size" +msgstr "" + +#: plugins/housekeeper/HouseKeeper.inc.php:191 +msgid "Smarty Cache" +msgstr "" + +#: i18n/templates.c:4949 +msgid "Some fields are required" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2592 +#, php-format +msgid "Some states cannot be reached from the initial state (%s): %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2582 +#, php-format +msgid "Some transitions have no source states: %s" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:79 +#: plugins/multiselect/inetbasic.inc.php:95 +msgid "Something very unexpected happened." +msgstr "" + +#: i18n/templates.c:7838 +msgid "Source States" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:215 +msgid "Source created" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:353 +msgid "Source document not specified" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:675 +msgid "Source folder not specified" +msgstr "" + +#: i18n/templates.c:1337 +msgid "Space Used" +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:342 +msgid "Specified output encoding for the zip files compression does not exists !" +msgstr "" + +#: i18n/templates.c:8126 +msgid "Specify Controlled Actions" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:277 +#: plugins/multiselect/addDocument.php:325 +msgid "Specify Metadata" +msgstr "" + +#: i18n/templates.c:4010 +msgid "Specify Reason for Delete" +msgstr "" + +#: i18n/templates.c:446 i18n/templates.c:530 i18n/templates.c:623 +#: i18n/templates.c:731 +msgid "Specify Search Details" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:82 +#: plugins/ktcore/admin/userManagement.php:160 +#: plugins/ktcore/admin/userManagement.php:269 +msgid "Specify an initial password for the user." +msgstr "" + +#: i18n/templates.c:6011 +msgid "Specify group details" +msgstr "" + +#: i18n/templates.c:7631 +msgid "Specify permissions" +msgstr "" + +#: i18n/templates.c:3317 +msgid "Specify the details for a new link type below." +msgstr "" + +#: i18n/templates.c:3326 +msgid "Specify the details for the link type below." +msgstr "" + +#: i18n/templates.c:8264 +msgid "Specify the folder to which the document must be moved." +msgstr "" + +#: i18n/templates.c:488 i18n/templates.c:572 i18n/templates.c:665 +#: i18n/templates.c:773 +msgid "Specify the maximum items to show, or leave it at zero or blank to show all transactions matching your report" +msgstr "" + +#: i18n/templates.c:6029 +msgid "Specify unit details" +msgstr "" + +#: i18n/templates.c:8240 +msgid "Specify which condition the document must fulfill before this transition becomes available." +msgstr "" + +#: i18n/templates.c:8252 +msgid "Specify which group the user will require in order to perform this transition." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:268 +msgid "Specify which organisational units are available within the repository." +msgstr "" + +#: i18n/templates.c:8276 +msgid "Specify which permissions the user will require in order to perform this transition. Note that the user will be required to have all these permissions." +msgstr "" + +#: i18n/templates.c:8288 +msgid "Specify which role the user will require in order to perform this transition." +msgstr "" + +#: preferences.php:132 +msgid "Specify your new password." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1942 +msgid "Specify your reason for performing this action." +msgstr "" + +#: i18n/templates.c:2792 +msgid "Standard configuration" +msgstr "" + +#: search2/indexing/extractors/StarOfficeExtractor.inc.php:69 +msgid "StarOffice Text Extractor" +msgstr "" + +#: i18n/templates.c:4877 +msgid "Start Editing" +msgstr "" + +#: i18n/templates.c:7886 +msgid "Start Workflow" +msgstr "" + +#: i18n/templates.c:7877 +msgid "Start workflow on document" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:468 +msgid "Starting State" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:271 i18n/templates.c:7370 +#: i18n/templates.c:7391 i18n/templates.c:7607 i18n/templates.c:7865 +#: i18n/templates.c:7901 i18n/templates.c:8060 i18n/templates.c:8168 +#: i18n/templates.c:8315 +msgid "State" +msgstr "" + +#: i18n/templates.c:7517 +msgid "State Effects" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:959 i18n/templates.c:7451 +msgid "State Name" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1227 +msgid "State deleted." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1032 +msgid "State updated." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:84 i18n/templates.c:7442 +#: i18n/templates.c:7667 +msgid "States" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:75 +#: plugins/ktcore/admin/workflowsv2.php:544 +msgid "States and Transitions" +msgstr "" + +#: i18n/templates.c:7427 i18n/templates.c:7490 +msgid "States and Transitions: #name#" +msgstr "" + +#: i18n/templates.c:7664 +msgid "States which control permissions have a tick in the \"Control\" column. Permissions which are not controlled by a state (e.g. which are controlled by the folder a document is in) are marked with a dash (—). Controlled permissions are marked with a tick. Click on the state name to specify how it controls permissions." +msgstr "" + +#: i18n/templates.c:2951 i18n/templates.c:2960 i18n/templates.c:6902 +#: i18n/templates.c:7583 i18n/templates.c:8102 +msgid "Status" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:607 +#: plugins/multiselect/inetbasic.inc.php:831 +msgid "Status Toggled" +msgstr "" + +#: ktoffice/controllers/list.php:368 +msgid "Status: Available" +msgstr "" + +#: ktoffice/controllers/list.php:364 +msgid "Status: Checked out by" +msgstr "" + +#: ktoffice/controllers/list.php:360 +msgid "Status: Immutable" +msgstr "" + +#: i18n/templates.c:7637 +msgid "Step 1: Basic Workflow Details" +msgstr "" + +#: i18n/templates.c:7640 +msgid "Step 2: Connect transitions to states" +msgstr "" + +#: i18n/templates.c:5360 +msgid "Sticky" +msgstr "" + +#: plugins/housekeeper/DiskUsageDashlet.inc.php:45 +msgid "Storage Utilization" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:307 +msgid "Storing contents" +msgstr "" + +#: i18n/templates.c:6185 +msgid "Subgroups" +msgstr "" + +#: plugins/ktcore/KTAssist.php:58 plugins/ktstandard/KTDiscussion.php:137 +#: plugins/ktstandard/KTDiscussion.php:262 i18n/templates.c:2705 +#: i18n/templates.c:8300 +msgid "Subject" +msgstr "" + +#: lib/widgets/forms.inc.php:112 +msgid "Submit" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:211 +msgid "Subscribe to document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:444 +msgid "Subscribe to folder" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:454 +msgid "Subscribe to folder and
subfolders" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:566 +msgid "Subscription Management" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:57 +msgid "Subscription Plugin" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:721 +msgid "Subscription notification" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:805 +msgid "Subscription notification for" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:110 i18n/templates.c:8597 +msgid "Subscriptions" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:617 +msgid "Subscriptions removed" +msgstr "" + +#: lib/actions/bulkaction.php:376 lib/actions/bulkaction.php:407 +msgid "Success" +msgstr "" + +#: plugins/ktcore/admin/documentCheckout.php:130 +#, php-format +msgid "Successfully forced \"%s\" to be checked in." +msgstr "" + +#: i18n/templates.c:7301 +msgid "Support and System Information" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:385 plugins/ktcore/admin/techsupport.php:50 +msgid "Support and System information" +msgstr "" + +#: i18n/templates.c:6242 +msgid "Synchronise Users in #name#" +msgstr "" + +#: i18n/templates.c:5267 i18n/templates.c:5858 +msgid "System" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:129 +#: plugins/ktcore/admin/groupManagement.php:560 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:551 +msgid "System Administrators" +msgstr "" + +#: plugins/housekeeper/HouseKeeper.inc.php:197 +msgid "System Cache" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:255 +msgid "System Configuration" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:256 +msgid "System Configuration Settings" +msgstr "" + +#: plugins/housekeeper/FolderUsageDashlet.inc.php:45 +msgid "System Folder Utilization" +msgstr "" + +#: i18n/templates.c:7334 +msgid "System Information (Disk Usage, Process List, if easily detectable)" +msgstr "" + +#: plugins/housekeeper/HouseKeeper.inc.php:203 +msgid "System Logs" +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:53 +msgid "System Name" +msgstr "" + +#: plugins/housekeeper/HouseKeeper.inc.php:219 +msgid "System Temporary Folder" +msgstr "" + +#: i18n/templates.c:146 +msgid "System alert" +msgstr "" + +#: plugins/commercial/electronic-signatures/Esignature.inc.php:157 +#, php-format +msgid "System locked. You have exceeded the number of allowed authentication attempts. No further write actions will be allowed until you have logged back into %s." +msgstr "" + +#: lib/util/ktutil.inc:264 +msgid "TB" +msgstr "" + +#: plugins/ktcore/KTPortlets.php:105 search2/search/fields/TagField.inc.php:44 +msgid "Tag" +msgstr "" + +#: lib/browse/Criteria.inc:951 plugins/tagcloud/TagCloudDashlet.php:55 +#: plugins/tagcloud/TagCloudPlugin.php:110 +#: plugins/tagcloud/TagCloudPortlet.php:55 +msgid "Tag Cloud" +msgstr "" + +#: plugins/tagcloud/TagCloudPlugin.php:62 +msgid "Tag Cloud Plugin" +msgstr "" + +#: plugins/tagcloud/TagCloudRedirectPage.php:101 +msgid "Tag Cloud Search" +msgstr "" + +#: i18n/templates.c:3137 +msgid "Take the crash course." +msgstr "" + +#: i18n/templates.c:899 i18n/templates.c:8366 +msgid "Target" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:352 plugins/ktcore/KTBulkActions.php:611 +#: plugins/ktcore/KTDocumentActions.php:1199 +#: plugins/ktcore/KTDocumentActions.php:1435 +#: plugins/ktcore/admin/unitManagement.php:128 +msgid "Target Folder" +msgstr "" + +#: i18n/templates.c:2078 +msgid "Target document archived by:" +msgstr "" + +#: i18n/templates.c:2084 +msgid "Target document deleted by:" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:361 +#: lib/foldermanagement/folderutil.inc.php:683 +msgid "Target folder not specified" +msgstr "" + +#: plugins/ktcore/scheduler/taskScheduler.php:66 +msgid "Task" +msgstr "" + +#: plugins/ktcore/scheduler/taskScheduler.php:50 +#: plugins/ktcore/scheduler/taskScheduler.php:51 i18n/templates.c:6485 +msgid "Task Scheduler Management" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerUtil.php:278 +#: plugins/ktcore/scheduler/schedulerUtil.php:289 +msgid "Tasks can't be retrieved" +msgstr "" + +#: plugins/housekeeper/HouseKeeper.inc.php:211 +msgid "Temporary Folder" +msgstr "" + +#: search/booleanSearch.php:255 +msgid "Test Condition" +msgstr "" + +#: search/booleanSearch.php:256 +#, php-format +msgid "Test Condition: %s" +msgstr "" + +#: i18n/templates.c:5444 +msgid "Test Instance" +msgstr "" + +#: i18n/templates.c:3842 i18n/templates.c:3890 +msgid "Test conditions" +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:114 +msgid "That column is not for the specified view" +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:110 +msgid "That column is required" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:329 +#: plugins/multiselect/inetbasic.inc.php:495 +msgid "That name is already in use in this fieldset. Please specify a unique name." +msgstr "" + +#: i18n/templates.c:1568 i18n/templates.c:6767 +msgid "The #options# may also be used to create more complex search criteria expressions." +msgstr "" + +#: i18n/templates.c:6833 +msgid "The #options# may also be used to perform searches." +msgstr "" + +#: search2/indexing/indexers/PHPLuceneIndexer.inc.php:286 +#, php-format +msgid "The %s has not been initialised correctly. Please review the documentation on how to setup the indexing." +msgstr "" + +#: i18n/templates.c:419 +msgid "The DMS tracks a large amount of activity by users. Use these reports to get better information on who's doing what on the system. Note that transactions are only shown for documents you are allowed to view." +msgstr "" + +#: search2/indexing/indexers/JavaXMLRPCLuceneIndexer.inc.php:211 +msgid "The Document Indexer did not respond correctly. Your search results will not include content results. Please notify the system administrator to investigate why the Document Indexer is not running." +msgstr "" + +#: search2/indexing/extractors/ExifExtractor.inc.php:86 +msgid "The Exif extractor requires the module exif php extension. Please include this in the php.ini." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:170 +msgid "The LDAP attributes to use to search for users when given their name (one per line, examples: cn, mail)" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:171 +msgid "The LDAP object classes to search for users (one per line, example: user, inetOrgPerson, posixAccount)" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:54 +msgid "The LDAP server port" +msgstr "" + +#: view.php:464 +msgid "The System Administrators have been notified of your request." +msgstr "" + +#: i18n/templates.c:2993 +msgid "The action can be performed on the entire selection." +msgstr "" + +#: i18n/templates.c:2996 +msgid "The action cannot be performed on any of the selected entities." +msgstr "" + +#: i18n/templates.c:2984 +msgid "The action will be performed on the following documents and folders" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:175 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:188 +#, php-format +msgid "The alert could not be added: %s" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:635 +#: plugins/commercial/alerts/alerts.php:650 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:273 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:288 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:300 +#, php-format +msgid "The alert could not be deleted: %s" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:698 +#: plugins/commercial/alerts/alerts.php:711 +#, php-format +msgid "The alert could not be saved: %s" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:231 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:244 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:328 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:356 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:384 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:412 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:440 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:468 +#, php-format +msgid "The alert could not be updated: %s" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:178 +msgid "The alert has been added" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:638 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:276 +msgid "The alert has been deleted" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:729 +#, php-format +msgid "The alert has been saved for the date: %s" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:234 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:331 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:359 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:387 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:415 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:443 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:471 +msgid "The alert has been udated" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:1225 +#, php-format +msgid "The alerts on this document could not be deleted: %s" +msgstr "" + +#: ktapi/KTAPISession.inc.php:500 +msgid "The anonymous user could not be found." +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:548 +msgid "The archive cannot be created. An error occurred in the encoding." +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:580 +msgid "The archive could not be created." +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:80 +#: plugins/multiselect/BulkUpload.php:181 +msgid "The archive file containing the documents you wish to add to the document management system." +msgstr "" + +#: view.php:288 +#, php-format +msgid "The base document you attempted to retrieve is invalid. Please browse for one." +msgstr "" + +#: ktapi/ktapi.inc.php:1344 +#, php-format +msgid "The bulk action failed: %s" +msgstr "" + +#: ktapi/ktapi.inc.php:1279 +#, php-format +msgid "The bulk action to perform must be a string. Received: %s" +msgstr "" + +#: i18n/templates.c:3977 +msgid "The bulk import facility allows for a number of documents to be added to the document management system easily. Provide a path on the server, and all documents and folders within that path will be added to the document management system." +msgstr "" + +#: plugins/multiselect/BulkImport.php:137 +msgid "The bulk import facility allows for a number of documents to be added to the document management system easily. Provide a path on the server, and all documents and folders within that path will be added to the document management system." +msgstr "" + +#: plugins/multiselect/BulkUpload.php:162 i18n/templates.c:3995 +msgid "The bulk upload facility allows for a number of documents to be added to the document management system. Provide an archive (ZIP) file from your local computer, and all documents and folders within that archive will be added to the document management system." +msgstr "" + +#: i18n/templates.c:4604 +msgid "The check-out has been cancelled." +msgstr "" + +#: i18n/templates.c:4598 +msgid "The check-out has not been cancelled." +msgstr "" + +#: i18n/templates.c:5900 +msgid "The columns included in this view are displayed below. To add additional columns into the view, use the form below the list. To remove items, click on the \"delete\" icon next to the column name. Note that some columns may be required in a given view. Also, while you can have multiple copies of a given column in a specific view this is not recommended." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:430 +msgid "The condition required for this trigger has been deleted, so it is always available." +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:98 +#, php-format +msgid "The configuration settings could not be retrieved: %s" +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:233 +msgid "The configuration settings have been updated." +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:127 +#: plugins/multiselect/addDocument.php:153 +msgid "The contents of the document to be added to the document management system." +msgstr "" + +#: i18n/templates.c:7430 +msgid "The core of a workflow is the process that documents in that workflow follow. These processes are made up of states (which documents are in, e.g. \"reviewed\" or \"published\") and transitions which documents follow (e.g. \"submit for review\" or \"publish\")." +msgstr "" + +#: plugins/ktcore/document/Rename.php:86 +msgid "The current file name is shown below:" +msgstr "" + +#: i18n/templates.c:8363 +msgid "The current links to and from this document are displayed below." +msgstr "" + +#: i18n/templates.c:1967 +msgid "The data for this conditional metadata fieldset was not completely provided. Provide the extra information, and save your changes afterwards." +msgstr "" + +#: plugins/ktcore/KTValidators.php:583 +#, php-format +msgid "The date entered must be in the format \"%s\"." +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:136 +#, php-format +msgid "The default value is %s" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:577 +#: lib/subscriptions/subscriptions.inc.php:578 +#: lib/subscriptions/subscriptions.inc.php:579 +#: lib/subscriptions/subscriptions.inc.php:580 +#: lib/subscriptions/subscriptions.inc.php:581 +#: lib/subscriptions/subscriptions.inc.php:582 +#: lib/subscriptions/subscriptions.inc.php:583 +#: lib/subscriptions/subscriptions.inc.php:584 +#: lib/subscriptions/subscriptions.inc.php:585 +#: lib/subscriptions/subscriptions.inc.php:586 +#: lib/subscriptions/subscriptions.inc.php:587 +msgid "The document \"" +msgstr "" + +#: i18n/templates.c:2126 i18n/templates.c:2198 +msgid "The document \"#object_name#\"" +msgstr "" + +#: i18n/templates.c:2225 +msgid "The document \"#object_name#\" has been changed" +msgstr "" + +#: i18n/templates.c:2141 +msgid "The document \"#object_name#\" has been checked in" +msgstr "" + +#: i18n/templates.c:2162 +msgid "The document \"#object_name#\" has been checked out" +msgstr "" + +#: i18n/templates.c:2243 +msgid "The document \"#object_name#\" has been moved" +msgstr "" + +#: i18n/templates.c:2264 +msgid "The document \"#object_name#\" has been removed" +msgstr "" + +#: i18n/templates.c:2333 +msgid "The document \"#object_name#\" has been restored by an administrator." +msgstr "" + +#: i18n/templates.c:2309 +msgid "The document \"#object_name#\" to which you were subscribed, has been removed" +msgstr "" + +#: i18n/templates.c:2087 +msgid "The document \"#object_name#\" was added" +msgstr "" + +#: i18n/templates.c:8222 +msgid "The document #name# has changed to state #state#, and you are specified as one of the users to inform about documents in this state." +msgstr "" + +#: plugins/commercial/guidInserter/GuidInserter.php:482 +msgid "The document backup could not be restored. Check that the backup exists and that the document can be overwritten." +msgstr "" + +#: plugins/commercial/guidInserter/GuidInserter.php:480 +msgid "The document has been restored." +msgstr "" + +#: plugins/ktcore/KTAssist.php:263 +msgid "The document has been successfully restored." +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:281 +msgid "The document is an MS Office 2007 format. This may not be supported by your version of OpenOffice. Please contact your System Administrator for assistance" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1000 +#, php-format +msgid "The document is checked out and cannot be deleted: %s" +msgstr "" + +#: i18n/templates.c:3665 +msgid "The document is currently in state \"#name#\"" +msgstr "" + +#: plugins/ktcore/document/edit.php:348 +#, php-format +msgid "The document is currently of type \"%s\"." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:432 +#, php-format +msgid "The document must match condition \"%s\"." +msgstr "" + +#: i18n/templates.c:404 +msgid "The document processing engine inserts a GUID, Global Unique Identifier, into the metadata of the document. In certain cases this may cause the document to become corrupt. A backup of the current version of the document is created and can be restored here." +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:373 +#: plugins/ktcore/document/edit.php:104 +#: plugins/ktcore/folder/addDocument.php:134 +#: plugins/multiselect/addDocument.php:160 +#, php-format +msgid "The document title is used as the main name of a document throughout %s." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:601 +#, php-format +msgid "The document will be copied to folder \"%s\"." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:603 +#, php-format +msgid "The document will be moved to folder \"%s\"." +msgstr "" + +#: view.php:117 +#, php-format +msgid "The document you attempted to retrieve is invalid. Please browse for one." +msgstr "" + +#: plugins/commercial/network/gotodocumentid/GoToDocumentIdPlugin.php:104 +msgid "The document you requested does not exist." +msgstr "" + +#: view.php:176 view.php:332 +msgid "The document you requested has an invalid document type. Unfortunately, this means that we cannot effectively display it." +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:42 +#: plugins/ktcore/KTDocumentActions.php:228 +msgid "The document you selected was invalid" +msgstr "" + +#: plugins/ktcore/admin/documentCheckout.php:79 +#: plugins/ktcore/admin/documentCheckout.php:110 +msgid "The document you specified appears to be invalid." +msgstr "" + +#: i18n/templates.c:2552 +msgid "The document you wish to check out will begin to download soon. If it does not automatically start to download, you can use this link to start it yourself." +msgstr "" + +#: plugins/pdfConverter/pdfConverter.php:104 +#, php-format +msgid "The document, id: %s, could not be converted to pdf format. The following error occurred: \"%s\"." +msgstr "" + +#: plugins/pdfConverter/pdfConverter.php:86 +#, php-format +msgid "The document, id: %s, does not exist at the given storage path: %s" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:158 +#: plugins/ktcore/admin/userManagement.php:223 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:298 +msgid "The email address of the user. Notifications and alerts are mailed to this address if email notifications is set below. e.g. jsmith@acme.com" +msgstr "" + +#: i18n/templates.c:6836 +msgid "The expression parsed successfully." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:370 +msgid "The file you requested is not available - please contact the system administrator if this is incorrect." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:775 +#, php-format +msgid "The file you uploaded was not called \"%s\". If you wish to change the filename, please set \"Force Original Filename\" below to false. " +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:773 +#, php-format +msgid "The file you uploaded was not called \"%s\". The file must have the same name as the original file." +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:574 +#: lib/subscriptions/subscriptions.inc.php:575 +#: lib/subscriptions/subscriptions.inc.php:576 +msgid "The folder \"" +msgstr "" + +#: i18n/templates.c:2288 +msgid "The folder \"#object_name#\" has been removed" +msgstr "" + +#: i18n/templates.c:2321 +msgid "The folder \"#object_name#\" to which you were subscribed, has been removed" +msgstr "" + +#: i18n/templates.c:2108 +msgid "The folder \"#object_name#\" was added" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:95 +#, php-format +msgid "The folder %s already exists." +msgstr "" + +#: lib/import/bulkimport.inc.php:116 +#, php-format +msgid "The folder %s is already present in %s. Adding files into pre-existing folder." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1102 +msgid "The folder contains no documents to archive." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:464 +#: plugins/ktcore/KTWorkflowTriggers.inc.php:478 +msgid "The folder to which this document should be copied does not exist. Cancelling the transition - please contact a system administrator." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:466 +#: plugins/ktcore/KTWorkflowTriggers.inc.php:480 +msgid "The folder to which this document should be moved does not exist. Cancelling the transition - please contact a system administrator." +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:145 +msgid "The following are the types of conversions you can perform on this document." +msgstr "" + +#: i18n/templates.c:1898 i18n/templates.c:3533 +msgid "The following document metadata is available for editing." +msgstr "" + +#: i18n/templates.c:3479 +msgid "The following document version has been selected for deletion:" +msgstr "" + +#: i18n/templates.c:7310 +msgid "The following download action allows you to download a zip archive of information that may assist the #appname# team to diagnose problems on your system. This archive contains:" +msgstr "" + +#: bin/ajaxtasks/downloadTask.php:28 +msgid "The following errors occurred during the download" +msgstr "" + +#: i18n/templates.c:6929 +msgid "The following extractors are not available and may affect indexing of certain document types" +msgstr "" + +#: i18n/templates.c:6890 +msgid "The following fields may be used in search criteria:" +msgstr "" + +#: i18n/templates.c:3410 i18n/templates.c:3425 +msgid "The following files are present in the repository, but do not exist in the database." +msgstr "" + +#: i18n/templates.c:2963 +msgid "The following list shows documents and folders in your list which cannot be acted on by this bulk action" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:428 +#: plugins/multiselect/inetbasic.inc.php:615 +#, php-format +msgid "The following lookups you specified already exist, or are specified twice: %s" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:150 +#, php-format +msgid "The following permissions are required: %s" +msgstr "" + +#: i18n/templates.c:6896 +msgid "The following resources are used by KnowledgeTree and are impacting on the normal operations of the system:" +msgstr "" + +#: i18n/templates.c:6914 +msgid "The following service(s) are not functioning correctly and are impacting on the normal operations of the system" +msgstr "" + +#: i18n/templates.c:2075 +msgid "The following shortcut is no longer valid as the target document has been archived. Please note that it has been automatically removed from the repository:" +msgstr "" + +#: i18n/templates.c:2081 +msgid "The following shortcut is no longer valid as the target document has been deleted. Please note that it has been automatically removed from the repository:" +msgstr "" + +#: plugins/tagcloud/TagCloudPlugin.php:111 +msgid "The following tags are associated with your document" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:157 +#: plugins/ktcore/admin/userManagement.php:222 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:297 +msgid "The full name of the user. This is shown in reports and listings. e.g. John Smith" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:346 +msgid "The group required for this trigger has been deleted, so anyone can perform this action." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:512 +msgid "The group's name, or part thereof, to find the group that you wish to add" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:160 +msgid "The host name or IP address of the LDAP server" +msgstr "" + +#: i18n/templates.c:302 i18n/templates.c:1976 i18n/templates.c:2012 +msgid "The information in this section is stored by #appname# for every document." +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:383 +#, php-format +msgid "The information in this section is stored by %s for every document." +msgstr "" + +#: plugins/commercial/instaView/instaViewLinkAction.php:108 +msgid "The instaview flash document does not exist." +msgstr "" + +#: plugins/ktcore/admin/managePermissions.php:53 +msgid "The internal name used for the permission. This should never be changed." +msgstr "" + +#: i18n/templates.c:4019 +msgid "The items that you selected to delete." +msgstr "" + +#: i18n/templates.c:2600 i18n/templates.c:2618 +msgid "The items that you selected to move." +msgstr "" + +#: i18n/templates.c:3086 +msgid "The last time these tasks were performed was on #time#." +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:178 +msgid "The license has expired. Please contact sales@knowledgetree.com for a new license." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:440 +msgid "The list may be long and take some time to load if the search is not filtered and there are a number of users in the system." +msgstr "" + +#: ktapi/ktapi.inc.php:1269 +#, php-format +msgid "The list of id's must be an array of format array('documents' => array(1,2), 'folders' => array(2,3)). Received: %s" +msgstr "" + +#: ktapi/ktapi.inc.php:1680 ktapi/ktapi.inc.php:1685 +msgid "The list of members must be in the format: array('users' => array(1,2), 'groups' => array(2,4)).')" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:163 +msgid "The location in the LDAP directory to start searching from (CN=Users,DC=mycorp,DC=com)" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:548 +msgid "The location of the group within the LDAP directory." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:295 +msgid "The location of the user within the LDAP directory." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:118 +msgid "The location of this user in the LDAP tree" +msgstr "" + +#: search2/indexing/bin/recreateIndex.php:100 +msgid "The lucene index has been recreated." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:163 +#: plugins/ktcore/admin/userManagement.php:225 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:300 +msgid "The mobile phone number of the user. e.g. 999 9999 999" +msgstr "" + +#: plugins/ktcore/KTFolderActions.php:98 +msgid "The name for the new folder." +msgstr "" + +#: plugins/ktcore/KTValidators.php:510 +#, php-format +msgid "The name of the document selected is invalid. The following characters are not allowed: %s" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:118 +msgid "The name that you supplied did not end with the word 'Email'." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:549 +#, php-format +msgid "The name the group will enter to gain access to %s. e.g. accountants" +msgstr "" + +#: search/booleanSearch.php:325 +msgid "The name to save this search as" +msgstr "" + +#: plugins/ktcore/document/Rename.php:87 +msgid "The name to which the current file should be renamed." +msgstr "" + +#: plugins/ktcore/folder/Rename.php:65 +msgid "The name to which the current folder should be renamed." +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:167 +#, php-format +msgid "The new document type, %s was created" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:1211 +#, php-format +msgid "The notifications on this document could not be deleted: %s" +msgstr "" + +#: lib/documentmanagement/DocumentLink.inc:162 +#, php-format +msgid "The object does not exist. id = %s table = %s " +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:2035 +msgid "The owner of a document is usually the person with ultimate responsibility for its contents. It is initially set to the person who created the document, but can be changed to any other user." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:165 +msgid "The password for the user account in the LDAP directory that performs searches" +msgstr "" + +#: ktapi/KTAPISession.inc.php:375 +msgid "The password is empty." +msgstr "" + +#: ktapi/KTAPISession.inc.php:382 +msgid "The password is invalid." +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:128 +#: lib/authentication/builtinauthenticationprovider.inc.php:220 +#: plugins/ktcore/admin/userManagement.php:296 +#: plugins/ktcore/admin/userManagement.php:527 +#, php-format +msgid "The password must be at least %d characters long." +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:407 +#: plugins/passwordResetPlugin/loginResetDispatcher.php:481 +msgid "The password reset key has expired, please send a new request." +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:465 +msgid "The passwords do not match, please re-enter them." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:300 +#: plugins/ktcore/admin/userManagement.php:531 +msgid "The passwords you specified do not match." +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:78 +#: plugins/multiselect/BulkImport.php:156 +msgid "The path containing the documents to be added to the document management system." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:161 +msgid "The port of the LDAP server (default: 389)" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:585 +msgid "The process a document follows is controlled by the way that the transitions between states are setup. A document starts the workflow in the initial state, and then follows transitions between states. Which users can perform these transitions can be configured in the \"Security\" section." +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:305 +#, php-format +msgid "The quicklink to this document could not be deleted: %s" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:850 +msgid "The reason for archiving these documents and folders, for historical purposes." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:645 +msgid "The reason for copying these documents and folders, for historical purposes." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:389 +msgid "The reason for moving these documents and folders, for historical purposes." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:154 +msgid "The reason for the deletion of these documents and folders for historical purposes." +msgstr "" + +#: search2/indexing/bin/shutdown.php:84 +msgid "The request to shutdown has been sent to the server. It may take a few seconds." +msgstr "" + +#: i18n/templates.c:4751 +msgid "The requested action has not been implemented" +msgstr "" + +#: ktapi/ktapi.inc.php:1297 +#, php-format +msgid "The requested action has not been implemented: %s" +msgstr "" + +#: lib/help/help.inc.php:162 +msgid "The requested help language has no contents." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:257 +msgid "The role required for this trigger has been deleted, so anyone can perform this action." +msgstr "" + +#: search2.php:645 +msgid "The saved search can only be seen by you." +msgstr "" + +#: search2.php:367 +msgid "The saved search could not be resolved." +msgstr "" + +#: search2.php:354 search2.php:635 search2.php:669 +msgid "The saved search id was not passed correctly." +msgstr "" + +#: search2.php:650 +msgid "The saved search is now visible to all users." +msgstr "" + +#: search2.php:707 +msgid "The saved search was deleted successfully." +msgstr "" + +#: i18n/templates.c:6488 +msgid "The scheduler runs document indexing and various house keeping tasks, etc in the background." +msgstr "" + +#: i18n/templates.c:3083 +msgid "The scheduler takes care of managing and running tasks or batch jobs at regular intervals in the background. These tasks can be configured via the #link#." +msgstr "" + +#: i18n/templates.c:6827 +msgid "The search criteria editor allows you to utilise the full power of the search engine by allowing you to perform more complicated searches by using the free text criteria format." +msgstr "" + +#: i18n/templates.c:7211 +msgid "The search criteria has been saved." +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:248 +#, php-format +msgid "The setting %s could not be updated: %s" +msgstr "" + +#: search2.php:639 +msgid "The sharing option was not passed correctly." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:228 +msgid "The string is too long: the maximum length in characters is " +msgstr "" + +#: plugins/ktcore/admin/documentTypes.php:118 +msgid "The system default document type can not be disabled. You may, however, rename it." +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:476 +msgid "The system rejected your value for this field." +msgstr "" + +#: i18n/templates.c:8138 +msgid "The table below lists the actions you have specified as controlled by this workflow, and all the states within the workflow. From here you can assign those actions to the various states in this workflow. Checked items are available to users whose permissions would normally allow them when the document is in that state. Unchecked items are not available to any users." +msgstr "" + +#: i18n/templates.c:3095 +msgid "The tasks are scheduled to be run in #time#." +msgstr "" + +#: i18n/templates.c:3092 +msgid "The tasks were scheduled to be run #time# ago." +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:133 +msgid "The title of rss feed" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:87 +msgid "The title of the RSS feed" +msgstr "" + +#: i18n/templates.c:923 +msgid "The top downloads for the last 7 days. Only documents which you are allowed to see are listed." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:137 +#: plugins/ktstandard/KTDiscussion.php:262 +msgid "The topic of discussion in this thread" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1822 +msgid "The transition listed will cause the document to change from its current state to the listed destination state." +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:386 +msgid "The type of link you wish to use" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:67 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:93 +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:146 +msgid "The type of source (e.g. LDAP)" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:932 +msgid "The uploaded file does not exist." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:285 +msgid "The uploaded file is larger than the MAX_FILE_SIZE directive that was specified in the HTML form" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:284 +msgid "The uploaded file is larger than the PHP upload_max_filesize setting" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:286 +msgid "The uploaded file was not fully uploaded to the document management system" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:88 +msgid "The url of the RSS feed" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:135 +msgid "The url to the rss feed" +msgstr "" + +#: ktapi/KTAPISession.inc.php:370 +#, php-format +msgid "The user '%s' cound not be found." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:164 +msgid "The user account in the LDAP directory to perform searches in the LDAP directory as (such as CN=searchUser,CN=Users,DC=mycorp,DC=com or searchUser@mycorp.com)" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:348 +#, php-format +msgid "The user must be a member of the group \"%s\"." +msgstr "" + +#: i18n/templates.c:3299 +msgid "The user who checked this document out is no longer valid." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:259 +#, php-format +msgid "The user will require the %s role." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:437 +msgid "The user's name, or part thereof, to find the user that you wish to add" +msgstr "" + +#: ktapi/KTAPISession.inc.php:364 +msgid "The username is empty." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:156 +#: plugins/ktcore/admin/userManagement.php:221 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:296 +#, php-format +msgid "The username the user will enter to gain access to %s. e.g. jsmith" +msgstr "" + +#: i18n/templates.c:5555 i18n/templates.c:5624 +msgid "The value of the field" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:247 +#: plugins/ktcore/KTValidators.php:110 +#, php-format +msgid "The value you have entered is invalid. The following characters are not allowed: %s" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1907 i18n/templates.c:7874 +msgid "The workflow cannot be changed while the document is checked out." +msgstr "" + +#: lib/foldermanagement/compressionArchiveUtil.inc.php:295 +msgid "" +"The zip file has not been created, if you are downloading a large number of documents\n" +" or a large document then it may take a few minutes to finish." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:392 +msgid "There already is a shortcut to this document in the target folder." +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:713 +msgid "There already is a shortcut to this folder in the target folder." +msgstr "" + +#: i18n/templates.c:8318 +msgid "There are #closed# closed threads - use the \"View All\" option below to view them." +msgstr "" + +#: i18n/templates.c:7700 +msgid "There are 3 different ways in which workflows interact with the system's security" +msgstr "" + +#: i18n/templates.c:3032 +msgid "There are currently no active indexers registered. No content indexing will occur." +msgstr "" + +#: i18n/templates.c:6323 +msgid "There are currently no roles created within the system." +msgstr "" + +#: i18n/templates.c:7898 +msgid "There are no defined workflows which can be started on this document. An administrator can create workflows to map the lifecycle of a document. Contact your administrator to discuss workflows." +msgstr "" + +#: i18n/templates.c:7160 +msgid "There are no documents in the indexing queue." +msgstr "" + +#: i18n/templates.c:7109 +msgid "There are no extractors registered." +msgstr "" + +#: i18n/templates.c:7142 +msgid "There are no indexing issues." +msgstr "" + +#: i18n/templates.c:8402 +msgid "There are no links to or from this document." +msgstr "" + +#: i18n/templates.c:8321 +msgid "There are no open threads for this document." +msgstr "" + +#: i18n/templates.c:857 +msgid "There are no quicklinks." +msgstr "" + +#: i18n/templates.c:7244 +msgid "There are no search results matching your search criteria." +msgstr "" + +#: i18n/templates.c:893 +msgid "There are no system quicklinks." +msgstr "" + +#: i18n/templates.c:1835 i18n/templates.c:1838 +msgid "There are no tags defined or accessible." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:192 plugins/ktcore/KTBulkActions.php:962 +msgid "There are shortcuts linking to some of the documents or folders in your selection; continuing will automatically delete the shortcuts. Would you like to continue?" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1631 +msgid "There are shortcuts linking to this document; archiving the document automatically will delete them. Would you like to continue?" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1015 +msgid "There are shortcuts linking to this document; deleting the document will automatically delete them. Would you like to continue?" +msgstr "" + +#: search2/indexing/bin/diagnose.php:57 +msgid "There don't appear to be any problems." +msgstr "" + +#: i18n/templates.c:6848 +msgid "There has been a parsing problem. Please check the search expression." +msgstr "" + +#: i18n/templates.c:6845 i18n/templates.c:7232 +msgid "There is a problem communicating with the server." +msgstr "" + +#: search2/search/search.inc.php:673 +#, php-format +msgid "There is a problem parsing the expression '%s'" +msgstr "" + +#: i18n/templates.c:7229 +msgid "There is a problem saving the expression expression." +msgstr "" + +#: i18n/templates.c:6842 +msgid "There is a problem saving the expression." +msgstr "" + +#: i18n/templates.c:6839 +msgid "There is a problem with the expression." +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:179 +#: plugins/multiselect/InetdocumentFieldsv2.php:209 +msgid "There is already a fieldset with that name." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:657 +msgid "There is already a group with that name." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1015 +msgid "There is already a state with that name in this workflow." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1106 +msgid "There is already a transition with that name in this workflow." +msgstr "" + +#: i18n/templates.c:1133 +msgid "There is currently no license installed! Either you have yet to install your license or it has expired. A license is required to enable some of the functionality within the DMS." +msgstr "" + +#: lib/help/help.inc.php:253 lib/help/help.inc.php:257 +msgid "There is no help available in your language for this plugin" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:227 +msgid "There was a database error while trying to archive this file" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:182 +msgid "There was a problem checking out the document." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1050 +#: lib/documentmanagement/documentutil.inc.php:1555 +msgid "There was a problem deleting the document from storage." +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:1028 +msgid "There was a problem deleting the document from the database." +msgstr "" + +#: plugins/ktstandard/KTBulkExportPlugin.php:146 +msgid "There was a problem exporting the documents: " +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:232 +#: plugins/ktstandard/KTSubscriptions.php:250 +msgid "There was a problem subscribing you to this document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:485 +#: plugins/ktstandard/KTSubscriptions.php:502 +msgid "There was a problem subscribing you to this folder" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:285 +#: plugins/ktstandard/KTSubscriptions.php:303 +msgid "There was a problem unsubscribing you from this document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:537 +#: plugins/ktstandard/KTSubscriptions.php:554 +msgid "There was a problem unsubscribing you from this folder" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:171 +msgid "There was a problem with the subscription, please refresh the page and try again." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:190 +#: plugins/ktstandard/KTDiscussion.php:322 +msgid "There was an error adding the comment to the thread" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:181 +msgid "There was an error creating a new thread" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:211 +#: plugins/ktstandard/KTDiscussion.php:342 +#: plugins/ktstandard/KTDiscussion.php:423 +msgid "There was an error updating the thread with the new comment" +msgstr "" + +#: i18n/templates.c:1793 +msgid "These RSS feeds will be viewable on your dashboard." +msgstr "" + +#: i18n/templates.c:2942 +msgid "These are the results of the bulk action" +msgstr "" + +#: i18n/templates.c:5453 +msgid "These behaviours and the fields and values they allow are shown below for the active field." +msgstr "" + +#: i18n/templates.c:3407 i18n/templates.c:3422 +msgid "These documents have versions that are not present on the filesystem. Consider restoring them from backups." +msgstr "" + +#: lib/dashboard/dashlet.inc.php:51 +msgid "This Dashlet is incomplete." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:135 plugins/ktcore/KTBulkActions.php:368 +#: plugins/ktcore/KTBulkActions.php:625 plugins/ktcore/KTBulkActions.php:830 +#: plugins/ktcore/KTBulkActions.php:1351 +#: plugins/ktcore/KTDocumentActions.php:448 +#: plugins/ktcore/KTDocumentActions.php:674 +#: plugins/ktcore/KTDocumentActions.php:885 +#: plugins/ktcore/KTDocumentActions.php:1042 +#: plugins/ktcore/KTDocumentActions.php:1211 +#: plugins/ktcore/KTDocumentActions.php:1446 +#: plugins/ktcore/KTDocumentActions.php:1658 +#: plugins/ktcore/KTDocumentActions.php:1923 +#: plugins/ktcore/KTFolderActions.php:107 plugins/ktcore/document/edit.php:127 +#: plugins/ktcore/folder/addDocument.php:156 +#: plugins/ktstandard/ImmutableActionPlugin.php:127 +#: plugins/multiselect/addDocument.php:182 +msgid "This action requires authentication" +msgstr "" + +#: i18n/templates.c:371 +msgid "This action requires re-authentication." +msgstr "" + +#: plugins/commercial/custom-numbering/CustomNumberingPlugin.php:83 +msgid "This allows for the customisation of a document numbering schemes" +msgstr "" + +#: lib/email/Email.inc:266 +msgid "This bug can be found on this page" +msgstr "" + +#: i18n/templates.c:5486 +msgid "This column is not active." +msgstr "" + +#: i18n/templates.c:5768 +msgid "This conditional fieldset cannot be used" +msgstr "" + +#: i18n/templates.c:5570 +msgid "This conditional fieldset is marked such that it cannot be used. The system automatically checks whether the fieldset is useable, and if not it will prevent it being used in a \"conditional\" fashion. Please correct the issues identified below." +msgstr "" + +#: plugins/search2/IndexingHelp.php:68 +msgid "This could be due to OpenOffice.org not having been started, OR not installed" +msgstr "" + +#: plugins/search2/IndexingHelp.php:84 +msgid "This could be due to the indexer not having been started, OR not configured correctly" +msgstr "" + +#: i18n/templates.c:6968 +msgid "This dashlet will disappear when the migration process is complete." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1404 +msgid "This document can't be copied because it is checked out" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1003 +msgid "This document can't be deleted because it is checked out" +msgstr "" + +#: plugins/ktstandard/ImmutableActionPlugin.php:88 +msgid "This document can't be made immutable because it is checked out" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1163 +msgid "This document can't be moved because it is checked out" +msgstr "" + +#: plugins/ktcore/document/Rename.php:74 +msgid "This document can't be renamed because it is checked out" +msgstr "" + +#: view.php:141 +msgid "This document has been archived." +msgstr "" + +#: view.php:129 +msgid "This document has been archived. Please contact the system administrator to have it restored if it is still needed." +msgstr "" + +#: view.php:143 +msgid "This document has been deleted." +msgstr "" + +#: view.php:132 +msgid "This document has been deleted. Please contact the system administrator to have it restored if it is still needed." +msgstr "" + +#: rss.php:96 rss.php:121 +msgid "This document has returned a empty response" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:426 +msgid "This document is already checked out" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:629 +#: plugins/ktcore/KTDocumentActions.php:863 +msgid "This document is checked out, but not by you" +msgstr "" + +#: i18n/templates.c:3650 +msgid "This document is currently checked out by #checkoutuser#, but you have sufficient priviledges to cancel their checkout." +msgstr "" + +#: i18n/templates.c:3653 +msgid "This document is currently checked out by #checkoutuser#. You cannot make changes until that user checks it in. If you have urgent modifications to make, please contact your #appname# Administrator." +msgstr "" + +#: i18n/templates.c:3647 +msgid "This document is currently checked out by you. If this is incorrect, or you no longer need to make changes to it, please cancel the checkout." +msgstr "" + +#: i18n/templates.c:3389 +msgid "This document is currently of type #doctype#. If this is incorrect, you can change it here." +msgstr "" + +#: i18n/templates.c:3656 +msgid "This document is immutable. No further content changes can be made to this document, and only administrators (in administration mode) can make changes to the metadata or can move or delete it." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:624 +#: plugins/ktcore/KTDocumentActions.php:848 +msgid "This document is not checked out" +msgstr "" + +#: ktoffice/controllers/list.php:377 ktoffice/controllers/list.php:385 +msgid "This document is not editable" +msgstr "" + +#: i18n/templates.c:4772 +msgid "This document is not saved to KnowledgeTree. Are you sure you want to cancel saving to KnowledgeTree?" +msgstr "" + +#: i18n/templates.c:5573 i18n/templates.c:5795 +msgid "This error prevents this fieldset from being set to complete" +msgstr "" + +#: i18n/templates.c:5534 +msgid "This field is not controlled by the currently active group." +msgstr "" + +#: i18n/templates.c:5807 +msgid "This fieldset cannot be made conditional, since it contains fields which are not lookup types." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/conditional.inc.php:118 +#, php-format +msgid "This fieldset is incomplete: %s This fieldset will display as a normal, non-conditional fieldset until this problem is corrected." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:73 +msgid "This first step requires that you provide basic details about the workflow: its name, etc." +msgstr "" + +#: i18n/templates.c:4358 +msgid "This folder inherits its permissions from #permission_source#." +msgstr "" + +#: i18n/templates.c:4745 +msgid "This folder contains other documents/folders
and may not be deleted." +msgstr "" + +#: i18n/templates.c:4040 i18n/templates.c:4367 +msgid "This folder defines its own permissions." +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:292 +msgid "This folder does not override its permissions" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:332 i18n/templates.c:7178 +msgid "This function allows you to re-index your entire repository." +msgstr "" + +#: i18n/templates.c:6245 +msgid "This group is synchronised from \tan authentication source, and direct changes can not be made to \tthe members of this group within the document management system. Select the button below to synchronise the group from the authentication source." +msgstr "" + +#: plugins/ktstandard/workflow/TypeAssociator.php:71 +msgid "This installation assigns workflows by Document Type. Configure this process here." +msgstr "" + +#: i18n/templates.c:8618 +msgid "This installation of #appname# allocates workflows to documents by their location. To specify the workflow to be used by all documents directly in this folder, please specify the workflow below. Otherwise, users will be able to choose the workflow, and some documents may have no workflow attached." +msgstr "" + +#: i18n/templates.c:5390 +msgid "This is a conditional fieldset. That means that the values selected in one field affect the possible values in the other fields. Only lookup fields can be added to this fieldset." +msgstr "" + +#: i18n/templates.c:5987 +msgid "This is a professionally supported edition of KnowledgeTree." +msgstr "" + +#: lib/workflow/workflowtrigger.inc.php:63 +msgid "This is an abstract base class for the overall workflow trigger. It should never actually be available for installation." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:455 +msgid "This is not a valid URL." +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:404 +#: plugins/ktcore/KTValidators.php:278 +msgid "This is not a valid email address." +msgstr "" + +#: i18n/templates.c:2063 +msgid "This is the data assigned to the #name# aspect of this document." +msgstr "" + +#: i18n/templates.c:7217 +msgid "This is the saved search criteria:" +msgstr "" + +#: i18n/templates.c:1301 +msgid "This key expires in" +msgstr "" + +#: i18n/templates.c:1304 +msgid "This key has expired." +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:157 +msgid "This license is not valid for this version of KnowledgeTree. Please contact sales@knowledgetree.com for more information." +msgstr "" + +#: lib/dashboard/Notification.inc.php:166 +msgid "This notification handler does not support publication." +msgstr "" + +#: i18n/templates.c:8054 +msgid "This page allows you to get a quick overview of the workflow. To modify items, either select them from the overview below, or use the \"Workflow\" menu on the left to create new ones." +msgstr "" + +#: i18n/templates.c:4109 +msgid "This page allows you to rename a folder." +msgstr "" + +#: i18n/templates.c:2648 +msgid "This page allows you to rename the file name (not the document title) for a document." +msgstr "" + +#: i18n/templates.c:2666 +msgid "This page allows you to see the roles as they apply to this particular document." +msgstr "" + +#: i18n/templates.c:3002 +msgid "This page defines configuration options which are currently reserved for future development." +msgstr "" + +#: lib/templating/kt3template.inc.php:365 +msgid "This page did not produce any content" +msgstr "" + +#: i18n/templates.c:341 +msgid "This page lists versions of document content and allows you to compare a content version with another content version." +msgstr "" + +#: i18n/templates.c:3452 i18n/templates.c:3539 +msgid "This page lists versions of document metadata and allows you to compare a metadata version with the current metadata content." +msgstr "" + +#: i18n/templates.c:3623 +msgid "This page provides details of all activities that have been carried out on the document." +msgstr "" + +#: i18n/templates.c:2465 +msgid "This page provides details of all activities that have been carried out on the folder." +msgstr "" + +#: i18n/templates.c:3485 +msgid "This page shows the permissions that apply to this specific document. Where the folder view shows you information by role and group, this page shows the actual groups (and, if they are assigned directly to a role, the users) who have the different permissions. As a result, groups, users and roles with no permissions are not shown." +msgstr "" + +#: i18n/templates.c:4124 i18n/templates.c:4340 +msgid "This page shows the permissions that apply to this specific folder. Only the roles or groups which have permissions assigned are shown." +msgstr "" + +#: i18n/templates.c:3599 +msgid "This page shows the permissions that individual users have on this document. Only the users which have permissions assigned are shown." +msgstr "" + +#: i18n/templates.c:4166 +msgid "This page shows the permissions that individual users have on this folder. Only the users which have permissions assigned are shown." +msgstr "" + +#: i18n/templates.c:1628 i18n/templates.c:5303 +msgid "This page will allow you to manage the different aspects of this particular field." +msgstr "" + +#: plugins/ktcore/admin/manageCleanup.php:76 +msgid "This process performs a check to see if the documents in your repositories all are stored on the back-end storage (usually on disk). This process can take many minutes or hours depending on the size of your repository." +msgstr "" + +#: i18n/templates.c:1736 i18n/templates.c:5024 i18n/templates.c:5978 +msgid "This program is free software and published under the GNU General Public License version 3" +msgstr "" + +#: i18n/templates.c:7148 +msgid "This report lists all mime types and extensions that can be identified by #appname#." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:316 +#, php-format +msgid "This report lists all mime types and extensions that can be identified by %s." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:328 i18n/templates.c:7154 +msgid "This report lists documents that are waiting to be indexed." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:320 i18n/templates.c:7091 +msgid "This report lists the text extractors and their supported mime types." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:324 i18n/templates.c:7115 +msgid "This report will help to diagnose problems with document indexing." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:342 +msgid "This report will show the Lucene Document Indexing Statistics " +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:338 +msgid "This report will show the status of external dependencies and the document indexer." +msgstr "" + +#: search2/indexing/bin/recreateIndex.php:60 +msgid "This script only works with the PHPLuceneIndexer." +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:232 +msgid "This task will run the next time the Scheduler runs" +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:664 +msgid "This transition cannot be performed while the document is checked out." +msgstr "" + +#: i18n/templates.c:7721 +msgid "This transition has no actions associated with it.." +msgstr "" + +#: plugins/ktcore/KTWorkflowTriggers.inc.php:132 +#: plugins/ktcore/KTWorkflowTriggers.inc.php:248 +#: plugins/ktcore/KTWorkflowTriggers.inc.php:337 +#: plugins/ktcore/KTWorkflowTriggers.inc.php:421 +#: plugins/ktcore/KTWorkflowTriggers.inc.php:589 +msgid "This trigger has no configuration." +msgstr "" + +#: i18n/templates.c:4739 +msgid "This will delete this folder.
Are you sure you want to continue?" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:352 +msgid "This will download a copy of the document and is not the same as Checking Out a document. Changes to this downloaded file will not be managed in the DMS." +msgstr "" + +#: i18n/templates.c:8057 i18n/templates.c:8165 +msgid "This workflow does not define any states." +msgstr "" + +#: i18n/templates.c:8207 +msgid "This workflow does not define any transitions. Use the \"Create a new transition\" link above to add new transitions." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:403 +msgid "This workflow is currently marked as disabled. No new documents can be assigned to this workflow until it is enabled. To change this, please edit the workflow's base properties." +msgstr "" + +#: i18n/templates.c:8351 +msgid "Thread closed" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:429 +msgid "Thread state changed" +msgstr "" + +#: plugins/thumbnails/thumbnailsPlugin.php:34 +msgid "Thumbnail Generator" +msgstr "" + +#: search2/indexing/extractors/TikaApacheExtractor.inc.php:56 +msgid "Tika Apache Extractor" +msgstr "" + +#: search2/indexing/extractors/TikaApacheExtractor.inc.php:131 +msgid "Tika Extractor: XML-RPC failed to extract text." +msgstr "" + +#: plugins/ktcore/scheduler/taskScheduler.php:66 +msgid "Time taken to complete" +msgstr "" + +#: lib/browse/BrowseColumns.inc.php:106 plugins/ktcore/KTColumns.inc.php:58 +#: plugins/ktcore/KTCorePlugin.php:141 plugins/rssplugin/manageRSSFeeds.php:87 +#: plugins/rssplugin/manageRSSFeeds.php:133 +#: search2/search/fields/TitleField.inc.php:47 i18n/templates.c:5 +#: i18n/templates.c:1802 i18n/templates.c:4952 i18n/templates.c:5072 +#: i18n/templates.c:5087 +msgid "Title" +msgstr "" + +#: i18n/templates.c:5837 +msgid "To add a new field, enter the field's name, description and field type below and then click Add field. If the field type requires additional lookup values you will be prompted to enter them." +msgstr "" + +#: i18n/templates.c:6392 +msgid "To add users to the DMS authentication provider, you need to provide them with credentials through this section. If you are using an external source of login information like LDAP, ensure the appropriate plugin is loaded and use the section below." +msgstr "" + +#: i18n/templates.c:4304 +msgid "To add users to this role, select one or more user names in the Available Users field; then, double click or use the right pointing arrow to populate the Member users field. To remove users from this role, select one or more user names in the Member users field; then, double click, or use the left pointing arrow to move these names to Available Users." +msgstr "" + +#: i18n/templates.c:8561 +msgid "To connect to #appname# via a third-party WebDAV client, please use the following address" +msgstr "" + +#: i18n/templates.c:8564 +msgid "To connect with the #appname# Tools Suite, use this address" +msgstr "" + +#: i18n/templates.c:1232 +msgid "To create a new email document type, please type its name below and then click on the Create button. Note that email document type names must end with the word 'Email'." +msgstr "" + +#: i18n/templates.c:5066 +msgid "To customize a help file, please visit that file via the help system and click on customize this help file." +msgstr "" + +#: i18n/templates.c:7223 +msgid "To delete this saved search criteria or to edit other saved search criteria, #options#." +msgstr "" + +#: i18n/templates.c:7208 +msgid "To edit the search criteria, use the #options#." +msgstr "" + +#: i18n/templates.c:7010 +msgid "To get the best performance out of Document Indexer, the indexes must be optimised periodically. This is managed by a background task. Please see the KnowledgeTree Administrator's Manual for more information." +msgstr "" + +#: i18n/templates.c:5528 +msgid "To make a value in a child field available to the user when another value is selected in a parent field, first ensure that the parent field is being edited (it will have \"save\" and \"done\" as the buttons at the bottom of the column) and then select the value for the parent field. Now select the value(s) in the child column(s) you wish to be available to the user when the parent field's value is selected, and click \"save\". Note you that you can use Ctrl-<click> to select multiple child values at the same time." +msgstr "" + +#: i18n/templates.c:1859 +msgid "To modify this search, press the 'Edit' button." +msgstr "" + +#: search/booleanSearch.php:335 +msgid "To save over one of your existing searches, select it here." +msgstr "" + +#: i18n/templates.c:1868 +msgid "To save this search permanently, so that you can run it again at any time, fill in a name below and click 'Save'." +msgstr "" + +#: i18n/templates.c:3737 +msgid "To start the process of creating a new document type, please enter a name for the type below." +msgstr "" + +#: i18n/templates.c:4679 +msgid "To:" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:978 +msgid "Today" +msgstr "" + +#: i18n/templates.c:5378 +msgid "Toggle enabled state" +msgstr "" + +#: i18n/templates.c:2432 +msgid "Toggle search results format" +msgstr "" + +#: i18n/templates.c:5381 i18n/templates.c:5741 i18n/templates.c:5756 +msgid "Toggle stickiness" +msgstr "" + +#: i18n/templates.c:293 +msgid "Token" +msgstr "" + +#: lib/help/help.inc.php:187 +msgid "Too few parts to the requested help location." +msgstr "" + +#: plugins/commercial/network/topdownloads/TopDownloadsPlugin.php:79 +msgid "Top Downloads" +msgstr "" + +#: plugins/commercial/network/topdownloads/TopDownloadsPlugin.php:40 +msgid "Top Downloads for the last Week" +msgstr "" + +#: i18n/templates.c:6986 +msgid "Total # Documents in Repository:" +msgstr "" + +#: i18n/templates.c:6953 +msgid "Total documents migrated:" +msgstr "" + +#: i18n/templates.c:6956 +msgid "Total documents to be migrated:" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:73 +msgid "Transaction History" +msgstr "" + +#: plugins/rssplugin/KTrss.inc.php:412 +msgid "Transaction Summary (Last 4)" +msgstr "" + +#: i18n/templates.c:464 i18n/templates.c:548 i18n/templates.c:641 +#: i18n/templates.c:749 +msgid "Transaction Type" +msgstr "" + +#: i18n/templates.c:7493 i18n/templates.c:7646 i18n/templates.c:7763 +#: i18n/templates.c:7988 +msgid "Transition" +msgstr "" + +#: i18n/templates.c:7736 +msgid "Transition Actions Overview" +msgstr "" + +#: i18n/templates.c:8210 +msgid "Transition Availability" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1943 +#: plugins/ktcore/admin/workflowsv2.php:1980 +#: plugins/ktcore/admin/workflowsv2.php:2042 i18n/templates.c:7544 +#: i18n/templates.c:7556 i18n/templates.c:7718 +msgid "Transition Effects" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1947 +msgid "Transition Effects Overview" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1050 i18n/templates.c:7475 +msgid "Transition Name" +msgstr "" + +#: i18n/templates.c:7538 +msgid "Transition Requirements" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1638 +#: plugins/ktcore/admin/workflowsv2.php:1722 +#: plugins/ktcore/admin/workflowsv2.php:1783 i18n/templates.c:7715 +msgid "Transition Restrictions" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1635 i18n/templates.c:7754 +msgid "Transition Restrictions Overview" +msgstr "" + +#: i18n/templates.c:7673 +msgid "Transition Restrictions: #name#" +msgstr "" + +#: i18n/templates.c:8000 +msgid "Transition Triggers" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1148 +msgid "Transition deleted." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1894 +#: plugins/ktcore/KTDocumentActions.php:1897 +#: plugins/ktcore/KTDocumentActions.php:2001 +#: plugins/ktcore/KTDocumentActions.php:2005 +msgid "Transition performed" +msgstr "" + +#: i18n/templates.c:7868 +msgid "Transition to another workflow state" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1822 +msgid "Transition to perform" +msgstr "" + +#: i18n/templates.c:8003 +msgid "Transition triggers allow you to have special actions automatically occur when a transition is performed, and to control who can perform the transition. Some triggers perform both of these functions, especially if performing the action requires that certain conditions are in place before the action will occur." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1123 +msgid "Transition updated." +msgstr "" + +#: i18n/templates.c:7742 +msgid "Transition<" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:92 +#: plugins/ktcore/admin/workflowsv2.php:838 i18n/templates.c:7466 +#: i18n/templates.c:7937 +msgid "Transitions" +msgstr "" + +#: i18n/templates.c:7940 +msgid "Transitions are how documents move from one state to another. Typically, most transitions can only be performed by people with a specific role (e.g. Manager) or part of a specific group (e.g. Marketing Department)." +msgstr "" + +#: i18n/templates.c:7829 i18n/templates.c:8192 +msgid "Transitions are what drive the workflow of documents. Each step that needs to be followed in the document's lifecycle could map to a transition, and can be allowed or denied by a combination of roles, permissions and groups." +msgstr "" + +#: i18n/templates.c:8075 i18n/templates.c:8183 +msgid "Transitions available" +msgstr "" + +#: i18n/templates.c:7949 +msgid "Transitions from this state" +msgstr "" + +#: i18n/templates.c:7943 i18n/templates.c:8078 i18n/templates.c:8186 +msgid "Transitions to this state" +msgstr "" + +#: lib/documentmanagement/DocumentField.inc:263 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:86 +#: plugins/multiselect/inetbasic.inc.php:110 i18n/templates.c:3935 +#: i18n/templates.c:5690 +msgid "Tree" +msgstr "" + +#: plugins/ktcore/KTWidgets.php:383 +msgid "Tree metadata fields must be associated with a particular type." +msgstr "" + +#: lib/groups/Group.inc:293 +msgid "Tried to remove member from database, apparently successfully, but hasMember thinks they're still members?" +msgstr "" + +#: i18n/templates.c:8015 i18n/templates.c:8033 +msgid "Trigger" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1863 +#: plugins/ktcore/admin/workflowsv2.php:2123 +msgid "Trigger deleted." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1836 +#: plugins/ktcore/admin/workflowsv2.php:2096 +msgid "Trigger saved." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:79 +#: i18n/templates.c:1544 i18n/templates.c:6743 +msgid "True" +msgstr "" + +#: lib/import/bulkimport.inc.php:122 +#, php-format +msgid "Two folders named %s present in %s. Unable to decide which to use..." +msgstr "" + +#: i18n/templates.c:3926 i18n/templates.c:4946 i18n/templates.c:5681 +#: i18n/templates.c:5708 i18n/templates.c:8369 +msgid "Type" +msgstr "" + +#: i18n/templates.c:3128 +msgid "Type :q! to exit without saving." +msgstr "" + +#: i18n/templates.c:1367 i18n/templates.c:5159 i18n/templates.c:5429 +#: i18n/templates.c:5825 +msgid "Type Description" +msgstr "" + +#: i18n/templates.c:3125 +msgid "Type ZZ to save changes and exit." +msgstr "" + +#: plugins/ktstandard/workflow/TypeAssociator.php:191 +msgid "Type mapping updated." +msgstr "" + +#: plugins/ktstandard/PDFGeneratorAction.php:144 +msgid "Type of conversion" +msgstr "" + +#: plugins/multiselect/inetbasic.inc.php:358 +msgid "Type of field" +msgstr "" + +#: i18n/templates.c:4676 +msgid "Type your message here ..." +msgstr "" + +#: i18n/templates.c:1175 i18n/templates.c:3680 +msgid "Type-specific field sets" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:88 +#: plugins/rssplugin/manageRSSFeeds.php:135 +msgid "URL" +msgstr "" + +#: i18n/templates.c:4742 +msgid "Unable to Delete Folder" +msgstr "" + +#: plugins/commercial/wintools/baobabKeyManagement.php:86 +msgid "Unable to add license." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1755 +#: plugins/ktcore/admin/workflowsv2.php:1765 +#: plugins/ktcore/admin/workflowsv2.php:1802 +#: plugins/ktcore/admin/workflowsv2.php:2015 +#: plugins/ktcore/admin/workflowsv2.php:2025 +#: plugins/ktcore/admin/workflowsv2.php:2062 +msgid "Unable to add trigger." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:374 +#, php-format +msgid "Unable to add trigger: %s" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:336 +#, php-format +msgid "Unable to add user \"%s\" to group \"%s\"" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:620 +#, php-format +msgid "Unable to add user to group \"%s\"" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:518 +msgid "Unable to change role allocation." +msgstr "" + +#: i18n/templates.c:4619 +msgid "Unable to connect to server" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:287 +#, php-format +msgid "Unable to copy disabled state actions: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:271 +#, php-format +msgid "Unable to copy state permission assignment: %s" +msgstr "" + +#: plugins/ktstandard/admin/manageDisclaimers.php:140 +msgid "Unable to create disclaimer" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:158 +#, php-format +msgid "Unable to create feed: %s" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:219 +#: plugins/multiselect/inetbasic.inc.php:309 +#, php-format +msgid "Unable to create field: %s" +msgstr "" + +#: ktoffice/controllers/list.php:1363 +msgid "Unable to create folder" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:692 +#, php-format +msgid "Unable to create group: %s" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:172 +msgid "Unable to create replacement" +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:99 +msgid "Unable to create role." +msgstr "" + +#: lib/metadata/fieldsetregistry.inc.php:463 +#, php-format +msgid "Unable to deal with field: id %d" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:869 +#: plugins/multiselect/inetbasic.inc.php:1170 +#, php-format +msgid "Unable to delete field: %s" +msgstr "" + +#: ktoffice/controllers/list.php:1381 i18n/templates.c:4733 +msgid "Unable to delete folder" +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:85 +#: plugins/rssplugin/manageRSSFeeds.php:75 +#: plugins/rssplugin/manageRSSFeeds.php:119 +#, php-format +msgid "Unable to delete item: %s" +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:138 +msgid "Unable to delete the role." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1859 +#: plugins/ktcore/admin/workflowsv2.php:2119 +msgid "Unable to delete trigger: " +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:579 +msgid "Unable to delete user - the user may still be referred by documents." +msgstr "" + +#: i18n/templates.c:4706 +msgid "Unable to email document" +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/latestchanges.php:98 +#: plugins/commercial/network/topdownloads/TopDownloadsPlugin.php:200 +msgid "Unable to find folder." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:241 +msgid "Unable to find previous value. Please try again." +msgstr "" + +#: plugins/ktstandard/contents/OpenDocumentIndexer.php:111 +#: plugins/ktstandard/contents/PdfIndexer.php:62 +#: plugins/ktstandard/contents/PowerpointIndexer.php:58 +#: plugins/ktstandard/contents/PsIndexer.php:65 +#: plugins/ktstandard/contents/RtfIndexer.php:64 +#: plugins/ktstandard/contents/WordIndexer.php:85 +#, php-format +msgid "Unable to find required command for indexing. Please ensure that %s is installed and in the %s Path. For more information on indexers and helper applications, please visit the %s site." +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:229 +#: lib/widgets/fieldsetDisplay.inc.php:290 +msgid "Unable to find the document's creator" +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:241 +#: lib/widgets/fieldsetDisplay.inc.php:306 +#: lib/widgets/fieldsetDisplay.inc.php:322 +msgid "Unable to find the document's modifier" +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:235 +#: lib/widgets/fieldsetDisplay.inc.php:313 +msgid "Unable to find the document's owner" +msgstr "" + +#: lib/workflow/workflowutil.inc.php:865 +#, php-format +msgid "Unable to find workflow trigger: %s" +msgstr "" + +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:680 +msgid "Unable to get documents in folder " +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:1806 plugins/ktcore/KTPermissions.php:852 +#, php-format +msgid "Unable to get documents in folder %s: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1792 +#: plugins/ktcore/admin/workflowsv2.php:1815 +#: plugins/ktcore/admin/workflowsv2.php:1825 +#: plugins/ktcore/admin/workflowsv2.php:1843 +#: plugins/ktcore/admin/workflowsv2.php:1852 +#: plugins/ktcore/admin/workflowsv2.php:2052 +#: plugins/ktcore/admin/workflowsv2.php:2075 +#: plugins/ktcore/admin/workflowsv2.php:2085 +#: plugins/ktcore/admin/workflowsv2.php:2103 +#: plugins/ktcore/admin/workflowsv2.php:2112 +msgid "Unable to load trigger." +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:1800 +#: plugins/MyDropDocumentsPlugin/MyDropDocumentsPage.php:673 +#: plugins/ktcore/KTPermissions.php:846 +msgid "Unable to locate folder: " +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:268 +msgid "Unable to locate stored data. Please try again." +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:150 +#: plugins/ktcore/admin/manageViews.php:169 +msgid "Unable to locate the column entry" +msgstr "" + +#: plugins/ktcore/admin/manageViews.php:106 +msgid "Unable to locate the entry" +msgstr "" + +#: lib/help/help.inc.php:147 lib/help/help.inc.php:152 +msgid "Unable to locate the requested help file for this language." +msgstr "" + +#: browse.php:376 +msgid "Unable to log admin mode entry. Not activating admin mode." +msgstr "" + +#: browse.php:420 +msgid "Unable to log admin mode exit. Not de-activating admin mode." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:899 +#: plugins/multiselect/inetbasic.inc.php:1204 +msgid "Unable to move field down" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:884 +#: plugins/multiselect/inetbasic.inc.php:1187 +msgid "Unable to move field up" +msgstr "" + +#: plugins/commercial/wintools/baobabUserManagement.php:53 +#: plugins/commercial/wintools/baobabUserManagement.php:62 +msgid "Unable to obtain key information." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:347 +#, php-format +msgid "Unable to remove user \"%s\" from group \"%s\"" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:634 +#, php-format +msgid "Unable to remove user from group \"%s\"" +msgstr "" + +#: ktoffice/controllers/list.php:1344 +msgid "Unable to rename folder" +msgstr "" + +#: plugins/ktcore/folder/Rename.php:100 +msgid "Unable to retrieve parent folder." +msgstr "" + +#: lib/util/ktutil.inc:1151 +#, php-format +msgid "Unable to retrieve system setting %s: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1832 +#: plugins/ktcore/admin/workflowsv2.php:2092 +msgid "Unable to save trigger: " +msgstr "" + +#: plugins/commercial/wintools/baobabKeyManagement.php:105 +msgid "Unable to store license:" +msgstr "" + +#: plugins/ktcore/admin/roleManagement.php:121 +msgid "Unable to update role." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1029 +#, php-format +msgid "Unable to update state: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1120 +#, php-format +msgid "Unable to update transition: %s" +msgstr "" + +#: i18n/templates.c:5501 +msgid "Unassigned/Unavailable" +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:409 +msgid "Unauthorised access denied." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:120 +msgid "Under discussion" +msgstr "" + +#: i18n/templates.c:4478 i18n/templates.c:4481 +msgid "Undo" +msgstr "" + +#: i18n/templates.c:4853 +msgid "Undo Changes" +msgstr "" + +#: i18n/templates.c:7349 +msgid "Undo change" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:684 +#, php-format +msgid "Unexpected error updating transition: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:252 +#, php-format +msgid "Unexpected failure cloning state: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:817 +#, php-format +msgid "Unexpected failure creating state: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:930 +#, php-format +msgid "Unexpected failure creating transition: %s" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1127 +#, php-format +msgid "Unexpected failure deleting document: %s" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:388 +#: plugins/multiselect/addDocument.php:452 +#, php-format +msgid "Unexpected failure to add document - %s" +msgstr "" + +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:186 +#, php-format +msgid "Unexpected failure to add shortcut - %s" +msgstr "" + +#: plugins/ktcore/document/edit.php:286 +#, php-format +msgid "Unexpected failure to update document title: %s" +msgstr "" + +#: search2/search/expr.inc.php:928 +#, php-format +msgid "Unexpected operator: %s" +msgstr "" + +#: search2/search/SearchCommandLexer.php:131 +#, php-format +msgid "Unexpected token: %s" +msgstr "" + +#: plugins/ktcore/document/edit.php:290 +#, php-format +msgid "Unexpected validation failure: %s." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:141 +#: plugins/ktcore/admin/groupManagement.php:583 +msgid "Unit" +msgstr "" + +#: i18n/templates.c:6326 +msgid "Unit Administration" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:128 +#: plugins/ktcore/admin/groupManagement.php:592 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:550 +msgid "Unit Administrators" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:58 +#: plugins/ktcore/admin/unitManagement.php:64 +msgid "Unit Management" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:82 +#: plugins/ktcore/admin/unitManagement.php:139 +#: plugins/ktcore/admin/unitManagement.php:190 i18n/templates.c:6170 +#: i18n/templates.c:6344 +msgid "Unit Name" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:183 +msgid "Unit created" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:222 +msgid "Unit details updated" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:260 +msgid "Unit removed" +msgstr "" + +#: i18n/templates.c:6026 +msgid "Units allow you to delegate a portion of the document management system to a particular part of your organisation. Unit administrators have additional right within that portion of the document management system, and they can also adjust the membership of groups that belong to the unit." +msgstr "" + +#: i18n/templates.c:6335 +msgid "Units allow you to delegate the administration of a portion of the DMS repository to a particular part of your organisation. Unit administrators have additional rights within that portion of the document management system, and they can also adjust the membership of groups that belong to the unit." +msgstr "" + +#: plugins/search2/MigrationDashlet.php:82 +#: search2/indexing/indexerCore.inc.php:396 +msgid "Unknown" +msgstr "" + +#: lib/documentmanagement/DocumentTransaction.inc:125 +msgid "Unknown Action" +msgstr "" + +#: lib/documentmanagement/Document.inc:754 +msgid "Unknown State" +msgstr "" + +#: lib/mime.inc.php:144 plugins/ktstandard/PDFGeneratorAction.php:197 +msgid "Unknown Type" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:511 +#: plugins/multiselect/inetbasic.inc.php:710 +msgid "Unknown action specified" +msgstr "" + +#: lib/ktentity.inc:823 +msgid "Unknown comparison type given: " +msgstr "" + +#: lib/validation/errorviewer.inc.php:102 +msgid "Unknown error" +msgstr "" + +#: search2/search/expr.inc.php:771 +#, php-format +msgid "Unknown op: %s" +msgstr "" + +#: lib/database/dbutil.inc:178 +msgid "Unknown return value for autoInsert" +msgstr "" + +#: lib/database/dbutil.inc:194 +msgid "Unknown return value for autoUpdate" +msgstr "" + +#: lib/database/dbutil.inc:219 +msgid "Unknown return value for whereUpdate" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:348 +#, php-format +msgid "Unknown validation function for required value %s" +msgstr "" + +#: ktapi/ktapi.inc.php:1784 +msgid "Unrecognised member type. Must be group or user." +msgstr "" + +#: plugins/search2/DocumentIndexAction.php:32 +msgid "Unschedule Indexing" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:74 +msgid "Unset" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:264 +msgid "Unsubscribe from document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:516 +msgid "Unsubscribe from folder" +msgstr "" + +#: lib/help/help.inc.php:164 +msgid "Untitled Help File" +msgstr "" + +#: i18n/templates.c:2387 +msgid "Up" +msgstr "" + +#: i18n/templates.c:5093 i18n/templates.c:5951 i18n/templates.c:8558 +#: i18n/templates.c:8612 i18n/transactions.c:2 +msgid "Update" +msgstr "" + +#: i18n/templates.c:8144 +msgid "Update Action Availability" +msgstr "" + +#: i18n/templates.c:7982 +msgid "Update Allocated Permissions" +msgstr "" + +#: plugins/ktcore/document/edit.php:82 plugins/ktcore/document/edit.php:334 +msgid "Update Document" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:165 +msgid "Update Dynamic Condition" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:230 +#: plugins/multiselect/inetbasic.inc.php:326 +msgid "Update Field" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:335 +#: plugins/multiselect/InetdocumentFieldsv2.php:400 +msgid "Update Fieldset" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2255 +msgid "Update Notifications" +msgstr "" + +#: i18n/templates.c:4067 i18n/templates.c:4160 +msgid "Update Permission Assignments" +msgstr "" + +#: preferences.php:69 +msgid "Update Preferences" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:586 +msgid "Update Process" +msgstr "" + +#: plugins/ktcore/admin/savedSearch.php:146 +msgid "Update Saved Search" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:950 +msgid "Update State" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:1041 +msgid "Update Transition" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:456 +msgid "Update Workflow Details" +msgstr "" + +#: i18n/templates.c:7421 +msgid "Update Workflow Permissions" +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:163 +msgid "Update failed" +msgstr "" + +#: i18n/templates.c:7928 +msgid "Update users to inform" +msgstr "" + +#: i18n/templates.c:8051 +msgid "Update workflow properties" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:122 +msgid "Updated news item." +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:1235 plugins/ktcore/folder/Permissions.php:536 +msgid "Updated permissions" +msgstr "" + +#: plugins/multiselect/BulkUpload.php:155 i18n/templates.c:4004 +#: i18n/templates.c:4544 +msgid "Upload" +msgstr "" + +#: plugins/ktcore/folder/addDocument.php:59 +#: plugins/multiselect/addDocument.php:75 +msgid "Upload Document" +msgstr "" + +#: i18n/templates.c:4547 +msgid "Upload cancelled" +msgstr "" + +#: i18n/templates.c:4535 +msgid "Upload failed" +msgstr "" + +#: i18n/templates.c:3989 +msgid "Upload files into" +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:69 +#: plugins/ktcore/folder/addDocument.php:75 +#: plugins/multiselect/BulkUpload.php:102 +#: plugins/multiselect/addDocument.php:96 +msgid "Upload larger than maximum POST size (post_max_size variable in .htaccess or php.ini)" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:619 +#, php-format +msgid "Upload larger than maximum POST size: %s (post_max_size variable in .htaccess or php.ini)" +msgstr "" + +#: i18n/templates.c:4529 +msgid "Upload succeeded" +msgstr "" + +#: i18n/templates.c:1322 +msgid "Usage" +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/standardReports.php:55 +#: plugins/commercial/network/extendedtransactioninfo/standardReports.php:60 +msgid "Usage Information" +msgstr "" + +#: i18n/templates.c:605 +msgid "Usage Information for \"#folder#\"" +msgstr "" + +#: i18n/templates.c:4226 +msgid "Use Parent" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:60 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:162 +msgid "Use Transaction Layer Security (TLS)" +msgstr "" + +#: ktapi/KTAPIAcl.inc.php:1680 ktapi/KTAPIAcl.inc.php:1726 +#: plugins/ktcore/KTPermissions.php:524 +msgid "Use parent allocation" +msgstr "" + +#: i18n/templates.c:4256 i18n/templates.c:4259 +msgid "Use parent's allocation" +msgstr "" + +#: i18n/templates.c:7250 +msgid "Use the #options# to extend this query." +msgstr "" + +#: i18n/templates.c:7205 +msgid "Use the #options# to extend your search criteria." +msgstr "" + +#: i18n/templates.c:5243 +msgid "Use the +/- arrows to open or close the tree. Bold items are metadata keywords. To edit a category (including adding or removing keywords) click on the \"attach keywords\" link next to it." +msgstr "" + +#: i18n/templates.c:3191 +msgid "Use the force checkin action in the listing below to override the checked-out status." +msgstr "" + +#: i18n/templates.c:4307 +msgid "Use the Filter fields to display names in order of specified criteria. Use the Ctrl key to multi-select user names." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1200 +msgid "Use the folder collection and path below select the folder into which you wish to move the document." +msgstr "" + +#: i18n/templates.c:848 +msgid "Use the folder collection and path below to browse to the document you wish to link to." +msgstr "" + +#: i18n/templates.c:3173 +msgid "Use the folder collection and path below to browse to the folder containing the documents you wish to restore." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:612 +#: plugins/ktcore/KTDocumentActions.php:1436 +msgid "Use the folder collection and path below to browse to the folder you wish to copy the documents into." +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:353 +msgid "Use the folder collection and path below to browse to the folder you wish to move the documents into." +msgstr "" + +#: i18n/templates.c:7832 +msgid "Use the form below to create a new Transition, and assign or edit existing transitions using the table below." +msgstr "" + +#: i18n/templates.c:3053 +msgid "Use the standard introduction." +msgstr "" + +#: i18n/templates.c:914 +msgid "Use the up and down arrows to move an item. Please note that changes are only saved when you click the 're-order' button." +msgstr "" + +#: i18n/templates.c:4658 +msgid "Use this comment next time." +msgstr "" + +#: i18n/templates.c:1316 +msgid "Used" +msgstr "" + +#: i18n/templates.c:5195 +msgid "Used by" +msgstr "" + +#: plugins/commercial/alerts/KTDocTypeAlerts.php:159 +#: plugins/commercial/alerts/KTDocTypeAlerts.php:239 +#: plugins/commercial/alerts/alerts.php:886 i18n/templates.c:347 +#: i18n/templates.c:437 i18n/templates.c:500 i18n/templates.c:584 +#: i18n/templates.c:677 i18n/templates.c:785 i18n/templates.c:1007 +#: i18n/templates.c:2471 i18n/templates.c:3458 i18n/templates.c:3545 +#: i18n/templates.c:3608 i18n/templates.c:3629 i18n/templates.c:4190 +#: i18n/templates.c:6572 i18n/templates.c:7040 +msgid "User" +msgstr "" + +#: i18n/templates.c:422 +msgid "User Activity Information" +msgstr "" + +#: plugins/commercial/network/userhistory/UserHistoryPlugin.php:41 +msgid "User History" +msgstr "" + +#: i18n/templates.c:728 +msgid "User Information: #username#" +msgstr "" + +#: i18n/templates.c:620 +msgid "User Information: #username# in \"#folder#\"" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:354 +msgid "User Interface" +msgstr "" + +#: plugins/ktcore/admin/configSettings.php:294 +msgid "User Interface Settings" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:57 +#: plugins/ktcore/admin/userManagement.php:59 +#: plugins/ktcore/admin/userManagement.php:120 +#: plugins/ktcore/admin/userManagement.php:181 +#: plugins/ktcore/admin/userManagement.php:192 +#: plugins/ktcore/admin/userManagement.php:252 +#: plugins/ktcore/admin/userManagement.php:330 i18n/templates.c:6386 +msgid "User Management" +msgstr "" + +#: plugins/commercial/professional-reporting/admin/userReporting.php:36 +#: plugins/commercial/professional-reporting/admin/userReporting.php:41 +#: plugins/commercial/professional-reporting/admin/userReporting.php:85 +#: plugins/commercial/professional-reporting/admin/userReporting.php:148 +#: plugins/commercial/professional-reporting/admin/userReporting.php:162 +#: i18n/templates.c:1034 +msgid "User Reporting" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:442 +msgid "User already has an allocated key." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:582 +msgid "User deleted" +msgstr "" + +#: i18n/templates.c:1031 +msgid "User has never logged in" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:347 +msgid "User has no license allocated" +msgstr "" + +#: ktapi/ktapi.inc.php:1533 ktapi/ktapi.inc.php:1585 +msgid "User id must be numeric." +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:142 +#: plugins/ktcore/admin/userManagement.php:323 +#: plugins/ktcore/admin/userManagement.php:486 +msgid "User information updated." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:677 +msgid "User is currently not a member of any groups." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:280 view.php:477 +msgid "User no longer exists" +msgstr "" + +#: plugins/commercial/professional-reporting/ProfessionalReportingPlugin.php:51 +msgid "User reports" +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:109 +msgid "User will need to change password on next login." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:437 +msgid "User's name" +msgstr "" + +#: i18n/templates.c:3518 i18n/templates.c:3611 i18n/templates.c:4151 +#: i18n/templates.c:4193 i18n/templates.c:4394 +msgid "User:" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:599 +msgid "User: " +msgstr "" + +#: i18n/templates.c:524 +msgid "User: #username# <br /> Action: #action# <br /> #reason#" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2213 +#, php-format +msgid "User: %s" +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/adminReports.php:72 +#: plugins/commercial/network/extendedtransactioninfo/standardReports.php:90 +#: plugins/commercial/professional-reporting/admin/userReporting.php:57 +#: plugins/commercial/wintools/baobabUserManagement.php:101 +#: plugins/ktcore/KTBulkActions.php:140 plugins/ktcore/KTBulkActions.php:373 +#: plugins/ktcore/KTBulkActions.php:630 plugins/ktcore/KTBulkActions.php:835 +#: plugins/ktcore/KTBulkActions.php:1356 +#: plugins/ktcore/KTDocumentActions.php:453 +#: plugins/ktcore/KTDocumentActions.php:679 +#: plugins/ktcore/KTDocumentActions.php:890 +#: plugins/ktcore/KTDocumentActions.php:1047 +#: plugins/ktcore/KTDocumentActions.php:1216 +#: plugins/ktcore/KTDocumentActions.php:1451 +#: plugins/ktcore/KTDocumentActions.php:1663 +#: plugins/ktcore/KTDocumentActions.php:1928 +#: plugins/ktcore/KTFolderActions.php:112 +#: plugins/ktcore/admin/userManagement.php:80 +#: plugins/ktcore/admin/userManagement.php:156 +#: plugins/ktcore/admin/userManagement.php:221 +#: plugins/ktcore/document/edit.php:132 +#: plugins/ktcore/folder/addDocument.php:161 +#: plugins/ktstandard/ImmutableActionPlugin.php:132 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:296 +#: plugins/multiselect/addDocument.php:187 i18n/templates.c:374 +#: i18n/templates.c:713 i18n/templates.c:821 i18n/templates.c:986 +#: i18n/templates.c:1121 i18n/templates.c:1148 i18n/templates.c:1676 +#: i18n/templates.c:1694 i18n/templates.c:1709 i18n/templates.c:4721 +#: i18n/templates.c:5003 i18n/templates.c:6425 +msgid "Username" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:266 +#: plugins/ktcore/admin/workflowsv2.php:2178 +#: plugins/ktstandard/KTEmail.php:410 i18n/templates.c:2675 +#: i18n/templates.c:4232 +msgid "Users" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:243 +msgid "Users and Groups" +msgstr "" + +#: i18n/templates.c:6224 i18n/templates.c:6239 +msgid "Users may be associated with Groups which are then used to grant these users security privileges." +msgstr "" + +#: i18n/templates.c:5996 i18n/templates.c:6095 i18n/templates.c:6473 +msgid "Users may be classed together as Groups and these groups may be used to set security privileges throughout the document management system." +msgstr "" + +#: i18n/templates.c:6113 +msgid "Users may be classed together as Units and these units may be used to set security privileges throughout the document management system." +msgstr "" + +#: i18n/templates.c:3602 +msgid "Users may have permissions on this document due to membership of a group, or fulfilling a specific role on this document." +msgstr "" + +#: i18n/templates.c:4169 +msgid "Users may have permissions on this folder due to membership of a group, or fulfilling a specific role on this folder." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:2263 +msgid "Users to inform" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:759 +msgid "Users updated" +msgstr "" + +#: plugins/ktcore/document/edit.php:249 +#, php-format +msgid "Value exceeds max allowed length of %d characters for %s. Current value is %d characters." +msgstr "" + +#: i18n/templates.c:2837 i18n/templates.c:2879 i18n/templates.c:2924 +#: i18n/templates.c:4502 +msgid "Values" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:258 +msgid "Various settings which do not fit into the other categories, including managing help and saved searches." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:388 +msgid "Verify Document Storage" +msgstr "" + +#: ktoffice/controllers/list.php:348 +msgid "Version" +msgstr "" + +#: i18n/templates.c:5966 +msgid "Version #version#" +msgstr "" + +#: i18n/templates.c:3428 +msgid "Version Comparison" +msgstr "" + +#: lib/documentmanagement/Document.inc:746 +msgid "Version Deleted" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:136 +#: plugins/ktcore/KTDocumentActions.php:149 +msgid "Version History" +msgstr "" + +#: i18n/templates.c:3584 +msgid "Version deleted" +msgstr "" + +#: i18n/templates.c:7265 +msgid "Version:" +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:128 +msgid "Versions of differing mime types cannot be compared." +msgstr "" + +#: i18n/templates.c:998 i18n/templates.c:1127 i18n/transactions.c:10 +msgid "View" +msgstr "" + +#: i18n/templates.c:3065 +msgid "View All" +msgstr "" + +#: config/siteMap.inc:58 lib/subscriptions/subscriptions.inc.php:632 +#: lib/subscriptions/subscriptions.inc.php:649 +#: lib/subscriptions/subscriptions.inc.php:656 +#: lib/subscriptions/subscriptions.inc.php:663 +#: lib/subscriptions/subscriptions.inc.php:679 +#: lib/subscriptions/subscriptions.inc.php:691 +#: lib/subscriptions/subscriptions.inc.php:698 +#: lib/subscriptions/subscriptions.inc.php:705 +#: plugins/commercial/alerts/alerts.php:263 plugins/ktstandard/KTEmail.php:198 +#: i18n/templates.c:161 i18n/templates.c:2096 i18n/templates.c:2150 +#: i18n/templates.c:2171 i18n/templates.c:2186 i18n/templates.c:2207 +#: i18n/templates.c:2234 i18n/templates.c:2714 i18n/templates.c:3023 +#: i18n/templates.c:8225 +msgid "View Document" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:625 +#: plugins/ktcore/KTColumns.inc.php:590 plugins/ktcore/KTColumns.inc.php:600 +#: i18n/templates.c:2276 i18n/templates.c:2297 +msgid "View Folder" +msgstr "" + +#: i18n/templates.c:2687 +msgid "View Help Request" +msgstr "" + +#: plugins/commercial/network/inlineview/InlineViewPlugin.php:48 +msgid "View Inline" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:613 i18n/templates.c:2117 +msgid "View New Folder" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:671 i18n/templates.c:2252 +msgid "View New Location" +msgstr "" + +#: i18n/templates.c:5399 i18n/templates.c:5402 i18n/templates.c:5576 +#: i18n/templates.c:5579 +msgid "View Overview" +msgstr "" + +#: i18n/templates.c:4337 +msgid "View Permissions for" +msgstr "" + +#: i18n/templates.c:6539 i18n/templates.c:6581 i18n/templates.c:7052 +msgid "View Results" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:871 plugins/ktcore/KTPermissions.php:875 +#: plugins/ktcore/KTPermissions.php:876 i18n/templates.c:2660 +msgid "View Roles" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:606 +msgid "View Subscription Folder " +msgstr "" + +#: i18n/templates.c:716 i18n/templates.c:824 +msgid "View Transactions" +msgstr "" + +#: i18n/templates.c:4817 +msgid "View a Copy" +msgstr "" + +#: lib/subscriptions/subscriptions.inc.php:709 +#: plugins/commercial/alerts/alerts.php:267 i18n/templates.c:95 +#: i18n/templates.c:170 +msgid "View all alerts on this document" +msgstr "" + +#: i18n/templates.c:8330 +msgid "View all threads" +msgstr "" + +#: plugins/commercial/officeaddin/officeaddinPlugin.php:44 +msgid "View and change settings for the KnowledgeTree Office Add-In." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:362 +msgid "View and change settings for the KnowledgeTree Tools Server, Client Tools Policies, WebDAV, and the OpenOffice.org service." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:366 +msgid "View and modify settings for the KnowledgeTree cache, custom error message handling, Disk Usage threshold percentages, location of zip binary, paths to external binaries, general server configuration, LDAP authentication, session management, KnowledgeTree storage manager, miscellaneous tweaks, and whether to always display 'Your Checked-out Documents' dashlet." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:354 +msgid "View and modify settings on Browse View actions, OEM name, automatic refresh, search results restrictions, custom logo details, paths to dot binary, graphics, and log directory, and whether to enable/disable condensed UI, 'open' from downloads, sort metadata, and skinning." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:370 +msgid "View and modify the default language." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:358 +msgid "View and modify the number of documents indexed / migrated in a cron session, core indexing class, paths to the extractor hook, text extractors, indexing engine, Lucene indexes, and the Java Lucene URL. View and modify search date format, paths to search, indexing fields and libraries, results display format, and results per page." +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:374 +msgid "View and modify the security settings." +msgstr "" + +#: i18n/templates.c:3434 +msgid "View current version" +msgstr "" + +#: plugins/commercial/network/extendedtransactioninfo/ExtendedTransactionInfoPlugin.php:55 +msgid "View detailed information about user activity." +msgstr "" + +#: i18n/templates.c:86 +msgid "View document" +msgstr "" + +#: i18n/templates.c:608 +msgid "View information about what documents have been added, or changed in folder and its children. You can view this information by user or as a whole." +msgstr "" + +#: i18n/templates.c:3110 +msgid "View jobs in the crontab:" +msgstr "" + +#: i18n/templates.c:4034 i18n/templates.c:4181 i18n/templates.c:4187 +msgid "View permissions overview" +msgstr "" + +#: i18n/templates.c:3491 i18n/templates.c:4037 i18n/templates.c:4349 +#: i18n/templates.c:4355 +msgid "View resolved permissions for user" +msgstr "" + +#: i18n/templates.c:8336 +msgid "View threads" +msgstr "" + +#: i18n/templates.c:4862 +msgid "View/edit another KnowledgeTree document in Office." +msgstr "" + +#: plugins/ktcore/authentication/authenticationadminpage.inc.php:111 +#: i18n/templates.c:4919 +msgid "Viewing" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:276 +msgid "Viewing Permissions" +msgstr "" + +#: i18n/templates.c:8306 +msgid "Views" +msgstr "" + +#: i18n/templates.c:5933 +msgid "Views are the selections of documents and folders you will find throughout #appname#. Some of those can be configured to use different kinds of columns (e.g. workflow state, the creator's name, etc.)" +msgstr "" + +#: search2/search/bin/search2graphviz.php:83 +msgid "Visgraph search expression" +msgstr "" + +#: i18n/templates.c:7307 +msgid "Visit the #tracker# first if you believe you have found a bug. Always check for known issues relating to the version you are using — we may already have found the problem you're referring to, and may have fixed it in a newer version." +msgstr "" + +#: i18n/templates.c:950 i18n/templates.c:1040 +msgid "Want to know when last users of your system logged in? You can get an overview of the last login times of all users, or of users that have or have not logged in recently." +msgstr "" + +#: i18n/templates.c:1076 +msgid "Want to know who all has logged in the system over a period of time? You can get an overview of all login activity for all users over a specified period of time." +msgstr "" + +#: i18n/templates.c:3029 i18n/templates.c:4208 i18n/templates.c:4763 +msgid "Warning" +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:1205 +#: plugins/ktstandard/KTBulkExportPlugin.php:201 i18n/templates.c:2513 +msgid "Warning! Please wait for archiving to complete before closing the page." +msgstr "" + +#: i18n/templates.c:3404 +msgid "Warning: Database is inconsistent with the contents of the repository." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:366 +msgid "Warning: some users are still members of some subgroups" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:360 +msgid "Warning: some users were already members of some subgroups" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:653 +msgid "Warning: the user is still a member of some subgroups" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:647 +msgid "Warning: the user was already a member of some subgroups" +msgstr "" + +#: i18n/templates.c:3416 +msgid "Warning: Database is inconsistent with the contents of the repository." +msgstr "" + +#: plugins/ktstandard/KTWebDAVDashletPlugin.php:66 +msgid "WebDAV Connection Information" +msgstr "" + +#: plugins/ktstandard/KTWebDAVDashletPlugin.php:50 +msgid "WebDAV Dashlet Plugin" +msgstr "" + +#: i18n/templates.c:23 +msgid "Weeks" +msgstr "" + +#: lib/util/ktutil.inc:439 +msgid "Weird WhereClause passed" +msgstr "" + +#: plugins/ktcore/KTDashlets.php:89 +msgid "Welcome message" +msgstr "" + +#: plugins/ktcore/KTDashlets.php:56 +#, php-format +msgid "Welcome to %s" +msgstr "" + +#: i18n/templates.c:2342 i18n/templates.c:2354 +msgid "What is admin mode?" +msgstr "" + +#: search2/ajax/metadata.php:44 +msgid "What is required? fieldsets or fields?" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:469 +msgid "When a document has this workflow applied to it, which state should it initially have." +msgstr "" + +#: i18n/templates.c:7526 +msgid "When a document is in a workflow state, that state can override some or all of the permissions that would \"normally\" be assigned to the document (e.g. via the folder it is in). It can also restrict which document actions are available." +msgstr "" + +#: i18n/templates.c:3398 +msgid "When restoring from backups or checking that everything is functioning correctly with your DMS, it is important to know that all files that've been added to the system are present, and that no extraneous files have been found in the repository. This page shows you any such issues which you should investigate." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:162 +msgid "Whether to use Transaction Layer Security (TLS), which encrypts traffic to and from the LDAP server" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:141 +#: plugins/ktcore/admin/groupManagement.php:584 +msgid "Which Unit is this group part of?" +msgstr "" + +#: i18n/templates.c:7934 +msgid "While in this workflow state, additional permissions may be given. This is done either to expose the document to more users or to allow a particular role to be fulfilled before a workflow transition can be accomplished." +msgstr "" + +#: plugins/commercial/wintools/BaobabPlugin.php:69 +msgid "Windows Tools: Key Management" +msgstr "" + +#: i18n/templates.c:3311 +msgid "Within #appname# it is possible for users to create links between related documents. Link types may include constructs such as \"associated with\" and \"duplicated by\". Please create link types required by your organisation below." +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:118 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:243 +#: plugins/multiselect/inetbasic.inc.php:181 +#: plugins/multiselect/inetbasic.inc.php:342 +#: plugins/multiselect/inetbasic.inc.php:396 +msgid "Within a given fieldset, each field needs a unique name." +msgstr "" + +#: search2/indexing/extractors/WordExtractor.inc.php:12 +msgid "Word Extractor" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1770 +#: search2/search/fields/WorkflowField.inc.php:44 i18n/templates.c:329 +#: i18n/templates.c:2000 i18n/templates.c:7862 i18n/templates.c:8648 +msgid "Workflow" +msgstr "" + +#: lib/workflow/workflowutil.inc.php:178 +#, php-format +msgid "Workflow \"%s\" started." +msgstr "" + +#: i18n/templates.c:7562 +msgid "Workflow Admin" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:131 +msgid "Workflow Administration" +msgstr "" + +#: i18n/templates.c:8606 +msgid "Workflow Allocation Plugins" +msgstr "" + +#: i18n/templates.c:8630 +msgid "Workflow Allocation by Document Type" +msgstr "" + +#: plugins/ktstandard/workflow/TypeAssociator.php:70 +#: plugins/ktstandard/workflow/TypeAssociator.php:132 +msgid "Workflow Allocation by Document Types" +msgstr "" + +#: i18n/templates.c:8639 +msgid "Workflow Allocations" +msgstr "" + +#: plugins/ktstandard/KTWorkflowAssociation.php:55 +msgid "Workflow Association Plugin" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:71 +msgid "Workflow Details" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:77 +#: plugins/ktcore/admin/workflowsv2.php:1871 +msgid "Workflow Effects" +msgstr "" + +#: i18n/templates.c:7550 +msgid "Workflow Effects Overview: #name#" +msgstr "" + +#: search2/search/fields/WorkflowIDField.inc.php:44 +msgid "Workflow ID" +msgstr "" + +#: i18n/templates.c:722 +msgid "Workflow Info" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:78 +#: plugins/ktcore/admin/workflowsv2.php:461 +msgid "Workflow Name" +msgstr "" + +#: lib/dashboard/Notification.inc.php:436 +msgid "Workflow Notification cleared." +msgstr "" + +#: lib/dashboard/Notification.inc.php:405 +#, php-format +msgid "Workflow Notification: %s" +msgstr "" + +#: i18n/templates.c:7601 +msgid "Workflow Notifications" +msgstr "" + +#: i18n/templates.c:8045 +msgid "Workflow Overview" +msgstr "" + +#: plugins/ktstandard/workflow/adminpage.php:69 +msgid "Workflow Plugins" +msgstr "" + +#: lib/browse/Criteria.inc:871 plugins/ktcore/KTColumns.inc.php:459 +#: plugins/ktcore/KTCorePlugin.php:144 +#: search2/search/fields/WorkflowStateField.inc.php:44 +msgid "Workflow State" +msgstr "" + +#: search2/search/fields/WorkflowStateIDField.inc.php:44 +msgid "Workflow State ID" +msgstr "" + +#: i18n/templates.c:6290 +msgid "Workflow actions may be assigned to certain roles within the DMS. User groups are allocated to roles on a per-directory basis and are inherited from the root folder of the DMS. Roles may for example include \"Document Creator\", \"Document Reviewer\", \"Document Publisher\"." +msgstr "" + +#: plugins/ktstandard/workflow/TypeAssociator.php:47 +msgid "Workflow allocation by document type" +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:51 +msgid "Workflow allocation by location" +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:165 +msgid "Workflow assignment removed." +msgstr "" + +#: plugins/ktstandard/workflow/FolderAssociator.php:180 +msgid "Workflow assignment updated." +msgstr "" + +#: i18n/templates.c:7847 +msgid "Workflow for" +msgstr "" + +#: i18n/templates.c:7850 +msgid "Workflow is a description of a document's lifecycle. It is made up of workflow states, which describe where in the lifecycle the document is, and workflow transitions, which describe the next steps within the lifecycle of the document." +msgstr "" + +#: i18n/templates.c:8084 +msgid "Workflow is a description of a document's lifecycle. It is made up of workflow states, which describe where in the lifecycle the document is, and workflow transitions, which describe the next steps within the lifecycle of the document." +msgstr "" + +#: i18n/templates.c:7565 +msgid "Workflow is a description of a document's lifecycle. It is made up of workflow states, which describe where in the lifecycle the document is, and workflow transitions, which describe the next steps within the lifecycle of the document." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:714 +msgid "Workflow process updated." +msgstr "" + +#: lib/workflow/workflowutil.inc.php:183 +msgid "Workflow removed from document." +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1873 +msgid "Workflow started" +msgstr "" + +#: lib/workflow/workflowutil.inc.php:595 +#, php-format +msgid "Workflow state changed from %s to %s" +msgstr "" + +#: i18n/transactions.c:16 +msgid "Workflow state transition" +msgstr "" + +#: plugins/rssplugin/KTrss.inc.php:407 i18n/templates.c:2051 +msgid "Workflow status" +msgstr "" + +#: i18n/templates.c:8633 +msgid "Workflow types are allocated by Document Type in this #appname# installation. Documents will be assigned a workflow based on their document type and will have their allocated workflows changed if their document type changes. Naturally, if the workflow changes then the documents will lose any \"progress\" in the old workflow." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:537 +msgid "Workflow updated." +msgstr "" + +#: i18n/templates.c:7277 +msgid "Workflow:" +msgstr "" + +#: plugins/ktstandard/documentpreview/documentPreview.php:238 +msgid "Workflow: " +msgstr "" + +#: i18n/templates.c:7775 +msgid "Workflow: #name#" +msgstr "" + +#: plugins/ktcore/KTCorePlugin.php:299 +#: plugins/ktcore/admin/workflowsv2.php:127 i18n/templates.c:8081 +msgid "Workflows" +msgstr "" + +#: i18n/templates.c:7817 +msgid "Workflows can control which actions (edit metadata, download, etc.) are available on a given document. Please specify which of the actions controlled by this workflow are available when the document is in this state." +msgstr "" + +#: i18n/permissions.c:10 +msgid "Write" +msgstr "" + +#: search2/indexing/extractors/XMLExtractor.inc.php:44 +msgid "XML Text Extractor" +msgstr "" + +#: lib/browse/Criteria.inc:995 i18n/templates.c:29 +msgid "Years" +msgstr "" + +#: i18n/templates.c:284 i18n/templates.c:3959 i18n/templates.c:4664 +#: i18n/templates.c:5189 i18n/templates.c:5282 i18n/templates.c:5288 +#: i18n/templates.c:5366 i18n/templates.c:5372 i18n/templates.c:5789 +#: i18n/templates.c:5873 i18n/templates.c:5879 +msgid "Yes" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:225 +#: plugins/ktstandard/KTSubscriptions.php:243 +msgid "You are already subscribed to that document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:469 +#: plugins/ktstandard/KTSubscriptions.php:495 +msgid "You are already subscribed to this folder" +msgstr "" + +#: admin.php:164 lib/templating/kt3template.inc.php:167 +msgid "You are attempting to access Administration" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:271 +msgid "You are attempting to add a document link" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:312 +msgid "You are attempting to add an external document link" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:187 +msgid "You are attempting to delete a document link" +msgstr "" + +#: lib/templating/kt3template.inc.php:401 +msgid "You are attempting to modify Preferences" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:832 +#: plugins/commercial/alerts/alerts.php:1000 +msgid "You are attempting to modify alerts" +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:323 +msgid "You are attempting to modify permissions" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:372 plugins/ktcore/KTPermissions.php:609 +#: plugins/ktcore/KTPermissions.php:674 +msgid "You are attempting to modify roles" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1835 +msgid "You are attempting to modify the document workflow" +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:103 +msgid "You are attempting to perform a bulk import" +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:104 +#: plugins/multiselect/BulkImport.php:212 +#: plugins/multiselect/BulkUpload.php:237 +msgid "You are attempting to perform a bulk upload" +msgstr "" + +#: plugins/ktcore/folder/Rename.php:70 +msgid "You are attempting to rename a folder" +msgstr "" + +#: plugins/ktcore/document/Rename.php:93 +msgid "You are attempting to rename the document" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1839 +msgid "You are attempting to transition the document workflow" +msgstr "" + +#: lib/session/Session.inc:274 thirdparty/pear/PEAR.php:882 +msgid "You are coming from a different IP address than the session requires" +msgstr "" + +#: i18n/templates.c:6869 +msgid "You are currently editing the saved search:" +msgstr "" + +#: rss.php:100 +msgid "You are either not authorised to view details on this document or it does not exist. Please visit http://" +msgstr "" + +#: rss.php:125 +msgid "You are either not authorised to view details on this folder or it does not exist. Please visit http://" +msgstr "" + +#: i18n/templates.c:2072 i18n/templates.c:2441 +msgid "You are here" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:471 +msgid "You are not allowed to create folders in the destination." +msgstr "" + +#: plugins/commercial/documentcomparison/DocumentComparison.php:46 +#: plugins/ktcore/KTDocumentActions.php:232 view.php:135 view.php:294 +msgid "You are not allowed to view this document" +msgstr "" + +#: browse.php:363 browse.php:407 +msgid "You are not an administrator" +msgstr "" + +#: plugins/commercial/network/gotodocumentid/GoToDocumentIdPlugin.php:110 +msgid "You are not permitted to access that document." +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:278 +msgid "You are not subscribed to this document" +msgstr "" + +#: i18n/templates.c:2747 +msgid "You are required to change your password as it has expired." +msgstr "" + +#: i18n/templates.c:8594 +msgid "You are subscribed to the folders and documents listed below. You can remove your subscription by selecting the folders and documents to which you no longer wish to subscribe." +msgstr "" + +#: i18n/templates.c:7541 +msgid "You can control when and by whom transitions can be performed by setting up various guards. These can include permissions, roles, groups or a variety of other restriction conditions." +msgstr "" + +#: i18n/templates.c:1820 +msgid "You can copy the following link into any RSS aggregator to create a feed to the selected document." +msgstr "" + +#: i18n/templates.c:1829 +msgid "You can copy the following link into any RSS aggregator to create a feed to the selected folder." +msgstr "" + +#: i18n/templates.c:7235 +msgid "You can save this search:" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:186 +#: plugins/ktcore/admin/workflowsv2.php:797 +#, php-format +msgid "You cannot have duplicate state names: %s" +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:209 +#: plugins/ktcore/admin/workflowsv2.php:904 +#, php-format +msgid "You cannot have duplicate transition names: %s" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1309 +msgid "You cannot move the document within the same folder." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:800 +#, php-format +msgid "You cannot use state names that are in use: %s" +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:907 +#, php-format +msgid "You cannot use transition names that are in use: %s" +msgstr "" + +#: lib/validation/dispatchervalidation.inc.php:281 +msgid "You did not select a valid document to upload" +msgstr "" + +#: i18n/templates.c:6410 +msgid "You do not have enough available licenses to add more active users. Please disable some existing ones if you wish to add new active users." +msgstr "" + +#: plugins/ktcore/folder/Permissions.php:357 +msgid "You do not have permission to alter security settings." +msgstr "" + +#: i18n/templates.c:7892 +msgid "You do not have permission to change the workflow that is assigned to this document." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:389 +msgid "You do not have permission to close this thread" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:536 +msgid "You do not have permission to copy these items. " +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1334 +#: plugins/ktcore/KTDocumentActions.php:1573 +msgid "You do not have permission to create new documents in that folder." +msgstr "" + +#: plugins/commercial/network/quicklinks/manageQuicklinks.php:79 +msgid "You do not have permission to delete that quicklink." +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:398 +msgid "You do not have permission to delete these items. " +msgstr "" + +#: plugins/ktcore/KTBulkActions.php:522 plugins/ktcore/KTBulkActions.php:768 +msgid "You do not have permission to move items to this location" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:215 +#: plugins/ktstandard/KTDocumentLinks.php:301 +msgid "You do not have sufficient permissions to add a document link" +msgstr "" + +#: plugins/commercial/shortcuts/FolderAddShortcutAction.php:109 +msgid "You do not have sufficient permissions to add a shortcut to this folder" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:467 +msgid "You do not have sufficient permissions to delete a link" +msgstr "" + +#: lib/actions/bulkaction.php:658 plugins/ktcore/KTBulkActions.php:1129 +#: plugins/ktcore/KTBulkActions.php:1327 +msgid "You do not have the required permissions" +msgstr "" + +#: i18n/templates.c:4988 +msgid "You do not have the required permissions to view the root folder. Please contact your system administrator for assistance." +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:230 +#: plugins/ktstandard/KTSubscriptions.php:248 +msgid "You have been subscribed to this document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:482 +#: plugins/ktstandard/KTSubscriptions.php:500 +msgid "You have been subscribed to this folder" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:480 +msgid "You have been subscribed to this folder and its subfolders" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:283 +#: plugins/ktstandard/KTSubscriptions.php:301 +msgid "You have been unsubscribed from this document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:535 +#: plugins/ktstandard/KTSubscriptions.php:552 +msgid "You have been unsubscribed from this folder" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:539 +msgid "You have entered an invalid character in your name." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:535 +msgid "You have entered an invalid character in your username." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:662 +msgid "You have entered an invalid character." +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:666 +msgid "You have entered an invalid name." +msgstr "" + +#: i18n/templates.c:3026 +msgid "You have no documents which are currently checked out." +msgstr "" + +#: i18n/templates.c:1283 +msgid "You have no keys currently registered for Windows Tools." +msgstr "" + +#: i18n/templates.c:2 +msgid "You have no orphaned folders." +msgstr "" + +#: lib/search/searchutil.inc.php:542 +msgid "You have no permissions" +msgstr "" + +#: i18n/templates.c:896 +msgid "You have no quicklinks." +msgstr "" + +#: i18n/templates.c:8591 +msgid "You have no subscriptions" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:449 +msgid "You have not been assigned a license key, and none are available. Please contact the System Administrator." +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:444 +msgid "" +"You have requested to reset the password for your account. To confirm that the request was submitted by you\n" +" click on the link below, you will then be able to reset your password." +msgstr "" + +#: plugins/ktcore/document/edit.php:470 +#, php-format +msgid "You have selected a new document type: %s. " +msgstr "" + +#: ktoffice/controllers/list.php:180 ktoffice/controllers/list.php:304 +msgid "You may add content to this folder" +msgstr "" + +#: i18n/templates.c:6281 +msgid "You may change details about yourself by editing the entries below. Once you have completed the form, click on Update your details." +msgstr "" + +#: i18n/templates.c:6275 +msgid "You may change your password by entering it in the fields below. Your system administrator may have defined certain rules (such as minimum password length) that your password must abide by." +msgstr "" + +#: ktoffice/controllers/list.php:381 +msgid "You may edit this document" +msgstr "" + +#: ktoffice/controllers/list.php:180 ktoffice/controllers/list.php:304 +msgid "You may not add content to this folder" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:715 +msgid "You may only have " +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:305 +msgid "You most certainly must select at least one fieldset" +msgstr "" + +#: lib/dispatcher.inc.php:329 +msgid "You must be logged in to perform this action" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:430 +#: plugins/multiselect/inetbasic.inc.php:617 +msgid "You must have at least 1 new lookup value." +msgstr "" + +#: login.php:349 plugins/passwordResetPlugin/loginResetDispatcher.php:365 +msgid "You must have cookies enabled to use the document management system." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:430 +#: plugins/ktcore/admin/userManagement.php:505 +msgid "You must provide a name" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1884 +msgid "You must provide a reason for the transition" +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:111 +msgid "You must provide a title" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:435 +msgid "You must provide a username" +msgstr "" + +#: plugins/ktcore/KTValidators.php:232 +msgid "You must provide a value for this field." +msgstr "" + +#: plugins/ktcore/KTValidators.php:62 +#, php-format +msgid "You must provide a value which is at least %d characters long." +msgstr "" + +#: plugins/ktcore/KTValidators.php:64 +#, php-format +msgid "You must provide a value which is at most %d characters long." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:183 +#: plugins/ktcore/admin/workflowsv2.php:794 +msgid "You must provide at least one state name." +msgstr "" + +#: plugins/ktcore/admin/workflowsv2.php:901 +msgid "You must provide at least one transition name." +msgstr "" + +#: plugins/ktcore/admin/documentCheckout.php:74 +#: plugins/ktcore/admin/documentCheckout.php:105 +msgid "You must select a document to check in first." +msgstr "" + +#: plugins/ktcore/KTValidators.php:252 +msgid "You must select a file to upload." +msgstr "" + +#: plugins/ktcore/admin/documentTypes.php:231 +msgid "You must select at least one fieldset" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:569 +msgid "You must specify a name for the group." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:321 +msgid "You must specify a name for the user." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:500 +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:323 +msgid "You must specify a new username." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:516 +msgid "You must specify a numeric value for maximum sessions." +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:298 +#: plugins/ktcore/admin/userManagement.php:529 +msgid "You must specify a password for the user." +msgstr "" + +#: plugins/rssplugin/manageRSSFeeds.php:151 +msgid "You must specify a title for the rss feed." +msgstr "" + +#: lib/validation/basevalidator.inc.php:53 +msgid "You must specify a variable name" +msgstr "" + +#: i18n/templates.c:4979 +msgid "You need to enter text to be searched" +msgstr "" + +#: plugins/ktcore/admin/conditions.php:193 +#: plugins/ktcore/admin/conditions.php:233 +#: plugins/ktcore/admin/savedSearch.php:175 +#: plugins/ktcore/admin/savedSearch.php:208 search/booleanSearch.php:109 +#: search/booleanSearch.php:138 search/booleanSearch.php:211 +msgid "You need to have at least 1 condition." +msgstr "" + +#: i18n/templates.c:4781 +msgid "You need to have permission to perform this action" +msgstr "" + +#: lib/session/Session.inc:240 lib/session/Session.inc:252 +#: thirdparty/pear/PEAR.php:881 +msgid "You need to login to access this page" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1894 +#: plugins/ktcore/KTDocumentActions.php:2001 +msgid "You no longer have permission to view this document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:296 +msgid "You were not subscribed to that document" +msgstr "" + +#: plugins/ktstandard/KTSubscriptions.php:530 +#: plugins/ktstandard/KTSubscriptions.php:547 +msgid "You were not subscribed to that folder" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:382 +msgid "You're not authorized to create a shortcut to this document" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:704 +msgid "You're not authorized to create a shortcut to this folder" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:377 +#: lib/foldermanagement/folderutil.inc.php:699 +msgid "You're not authorized to create shortcuts" +msgstr "" + +#: lib/foldermanagement/folderutil.inc.php:765 +msgid "You're not authorized to delete shortcuts" +msgstr "" + +#: lib/documentmanagement/documentutil.inc.php:450 +msgid "You're not authorized to delete this shortcut" +msgstr "" + +#: plugins/ktcore/KTDashlets.php:186 +msgid "Your Checked-out Documents" +msgstr "" + +#: preferences.php:68 +msgid "Your Details" +msgstr "" + +#: preferences.php:179 +msgid "Your Password" +msgstr "" + +#: preferences.php:157 +msgid "Your Preferences" +msgstr "" + +#: i18n/templates.c:1799 +msgid "Your RSS feed list is empty." +msgstr "" + +#: lib/session/Session.inc:69 thirdparty/pear/PEAR.php:884 +msgid "Your account has been disabled. Please contact the system administrator for assistance." +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:309 +#: plugins/commercial/wintools/baobabkeyutil.inc.php:364 +msgid "Your account has been disabled. Please contact your system administrator for assistance." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:246 +#, php-format +msgid "Your colleague, %s, wishes you to view the attached document entitled '%s'." +msgstr "" + +#: plugins/ktstandard/KTEmail.php:311 +#, php-format +msgid "Your colleague, %s, wishes you to view the document entitled '%s'." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:138 +#: plugins/ktstandard/KTDiscussion.php:263 +msgid "Your contribution to the discussion in this thread" +msgstr "" + +#: preferences.php:256 +msgid "Your details have been updated." +msgstr "" + +#: i18n/templates.c:4586 +msgid "Your document has been checked in." +msgstr "" + +#: i18n/templates.c:4574 +msgid "Your document has been checked out." +msgstr "" + +#: i18n/templates.c:4562 +msgid "Your document has been downloaded." +msgstr "" + +#: i18n/templates.c:4775 +msgid "Your document has been saved to KnowledgeTree" +msgstr "" + +#: i18n/templates.c:4550 +msgid "Your document has been saved." +msgstr "" + +#: i18n/templates.c:4580 +msgid "Your document has not been checked in." +msgstr "" + +#: i18n/templates.c:4568 +msgid "Your document has not been checked out." +msgstr "" + +#: i18n/templates.c:4556 +msgid "Your document has not been downloaded." +msgstr "" + +#: i18n/templates.c:4538 +msgid "Your document has not been saved." +msgstr "" + +#: i18n/templates.c:4973 +msgid "Your document was not saved to the server" +msgstr "" + +#: lib/import/bulkimport.inc.php:137 +msgid "Your documents have been added to this folder and not the folder structure within the upload file because you do not have permission to add any folders." +msgstr "" + +#: preferences.php:84 +msgid "Your email address. Notifications and alerts are mailed to this address if email notifications is set below. e.g. jsmith@acme.com" +msgstr "" + +#: preferences.php:77 +msgid "Your full name. This is shown in reports and listings. e.g. John Smith" +msgstr "" + +#: i18n/templates.c:1136 +msgid "Your license will expire in #days# day(s). On expiration of your license certain functionality within the DMS will be disabled." +msgstr "" + +#: plugins/ktcore/admin/workflow/newworkflow.inc.php:404 +msgid "Your new workflow has been created. You may want to configure security and notifications from the menu on the left." +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:488 +msgid "Your password could not be reset, please try again." +msgstr "" + +#: preferences.php:219 +msgid "Your password has been changed." +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:501 +msgid "Your password has been successfully reset, click the link below to login." +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:508 +msgid "Your password has been successfully reset." +msgstr "" + +#: lib/authentication/builtinauthenticationprovider.inc.php:177 +msgid "Your password has expired" +msgstr "" + +#: preferences.php:148 +#, php-format +msgid "Your password is too short - passwords must be at least %d characters long." +msgstr "" + +#: plugins/ktcore/KTValidators.php:327 +msgid "Your passwords do not match." +msgstr "" + +#: ktapi/ktapi.inc.php:4395 +msgid "Your saved search did not return any results" +msgstr "" + +#: ktapi/ktapi.inc.php:4226 plugins/search2/openSearch.php:114 +msgid "Your search did not return any results" +msgstr "" + +#: lib/dispatcher.inc.php:377 +msgid "Your session has expired, please log in again." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1273 +#, php-format +msgid "Zero Byte documents do not need to be indexed: %d" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:739 +msgid "add a new group" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:121 +#: plugins/ktcore/admin/userManagement.php:182 +msgid "add a new user" +msgstr "" + +#: i18n/templates.c:2891 i18n/templates.c:2936 +msgid "add another set of criteria" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:98 +#: plugins/multiselect/inetbasic.inc.php:161 +msgid "add field" +msgstr "" + +#: plugins/ktcore/KTFolderActions.php:154 +msgid "add folder" +msgstr "" + +#: ktoffice/controllers/list.php:165 ktoffice/controllers/list.php:280 +msgid "add folder, " +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:383 +#: plugins/multiselect/inetbasic.inc.php:567 +msgid "add lookup values" +msgstr "" + +#: i18n/templates.c:5222 +msgid "add new subcategory" +msgstr "" + +#: lib/browse/Criteria.inc:472 i18n/templates.c:1403 i18n/templates.c:6614 +msgid "after" +msgstr "" + +#: lib/browse/Criteria.inc:444 +msgid "after " +msgstr "" + +#: lib/util/ktutil.inc:212 +msgid "ago" +msgstr "" + +#: search/booleanSearch.php:281 search/booleanSearch.php:286 +#: i18n/templates.c:1490 i18n/templates.c:1571 i18n/templates.c:1583 +#: i18n/templates.c:2813 i18n/templates.c:2825 i18n/templates.c:2855 +#: i18n/templates.c:2867 i18n/templates.c:2900 i18n/templates.c:2912 +#: i18n/templates.c:4508 i18n/templates.c:6770 i18n/templates.c:6782 +msgid "all" +msgstr "" + +#: i18n/templates.c:1100 +msgid "and" +msgstr "" + +#: search/booleanSearch.php:281 search/booleanSearch.php:286 +#: i18n/templates.c:1493 i18n/templates.c:1574 i18n/templates.c:1586 +#: i18n/templates.c:2816 i18n/templates.c:2828 i18n/templates.c:2858 +#: i18n/templates.c:2870 i18n/templates.c:2903 i18n/templates.c:2915 +#: i18n/templates.c:4511 i18n/templates.c:6773 i18n/templates.c:6785 +msgid "any" +msgstr "" + +#: plugins/ktcore/KTAssist.php:55 +msgid "assistance" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:820 +#: plugins/ktcore/admin/fieldsets/basic.inc.php:859 +#: plugins/multiselect/inetbasic.inc.php:1106 +#: plugins/multiselect/inetbasic.inc.php:1155 +msgid "attach keywords" +msgstr "" + +#: lib/browse/Criteria.inc:473 i18n/templates.c:1409 i18n/templates.c:6620 +msgid "before" +msgstr "" + +#: lib/browse/Criteria.inc:450 +msgid "before " +msgstr "" + +#: search2/search/exprConstants.inc.php:61 i18n/templates.c:1406 +#: i18n/templates.c:1436 i18n/templates.c:6617 i18n/templates.c:6647 +msgid "between" +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:73 +msgid "browse" +msgstr "" + +#: config/siteMap.inc:57 +msgid "browse documents" +msgstr "" + +#: plugins/ktcore/folder/BulkImport.php:75 +#: plugins/multiselect/BulkImport.php:108 +msgid "bulk import" +msgstr "" + +#: plugins/ktcore/folder/BulkUpload.php:77 +#: plugins/multiselect/BulkUpload.php:129 +msgid "bulk upload" +msgstr "" + +#: i18n/templates.c:158 i18n/templates.c:2093 i18n/templates.c:2114 +#: i18n/templates.c:2135 i18n/templates.c:2144 i18n/templates.c:2165 +#: i18n/templates.c:2204 i18n/templates.c:2231 i18n/templates.c:2249 +#: i18n/templates.c:2273 i18n/templates.c:2294 i18n/templates.c:2312 +#: i18n/templates.c:2324 +msgid "by #actor_name#" +msgstr "" + +#: i18n/templates.c:1457 i18n/templates.c:6668 +msgid "bytes" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:933 +msgid "cancel checkout" +msgstr "" + +#: i18n/templates.c:2750 i18n/templates.c:6371 i18n/templates.c:6383 +msgid "change password" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:253 +msgid "change user password" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:506 +msgid "checkout" +msgstr "" + +#: i18n/templates.c:1343 +msgid "cleanup" +msgstr "" + +#: i18n/templates.c:4523 +msgid "close" +msgstr "" + +#: i18n/templates.c:3470 +msgid "compare" +msgstr "" + +#: view.php:306 +msgid "compare versions" +msgstr "" + +#: i18n/templates.c:359 i18n/templates.c:3467 +msgid "comparing against this version" +msgstr "" + +#: i18n/templates.c:1964 i18n/templates.c:5450 +msgid "conditional data." +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:120 +#, php-format +msgid "confirm expunge of %d documents" +msgstr "" + +#: plugins/ktcore/admin/documentCheckout.php:70 +msgid "confirm forced check-in" +msgstr "" + +#: plugins/ktcore/admin/archivedDocuments.php:140 +#, php-format +msgid "confirm restore of %d documents" +msgstr "" + +#: lib/browse/Criteria.inc:239 search2/search/exprConstants.inc.php:60 +#: i18n/templates.c:1514 i18n/templates.c:1532 i18n/templates.c:6713 +#: i18n/templates.c:6731 +msgid "contains" +msgstr "" + +#: i18n/templates.c:2420 +msgid "content and metadata" +msgstr "" + +#: i18n/templates.c:5549 i18n/templates.c:5618 +msgid "controls the values available in" +msgstr "" + +#: i18n/templates.c:5558 i18n/templates.c:5627 +msgid "controls the values of the following fields" +msgstr "" + +#: i18n/templates.c:5513 +msgid "create behaviour" +msgstr "" + +#: lib/ktentity.inc:537 +#, php-format +msgid "create for class %s failed" +msgstr "" + +#: i18n/templates.c:6017 i18n/templates.c:8474 +msgid "create group" +msgstr "" + +#: i18n/templates.c:6296 +msgid "create new role" +msgstr "" + +#: i18n/templates.c:6050 +msgid "create unit" +msgstr "" + +#: i18n/templates.c:6065 +msgid "create user" +msgstr "" + +#: i18n/templates.c:3566 +msgid "current version" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:90 +#: plugins/ktcore/scheduler/taskScheduler.php:72 +msgid "daily" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:985 +msgid "day" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerDashlet.php:133 +#: plugins/ktcore/scheduler/schedulerDashlet.php:136 i18n/templates.c:968 +#: i18n/templates.c:1058 i18n/templates.c:1082 +msgid "day(s)" +msgstr "" + +#: plugins/commercial/alerts/alertTask.php:143 +#: plugins/commercial/alerts/alertTask.php:243 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:804 +#: plugins/commercial/alerts/docTypeAlerts.inc.php:864 +msgid "day(s) - Comment: " +msgstr "" + +#: plugins/commercial/alerts/alerts.php:987 +#: plugins/commercial/wintools/key.inc.php:85 i18n/templates.c:110 +#: i18n/templates.c:1475 i18n/templates.c:6686 +msgid "days" +msgstr "" + +#: search/booleanSearch.php:68 +msgid "defining search" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:860 +#: plugins/multiselect/inetbasic.inc.php:1156 i18n/templates.c:1376 +#: i18n/templates.c:5168 i18n/templates.c:5435 +msgid "delete" +msgstr "" + +#: i18n/templates.c:3587 +msgid "delete version" +msgstr "" + +#: i18n/templates.c:3341 +msgid "deleting a link type will delete all links of that type within the system." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1740 +#, php-format +msgid "diagnose(): '%s' is not of type DocumentExtractor" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1718 +#, php-format +msgid "diagnose: '%s' does not have extension '%s'." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1312 +#, php-format +msgid "diagnose: Not indexing docid: %d because extractor '%s' is disabled." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1727 +#, php-format +msgid "diagnose: class '%s' does not exist." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1747 +#, php-format +msgid "diagnose: class '%s' does not support any types." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1733 +#, php-format +msgid "diagnose: extractor '%s' is disabled." +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:132 +#: plugins/ktstandard/KTDiscussion.php:250 +msgid "discussion" +msgstr "" + +#: view.php:168 +msgid "document details" +msgstr "" + +#: lib/browse/Criteria.inc:238 i18n/templates.c:1517 i18n/templates.c:1535 +#: i18n/templates.c:6716 i18n/templates.c:6734 +msgid "does not contain" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:254 +#: plugins/ktcore/admin/documentTypes.php:179 i18n/templates.c:1373 +#: i18n/templates.c:5165 i18n/templates.c:5432 i18n/templates.c:5828 +msgid "edit" +msgstr "" + +#: i18n/templates.c:5537 +msgid "edit field" +msgstr "" + +#: plugins/ktcore/admin/documentFieldsv2.php:394 +#: plugins/multiselect/InetdocumentFieldsv2.php:464 +msgid "edit fieldset" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:116 +msgid "edit group" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:357 +msgid "edit groups" +msgstr "" + +#: i18n/templates.c:3356 i18n/templates.c:3359 +msgid "edit link type" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:645 +#: plugins/multiselect/inetbasic.inc.php:883 +msgid "edit lookup tree" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:110 +msgid "editing LDAP details" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:148 +msgid "editing LDAP settings" +msgstr "" + +#: search2/search/exprConstants.inc.php:63 i18n/templates.c:1529 +#: i18n/templates.c:6728 +msgid "ends with" +msgstr "" + +#: i18n/templates.c:1418 i18n/templates.c:1451 i18n/templates.c:6629 +#: i18n/templates.c:6662 +msgid "equal to" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:94 +#: plugins/ktcore/scheduler/taskScheduler.php:76 +msgid "every 10 minutes" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:97 +#: plugins/ktcore/scheduler/taskScheduler.php:79 +msgid "every 30 seconds" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:95 +#: plugins/ktcore/scheduler/taskScheduler.php:77 +msgid "every 5 minutes" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:92 +#: plugins/ktcore/scheduler/taskScheduler.php:74 +msgid "every half hour" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:96 +#: plugins/ktcore/scheduler/taskScheduler.php:78 +msgid "every minute" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:93 +#: plugins/ktcore/scheduler/taskScheduler.php:75 +msgid "every quarter hour" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:57 +#: plugins/ktcore/KTDocumentActions.php:371 +#, php-format +msgid "fDocumentId=%d" +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:583 +msgid "failed to create group." +msgstr "" + +#: plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php:351 +msgid "failed to create user" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:563 +msgid "failed to create user." +msgstr "" + +#: i18n/templates.c:2840 i18n/templates.c:2885 i18n/templates.c:2930 +#: i18n/templates.c:4490 +msgid "first select a type of query" +msgstr "" + +#: i18n/templates.c:3203 +msgid "force checkin" +msgstr "" + +#: i18n/templates.c:2129 i18n/templates.c:2291 +msgid "from \"#location_name#\"" +msgstr "" + +#: i18n/templates.c:2168 i18n/templates.c:2267 +msgid "from the folder \"#location_name#\"" +msgstr "" + +#: search2/indexing/extractorCore.inc.php:455 +msgid "getCommandLine is not implemented" +msgstr "" + +#: i18n/templates.c:1466 i18n/templates.c:6677 +msgid "gigabytes" +msgstr "" + +#: i18n/templates.c:1424 i18n/templates.c:1445 i18n/templates.c:1472 +#: i18n/templates.c:6635 i18n/templates.c:6656 i18n/templates.c:6683 +msgid "greater than" +msgstr "" + +#: i18n/templates.c:1427 i18n/templates.c:1448 i18n/templates.c:6638 +#: i18n/templates.c:6659 +msgid "greater than or equal to" +msgstr "" + +#: i18n/templates.c:2183 +msgid "has added to the discussion around document" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:412 +msgid "has been archived" +msgstr "" + +#: plugins/commercial/alerts/alerts.php:410 +msgid "has been deleted" +msgstr "" + +#: i18n/templates.c:959 i18n/templates.c:1049 +msgid "have" +msgstr "" + +#: i18n/templates.c:962 i18n/templates.c:1052 +msgid "have not" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:79 +msgid "history" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerDashlet.php:136 +#: plugins/ktcore/scheduler/schedulerDashlet.php:139 +msgid "hour(s)" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:91 +#: plugins/ktcore/scheduler/taskScheduler.php:73 +msgid "hourly" +msgstr "" + +#: i18n/templates.c:155 i18n/templates.c:2147 i18n/templates.c:2228 +msgid "in the folder \"#location_name#\"" +msgstr "" + +#: i18n/templates.c:2201 +msgid "in the folder \"#location_name#\" has been downloaded" +msgstr "" + +#: search2/documentProcessor/documentProcessor.inc.php:184 +#, php-format +msgid "indexDocuments: Cannot resolve document id %d: %s." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1332 +#, php-format +msgid "indexDocuments: Filename for document id %d starts with a tilde (~). This is assumed to be a temporary file. This is ignored." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1350 +#, php-format +msgid "indexDocuments: extractor '%s' is not a document extractor class." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1359 +#, php-format +msgid "indexDocuments: source file '%s' for document %d does not exist." +msgstr "" + +#: i18n/templates.c:4229 +msgid "inherited from parent folder." +msgstr "" + +#: lib/browse/Criteria.inc:236 search2/search/exprConstants.inc.php:59 +#: i18n/templates.c:1385 i18n/templates.c:1391 i18n/templates.c:1397 +#: i18n/templates.c:1484 i18n/templates.c:1496 i18n/templates.c:1502 +#: i18n/templates.c:1508 i18n/templates.c:1538 i18n/templates.c:6596 +#: i18n/templates.c:6602 i18n/templates.c:6608 i18n/templates.c:6695 +#: i18n/templates.c:6701 i18n/templates.c:6707 i18n/templates.c:6737 +msgid "is" +msgstr "" + +#: lib/browse/Criteria.inc:235 search2/search/exprConstants.inc.php:67 +#: i18n/templates.c:1388 i18n/templates.c:1394 i18n/templates.c:1400 +#: i18n/templates.c:1487 i18n/templates.c:1499 i18n/templates.c:1505 +#: i18n/templates.c:1511 i18n/templates.c:1541 i18n/templates.c:6599 +#: i18n/templates.c:6605 i18n/templates.c:6611 i18n/templates.c:6698 +#: i18n/templates.c:6704 i18n/templates.c:6710 i18n/templates.c:6740 +msgid "is not" +msgstr "" + +#: plugins/ktcore/admin/expungeList.php:100 i18n/templates.c:3248 +msgid "items, 10 per page" +msgstr "" + +#: i18n/templates.c:1460 i18n/templates.c:6671 +msgid "kilobytes" +msgstr "" + +#: plugins/commercial/professional-reporting/admin/userReporting.php:86 +msgid "last login reporting" +msgstr "" + +#: i18n/templates.c:1430 i18n/templates.c:1439 i18n/templates.c:1469 +#: i18n/templates.c:6641 i18n/templates.c:6650 i18n/templates.c:6680 +msgid "less than" +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:81 +msgid "less than a day" +msgstr "" + +#: i18n/templates.c:1433 i18n/templates.c:1442 i18n/templates.c:6644 +#: i18n/templates.c:6653 +msgid "less than or equal to" +msgstr "" + +#: search2/search/exprConstants.inc.php:64 i18n/templates.c:1520 +#: i18n/templates.c:6719 +msgid "like" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinks.php:347 +#: plugins/ktstandard/KTDocumentLinks.php:409 +#: plugins/ktstandard/KTDocumentLinks.php:461 +msgid "link" +msgstr "" + +#: plugins/ktcore/admin/documentCheckout.php:54 +msgid "list checked out documents" +msgstr "" + +#: i18n/templates.c:4484 +msgid "loading..." +msgstr "" + +#: i18n/templates.c:965 i18n/templates.c:1055 +msgid "logged into the system in the last" +msgstr "" + +#: plugins/commercial/professional-reporting/admin/userReporting.php:163 +msgid "login activity" +msgstr "" + +#: plugins/commercial/professional-reporting/admin/userReporting.php:149 +#, php-format +msgid "login history for %s" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:456 +#: plugins/multiselect/inetbasic.inc.php:648 +msgid "manage lookup values" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:242 +#: plugins/ktcore/admin/groupManagement.php:398 +msgid "manage members" +msgstr "" + +#: i18n/templates.c:1853 +msgid "match #join#" +msgstr "" + +#: i18n/templates.c:1463 i18n/templates.c:6674 +msgid "megabytes" +msgstr "" + +#: i18n/templates.c:2423 +msgid "metadata" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1595 +#, php-format +msgid "migrateDocuments: Cannot write to '%s' for document id %d" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1629 +msgid "migrateDocuments: Completed!" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1585 +#, php-format +msgid "migrateDocuments: Could not get document %d's document! Removing content!" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1632 +msgid "migrateDocuments: Disabling 'Index Migration' task by removing scheduler entry." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1612 +#, php-format +msgid "migrateDocuments: Problem indexing document %d" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1564 +msgid "migrateDocuments: db error" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1510 +msgid "migrateDocuments: starting" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1514 +msgid "migrateDocuments: stopping - diagnostics problem. The dashboard will provide more information." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1626 +#, php-format +msgid "migrateDocuments: stopping - done in %d seconds!" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1520 +msgid "migrateDocuments: stopping - migration is complete." +msgstr "" + +#: search2/indexing/indexerCore.inc.php:1533 +msgid "migrateDocuments: stopping - migration lockfile detected." +msgstr "" + +#: i18n/templates.c:362 i18n/templates.c:3572 +msgid "mime types do not match" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerDashlet.php:139 +#: plugins/ktcore/scheduler/schedulerDashlet.php:142 +msgid "minute(s)" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:193 +msgid "modify user details" +msgstr "" + +#: i18n/templates.c:974 i18n/templates.c:1064 i18n/templates.c:1088 +msgid "month(s)" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:88 +#: plugins/ktcore/scheduler/taskScheduler.php:70 +msgid "monthly" +msgstr "" + +#: i18n/templates.c:116 i18n/templates.c:1478 i18n/templates.c:6689 +msgid "months" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:116 i18n/templates.c:7127 +#: i18n/templates.c:7172 +msgid "n/a" +msgstr "" + +#: lib/util/ktutil.inc:232 +msgid "never" +msgstr "" + +#: i18n/templates.c:1916 i18n/templates.c:1919 +msgid "next" +msgstr "" + +#: i18n/templates.c:365 +msgid "no difference between content versions" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:402 plugins/ktcore/KTPermissions.php:943 +msgid "no groups" +msgstr "" + +#: search2/search/search.inc.php:434 +msgid "no permission to read folder" +msgstr "" + +#: plugins/ktcore/KTPermissions.php:389 plugins/ktcore/KTPermissions.php:930 +msgid "no users" +msgstr "" + +#: i18n/templates.c:1970 i18n/templates.c:2060 +msgid "no value" +msgstr "" + +#: i18n/templates.c:2066 i18n/templates.c:2069 +msgid "no value in this version" +msgstr "" + +#: lib/browse/Criteria.inc:887 +msgid "none" +msgstr "" + +#: i18n/templates.c:1421 i18n/templates.c:1454 i18n/templates.c:6632 +#: i18n/templates.c:6665 +msgid "not equal to" +msgstr "" + +#: i18n/templates.c:1523 i18n/templates.c:6722 +msgid "not like" +msgstr "" + +#: i18n/templates.c:1415 i18n/templates.c:6626 +msgid "not on" +msgstr "" + +#: i18n/templates.c:6188 +msgid "not part of a unit" +msgstr "" + +#: i18n/templates.c:4514 +msgid "of the criteria specified." +msgstr "" + +#: i18n/templates.c:1412 i18n/templates.c:6623 i18n/templates.c:7274 +#: i18n/templates.c:7283 i18n/templates.c:7289 +msgid "on" +msgstr "" + +#: plugins/commercial/wintools/key.inc.php:83 +msgid "one day" +msgstr "" + +#: i18n/templates.c:7025 +msgid "or" +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:441 +msgid "password reset request" +msgstr "" + +#: plugins/passwordResetPlugin/loginResetDispatcher.php:498 +msgid "password successfully reset" +msgstr "" + +#: i18n/templates.c:1922 +msgid "per page" +msgstr "" + +#: i18n/templates.c:3269 +msgid "please confirm that you want to delete these documents." +msgstr "" + +#: i18n/templates.c:3215 +msgid "please confirm that you want to restore these documents from an archived state." +msgstr "" + +#: i18n/templates.c:3371 +msgid "please confirm that you want to restore these documents." +msgstr "" + +#: i18n/templates.c:1913 +msgid "prev" +msgstr "" + +#: ktoffice/controllers/list.php:162 ktoffice/controllers/list.php:277 +msgid "read, " +msgstr "" + +#: i18n/templates.c:1550 i18n/templates.c:1553 i18n/templates.c:1556 +#: i18n/templates.c:6749 i18n/templates.c:6752 i18n/templates.c:6755 +msgid "remove" +msgstr "" + +#: i18n/templates.c:5495 +msgid "remove behaviour" +msgstr "" + +#: plugins/ktcore/folder/Rename.php:60 +msgid "rename" +msgstr "" + +#: i18n/templates.c:377 i18n/templates.c:383 i18n/templates.c:389 +msgid "required" +msgstr "" + +#: search2/indexing/indexerCore.inc.php:582 +#, php-format +msgid "resolveExtractor: Resolved '%s' from mime type '%s'." +msgstr "" + +#: i18n/templates.c:7358 +msgid "save" +msgstr "" + +#: i18n/templates.c:4289 i18n/templates.c:4322 i18n/templates.c:6131 +#: i18n/templates.c:6215 i18n/templates.c:6230 i18n/templates.c:6479 +msgid "save changes" +msgstr "" + +#: i18n/templates.c:6098 +msgid "save changes to group" +msgstr "" + +#: i18n/templates.c:6116 +msgid "save changes to unit" +msgstr "" + +#: i18n/templates.c:5540 +msgid "save this dependency" +msgstr "" + +#: i18n/templates.c:2366 i18n/templates.c:2426 i18n/templates.c:8579 +msgid "search" +msgstr "" + +#: i18n/templates.c:6164 i18n/templates.c:8501 +msgid "search for groups" +msgstr "" + +#: i18n/templates.c:707 i18n/templates.c:815 i18n/templates.c:1115 +#: i18n/templates.c:1142 i18n/templates.c:8522 +msgid "search for users" +msgstr "" + +#: i18n/templates.c:6884 +msgid "search text here" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerDashlet.php:142 +msgid "second(s)" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerDashlet.php:129 +msgid "seconds" +msgstr "" + +#: i18n/templates.c:1097 i18n/templates.c:1103 +msgid "select" +msgstr "" + +#: plugins/ktcore/admin/groupManagement.php:65 +msgid "select a group" +msgstr "" + +#: plugins/ktcore/admin/manageHelp.php:60 +#: plugins/ktstandard/admin/manageDisclaimers.php:53 +msgid "select a section" +msgstr "" + +#: plugins/ktcore/admin/unitManagement.php:63 +msgid "select a unit" +msgstr "" + +#: plugins/ktcore/admin/userManagement.php:58 +msgid "select a user" +msgstr "" + +#: i18n/templates.c:494 i18n/templates.c:578 i18n/templates.c:671 +#: i18n/templates.c:779 +msgid "show transactions" +msgstr "" + +#: i18n/templates.c:3431 +msgid "showing comparison between versions #from# and #to#." +msgstr "" + +#: i18n/templates.c:1907 +msgid "showing information for version #version#" +msgstr "" + +#: search2/search/exprConstants.inc.php:62 +msgid "start with" +msgstr "" + +#: i18n/templates.c:1526 i18n/templates.c:6725 +msgid "starts with" +msgstr "" + +#: i18n/templates.c:5735 +msgid "stuck, will never be disabled when synchronising from another source" +msgstr "" + +#: i18n/templates.c:5750 +msgid "stuck, will never be enabled when synchronising from another source" +msgstr "" + +#: i18n/templates.c:6248 +msgid "synchronise" +msgstr "" + +#: i18n/templates.c:3440 i18n/templates.c:3446 +msgid "the information for version #version# comes from an older version of #appname# and may be incorrect." +msgstr "" + +#: i18n/templates.c:3185 +msgid "the local copy of the checked-out document has been lost" +msgstr "" + +#: i18n/templates.c:3188 +msgid "the user who did the check-out is not currently available to check it back in" +msgstr "" + +#: i18n/templates.c:2030 i18n/templates.c:2036 i18n/templates.c:2057 +msgid "this cannot change between versions" +msgstr "" + +#: i18n/templates.c:2090 i18n/templates.c:2111 +msgid "to \"#location_name#\"" +msgstr "" + +#: i18n/templates.c:2246 +msgid "to the folder \"#location_name#\"" +msgstr "" + +#: i18n/templates.c:2270 +msgid "to which you are subscribed" +msgstr "" + +#: plugins/ktcore/folder/Transactions.php:57 +msgid "transactions" +msgstr "" + +#: i18n/templates.c:461 i18n/templates.c:545 i18n/templates.c:638 +#: i18n/templates.c:746 +msgid "transactions in the last #widget# days" +msgstr "" + +#: i18n/templates.c:491 i18n/templates.c:575 i18n/templates.c:668 +#: i18n/templates.c:776 +msgid "transactions." +msgstr "" + +#: lib/browse/Criteria.inc:893 +msgid "unknown state" +msgstr "" + +#: lib/widgets/fieldsetDisplay.inc.php:181 +msgid "unknown type" +msgstr "" + +#: plugins/ktcore/admin/fieldsets/basic.inc.php:857 +#: plugins/multiselect/inetbasic.inc.php:1153 +msgid "unlink" +msgstr "" + +#: lib/import/zipimportstorage.inc.php:132 +msgid "unzip command not found on system" +msgstr "" + +#: lib/ktentity.inc:395 lib/ktentity.inc:558 +#, php-format +msgid "update for class %s failed" +msgstr "" + +#: i18n/templates.c:6260 +msgid "update organisation information" +msgstr "" + +#: i18n/templates.c:6302 +msgid "update role information" +msgstr "" + +#: plugins/commercial/wintools/baobabkeyutil.inc.php:503 +msgid "users" +msgstr "" + +#: plugins/ktcore/admin/manageCleanup.php:77 +msgid "verify document storage" +msgstr "" + +#: plugins/ktcore/admin/deletedDocuments.php:55 +#: plugins/ktstandard/KTDocumentLinks.php:521 +#: plugins/ktstandard/KTDocumentLinks.php:550 +msgid "view" +msgstr "" + +#: plugins/commercial/alerts/docTypeAlerts.inc.php:90 +msgid "view alerts" +msgstr "" + +#: plugins/commercial/wintools/email/emailDocumentTypes.php:64 +#: plugins/ktcore/admin/documentTypes.php:60 +msgid "view types" +msgstr "" + +#: plugins/ktstandard/KTDiscussion.php:256 +msgid "viewing comments" +msgstr "" + +#: i18n/templates.c:2132 +msgid "was archived" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerDashlet.php:133 i18n/templates.c:971 +#: i18n/templates.c:1061 i18n/templates.c:1085 +msgid "week(s)" +msgstr "" + +#: plugins/ktcore/scheduler/schedulerEntity.php:89 +#: plugins/ktcore/scheduler/taskScheduler.php:71 +msgid "weekly" +msgstr "" + +#: i18n/templates.c:113 +msgid "weeks" +msgstr "" + +#: plugins/ktcore/KTDocumentActions.php:1781 +msgid "workflow" +msgstr "" + +#: ktoffice/controllers/list.php:159 ktoffice/controllers/list.php:274 +msgid "write, " +msgstr "" + +#: i18n/templates.c:119 i18n/templates.c:1481 i18n/templates.c:6692 +msgid "years" +msgstr "" + +#: i18n/templates.c:977 i18n/templates.c:1067 i18n/templates.c:1091 +msgid "years(s)" +msgstr "" + +#: plugins/ktstandard/KTDocumentLinksColumns.php:65 +msgid "you cannot link to the source document" +msgstr "" + +msgid "By default, KnowledgeTree controls its own users and groups and stores all information about them inside the database. In many situations, an organisation will already have a list of users and groups, and needs to use that existing information to allow access to the DMS. These Authentication Sources allow the system administrator to specify additional sources of authentication data." +msgstr "" +msgid "This report lists all mime types and extensions that can be identified by KnowledgeTree." +msgstr "" diff --git a/i18n/permissions.c b/i18n/permissions.c new file mode 100644 index 0000000..c20a4d2 --- /dev/null +++ b/i18n/permissions.c @@ -0,0 +1,15 @@ +gettext("Core: Read"); +gettext("Core: Write"); +gettext("Core: Add Folder"); +gettext("Core: Manage security"); +gettext("Core: Delete"); +gettext("Core: Manage workflow"); +gettext("Core: Folder details"); + +gettext("Read"); +gettext("Write"); +gettext("Add Folder"); +gettext("Manage security"); +gettext("Delete"); +gettext("Manage workflow"); +gettext("Folder details"); diff --git a/i18n/templates.c b/i18n/templates.c new file mode 100644 index 0000000..318f0d8 --- /dev/null +++ b/i18n/templates.c @@ -0,0 +1,8655 @@ +/* ./plugins/browseabledashlet/templates/browseabledashlet/dashlet.smarty */ +gettext("You have no orphaned folders."); + +/* ./plugins/browseabledashlet/templates/browseabledashlet/dashlet.smarty */ +gettext("Title"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Document type"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Select document type for alert"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Alert date"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Enter number and select frequecy"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Days"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Weeks"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Months"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Years"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Alert message"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Add a message for this alert"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Add alert comment here ..."); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Add users to this alert..."); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Select members to be added to this alert"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Available Entities"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("--- Please filter ---"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Filter"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Show All"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Show All"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Add to assigned entities"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Remove from assigned entities"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Assigned Entities"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("OK"); + +/* ./plugins/commercial/alerts/templates/add_edit.smarty */ +gettext("Cancel"); + +/* ./plugins/commercial/alerts/templates/alertNotification.smarty */ +gettext("#app#: #name# alert triggered"); + +/* ./plugins/commercial/alerts/templates/alertNotification.smarty */ +gettext("An alert was triggered on the following document"); + +/* ./plugins/commercial/alerts/templates/alertNotification.smarty */ +gettext("Comment"); + +/* ./plugins/commercial/alerts/templates/alertNotification.smarty */ +gettext("View document"); + +/* ./plugins/commercial/alerts/templates/alertNotification.smarty */ +gettext("Document is no longer available"); + +/* ./plugins/commercial/alerts/templates/alertNotification.smarty */ +gettext("Clear alert"); + +/* ./plugins/commercial/alerts/templates/alertNotification.smarty */ +gettext("View all alerts on this document"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Add an Alert on this Document"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Create an alert to receive a dashboard notification and an email when action is required on this document."); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Alert"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Alert in"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("days"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("weeks"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("months"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("years"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Alert on"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Alert Message"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Add a message for this alert"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Add other users to this alert..."); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Save"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Cancel"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("Existing Alerts"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("A list of existing alerts for this document"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("System alert"); + +/* ./plugins/commercial/alerts/templates/alerts.smarty */ +gettext("No alerts have been configured for this document."); + +/* ./plugins/commercial/alerts/templates/alertSubscription.smarty */ +gettext("An alert on the document \"#object_name#\" has been added or modified"); + +/* ./plugins/commercial/alerts/templates/alertSubscription.smarty */ +gettext("in the folder \"#location_name#\""); + +/* ./plugins/commercial/alerts/templates/alertSubscription.smarty */ +gettext("by #actor_name#"); + +/* ./plugins/commercial/alerts/templates/alertSubscription.smarty */ +gettext("View Document"); + +/* ./plugins/commercial/alerts/templates/alertSubscription.smarty */ +gettext("Document is no longer available"); + +/* ./plugins/commercial/alerts/templates/alertSubscription.smarty */ +gettext("Clear Alert"); + +/* ./plugins/commercial/alerts/templates/alertSubscription.smarty */ +gettext("View all alerts on this document"); + +/* ./plugins/commercial/alerts/templates/archiveDeleteNotification.smarty */ +gettext("#app#: #name# has been deleted"); + +/* ./plugins/commercial/alerts/templates/archiveDeleteNotification.smarty */ +gettext("#app#: #name# has been archived"); + +/* ./plugins/commercial/alerts/templates/archiveDeleteNotification.smarty */ +gettext("#user# has deleted a document of which you are the owner"); + +/* ./plugins/commercial/alerts/templates/archiveDeleteNotification.smarty */ +gettext("#user# has archived a document of which you are the owner"); + +/* ./plugins/commercial/alerts/templates/archiveDeleteNotification.smarty */ +gettext("#user# has deleted a document on which you have an alert"); + +/* ./plugins/commercial/alerts/templates/archiveDeleteNotification.smarty */ +gettext("#user# has archived a document on which you have an alert"); + +/* ./plugins/commercial/alerts/templates/archiveDeleteNotification.smarty */ +gettext("Comment"); + +/* ./plugins/commercial/alerts/templates/archiveDeleteNotification.smarty */ +gettext("Clear alert"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Alerts by Document Types"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Configure document alerts to recieve a notification when action is required on a document of a specific type."); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Frequency"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Notify"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Message"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Reset on
check-in"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Repeated after
notification"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Edit"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Delete"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Day"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Days"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Enable reset alert on check-in"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Enable"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Disable reset alert on check-in"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Disable"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Enable repeat after action"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Enable"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Disable repeat after action"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Disable"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Delete document type alert."); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("Delete"); + +/* ./plugins/commercial/alerts/templates/list.smarty */ +gettext("No document type alerts have been configured at present"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Document Numbering Schemes"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Numbering Schemes"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Please define an appropriate numbering scheme for each document type:"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Document Type"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Scheme"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Regenerate On Checkin"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Control"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Yes"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("No"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Schema guide"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Token"); + +/* ./plugins/commercial/custom-numbering/templates/CustomNumberingAdminPage.smarty */ +gettext("Example"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Generic Information"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("The information in this section is stored by #appname# for every document."); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Document Filename"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Custom Document No"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("File is a"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Document Version"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Created by"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Owned by"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Last update by"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Document Type"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Workflow"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("No workflow"); + +/* ./plugins/commercial/custom-numbering/templates/kt3/fieldsets/generic.smarty */ +gettext("Document ID"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("Select Document Version to compare against"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("This page lists versions of document content and allows you to compare a content version with another content version."); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("Document History for #appname# New UI Presentation"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("User"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("Metadata Version"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("Content Version"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("Compare"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("comparing against this version"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("mime types do not match"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("no difference between content versions"); + +/* ./plugins/commercial/documentcomparison/templates/comparison_content_version_select.smarty */ +gettext("Compare"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("This action requires re-authentication."); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("Username"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("required"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("Password"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("required"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("Comment"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("required"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("OK"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("Cancel"); + +/* ./plugins/commercial/electronic-signatures/templates/signature_form.smarty */ +gettext("Authenticating signature, please wait"); + +/* ./plugins/commercial/guidInserter/templates/restore_action.smarty */ +gettext("Restore Document"); + +/* ./plugins/commercial/guidInserter/templates/restore_action.smarty */ +gettext("The document processing engine inserts a GUID, Global Unique Identifier, into the metadata of the document. In certain cases this may cause the document to become corrupt. A backup of the current version of the document is created and can be restored here."); + +/* ./plugins/commercial/guidInserter/templates/restore_action.smarty */ +gettext("Are you sure you want to restore your document to it's previous state?"); + +/* ./plugins/commercial/guidInserter/templates/restore_action.smarty */ +gettext("Restore Document"); + +/* ./plugins/commercial/guidInserter/templates/restore_action.smarty */ +gettext("Cancel"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/admin_main.smarty */ +gettext("Extended Transaction Information"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/admin_main.smarty */ +gettext("The DMS tracks a large amount of activity by users. Use these reports to get better information on who's doing what on the system. Note that transactions are only shown for documents you are allowed to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/admin_main.smarty */ +gettext("User Activity Information"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/admin_main.smarty */ +gettext("Global Activity Information"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/dashlet.smarty */ +gettext("Items you've added or changed recently within the DMS."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/dashlet.smarty */ +gettext("Document"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/dashlet.smarty */ +gettext("Location"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/dashlet.smarty */ +gettext("User"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/dashlet.smarty */ +gettext("Action taken"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Global Activity"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Specify Search Details"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("In order to refine the kind of information shown to you, please provide further information below."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Date Range"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Required"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Either select a range in which to view the actions, or specify the number of days into the past to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("transactions in the last #widget# days"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Transaction Type"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Required"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Select what kind of report you'd like to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("All Actions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Check-ins/Check-outs"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Recent Downloads"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Recent Uploads"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Show Items"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Specify the maximum items to show, or leave it at zero or blank to show all transactions matching your report"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("transactions."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("show transactions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Show #max# of #total# transactions."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("User"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Document"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Action"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Date"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Content version"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("Comment"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/global_activity.smarty */ +gettext("No Transactions matched your query."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/recent_rss.smarty */ +gettext("#appname# Recent Documents"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/recent_rss.smarty */ +gettext("User: #username# <br /> Action: #action# <br /> #reason#"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Global Activity in \"#folder#\""); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Specify Search Details"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("In order to refine the kind of information shown to you, please provide further information below."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Date Range"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Required"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Either select a range in which to view the actions, or specify the number of days into the past to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("transactions in the last #widget# days"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Transaction Type"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Required"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Select what kind of report you'd like to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("All Actions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Check-ins/Check-outs"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Recent Downloads"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Recent Uploads"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Show Items"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Specify the maximum items to show, or leave it at zero or blank to show all transactions matching your report"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("transactions."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("show transactions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Show #max# of #total# transactions."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("User"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Document"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Action"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Date"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Content version"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("Comment"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_global_activity.smarty */ +gettext("No Transactions matched your query."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_main.smarty */ +gettext("Usage Information for \"#folder#\""); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_main.smarty */ +gettext("View information about what documents have been added, or changed in folder and its children. You can view this information by user or as a whole."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_main.smarty */ +gettext("Per-User Activity"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_main.smarty */ +gettext("General Activity"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_main.smarty */ +gettext("Documents by Workflow and Document Type"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("User Information: #username# in \"#folder#\""); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Specify Search Details"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Each user will have performed a large number of different actions. In order to make the report more useful, please specify more details about the information you need."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Date Range"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Required"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Either select a range in which to view the users actions, or specify the number of days into the past to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("transactions in the last #widget# days"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Transaction Type"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Required"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Select what kind of report you'd like to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("All Actions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Check-ins/Check-outs"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Recent Downloads"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Recent Uploads"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Show Items"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Specify the maximum items to show, or leave it at zero or blank to show all transactions matching your report"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("transactions."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("show transactions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Show #max# of #total# transactions."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("User"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Document"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Action"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Date"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Content version"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("Comment"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_details.smarty */ +gettext("No Transactions matched your query."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_info.smarty */ +gettext("Select User"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_info.smarty */ +gettext("Search for users"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_info.smarty */ +gettext("Since there may be many users in the system, please select a group from the list below, or type a few letters from the person's username to begin."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_info.smarty */ +gettext("search for users"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_info.smarty */ +gettext("Name"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_info.smarty */ +gettext("Username"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_user_info.smarty */ +gettext("View Transactions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_workflow_doctypes.smarty */ +gettext("Document Summary for \"#name#\""); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_workflow_doctypes.smarty */ +gettext("Workflow Info"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/standard_workflow_doctypes.smarty */ +gettext("No Workflow"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("User Information: #username#"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Specify Search Details"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Each user will have performed a large number of different actions. In order to make the report more useful, please specify more details about the information you need."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Date Range"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Required"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Either select a range in which to view the users actions, or specify the number of days into the past to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("transactions in the last #widget# days"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Transaction Type"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Required"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Select what kind of report you'd like to view."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("All Actions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Check-ins/Check-outs"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Recent Downloads"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Recent Uploads"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Show Items"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Specify the maximum items to show, or leave it at zero or blank to show all transactions matching your report"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("transactions."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("show transactions"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Show #max# of #total# transactions."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("User"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Document"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Action"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Date"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Content version"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("Comment"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_details.smarty */ +gettext("No Transactions matched your query."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_info.smarty */ +gettext("Select User"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_info.smarty */ +gettext("Search for users"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_info.smarty */ +gettext("Since there may be many users in the system, please select a group from the list below, or type a few letters from the person's username to begin."); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_info.smarty */ +gettext("search for users"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_info.smarty */ +gettext("Name"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_info.smarty */ +gettext("Username"); + +/* ./plugins/commercial/network/extendedtransactioninfo/templates/extendedtransactioninfo/user_info.smarty */ +gettext("View Transactions"); + +/* ./plugins/commercial/network/gotodocumentid/templates/gotodocid/dashlet.smarty */ +gettext("Jump To Document"); + +/* ./plugins/commercial/network/gotodocumentid/templates/gotodocid/dashlet.smarty */ +gettext("If you know the numeric ID of a document, type it in here and press \"go\""); + +/* ./plugins/commercial/network/gotodocumentid/templates/gotodocid/dashlet.smarty */ +gettext("Document ID"); + +/* ./plugins/commercial/network/gotodocumentid/templates/gotodocid/dashlet.smarty */ +gettext("Go"); + +/* ./plugins/commercial/network/inlineview/templates/inlineview/view.smarty */ +gettext("Inline View"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/addlink.smarty */ +gettext("New Quicklink"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/addlink.smarty */ +gettext("New Quicklink"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/addlink.smarty */ +gettext("Use the folder collection and path below to browse to the document you wish to link to."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/addlink.smarty */ +gettext("Link"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/addlink.smarty */ +gettext("Cancel"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/dashlet.smarty */ +gettext("There are no quicklinks."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/dashlet.smarty */ +gettext("Manage Quicklinks"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Manage Quicklinks"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Quicklinks allow the administrator to create and order a collection of links to documents and folders, which will display on users' dashboards."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Quicklinks are links to documents and folders which you use often."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Add Quicklink"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Create a new quicklink that will appear on users' dashboards."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Create a new quicklink that will appear on your dashboard."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Create a new quicklink"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Re-order Quicklinks"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Change the order in which quicklinks are shown."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Re-order quicklinks"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("There are no system quicklinks."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("You have no quicklinks."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Target"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Delete"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/managequicklinks.smarty */ +gettext("Delete"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/reorderquicklinks.smarty */ +gettext("Re-order Quicklinks"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/reorderquicklinks.smarty */ +gettext("Re-order Quicklinks"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/reorderquicklinks.smarty */ +gettext("Use the up and down arrows to move an item. Please note that changes are only saved when you click the 're-order' button."); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/reorderquicklinks.smarty */ +gettext("Re-order"); + +/* ./plugins/commercial/network/quicklinks/templates/Quicklinks/reorderquicklinks.smarty */ +gettext("Cancel"); + +/* ./plugins/commercial/network/topdownloads/templates/topdownloads/dashlet.smarty */ +gettext("The top downloads for the last 7 days. Only documents which you are allowed to see are listed."); + +/* ./plugins/commercial/network/topdownloads/templates/topdownloads/dashlet.smarty */ +gettext("Document"); + +/* ./plugins/commercial/network/topdownloads/templates/topdownloads/dashlet.smarty */ +gettext("Location"); + +/* ./plugins/commercial/network/topdownloads/templates/topdownloads/dashlet.smarty */ +gettext("Downloads"); + +/* ./plugins/commercial/network/userhistory/templates/userhistory/dashlet.smarty */ +gettext("Items you've viewed recently within the DMS."); + +/* ./plugins/commercial/network/userhistory/templates/userhistory/dashlet.smarty */ +gettext("Folders"); + +/* ./plugins/commercial/network/userhistory/templates/userhistory/dashlet.smarty */ +gettext("Documents"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Last login information"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Last login information"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Want to know when last users of your system logged in? You can get an overview of the last login times of all users, or of users that have or have not logged in recently."); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Show all users"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Show users that"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("have"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("have not"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("logged into the system in the last"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("day(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("week(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("month(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("years(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Show"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Name"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Username"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Last login"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Login history"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("Never"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("View"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/lastlogins.smarty */ +gettext("No results for your search."); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/loginhistory.smarty */ +gettext("Login history"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/loginhistory.smarty */ +gettext("User"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/loginhistory.smarty */ +gettext("Date"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/loginhistory.smarty */ +gettext("Action"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/loginhistory.smarty */ +gettext("Comments"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userloginhistory.smarty */ +gettext("Login history for"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userloginhistory.smarty */ +gettext("Date"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userloginhistory.smarty */ +gettext("Action"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userloginhistory.smarty */ +gettext("Comments"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userloginhistory.smarty */ +gettext("User has never logged in"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("User Reporting"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Last login information"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Want to know when last users of your system logged in? You can get an overview of the last login times of all users, or of users that have or have not logged in recently."); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Show all users"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Show users that"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("have"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("have not"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("logged into the system in the last"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("day(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("week(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("month(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("years(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Show"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Login activity"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Want to know who all has logged in the system over a period of time? You can get an overview of all login activity for all users over a specified period of time."); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Show login activity for the last"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("day(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("week(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("month(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("years(s)"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Show login activity between"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("select"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("and"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("select"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Show"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Full login history for users"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Since there may be many users in the system, please select a user from the list below, or type a few letters from the person's username to begin. Alternatively, view all users (note that this may be very slow if you have many users)."); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("search for users"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Name"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Username"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("Login history"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("View"); + +/* ./plugins/commercial/professional-reporting/templates/ktprofessional/reporting/userreporting.smarty */ +gettext("No results for your search."); + +/* ./plugins/commercial/wintools/templates/licensedashlet/license.smarty */ +gettext("There is currently no license installed! Either you have yet to install your license or it has expired. A license is required to enable some of the functionality within the DMS."); + +/* ./plugins/commercial/wintools/templates/licensedashlet/license.smarty */ +gettext("Your license will expire in #days# day(s). On expiration of your license certain functionality within the DMS will be disabled."); + +/* ./plugins/commercial/wintools/templates/licensedashlet/license.smarty */ +gettext("Please contact #email# to purchase a new subscription, or renew your existing one."); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("search for users"); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("Name"); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("Username"); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("Enabled"); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("Allocate Key"); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("De-allocate Key"); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("Key Assigned"); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("No Key Assigned"); + +/* ./plugins/commercial/wintools/templates/wintools/allocate_keys.smarty */ +gettext("No results for your search."); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Document Type"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Change"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Type-specific field sets"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Linked Fieldsets"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Fieldset"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Disassociate Fieldsets"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("No fieldsets are currently associated with this type."); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Associate Fieldsets"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Associate Fieldsets"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("No fieldsets are available to be added. To add a fieldset, please go to DMS Administration"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Document Metadata and Workflow Configuration"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/edit.smarty */ +gettext("Document Field Management"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/folderassign.smarty */ +gettext("Document types"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/folderassign.smarty */ +gettext("Select document types allowed in folder"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/folderassign.smarty */ +gettext("Folder"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/folderassign.smarty */ +gettext("Restrict document types"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/folderassign.smarty */ +gettext("Document Types"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/folderassign.smarty */ +gettext("Assign"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/folderassign.smarty */ +gettext("Back to folder"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Email Document Types"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Create a new email document type"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("To create a new email document type, please type its name below and then click on the Create button. Note that email document type names must end with the word 'Email'."); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Create"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Existing document types"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Select a document type from the list below to change its details, or use the enable/disable buttons to change its availability state."); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Document Type"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Associated Fieldsets"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Edit"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Disable/Enable"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Edit"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Enable"); + +/* ./plugins/commercial/wintools/templates/wintools/email/emaildocumenttypes/list.smarty */ +gettext("Disable"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Manage keys"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Access to the DMS requires that the user be allocated one of the organisation's keys. You currently have #keys# licenses available."); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Add new key"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("If you've purchased a new key from KnowledgeTree.com or one of our partners, you can upload it here."); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Below you can see a list of the keys that are currently active for your organisation."); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Please note that only 1 key is ever active - the key which expires first (listed at the top). If you need more active users, you will need to purchase additional user licenses. If you have upgraded from Basic to Plus or Premium, please add your new license and then delete the old license."); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("You have no keys currently registered for Windows Tools."); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Licenses"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Expires"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Granted to"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Delete"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Invalid key"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("This key expires in"); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("This key has expired."); + +/* ./plugins/commercial/wintools/templates/wintools/key_overview.smarty */ +gettext("Delete"); + +/* ./plugins/housekeeper/templates/DiskUsage.smarty */ +gettext("Mount"); + +/* ./plugins/housekeeper/templates/DiskUsage.smarty */ +gettext("Size"); + +/* ./plugins/housekeeper/templates/DiskUsage.smarty */ +gettext("Used"); + +/* ./plugins/housekeeper/templates/DiskUsage.smarty */ +gettext("Available"); + +/* ./plugins/housekeeper/templates/DiskUsage.smarty */ +gettext("Usage"); + +/* ./plugins/housekeeper/templates/DiskUsage.smarty */ +gettext("Free Space"); + +/* ./plugins/housekeeper/templates/FolderUsage.smarty */ +gettext("Are you sure you want to clear"); + +/* ./plugins/housekeeper/templates/FolderUsage.smarty */ +gettext("Description"); + +/* ./plugins/housekeeper/templates/FolderUsage.smarty */ +gettext("Files"); + +/* ./plugins/housekeeper/templates/FolderUsage.smarty */ +gettext("Space Used"); + +/* ./plugins/housekeeper/templates/FolderUsage.smarty */ +gettext("Action"); + +/* ./plugins/housekeeper/templates/FolderUsage.smarty */ +gettext("cleanup"); + +/* ./plugins/housekeeper/templates/FolderUsage.smarty */ +gettext("N/A"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Fieldsets bring together different fields into a collection of related information."); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Add New Field"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Add New Field"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Field Name"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Edit"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Delete"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Type Description"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Position"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("edit"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("delete"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Reorder up"); + +/* ./plugins/multiselect/templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Reorder down"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("after"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("between"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("before"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("on"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("not on"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("equal to"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("not equal to"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than or equal to"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than or equal to"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("between"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than or equal to"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than or equal to"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("equal to"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("not equal to"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("bytes"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("kilobytes"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("megabytes"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("gigabytes"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("days"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("months"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("years"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("all"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("any"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("contains"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("does not contain"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("like"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("not like"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("starts with"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("ends with"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("contains"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("does not contain"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("True"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("False"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("remove"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("remove"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("remove"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Please select some search criteria"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Advanced Search"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Search Criteria Editor"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("The #options# may also be used to create more complex search criteria expressions."); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("all"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("any"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Return items which match #options# of the criteria groups specified."); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Criteria Group"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("all"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("any"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Return items which match #options# of the criteria specified below."); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("No criteria have been selected for the criteria group."); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Remove Criteria Group"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Available Criteria"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Available Fieldsets"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Available Workflows"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Select some criteria"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Select a fieldset"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Select a workflow"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Click on a field above to add it to the criteria group."); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Add another set of criteria"); + +/* ./plugins/multiselect/templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Search"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Manage Field: #field_name#"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("This page will allow you to manage the different aspects of this particular field."); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Extra Options"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Different fields have different actions and options available."); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Add Lookup Values"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Add Lookup Values"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Manage Lookup Values"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Manage Lookup Values"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Manage Lookup Tree Structure"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Manage Lookup Tree Structure"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Extra Options"); + +/* ./plugins/multiselect/templates/manage_field.smarty */ +gettext("Different fields have different actions and options available."); + +/* ./plugins/multiselect/templates/multiselect/selection.smarty */ +gettext("Required"); + +/* ./plugins/multiselect/templates/multiselect/simple_selection.smarty */ +gettext("Required"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Login | #appname#"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Community Edition"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Please enter your details below to login."); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Username"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Password"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Language"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Login"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Forgot your password?"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Enter your username and email address. A link will be mailed to you in order to verify your email address."); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Username"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Email Address"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Send password link"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Back"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Please enter your username and email address."); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Username"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Email Address"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("New password"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Confirm new password"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Reset password"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Cancel"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("#appname# Version"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("Document Management Software"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("© 2008, 2009 KnowledgeTree Inc."); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("This program is free software and published under the GNU General Public License version 3"); + +/* ./plugins/passwordResetPlugin/templates/login_reset.smarty */ +gettext("All rights reserved."); + +/* ./plugins/rssplugin/templates/RSSPlugin/addfeed.smarty */ +gettext("New RSS Feed"); + +/* ./plugins/rssplugin/templates/RSSPlugin/addfeed.smarty */ +gettext("Create a rss feed which will be displayed on the dashboard"); + +/* ./plugins/rssplugin/templates/RSSPlugin/addfeed.smarty */ +gettext("Create a new rss feed"); + +/* ./plugins/rssplugin/templates/RSSPlugin/addfeed.smarty */ +gettext("Create"); + +/* ./plugins/rssplugin/templates/RSSPlugin/addfeed.smarty */ +gettext("Cancel"); + +/* ./plugins/rssplugin/templates/RSSPlugin/dashlet.smarty */ +gettext("#appname# RSS"); + +/* ./plugins/rssplugin/templates/RSSPlugin/dashlet.smarty */ +gettext("Select External RSS Feed"); + +/* ./plugins/rssplugin/templates/RSSPlugin/dashlet.smarty */ +gettext("No internal or external feeds available"); + +/* ./plugins/rssplugin/templates/RSSPlugin/dashlet.smarty */ +gettext("No internal feeds available"); + +/* ./plugins/rssplugin/templates/RSSPlugin/dedicated_dashlet.smarty */ +gettext("RSS feed unavailable."); + +/* ./plugins/rssplugin/templates/RSSPlugin/editfeed.smarty */ +gettext("Edit RSS Feed"); + +/* ./plugins/rssplugin/templates/RSSPlugin/editfeed.smarty */ +gettext("Edit a RSS feed"); + +/* ./plugins/rssplugin/templates/RSSPlugin/editfeed.smarty */ +gettext("Edit RSS feed"); + +/* ./plugins/rssplugin/templates/RSSPlugin/editfeed.smarty */ +gettext("Save changes"); + +/* ./plugins/rssplugin/templates/RSSPlugin/editfeed.smarty */ +gettext("Cancel"); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Manage RSS Feeds"); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Add RSS feeds"); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("These RSS feeds will be viewable on your dashboard."); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Create a link to a new RSS feed"); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Your RSS feed list is empty."); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Title"); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Edit"); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Delete"); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Edit"); + +/* ./plugins/rssplugin/templates/RSSPlugin/managerssfeeds.smarty */ +gettext("Delete"); + +/* ./plugins/rssplugin/templates/RSSPlugin/rssdocumentaction.smarty */ +gettext("RSS for Document"); + +/* ./plugins/rssplugin/templates/RSSPlugin/rssdocumentaction.smarty */ +gettext("You can copy the following link into any RSS aggregator to create a feed to the selected document."); + +/* ./plugins/rssplugin/templates/RSSPlugin/rssdocumentaction.smarty */ +gettext("Another way of quickly accessing an RSS feed for a document or folder is by using the RSS icon #linkIcon#, which you will find in your actions portlet on the left."); + +/* ./plugins/rssplugin/templates/RSSPlugin/rssfolderaction.smarty */ +gettext("RSS for folder"); + +/* ./plugins/rssplugin/templates/RSSPlugin/rssfolderaction.smarty */ +gettext("You can copy the following link into any RSS aggregator to create a feed to the selected folder."); + +/* ./plugins/rssplugin/templates/RSSPlugin/rssfolderaction.smarty */ +gettext("Another way of quickly accessing an RSS feed for a document or folder is by using the RSS icon #linkIcon#, which you will find in your actions portlet on the left."); + +/* ./plugins/tagcloud/templates/TagCloud/dashlet.smarty */ +gettext("There are no tags defined or accessible."); + +/* ./plugins/tagcloud/templates/TagCloud/portlet.smarty */ +gettext("There are no tags defined or accessible."); + +/* ./templates/kt3/admin_items.smarty */ +gettext("No items in the category."); + +/* ./templates/kt3/browse.smarty */ +gettext("Parameters"); + +/* ./templates/kt3/browse.smarty */ +gettext("Match #join# of the following"); + +/* ./templates/kt3/browse.smarty */ +gettext("Group"); + +/* ./templates/kt3/browse.smarty */ +gettext("match #join#"); + +/* ./templates/kt3/browse.smarty */ +gettext("Edit search"); + +/* ./templates/kt3/browse.smarty */ +gettext("To modify this search, press the 'Edit' button."); + +/* ./templates/kt3/browse.smarty */ +gettext("Edit"); + +/* ./templates/kt3/browse.smarty */ +gettext("Save this search"); + +/* ./templates/kt3/browse.smarty */ +gettext("To save this search permanently, so that you can run it again at any time, fill in a name below and click 'Save'."); + +/* ./templates/kt3/browse.smarty */ +gettext("Save"); + +/* ./templates/kt3/browse_lookup_selection.smarty */ +gettext("Select a Field"); + +/* ./templates/kt3/browse_lookup_selection.smarty */ +gettext("In some circumstances it is useful to view all documents with a given value for a lookup field. Select the lookup field from the list below to view all relevant documents."); + +/* ./templates/kt3/browse_lookup_value.smarty */ +gettext("Select a Value"); + +/* ./templates/kt3/browse_lookup_value.smarty */ +gettext("In some circumstances it is useful to view all documents with a given value for a lookup field. Select the value from the list below to view all relevant documents."); + +/* ./templates/kt3/browse_types.smarty */ +gettext("Select a document type"); + +/* ./templates/kt3/browse_types.smarty */ +gettext("In some circumstances it is useful to view all documents of a given document type. Select a document type from the list below to view all relevant documents."); + +/* ./templates/kt3/document/edit.smarty */ +gettext("Edit Metadata"); + +/* ./templates/kt3/document/edit.smarty */ +gettext("Change the document type"); + +/* ./templates/kt3/document/edit.smarty */ +gettext("The following document metadata is available for editing."); + +/* ./templates/kt3/document/edit.smarty */ +gettext("Save Changes"); + +/* ./templates/kt3/document/edit.smarty */ +gettext("Cancel"); + +/* ./templates/kt3/document/view.smarty */ +gettext("showing information for version #version#"); + +/* ./templates/kt3/document_collection.smarty */ +gettext("#itemCount# items, #batchSize# per page"); + +/* ./templates/kt3/document_collection.smarty */ +gettext("prev"); + +/* ./templates/kt3/document_collection.smarty */ +gettext("next"); + +/* ./templates/kt3/document_collection.smarty */ +gettext("next"); + +/* ./templates/kt3/document_collection.smarty */ +gettext("per page"); + +/* ./templates/kt3/fields/base.smarty */ +gettext("Required"); + +/* ./templates/kt3/fields/checkbox.smarty */ +gettext("Required"); + +/* ./templates/kt3/fields/fileupload.smarty */ +gettext("Required"); + +/* ./templates/kt3/fields/jsonlookup.smarty */ +gettext("Available"); + +/* ./templates/kt3/fields/jsonlookup.smarty */ +gettext("Assigned"); + +/* ./templates/kt3/fields/jsonlookup.smarty */ +gettext("Filter"); + +/* ./templates/kt3/fields/jsonlookup.smarty */ +gettext("Show All"); + +/* ./templates/kt3/fields/jsonlookup.smarty */ +gettext("Filter"); + +/* ./templates/kt3/fields/lookup.smarty */ +gettext("Required"); + +/* ./templates/kt3/fields/password.smarty */ +gettext("Required"); + +/* ./templates/kt3/fields/statictext.smarty */ +gettext("Required"); + +/* ./templates/kt3/fields/text.smarty */ +gettext("Required"); + +/* ./templates/kt3/fields/tree.smarty */ +gettext("Required"); + +/* ./templates/kt3/fieldsets/conditional_editable.smarty */ +gettext("conditional data."); + +/* ./templates/kt3/fieldsets/conditional_editable_values.smarty */ +gettext("The data for this conditional metadata fieldset was not completely provided. Provide the extra information, and save your changes afterwards."); + +/* ./templates/kt3/fieldsets/conditional_editable_values.smarty */ +gettext("no value"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Generic Information"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("The information in this section is stored by #appname# for every document."); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Document Filename"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("File is a"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Document Version"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Created by"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Owned by"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Last update by"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Document Type"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Workflow"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("No workflow"); + +/* ./templates/kt3/fieldsets/generic.smarty */ +gettext("Document ID"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Generic Information"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("The information in this section is stored by #appname# for every document."); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Document Title"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Document Filename"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("File is a"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Document Version"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Created by"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("this cannot change between versions"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Owned by"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("this cannot change between versions"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Last update by"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Document Type"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("No workflow"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("No workflow"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Workflow status"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("Document ID"); + +/* ./templates/kt3/fieldsets/generic_versioned.smarty */ +gettext("this cannot change between versions"); + +/* ./templates/kt3/fieldsets/simple.smarty */ +gettext("no value"); + +/* ./templates/kt3/fieldsets/simple_versioned.smarty */ +gettext("This is the data assigned to the #name# aspect of this document."); + +/* ./templates/kt3/fieldsets/simple_versioned.smarty */ +gettext("no value in this version"); + +/* ./templates/kt3/fieldsets/simple_versioned.smarty */ +gettext("no value in this version"); + +/* ./templates/kt3/minimal_page.smarty */ +gettext("You are here"); + +/* ./templates/kt3/notifications/notification.SymbolicLinkArchived.smarty */ +gettext("The following shortcut is no longer valid as the target document has been archived. Please note that it has been automatically removed from the repository:"); + +/* ./templates/kt3/notifications/notification.SymbolicLinkArchived.smarty */ +gettext("Target document archived by:"); + +/* ./templates/kt3/notifications/notification.SymbolicLinkDeleted.smarty */ +gettext("The following shortcut is no longer valid as the target document has been deleted. Please note that it has been automatically removed from the repository:"); + +/* ./templates/kt3/notifications/notification.SymbolicLinkDeleted.smarty */ +gettext("Target document deleted by:"); + +/* ./templates/kt3/notifications/subscriptions.AddDocument.smarty */ +gettext("The document \"#object_name#\" was added"); + +/* ./templates/kt3/notifications/subscriptions.AddDocument.smarty */ +gettext("to \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.AddDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.AddDocument.smarty */ +gettext("View Document"); + +/* ./templates/kt3/notifications/subscriptions.AddDocument.smarty */ +gettext("Document is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.AddDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.AddDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.AddFolder.smarty */ +gettext("The folder \"#object_name#\" was added"); + +/* ./templates/kt3/notifications/subscriptions.AddFolder.smarty */ +gettext("to \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.AddFolder.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.AddFolder.smarty */ +gettext("View New Folder"); + +/* ./templates/kt3/notifications/subscriptions.AddFolder.smarty */ +gettext("Folder is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.AddFolder.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.ArchivedDocument.smarty */ +gettext("The document \"#object_name#\""); + +/* ./templates/kt3/notifications/subscriptions.ArchivedDocument.smarty */ +gettext("from \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.ArchivedDocument.smarty */ +gettext("was archived"); + +/* ./templates/kt3/notifications/subscriptions.ArchivedDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.ArchivedDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.CheckInDocument.smarty */ +gettext("The document \"#object_name#\" has been checked in"); + +/* ./templates/kt3/notifications/subscriptions.CheckInDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.CheckInDocument.smarty */ +gettext("in the folder \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.CheckInDocument.smarty */ +gettext("View Document"); + +/* ./templates/kt3/notifications/subscriptions.CheckInDocument.smarty */ +gettext("Document is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.CheckInDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.CheckInDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.CheckOutDocument.smarty */ +gettext("The document \"#object_name#\" has been checked out"); + +/* ./templates/kt3/notifications/subscriptions.CheckOutDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.CheckOutDocument.smarty */ +gettext("from the folder \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.CheckOutDocument.smarty */ +gettext("View Document"); + +/* ./templates/kt3/notifications/subscriptions.CheckOutDocument.smarty */ +gettext("Document is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.CheckOutDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.CheckOutDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.DiscussDocument.smarty */ +gettext("has added to the discussion around document"); + +/* ./templates/kt3/notifications/subscriptions.DiscussDocument.smarty */ +gettext("View Document"); + +/* ./templates/kt3/notifications/subscriptions.DiscussDocument.smarty */ +gettext("Document is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.DiscussDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.DiscussDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.DownloadDocument.smarty */ +gettext("The document \"#object_name#\""); + +/* ./templates/kt3/notifications/subscriptions.DownloadDocument.smarty */ +gettext("in the folder \"#location_name#\" has been downloaded"); + +/* ./templates/kt3/notifications/subscriptions.DownloadDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.DownloadDocument.smarty */ +gettext("View Document"); + +/* ./templates/kt3/notifications/subscriptions.DownloadDocument.smarty */ +gettext("Document is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.DownloadDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.DownloadDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.generic.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.generic.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.ModifyDocument.smarty */ +gettext("The document \"#object_name#\" has been changed"); + +/* ./templates/kt3/notifications/subscriptions.ModifyDocument.smarty */ +gettext("in the folder \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.ModifyDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.ModifyDocument.smarty */ +gettext("View Document"); + +/* ./templates/kt3/notifications/subscriptions.ModifyDocument.smarty */ +gettext("Document is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.ModifyDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.MoveDocument.smarty */ +gettext("The document \"#object_name#\" has been moved"); + +/* ./templates/kt3/notifications/subscriptions.MoveDocument.smarty */ +gettext("to the folder \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.MoveDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.MoveDocument.smarty */ +gettext("View New Location"); + +/* ./templates/kt3/notifications/subscriptions.MoveDocument.smarty */ +gettext("Location is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.MoveDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.MoveDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty */ +gettext("The document \"#object_name#\" has been removed"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty */ +gettext("from the folder \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty */ +gettext("to which you are subscribed"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty */ +gettext("View Folder"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty */ +gettext("Folder is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty */ +gettext("The folder \"#object_name#\" has been removed"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty */ +gettext("from \"#location_name#\""); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty */ +gettext("View Folder"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty */ +gettext("Location is no longer available"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.RemoveSubscribedDocument.smarty */ +gettext("The document \"#object_name#\" to which you were subscribed, has been removed"); + +/* ./templates/kt3/notifications/subscriptions.RemoveSubscribedDocument.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.RemoveSubscribedDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.RemoveSubscribedDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.RemoveSubscribedFolder.smarty */ +gettext("The folder \"#object_name#\" to which you were subscribed, has been removed"); + +/* ./templates/kt3/notifications/subscriptions.RemoveSubscribedFolder.smarty */ +gettext("by #actor_name#"); + +/* ./templates/kt3/notifications/subscriptions.RemoveSubscribedFolder.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.RemoveSubscribedFolder.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/notifications/subscriptions.RestoreDocument.smarty */ +gettext("The document \"#object_name#\" has been restored by an administrator."); + +/* ./templates/kt3/notifications/subscriptions.RestoreDocument.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/kt3/notifications/subscriptions.RestoreDocument.smarty */ +gettext("Clear Alert"); + +/* ./templates/kt3/portlets/admin_mode_portlet.smarty */ +gettext("What is admin mode?"); + +/* ./templates/kt3/portlets/admin_mode_portlet.smarty */ +gettext("Administrator mode is
enabled."); + +/* ./templates/kt3/portlets/admin_mode_portlet.smarty */ +gettext("Disable Admin Mode"); + +/* ./templates/kt3/portlets/admin_mode_portlet.smarty */ +gettext("Disable Admin Mode"); + +/* ./templates/kt3/portlets/admin_mode_portlet.smarty */ +gettext("What is admin mode?"); + +/* ./templates/kt3/portlets/admin_mode_portlet.smarty */ +gettext("Administrator mode is
not currently enabled."); + +/* ./templates/kt3/portlets/admin_mode_portlet.smarty */ +gettext("Enable Admin Mode"); + +/* ./templates/kt3/portlets/admin_mode_portlet.smarty */ +gettext("Enable Admin Mode"); + +/* ./templates/kt3/portlets/search_portlet.smarty */ +gettext("search"); + +/* ./templates/kt3/portlets/search_portlet.smarty */ +gettext("How do I search?"); + +/* ./templates/kt3/portlets/search_portlet.smarty */ +gettext("How do I search?"); + +/* ./templates/kt3/portlets/search_portlet.smarty */ +gettext("Saved Searches"); + +/* ./templates/kt3/portlets/search_portlet.smarty */ +gettext("Delete"); + +/* ./templates/kt3/portlets/search_portlet.smarty */ +gettext("Advanced Search"); + +/* ./templates/kt3/reorderdisplay.smarty */ +gettext("Item"); + +/* ./templates/kt3/reorderdisplay.smarty */ +gettext("Up"); + +/* ./templates/kt3/reorderdisplay.smarty */ +gettext("Down"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Quick Search Options"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Searches will now search both content and metadata"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Searches will now only search metadata"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Hint"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Please enter some search criteria!"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Saved Searches"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Advanced Search"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Previous Search Results"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Quick Search Options"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("content and metadata"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("metadata"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("search"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Enter search criteria..."); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Toggle search results format"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Search engine format"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Browse view format"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("You are here"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("#appname# Version: #version# is licensed free of charge and supplied with no support, no maintenance and no warranty."); + +/* ./templates/kt3/standard_page.smarty */ +gettext("#appname# Version: #version#"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Request created in #timing#s"); + +/* ./templates/kt3/standard_page.smarty */ +gettext("© 2008, 2009 KnowledgeTree Inc."); + +/* ./templates/kt3/standard_page.smarty */ +gettext("All rights reserved."); + +/* ./templates/kt3/standard_page.smarty */ +gettext("Request created in #timing#s"); + +/* ./templates/kt3/view_folder_history.smarty */ +gettext("Folder Transaction History"); + +/* ./templates/kt3/view_folder_history.smarty */ +gettext("This page provides details of all activities that have been carried out on the folder."); + +/* ./templates/kt3/view_folder_history.smarty */ +gettext("Folder History"); + +/* ./templates/kt3/view_folder_history.smarty */ +gettext("User"); + +/* ./templates/kt3/view_folder_history.smarty */ +gettext("Action"); + +/* ./templates/kt3/view_folder_history.smarty */ +gettext("Date"); + +/* ./templates/kt3/view_folder_history.smarty */ +gettext("Comment"); + +/* ./templates/ktcore/action/addFolder.smarty */ +gettext("Add a folder to"); + +/* ./templates/ktcore/action/addFolder.smarty */ +gettext("Folders are one way of organising documents in the document management system. Folders provide meaning in the traditional file storage way - through a file path."); + +/* ./templates/ktcore/action/archive.smarty */ +gettext("Archive Document"); + +/* ./templates/ktcore/action/archive.smarty */ +gettext("Archiving a document changes the document's state to invisible to non-administrative users. Only an Administrator may unarchive a document. Please note that this is a non-permanent change and does not delete the document from the repository."); + +/* ./templates/ktcore/action/archive_confirm.smarty */ +gettext("Archive Document"); + +/* ./templates/ktcore/action/assistance.smarty */ +gettext("Request Assistance"); + +/* ./templates/ktcore/action/assistance.smarty */ +gettext("If you are unable to perform an action on this document that you think you should be able to, or wish to request a change in location, metadata values, or workflow status, you can use this form to contact the owner of the document and/or the administrators to request this change."); + +/* ./templates/ktcore/action/assistance.smarty */ +gettext("Request Assistance"); + +/* ./templates/ktcore/action/assistance.smarty */ +gettext("Request Assistance"); + +/* ./templates/ktcore/action/bulk_download.smarty */ +gettext("Creating zip file. Compressing and archiving in progress ..."); + +/* ./templates/ktcore/action/bulk_download.smarty */ +gettext("Warning! Please wait for archiving to complete before closing the page."); + +/* ./templates/ktcore/action/bulk_download.smarty */ +gettext("Note: Closing the page before the download link displays will cancel your Bulk Download."); + +/* ./templates/ktcore/action/bulk_download.smarty */ +gettext("Download Zipped File"); + +/* ./templates/ktcore/action/bulk_download.smarty */ +gettext("Return to Folder"); + +/* ./templates/ktcore/action/bulk_download.smarty */ +gettext("'There was an error connecting to the server. Please refresh the page.'"); + +/* ./templates/ktcore/action/cancel_checkout.smarty */ +gettext("Cancel Checkout"); + +/* ./templates/ktcore/action/cancel_checkout.smarty */ +gettext("If you do not want to have this document be checked-out, please give a reason and cancel the checkout."); + +/* ./templates/ktcore/action/checkin.smarty */ +gettext("Checkin Document"); + +/* ./templates/ktcore/action/checkin.smarty */ +gettext("Checking in a document updates the document and allows others to make changes to the document and its metadata."); + +/* ./templates/ktcore/action/checkin.smarty */ +gettext("If you do not intend to change the document, or you do not wish to prevent others from changing the document, you should rather use the action menu to cancel this checkout."); + +/* ./templates/ktcore/action/checkout.smarty */ +gettext("Checkout Document"); + +/* ./templates/ktcore/action/checkout.smarty */ +gettext("Checking out a document reserves it for your exclusive use. This ensures that you can edit the document without anyone else changing the document and placing it into the document management system."); + +/* ./templates/ktcore/action/checkout_final.smarty */ +gettext("Checkout Document"); + +/* ./templates/ktcore/action/checkout_final.smarty */ +gettext("The document you wish to check out will begin to download soon. If it does not automatically start to download, you can use this link to start it yourself."); + +/* ./templates/ktcore/action/checkout_final.smarty */ +gettext("Once the document has been downloaded, you should return to the document view."); + +/* ./templates/ktcore/action/copy.smarty */ +gettext("Copy document"); + +/* ./templates/ktcore/action/copy.smarty */ +gettext("Copy"); + +/* ./templates/ktcore/action/copy.smarty */ +gettext("Copy"); + +/* ./templates/ktcore/action/copy.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/action/copy_final.smarty */ +gettext("Copy document"); + +/* ./templates/ktcore/action/copy_final.smarty */ +gettext("Copy"); + +/* ./templates/ktcore/action/copy_final.smarty */ +gettext("Complete Copy"); + +/* ./templates/ktcore/action/copy_final.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/action/delete.smarty */ +gettext("Delete Document"); + +/* ./templates/ktcore/action/delete.smarty */ +gettext("Deleting a document marks it as no longer being displayed. The document management system does not remove the document entirely, and it can be restored at a later stage."); + +/* ./templates/ktcore/action/delete_confirm.smarty */ +gettext("Delete Document"); + +/* ./templates/ktcore/action/finalise_mass_move.smarty */ +gettext("Move Files and Folders"); + +/* ./templates/ktcore/action/finalise_mass_move.smarty */ +gettext("Move"); + +/* ./templates/ktcore/action/finalise_mass_move.smarty */ +gettext("Items to move"); + +/* ./templates/ktcore/action/finalise_mass_move.smarty */ +gettext("The items that you selected to move."); + +/* ./templates/ktcore/action/finalise_mass_move.smarty */ +gettext("Please give these final details."); + +/* ./templates/ktcore/action/finalise_mass_move.smarty */ +gettext("Move"); + +/* ./templates/ktcore/action/mass_move.smarty */ +gettext("Move Files and Folders"); + +/* ./templates/ktcore/action/mass_move.smarty */ +gettext("Move"); + +/* ./templates/ktcore/action/mass_move.smarty */ +gettext("Items to move"); + +/* ./templates/ktcore/action/mass_move.smarty */ +gettext("The items that you selected to move."); + +/* ./templates/ktcore/action/mass_move.smarty */ +gettext("Move"); + +/* ./templates/ktcore/action/move.smarty */ +gettext("Moving a document relocates the document within the document repository."); + +/* ./templates/ktcore/action/move.smarty */ +gettext("If you do not intend to move this document, you should cancel the move."); + +/* ./templates/ktcore/action/move.smarty */ +gettext("Move"); + +/* ./templates/ktcore/action/move.smarty */ +gettext("Move"); + +/* ./templates/ktcore/action/move.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/action/move_final.smarty */ +gettext("Move Document"); + +/* ./templates/ktcore/action/move_final.smarty */ +gettext("Moving a document relocates the document within the DMS."); + +/* ./templates/ktcore/action/rename.smarty */ +gettext("Rename Document"); + +/* ./templates/ktcore/action/rename.smarty */ +gettext("This page allows you to rename the file name (not the document title) for a document."); + +/* ./templates/ktcore/action/rename.smarty */ +gettext("Rename"); + +/* ./templates/ktcore/action/rename.smarty */ +gettext("Rename"); + +/* ./templates/ktcore/action/rename.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/action/view_roles.smarty */ +gettext("View Roles"); + +/* ./templates/ktcore/action/view_roles.smarty */ +gettext("In many cases, workflow actions will be assigned to certain roles (e.g. Manager, Interviewer, Researcher, Journalist). You can assign these roles to specific groups in particular areas of the document management system."); + +/* ./templates/ktcore/action/view_roles.smarty */ +gettext("This page allows you to see the roles as they apply to this particular document."); + +/* ./templates/ktcore/action/view_roles.smarty */ +gettext("Role"); + +/* ./templates/ktcore/action/view_roles.smarty */ +gettext("Allocated users and groups"); + +/* ./templates/ktcore/action/view_roles.smarty */ +gettext("Users"); + +/* ./templates/ktcore/action/view_roles.smarty */ +gettext("Groups"); + +/* ./templates/ktcore/action/view_roles.smarty */ +gettext("No roles defined in the Role Administration area."); + +/* ./templates/ktcore/assist/assist_notification.smarty */ +gettext("A user, #user#, has requested help on the document #name#, and you are the owner or an admin of this document."); + +/* ./templates/ktcore/assist/assist_notification.smarty */ +gettext("View Help Request"); + +/* ./templates/ktcore/assist/assist_notification.smarty */ +gettext("Document is no longer available"); + +/* ./templates/ktcore/assist/assist_notification.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/ktcore/assist/assist_notification.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/ktcore/assist/assist_notification.smarty */ +gettext("Clear Alert"); + +/* ./templates/ktcore/assist/assist_notification_details.smarty */ +gettext("A user, #user#, has requested help on the document #name#, and you are the owner or an admin of this document."); + +/* ./templates/ktcore/assist/assist_notification_details.smarty */ +gettext("Subject"); + +/* ./templates/ktcore/assist/assist_notification_details.smarty */ +gettext("Details"); + +/* ./templates/ktcore/assist/assist_notification_details.smarty */ +gettext("Restore Document"); + +/* ./templates/ktcore/assist/assist_notification_details.smarty */ +gettext("View Document"); + +/* ./templates/ktcore/assist/assist_notification_details.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/ktcore/assist/assist_notification_details.smarty */ +gettext("Are you sure you wish to clear the notification?"); + +/* ./templates/ktcore/assist/assist_notification_details.smarty */ +gettext("Clear Alert"); + +/* ./templates/ktcore/authentication/addsource.smarty */ +gettext("Add an authentication source"); + +/* ./templates/ktcore/authentication/addsource.smarty */ +gettext("Add a new source"); + +/* ./templates/ktcore/authentication/editsource.smarty */ +gettext("Authentication Sources"); + +/* ./templates/ktcore/authentication/editsource.smarty */ +gettext("Edit an authentication source"); + +/* ./templates/ktcore/authentication/editsource.smarty */ +gettext("Save"); + +/* ./templates/ktcore/authentication/force_change_password.smarty */ +gettext("Change your password"); + +/* ./templates/ktcore/authentication/force_change_password.smarty */ +gettext("Change your password"); + +/* ./templates/ktcore/authentication/force_change_password.smarty */ +gettext("You are required to change your password as it has expired."); + +/* ./templates/ktcore/authentication/force_change_password.smarty */ +gettext("change password"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Authentication Sources"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("By default, #appname# controls its own users and groups and stores all information about them inside the database. In many situations, an organisation will already have a list of users and groups, and needs to use that existing information to allow access to the DMS. These Authentication Sources allow the system administrator to specify additional sources of authentication data."); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Add authentication source"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Add a new authentication source"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Only the standard database authentication is currently available. If you need to use a different authentication type (e.g. LDAP) you will need to ensure that the Plugin is enabled."); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("No additional authentication sources have been defined."); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Authentication source"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Edit Provider Information"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/authentication/manage.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/authentication/viewsource.smarty */ +gettext("Standard configuration"); + +/* ./templates/ktcore/authentication/viewsource.smarty */ +gettext("Name"); + +/* ./templates/ktcore/authentication/viewsource.smarty */ +gettext("Provider"); + +/* ./templates/ktcore/authentication/viewsource.smarty */ +gettext("Edit standard configuration"); + +/* ./templates/ktcore/authentication/viewsource.smarty */ +gettext("Provider configuration"); + +/* ./templates/ktcore/authentication/viewsource.smarty */ +gettext("Edit provider configuration"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Boolean Search"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("all"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("any"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Return items which match  #options# of the criteria groups specified."); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Criteria Group"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("all"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("any"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Return items which match  #options# of the criteria specified below."); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Criteria"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Values"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("first select a type of query"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Add"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Add another set of criteria"); + +/* ./templates/ktcore/boolean_search.smarty */ +gettext("Search"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Boolean Search"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("all"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("any"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Return items which match  #options# of the criteria groups specified."); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Criteria Group"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("all"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("any"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Return items which match  #options# of the criteria specified."); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Criteria"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Values"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("first select a type of query"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Add"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("add another set of criteria"); + +/* ./templates/ktcore/boolean_search_change.smarty */ +gettext("Search"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Boolean Search"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("all"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("any"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Return items which match  #options# of the criteria groups specified."); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Criteria Group"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("all"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("any"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Return items which match  #options# of the criteria specified."); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Criteria"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Values"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("first select a type of query"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Add"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("add another set of criteria"); + +/* ./templates/ktcore/boolean_search_edit.smarty */ +gettext("Search"); + +/* ./templates/ktcore/bulk_action_complete.smarty */ +gettext("These are the results of the bulk action"); + +/* ./templates/ktcore/bulk_action_complete.smarty */ +gettext("Folders"); + +/* ./templates/ktcore/bulk_action_complete.smarty */ +gettext("Name"); + +/* ./templates/ktcore/bulk_action_complete.smarty */ +gettext("Status"); + +/* ./templates/ktcore/bulk_action_complete.smarty */ +gettext("Documents"); + +/* ./templates/ktcore/bulk_action_complete.smarty */ +gettext("Name"); + +/* ./templates/ktcore/bulk_action_complete.smarty */ +gettext("Status"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("The following list shows documents and folders in your list which cannot be acted on by this bulk action"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("Folders"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("Name"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("Reason for failure"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("Documents"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("Name"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("Reason for failure"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("The action will be performed on the following documents and folders"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("Folders"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("Documents"); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("The action can be performed on the entire selection."); + +/* ./templates/ktcore/bulk_action_listing.smarty */ +gettext("The action cannot be performed on any of the selected entities."); + +/* ./templates/ktcore/configsettings.smarty */ +gettext("Save Config Settings"); + +/* ./templates/ktcore/configsettings.smarty */ +gettext("This page defines configuration options which are currently reserved for future development."); + +/* ./templates/ktcore/dashlets/admintutorial.smarty */ +gettext("#appname# administrator's Guide"); + +/* ./templates/ktcore/dashlets/admintutorial.smarty */ +gettext("If this is your first #appname# installation, or if you've just upgraded from #appname# 2.x, we've put together some information which might help you get to grips with the new system."); + +/* ./templates/ktcore/dashlets/admintutorial.smarty */ +gettext("Read the admin introduction."); + +/* ./templates/ktcore/dashlets/admintutorial.smarty */ +gettext("Find out what's new in KT 3."); + +/* ./templates/ktcore/dashlets/admintutorial.smarty */ +gettext("Don't show me this again."); + +/* ./templates/ktcore/dashlets/checkedout.smarty */ +gettext("A checked-out document may not be modified by others. Please ensure that you check-in your documents to the repository as soon as you have finished working with them."); + +/* ./templates/ktcore/dashlets/checkedout.smarty */ +gettext("View Document"); + +/* ./templates/ktcore/dashlets/checkedout.smarty */ +gettext("You have no documents which are currently checked out."); + +/* ./templates/ktcore/dashlets/indexer_status.smarty */ +gettext("Warning"); + +/* ./templates/ktcore/dashlets/indexer_status.smarty */ +gettext("There are currently no active indexers registered. No content indexing will occur."); + +/* ./templates/ktcore/dashlets/indexer_status.smarty */ +gettext("All indexers claim to be working correctly."); + +/* ./templates/ktcore/dashlets/indexer_status.smarty */ +gettext("Mime Types"); + +/* ./templates/ktcore/dashlets/indexer_status.smarty */ +gettext("Diagnostic"); + +/* ./templates/ktcore/dashlets/indexer_status.smarty */ +gettext("No indicated problem."); + +/* ./templates/ktcore/dashlets/kt3release.smarty */ +gettext("Edit this introduction."); + +/* ./templates/ktcore/dashlets/kt3release.smarty */ +gettext("Edit this introduction."); + +/* ./templates/ktcore/dashlets/kt3release.smarty */ +gettext("Use the standard introduction."); + +/* ./templates/ktcore/dashlets/mailserver.smarty */ +gettext("Email has not been configured on this server. Emailing of documents and sending of notifications are disabled."); + +/* ./templates/ktcore/dashlets/mailserver.smarty */ +gettext("Edit the Email Settings in DMS Administration >> System Configuration to set up emailing on this server."); + +/* ./templates/ktcore/dashlets/notifications.smarty */ +gettext("Showing first #visible# of #count# notifications."); + +/* ./templates/ktcore/dashlets/notifications.smarty */ +gettext("View All"); + +/* ./templates/ktcore/dashlets/notifications.smarty */ +gettext("Are you sure you wish to clear all notifications?"); + +/* ./templates/ktcore/dashlets/notifications.smarty */ +gettext("Clear all notifications"); + +/* ./templates/ktcore/dashlets/notifications.smarty */ +gettext("Are you sure you wish to clear all notifications?"); + +/* ./templates/ktcore/dashlets/notifications.smarty */ +gettext("Clear all notifications"); + +/* ./templates/ktcore/dashlets/notifications.smarty */ +gettext("No items require your attention."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("The scheduler takes care of managing and running tasks or batch jobs at regular intervals in the background. These tasks can be configured via the #link#."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("The last time these tasks were performed was on #time#."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("No tasks have been run yet."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("The tasks were scheduled to be run #time# ago."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("The tasks are scheduled to be run in #time#."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Note: The stack install uses its own service for task scheduling. To check if this service has been installed and is running, open the Control Panel, go to Administrative Tools and open the list of Services. The scheduler service is called KTScheduler. For further information on this service, please refer to the documentation."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Note: The stack install uses its own service for task scheduling and the following is only for source installs."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Please ensure that the scheduler is listed in your cron jobs. The line to be added to the crontab to implement the cron job is:"); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Guide to using cron:"); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("View jobs in the crontab:"); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Edit the crontab:"); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Press 'o' to start a new line."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Press 'i' to edit a line."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Press the 'esc' key to exit the edit mode."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Type ZZ to save changes and exit."); + +/* ./templates/ktcore/dashlets/scheduler.smarty */ +gettext("Type :q! to exit without saving."); + +/* ./templates/ktcore/dashlets/usertutorial.smarty */ +gettext("Crash Course in #appname#"); + +/* ./templates/ktcore/dashlets/usertutorial.smarty */ +gettext("New to Document Management, or to #appname#? We've written some quick documentation to help you along"); + +/* ./templates/ktcore/dashlets/usertutorial.smarty */ +gettext("Take the crash course."); + +/* ./templates/ktcore/dashlets/usertutorial.smarty */ +gettext("Learn about #appname# 3."); + +/* ./templates/ktcore/dashlets/usertutorial.smarty */ +gettext("Don't show me this again."); + +/* ./templates/ktcore/document/add.smarty */ +gettext("Add a document"); + +/* ./templates/ktcore/document/add.smarty */ +gettext("Add a document"); + +/* ./templates/ktcore/document/add.smarty */ +gettext("If you do not need to modify any the metadata for this document (see below), then you can simply click \"Add\" here to finish the process and add the document."); + +/* ./templates/ktcore/document/add.smarty */ +gettext("Add"); + +/* ./templates/ktcore/document/add.smarty */ +gettext("Additional Information about this Document"); + +/* ./templates/ktcore/document/add.smarty */ +gettext("Document Metadata allows you to provide additional, important information about this document that can be used to classify and report on its contents. The exact information required depends on the Document Type you selected above. Some of this information may be required, so please review the list of requested information carefully before finishing the process."); + +/* ./templates/ktcore/document/add.smarty */ +gettext("Add"); + +/* ./templates/ktcore/document/admin/archivebrowse.smarty */ +gettext("Archived Documents"); + +/* ./templates/ktcore/document/admin/archivebrowse.smarty */ +gettext("In order to keep the documents which are visible useful to end users it is possible to archive old documents. Users who want to see these old documents need to request their restoration. These requests will typically be done within the system and will generate a notification to you."); + +/* ./templates/ktcore/document/admin/archivebrowse.smarty */ +gettext("Use the folder collection and path below to browse to the folder containing the documents you wish to restore."); + +/* ./templates/ktcore/document/admin/archivebrowse.smarty */ +gettext("Restore"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("Checked Out Documents"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("It may be necessary to override the checked-out status of a document if"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("the local copy of the checked-out document has been lost"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("the user who did the check-out is not currently available to check it back in"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("Use the force checkin action in the listing below to override the checked-out status."); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("Document"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("Checked out by"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("Location"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("force checkin"); + +/* ./templates/ktcore/document/admin/checkoutlisting.smarty */ +gettext("No documents are currently checked out."); + +/* ./templates/ktcore/document/admin/dearchiveconfirmlist.smarty */ +gettext("Confirm De-archival"); + +/* ./templates/ktcore/document/admin/dearchiveconfirmlist.smarty */ +gettext("Note"); + +/* ./templates/ktcore/document/admin/dearchiveconfirmlist.smarty */ +gettext("please confirm that you want to restore these documents from an archived state."); + +/* ./templates/ktcore/document/admin/dearchiveconfirmlist.smarty */ +gettext("Document Name"); + +/* ./templates/ktcore/document/admin/dearchiveconfirmlist.smarty */ +gettext("Location"); + +/* ./templates/ktcore/document/admin/dearchiveconfirmlist.smarty */ +gettext("Confirm De-archival"); + +/* ./templates/ktcore/document/admin/dearchiveconfirmlist.smarty */ +gettext("No documents were selected."); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Deleted Documents"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Documents which are deleted by users are hidden from view but still available for restoration. Since \"soft deletes\" consume system resources, it is possible to expunge these documents. Alternatively, you can restore them as necessary."); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Document Name"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Document Path"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Last Modification"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Deletion Comment"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("items, 10 per page"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Expunge"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Restore"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("Expunge All"); + +/* ./templates/ktcore/document/admin/deletedlist.smarty */ +gettext("No documents are marked as deleted."); + +/* ./templates/ktcore/document/admin/expungeconfirmlist.smarty */ +gettext("Confirm Expunge"); + +/* ./templates/ktcore/document/admin/expungeconfirmlist.smarty */ +gettext("Note"); + +/* ./templates/ktcore/document/admin/expungeconfirmlist.smarty */ +gettext("please confirm that you want to delete these documents."); + +/* ./templates/ktcore/document/admin/expungeconfirmlist.smarty */ +gettext("Document Name"); + +/* ./templates/ktcore/document/admin/expungeconfirmlist.smarty */ +gettext("Confirm Expunge"); + +/* ./templates/ktcore/document/admin/expungeconfirmlist.smarty */ +gettext("No documents were selected."); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("Confirm Forced Check-in"); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("Please confirm that this is the document that you wish to check-in."); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("Document Details"); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("Document Name"); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("Location"); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("Checked out by"); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("The user who checked this document out is no longer valid."); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("Force Checkin"); + +/* ./templates/ktcore/document/admin/force_checkin_confirm.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Document Link Type Management"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Within #appname# it is possible for users to create links between related documents. Link types may include constructs such as \"associated with\" and \"duplicated by\". Please create link types required by your organisation below."); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Add a link type"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Specify the details for a new link type below."); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Add Link Type"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Edit a link type"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Specify the details for the link type below."); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Change Link Type"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Manage Existing Link Types"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("From this panel you can edit or delete existing link types."); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Note"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("deleting a link type will delete all links of that type within the system."); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Name"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Description"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("edit link type"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("edit link type"); + +/* ./templates/ktcore/document/admin/linktypesadmin.smarty */ +gettext("No link administrator changeable link types available."); + +/* ./templates/ktcore/document/admin/restoreconfirmlist.smarty */ +gettext("Confirm Restore"); + +/* ./templates/ktcore/document/admin/restoreconfirmlist.smarty */ +gettext("Note"); + +/* ./templates/ktcore/document/admin/restoreconfirmlist.smarty */ +gettext("please confirm that you want to restore these documents."); + +/* ./templates/ktcore/document/admin/restoreconfirmlist.smarty */ +gettext("Document Name"); + +/* ./templates/ktcore/document/admin/restoreconfirmlist.smarty */ +gettext("Restore To"); + +/* ./templates/ktcore/document/admin/restoreconfirmlist.smarty */ +gettext("Confirm Restore"); + +/* ./templates/ktcore/document/admin/restoreconfirmlist.smarty */ +gettext("No documents were selected."); + +/* ./templates/ktcore/document/change_type.smarty */ +gettext("Change Document Type"); + +/* ./templates/ktcore/document/change_type.smarty */ +gettext("This document is currently of type #doctype#. If this is incorrect, you can change it here."); + +/* ./templates/ktcore/document/change_type.smarty */ +gettext("Change Document Type"); + +/* ./templates/ktcore/document/cleanup.smarty */ +gettext("Document Storage Verification"); + +/* ./templates/ktcore/document/cleanup.smarty */ +gettext("When restoring from backups or checking that everything is functioning correctly with your DMS, it is important to know that all files that've been added to the system are present, and that no extraneous files have been found in the repository. This page shows you any such issues which you should investigate."); + +/* ./templates/ktcore/document/cleanup.smarty */ +gettext("All paths are relative to your Documents directory."); + +/* ./templates/ktcore/document/cleanup.smarty */ +gettext("Warning: Database is inconsistent with the contents of the repository."); + +/* ./templates/ktcore/document/cleanup.smarty */ +gettext("These documents have versions that are not present on the filesystem. Consider restoring them from backups."); + +/* ./templates/ktcore/document/cleanup.smarty */ +gettext("The following files are present in the repository, but do not exist in the database."); + +/* ./templates/ktcore/document/cleanup.smarty */ +gettext("No problems found - database is consistent with the contents of the repository."); + +/* ./templates/ktcore/document/cleanup_script.smarty */ +gettext("Warning: Database is inconsistent with the contents of the repository."); + +/* ./templates/ktcore/document/cleanup_script.smarty */ +gettext("All paths are relative to your Documents directory."); + +/* ./templates/ktcore/document/cleanup_script.smarty */ +gettext("These documents have versions that are not present on the filesystem. Consider restoring them from backups."); + +/* ./templates/ktcore/document/cleanup_script.smarty */ +gettext("The following files are present in the repository, but do not exist in the database."); + +/* ./templates/ktcore/document/compare.smarty */ +gettext("Version Comparison"); + +/* ./templates/ktcore/document/compare.smarty */ +gettext("showing comparison between versions #from# and #to#."); + +/* ./templates/ktcore/document/compare.smarty */ +gettext("View current version"); + +/* ./templates/ktcore/document/compare.smarty */ +gettext("Please note"); + +/* ./templates/ktcore/document/compare.smarty */ +gettext("the information for version #version# comes from an older version of #appname# and may be incorrect."); + +/* ./templates/ktcore/document/compare.smarty */ +gettext("Please note"); + +/* ./templates/ktcore/document/compare.smarty */ +gettext("the information for version #version# comes from an older version of #appname# and may be incorrect."); + +/* ./templates/ktcore/document/comparison_version_select.smarty */ +gettext("Select Document Version to compare against"); + +/* ./templates/ktcore/document/comparison_version_select.smarty */ +gettext("This page lists versions of document metadata and allows you to compare a metadata version with the current metadata content."); + +/* ./templates/ktcore/document/comparison_version_select.smarty */ +gettext("Document History for #appname# New UI Presentation"); + +/* ./templates/ktcore/document/comparison_version_select.smarty */ +gettext("User"); + +/* ./templates/ktcore/document/comparison_version_select.smarty */ +gettext("Metadata Version"); + +/* ./templates/ktcore/document/comparison_version_select.smarty */ +gettext("Compare"); + +/* ./templates/ktcore/document/comparison_version_select.smarty */ +gettext("comparing against this version"); + +/* ./templates/ktcore/document/comparison_version_select.smarty */ +gettext("compare"); + +/* ./templates/ktcore/document/delete_version.smarty */ +gettext("Delete Document Version"); + +/* ./templates/ktcore/document/delete_version.smarty */ +gettext("On deleting a document version the version history will remain but the document will be permanently deleted."); + +/* ./templates/ktcore/document/delete_version.smarty */ +gettext("The following document version has been selected for deletion:"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Document permissions"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("This page shows the permissions that apply to this specific document. Where the folder view shows you information by role and group, this page shows the actual groups (and, if they are assigned directly to a role, the users) who have the different permissions. As a result, groups, users and roles with no permissions are not shown."); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Manage security"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("View resolved permissions for user"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("No roles or groups have been defined or have permissions."); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Role or Group"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Role"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Group"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("User:"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/document/document_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/document/edit.smarty */ +gettext("Edit Metadata"); + +/* ./templates/ktcore/document/edit.smarty */ +gettext("Change the document type. The current type is \"#name#\""); + +/* ./templates/ktcore/document/edit.smarty */ +gettext("The following document metadata is available for editing."); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Document Version History"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("This page lists versions of document metadata and allows you to compare a metadata version with the current metadata content."); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Document History for #appname# New UI Presentation"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("User"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Metadata Version"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Content Version"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Compare with Current"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Compare with Other Version"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Date Created"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Delete Version"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("current version"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Metadata"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("mime types do not match"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Content"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Metadata"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Content"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Version deleted"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("delete version"); + +/* ./templates/ktcore/document/metadata_history.smarty */ +gettext("Show deleted versions"); + +/* ./templates/ktcore/document/ownershipchangeaction.smarty */ +gettext("Change Ownership"); + +/* ./templates/ktcore/document/resolved_permissions_user.smarty */ +gettext("Resolved permissions per user"); + +/* ./templates/ktcore/document/resolved_permissions_user.smarty */ +gettext("This page shows the permissions that individual users have on this document. Only the users which have permissions assigned are shown."); + +/* ./templates/ktcore/document/resolved_permissions_user.smarty */ +gettext("Users may have permissions on this document due to membership of a group, or fulfilling a specific role on this document."); + +/* ./templates/ktcore/document/resolved_permissions_user.smarty */ +gettext("No users have permissions on this item."); + +/* ./templates/ktcore/document/resolved_permissions_user.smarty */ +gettext("User"); + +/* ./templates/ktcore/document/resolved_permissions_user.smarty */ +gettext("User:"); + +/* ./templates/ktcore/document/resolved_permissions_user.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/document/resolved_permissions_user.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/document/transaction_history.smarty */ +gettext("Document Transaction History"); + +/* ./templates/ktcore/document/transaction_history.smarty */ +gettext("This page provides details of all activities that have been carried out on the document."); + +/* ./templates/ktcore/document/transaction_history.smarty */ +gettext("Document History for #appname# New UI Presentation"); + +/* ./templates/ktcore/document/transaction_history.smarty */ +gettext("User"); + +/* ./templates/ktcore/document/transaction_history.smarty */ +gettext("Action"); + +/* ./templates/ktcore/document/transaction_history.smarty */ +gettext("Date"); + +/* ./templates/ktcore/document/transaction_history.smarty */ +gettext("Content version"); + +/* ./templates/ktcore/document/transaction_history.smarty */ +gettext("Comment"); + +/* ./templates/ktcore/document/view.smarty */ +gettext("Document Details"); + +/* ./templates/ktcore/document/view.smarty */ +gettext("This document is currently checked out by you. If this is incorrect, or you no longer need to make changes to it, please cancel the checkout."); + +/* ./templates/ktcore/document/view.smarty */ +gettext("This document is currently checked out by #checkoutuser#, but you have sufficient priviledges to cancel their checkout."); + +/* ./templates/ktcore/document/view.smarty */ +gettext("This document is currently checked out by #checkoutuser#. You cannot make changes until that user checks it in. If you have urgent modifications to make, please contact your #appname# Administrator."); + +/* ./templates/ktcore/document/view.smarty */ +gettext("This document is immutable. No further content changes can be made to this document, and only administrators (in administration mode) can make changes to the metadata or can move or delete it."); + +/* ./templates/ktcore/document/view.smarty */ +gettext("If you require assistance from an administrator to perform one of these tasks, use the Request Assistance action."); + +/* ./templates/ktcore/document/viewlets/workflow.smarty */ +gettext("Available Transitions"); + +/* ./templates/ktcore/document/viewlets/workflow.smarty */ +gettext("The document is currently in state \"#name#\""); + +/* ./templates/ktcore/document/viewlets/workflow.smarty */ +gettext("No transitions are available while the document is checked out."); + +/* ./templates/ktcore/document/viewlets/workflow.smarty */ +gettext("Last Comment"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Document Type"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Change"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Type-specific field sets"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Linked Fieldsets"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Fieldset"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Disassociate Fieldsets"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("No fieldsets are currently associated with this type."); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Associate Fieldsets"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Associate Fieldsets"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("No fieldsets are available to be added. To add a fieldset, please go to DMS Administration"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Document Metadata and Workflow Configuration"); + +/* ./templates/ktcore/documenttypes/edit.smarty */ +gettext("Document Field Management"); + +/* ./templates/ktcore/documenttypes/folderassign.smarty */ +gettext("Document types"); + +/* ./templates/ktcore/documenttypes/folderassign.smarty */ +gettext("Select document types allowed in folder"); + +/* ./templates/ktcore/documenttypes/folderassign.smarty */ +gettext("Folder"); + +/* ./templates/ktcore/documenttypes/folderassign.smarty */ +gettext("Restrict document types"); + +/* ./templates/ktcore/documenttypes/folderassign.smarty */ +gettext("Document Types"); + +/* ./templates/ktcore/documenttypes/folderassign.smarty */ +gettext("Assign"); + +/* ./templates/ktcore/documenttypes/folderassign.smarty */ +gettext("Back to folder"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Document Types"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Create a new document type"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("To start the process of creating a new document type, please enter a name for the type below."); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Create"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Existing document types"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Select a document type from the list below to change its details, or use the enable/disable buttons to change its availability state."); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Document Type"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Associated Fieldsets"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Disable/Enable"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Edit fieldset."); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Edit document type."); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Enable document type."); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Enable"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Disable document type."); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Are you sure you wish to disable this document type?"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Disable"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Delete document type."); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Are you sure you wish to delete this document type? It will be permanently removed from the system."); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/documenttypes/list.smarty */ +gettext("Document type cannot be deleted"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Edit Fieldset"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Current Fields in Set"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Fields which are currently not included in any set can be added to this set."); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("No fields associated with this fieldset."); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Add Field to set"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Fields which are currently not included in any set can be added to this set."); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("No free fields."); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Add to Fieldset"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Make this fieldset conditional"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("No free fields."); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Add to Fieldset"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Field has conditions attached to it."); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Manage conditions."); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Test conditions"); + +/* ./templates/ktcore/edit_conditional.smarty */ +gettext("Fieldset cannot be made conditional. One of the fields must not be a lookup."); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Edit Fieldset"); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Current Fields in Set"); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Fields which are currently not included in any set can be added to this set."); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("No fields associated with this fieldset."); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Add Field to set"); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Fields which are currently not included in any set can be added to this set."); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("No free fields."); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Add to Fieldset"); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Make this fieldset conditional"); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("No free fields."); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Add to Fieldset"); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Field has conditions attached to it."); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Manage conditions."); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Test conditions"); + +/* ./templates/ktcore/edit_fieldset.smarty */ +gettext("Fieldset cannot be made conditional. One of the fields must not be a lookup."); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Fieldset"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Fieldset properties"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Name"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Namespace"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Change"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Fieldset members"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Existing members"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Remove fields"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Add a new field"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Name"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Type"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Normal"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Lookup"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Tree"); + +/* ./templates/ktcore/fields/edit.smarty */ +gettext("Add field"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Document Fields"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Existing generic document fields"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Name"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Generic"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Fields"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("No"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Create a new document field set"); + +/* ./templates/ktcore/fields/list.smarty */ +gettext("Create"); + +/* ./templates/ktcore/folder/bulkImport.smarty */ +gettext("Import files into"); + +/* ./templates/ktcore/folder/bulkImport.smarty */ +gettext("Import from Server Location"); + +/* ./templates/ktcore/folder/bulkImport.smarty */ +gettext("The bulk import facility allows for a number of documents to be added to the document management system easily. Provide a path on the server, and all documents and folders within that path will be added to the document management system."); + +/* ./templates/ktcore/folder/bulkImport.smarty */ +gettext("If there are metadata fields associated with this document type they will appear below and allow you to set metadata on all imported documents. If there is no metadata associated, or you do not wish to modify it, you can simply click \"Add\" here to finish the process and import the documents."); + +/* ./templates/ktcore/folder/bulkImport.smarty */ +gettext("Add"); + +/* ./templates/ktcore/folder/bulkImport.smarty */ +gettext("Import"); + +/* ./templates/ktcore/folder/bulkUpload.smarty */ +gettext("Upload files into"); + +/* ./templates/ktcore/folder/bulkUpload.smarty */ +gettext("Bulk upload"); + +/* ./templates/ktcore/folder/bulkUpload.smarty */ +gettext("The bulk upload facility allows for a number of documents to be added to the document management system. Provide an archive (ZIP) file from your local computer, and all documents and folders within that archive will be added to the document management system."); + +/* ./templates/ktcore/folder/bulkUpload.smarty */ +gettext("If you do not need to modify any the metadata for this document (see below), then you can simply click \"Add\" here to finish the process and add the document."); + +/* ./templates/ktcore/folder/bulkUpload.smarty */ +gettext("Add"); + +/* ./templates/ktcore/folder/bulkUpload.smarty */ +gettext("Upload"); + +/* ./templates/ktcore/folder/mass_delete.smarty */ +gettext("Delete Files and Folders"); + +/* ./templates/ktcore/folder/mass_delete.smarty */ +gettext("Specify Reason for Delete"); + +/* ./templates/ktcore/folder/mass_delete.smarty */ +gettext("Please give a reason for deleting these files. This will be recorded in the documents' \"Transaction History\""); + +/* ./templates/ktcore/folder/mass_delete.smarty */ +gettext("Items to delete"); + +/* ./templates/ktcore/folder/mass_delete.smarty */ +gettext("The items that you selected to delete."); + +/* ./templates/ktcore/folder/mass_delete.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/folder/mass_delete.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("No roles or groups have been defined. Permissions can only be allocated to roles and groups."); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Manage security"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("View permissions overview"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("View resolved permissions for user"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("This folder defines its own permissions."); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Are you sure you wish to reinstate inherited permissions?"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Inherit permissions"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Select roles and groups for whom you wish to change permission assignment from the box on the left, and move them over to the box on the right using the button with right-pointing arrows. You can then allocate or remove permissions from these entities and save by pressing the 'Update Permission Assignments' button'."); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Available Entities"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Assigned Entities"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Show All"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Update Permission Assignments"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Dynamic permissions"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Group"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Condition"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Add a new dynamic permission"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Group"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Condition"); + +/* ./templates/ktcore/folder/permissions.smarty */ +gettext("Add"); + +/* ./templates/ktcore/folder/rename.smarty */ +gettext("Rename Folder"); + +/* ./templates/ktcore/folder/rename.smarty */ +gettext("This page allows you to rename a folder."); + +/* ./templates/ktcore/folder/rename.smarty */ +gettext("Rename Folder"); + +/* ./templates/ktcore/folder/rename.smarty */ +gettext("Rename"); + +/* ./templates/ktcore/folder/rename.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Permissions"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("This page shows the permissions that apply to this specific folder. Only the roles or groups which have permissions assigned are shown."); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("No roles, groups, or users have been defined or have permissions."); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Role or Group"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Role"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Group"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("User:"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/folder/resolved_permissions.smarty */ +gettext("Update Permission Assignments"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("Resolved permissions per user"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("This page shows the permissions that individual users have on this folder. Only the users which have permissions assigned are shown."); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("Users may have permissions on this folder due to membership of a group, or fulfilling a specific role on this folder."); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("No users have permissions on this item."); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("Manage security"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("Edit permissions"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("View permissions overview"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("Manage security"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("View permissions overview"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("User"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("User:"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/resolved_permissions_user.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Allocate Roles for"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("In many cases, workflow actions will be assigned to certain roles (e.g. Manager, Interviewer, Researcher, Journalist). You can assign these roles to specific groups in particular areas of the document management system."); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Warning"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Please note that changing role allocations may take a some time, depending on the number of folders below this one."); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Role"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Allocated users"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Edit Users"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Edit Groups"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Use Parent"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("inherited from parent folder."); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Users"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Groups"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Override Parent Allocation"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Edit Users"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Edit Users"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Edit Groups"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Edit Groups"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Are you sure you wish to remove this role allocation?"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Use parent's allocation"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("Use parent's allocation"); + +/* ./templates/ktcore/folder/roles.smarty */ +gettext("No roles defined in the Role Administration area."); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Allocate Groups to Role: #rolename#"); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Groups must be allocated to roles to ensure that the workflow transition this role is supposed to support can be acted upon by a user."); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Allocate Groups"); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Select the groups which should be part of this role."); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Available Groups"); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Member groups"); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("save changes"); + +/* ./templates/ktcore/folder/roles_managegroups.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Allocate User to Role"); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Add or remove users for this role."); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Allocate User to Role"); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("To add users to this role, select one or more user names in the Available Users field; then, double click or use the right pointing arrow to populate the Member users field. To remove users from this role, select one or more user names in the Member users field; then, double click, or use the left pointing arrow to move these names to Available Users."); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Use the Filter fields to display names in order of specified criteria. Use the Ctrl key to multi-select user names."); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Available Users"); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Member users"); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("save changes"); + +/* ./templates/ktcore/folder/roles_manageusers.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/folder/shortcut.smarty */ +gettext("Add Shortcut"); + +/* ./templates/ktcore/folder/shortcut.smarty */ +gettext("Select a document or folder to make a shortcut to."); + +/* ./templates/ktcore/folder/shortcut.smarty */ +gettext("Add shortcut"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("View Permissions for"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("This page shows the permissions that apply to this specific folder. Only the roles or groups which have permissions assigned are shown."); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Manage security"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Edit permissions"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("View resolved permissions for user"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Manage security"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("View resolved permissions for user"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("This folder inherits its permissions from #permission_source#."); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Are you sure you wish to override the permissions?"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Override permissions"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("This folder defines its own permissions."); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("No roles, groups, or users have been defined or have permissions."); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Role or Group"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Role"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Group"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("User:"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Dynamic Conditions"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Group"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Condition"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Allowed"); + +/* ./templates/ktcore/folder/view_permissions.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/forms/buttons.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/forms/widgets/base.smarty */ +gettext("Required"); + +/* ./templates/ktcore/forms/widgets/descriptor.smarty */ +gettext("Available"); + +/* ./templates/ktcore/forms/widgets/descriptor.smarty */ +gettext("Assigned"); + +/* ./templates/ktcore/forms/widgets/descriptor.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/forms/widgets/descriptor.smarty */ +gettext("Show All"); + +/* ./templates/ktcore/forms/widgets/descriptor.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/forms/widgets/password.smarty */ +gettext("Confirm #label#"); + +/* ./templates/ktcore/forms/widgets/password.smarty */ +gettext("Required"); + +/* ./templates/ktcore/help_with_edit.smarty */ +gettext("No content specified for this help file yet. Edit it first."); + +/* ./templates/ktcore/help_with_edit.smarty */ +gettext("Edit this help page."); + +/* ./templates/ktcore/help_with_edit.smarty */ +gettext("Edit this help page."); + +/* ./templates/ktcore/help_with_edit.smarty */ +gettext("Return to where you came from."); + +/* ./templates/ktcore/help_with_edit.smarty */ +gettext("Return to where you came from."); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Finish with this column's behaviours."); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Assuming this field has behaviour \""); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Dependencies saved ("); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Dependencies for value \""); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Now editing field \""); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Loading Dependencies for value \""); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Undo"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Undo"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("loading..."); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("first select a type of query"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Add"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Criteria Group"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Criteria"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Values"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Return items which match"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("all"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("any"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("of the criteria specified."); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Add Dashlet"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Add Dashlets"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("close"); + +/* ./templates/ktcore/javascript_i18n.smarty */ +gettext("Role or Group"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Upload succeeded"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document type changed"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Upload failed"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has not been saved."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("A newer version of this document is available. Would you like to open it instead?"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Upload"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Upload cancelled"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has been saved."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Download failed"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has not been downloaded."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Download succeeded"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has been downloaded."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Checkout failed"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has not been checked out."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Checkout succeeded"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has been checked out."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Checkin failed"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has not been checked in."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Checkin succeeded"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has been checked in."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document checked in."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document checked out."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Cancel checkout failed"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("The check-out has not been cancelled."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Cancel checkout succeeded"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("The check-out has been cancelled."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Properties could not be saved."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Properties have been saved."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Login failed"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Login failed."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Unable to connect to server"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Please verify your
Internet connection,
and try again."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Cancelling edit of document (check-in)"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Provide a reason for cancelling this edit.

"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Continue Editing (check-out)"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Provide a reason for this edit.

"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Editing Document (check-out)"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Provide a reason for editing this document.

"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Saving Document (check-in)"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("For historical purposes, describe the changes you made to this document.

"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("OK"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Please enter a comment"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Use this comment next time."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Comment Required"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("No"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Send Email"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Message:"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Type your message here ..."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("To:"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Searching..."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Search"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Please enter a message"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Please enter some recipients"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("No Recipients"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document Sent"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document has been emailed to recipients"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Unable to email document"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document has not been emailed to recipients."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Email Document"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Server Settings"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Display Language"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Username"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Password"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Login"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document already open"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Unable to delete folder"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Delete Folder"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("This will delete this folder.
Are you sure you want to continue?"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Unable to Delete Folder"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("This folder contains other documents/folders
and may not be deleted."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Introduction"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("The requested action has not been implemented"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Any unsaved changes will be lost! Are you sure you want to continue?"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Error"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Please close all open editors."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Warning"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Do you want to add the currently open Office document as a new version of [-doctitle-]?"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Are you sure you want to cancel your edit?"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("This document is not saved to KnowledgeTree. Are you sure you want to cancel saving to KnowledgeTree?"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document has been saved to KnowledgeTree"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("No permission"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("You need to have permission to perform this action"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Save"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Adds your open Office document to KnowledgeTree. You must have 'write' permissions on the folder."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Add Folder"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Provides an interface to create a new folder under the current folder. You must have 'add' permissions on the folder."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Rename Folder"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Provides an interface to rename the current folder. You must have 'rename' permissions on the folder."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Provides an interface to delete the current folder. You must have 'delete' permissions on the folder."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("New folder"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Saves active document to a new folder. You must have 'write' permissions on the folder."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Opens the selected KnowledgeTree document in Office for editing and sets the version in KnowledgeTree to 'read only'. You must have 'write' permissions."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("View a Copy"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Open the selected KnowledgeTree document for viewing in Office. Changing the local copy does not update the KnowledgeTree version."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Save As New Version"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Adds your open document as a new version of the KnowledgeTree document selected in the tree."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Email Document to users."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Save Properties"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Saves edited document properties to KnowledgeTree."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Saves your changes to KnowledgeTree and allows you to continue editing the document in Office."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Save and Close"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Saves your changes to KnowledgeTree and closes the document in Office."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Cancel Edit"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Closes a KnowledgeTree document currently open in Office for editing. Your changes are not saved to KnowledgeTree."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Undo Changes"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Restores document properties to previously saved values."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Open Another Document"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("View/edit another KnowledgeTree document in Office."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Revert"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Closes the currently open document in Office and opens the currently stored version from KnowledgeTree in Office. Any changes you make to the document may be saved only to the local copy, or add the edited document to KnowledgeTree as a new document."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Save As"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Saves a KnowledgeTree document currently open for viewing in Office as a new document in KnowledgeTree."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Start Editing"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Changes the status of a KnowledgeTree document opened for viewing in Office to 'read only' so that you may edit the document in Office. You must have 'write' permissions."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Restores previously saved document properties."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Save as"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Saves the document you downloaded from KnowledgeTree as a new document in KnowledgeTree."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Closes the currently open document in Office and opens the currently stored version from KnowledgeTree in Office. Any changes you make to the document may be saved only to the local copy, or add the edited document to KnowledgeTree as a new document."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Opens a new instance of Microsoft Office and KnowledgeTree Office Add-in, where you can view / edit another KnowledgeTree document in Office."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Adds your open Office document to KnowledgeTree, and closes the document in Office. You must have 'write' permissions on the folder."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Closes the document currently open in Office. Any changes you made to the document are not saved to KnowledgeTree."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Loading"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Send"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Error has been submitted. Thank you!"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Copy to clipboard"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("All error reports are submitted anonymously.rnrnTo help us resolve this error, please use this comment box to provide a brief description of the task you were performing when this error occurred."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Viewing"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document type could not be changed"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Document type could not be reset"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Select..."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Double-click to Select"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Double-click to Edit"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Please complete all required fields."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Editing"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("File Type"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Type"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Some fields are required"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Title"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Click to enter"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Default"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Select a document type"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Click to select"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("A document with the same title already exists in the target folder"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("A document with the same title already exists in the folder."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Your document was not saved to the server"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("No text entered"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("You need to enter text to be searched"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Logout"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("No Read permissions"); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("You do not have the required permissions to view the root folder. Please contact your system administrator for assistance."); + +/* ./templates/ktcore/ktoffice_i18n.smarty */ +gettext("Search for documents"); + +/* ./templates/ktcore/login.smarty */ +gettext("Login | #appname#"); + +/* ./templates/ktcore/login.smarty */ +gettext("Community Edition"); + +/* ./templates/ktcore/login.smarty */ +gettext("Please enter your details below to login."); + +/* ./templates/ktcore/login.smarty */ +gettext("Username"); + +/* ./templates/ktcore/login.smarty */ +gettext("Password"); + +/* ./templates/ktcore/login.smarty */ +gettext("Language"); + +/* ./templates/ktcore/login.smarty */ +gettext("Login"); + +/* ./templates/ktcore/login.smarty */ +gettext("#appname# Version"); + +/* ./templates/ktcore/login.smarty */ +gettext("Document Management Software"); + +/* ./templates/ktcore/login.smarty */ +gettext("© 2008, 2009 KnowledgeTree Inc."); + +/* ./templates/ktcore/login.smarty */ +gettext("This program is free software and published under the GNU General Public License version 3"); + +/* ./templates/ktcore/login.smarty */ +gettext("All rights reserved."); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Existing Fieldsets"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Human Name"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Namespace"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Manage"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Built-in set."); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Create a new Fieldset"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Name"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Namespace"); + +/* ./templates/ktcore/manage_fieldsets.smarty */ +gettext("Create Fieldset"); + +/* ./templates/ktcore/manage_help.smarty */ +gettext("Current help assignments"); + +/* ./templates/ktcore/manage_help.smarty */ +gettext("To customize a help file, please visit that file via the help system and click on customize this help file."); + +/* ./templates/ktcore/manage_help.smarty */ +gettext("Existing customized help pages"); + +/* ./templates/ktcore/manage_help.smarty */ +gettext("Title"); + +/* ./templates/ktcore/manage_help.smarty */ +gettext("Name"); + +/* ./templates/ktcore/manage_help.smarty */ +gettext("Actions"); + +/* ./templates/ktcore/manage_help.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/manage_help.smarty */ +gettext("No help files have been customized."); + +/* ./templates/ktcore/manage_help_item.smarty */ +gettext("Title"); + +/* ./templates/ktcore/manage_help_item.smarty */ +gettext("Help content"); + +/* ./templates/ktcore/manage_help_item.smarty */ +gettext("Update"); + +/* ./templates/ktcore/manage_lookuptrees.smarty */ +gettext("Manage Lookup Trees"); + +/* ./templates/ktcore/manage_lookuptrees.smarty */ +gettext("Fields that have lookup categories."); + +/* ./templates/ktcore/manage_lookuptrees.smarty */ +gettext("Edit Categorisation"); + +/* ./templates/ktcore/manage_lookuptrees.smarty */ +gettext("Convert to Trees."); + +/* ./templates/ktcore/manage_lookuptrees.smarty */ +gettext("Lookup fields without categories."); + +/* ./templates/ktcore/manage_lookuptrees.smarty */ +gettext("Convert"); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Existing permissions"); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Permissions are descriptors used to ascertain whether groups of users have access to certain functionality. The built-in permissions below facilitate the default functionality of the DMS and can't be changed. Plugin developers may choose to add additional permissions below that manage access to their plugins functionality."); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Create a new permission"); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Create"); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Permission"); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Display Name"); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Built-in"); + +/* ./templates/ktcore/manage_permissions.smarty */ +gettext("Delete Permission"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Fieldsets bring together different fields into a collection of related information."); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Add New Field"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Add New Field"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Field Name"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Type Description"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Position"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("edit"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("delete"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Reorder up"); + +/* ./templates/ktcore/metadata/admin/basic_overview.smarty */ +gettext("Reorder down"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Edit Fieldset: #fieldset_name#"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Name"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Description"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Generic"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("No"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Used by"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Edit these details"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Edit these details"); + +/* ./templates/ktcore/metadata/admin/edit.smarty */ +gettext("Additional Information"); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Edit Lookup Tree"); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Many \"lookup\" fields make sense in a hierachy: countries are part of continents and sub-continents, school classes are part of grades and programs, Powerbooks are Apple Macs, while Thinkpads are made by Lenovo. This page will allow you to arrange the lookups in the field in a hierachy. All changes are immediately stored, so when you are done simply navigate back to the field menu."); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Add New Subcategory to #category#"); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("In order to organise the options into a \"tree\", you need to add subcategories at each level. The \"top\" level is called the root, and holds all the top-level items. \"Root\" will not be shown to the final user, but provides a single \"parent\" to the top-level items."); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("As an example, if you are creating a tree of the countries in the world, the actual countries would be keywords (e.g. South Africa, England, Pakistan, India, etc.). The highest group of categories would be continents — e.g. Africa, Europe, Asia, The Americas — followed by subcategories that contain actual countries — e.g. Western Europe, Sub-Saharan Africa, Australasia."); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("add new subcategory"); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Keywords which are directly below the Root are considered \"free\" — they are not attached to a subcategory. Only free keywords can be associated with a subcategory. To free a keyword, click on the \"unlink\" command next to it in the preview tree below. Deleting a subcategory will automatically unlink all keywords below it (including those in subcategories of the subcategory)."); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("No free keywords. Use the \"unlink\" action on a keyword to make it available."); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Attach keywords to #category#"); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Keywords which are directly below the Root are considered \"free\" — they are not attached to a subcategory. Only free keywords can be associated with a subcategory. To free a keyword, click on the \"unlink\" command next to it in the preview tree below."); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Add to category"); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Preview"); + +/* ./templates/ktcore/metadata/admin/edit_lookuptree.smarty */ +gettext("Use the +/- arrows to open or close the tree. Bold items are metadata keywords. To edit a category (including adding or removing keywords) click on the \"attach keywords\" link next to it."); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Document Fieldsets"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Collections of fields are associated into fieldsets. These represent a set of related information which can be associated with a document and thus comprise part of the document's metadata."); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Create new Fieldset"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Create New Fieldset"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Existing document fieldsets"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Name"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Generic"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("System"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Fields"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Document Types"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("No"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("No"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/admin/list.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Manage Field: #field_name#"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("This page will allow you to manage the different aspects of this particular field."); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Extra Options"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Different fields have different actions and options available."); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Add Lookup Values"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Add Lookup Values"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Manage Lookup Values"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Manage Lookup Values"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Manage Lookup Tree Structure"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Manage Lookup Tree Structure"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Extra Options"); + +/* ./templates/ktcore/metadata/admin/manage_field.smarty */ +gettext("Different fields have different actions and options available."); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Manage Lookups for \"#field_name#\""); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Manage Lookups"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Over time, the lookup values which make sense will change and evolve as your organisation does. You may thus need to change the lookup values associated with a given field. There are a number of different states that are possible for a given lookup"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Enabled, which means that users can specify this as an option when editing or creating documents."); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Sticky, which is used if you have some external plugin controlling this lookup set. This will then tell that plugin not to remove the \"sticky\" value, even if it no longer available in the remote source."); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Deleted, which completely removes the selected items from the lookup. Note that this may not be possible if some other aspect of the system depends on a particular lookup."); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Lookup Value"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Enabled"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Sticky"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("No"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Edit value"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Toggle enabled state"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Toggle stickiness"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/metadata/admin/manage_lookups.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("This is a conditional fieldset. That means that the values selected in one field affect the possible values in the other fields. Only lookup fields can be added to this fieldset."); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Add New Field"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Add New Field"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("View Overview"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("View Overview"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Conditional Fieldset Management"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Manage Conditional Behaviours"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Manage Conditional Behaviours"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Manage Field Ordering"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Manage Field Ordering"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Field Name"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("Type Description"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("edit"); + +/* ./templates/ktcore/metadata/conditional/conditional_admin_overview.smarty */ +gettext("delete"); + +/* ./templates/ktcore/metadata/conditional/conditional_overview.smarty */ +gettext("Conditional Metadata Overview"); + +/* ./templates/ktcore/metadata/conditional/conditional_overview.smarty */ +gettext("Conditional Metadata is made up of fields, values and behaviours. For a given behaviour, various values in other fields can be selected. Depending on both the behaviour and the newly selected value, additional fields and values may be selected, which cause a new behaviour to be \"active\"."); + +/* ./templates/ktcore/metadata/conditional/conditional_overview.smarty */ +gettext("Test Instance"); + +/* ./templates/ktcore/metadata/conditional/conditional_overview.smarty */ +gettext("For the majority of conditional cases, simply walking through a test is sufficient. You can do that below for the fieldset you have selected."); + +/* ./templates/ktcore/metadata/conditional/conditional_overview.smarty */ +gettext("conditional data."); + +/* ./templates/ktcore/metadata/conditional/conditional_overview.smarty */ +gettext("These behaviours and the fields and values they allow are shown below for the active field."); + +/* ./templates/ktcore/metadata/conditional/conditional_overview.smarty */ +gettext("Clicking on a given behaviour below will show you which fields and values can be selected when the clicked behaviour is active."); + +/* ./templates/ktcore/metadata/conditional/conditional_rename_behaviours.smarty */ +gettext("Rename Behaviours"); + +/* ./templates/ktcore/metadata/conditional/conditional_rename_behaviours.smarty */ +gettext("If you have converted a simple conditional fieldset to a complex one, it may be useful to rename some of the system-generated names. You can do that here."); + +/* ./templates/ktcore/metadata/conditional/conditional_rename_behaviours.smarty */ +gettext("Current Name"); + +/* ./templates/ktcore/metadata/conditional/conditional_rename_behaviours.smarty */ +gettext("New Name"); + +/* ./templates/ktcore/metadata/conditional/conditional_rename_behaviours.smarty */ +gettext("Rename Behaviours"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Edit Complex Conditional Metadata"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Complex Conditional Metadata depends on what are called \"behaviours\". Essentially, behaviours are assigned to a single field, and can contain any number of values that are available in that field. Each field can have multiple behaviours assigned to it."); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Each behaviour can cause a number of other behaviours — in the field's child fields — to become available. By assigning values to behaviours, and creating relationships between behaviours, you can create extremely complex relationships between available lookup values."); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Changes made here are stored immediately, without you needing to refresh the page."); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("This column is not active."); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Editing behaviour Jack"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Assigned Items"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("remove behaviour"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("No items have been assigned with the current parent behaviour."); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Unassigned/Unavailable"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Assign to behaviour"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Select a behaviour"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("or to a new behaviour called"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("create behaviour"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Edit Behaviour"); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Select a behaviour from this list to change the items which are available."); + +/* ./templates/ktcore/metadata/conditional/editcomplex.smarty */ +gettext("Select a behaviour"); + +/* ./templates/ktcore/metadata/conditional/editsimple.smarty */ +gettext("Editing Fieldset Rules (Simple)"); + +/* ./templates/ktcore/metadata/conditional/editsimple.smarty */ +gettext("To make a value in a child field available to the user when another value is selected in a parent field, first ensure that the parent field is being edited (it will have \"save\" and \"done\" as the buttons at the bottom of the column) and then select the value for the parent field. Now select the value(s) in the child column(s) you wish to be available to the user when the parent field's value is selected, and click \"save\". Note you that you can use Ctrl-<click> to select multiple child values at the same time."); + +/* ./templates/ktcore/metadata/conditional/editsimple.smarty */ +gettext("Changes made here are stored immediately, without you needing to refresh the page."); + +/* ./templates/ktcore/metadata/conditional/editsimple.smarty */ +gettext("This field is not controlled by the currently active group."); + +/* ./templates/ktcore/metadata/conditional/editsimple.smarty */ +gettext("edit field"); + +/* ./templates/ktcore/metadata/conditional/editsimple.smarty */ +gettext("save this dependency"); + +/* ./templates/ktcore/metadata/conditional/manage_ordering.smarty */ +gettext("Manage Field Ordering"); + +/* ./templates/ktcore/metadata/conditional/manage_ordering.smarty */ +gettext("Existing ordering"); + +/* ./templates/ktcore/metadata/conditional/manage_ordering.smarty */ +gettext("controls the values available in"); + +/* ./templates/ktcore/metadata/conditional/manage_ordering.smarty */ +gettext("Order Fields"); + +/* ./templates/ktcore/metadata/conditional/manage_ordering.smarty */ +gettext("The value of the field"); + +/* ./templates/ktcore/metadata/conditional/manage_ordering.smarty */ +gettext("controls the values of the following fields"); + +/* ./templates/ktcore/metadata/conditional/manage_ordering.smarty */ +gettext("Order"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Manage conditional fieldset"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Conditional fieldsets allow you to restrict the options a user has for values in some fields based on the values in other fields, allowing you to say that the values of one field are restricted to a certain subset of values if another field has a specific value. For example, you could say that if the field \"Street\" is \"Jeffrey\", then the field \"Residents\" must be one of \"Jones\",\"Smith\" or \"Friedman\"."); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("This conditional fieldset is marked such that it cannot be used. The system automatically checks whether the fieldset is useable, and if not it will prevent it being used in a \"conditional\" fashion. Please correct the issues identified below."); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("This error prevents this fieldset from being set to complete"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("View Overview"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("View Overview"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Conditional type"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Change to complex"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Changing the conditional type set will remove all existing field ordering!"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Master field"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("No master field is set, please select the master field"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Set master field"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Master field"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("In order to have a chain of conditions, one initial field must be shown to the user. This is called the master field."); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Changing the master field set will remove all existing field ordering!"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Change master field"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Field ordering"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Existing ordering"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("controls the values available in"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Order Fields"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("The value of the field"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("controls the values of the following fields"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Order"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Rename Behaviours"); + +/* ./templates/ktcore/metadata/conditional/manageConditional.smarty */ +gettext("Rename Behaviours"); + +/* ./templates/ktcore/metadata/conditional/select_fieldset.smarty */ +gettext("Select Fieldset"); + +/* ./templates/ktcore/metadata/conditional/select_fieldset.smarty */ +gettext("Current Conditional Fieldsets"); + +/* ./templates/ktcore/metadata/conditional/select_fieldset.smarty */ +gettext("Fieldsets that are marked as conditional."); + +/* ./templates/ktcore/metadata/conditional/select_fieldset.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Fieldset"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Fieldset properties"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Name"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Namespace"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Change"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Fieldset members"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Existing members"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Remove fields"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Add a new field"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Name"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Type"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Normal"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Lookup"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Tree"); + +/* ./templates/ktcore/metadata/edit.smarty */ +gettext("Add field"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Edit Field"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Field properties"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Name"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Description"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Type"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Required"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Change"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Lookup fields may be composed of an arbitrary number of values. These values may be added to the Lookup field by entering them in below. If these values are being generated by, or synchronised to, an external datasource, toggling the Sticky attribute of a value will ensure that it will not be modified by changes in the external datasource list."); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Lookup Values"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Add new values"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Add"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Manage lookup tree"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Existing values"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("stuck, will never be disabled when synchronising from another source"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Disable"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Toggle stickiness"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Disabled values"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("stuck, will never be enabled when synchronising from another source"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Enable"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Toggle stickiness"); + +/* ./templates/ktcore/metadata/editField.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Fieldset"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Incomplete"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("This conditional fieldset cannot be used"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Fieldset properties"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Please complete the following fields to edit the fieldset's properties and then click Change. Required fields are marked with a red square."); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Change"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Conditionality"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("A conditional fieldset contains only lookup fields. The values for each field can depend on the user's selections for the others."); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Conditional"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("No"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("This error prevents this fieldset from being set to complete"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Manage conditional"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Remove conditional"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Become conditional"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("This fieldset cannot be made conditional, since it contains fields which are not lookup types."); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Fieldset members"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("A fieldset is a collection of fields that comprise a defined set of document metadata. You may add, edit or delete members of this fieldset collection below."); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Existing members"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Field Name"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Type Description"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("edit"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Remove fields"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Add a new field"); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("To add a new field, enter the field's name, description and field type below and then click Add field. If the field type requires additional lookup values you will be prompted to enter them."); + +/* ./templates/ktcore/metadata/editFieldset.smarty */ +gettext("Add field"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Document Fieldsets"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Collections of fields are associated into fieldsets. These represent a set of related information which can be associated with a document and thus comprise part of the document's metadata."); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Existing document fieldsets"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Name"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Generic"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("System"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Fields"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Document Types"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("No"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Yes"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("No"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Create a new document fieldset"); + +/* ./templates/ktcore/metadata/listFieldsets.smarty */ +gettext("Create"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Edit View"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("The columns included in this view are displayed below. To add additional columns into the view, use the form below the list. To remove items, click on the \"delete\" icon next to the column name. Note that some columns may be required in a given view. Also, while you can have multiple copies of a given column in a specific view this is not recommended."); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Column"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Position"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Reorder up"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Reorder down"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("No columns have been added to this view"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Add a Column"); + +/* ./templates/ktcore/misc/columns/edit_view.smarty */ +gettext("Add Column to View"); + +/* ./templates/ktcore/misc/columns/select_view.smarty */ +gettext("Select View"); + +/* ./templates/ktcore/misc/columns/select_view.smarty */ +gettext("Views are the selections of documents and folders you will find throughout #appname#. Some of those can be configured to use different kinds of columns (e.g. workflow state, the creator's name, etc.)"); + +/* ./templates/ktcore/misc/notification_overflow.smarty */ +gettext("Items that require your attention"); + +/* ./templates/ktcore/misc/notification_overflow.smarty */ +gettext("Page: #batch#"); + +/* ./templates/ktcore/misc/notification_overflow.smarty */ +gettext("No items require your attention"); + +/* ./templates/ktcore/plugins/list.smarty */ +gettext("Plugins"); + +/* ./templates/ktcore/plugins/list.smarty */ +gettext("Check the plugins that require activation and then click \"Update\". To disable a plugin, uncheck the plugin and click \"Update\"."); + +/* ./templates/ktcore/plugins/list.smarty */ +gettext("Update"); + +/* ./templates/ktcore/plugins/list.smarty */ +gettext("Read plugins from filesystem"); + +/* ./templates/ktcore/plugins/list.smarty */ +gettext("If you have moved the location of #appname# on your server filesystem, or installed or removed plugins, the plugins must be re-read from the filesystem"); + +/* ./templates/ktcore/plugins/list.smarty */ +gettext("Reread plugins"); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("#appname# #versionname#"); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("Version #version#"); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("© 2008, 2009 KnowledgeTree Inc."); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("All rights reserved."); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("."); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("This program is free software and published under the GNU General Public License version 3"); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("KnowledgeTree Community Edition is supplied with no support, no maintenance, and no warranty."); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("Please contact the KnowledgeTree Sales team should you wish to learn more about commercially supported editions of KnowledgeTree."); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("This is a professionally supported edition of KnowledgeTree."); + +/* ./templates/ktcore/principals/about.smarty */ +gettext("Please refer to the documentation provided to you at subscription to learn more about how to access KnowledgeTree's professional support team."); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Add a new group"); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Users may be classed together as Groups and these groups may be used to set security privileges throughout the document management system."); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Add a group from an authentication source"); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Instead of manually creating the group within the document management system, the group can be found within an authentication source (such as an LDAP directory) that has already been configured. This ensures that the group is correctly set up with limited intervention from the administrator, and that the group's membership will be maintained as it is in the authentication source."); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Add from source"); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Alternatively, you can manually create a user within #appname# below."); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Specify group details"); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Please enter the Group's details below and then click create group. Fields marked with a red square are required."); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("create group"); + +/* ./templates/ktcore/principals/addgroup.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/addunit.smarty */ +gettext("Add a new unit"); + +/* ./templates/ktcore/principals/addunit.smarty */ +gettext("Units allow you to delegate a portion of the document management system to a particular part of your organisation. Unit administrators have additional right within that portion of the document management system, and they can also adjust the membership of groups that belong to the unit."); + +/* ./templates/ktcore/principals/addunit.smarty */ +gettext("Specify unit details"); + +/* ./templates/ktcore/principals/addunit.smarty */ +gettext("Please enter the Unit's details below and then click create unit. Fields marked with a red square are required."); + +/* ./templates/ktcore/principals/addunit.smarty */ +gettext("Next"); + +/* ./templates/ktcore/principals/addunit.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/addunit2.smarty */ +gettext("Add a new unit"); + +/* ./templates/ktcore/principals/addunit2.smarty */ +gettext("Choose unit folder location"); + +/* ./templates/ktcore/principals/addunit2.smarty */ +gettext("Please choose a location to place your unit folder."); + +/* ./templates/ktcore/principals/addunit2.smarty */ +gettext("create unit"); + +/* ./templates/ktcore/principals/addunit2.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/adduser.smarty */ +gettext("Add a user"); + +/* ./templates/ktcore/principals/adduser.smarty */ +gettext("Please complete the form below to add a new user. Fields marked with a red square are required. By default, users are created using #appname#'s builtin authentication provider. Should you wish to use an external authentication provider such as LDAP, please ensure that the provider's plugin is registered and use the form on the User Management page."); + +/* ./templates/ktcore/principals/adduser.smarty */ +gettext("Create a new user"); + +/* ./templates/ktcore/principals/adduser.smarty */ +gettext("create user"); + +/* ./templates/ktcore/principals/adduser.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/deleteunit.smarty */ +gettext("Delete Unit"); + +/* ./templates/ktcore/principals/deleteunit.smarty */ +gettext("Delete unit #name# from the system"); + +/* ./templates/ktcore/principals/deleteunit.smarty */ +gettext("Delete Unit"); + +/* ./templates/ktcore/principals/deleteunit.smarty */ +gettext("Delete unit"); + +/* ./templates/ktcore/principals/deleteunit.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/editgroup.smarty */ +gettext("Edit Group Details"); + +/* ./templates/ktcore/principals/editgroup.smarty */ +gettext("Change the system's information about group #name#"); + +/* ./templates/ktcore/principals/editgroup.smarty */ +gettext("Change Group Details"); + +/* ./templates/ktcore/principals/editgroup.smarty */ +gettext("Users may be classed together as Groups and these groups may be used to set security privileges throughout the document management system."); + +/* ./templates/ktcore/principals/editgroup.smarty */ +gettext("save changes to group"); + +/* ./templates/ktcore/principals/editgroup.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/editunit.smarty */ +gettext("Edit Unit Details"); + +/* ./templates/ktcore/principals/editunit.smarty */ +gettext("Change the system's information about unit #name#"); + +/* ./templates/ktcore/principals/editunit.smarty */ +gettext("Change Unit Details"); + +/* ./templates/ktcore/principals/editunit.smarty */ +gettext("Users may be classed together as Units and these units may be used to set security privileges throughout the document management system."); + +/* ./templates/ktcore/principals/editunit.smarty */ +gettext("save changes to unit"); + +/* ./templates/ktcore/principals/editunit.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/edituser.smarty */ +gettext("Edit User Details"); + +/* ./templates/ktcore/principals/edituser.smarty */ +gettext("Change User Details"); + +/* ./templates/ktcore/principals/edituser.smarty */ +gettext("Please complete the form below to edit the user. Fields marked with a red square are required. By default, users are created using #appname#'s builtin authentication provider. Should you wish to use an external authentication provider such as LDAP, please ensure that the provider's plugin is registered and enabled."); + +/* ./templates/ktcore/principals/edituser.smarty */ +gettext("save changes"); + +/* ./templates/ktcore/principals/edituser.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/edituser.smarty */ +gettext("Authentication"); + +/* ./templates/ktcore/principals/edituser.smarty */ +gettext("#name#'s authentication is handled by the #provider#."); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Group Administration"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Add New Group"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Groups allow you to assign permissions and roles to a number of different users at once."); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Add Group"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Add a new group"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Search for groups"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Since there may be many groups in the system, please type a few letters from the group's name to begin. Alternatively, view all groups (note that this action may take some time if you have many groups)."); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("search for groups"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Group Name"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Unit Name"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Manage Users"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Manage sub-groups"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Subgroups"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("not part of a unit"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Manage Users"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("Manage sub-groups"); + +/* ./templates/ktcore/principals/groupadmin.smarty */ +gettext("No results for your search."); + +/* ./templates/ktcore/principals/groups_managesubgroups.smarty */ +gettext("Manage Sub-Groups in #name#"); + +/* ./templates/ktcore/principals/groups_managesubgroups.smarty */ +gettext("Groups may contain other groups, allowing for a convenient way to build tree's of users and efficiently assign security privileges."); + +/* ./templates/ktcore/principals/groups_managesubgroups.smarty */ +gettext("Change Sub-Groups in #name#"); + +/* ./templates/ktcore/principals/groups_managesubgroups.smarty */ +gettext("save changes"); + +/* ./templates/ktcore/principals/groups_managesubgroups.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/groups_manageusers.smarty */ +gettext("Manage Users in #name#"); + +/* ./templates/ktcore/principals/groups_manageusers.smarty */ +gettext("Users may be associated with Groups which are then used to grant these users security privileges."); + +/* ./templates/ktcore/principals/groups_manageusers.smarty */ +gettext("Manage Users in #name#"); + +/* ./templates/ktcore/principals/groups_manageusers.smarty */ +gettext("save changes"); + +/* ./templates/ktcore/principals/groups_manageusers.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/groups_sourceusers.smarty */ +gettext("Manage Users in #name#"); + +/* ./templates/ktcore/principals/groups_sourceusers.smarty */ +gettext("Users may be associated with Groups which are then used to grant these users security privileges."); + +/* ./templates/ktcore/principals/groups_sourceusers.smarty */ +gettext("Synchronise Users in #name#"); + +/* ./templates/ktcore/principals/groups_sourceusers.smarty */ +gettext("This group is synchronised from an authentication source, and direct changes can not be made to the members of this group within the document management system. Select the button below to synchronise the group from the authentication source."); + +/* ./templates/ktcore/principals/groups_sourceusers.smarty */ +gettext("synchronise"); + +/* ./templates/ktcore/principals/groups_sourceusers.smarty */ +gettext("Current users"); + +/* ./templates/ktcore/principals/orgadmin.smarty */ +gettext("Orgnisation Administration"); + +/* ./templates/ktcore/principals/orgadmin.smarty */ +gettext("Change organisation details"); + +/* ./templates/ktcore/principals/orgadmin.smarty */ +gettext("update organisation information"); + +/* ./templates/ktcore/principals/orgadmin.smarty */ +gettext("Organisation Name"); + +/* ./templates/ktcore/principals/orgadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/orgadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/password.smarty */ +gettext("Password"); + +/* ./templates/ktcore/principals/password.smarty */ +gettext("You may change your password by entering it in the fields below. Your system administrator may have defined certain rules (such as minimum password length) that your password must abide by."); + +/* ./templates/ktcore/principals/preferences.smarty */ +gettext("Preferences"); + +/* ./templates/ktcore/principals/preferences.smarty */ +gettext("You may change details about yourself by editing the entries below. Once you have completed the form, click on Update your details."); + +/* ./templates/ktcore/principals/preferences.smarty */ +gettext("Change your password."); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Role Administration"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Workflow actions may be assigned to certain roles within the DMS. User groups are allocated to roles on a per-directory basis and are inherited from the root folder of the DMS. Roles may for example include \"Document Creator\", \"Document Reviewer\", \"Document Publisher\"."); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Add a Role"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("create new role"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Change a role's details"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("update role information"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Role Name"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/principals/roleadmin.smarty */ +gettext("There are currently no roles created within the system."); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Unit Administration"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("#appname# allows administrators the ability to create Units that model the organisation's business units. Units may have their own administrators and groups may be assigned to these units."); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Add New Unit"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Units allow you to delegate the administration of a portion of the DMS repository to a particular part of your organisation. Unit administrators have additional rights within that portion of the document management system, and they can also adjust the membership of groups that belong to the unit."); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Add Unit"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Add a new unit"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Unit Name"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Folder"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/unitadmin.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/principals/updatepassword.smarty */ +gettext("Force user to change password"); + +/* ./templates/ktcore/principals/updatepassword.smarty */ +gettext("Force user to change password"); + +/* ./templates/ktcore/principals/updatepassword.smarty */ +gettext("Force the user to change their password on their next login."); + +/* ./templates/ktcore/principals/updatepassword.smarty */ +gettext("change password"); + +/* ./templates/ktcore/principals/updatepassword.smarty */ +gettext("Change User's Password"); + +/* ./templates/ktcore/principals/updatepassword.smarty */ +gettext("Change User's Password"); + +/* ./templates/ktcore/principals/updatepassword.smarty */ +gettext("Change the user's password. Password rules may have been defined that this new password must abide by."); + +/* ./templates/ktcore/principals/updatepassword.smarty */ +gettext("change password"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("User Management"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Add new users"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("To add users to the DMS authentication provider, you need to provide them with credentials through this section. If you are using an external source of login information like LDAP, ensure the appropriate plugin is loaded and use the section below."); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Add a new user"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Add a new user"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Add a user from an authentication source"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Instead of manually creating the user within the document management system, the user can be found within an authentication source (such as an LDAP directory) that has already been configured. This ensures that the user is correctly set up with limited intervention from the administrator, and that the user will not need to remember an additional password for the document management system."); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Add from source"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("You do not have enough available licenses to add more active users. Please disable some existing ones if you wish to add new active users."); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Search for users"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Since there may be many users in the system, please select a group from the list below, or type a few letters from the person's username to begin. Alternatively, view all users (note that this may be very slow if you have many users)."); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Search For Users"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Name"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Username"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Enabled"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Group Memberships"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Current Groups"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Disabled"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Disabled"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Enabled"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Enabled"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Manage Groups"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Enable"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Disable"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/principals/useradmin.smarty */ +gettext("No results for your search."); + +/* ./templates/ktcore/principals/usergroups.smarty */ +gettext("Change #name#'s Groups"); + +/* ./templates/ktcore/principals/usergroups.smarty */ +gettext("Users may be classed together as Groups and these groups may be used to set security privileges throughout the document management system."); + +/* ./templates/ktcore/principals/usergroups.smarty */ +gettext("Change #name#'s Groups"); + +/* ./templates/ktcore/principals/usergroups.smarty */ +gettext("save changes"); + +/* ./templates/ktcore/principals/usergroups.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/scheduler.smarty */ +gettext("Task Scheduler Management"); + +/* ./templates/ktcore/scheduler.smarty */ +gettext("The scheduler runs document indexing and various house keeping tasks, etc in the background."); + +/* ./templates/ktcore/scheduler.smarty */ +gettext("No tasks have been scheduled"); + +/* ./templates/ktcore/scheduler.smarty */ +gettext("Save"); + +/* ./templates/ktcore/search/administration/condition_delete_confirmation.smarty */ +gettext("Delete Dynamic Condition"); + +/* ./templates/ktcore/search/administration/condition_delete_confirmation.smarty */ +gettext("Deleting a dynamic condition will potentially change the permissions on a number of items in the document management system. Users may experience a lack of access to documents that they usually have access to if you continue with this action."); + +/* ./templates/ktcore/search/administration/condition_delete_confirmation.smarty */ +gettext("Delete a condition"); + +/* ./templates/ktcore/search/administration/condition_delete_confirmation.smarty */ +gettext("Do you still wish to continue with deleting this item?"); + +/* ./templates/ktcore/search/administration/condition_delete_confirmation.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/search/administration/condition_delete_confirmation.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Dynamic Conditions"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Creating a Dynamic Condition involves setting up criteria that filters content in the DMS for the purposes of selectively assigning permissions associated with the Dynamic Condition, according to the specified criteria. Dynamic conditions are assigned on the folder's Permissions management page in Browse Documents. Dynamic Conditions are also used to create Guard permissions, which are required to perform transitions on Workflows."); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Create a new condition"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("New"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Existing Conditions"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Condition Name"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("View Results"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("Run Condition"); + +/* ./templates/ktcore/search/administration/conditions.smarty */ +gettext("No Conditions have been defined."); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Saved searches"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Saved searches are searches which are particular to your location. For example, you could define a search which returns all documents in a particular workflow state, or all documents which are considered \"common\" within your organisation (leave policy, newsletters, etc.) based on a category or fieldset value."); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Create a new saved search"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("New"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Existing Searches"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Search Name"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("User"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("View Results"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("Run Search"); + +/* ./templates/ktcore/search/administration/savedsearches.smarty */ +gettext("No Saved Searches have been defined."); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("after"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("between"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("before"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("on"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("not on"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("equal to"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("not equal to"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than or equal to"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than or equal to"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("between"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than or equal to"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than or equal to"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("equal to"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("not equal to"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("bytes"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("kilobytes"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("megabytes"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("gigabytes"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("less than"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("greater than"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("days"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("months"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("years"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("contains"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("does not contain"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("like"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("not like"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("starts with"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("ends with"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("contains"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("does not contain"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("is not"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("True"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("False"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("remove"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("remove"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("remove"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Please select some search criteria"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Advanced Search"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Search Criteria Editor"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("The #options# may also be used to create more complex search criteria expressions."); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("all"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("any"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Return items which match #options# of the criteria groups specified."); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Criteria Group"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("all"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("any"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Return items which match #options# of the criteria specified below."); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("No criteria have been selected for the criteria group."); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Remove Criteria Group"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Available Criteria"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Available Fieldsets"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Available Workflows"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Select some criteria"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Select a fieldset"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Select a workflow"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Click on a field above to add it to the criteria group."); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Add another set of criteria"); + +/* ./templates/ktcore/search2/adv_query_builder.smarty */ +gettext("Search"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Search Criteria Editor"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("The search criteria editor allows you to utilise the full power of the search engine by allowing you to perform more complicated searches by using the free text criteria format."); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Advanced Search"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("The #options# may also be used to perform searches."); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("The expression parsed successfully."); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("There is a problem with the expression."); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("There is a problem saving the expression."); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("There is a problem communicating with the server."); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("There has been a parsing problem. Please check the search expression."); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Advanced Query"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Search"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Parse"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Reset"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Clear"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Save"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("You are currently editing the saved search:"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Save"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Saved"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Grammar"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Criteria may be built up using the following grammar:"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("search text here"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("Fields"); + +/* ./templates/ktcore/search2/adv_query_search.smarty */ +gettext("The following fields may be used in search criteria:"); + +/* ./templates/ktcore/search2/external_resources.smarty */ +gettext("External Resource Dependency Status"); + +/* ./templates/ktcore/search2/external_resources.smarty */ +gettext("The following resources are used by KnowledgeTree and are impacting on the normal operations of the system:"); + +/* ./templates/ktcore/search2/external_resources.smarty */ +gettext("Resource"); + +/* ./templates/ktcore/search2/external_resources.smarty */ +gettext("Status"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("External Resource Dependency Status"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("All Services are running normally"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("External Resource Dependency Status"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("The following service(s) are not functioning correctly and are impacting on the normal operations of the system"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("Message"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("Also affects"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("File types"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("Extractors"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("The following extractors are not available and may affect indexing of certain document types"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("Message"); + +/* ./templates/ktcore/search2/indexing_status.smarty */ +gettext("Affected file formats"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Migration to using the new search requires text to be moved from the database full text indexes into the Document Indexer Service. This may take some time depending on the size of the repository. For this reason, the process is a background task."); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Documents processed in a single migration run:"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Frequency at which migration batch task runs:"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Migration process started on:"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Migration process has taken:"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Total documents migrated:"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Total documents to be migrated:"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Estimated completion time:"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Estimated migration time remaining:"); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("Note: Search results will not be accurate until the migration process is complete."); + +/* ./templates/ktcore/search2/lucene_migration.smarty */ +gettext("This dashlet will disappear when the migration process is complete."); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Document Indexer Statistics"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Last Optimization Date:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Period Since Last Optimization:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Last Indexing Date:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Period Since Last Indexing:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Total # Documents in Repository:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Documents Indexed:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Documents in Indexing Queue:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Documents with Indexing Problems:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Index Coverage:"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Indexing coverage percentage may vary from total - not all documents contain text."); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Queue Coverage :"); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Queue coverage indicates percentage of documents currently queued for indexing in relation to total repository size."); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("To get the best performance out of Document Indexer, the indexes must be optimised periodically. This is managed by a background task. Please see the KnowledgeTree Administrator's Manual for more information."); + +/* ./templates/ktcore/search2/lucene_statistics.smarty */ +gettext("Indexing has not run yet. Please check that the KTScheduler is running."); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Manage Saved Search Criteria"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Saved search criteria are criteria that are particular to your location. For example, you could define criteria that returns all documents in a particular workflow state, or all documents which are considered \"common\" within your organisation (leave policy, newsletters, etc.) based on a category or fieldset value."); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Advanced Search"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("or"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Search Criteria Editor"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Create a new saved search using #options#."); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Existing Saved Search Criteria"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Name"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("User"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Share With All"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("View Results"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("All users"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Share"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Not Shared"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Don't Share"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Shared"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Not Shared"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Shared"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("Run Search"); + +/* ./templates/ktcore/search2/manage_saved_search.smarty */ +gettext("No Saved Searches have been defined."); + +/* ./templates/ktcore/search2/reporting/extractorinfo.smarty */ +gettext("Extractor Information"); + +/* ./templates/ktcore/search2/reporting/extractorinfo.smarty */ +gettext("This report lists the text extractors and their supported mime types."); + +/* ./templates/ktcore/search2/reporting/extractorinfo.smarty */ +gettext("Active"); + +/* ./templates/ktcore/search2/reporting/extractorinfo.smarty */ +gettext("Inactive"); + +/* ./templates/ktcore/search2/reporting/extractorinfo.smarty */ +gettext("Description"); + +/* ./templates/ktcore/search2/reporting/extractorinfo.smarty */ +gettext("Mime Types"); + +/* ./templates/ktcore/search2/reporting/extractorinfo.smarty */ +gettext("Extensions"); + +/* ./templates/ktcore/search2/reporting/extractorinfo.smarty */ +gettext("There are no extractors registered."); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("Document Indexing Diagnostics"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("This report will help to diagnose problems with document indexing."); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("Filename"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("Extractor"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("Index Date"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("n/a"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("Reschedule"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("Reschedule All"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("Remove"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("Remove All"); + +/* ./templates/ktcore/search2/reporting/indexerrors.smarty */ +gettext("There are no indexing issues."); + +/* ./templates/ktcore/search2/reporting/managemimetypes.smarty */ +gettext("Manage Mime Types"); + +/* ./templates/ktcore/search2/reporting/managemimetypes.smarty */ +gettext("This report lists all mime types and extensions that can be identified by #appname#."); + +/* ./templates/ktcore/search2/reporting/pendingdocuments.smarty */ +gettext("Pending Documents Indexing Queue"); + +/* ./templates/ktcore/search2/reporting/pendingdocuments.smarty */ +gettext("This report lists documents that are waiting to be indexed."); + +/* ./templates/ktcore/search2/reporting/pendingdocuments.smarty */ +gettext("If a document is not associated with an extractor, no content will be added to the index. These documents can be identified in the list by the extractor column reflecting n/a."); + +/* ./templates/ktcore/search2/reporting/pendingdocuments.smarty */ +gettext("There are no documents in the indexing queue."); + +/* ./templates/ktcore/search2/reporting/pendingdocuments.smarty */ +gettext("Filename"); + +/* ./templates/ktcore/search2/reporting/pendingdocuments.smarty */ +gettext("Extractor"); + +/* ./templates/ktcore/search2/reporting/pendingdocuments.smarty */ +gettext("Index Date"); + +/* ./templates/ktcore/search2/reporting/pendingdocuments.smarty */ +gettext("n/a"); + +/* ./templates/ktcore/search2/reporting/rescheduledocuments.smarty */ +gettext("Reschedule All Documents"); + +/* ./templates/ktcore/search2/reporting/rescheduledocuments.smarty */ +gettext("This function allows you to re-index your entire repository."); + +/* ./templates/ktcore/search2/reporting/rescheduledocuments.smarty */ +gettext("Please note that rescheduling all documents may take a long time, depending on the size of the repository."); + +/* ./templates/ktcore/search2/reporting/rescheduledocuments.smarty */ +gettext("Reschedule All"); + +/* ./templates/ktcore/search2/search_portlet.smarty */ +gettext("Advanced Search"); + +/* ./templates/ktcore/search2/search_portlet.smarty */ +gettext("Search Criteria Editor"); + +/* ./templates/ktcore/search2/search_portlet.smarty */ +gettext("Manage Saved Search"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Search Criteria"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Search Criteria"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Search Criteria Editor"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Use the #options# to extend your search criteria."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("To edit the search criteria, use the #options#."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("The search criteria has been saved."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Saved Search"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("This is the saved search criteria:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Manage Saved Search Criteria"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("To delete this saved search criteria or to edit other saved search criteria, #options#."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Please enter a name for the search expression."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("There is a problem saving the expression expression."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("There is a problem communicating with the server."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("You can save this search:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Save"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Search Results"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("There are no search results matching your search criteria."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Search Criteria Editor"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Use the #options# to extend this query."); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Search results found: #count#"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Filename:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("NOT AVAILABLE"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Document ID:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Version:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Folder ID:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Created By:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("on"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Workflow:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Checked out by:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("on"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Modified by:"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("on"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Select All"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Show All"); + +/* ./templates/ktcore/search2/search_results.smarty */ +gettext("Show All"); + +/* ./templates/ktcore/support.smarty */ +gettext("Support and System Information"); + +/* ./templates/ktcore/support.smarty */ +gettext("#appname# Issue Tracker"); + +/* ./templates/ktcore/support.smarty */ +gettext("Visit the #tracker# first if you believe you have found a bug. Always check for known issues relating to the version you are using — we may already have found the problem you're referring to, and may have fixed it in a newer version."); + +/* ./templates/ktcore/support.smarty */ +gettext("The following download action allows you to download a zip archive of information that may assist the #appname# team to diagnose problems on your system. This archive contains:"); + +/* ./templates/ktcore/support.smarty */ +gettext("PHP Information"); + +/* ./templates/ktcore/support.smarty */ +gettext("Log Files (#appname#, Apache, Mysql)"); + +/* ./templates/ktcore/support.smarty */ +gettext("#appname# System Settings"); + +/* ./templates/ktcore/support.smarty */ +gettext("#appname# Version Files"); + +/* ./templates/ktcore/support.smarty */ +gettext("#appname# Database Schema (the structure of the database only)"); + +/* ./templates/ktcore/support.smarty */ +gettext("#appname# Database Counters Report"); + +/* ./templates/ktcore/support.smarty */ +gettext("#appname# Database Storage Engine Report"); + +/* ./templates/ktcore/support.smarty */ +gettext("System Information (Disk Usage, Process List, if easily detectable)"); + +/* ./templates/ktcore/support.smarty */ +gettext("MD5 Checksum of files (used to ensure files have not been tampered with)"); + +/* ./templates/ktcore/support.smarty */ +gettext("Download Support information"); + +/* ./templates/ktcore/support.smarty */ +gettext("Download Support information"); + +/* ./templates/ktcore/support.smarty */ +gettext("If you feel that the information presents to much specific information about your system (e.g. you feel that it would be a security risk to reveal aspects of it), please do sanitise the information, or ask us if you can mail it directly to the developer who is dealing with your issue."); + +/* ./templates/ktcore/widget_fieldset_conditional.smarty */ +gettext("Undo change"); + +/* ./templates/ktcore/widget_fieldset_conditional.smarty */ +gettext("Project Details"); + +/* ./templates/ktcore/widget_fieldset_conditional.smarty */ +gettext("Please be aware that - depending on your selections - new values may become available."); + +/* ./templates/ktcore/widget_fieldset_conditional.smarty */ +gettext("save"); + +/* ./templates/ktcore/workflow/admin/actions_edit.smarty */ +gettext("Assign blocked actions"); + +/* ./templates/ktcore/workflow/admin/actions_edit.smarty */ +gettext("Actions which are checked on this page will not be available to users."); + +/* ./templates/ktcore/workflow/admin/actions_edit.smarty */ +gettext("Assign Blocked Actions"); + +/* ./templates/ktcore/workflow/admin/actions_edit.smarty */ +gettext("State"); + +/* ./templates/ktcore/workflow/admin/actions_edit.smarty */ +gettext("Block actions"); + +/* ./templates/ktcore/workflow/admin/actions_edit.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/workflow/admin/actions_overview.smarty */ +gettext("Actions Overview"); + +/* ./templates/ktcore/workflow/admin/actions_overview.smarty */ +gettext("In addition to restricting permissions, it is also possible to block certain actions at any given point. Actions which are not blocked are still controlled by the usual permissions."); + +/* ./templates/ktcore/workflow/admin/actions_overview.smarty */ +gettext("Edit Actions"); + +/* ./templates/ktcore/workflow/admin/actions_overview.smarty */ +gettext("Edit Actions"); + +/* ./templates/ktcore/workflow/admin/actions_overview.smarty */ +gettext("State"); + +/* ./templates/ktcore/workflow/admin/actions_overview.smarty */ +gettext("Denied"); + +/* ./templates/ktcore/workflow/admin/add_states.smarty */ +gettext("Add States to Workflow"); + +/* ./templates/ktcore/workflow/admin/add_transitions.smarty */ +gettext("Add Transitions to Workflow"); + +/* ./templates/ktcore/workflow/admin/allocate_permissions.smarty */ +gettext("Select roles and groups for whom you wish to change permission assignment from the box on the left, and move them over to the box on the right using the button with right-pointing arrows. You can then allocate or remove permissions from these entities and save by pressing the 'Update Permission Assignments' button'."); + +/* ./templates/ktcore/workflow/admin/allocate_permissions.smarty */ +gettext("Available Entities"); + +/* ./templates/ktcore/workflow/admin/allocate_permissions.smarty */ +gettext("Assigned Entities"); + +/* ./templates/ktcore/workflow/admin/allocate_permissions.smarty */ +gettext("Filter<"); + +/* ./templates/ktcore/workflow/admin/allocate_permissions.smarty */ +gettext("Show All"); + +/* ./templates/ktcore/workflow/admin/allocate_permissions.smarty */ +gettext("Filter"); + +/* ./templates/ktcore/workflow/admin/allocate_permissions.smarty */ +gettext("Update Workflow Permissions"); + +/* ./templates/ktcore/workflow/admin/allocate_permissions.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("States and Transitions: #name#"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("The core of a workflow is the process that documents in that workflow follow. These processes are made up of states (which documents are in, e.g. \"reviewed\" or \"published\") and transitions which documents follow (e.g. \"submit for review\" or \"publish\")."); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Configure Workflow Process"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Configure Workflow Process"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("(e.g. which transitions lead to which states)"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("States"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Add New States"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Add New States"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("State Name"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Edit State"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Delete State"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Transitions"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Add New Transitions"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Add New Transitions"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Transition Name"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/basic_overview.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/admin/configure_process.smarty */ +gettext("States and Transitions: #name#"); + +/* ./templates/ktcore/workflow/admin/configure_process.smarty */ +gettext("Transition"); + +/* ./templates/ktcore/workflow/admin/configure_process.smarty */ +gettext("Leads to state"); + +/* ./templates/ktcore/workflow/admin/copy.smarty */ +gettext("Copy Workflow"); + +/* ./templates/ktcore/workflow/admin/copy.smarty */ +gettext("New workflow information"); + +/* ./templates/ktcore/workflow/admin/copy.smarty */ +gettext("New workflow name"); + +/* ./templates/ktcore/workflow/admin/copy.smarty */ +gettext("Copy"); + +/* ./templates/ktcore/workflow/admin/edit_core.smarty */ +gettext("Edit Workflow Details: #name#"); + +/* ./templates/ktcore/workflow/admin/edit_state.smarty */ +gettext("Manage State"); + +/* ./templates/ktcore/workflow/admin/edit_state.smarty */ +gettext("State Effects"); + +/* ./templates/ktcore/workflow/admin/edit_state.smarty */ +gettext("One of the reasons that workflow is so key to the way #appname# is used is that states can have a variety of effects on the way other systems work. For example: workflow states can override the permissions on a document, and reaching a state can cause notifications to be sent out."); + +/* ./templates/ktcore/workflow/admin/edit_state.smarty */ +gettext("Security"); + +/* ./templates/ktcore/workflow/admin/edit_state.smarty */ +gettext("When a document is in a workflow state, that state can override some or all of the permissions that would \"normally\" be assigned to the document (e.g. via the folder it is in). It can also restrict which document actions are available."); + +/* ./templates/ktcore/workflow/admin/edit_state.smarty */ +gettext("Notifications"); + +/* ./templates/ktcore/workflow/admin/edit_state.smarty */ +gettext("In order to progress through a workflow, a document will usually require collaboration between a number of different users. One way to help this process is to inform certain groups or roles about the document's current state."); + +/* ./templates/ktcore/workflow/admin/edit_transition.smarty */ +gettext("Manage Transition"); + +/* ./templates/ktcore/workflow/admin/edit_transition.smarty */ +gettext("Transition Requirements"); + +/* ./templates/ktcore/workflow/admin/edit_transition.smarty */ +gettext("You can control when and by whom transitions can be performed by setting up various guards. These can include permissions, roles, groups or a variety of other restriction conditions."); + +/* ./templates/ktcore/workflow/admin/edit_transition.smarty */ +gettext("Transition Effects"); + +/* ./templates/ktcore/workflow/admin/edit_transition.smarty */ +gettext("One of the powerful aspects of transitions is that you can specify a set of \"effects\" which occur when the transition is followed. This list can be extended by plugins, and includes things like automatically moving the document to a particular folder."); + +/* ./templates/ktcore/workflow/admin/effects_overview.smarty */ +gettext("Workflow Effects Overview: #name#"); + +/* ./templates/ktcore/workflow/admin/effects_overview.smarty */ +gettext("As a document moves through a workflow, it can cause varies other actions to occur. For example, you can attach a \"Move\" action to a transition, which will cause any document moving through that workflow to be moved to a particular folder. Or you can specify that when a document reaches the \"Pending Review\" state, users with the role \"Reviewer\" on that document are informed."); + +/* ./templates/ktcore/workflow/admin/effects_overview.smarty */ +gettext("Transition Effects"); + +/* ./templates/ktcore/workflow/admin/effects_overview.smarty */ +gettext("Notifications"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Workflow Admin"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Workflow is a description of a document's lifecycle. It is made up of workflow states, which describe where in the lifecycle the document is, and workflow transitions, which describe the next steps within the lifecycle of the document."); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Create New Workflow"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Create New Workflow"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Existing workflows"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Select a workflow to modify. To enable a disabled workflow, edit it and set a proper starting state."); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Name"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Status"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Enabled"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Disabled"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/list.smarty */ +gettext("Copy"); + +/* ./templates/ktcore/workflow/admin/manage_notifications.smarty */ +gettext("Workflow Notifications"); + +/* ./templates/ktcore/workflow/admin/manage_notifications.smarty */ +gettext("Please select which roles or groups should be informed when each state is reached."); + +/* ./templates/ktcore/workflow/admin/manage_notifications.smarty */ +gettext("State"); + +/* ./templates/ktcore/workflow/admin/manage_notifications.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/manage_notifications.smarty */ +gettext("Existing Notifications"); + +/* ./templates/ktcore/workflow/admin/managepermissions.smarty */ +gettext("Manage Permissions: #statename#"); + +/* ./templates/ktcore/workflow/admin/managepermissions.smarty */ +gettext("No permissions are controlled by this state. Indicate below which permissions are controlled to allocate them."); + +/* ./templates/ktcore/workflow/admin/managepermissions.smarty */ +gettext("Once you've selected the permissions you want to control for this workflow state, you should allocate these to the appropriate groups and roles."); + +/* ./templates/ktcore/workflow/admin/managepermissions.smarty */ +gettext("Allocate permissions"); + +/* ./templates/ktcore/workflow/admin/managepermissions.smarty */ +gettext("Allocate permissions"); + +/* ./templates/ktcore/workflow/admin/managepermissions.smarty */ +gettext("Specify permissions"); + +/* ./templates/ktcore/workflow/admin/managepermissions.smarty */ +gettext("Select the permissions you want controlled by this state."); + +/* ./templates/ktcore/workflow/admin/new_wizard_step1.smarty */ +gettext("Step 1: Basic Workflow Details"); + +/* ./templates/ktcore/workflow/admin/new_wizard_step2.smarty */ +gettext("Step 2: Connect transitions to states"); + +/* ./templates/ktcore/workflow/admin/new_wizard_step2.smarty */ +gettext("In order to move between states, the transitions you specified earlier must be configured to move from a set of states to a \"destination\" states. Use the table below to configure this behaviour."); + +/* ./templates/ktcore/workflow/admin/new_wizard_step2.smarty */ +gettext("Transition"); + +/* ./templates/ktcore/workflow/admin/new_wizard_step2.smarty */ +gettext("Leads to state"); + +/* ./templates/ktcore/workflow/admin/new_wizard_step2.smarty */ +gettext("Create Workflow"); + +/* ./templates/ktcore/workflow/admin/new_wizard_step2.smarty */ +gettext("Cancel"); + +/* ./templates/ktcore/workflow/admin/permissions_overview.smarty */ +gettext("Permissions Overview"); + +/* ./templates/ktcore/workflow/admin/permissions_overview.smarty */ +gettext("A particular workflow state can override some, all, or none of the permissions that would normally apply to a document. In this way you can (for example) let the folder's permissions decide who can see the document (with Read permissions), while having the workflow restrict access to the \"edit\" permission."); + +/* ./templates/ktcore/workflow/admin/permissions_overview.smarty */ +gettext("States which control permissions have a tick in the \"Control\" column. Permissions which are not controlled by a state (e.g. which are controlled by the folder a document is in) are marked with a dash (—). Controlled permissions are marked with a tick. Click on the state name to specify how it controls permissions."); + +/* ./templates/ktcore/workflow/admin/permissions_overview.smarty */ +gettext("States"); + +/* ./templates/ktcore/workflow/admin/permissions_overview.smarty */ +gettext("Control"); + +/* ./templates/ktcore/workflow/admin/restrictions_edit.smarty */ +gettext("Transition Restrictions: #name#"); + +/* ./templates/ktcore/workflow/admin/restrictions_edit.smarty */ +gettext("All of these must allow the user to perform the transition."); + +/* ./templates/ktcore/workflow/admin/restrictions_edit.smarty */ +gettext("Anybody (with the ability to see the document) can perform this transition."); + +/* ./templates/ktcore/workflow/admin/restrictions_edit.smarty */ +gettext("Restriction"); + +/* ./templates/ktcore/workflow/admin/restrictions_edit.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/restrictions_edit.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/admin/restrictions_edit.smarty */ +gettext("Configuration"); + +/* ./templates/ktcore/workflow/admin/security_overview.smarty */ +gettext("Security Overview: #name#"); + +/* ./templates/ktcore/workflow/admin/security_overview.smarty */ +gettext("#appname# has a powerful security model, in which users can only see documents they have permissions to see. Workflow is the finest-grained way to allocate permissions to a document, since it can override the permissions assigned at a folder level."); + +/* ./templates/ktcore/workflow/admin/security_overview.smarty */ +gettext("There are 3 different ways in which workflows interact with the system's security"); + +/* ./templates/ktcore/workflow/admin/security_overview.smarty */ +gettext("Document Permissions"); + +/* ./templates/ktcore/workflow/admin/security_overview.smarty */ +gettext("(by state)"); + +/* ./templates/ktcore/workflow/admin/security_overview.smarty */ +gettext("Action Restrictions"); + +/* ./templates/ktcore/workflow/admin/security_overview.smarty */ +gettext("(by state)"); + +/* ./templates/ktcore/workflow/admin/security_overview.smarty */ +gettext("Transition Restrictions"); + +/* ./templates/ktcore/workflow/admin/transition_actions_edit.smarty */ +gettext("Transition Effects"); + +/* ./templates/ktcore/workflow/admin/transition_actions_edit.smarty */ +gettext("This transition has no actions associated with it.."); + +/* ./templates/ktcore/workflow/admin/transition_actions_edit.smarty */ +gettext("Action"); + +/* ./templates/ktcore/workflow/admin/transition_actions_edit.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/transition_actions_edit.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/admin/transition_actions_edit.smarty */ +gettext("Configuration"); + +/* ./templates/ktcore/workflow/admin/transition_effects_overview.smarty */ +gettext("Transition Actions Overview"); + +/* ./templates/ktcore/workflow/admin/transition_effects_overview.smarty */ +gettext("Please note that the plugins that are installed will affect the available options"); + +/* ./templates/ktcore/workflow/admin/transition_effects_overview.smarty */ +gettext("Transition<"); + +/* ./templates/ktcore/workflow/admin/transition_effects_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/transition_effects_overview.smarty */ +gettext("Effects"); + +/* ./templates/ktcore/workflow/admin/transition_effects_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/transition_guards_overview.smarty */ +gettext("Transition Restrictions Overview"); + +/* ./templates/ktcore/workflow/admin/transition_guards_overview.smarty */ +gettext("In order to ensure that the workflow is followed correctly, it is often necessary to restrict the situations in which a transition can be followed. This can include things like the permissions the user has on the document, the user's groups or roles, or whether the document is checked-out or not."); + +/* ./templates/ktcore/workflow/admin/transition_guards_overview.smarty */ +gettext("Please note that the plugins that are installed will affect the available options"); + +/* ./templates/ktcore/workflow/admin/transition_guards_overview.smarty */ +gettext("Transition"); + +/* ./templates/ktcore/workflow/admin/transition_guards_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/transition_guards_overview.smarty */ +gettext("Existing Restrictions"); + +/* ./templates/ktcore/workflow/admin/transition_guards_overview.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/admin/view.smarty */ +gettext("Workflow: #name#"); + +/* ./templates/ktcore/workflow/admin/view.smarty */ +gettext("One of the most powerful features of #appname# is the workflow system. This allows you to direct the lifecycle of a document from start to finish. The \"Workflow Administration\" menu on the left allows you to access and update information about states, transitions, security and notifications as they apply to this workflow."); + +/* ./templates/ktcore/workflow/admin/view.smarty */ +gettext("Edit Workflow Details"); + +/* ./templates/ktcore/workflow/admin/view.smarty */ +gettext("(e.g. workflow name, starting state)"); + +/* ./templates/ktcore/workflow/admin/view.smarty */ +gettext("Install the GraphViz module to get a useful visualisation of your graph here."); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("New State"); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("As documents move through their lifecycle, they are placed in certain states. For example, an invoice which has been mailed might be in the \"Pending\" state after the \"sent\" transition has been performed by a user."); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Create a new state"); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Please note that additional configuration is possible on states beyond what is specified here (e.g. which users to notify about the document, etc). Please edit the state to access and modify these other properties."); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Informed Users"); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Please select which roles or groups should be informed when this state is reached."); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Roles"); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Groups"); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Actions Allowed"); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Workflows can control which actions (edit metadata, download, etc.) are available on a given document. Please specify which of the actions controlled by this workflow are available when the document is in this state."); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("No actions are controlled by this workflow."); + +/* ./templates/ktcore/workflow/createState.smarty */ +gettext("Create state"); + +/* ./templates/ktcore/workflow/createTransition.smarty */ +gettext("Manage Transitions"); + +/* ./templates/ktcore/workflow/createTransition.smarty */ +gettext("Transitions are what drive the workflow of documents. Each step that needs to be followed in the document's lifecycle could map to a transition, and can be allowed or denied by a combination of roles, permissions and groups."); + +/* ./templates/ktcore/workflow/createTransition.smarty */ +gettext("Use the form below to create a new Transition, and assign or edit existing transitions using the table below."); + +/* ./templates/ktcore/workflow/createTransition.smarty */ +gettext("Create a new transition"); + +/* ./templates/ktcore/workflow/createTransition.smarty */ +gettext("Source States"); + +/* ./templates/ktcore/workflow/createTransition.smarty */ +gettext("Please select which states this transition should be available from. Note that transitions are never available from their target state, even if you specify it below."); + +/* ./templates/ktcore/workflow/createTransition.smarty */ +gettext("Create transition"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Workflow for"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Workflow is a description of a document's lifecycle. It is made up of workflow states, which describe where in the lifecycle the document is, and workflow transitions, which describe the next steps within the lifecycle of the document."); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("No workflow"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Document has no assigned workflow."); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Current workflow settings"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Workflow"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("State"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Transition to another workflow state"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Perform Transition"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("The workflow cannot be changed while the document is checked out."); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Start workflow on document"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Change workflow on document"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Please note that changing the workflow on a document will start the workflow at the beginning of the new workflow. This is true even if the new workflow is identical to the old one."); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Start Workflow"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("Change Workflow"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("You do not have permission to change the workflow that is assigned to this document."); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("No defined workflows"); + +/* ./templates/ktcore/workflow/documentWorkflow.smarty */ +gettext("There are no defined workflows which can be started on this document. An administrator can create workflows to map the lifecycle of a document. Contact your administrator to discuss workflows."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("State"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("As documents move through their lifecycle, they are placed in certain states. For example, an invoice which has been mailed might be in the \"Pending\" state after the \"sent\" transition has been performed by a user."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Edit state properties"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Save"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Inform Which Users?"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Please select which roles or groups should be informed when this state is reached."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Roles"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Groups"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("No groups or roles are defined in the DMS."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Update users to inform"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Assigned Permissions"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("While in this workflow state, additional permissions may be given. This is done either to expose the document to more users or to allow a particular role to be fulfilled before a workflow transition can be accomplished."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Transitions"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Transitions are how documents move from one state to another. Typically, most transitions can only be performed by people with a specific role (e.g. Manager) or part of a specific group (e.g. Marketing Department)."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Transitions to this state"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("No transitions lead to this state."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Transitions from this state"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Save"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("No transitions have been defined for this workflow."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Actions allowed"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Set allowed actions"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("No actions are controlled by this workflow, so all actions are available when documents are in this state."); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Controlled Permissions"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Set controlled permissions"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Role or Group"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Role"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Group"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("Update Allocated Permissions"); + +/* ./templates/ktcore/workflow/editState.smarty */ +gettext("No permissions have been created within #appname#."); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Transition"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Edit transition properties"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Select the target state of the transition, and select the permission, group, and/or role necessary to perform the transition. Selecting more than one of permission, group, or role will require that the user wishing to perform the transition fulfil every requirement."); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Save"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Transition Triggers"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Transition triggers allow you to have special actions automatically occur when a transition is performed, and to control who can perform the transition. Some triggers perform both of these functions, especially if performing the action requires that certain conditions are in place before the action will occur."); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Guards"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Items which control whether a given user can perform this transition on a specific document. All of these must allow the user to perform the transition."); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Anybody (with the ability to see the document) can perform this transition."); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Trigger"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Configuration"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Actions which are performed when the document follows the transition."); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("No actions are performed when this transition occurs."); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Trigger"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Configuration"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/editTransition.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Workflow Overview"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Edit workflow properties"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Update workflow properties"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("This page allows you to get a quick overview of the workflow. To modify items, either select them from the overview below, or use the \"Workflow\" menu on the left to create new ones."); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("This workflow does not define any states."); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("State"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Notified groups & roles"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Controlled Actions available"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Permissions overridden"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Transitions available"); + +/* ./templates/ktcore/workflow/editWorkflow.smarty */ +gettext("Transitions to this state"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Workflows"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Workflow is a description of a document's lifecycle. It is made up of workflow states, which describe where in the lifecycle the document is, and workflow transitions, which describe the next steps within the lifecycle of the document."); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Create a new workflow"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Create"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Existing workflows"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Select a workflow to modify. To enable a disabled workflow, edit it and set a proper starting state."); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Name"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Status"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Disabled"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Enabled"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Edit"); + +/* ./templates/ktcore/workflow/listWorkflows.smarty */ +gettext("Disable"); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("Manage Actions"); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("An important part of workflow is controlling which actions are available to users at various stages. For example, it may be necessary to prevent the \"Edit Metadata\" action from being used when a document is \"published\". Doing this is a two step process: first, you need to specify that \"Edit Metadata\" is an action you wish to control within this workflow; second, you need to specify that the action is not to be made available when documents are in the \"published\" state."); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("Specify Controlled Actions"); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("Select the actions you want this workflow to control from the list below. Actions you do not specify will be available no matter what the state of the document."); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("Set controlled actions"); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("Assign Actions to States"); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("The table below lists the actions you have specified as controlled by this workflow, and all the states within the workflow. From here you can assign those actions to the various states in this workflow. Checked items are available to users whose permissions would normally allow them when the document is in that state. Unchecked items are not available to any users."); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("No actions are controlled by this workflow. All actions will be available at all states."); + +/* ./templates/ktcore/workflow/manageActions.smarty */ +gettext("Update Action Availability"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Manage States"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("As documents move through their lifecycle, they are placed in certain states. For example, an invoice which has been mailed might be in the \"Pending\" state after the \"sent\" transition has been performed by a user."); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Please Note: you can only delete states or transitions while the workflow has no documents or document-versions assigned to the workflow."); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Create a new state"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("A critical part of workflow is the creation of various different states for documents."); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Create a new state"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("This workflow does not define any states."); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("State"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Notified groups & roles"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Controlled Actions available"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Permissions overridden"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Transitions available"); + +/* ./templates/ktcore/workflow/manageStates.smarty */ +gettext("Transitions to this state"); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Manage Transitions"); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Transitions are what drive the workflow of documents. Each step that needs to be followed in the document's lifecycle could map to a transition, and can be allowed or denied by a combination of roles, permissions and groups."); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Please Note: you can only delete states or transitions while the workflow has no documents or document-versions assigned to the workflow."); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Create a new transition"); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Create a new transition"); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Create a new transition"); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("This workflow does not define any transitions. Use the \"Create a new transition\" link above to add new transitions."); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Transition Availability"); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Click on any transition below to edit it directly, or use the checkboxes to assign which states the transition is available from."); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Delete"); + +/* ./templates/ktcore/workflow/manageTransitions.smarty */ +gettext("Assign Transition Availability"); + +/* ./templates/ktcore/workflow/workflow_notification.smarty */ +gettext("The document #name# has changed to state #state#, and you are specified as one of the users to inform about documents in this state."); + +/* ./templates/ktcore/workflow/workflow_notification.smarty */ +gettext("View Document"); + +/* ./templates/ktcore/workflow/workflow_notification.smarty */ +gettext("Document is no longer available"); + +/* ./templates/ktcore/workflow/workflow_notification.smarty */ +gettext("Clear Alert"); + +/* ./templates/ktcore/workflowtriggers/condition.smarty */ +gettext("Guard Condition for Transition"); + +/* ./templates/ktcore/workflowtriggers/condition.smarty */ +gettext("Guard Condition"); + +/* ./templates/ktcore/workflowtriggers/condition.smarty */ +gettext("Specify which condition the document must fulfill before this transition becomes available."); + +/* ./templates/ktcore/workflowtriggers/condition.smarty */ +gettext("Save Trigger"); + +/* ./templates/ktcore/workflowtriggers/group.smarty */ +gettext("Guard Groups for Transition"); + +/* ./templates/ktcore/workflowtriggers/group.smarty */ +gettext("Guard Groups"); + +/* ./templates/ktcore/workflowtriggers/group.smarty */ +gettext("Specify which group the user will require in order to perform this transition."); + +/* ./templates/ktcore/workflowtriggers/group.smarty */ +gettext("Save Trigger"); + +/* ./templates/ktcore/workflowtriggers/moveaction.smarty */ +gettext("Move Action for Transition"); + +/* ./templates/ktcore/workflowtriggers/moveaction.smarty */ +gettext("Move"); + +/* ./templates/ktcore/workflowtriggers/moveaction.smarty */ +gettext("Specify the folder to which the document must be moved."); + +/* ./templates/ktcore/workflowtriggers/moveaction.smarty */ +gettext("Save Trigger"); + +/* ./templates/ktcore/workflowtriggers/permissions.smarty */ +gettext("Guard permissions for Transition"); + +/* ./templates/ktcore/workflowtriggers/permissions.smarty */ +gettext("Guard Permissions"); + +/* ./templates/ktcore/workflowtriggers/permissions.smarty */ +gettext("Specify which permissions the user will require in order to perform this transition. Note that the user will be required to have all these permissions."); + +/* ./templates/ktcore/workflowtriggers/permissions.smarty */ +gettext("Save Trigger"); + +/* ./templates/ktcore/workflowtriggers/roles.smarty */ +gettext("Guard Roles for Transition"); + +/* ./templates/ktcore/workflowtriggers/roles.smarty */ +gettext("Guard Roles"); + +/* ./templates/ktcore/workflowtriggers/roles.smarty */ +gettext("Specify which role the user will require in order to perform this transition."); + +/* ./templates/ktcore/workflowtriggers/roles.smarty */ +gettext("Save Trigger"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Discussion"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Existing threads"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Subject"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Creator"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Views"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Replies"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Last activity"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("State"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("There are #closed# closed threads - use the \"View All\" option below to view them."); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("There are no open threads for this document."); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Create a new thread"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Create thread"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("View all threads"); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("Click below to view all discussion threads on this document, including those that are closed."); + +/* ./templates/ktstandard/action/discussion.smarty */ +gettext("View threads"); + +/* ./templates/ktstandard/action/discussion_thread.smarty */ +gettext("Post a reply"); + +/* ./templates/ktstandard/action/discussion_thread.smarty */ +gettext("Post reply"); + +/* ./templates/ktstandard/action/discussion_thread.smarty */ +gettext("Change the state of this thread"); + +/* ./templates/ktstandard/action/discussion_thread.smarty */ +gettext("Change state"); + +/* ./templates/ktstandard/action/discussion_thread.smarty */ +gettext("Thread closed"); + +/* ./templates/ktstandard/action/discussion_thread_list_item.smarty */ +gettext("Conclusion"); + +/* ./templates/ktstandard/action/discussion_thread_list_item.smarty */ +gettext("(Closed at metadata version: #ver#)"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Document Links"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("The current links to and from this document are displayed below."); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Target"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Type"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Relationship"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Delete"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Delete"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Linked from this document"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Delete"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Delete"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Links to this document"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Delete"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Delete"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("External link from this document"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("There are no links to or from this document."); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Add a new link"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Add a new link"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Add a new link"); + +/* ./templates/ktstandard/action/document_links.smarty */ +gettext("Add an external link"); + +/* ./templates/ktstandard/action/email.smarty */ +gettext("Email document"); + +/* ./templates/ktstandard/action/email.smarty */ +gettext("Email"); + +/* ./templates/ktstandard/action/immutable.smarty */ +gettext("Make Immutable"); + +/* ./templates/ktstandard/action/immutable.smarty */ +gettext(" Warning! This action cannot be undone. No further content changes will be allowed, and only the system administrator, working in Administration Mode, may edit the metadata of an immutable document."); + +/* ./templates/ktstandard/action/immutable_confirm.smarty */ +gettext("Make Immutable"); + +/* ./templates/ktstandard/action/link.smarty */ +gettext("Add Link"); + +/* ./templates/ktstandard/action/link.smarty */ +gettext("Select a target document to link to."); + +/* ./templates/ktstandard/action/link.smarty */ +gettext("Link"); + +/* ./templates/ktstandard/action/link.smarty */ +gettext("No link types are defined. Please ask the administrator to add them."); + +/* ./templates/ktstandard/action/link_external.smarty */ +gettext("Add External Link"); + +/* ./templates/ktstandard/action/link_external.smarty */ +gettext("Enter the URL to the external document or site."); + +/* ./templates/ktstandard/action/link_external.smarty */ +gettext("Link Name"); + +/* ./templates/ktstandard/action/link_external.smarty */ +gettext("Link URL"); + +/* ./templates/ktstandard/action/link_external.smarty */ +gettext("Link"); + +/* ./templates/ktstandard/action/link_external.smarty */ +gettext("No link types are defined. Please ask the administrator to add them."); + +/* ./templates/ktstandard/action/link_type_select.smarty */ +gettext("Add Link"); + +/* ./templates/ktstandard/action/link_type_select.smarty */ +gettext("Select a link type."); + +/* ./templates/ktstandard/action/link_type_select.smarty */ +gettext("Link"); + +/* ./templates/ktstandard/authentication/ldapaddgroup.smarty */ +gettext("Create a new group"); + +/* ./templates/ktstandard/authentication/ldapaddgroup.smarty */ +gettext("create group"); + +/* ./templates/ktstandard/authentication/ldapaddgroup.smarty */ +gettext("Cancel"); + +/* ./templates/ktstandard/authentication/ldapadduser.smarty */ +gettext("Create a new user"); + +/* ./templates/ktstandard/authentication/ldapadduser.smarty */ +gettext("Create user"); + +/* ./templates/ktstandard/authentication/ldapadduser.smarty */ +gettext("Cancel"); + +/* ./templates/ktstandard/authentication/ldapeditsource.smarty */ +gettext("Save"); + +/* ./templates/ktstandard/authentication/ldapedituser.smarty */ +gettext("Save"); + +/* ./templates/ktstandard/authentication/ldapsearchgroup.smarty */ +gettext("Since there may be many groups in the system, please provide a few letters from the groups's name to begin."); + +/* ./templates/ktstandard/authentication/ldapsearchgroup.smarty */ +gettext("Search for group"); + +/* ./templates/ktstandard/authentication/ldapsearchgroup.smarty */ +gettext("search for groups"); + +/* ./templates/ktstandard/authentication/ldapsearchgroup.smarty */ +gettext("No search specified, or no results for your search. Please choose some criteria from the list above to find groups."); + +/* ./templates/ktstandard/authentication/ldapsearchgroup.smarty */ +gettext("Group Name"); + +/* ./templates/ktstandard/authentication/ldapsearchgroup.smarty */ +gettext("Distinguished Name (LDAP DN)"); + +/* ./templates/ktstandard/authentication/ldapsearchgroup.smarty */ +gettext("Add"); + +/* ./templates/ktstandard/authentication/ldapsearchuser.smarty */ +gettext("Since there may be many users in the system, please provide a few letters from the person's user name to begin."); + +/* ./templates/ktstandard/authentication/ldapsearchuser.smarty */ +gettext("Search for user"); + +/* ./templates/ktstandard/authentication/ldapsearchuser.smarty */ +gettext("search for users"); + +/* ./templates/ktstandard/authentication/ldapsearchuser.smarty */ +gettext("No search specified, or no results for your search. Please choose some criteria from the list above to find users."); + +/* ./templates/ktstandard/authentication/ldapsearchuser.smarty */ +gettext("Name"); + +/* ./templates/ktstandard/authentication/ldapsearchuser.smarty */ +gettext("Distinguished Name (LDAP DN)"); + +/* ./templates/ktstandard/authentication/ldapsearchuser.smarty */ +gettext("Add"); + +/* ./templates/ktstandard/disclaimers/manage_disclaimers.smarty */ +gettext("Disclaimers"); + +/* ./templates/ktstandard/disclaimers/manage_disclaimers.smarty */ +gettext("Please select a disclaimer to customize."); + +/* ./templates/ktstandard/disclaimers/manage_disclaimers.smarty */ +gettext("Existing disclaimers"); + +/* ./templates/ktstandard/disclaimers/manage_disclaimers.smarty */ +gettext("Name"); + +/* ./templates/ktstandard/disclaimers/manage_disclaimers.smarty */ +gettext("Actions"); + +/* ./templates/ktstandard/disclaimers/manage_disclaimers.smarty */ +gettext("Edit"); + +/* ./templates/ktstandard/disclaimers/manage_disclaimers.smarty */ +gettext("Clear"); + +/* ./templates/ktstandard/disclaimers/manage_disclaimers_item.smarty */ +gettext("Update"); + +/* ./templates/ktstandard/ktwebdavdashlet/dashlet.smarty */ +gettext("To connect to #appname# via a third-party WebDAV client, please use the following address"); + +/* ./templates/ktstandard/ktwebdavdashlet/dashlet.smarty */ +gettext("To connect with the #appname# Tools Suite, use this address"); + +/* ./templates/ktstandard/links/links_viewlet.smarty */ +gettext("Links from this document"); + +/* ./templates/ktstandard/links/links_viewlet.smarty */ +gettext("Links to this document"); + +/* ./templates/ktstandard/links/links_viewlet.smarty */ +gettext("External Links from this document"); + +/* ./templates/ktstandard/PDFPlugin/PDFPlugin.smarty */ +gettext("Generate PDF of"); + +/* ./templates/ktstandard/searchdashlet/dashlet.smarty */ +gettext("search"); + +/* ./templates/ktstandard/searchdashlet/dashlet.smarty */ +gettext("Advanced Search"); + +/* ./templates/ktstandard/searchdashlet/dashlet.smarty */ +gettext("Saved Searches"); + +/* ./templates/ktstandard/searchdashlet/dashlet.smarty */ +gettext("Saved Search"); + +/* ./templates/ktstandard/subscriptions/manage.smarty */ +gettext("You have no subscriptions"); + +/* ./templates/ktstandard/subscriptions/manage.smarty */ +gettext("You are subscribed to the folders and documents listed below. You can remove your subscription by selecting the folders and documents to which you no longer wish to subscribe."); + +/* ./templates/ktstandard/subscriptions/manage.smarty */ +gettext("Subscriptions"); + +/* ./templates/ktstandard/subscriptions/manage.smarty */ +gettext("Remove subscription"); + +/* ./templates/ktstandard/workflow/allocator_selection.smarty */ +gettext("Automatic Workflow Selection"); + +/* ./templates/ktstandard/workflow/allocator_selection.smarty */ +gettext("Workflow Allocation Plugins"); + +/* ./templates/ktstandard/workflow/allocator_selection.smarty */ +gettext("Documents may be associated on creation or modification with a workflow. Workflow assignment may occur on a per Folder or per Document Type basis and only one mode may be selected for the system. In order to automatically associate documents with a workflow, please select the appropriate plugin from the list below."); + +/* ./templates/ktstandard/workflow/allocator_selection.smarty */ +gettext("Update"); + +/* ./templates/ktstandard/workflow/folderconfigure.smarty */ +gettext("Configure Workflows for this Folder"); + +/* ./templates/ktstandard/workflow/folderconfigure.smarty */ +gettext("This installation of #appname# allocates workflows to documents by their location. To specify the workflow to be used by all documents directly in this folder, please specify the workflow below. Otherwise, users will be able to choose the workflow, and some documents may have no workflow attached."); + +/* ./templates/ktstandard/workflow/folderconfigure.smarty */ +gettext("Note that documents which are moved into this folder will change to use this workflow, and if their previous workflow was different they will lose any progress they have made in that workflow."); + +/* ./templates/ktstandard/workflow/folderconfigure.smarty */ +gettext("Select appropriate workflow"); + +/* ./templates/ktstandard/workflow/folderconfigure.smarty */ +gettext("Assign Workflow"); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("Workflow Allocation by Document Type"); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("Workflow types are allocated by Document Type in this #appname# installation. Documents will be assigned a workflow based on their document type and will have their allocated workflows changed if their document type changes. Naturally, if the workflow changes then the documents will lose any \"progress\" in the old workflow."); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("Document Types with no pre-allocated workflow will either have no workflow set (for new documents) or keep their old workflow (for documents which have had their type changed)."); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("Workflow Allocations"); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("Please select the appropriate workflows for each document type."); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("Document Type"); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("Workflow"); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("No automatic workflow"); + +/* ./templates/ktstandard/workflow/type_allocation.smarty */ +gettext("Apply"); + diff --git a/i18n/transactions.c b/i18n/transactions.c new file mode 100644 index 0000000..b038fe3 --- /dev/null +++ b/i18n/transactions.c @@ -0,0 +1,19 @@ +gettext("Create"); +gettext("Update"); +gettext("Delete"); +gettext("Rename"); +gettext("Move"); +gettext("Download"); +gettext("Check In"); +gettext("Check Out"); +gettext("Collaboration Step Rollback"); +gettext("View"); +gettext("Expunge"); +gettext("Force CheckIn"); +gettext("Email Link"); +gettext("Collaboration Step Approve"); +gettext("Email Attachment"); +gettext("Workflow state transition"); +gettext("Permissions changed"); +gettext("Role allocations changed"); +gettext("Bulk Export"); diff --git a/index.html b/index.html new file mode 100644 index 0000000..095ff53 --- /dev/null +++ b/index.html @@ -0,0 +1,8 @@ + + + + + +You should automatically be redirected to the login / dashboard page. + + diff --git a/ktapi/KTAPIAcl.inc.php b/ktapi/KTAPIAcl.inc.php new file mode 100644 index 0000000..0651b1e --- /dev/null +++ b/ktapi/KTAPIAcl.inc.php @@ -0,0 +1,1873 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * + * @copyright 2008-2009, KnowledgeTree Inc. + * @license GNU General Public License version 3 + * @author KnowledgeTree Team + * @package KTAPI + * @version Version 0.9 + */ + +/** + * KTAPI_Dynamic provides magic getter and setter functionality. + * + * To create a getter property XXX, implement functions called getXXX(). + * To create a setter property XXX, implement function called setXXX($property). + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +abstract class KTAPI_Dynamic +{ + /** + * Generic getter method + * + * @author KnowledgeTree Team + * @access protected + * @param string $property + * @return mixed + */ + protected + function __get($property) + { + $method = 'get' . $property; + if (method_exists($this, $method)) + { + return call_user_func(array($this, $method)); + } + throw new Exception('Unknown method ' . get_class($this) . '.' . $method); + } + + /** + * Generic setter method + * + * @author KnowledgeTree Team + * @access protected + * @param string $property + * @param mixed $value + */ + + protected + function __set($property, $value) + { + $method = 'set' . $property; + if (method_exists($this, $method)) + { + call_user_func(array($this, $method), $value); + } + throw new Exception('Unknown method ' . get_class($this) . '.' . $method); + } +} + +/** + * The KTAPIMember class is a base class for KTAPI_User, KTAPI_Group and KTAPI_Role. + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +abstract class KTAPI_Member extends KTAPI_Dynamic +{ + public abstract function getId(); + + public abstract function getName(); +} + +/** + * Encapsulates functionality around a user. + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_User extends KTAPI_Member +{ + /** + * Reference to the original User object. + * + * @access private + * @var User + */ + private $user; + + /** + * Constructor for KTAPI_User. This is private, and can only be constructed by the static getByXXX() functions. + * + * @access private + * @param User $user + */ + private + function __construct($user) + { + $this->user = $user; + } + + /** + * Using the id, the user can be resolved. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param int $id + * @return KTAPI_User Returns null if there is no match. + */ + public static + function getById($id) + { + $user = User::get($id); + + if (PEAR::isError($user)) + { + return $user; + } + + return new KTAPI_User($user); + } + + + /** + * Using the full name, the user can be resolved. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $name + * @return KTAPI_User Returns null if there is no match. + */ + public static + function getByName($name) + { + $sql = 'SELECT username FROM users where name=?'; + $username = DBUtil::getOneResultKey(array($sql, array($name)), 'username'); + + if (PEAR::isError($username)) + { + return $username; + } + + return self::getByUsername($username); + } + + /** + * Using the username, the user is resolved. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $username + * @return KTAPI_User Returns null if there is no match. + */ + public static + function getByUsername($username) + { + $user = User::getByUserName($username); + + if (PEAR::isError($user)) + { + return $user; + } + + return new KTAPI_User($user); + } + + /** + * Using the email, the user is resolved. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $email + * @return KTAPI_User Returns null if there is no match. + */ + public static + function getByEmail($email) + { + $sql = 'SELECT username FROM users where email=?'; + $username = DBUtil::getOneResultKey(array($sql, $email), 'username'); + + if (PEAR::isError($username)) + { + return $username; + } + + return self::getByUsername($username); + } + + /** + * Returns a list of users matching the filter criteria. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $filter + * @param array $options + * @return array of KTAPI_User + */ + public static + function getList($filter = null, $options = null) + { + $users = User::getList($filter, $options); + + if (PEAR::isError($users)) + { + return $users; + } + + $list = array(); + foreach($users as $user) + { + $list[] = new KTAPI_User($user); + } + + return $list; + } + + /** + * Return id property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return integer + */ + public function getId() { return $this->user->getId(); } + + /** + * Return username property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public function getUsername() { return $this->user->getUserName(); } + + /** + * Return username property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public function getPassword() { return $this->user->getPassword(); } + + /** + * Return display name property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public function getName() { return $this->user->getName(); } + + /** + * Return email property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public function getEmail() { return $this->user->getEmail(); } + +} + +/** + * Encapsulates functionality around a group. + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_Group extends KTAPI_Member +{ + /** + * Reference to the original Group object. + * + * @access private + * @var Group + */ + private $group; + + /** + * Constructor for KTAPI_Group. This is private, and can only be constructed by the static getByXXX() functions. + * + * @author KnowledgeTree Team + * @access private + * @param Group $group + */ + private + function __construct($group) + { + $this->group = $group; + } + + /** + * Using the id, the group can be resolved. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param int $id + * @return KTAPI_Group Returns null if there is no match. + */ + public static + function getById($id) + { + $group = Group::get($id); + + if (PEAR::isError($group)) + { + return $group; + } + + return new KTAPI_Group($group); + } + + + /** + * Using the name, the group can be resolved. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $name + * @return KTAPI_Group Returns null if there is no match. + */ + public static + function getByName($name) + { + $group = Group::getByName($name); + + if (PEAR::isError($group)) + { + return $group; + } + + return new KTAPI_Group($group); + } + + /** + * Returns a list of groups matching the filter criteria. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $filter + * @param array $options + * @return array of KTAPI_Group + */ + public static + function getList($filter = null, $options = null) + { + $groups = Group::getList($filter, $options); + + if (PEAR::isError($groups)) + { + return $groups; + } + + $list = array(); + foreach($groups as $group) + { + $list[] = new KTAPI_Group($group); + } + + return $list; + } + + /** + * Return username property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public function getId() { return $this->group->getId(); } + + /** + * Return display name property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public function getName() { return $this->group->getName(); } + + /** + * Indicates if the group members are system administrators. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return boolean + */ + public function getIsSystemAdministrator() { return $this->group->getSysAdmin(); } + +} + +/** + * Encapsulates functionality around a role. + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_Role extends KTAPI_Member +{ + /** + * Reference to the original Role object. + * + * @access private + * @var Role + */ + private $role; + + /** + * Constructor for KTAPI_Group. This is private, and can only be constructed by the static getByXXX() functions. + * + * @author KnowledgeTree Team + * @access private + * @param Role $role + */ + private + function __construct($role) + { + $this->role = $role; + } + + /** + * Using the id, the role can be resolved. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param int $id + * @return KTAPI_Role Returns null if there is no match. + */ + public static + function getById($id) + { + $role = Role::get($id); + if (PEAR::isError($role)) + { + return $role; + } + + return new KTAPI_Role($role); + } + + /** + * Using the name, the role can be resolved. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $name + * @return KTAPI_Role Returns null if there is no match. + */ + public static + function getByName($name) + { + $sql = 'SELECT id FROM roles WHERE name=?'; + $id = DBUtil::getOneResultKey(array($sql, array($name)), 'id'); + if (PEAR::isError($id)) + { + return $id; + } + + $role = Role::get($id); + + return new KTAPI_Role($role); + } + + /** + * Returns a list of roles matching the filter criteria. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $filter + * @param array $options + * @return array of KTAPI_Role + */ + public static + function getList($filter = null, $options = array()) + { + $roles = Role::getList($filter, $options); + + if (PEAR::isError($roles)) + { + return $roles; + } + + $list = array(); + foreach($roles as $role) + { + $list[] = new KTAPI_Role($role); + } + + return $list; + } + + /** + * Return id property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public function getId() { return $this->role->getId(); } + + /** + * Return display name property. (readonly) + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public function getName() { return $this->role->getName(); } + +} + + + +/** + * Encapsulation functionality around a permission. + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_Permission extends KTAPI_Dynamic +{ + /** + * Reference to the original KTPermission object. + * + * @access private + * @var KTPermission + */ + private $permission; + + /** + * Constructor for KTAPI_Permission. This is private, and can only be constructed by the static getByXXX() functions. + * + * @author KnowledgeTree Team + * @access private + * @param KTPermission $permission + */ + private + function __construct($permission) + { + $this->permission = $permission; + } + + /** + * Return a list of permissions. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $filter + * @param array $options + * @return array of KTAPI_Permission + */ + public static + function getList($filter = null, $options = null) + { + $permissions = KTPermission::getList($filter); + if (PEAR::isError($permissions)) + { + return $permissions; + } + + $list = array(); + foreach($permissions as $permission) + { + $list[] = new KTAPI_Permission($permission); + } + + return $list; + } + + /** + * Returns a KTAPI_Permission based on id. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param int $id + * @return KTAPI_Permission Returns null if the namespace could not be resolved. + */ + public static + function getById($id) + { + $permission = KTPermission::get($id); + + if (PEAR::isError($permission)) + { + return $permission; + } + + return new KTAPI_Permission($permission); + } + + /** + * Returns a KTAPI_Permission based on namespace. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $namespace + * @return KTAPI_Permission Returns null if the namespace could not be resolved. + */ + public static + function getByNamespace($namespace) + { + $permission = KTPermission::getByName($namespace); + + if (PEAR::isError($permission)) + { + return $permission; + } + + return new KTAPI_Permission($permission); + } + + /** + * Returns the permission id. + * + * @author KnowledgeTree Team + * @access public + * @return int + */ + public + function getId() { return $this->permission->getId(); } + + /** + * Returns the permission name. + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public + function getName() { return $this->permission->getHumanName(); } + + /** + * Returns the permission namespace. + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + public + function getNamespace() { return $this->permission->getName(); } +} + +/** + * Allocation Base class + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +abstract class KTAPI_AllocationBase extends KTAPI_Dynamic +{ + /** + * Reference to the original KTAPI_FolderItem object. + * + * @access protected + * @var KTAPI_FolderItem + */ + protected $folderItem; + + /** + * A map of the perission allocation + * + * @access protected + * @var array + */ + protected $map; + + /** + * A copy of the map that can be restored when required. + * + * @access protected + * @var array + */ + protected $mapCopy; + + /** + * Indicates if changes have been made. + * + * @access protected + * @var boolean + */ + protected $changed; + + + /** + * Instance of the KTAPI object + * + * @access protected + * @var KTAPI + */ + protected $ktapi; + + /** + * Constructor for KTAPI_Permission. This is protected, and can only be constructed by the static getAllocation() function. + * + * @author KnowledgeTree Team + * @access protected + * @param KTAPI_FolderItem $folderItem + */ + protected + function __construct(KTAPI $ktapi, KTAPI_FolderItem $folderItem) + { + $this->ktapi = $ktapi; + $this->changed = false; + $this->folderItem = $folderItem; + $this->_resolveAllocations(); + } + + /** + * Helper method to identify the member type for the map. + * + * @author KnowledgeTree Team + * @access protected + * @param KTAPI_Member $member + * @return string + */ + protected + function _getMemberType(KTAPI_Member $member) + { + $type = get_class($member); + switch($type) + { + case 'KTAPI_User': $type = 'user'; break; + case 'KTAPI_Group': $type = 'group'; break; + case 'KTAPI_Role': $type = 'role'; break; + default: + throw new Exception('Unknown type: ' . $type); + } + return $type; + } + + /** + * Log the transaction for the current user. + * + * @author KnowledgeTree Team + * @access protected + * @param string $comment + * @param string $namespace + * @return object + */ + protected + function _logTransaction($comment, $namespace) + { + $type = get_class($this->folderItem); + + $object = $this->folderItem->getObject(); + $objectId = $object->getId(); + + switch ($type) + { + case 'KTAPI_Folder': + KTFolderTransaction::createFromArray(array( + 'folderid' => $objectId, + 'comment' => $comment, + 'transactionNS' => $namespace, + 'userid' => $_SESSION['userID'], + 'ip' => Session::getClientIP(), + )); + + break; + case 'KTAPI_Document': + DocumentTransaction::createFromArray(array( + 'folderid' => $objectId, + 'comment' => $comment, + 'transactionNS' => $namespace, + 'userid' => $_SESSION['userID'], + 'ip' => Session::getClientIP(), + )); + break; + default: + throw new Exception('Unexpected type: ' . $type); + } + + return $object; + } + + /** + * Restore working copy, voiding the add(), remove() changes. + * + * @author KnowledgeTree Team + * @access public + */ + public + function restore() + { + $this->map = $this->mapCopy; + $this->changed = false; + } + + protected abstract function _resolveAllocations(); + + public abstract function inheritAllocation(); + + public abstract function overrideAllocation(); + + public abstract function save(); + +} + + +/** + * Manages functionality arround permission allocation on a specific folder item. + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +final class KTAPI_PermissionAllocation extends KTAPI_AllocationBase +{ + /** + * Returns the permission allocation for a specified folder item. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param KTAPI + * @param KTAPI_FolderItem + * @return KTAPI_PermissionAllocation + */ + public static + function getAllocation(KTAPI $ktapi, KTAPI_FolderItem $folderItem) + { + $permissionAllocation = new KTAPI_PermissionAllocation($ktapi, $folderItem); + + return $permissionAllocation; + } + + /** + * Force the current folder item to inherit permission from the parent. + * + * @author KnowledgeTree Team + * @access public + */ + public + function inheritAllocation() + { + $object = $this->_logTransaction(_kt('Inherit permissions from parent'), 'ktcore.transactions.permissions_change'); + + KTPermissionUtil::inheritPermissionObject($object); + + $this->_resolvePermissions(); + } + + /** + * Creates a copy of the current permissions. + * + * @author KnowledgeTree Team + * @access public + */ + public + function overrideAllocation() + { + $object = $this->_logTransaction(_kt('Override permissions from parent'), 'ktcore.transactions.permissions_change'); + + KTPermissionUtil::copyPermissionObject($object); + } + + /** + * Gives permission to the specified member. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Member $member A KTAPI_Role, KTAPI_Group or KTAPI_User. + * @param KTAPI_Permission $permission + */ + public + function add(KTAPI_Member $member, KTAPI_Permission $permission) + { + $this->_set($member, $permission, true); + } + + /** + * Removes permission from the specified member. + * NOTE: This only removes permission if it was already granted. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Member $member A KTAPI_Role, KTAPI_Group or KTAPI_User. + * @param KTAPI_Permission $permission + */ + public + function remove(KTAPI_Member $member, KTAPI_Permission $permission) + { + $this->_set($member, $permission, false); + } + + /** + * Helper method to update the permission map for the current folder item. + * + * @author KnowledgeTree Team + * @access private + * @param KTAPI_Member $member + * @param KTAPI_Permission $permission + * @param boolean $on + */ + private + function _set(KTAPI_Member $member, KTAPI_Permission $permission, $on) + { + // @TODO + //if (!$this->map['editable']) + //{ + // throw new Exception('Cannot edit allocation.'); + //} + $type = $this->_getMemberType($member); + + $this->changed = true; + $this->map[$type . 's']['map'][$member->Id][$permission->Id] = $on; + } + + /** + * Returns a list of members. + * + * @author KnowledgeTree Team + * @access private + * @param string $type + * @return array + */ + private + function _getMemberList($type) + { + return $this->map[$type]['active']; + } + + /** + * Return list of users for which there are allocations. + * + * @author KnowledgeTree Team + * @access public + * @return array + */ + public + function getUsers() + { + return $this->_getMemberList('users'); + } + + /** + * Return list of groups for which there are allocations. + * + * @author KnowledgeTree Team + * @access public + * @return array + */ + public + function getGroups() + { + return $this->_getMemberList('groups'); + } + + /** + * Return list of members for which there are allocations. + * + * @author KnowledgeTree Team + * @access public + * @return array + */ + public + function getRoles() + { + return $this->_getMemberList('roles'); + } + + /** + * Returns the map of permissions for the specific member. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Member $member + * @return array + */ + public + function getMemberPermissions(KTAPI_Member $member) + { + $type = $this->_getMemberType($member); + + return $this->map[$type . 's']['map'][$member->Id]; + } + + /** + * Returns true if the permission is set for the specific member. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Member $member + * @param KTAPI_Permission $permission + * @return boolean + */ + public + function isMemberPermissionSet(KTAPI_Member $member, KTAPI_Permission $permission) + { + $type = $this->_getMemberType($member); + + $map = & $this->map[$type . 's']['map']; + + $memberId = $member->Id; + if (!array_key_exists($memberId, $map)) + { + return false; + } + + $permissionId = $permission->Id; + if (!array_key_exists($permissionId, $map[$memberId])) + { + return false; + } + + return $map[$memberId][$permissionId]; + } + + /** + * Returns the properties defined in the system. + * + * @author KnowledgeTree Team + * @access public + * @return array + * + */ + public + function getPermissions() + { + return $this->map['permissions']; + } + + /** + * Returns an associative array with permissions mapped onto users, groups and roles. + * + * @author KnowledgeTree Team + * @access public + * @access protected + */ + protected + function _resolveAllocations() + { + $object = $this->folderItem->getObject(); + $objectId = $object->getPermissionObjectID(); + + $oPO = KTPermissionObject::get($objectId); + + $permissions = KTPermission::getList(); + $cleanPermissions = array(); + + $map = array( + 'roles' => array('active'=>array(), 'map'=>array()), + 'users' => array('active'=>array(), 'map'=>array()), + 'groups' => array('active'=>array(), 'map'=>array()), + 'permissions' => array() + ); + + foreach($permissions as $permission) + { + $permissionId = $permission->getId(); + $cleanPermissions[$permissionId] = false; + $map['permissions'][$permissionId] = $permission->getHumanName(); + } + + // The next 3 sections of code are slightly repetitive. + + // Get all group permission assignments + $sql = "SELECT + pa.permission_id, g.name, g.id + FROM + permission_assignments pa + INNER JOIN permissions p ON p.id = pa.permission_id + INNER JOIN permission_descriptor_groups pdg ON pa.permission_descriptor_id = pdg.descriptor_id + INNER JOIN groups_lookup g ON pdg.group_id = g.id + WHERE + pa.permission_object_id = ? + ORDER BY g.name + "; + $groupPermissions = DBUtil::getResultArray(array($sql, array($objectId))); + foreach($groupPermissions as $group) + { + $groupId = $group['id']; + if (!array_key_exists($groupId, $map['groups']['active'])) + { + $map['groups']['map'][$groupId] = $cleanPermissions; + } + $map['groups']['active'][$groupId] = $group['name']; + $map['groups']['map'][$groupId][$group['permission_id']] = true; + } + + // Get all role permission assignments + + $sql = "SELECT + pa.permission_id, r.name, r.id + FROM + permission_assignments pa + INNER JOIN permissions p ON p.id = pa.permission_id + INNER JOIN permission_descriptor_roles pdr ON pa.permission_descriptor_id = pdr.descriptor_id + INNER JOIN roles r ON pdr.role_id = r.id + WHERE + pa.permission_object_id = ? + ORDER BY r.name + "; + $rolePermissions = DBUtil::getResultArray(array($sql, array($objectId))); + foreach($rolePermissions as $role) + { + $roleId = $role['id']; + if (!array_key_exists($roleId, $map['roles']['active'])) + { + $map['roles']['map'][$roleId] = $cleanPermissions; + } + $map['roles']['active'][$roleId] = $role['name']; + $map['roles']['map'][$roleId][$role['permission_id']] = true; + } + + // Get all user permission assignments + + $sql = "SELECT + pa.permission_id, u.name, u.id + FROM + permission_assignments pa + INNER JOIN permissions p ON p.id = pa.permission_id + INNER JOIN permission_descriptor_users pdu ON pa.permission_descriptor_id = pdu.descriptor_id + INNER JOIN users u ON pdu.user_id = u.id + WHERE + pa.permission_object_id = ? + ORDER BY u.name + "; + + $userPermissions = DBUtil::getResultArray(array($sql, $objectId)); + foreach($userPermissions as $user) + { + $userId = $user['id']; + if (!array_key_exists($userId, $map['users']['active'])) + { + $map['users']['map'][$userId] = $cleanPermissions; + } + $map['users']['active'][$userId] = $user['name']; + $map['users']['map'][$userId][$user['permission_id']] = true; + } + + // resolve editable, inherited, inheritable + + $user = $this->ktapi->get_session()->get_user(); + + $editable = KTPermissionUtil::userHasPermissionOnItem($user, 'ktcore.permissions.security', $object) || KTBrowseUtil::inAdminMode($user, $this->folderItem); + + $inherited = KTPermissionUtil::findRootObjectForPermissionObject($oPO); + + $inheritedId = $inherited->getId(); + $objectId = $object->getId(); + + $map['inherited'] = ($inheritedId !== $objectId) && ($objectId != 1); + + // only allow inheritance of permissions from parent if not inherited, -and- folder is editable + $map['inheritable'] = $editable && !$map['inherited'] && ($objectId != 1); + + // only allow edit if the folder is editable and not inherited + $map['editable'] = $editable && !$map['inherited']; + + $this->map = $map; + $this->mapCopy = $map; + $this->changed = false; + } + + /** + * Saves changes made by add() and remove(). + * + * @author KnowledgeTree Team + * @access public + */ + public + function save() + { + if (!$this->changed) + { + // we don't have to do anything if nothing has changed. + return; + } + + // if the current setup is inherited, then we must create a new copy to store the new associations. + if ($this->getIsInherited()) + { + $this->overrideAllocation(); + } + + $permissions = KTPermission::getList(); + + $folderItemObject = $this->_logTransaction(_kt('Updated permissions'), 'ktcore.transactions.permissions_change'); + + $permissionObject = KTPermissionObject::get($folderItemObject->getPermissionObjectId()); + + // transform the map into the structure expected + + foreach ($permissions as $permission) + { + $permissionId = $permission->getId(); + + // not the association is singular here + $allowed = array('group'=>array(),'role'=>array(),'user'=>array()); + + // fill the group allocations + foreach($this->map['groups']['map'] as $groupId => $allocations ) + { + if ($allocations[$permissionId]) + { + $allowed['group'][] = $groupId; + } + } + + // fill the user allocations + foreach($this->map['users']['map'] as $userId => $allocations ) + { + if ($allocations[$permissionId]) + { + $allowed['user'][] = $userId; + } + } + + // fill the role allocations + foreach($this->map['roles']['map'] as $roleId => $allocations ) + { + if ($allocations[$permissionId]) + { + $allowed['role'][] = $roleId; + } + } + + KTPermissionUtil::setPermissionForId($permission, $permissionObject, $allowed); + } + + KTPermissionUtil::updatePermissionLookupForPO($permissionObject); + + // set the copy to be that of the modified version. + + $this->mapCopy = $this->map; + $this->changed = false; + } + + /** + * Indicates if any changes have been made. + * + * @author KnowledgeTree Team + * @access public + * @return boolean + */ + public + function getHasChanged() { return $this->changed; } + + /** + * Indicates if the current folder item is allowed to inherit permissions from the parent. + * + * @author KnowledgeTree Team + * @access public + * @return boolean + */ + public + function getIsInheritable() { return $this->map['inheritable']; } + + /** + * Indicates it the current folder item currently inherits the permissions from the parent. + * + * @author KnowledgeTree Team + * @access public + * @return boolean + */ + public + function getIsInherited() { return $this->map['inherited']; } + + /** + * Indicates if the permissions are editable but the current user. + * + * @author KnowledgeTree Team + * @access public + * @return boolean + */ + public + function getIsEditable() { return $this->map['editable']; } + +} + +/** + * Manages functionality arround role allocation on a specific folder item. + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +final class KTAPI_RoleAllocation extends KTAPI_AllocationBase +{ + /** + * Resolve the folder item allocations + * + * @author KnowledgeTree Team + * @access public + * @access protected + */ + protected + function _resolveAllocations() + { + $object = $this->folderItem->getObject(); + $objectId = $object->getId(); + + $map = array( + 'user'=>array(), + 'group'=>array(), + 'role'=>array('role'=>array(), 'userAllocation'=>array(),'groupAllocation'=>array()), + ); + + // Get allocation of users to to role + $sql = 'SELECT + ra.role_id, r.name as rolename, pdu.user_id, u.name as username + FROM + role_allocations ra + INNER JOIN roles r ON ra.role_id = r.id + INNER JOIN permission_descriptor_users pdu ON ra.permission_descriptor_id = pdu.descriptor_id + INNER JOIN users u ON u.id = pdu.user_id + WHERE + ra.folder_id = ?'; + $allocations = DBUtil::getResultArray(array($sql, array($objectId))); + + foreach($allocations as $allocation) + { + $userId = $allocation['user_id']; + $roleId = $allocation['role_id']; + $map['user'][$userId] = $allocation['username']; + $map['role']['role'][$roleId] = $allocation['rolename']; + $map['role']['userAllocation'][$roleId][$userId] = $userId; + } + + // Get allocation of users to to role + $sql = 'SELECT + ra.role_id, r.name as rolename, pdg.group_id, g.name as groupname + FROM + role_allocations ra + INNER JOIN roles r ON ra.role_id = r.id + INNER JOIN permission_descriptor_groups pdg ON ra.permission_descriptor_id = pdg.descriptor_id + INNER JOIN groups_lookup g ON g.id = pdg.group_id + WHERE + ra.folder_id = ?'; + $allocations = DBUtil::getResultArray(array($sql, $objectId)); + + foreach($allocations as $allocation) + { + $groupId = $allocation['group_id']; + $roleId = $allocation['role_id']; + $map['group'][$groupId] = $allocation['groupname']; + $map['role']['role'][$roleId] = $allocation['rolename']; + $map['role']['groupAllocation'][$roleId][$groupId] = $groupId; + } + + // create the map + $this->map = $map; + $this->mapCopy = $map; + $this->changed = false; + } + + + /** + * Returns a reference to the role alloction on a folder item. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param KTAPI $ktapi + * @param KTAPI_FolderItem $folderItem + * @return KTAPI_RoleAllocation + */ + public static + function getAllocation(KTAPI $ktapi, KTAPI_FolderItem $folderItem) + { + $allocation = new KTAPI_RoleAllocation($ktapi, $folderItem); + return $allocation; + } + + /** + * Return an array mapping the membership. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param string $filter + * @param array $options + * @return array of KTAPIMember + */ + public + function getMembership($filter = null, $options = array()) + { + $membership = array(); + $map = $this->map; + + if(empty($map['role']['role'])) return array(); + + foreach ($map['role']['role'] as $roleId => $role){ + + // If the filter doesn't match, skip + if(!is_null($filter) && strpos($role, $filter) === false || strpos($role, $filter) != 0){ + continue; + } + + $users = array(); + $groups = array(); + + // Get users in role + if(isset($map['role']['userAllocation'][$roleId])){ + foreach ($map['role']['userAllocation'][$roleId] as $userId){ + $users[$userId] = $map['user'][$userId]; + } + } + + // Get groups in role + if(isset($map['role']['groupAllocation'][$roleId])){ + foreach($map['role']['groupAllocation'][$roleId] as $groupId){ + $groups[$groupId] = $map['group'][$groupId]; + } + } + + // Assign to membership array + $membership[$role]['user'] = $users; + $membership[$role]['group'] = $groups; + } + + return $membership; // array of (role=>array(user=>array(), group=>array())) + } + + /** + * Link a member to a role on the current folder item. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Role $role Must be a KTAPIRole, or an array of roles. + * @param KTAPI_Member $member A KTAPI_Group, KTAPI_User, array. + */ + public + function add(KTAPI_Role $role, KTAPI_Member $member) + { + $map = & $this->map; + $type = $this->_getMemberType($member); + + $memberId = $member->Id; + $map[$type][$memberId] = $member->Name; + + $roleId = $role->Id; + + $map['role']['role'][$roleId] = $role->Name; + + $allocation = $type . 'Allocation'; + if (!array_key_exists($roleId, $map['role'][$allocation])) + { + $map['role'][$allocation][$roleId] = array(); + } + if (array_key_exists($memberId, $map['role'][$allocation][$roleId])) + { + // if the key exists, we don't have to do anything. + return; + } + $map['role'][$allocation][$roleId][$memberId] = $memberId; + + $this->changed = true; + } + + /** + * Remove a member from a role on the current folder item. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Role $role Must be a KTAPIRole, or an array of roles. + * @param KTAPI_Member $member A KTAPI_Group or KTAPI_User. + */ + public + function remove(KTAPI_Role $role, KTAPI_Member $member) + { + $map = & $this->map; + + $roleId = $role->Id; + $memberId = $member->Id; + + $type = $this->_getMemberType($member); + $allocation = $type . 'Allocation'; + + $array = & $map['role'][$allocation][$roleId]; + + if (array_key_exists($memberId, $array)) + { + unset($array[$memberId]); + } + $this->changed = true; + } + + /** + * Check's if a role has a specific member + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Role $role + * @param KTAPI_Member $member + * @return boolean + */ + public + function doesRoleHaveMember(KTAPI_Role $role, KTAPI_Member $member) + { + $map = & $this->map; + + $roleId = $role->Id; + $memberId = $member->Id; + + $type = $this->_getMemberType($member); + $allocation = $type . 'Allocation'; + + if (!array_key_exists($roleId, $map['role'][$allocation])) + { + return false; + } + + $array = & $map['role'][$allocation][$roleId]; + + return (array_key_exists($memberId, $array)); + } + + + /** + * Removes all members associated with roles on the current folder item. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Role $role Must be a KTAPI_Role, or an array of roles. + * @param KTAPI_Member $member A KTAPI_Group or KTAPI_User. + */ + public + function removeAll($role = null) + { + $map = & $this->map; + + if (is_null($role)) + { + $map['role']['userAllocation'] = array(); + $map['role']['groupAllocation'] = array(); + } + else + { + $roleId = $role->Id; + + $map['role']['userAllocation'][$roleId] = array(); + $map['role']['groupAllocation'][$roleId] = array(); + } + + $this->changed = true; + } + + /** + * Override the role allocation for each role + * + * @author KnowledgeTree Team + * @access public + */ + public + function overrideAllocation() + { + foreach($this->map['role']['role'] as $roleId=>$roleName) + { + $this->overrideRoleAllocation(KTAPI_Role::getById($roleId)); + } + } + + /** + * Overrides a role allocation + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Role $role + */ + public + function overrideRoleAllocation(KTAPI_Role $role) + { + $roleId = $role->Id; + + $object = $this->folderItem->getObject(); + $objectId = $object->getId(); + $parentId = $object->getParentID(); + + // FIXME do we need to check that this role _isn't_ allocated? + $roleAllocation = new RoleAllocation(); + $roleAllocation->setFolderId($objectId); + $roleAllocation->setRoleId($roleId); + + // create a new permission descriptor. + // FIXME we really want to duplicate the original (if it exists) + + $allowed = array(); // no-op, for now. + $roleAllocation->setAllowed($allowed); + $res = $roleAllocation->create(); + + $this->_logTransaction(_kt('Override parent allocation'), 'ktcore.transactions.role_allocations_change'); + + + // inherit parent permissions + $parentAllocation = RoleAllocation::getAllocationsForFolderAndRole($parentId, $roleId); + if (!is_null($parentAllocation) && !PEAR::isError($parentAllocation)) + { + $descriptor = $parentAllocation->getPermissionDescriptor(); + + $allowed = $descriptor->getAllowed(); + + $allowed = array( + 'user' => $allowed['user'], + 'group' => $allowed['group'], + ); + + $roleAllocation->setAllowed($allowed); + $res = $roleAllocation->update(); + + } + + // regenerate permissions + + $this->_regeneratePermissionsForRole($roleId); + return $roleAllocation; + } + + /** + * Force all roles to inherit role associations. + * + * @author KnowledgeTree Team + * @access public + */ + public + function inheritAllocation() + { + if (!$this->canInheritRoleAllocation()) + { + return; + } + + $this->_logTransaction(_kt('Use parent allocation'), 'ktcore.transactions.role_allocations_change'); + + foreach($this->map['role']['role'] as $roleId=>$roleName) + { + $this->inheritRoleAllocation(KTAPI_Role::getById($roleId), false); + } + } + + /** + * Can the folder inherit allocations + * + * @author KnowledgeTree Team + * @access public + * @return unknown + */ + public + function canInheritRoleAllocation() + { + $object = $this->folderItem->getObject(); + $objectId = $object->getId(); + + return ($objectId != 1); + } + + /** + * Inherit the role associations from the parent. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Role $role + * @param boolean $log + */ + public + function inheritRoleAllocation(KTAPI_Role $role, $log = true) + { + if (!$this->canInheritRoleAllocation()) + { + return; + } + + $object = $this->folderItem->getObject(); + $objectId = $object->getId(); + + $roleId = $role->Id; + if ($log) + { + $this->_logTransaction(_kt('Use parent allocation'), 'ktcore.transactions.role_allocations_change'); + } + + $roleAllocation = RoleAllocation::getAllocationsForFolderAndRole($objectId, $roleId); + + $res = $roleAllocation->delete(); + if (PEAR::isError($res)) + { + return $res; + } + + if ($res == false) + { + return PEAR::raiseError(_kt('Could not inherit allocation from parent.')); + } + + $this->_regeneratePermissionsForRole($roleId); + } + + /** + * Regenerate permissions for a role. + * + * Adapted from KTRoleAllocationPlugin::regeneratePermissionsForRole() + * + * @author KnowledgeTree Team + * @access public + * @access private + * @param int $iRoleId + */ + private + function _regeneratePermissionsForRole($iRoleId) + { + $object = $this->folderItem->getObject(); + + $iStartFolderId = $object->getId(); + /* + * 1. find all folders & documents "below" this one which use the role + * definition _active_ (not necessarily present) at this point. + * 2. tell permissionutil to regen their permissions. + * + * The find algorithm is: + * + * folder_queue <- (iStartFolderId) + * while folder_queue is not empty: + * active_folder = + * for each folder in the active_folder: + * find folders in _this_ folder without a role-allocation on the iRoleId + * add them to the folder_queue + * update the folder's permissions. + * find documents in this folder: + * update their permissions. + */ + + $sRoleAllocTable = KTUtil::getTableName('role_allocations'); + $sFolderTable = KTUtil::getTableName('folders'); + $sQuery = sprintf('SELECT f.id as id FROM %s AS f LEFT JOIN %s AS ra ON (f.id = ra.folder_id) WHERE ra.id IS NULL AND f.parent_id = ?', $sFolderTable, $sRoleAllocTable); + + + $folder_queue = array($iStartFolderId); + while (!empty($folder_queue)) { + $active_folder = array_pop($folder_queue); + + $aParams = array($active_folder); + + $aNewFolders = DBUtil::getResultArrayKey(array($sQuery, $aParams), 'id'); + if (PEAR::isError($aNewFolders)) { + $this->errorRedirectToMain(_kt('Failure to generate folderlisting.')); + } + $folder_queue = kt_array_merge ($folder_queue, (array) $aNewFolders); // push. + + + // update the folder. + $oFolder =& Folder::get($active_folder); + if (PEAR::isError($oFolder) || ($oFolder == false)) { + $this->errorRedirectToMain(_kt('Unable to locate folder: ') . $active_folder); + } + + KTPermissionUtil::updatePermissionLookup($oFolder); + $aDocList =& Document::getList(array('folder_id = ?', $active_folder)); + if (PEAR::isError($aDocList) || ($aDocList === false)) { + $this->errorRedirectToMain(sprintf(_kt('Unable to get documents in folder %s: %s'), $active_folder, $aDocList->getMessage())); + } + + foreach ($aDocList as $oDoc) { + if (!PEAR::isError($oDoc)) { + KTPermissionUtil::updatePermissionLookup($oDoc); + } + } + } + } + + + /** + * Save's the role allocation + * + * @author KnowledgeTree Team + * @access public + */ + public + function save() + { + if (!$this->changed) + { + // we don't have to do anything if nothing has changed. + return; + } + + $map = & $this->map; + $folderId = $this->folderItem->getObject()->getId(); + + foreach($map['role']['role'] as $roleId => $roleName) + { + $roleAllocation = RoleAllocation::getAllocationsForFolderAndRole($folderId, $roleId); + + $allowed = array(); + + $userIds = array(); + $groupIds = array(); + if (array_key_exists($roleId, $map['role']['userAllocation'])) + { + foreach($map['role']['userAllocation'][$roleId] as $userId) + { + $userIds[] = $userId; + } + } + if (array_key_exists($roleId, $map['role']['groupAllocation'])) + { + foreach($map['role']['groupAllocation'][$roleId] as $groupId) + { + $groupIds[] = $groupId; + } + } + + $allowed['user'] = $userIds; + $allowed['group'] = $groupIds; + + if (is_null($roleAllocation)) + { + $roleAllocation = $this->overrideRoleAllocation(KTAPI_Role::getById($roleId)); + } + + $roleAllocation->setAllowed($allowed); + $roleAllocation->update(); + } + } +} + +?> diff --git a/ktapi/KTAPIBulkActions.inc.php b/ktapi/KTAPIBulkActions.inc.php new file mode 100644 index 0000000..b13e584 --- /dev/null +++ b/ktapi/KTAPIBulkActions.inc.php @@ -0,0 +1,575 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * + * @copyright 2008-2009, KnowledgeTree Inc. + * @license GNU General Public License version 3 + * @author KnowledgeTree Team + * @package KTAPI + * @version Version 0.9 + */ + +/** + * API for the handling bulk actions on documents and folders within KnowledgeTree + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_BulkActions +{ + /** + * Instance of the KTAPI object + * + * @access private + */ + private $ktapi; + + /** + * Constructs the bulk actions object + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI $ktapi Instance of the KTAPI object + */ + public function __construct(&$ktapi) + { + $this->ktapi = $ktapi; + } + + /** + * Bulk copies a list of folders and/or documents into the target folder. + * If any documents or folders fail to copy, an array is returned containing the document/folder object and the failure message. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * + * $root = $ktapi->get_root_folder(); + * $newFolder = $root->add_folder("New target folder"); + * if(PEAR::isError($newFolder)) return; + * + * $aItems = array($document); + * $bulk = new KTAPI_BulkActions($ktapi); + * $res = $bulk->copy($aItems, $newFolder, 'Bulk copy'); + * + * // if documents / folders failed + * if(!empty($res)) { + * // display reason for documents failure + * foreach($res['docs'] as $failedDoc){ + * echo '
' . $failedDoc['object']->get_title() . ' - reason: '.$failedDoc['reason']; + * } + * // display reason for folders failure + * foreach($res['folders'] as $failedDoc){ + * echo '
' . $failedFolder['object']->get_folder_name() . ' - reason: '.$failedFolder['reason']; + * } + * } + *
+ * + * @author KnowledgeTree Team + * @access public + * @param array $items The folders and/or documents + * @param KTAPI_Folder $target_folder The target folder object + * @param string $reason The reason for performing the copy + * @return array|PEAR_Error Returns an array of documents and folders that couldn't be copied | PEAR_Error on failure + */ + function copy($items, &$target_folder, $reason) + { + if(empty($items)) return; + assert(!is_null($target_folder)); + assert($target_folder instanceof KTAPI_FOLDER); + + if(!is_array($items)){ + $items = array($items); + } + + // Check user has write permission on target folder + $result = $this->ktapi->can_user_access_object_requiring_permission($target_folder->get_folder(), KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($result)) + { + return $result; + } + + // Copy the document or folder + // Items that fail are returned in an array with the reason for failure. + + $failed = array(); + foreach ($items as $item){ + assert($item instanceof KTAPI_Document || $item instanceof KTAPI_Folder); + + $docOrFolder = ($item instanceof KTAPI_Document) ? 'docs' : 'folders'; + + $res = $item->copy($target_folder, $reason); + + if(PEAR::isError($res)){ + $failed[$docOrFolder][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + } + + return $failed; + } + + /** + * Bulk moves a list of folders and/or documents into the target folder + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * + * $root = $ktapi->get_root_folder(); + * $newFolder = $root->add_folder("New target folder"); + * if(PEAR::isError($newFolder)) return; + * + * $aItems = array($document); + * $bulk = new KTAPI_BulkActions($ktapi) + * $res = $bulk->move($aItems, $newFolder, 'Bulk move'); + * + * // if documents / folders failed + * if(!empty($res)) { + * // display reason for documents failure + * foreach($res['docs'] as $failedDoc){ + * echo '
' . $failedDoc['object']->get_title() . ' - reason: '.$failedDoc['reason']; + * } + * // display reason for folders failure + * foreach($res['folders'] as $failedDoc){ + * echo '
' . $failedFolder['object']->get_folder_name() . ' - reason: '.$failedFolder['reason']; + * } + * } + *
+ * + * @author KnowledgeTree Team + * @access public + * @param array $items The folders and/or documents + * @param KTAPI_Folder $target_folder The target folder object + * @param string $reason The reason for performing the move + * @return void|PEAR_Error Nothing on success | PEAR_Error on failure + */ + function move($items, &$target_folder, $reason) + { + if(empty($items)) return; + assert(!is_null($target_folder)); + assert($target_folder instanceof KTAPI_FOLDER); + + if(!is_array($items)){ + $items = array($items); + } + + // Check user has write permission on target folder + $result = $this->ktapi->can_user_access_object_requiring_permission($target_folder->get_folder(), KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($result)) + { + return $result; + } + + // Move the document or folder + // Items that fail are returned in an array with the reason for failure. + + $failed = array(); + foreach ($items as $item){ + assert($item instanceof KTAPI_Document || $item instanceof KTAPI_Folder); + + $docOrFolder = ($item instanceof KTAPI_Document) ? 'docs' : 'folders'; + + $res = $item->move($target_folder, $reason); + + if(PEAR::isError($res)){ + $failed[$docOrFolder][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + } + + return $failed; + } + + /** + * Performs a bulk checkout on a list of folders and/or documents + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $folder = $ktapi->get_folder_by_name('New test folder'); + * + * $aItems = array($document, $folder); + * $bulk = new KTAPI_BulkActions($ktapi) + * $res = $bulk->checkout($aItems, 'Bulk archive'); + * + * // if documents / folders failed + * if(!empty($res)) { + * // display reason for documents failure + * foreach($res['docs'] as $failedDoc){ + * echo '
' . $failedDoc['object']->get_title() . ' - reason: '.$failedDoc['reason']; + * } + * // display reason for folders failure + * foreach($res['folders'] as $failedDoc){ + * echo '
' . $failedFolder['object']->get_folder_name() . ' - reason: '.$failedFolder['reason']; + * } + * } + *
+ * + * @author KnowledgeTree Team + * @access public + * @param array $items The folders and/or documents + * @param string $reason The reason for performing the checkout + * @return void|PEAR_Error Nothing with download set to false | PEAR_Error on failure + */ + function checkout($items, $reason) + { + if(empty($items)) return; + + if(!is_array($items)){ + $items = array($items); + } + + // Checkout the document or folder + // Items that fail are returned in an array with the reason for failure. + + $failed = array(); + foreach ($items as $item){ + // Documents + if($item instanceof KTAPI_Document){ + $res = $item->checkout($reason); + + if(PEAR::isError($res)){ + $failed['docs'][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + }else if($item instanceof KTAPI_Folder){ + // Folders - need to recurse in + DBUtil::startTransaction(); + $res = $this->recurseFolder($item, $reason, 'checkout'); + + if(PEAR::isError($res)){ + DBUtil::rollback(); + $failed['folders'][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + DBUtil::commit(); + } + } + + return $failed; + } + + /** + * Performs a bulk cancel checkout on a list of folders and/or documents + * + * @author KnowledgeTree Team + * @access public + * @param array $items The folders and/or documents + * @param string $reason The reason for cancelling the checkout + * @return void|PEAR_Error Nothing with download set to false | PEAR_Error on failure + */ + function undo_checkout($items, $reason) + { + if(empty($items)) return; + + if(!is_array($items)){ + $items = array($items); + } + + // Cancel checkout on the document or folder contents + // Items that fail are returned in an array with the reason for failure. + + $failed = array(); + foreach ($items as $item){ + // Documents + if($item instanceof KTAPI_Document){ + $res = $item->undo_checkout($reason); + + if(PEAR::isError($res)){ + $failed['docs'][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + }else if($item instanceof KTAPI_Folder){ + // Folders - need to recurse in + DBUtil::startTransaction(); + $res = $this->recurseFolder($item, $reason, 'undo_checkout'); + + if(PEAR::isError($res)){ + DBUtil::rollback(); + $failed['folders'][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + DBUtil::commit(); + } + } + + return $failed; + } + + /** + * Bulk immutes a list of documents + * + * @author KnowledgeTree Team + * @access public + * @param array $items The folders and/or documents + * @return void|PEAR_Error Nothing on success | PEAR_Error on failure + */ + function immute($items) + { + if(empty($items)) return; + + if(!is_array($items)){ + $items = array($items); + } + + // Immute the documents + // Items that fail are returned in an array with the reason for failure. + + $failed = array(); + foreach ($items as $item){ + // Documents + if($item instanceof KTAPI_Document){ + $res = $item->immute(); + + if(PEAR::isError($res)){ + $failed['docs'][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + }else if($item instanceof KTAPI_Folder){ + // Folders - need to recurse in + DBUtil::startTransaction(); + $res = $this->recurseFolder($item, null, 'immute'); + + if(PEAR::isError($res)){ + DBUtil::rollback(); + $failed['folders'][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + DBUtil::commit(); + } + } + + return $failed; + } + + /** + * Bulk deletes a list of folders and/or documents + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $folder = $ktapi->get_folder_by_name('New test folder'); + * + * $aItems = array($document, $folder); + * $bulk = new KTAPI_BulkActions($ktapi) + * $res = $bulk->delete($aItems, 'Bulk delete'); + * + * // if documents / folders failed + * if(!empty($res)) { + * // display reason for documents failure + * foreach($res['docs'] as $failedDoc){ + * echo '
' . $failedDoc['object']->get_title() . ' - reason: '.$failedDoc['reason']; + * } + * // display reason for folders failure + * foreach($res['folders'] as $failedDoc){ + * echo '
' . $failedFolder['object']->get_folder_name() . ' - reason: '.$failedFolder['reason']; + * } + * } + *
+ * + * @author KnowledgeTree Team + * @access public + * @param array $items The folders and/or documents + * @param string $reason The reason for performing the deletion + * @return void|PEAR_Error Nothing on success | PEAR_Error on failure + */ + function delete($items, $reason) + { + if(empty($items)) return; + + if(!is_array($items)){ + $items = array($items); + } + + // Delete the document or folder + // Items that fail are returned in an array with the reason for failure. + + $failed = array(); + foreach ($items as $item){ + assert($item instanceof KTAPI_Document || $item instanceof KTAPI_Folder); + + $docOrFolder = ($item instanceof KTAPI_Document) ? 'docs' : 'folders'; + + $res = $item->delete($reason); + + if(PEAR::isError($res)){ + $failed[$docOrFolder][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + } + + return $failed; + } + + /** + * Bulk archives a list of folders and/or documents + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $folder = $ktapi->get_folder_by_name('New test folder'); + * + * $aItems = array($document, $folder); + * $bulk = new KTAPI_BulkActions($ktapi) + * $res = $bulk->archive($aItems, 'Bulk archive'); + * + * // if documents / folders failed + * if(!empty($res)) { + * // display reason for documents failure + * foreach($res['docs'] as $failedDoc){ + * echo '
' . $failedDoc['object']->get_title() . ' - reason: '.$failedDoc['reason']; + * } + * // display reason for folders failure + * foreach($res['folders'] as $failedDoc){ + * echo '
' . $failedFolder['object']->get_folder_name() . ' - reason: '.$failedFolder['reason']; + * } + * } + *
+ * + * @author KnowledgeTree Team + * @access public + * @param array $items The folders and/or documents + * @param string $reason The reason for performing the archival + * @return void|PEAR_Error Nothing on success | PEAR_Error on failure + */ + function archive($items, $reason) + { + if(empty($items)) return; + + if(!is_array($items)){ + $items = array($items); + } + + // Archive the document or folder + // Items that fail are returned in an array with the reason for failure. + + $failed = array(); + foreach ($items as $item){ + // Documents + if($item instanceof KTAPI_Document){ + $res = $item->archive($reason); + + if(PEAR::isError($res)){ + $failed['docs'][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + }else if($item instanceof KTAPI_Folder){ + // Folders - need to recurse in + DBUtil::startTransaction(); + $res = $this->recurseFolder($item, $reason, 'archive'); + + if(PEAR::isError($res)){ + DBUtil::rollback(); + $failed['folders'][] = array('object' => $item, 'reason' => $res->getMessage()); + continue; + } + DBUtil::commit(); + } + } + + return $failed; + } + + /** + * Recursive function to perform a given action on a folder and contained documents. + * + * @author KnowledgeTree Team + * @access private + * @param KTAPI_Folder $folder The instance of the folder object being archived + * @param string $reason The reason for archiving + * @param string $action The action to be performed on the documents + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + private function recurseFolder($folder, $reason = '', $action = 'archive') + { + if(!$folder instanceof KTAPI_Folder){ + return PEAR::raiseError('Object is not an instance of KTAPI_Folder'); + } + + // Archive contained documents + $listDocs = $folder->get_listing(1, 'D'); + if(!empty($listDocs)) { + + foreach ($listDocs as $docInfo){ + $doc = $this->ktapi->get_document_by_id($docInfo['id']); + + switch ($action){ + case 'archive': + $res = $doc->archive($reason); + break; + + case 'checkout': + $res = $doc->checkout($reason); + break; + + case 'undo_checkout': + $res = $doc->undo_checkout($reason); + break; + + case 'immute': + $res = $doc->immute(); + break; + } + + + if(PEAR::isError($res)){ + return $res; + } + } + } + + // Archive contained folders + $listFolders = $folder->get_listing(1, 'F'); + if(!empty($listFolders)) { + foreach ($listFolders as $folderItem){ + $res = $this->archiveFolder($folderItem, $reason); + + if(PEAR::isError($res)){ + return $res; + } + } + } + return; + } +} +?> diff --git a/ktapi/KTAPICollection.inc.php b/ktapi/KTAPICollection.inc.php new file mode 100644 index 0000000..64bb56c --- /dev/null +++ b/ktapi/KTAPICollection.inc.php @@ -0,0 +1,86 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * + * @copyright 2008-2009, KnowledgeTree Inc. + * @license GNU General Public License version 3 + * @author KnowledgeTree Team + * @package KTAPI + * @version Version 0.9 + */ + +/** + * API for the handling collections within KnowledgeTree + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_Collection { + + /** + * KTAPI_Collection constructor + * + */ + function __construct() { + + } + + + /** + * This will return the columns for the requested view, defaulting to browse view + * + */ + function get_columns($view = 'ktcore.views.browse') { + $oColumnRegistry =& KTColumnRegistry::getSingleton(); + $columns = $oColumnRegistry->getColumnsForView($view); + + // Flattening columns + + $res = array(); + $i = 0; + foreach($columns as $val) { + foreach($val as $objkey => $objval) { + $res[$i][$objkey] = $objval; + } + $i++; + } + return $res; + } + +} + + +?> diff --git a/ktapi/KTAPIConstants.inc.php b/ktapi/KTAPIConstants.inc.php new file mode 100644 index 0000000..f834149 --- /dev/null +++ b/ktapi/KTAPIConstants.inc.php @@ -0,0 +1,86 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * + * @copyright 2008-2009, KnowledgeTree Inc. + * @license GNU General Public License version 3 + * @author KnowledgeTree Team + * @package KTAPI + * @version Version 0.9 + */ + +/** + * Generic error messages used in the API. There may be some others specific to functionality + * directly in the code. + * + * TODO: Check that they are all relevant. +*/ +define('KTAPI_ERROR_SESSION_INVALID', 'The session could not be resolved.'); +define('KTAPI_ERROR_PERMISSION_INVALID', 'The permission could not be resolved.'); +define('KTAPI_ERROR_FOLDER_INVALID', 'The folder could not be resolved.'); +define('KTAPI_ERROR_DOCUMENT_INVALID', 'The document could not be resolved.'); +define('KTAPI_ERROR_USER_INVALID', 'The user could not be resolved.'); +define('KTAPI_ERROR_KTAPI_INVALID', 'The ktapi could not be resolved.'); +define('KTAPI_ERROR_INSUFFICIENT_PERMISSIONS', 'The user does not have sufficient permissions to access the resource.'); +define('KTAPI_ERROR_INTERNAL_ERROR', 'An internal error occurred. Please review the logs.'); +define('KTAPI_ERROR_DOCUMENT_TYPE_INVALID', 'The document type could not be resolved.'); +define('KTAPI_ERROR_DOCUMENT_CHECKED_OUT', 'The document is checked out.'); +define('KTAPI_ERROR_DOCUMENT_NOT_CHECKED_OUT', 'The document is not checked out.'); +define('KTAPI_ERROR_WORKFLOW_INVALID', 'The workflow could not be resolved.'); +define('KTAPI_ERROR_WORKFLOW_NOT_IN_PROGRESS', 'The workflow is not in progress.'); +define('KTAPI_ERROR_DOCUMENT_LINK_TYPE_INVALID','The link type could not be resolved.'); + +/** + * Mapping of permissions to actions. + * + * Note, currently, all core actions have permissions that are defined in the plugins. + * As the permissions are currently associated with actions which are quite closely linked + * to the web interface, it is not the nicest way to do things. They should be associated at + * a lower level, such as in the api. probably, better, would be at some stage to assocate + * the permissions to the action/transaction in the database so administrators can really customise + * as required. + * + * TODO: Check that they are all correct. +*/ +define('KTAPI_PERMISSION_DELETE', 'ktcore.permissions.delete'); +define('KTAPI_PERMISSION_READ', 'ktcore.permissions.read'); +define('KTAPI_PERMISSION_WRITE', 'ktcore.permissions.write'); +define('KTAPI_PERMISSION_ADD_FOLDER', 'ktcore.permissions.addFolder'); +define('KTAPI_PERMISSION_RENAME_FOLDER', 'ktcore.permissions.folder_rename'); +define('KTAPI_PERMISSION_CHANGE_OWNERSHIP', 'ktcore.permissions.security'); +define('KTAPI_PERMISSION_DOCUMENT_MOVE', 'ktcore.permissions.write'); +define('KTAPI_PERMISSION_WORKFLOW', 'ktcore.permissions.workflow'); +define('KTAPI_PERMISSION_VIEW_FOLDER', 'ktcore.permissions.folder_details'); + +?> diff --git a/ktapi/KTAPIDocument.inc.php b/ktapi/KTAPIDocument.inc.php new file mode 100644 index 0000000..88756e2 --- /dev/null +++ b/ktapi/KTAPIDocument.inc.php @@ -0,0 +1,2548 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * + * @copyright 2008-2009, KnowledgeTree Inc. + * @license GNU General Public License version 3 + * @author KnowledgeTree Team + * @package KTAPI + * @version Version 0.9 + */ + +require_once(KT_DIR . '/ktwebservice/KTDownloadManager.inc.php'); + +/** + * API for the handling document operations within KnowledgeTree + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_Document extends KTAPI_FolderItem +{ + /** + * This is a reference to the internal document object. + * + * @access protected + * @var object of Document + */ + var $document; + + /** + * This is the id of the document. + * + * @access protected + * @var int + */ + var $documentid; + + /** + * This is a reference to the parent folder. + * + * @access protected + * @var object of KTAPI_Folder + */ + var $ktapi_folder; + + /** + * Gets the id of the current document + * + * @author KnowledgeTree Team + * @access public + * @return string The document id + */ + function get_documentid() + { + return $this->documentid; + } + + /** + * This is used to get a document based on document id. + * + * @author KnowledgeTree Team + * @static + * @access public + * @param KTAPI $ktapi The ktapi object + * @param int $documentid The document id + * @return KTAPI_Document The document object + */ + function &get(&$ktapi, $documentid) + { + assert(!is_null($ktapi)); + assert(is_a($ktapi, 'KTAPI')); + assert(is_numeric($documentid)); + + $documentid += 0; + + $document = &Document::get($documentid); + if (is_null($document) || PEAR::isError($document)) + { + return new KTAPI_Error(KTAPI_ERROR_DOCUMENT_INVALID,$document ); + } + + $user = $ktapi->can_user_access_object_requiring_permission($document, KTAPI_PERMISSION_READ); + + if (is_null($user) || PEAR::isError($user)) + { + return $user; + } + + $folderid = $document->getParentID(); + + if (!is_null($folderid)) + { + $ktapi_folder = &KTAPI_Folder::get($ktapi, $folderid); + } + else + { + $ktapi_folder = null; + } + // We don't do any checks on this folder as it could possibly be deleted, and is not required right now. + + return new KTAPI_Document($ktapi, $ktapi_folder, $document); + } + + /** + * Checks if a document has been deleted + * + * @author KnowledgeTree Team + * @access public + * @return boolean TRUE if deleted | FALSE if in a different state + */ + function is_deleted() + { + return ($this->document->getStatusID() == 3); + } + + /** + * Checks if the document is a shortcut + * + * @author KnowledgeTree Team + * @access public + * @return boolean TRUE if it is a shortcut | FALSE if not + */ + function is_shortcut() + { + return $this->document->isSymbolicLink(); + } + + /** + * Retrieves the shortcuts linking to this document + * + * @author KnowledgeTree Team + * @access public + * @return array The shortcuts linked to the document + */ + function get_shortcuts() + { + return $this->document->getSymbolicLinks(); + } + + + /** + * This is the constructor for the KTAPI_Document + * + * @author KnowledgeTree Team + * @access private + * @param KTAPI $ktapi The KTAPI object + * @param KTAPI_Folder $ktapi_folder The parent folder object + * @param Document $document The internal document object + * @return KTAPI_Document + */ + function KTAPI_Document(&$ktapi, &$ktapi_folder, &$document) + { + assert($ktapi instanceof KTAPI); //is_a($ktapi,'KTAPI')); + assert(is_null($ktapi_folder) || $ktapi_folder instanceof KTAPI_Folder); //is_a($ktapi_folder,'KTAPI_Folder')); + + $this->ktapi = &$ktapi; + $this->ktapi_folder = &$ktapi_folder; + $this->document = &$document; + $this->documentid = $document->getId(); + } + + /** + * This checks a document into the repository. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * if($document->is_checked_out()){ + * $document->checkin('filename.txt', 'Reason for checkin', '/tmp/filename'); + * } + * + * + * @author KnowledgeTree Team + * @access public + * @param string $filename The name of the file + * @param string $reason The reason for checking the document in + * @param string $tempfilename The location of the temporary file + * @param bool $major_update Determines if the version number should have a major increment (+1) or a minor increment (+0.1) + */ + function checkin($filename, $reason, $tempfilename, $major_update=false) + { + if (!is_file($tempfilename)) + { + return new PEAR_Error('File does not exist.'); + } + + $user = $this->can_user_access_object_requiring_permission($this->document, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($user)) + { + return $user; + } + + if (!$this->document->getIsCheckedOut()) + { + return new PEAR_Error(KTAPI_ERROR_DOCUMENT_NOT_CHECKED_OUT); + } + + $filename = KTUtil::replaceInvalidCharacters($filename); + + $options = array('major_update'=>$major_update); + + $currentfilename = $this->document->getFileName(); + if ($filename != $currentfilename) + { + $options['newfilename'] = $filename; + } + + DBUtil::startTransaction(); + $result = KTDocumentUtil::checkin($this->document, $tempfilename, $reason, $user, $options); + + if (PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$result); + } + DBUtil::commit(); + + KTUploadManager::temporary_file_imported($tempfilename); + } + + /** + * Removes the update notification for the document + * + * @author KnowledgeTree Team + * @access public + */ + function removeUpdateNotification() + { + $sql = "DELETE FROM notifications WHERE data_int_1=$this->documentid AND data_str_1='ModifyDocument'"; + DBUtil::runQuery($sql); + } + + /** + * Creates a link between two documents + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Document $document The document object + * @param string $type The link relationship type: depended on|Attachment|Reference|Copy|Default + * @return PEAR_Error|void Returns nothing on success | a PEAR_Error object on failure + * + */ + function link_document($document, $type) + { + $typeid = $this->ktapi->get_link_type_id($type); + if (PEAR::isError($typeid)) + { + return $typeid; + } + + $link = new DocumentLink($this->get_documentid(), $document->get_documentid(), $typeid ); + $created = $link->create(); + if ($created === false || PEAR::isError($created)) + { + return new PEAR_Error(_kt('Could not create link')); + } + } + + /** + * Removes the link between two documents + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Document $document The document object + * @return PEAR_Error|void Returns nothing on success | a PEAR_Error object on failure + */ + function unlink_document($document) + { + $sql = "DELETE FROM document_link WHERE parent_document_id=$this->documentid AND child_document_id=$document->documentid"; + $result = DBUtil::runQuery($sql); + if (empty($result) || PEAR::isError($created)) + { + return new PEAR_Error(_kt('Could not remove link')); + } + } + + + /** + * Checks whether the document has been checked out. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * if($document->is_checked_out()){ + * continue; + * }else{ + * $document->checkout('Reason for document checkout'); + * } + * + * + * @author KnowledgeTree Team + * @access public + * @return boolean TRUE if checked out | FALSE if not + */ + function is_checked_out() + { + return ($this->document->getIsCheckedOut()); + } + + /** + * Cancels the checkout on a document + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * if($document->is_checked_out()){ + * $document->undo_checkout('Reason for cancelling checkout'); + * } + * + * + * @author KnowledgeTree Team + * @access public + * @param string $reason The reason for cancelling + * @return PEAR_Error|void Returns nothing on success | a PEAR_Error on failure + */ + function undo_checkout($reason) + { + $user = $this->can_user_access_object_requiring_permission($this->document, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($user)) + { + return $user; + } + + if (!$this->document->getIsCheckedOut()) + { + return new PEAR_Error(KTAPI_ERROR_DOCUMENT_NOT_CHECKED_OUT); + } + + DBUtil::startTransaction(); + + $this->document->setIsCheckedOut(0); + $this->document->setCheckedOutUserID(-1); + $res = $this->document->update(); + if (($res === false) || PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res); + } + + $oDocumentTransaction = new DocumentTransaction($this->document, $reason, 'ktcore.transactions.force_checkin'); + + $res = $oDocumentTransaction->create(); + if (($res === false) || PEAR::isError($res)) { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res); + } + DBUtil::commit(); + } + + /** + * Gets a list of linked documents + * + * @author KnowledgeTree Team + * @access public + * @return array|PEAR_Error Returns a list of linked documents on success | a PEAR_Error on failure + */ + + function get_linked_documents() + { + $sql = " + SELECT + dl.child_document_id as document_id, + dmv.name as title, + dcv.size, + w.name as workflow, + ws.name as workflow_state, + dlt.name as link_type, dtl.name as document_type, + dcv.major_version, dcv.minor_version, d.oem_no + FROM + document_link dl + INNER JOIN document_link_types dlt ON dl.link_type_id=dlt.id + INNER JOIN documents d ON dl.child_document_id=d.id + INNER JOIN document_metadata_version dmv ON d.metadata_version_id=dmv.id + INNER JOIN document_content_version dcv ON dmv.content_version_id=dcv.id + INNER JOIN document_types_lookup dtl ON dtl.id=dmv.document_type_id + LEFT OUTER JOIN workflow_documents wd ON d.id=wd.document_id + LEFT OUTER JOIN workflows w ON w.id=wd.workflow_id + LEFT OUTER JOIN workflow_states ws ON wd.state_id=ws.id + WHERE + dl.parent_document_id=$this->documentid + + "; + $rows = DBUtil::getResultArray($sql); + if (PEAR::isError($rows)) + { + return $rows; + } + $result=array(); + $read_permission = &KTPermission::getByName(KTAPI_PERMISSION_READ); + $user = $this->ktapi->get_user(); + + foreach($rows as $row) + { + $document = Document::get($row['document_id']); + if (PEAR::isError($document) || is_null($document)) + { + continue; + } + if(!KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $document)) + { + continue; + } + + $oem_no = $row['oem_no']; + if (empty($oem_no)) $oem_no = 'n/a'; + + $result[] = array( + 'document_id'=>(int)$row['document_id'], + 'custom_document_no'=>'n/a', + 'oem_document_no'=>$oem_no, + 'title'=> $row['title'], + 'document_type'=> $row['document_type'], + 'version'=> (float) ($row['major_version'] . '.' . $row['minor_version']), + 'filesize'=>(int)$row['size'], + 'workflow'=>empty($row['workflow'])?'n/a':$row['workflow'], + 'workflow_state'=>empty($row['workflow_state'])?'n/a':$row['workflow_state'], + 'link_type'=>empty($row['link_type'])?'unknown':$row['link_type'], + ); + } + + return $result; + } + + /** + * Checks out a document + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $document->checkout('Reason for document checkout'); + * if($document->is_checked_out()){ + * continue; + * } + * + * + * @author KnowledgeTree Team + * @access public + * @param string $reason The reason for checking out the document + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function checkout($reason) + { + $user = $this->can_user_access_object_requiring_permission($this->document, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($user)) + { + return $user; + } + + //if the document is checked-out by the current user, just return + //as no need to check-out again BUT we do need to download + //returning here will allow download, but skip check-out + if ( ($this->document->getIsCheckedOut()) && + ($this->document->getCheckedOutUserID() == $_SESSION['userID']) ) + { + return; + } + + DBUtil::startTransaction(); + $res = KTDocumentUtil::checkout($this->document, $reason, $user); + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res); + } + + DBUtil::commit(); + } + + /** + * Deletes a document from the folder. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $document->delete('Reason for deletion'); + * + * + * @author KnowledgeTree Team + * @access public + * @param string $reason The reason for deleting the document + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function delete($reason) + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_DELETE); + + if (PEAR::isError($user)) + { + return $user; + } + + if ($this->document->getIsCheckedOut()) + { + return new PEAR_Error(KTAPI_ERROR_DOCUMENT_CHECKED_OUT); + } + + DBUtil::startTransaction(); + $res = KTDocumentUtil::delete($this->document, $reason); + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res); + } + + DBUtil::commit(); + } + + /** + * Changes the owner of a document and updates its permissions. + * + * @author KnowledgeTree Team + * @access public + * @param string $newusername The username of the new owner + * @param string $reason The reason for changing the owner + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function change_owner($newusername, $reason='Changing of owner.') + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_CHANGE_OWNERSHIP); + + if (PEAR::isError($user)) + { + return $user; + } + + DBUtil::startTransaction(); + + $user = &User::getByUserName($newusername); + if (is_null($user) || PEAR::isError($user)) + { + return new KTAPI_Error('User could not be found',$user); + } + + $newuserid = $user->getId(); + + $this->document->setOwnerID($newuserid); + + $res = $this->document->update(); + + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR ,$res ); + } + + $res = KTPermissionUtil::updatePermissionLookup($this->document); + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res ); + } + + $oDocumentTransaction = new DocumentTransaction($this->document, $reason, 'ktcore.transactions.permissions_change'); + + $res = $oDocumentTransaction->create(); + if (($res === false) || PEAR::isError($res)) { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res ); + } + + DBUtil::commit(); + } + + /** + * Copies the document from one folder to another. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $newFolder = $this->root->add_folder("New folder"); + * $copyOfDoc = $document->copy($newFolder, 'Reason for copying document'); + * + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Folder $ktapi_target_folder The new parent folder where the document is being copied into + * @param string $reason The reason for the copy + * @param string $newname Optional. The title of the document to be used in the case of a name clash + * @param string $newfilename Optional. The filename of the document to be used in the case of a name clash + * @return KTAPI_Document|PEAR_Error Returns the new KTAPI Document object | a PEAR_Error on failure + */ + function copy(&$ktapi_target_folder, $reason, $newname=null, $newfilename=null) + { + assert(!is_null($ktapi_target_folder)); + assert($ktapi_target_folder instanceof KTAPI_FOLDER); //is_a($ktapi_target_folder,'KTAPI_Folder')); + + if (empty($newname)) + { + $newname=null; + } + if (empty($newfilename)) + { + $newfilename=null; + } + + $user = $this->ktapi->get_user(); + + if ($this->document->getIsCheckedOut()) + { + return new PEAR_Error(KTAPI_ERROR_DOCUMENT_CHECKED_OUT); + } + + $target_folder = &$ktapi_target_folder->get_folder(); + + $result = $this->can_user_access_object_requiring_permission($target_folder, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($result)) + { + return $result; + } + + $name = $this->document->getName(); + $clash = KTDocumentUtil::nameExists($target_folder, $name); + if ($clash && !is_null($newname)) + { + $name = $newname; + $clash = KTDocumentUtil::nameExists($target_folder, $name); + } + if ($clash) + { + if (is_null($newname)) + { + $name = KTDocumentUtil::getUniqueDocumentName($target_folder, $name); + } + else + { + return new PEAR_Error('A document with this title already exists in your chosen folder. ' + . 'Please choose a different folder, or specify a new title for the copied document.'); + } + } + + $filename=$this->document->getFilename(); + $clash = KTDocumentUtil::fileExists($target_folder, $filename); + + if ($clash && !is_null($newname)) + { + $filename = $newfilename; + $clash = KTDocumentUtil::fileExists($target_folder, $filename); + } + if ($clash) + { + if (is_null($newfilename)) + { + $filename = KTDocumentUtil::getUniqueFilename($target_folder, $newfilename); + } + else + { + return new PEAR_Error('A document with this filename already exists in your chosen folder. ' + . 'Please choose a different folder, or specify a new filename for the copied document.'); + } + } + + DBUtil::startTransaction(); + + $new_document = KTDocumentUtil::copy($this->document, $target_folder, $reason); + if (PEAR::isError($new_document)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$new_document ); + } + + $new_document->setName($name); + $new_document->setFilename($filename); + + $res = $new_document->update(); + + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res ); + } + + DBUtil::commit(); + + /* + // FIXME do we need to refactor all trigger usage into the util function? + $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); + $aTriggers = $oKTTriggerRegistry->getTriggers('copyDocument', 'postValidate'); + foreach ($aTriggers as $aTrigger) { + $sTrigger = $aTrigger[0]; + $oTrigger = new $sTrigger; + $aInfo = array( + 'document' => $new_document, + 'old_folder' => $this->ktapi_folder->get_folder(), + 'new_folder' => $target_folder, + ); + $oTrigger->setInfo($aInfo); + $ret = $oTrigger->postValidate(); + } + */ + + return KTAPI_Document::get($this->ktapi, $new_document->getId()); + } + + /** + * Moves the document from one folder to another. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $newFolder = $this->root->add_folder("New folder"); + * $document->move($newFolder, 'Reason for moving the document'); + * + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Folder $ktapi_target_folder The folder object where the document is being moved into + * @param string $reason The reason for the move + * @param string $newname Optional. The title of the document to be used in the case of a name clash + * @param string $newfilename Optional. The filename of the document to be used in the case of a name clash + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function move(&$ktapi_target_folder, $reason, $newname=null, $newfilename=null) + { + assert(!is_null($ktapi_target_folder)); + assert($ktapi_target_folder instanceof KTAPI_Folder); // is_a($ktapi_target_folder,'KTAPI_Folder')); + + if (empty($newname)) + { + $newname=null; + } + if (empty($newfilename)) + { + $newfilename=null; + } + + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_DOCUMENT_MOVE); + + if (PEAR::isError($user)) + { + return $user; + } + + if ($this->document->getIsCheckedOut()) + { + return new PEAR_Error(KTAPI_ERROR_DOCUMENT_CHECKED_OUT); + } + + $target_folder = $ktapi_target_folder->get_folder(); + + $result= $this->can_user_access_object_requiring_permission( $target_folder, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($result)) + { + return $result; + } + + if (!KTDocumentUtil::canBeMoved($this->document, $error)) + { + if (PEAR::isError($error)) + { + return $error; + } + else + { + return new PEAR_Error('Document cannot be moved.'); + } + } + + $name = $this->document->getName(); + $clash = KTDocumentUtil::nameExists($target_folder, $name); + if ($clash && !is_null($newname)) + { + $name = $newname; + $clash = KTDocumentUtil::nameExists($target_folder, $name); + } + if ($clash) + { + return new PEAR_Error('A document with this title already exists in your chosen folder. ' + . 'Please choose a different folder, or specify a new title for the moved document.'); + } + + $filename=$this->document->getFilename(); + $clash = KTDocumentUtil::fileExists($target_folder, $filename); + + if ($clash && !is_null($newname)) + { + $filename = $newfilename; + $clash = KTDocumentUtil::fileExists($target_folder, $filename); + } + if ($clash) + { + return new PEAR_Error('A document with this filename already exists in your chosen folder. ' + . 'Please choose a different folder, or specify a new filename for the moved document.'); + } + + DBUtil::startTransaction(); + + $res = KTDocumentUtil::move($this->document, $target_folder, $user, $reason); + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res ); + } + + $this->document->setName($name); + $this->document->setFilename($filename); + + $res = $this->document->update(); + + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res ); + } + + DBUtil::commit(); + } + + /** + * Changes the filename of the document. + * If the filename contains any invalid characters they are replaced with a dash (-). For example: ?, *, %, \, / + * + * @author KnowledgeTree Team + * @access public + * @param string $newname The new filename + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function renameFile($newname) + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($user)) + { + return $user; + } + $newname = KTUtil::replaceInvalidCharacters($newname); + + DBUtil::startTransaction(); + $res = KTDocumentUtil::rename($this->document, $newname, $user); + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res ); + } + DBUtil::commit(); + } + + /** + * Changes the document type of the document. + * + * @author KnowledgeTree Team + * @access public + * @param string $documenttype The new document type + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function change_document_type($documenttype) + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($user)) + { + return $user; + } + + $doctypeid = KTAPI::get_documenttypeid($documenttype); + if (PEAR::isError($doctypeid)) + { + return $doctypeid; + } + + if ($this->document->getDocumentTypeId() != $doctypeid) + { + // Get the current document type, fieldsets and metadata + $iOldDocTypeID = $this->document->getDocumentTypeID(); + $fieldsets = KTMetadataUtil::fieldsetsForDocument($this->document, $iOldDocTypeID); + $mdlist = DocumentFieldLink::getByDocument($this->document); + + $field_values = array(); + foreach ($mdlist as $oFieldLink) { + $field_values[$oFieldLink->getDocumentFieldID()] = $oFieldLink->getValue(); + } + + DBUtil::startTransaction(); + $this->document->startNewMetadataVersion($user); + $this->document->setDocumentTypeId($doctypeid); + $res = $this->document->update(); + + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res ); + } + + + // Ensure all values for fieldsets common to both document types are retained + $fs_ids = array(); + + $doctype_fieldsets = KTFieldSet::getForDocumentType($doctypeid); + foreach($doctype_fieldsets as $fieldset) + { + $fs_ids[] = $fieldset->getId(); + } + + $MDPack = array(); + foreach ($fieldsets as $oFieldset) + { + if ($oFieldset->getIsGeneric() || in_array($oFieldset->getId(), $fs_ids)) + { + $fields = $oFieldset->getFields(); + + foreach ($fields as $oField) + { + $val = isset($field_values[$oField->getId()]) ? $field_values[$oField->getId()] : ''; + + if (!empty($val)) + { + $MDPack[] = array($oField, $val); + } + } + } + } + + $core_res = KTDocumentUtil::saveMetadata($this->document, $MDPack, array('novalidate' => true)); + + if (PEAR::isError($core_res)) { + DBUtil::rollback(); + return $core_res; + } + + + + $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); + $aTriggers = $oKTTriggerRegistry->getTriggers('edit', 'postValidate'); + + foreach ($aTriggers as $aTrigger) + { + $sTrigger = $aTrigger[0]; + $oTrigger = new $sTrigger; + $aInfo = array( + "document" => $this->document, + "aOptions" => $packed, + ); + $oTrigger->setInfo($aInfo); + $ret = $oTrigger->postValidate(); + } + + DBUtil::commit(); + + } + } + + /** + * Changes the title of the document. + * If the title contains any invalid characters they are replaced with a dash (-). For example: ?, *, %, \, / + * + * @author KnowledgeTree Team + * @access public + * @param string $newname The new document title + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function rename($newname) + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($user)) + { + return $user; + } + $newname = KTUtil::replaceInvalidCharacters($newname); + + if ($this->document->getName() != $newname) + { + + DBUtil::startTransaction(); + $this->document->setName($newname); + $res = $this->document->update(); + + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res); + } + DBUtil::commit(); + } + } + + /** + * Sets the status of the document to 'archived'. + * + * @author KnowledgeTree Team + * @access public + * @param string $reason The reason for archiving the document + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function archive($reason) + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($user)) + { + return $user; + } + + DBUtil::startTransaction(); + $res = KTDocumentUtil::archive($this->document, $reason); + + if(PEAR::isError($res)){ + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res); + } + DBUtil::commit(); + + /* + list($permission, $user) = $perm_and_user; + + DBUtil::startTransaction(); + $this->document->setStatusID(ARCHIVED); + $res = $this->document->update(); + if (($res === false) || PEAR::isError($res)) { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res); + } + + $oDocumentTransaction = new DocumentTransaction($this->document, sprintf(_kt('Document archived: %s'), $reason), 'ktcore.transactions.update'); + $oDocumentTransaction->create(); + + DBUtil::commit(); + + $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); + $aTriggers = $oKTTriggerRegistry->getTriggers('archive', 'postValidate'); + foreach ($aTriggers as $aTrigger) + { + $sTrigger = $aTrigger[0]; + $oTrigger = new $sTrigger; + $aInfo = array( + 'document' => $this->document, + ); + $oTrigger->setInfo($aInfo); + $ret = $oTrigger->postValidate(); + } + */ + } + + /** + * Starts a workflow on a document. + * + * @author KnowledgeTree Team + * @access public + * @param string $workflow The workflow being applied + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function start_workflow($workflow) + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_WORKFLOW); + + if (PEAR::isError($user)) + { + return $user; + } + + $workflowid = $this->document->getWorkflowId(); + + if (!empty($workflowid)) + { + return new PEAR_Error('A workflow is already defined.'); + } + + $workflow = KTWorkflow::getByName($workflow); + if (is_null($workflow) || PEAR::isError($workflow)) + { + return new KTAPI_Error(KTAPI_ERROR_WORKFLOW_INVALID, $workflow); + } + + DBUtil::startTransaction(); + $result = KTWorkflowUtil::startWorkflowOnDocument($workflow, $this->document); + if (is_null($result) || PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_WORKFLOW_INVALID, $result); + } + DBUtil::commit(); + } + + /** + * This deletes the workflow on the document. + * + * @author KnowledgeTree Team + * @access public + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function delete_workflow() + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_WORKFLOW); + + if (PEAR::isError($user)) + { + return $user; + } + + $workflowid=$this->document->getWorkflowId(); + if (empty($workflowid)) + { + return new PEAR_Error(KTAPI_ERROR_WORKFLOW_NOT_IN_PROGRESS); + } + + DBUtil::startTransaction(); + $result = KTWorkflowUtil::startWorkflowOnDocument(null, $this->document); + if (is_null($result) || PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_WORKFLOW_INVALID,$result); + } + DBUtil::commit(); + } + + /** + * This performs a transition to a new state of the workflow on the document + * + * @author KnowledgeTree Team + * @access public + * @param string $transition The transition to perform + * @param string $reason The reason for transitioning the document to a new state + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function perform_workflow_transition($transition, $reason) + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_WORKFLOW); + + if (PEAR::isError($user)) + { + return $user; + } + + $workflowid=$this->document->getWorkflowId(); + if (empty($workflowid)) + { + return new PEAR_Error(KTAPI_ERROR_WORKFLOW_NOT_IN_PROGRESS); + } + + $transition = &KTWorkflowTransition::getByName($transition); + if (is_null($transition) || PEAR::isError($transition)) + { + return new KTAPI_Error(KTAPI_ERROR_WORKFLOW_INVALID, $transition); + } + + DBUtil::startTransaction(); + $result = KTWorkflowUtil::performTransitionOnDocument($transition, $this->document, $user, $reason); + if (is_null($result) || PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_WORKFLOW_INVALID, $transition); + } + DBUtil::commit(); + } + + /** + * This returns all metadata for the document. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $metadata = $document->get_metadata(); + * foreach($metadata as $fieldset){ + * echo '

Fieldset: '.$fieldset['fieldset']; + * + * foreach($fieldset['fields'] as $field){ + * echo '
Field name: '.$field['name'] . ' Value: '. $field['value']; + * } + * } + *
+ * + * @author KnowledgeTree Team + * @access public + * @return array An array of metadata fieldsets and fields + */ + function get_metadata() + { + $doctypeid = $this->document->getDocumentTypeID(); + $fieldsets = (array) KTMetadataUtil::fieldsetsForDocument($this->document, $doctypeid); + if (is_null($fieldsets) || PEAR::isError($fieldsets)) + { + return array(); + } + + $results = array(); + + foreach ($fieldsets as $fieldset) + { + if ($fieldset->getIsConditional()) { /* this is not implemented...*/ continue; } + + $fields = $fieldset->getFields(); + $result = array('fieldset' => $fieldset->getName(), + 'description' => $fieldset->getDescription()); + + $fieldsresult = array(); + + foreach ($fields as $field) + { + $value = ''; + + $fieldvalue = DocumentFieldLink::getByDocumentAndField($this->document, $field); + if (!is_null($fieldvalue) && (!PEAR::isError($fieldvalue))) + { + $value = $fieldvalue->getValue(); + } + + // Old + //$controltype = 'string'; + // Replace with true + $controltype = strtolower($field->getDataType()); + + if ($field->getHasLookup()) + { + $controltype = 'lookup'; + if ($field->getHasLookupTree()) + { + $controltype = 'tree'; + } + } + + // Options - Required for Custom Properties + $options = array(); + + if ($field->getInetLookupType() == 'multiwithcheckboxes' || $field->getInetLookupType() == 'multiwithlist') { + $controltype = 'multiselect'; + } + + switch ($controltype) + { + case 'lookup': + $selection = KTAPI::get_metadata_lookup($field->getId()); + break; + case 'tree': + $selection = KTAPI::get_metadata_tree($field->getId()); + break; + case 'large text': + $options = array( + 'ishtml' => $field->getIsHTML(), + 'maxlength' => $field->getMaxLength() + ); + $selection= array(); + break; + case 'multiselect': + $selection = KTAPI::get_metadata_lookup($field->getId()); + $options = array( + 'type' => $field->getInetLookupType() + ); + break; + default: + $selection= array(); + } + + + $fieldsresult[] = array( + 'name' => $field->getName(), + 'required' => $field->getIsMandatory(), + 'value' => $value == '' ? 'n/a' : $value, + 'blankvalue' => $value=='' ? '1' : '0', + 'description' => $field->getDescription(), + 'control_type' => $controltype, + 'selection' => $selection, + 'options' => $options, + + ); + + } + $result['fields'] = $fieldsresult; + $results [] = $result; + } + + return $results; + } + + /** + * Gets a simple array of document metadata fields + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $metadata = $document->get_packed_metadata(); + * foreach($metadata as $field){ + * echo '

Fieldset: ' . $field[0]->getParentFieldset(); + * echo '
Field name: ' .$field[0]->getName(); + * echo ' Value: ' . $field[1]; + * } + *
+ * + * @author KnowledgeTree Team + * @access public + * @param array $metadata The full metadata fieldsets and fields + * @return array An array of metadata field object and value pairs + */ + function get_packed_metadata($metadata=null) + { + global $default; + + if (is_null($metadata)) + { + $metadata = $this->get_metadata(); + } + + $packed = array(); + + foreach($metadata as $fieldset_metadata) + { + if (is_array($fieldset_metadata)) + { + $fieldsetname=$fieldset_metadata['fieldset']; + $fields=$fieldset_metadata['fields']; + } + elseif ($fieldset_metadata instanceof stdClass) //is_a($fieldset_metadata, 'stdClass')) + { + $fieldsetname=$fieldset_metadata->fieldset; + $fields=$fieldset_metadata->fields; + } + else + { + $default->log->debug("unexpected fieldset type"); + continue; + } + + $fieldset = KTFieldset::getByName($fieldsetname); + if (is_null($fieldset) || PEAR::isError($fieldset) || $fieldset instanceof KTEntityNoObjects) //is_a($fieldset, 'KTEntityNoObjects')) + { + $default->log->debug("could not resolve fieldset: $fieldsetname for document id: $this->documentid"); + // exit graciously + continue; + } + + foreach($fields as $fieldinfo) + { + if (is_array($fieldinfo)) + { + $fieldname = $fieldinfo['name']; + $value = $fieldinfo['value']; + } + elseif ($fieldinfo instanceof stdClass) // is_a($fieldinfo, 'stdClass')) + { + $fieldname = $fieldinfo->name; + $value = $fieldinfo->value; + } + else + { + $default->log->debug("unexpected fieldinfo type"); + continue; + } + + $field = DocumentField::getByFieldsetAndName($fieldset, $fieldname); + if (is_null($field) || PEAR::isError($field) || is_a($field, 'KTEntityNoObjects')) + { + $default->log->debug("Could not resolve field: $fieldname on fieldset $fieldsetname for document id: $this->documentid"); + // exit graciously + continue; + } + + $packed[] = array($field, $value); + } + } + + return $packed; + } + + /** + * This updates the metadata on the document. This includes the 'title'. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $metadata = $document->get_metadata(); + * foreach($metadata as $key => $fieldset){ + * if($fieldset['fieldset'] == 'XYZ'){ + * + * foreach($fieldset['fields'] as $k => $field){ + * if($field['name'] == 'ABC'){ + * $metadata[$key][fields][$k]['value'] = 'new value'; + * } + * } + * } + * } + * + * $res = $document->update_metadata($metadata); + * + * + * @author KnowledgeTree Team + * @access public + * @param array This is an array containing the metadata to be associated with the document. + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function update_metadata($metadata) + { + global $default; + if (empty($metadata)) + { + return; + } + + $packed = $this->get_packed_metadata($metadata); + + DBUtil::startTransaction(); + + $user = $this->ktapi->get_user(); + $this->document->setLastModifiedDate(getCurrentDateTime()); + $this->document->setModifiedUserId($user->getId()); + + // Update the content version / document version + if($default->updateContentVersion){ + $this->document->startNewContentVersion($user); + $this->document->setMinorVersionNumber($this->document->getMinorVersionNumber()+1); + }else { + $this->document->startNewMetadataVersion($user); + } + + $res = $this->document->update(); + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error('Unexpected failure updating document', $res); + } + + $result = KTDocumentUtil::saveMetadata($this->document, $packed, array('novalidate'=>true)); + + if (is_null($result)) + { + DBUtil::rollback(); + return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR . ': Null result returned but not expected.'); + } + if (PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error('Unexpected validation failure', $result); + } + DBUtil::commit(); + + + $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); + $aTriggers = $oKTTriggerRegistry->getTriggers('edit', 'postValidate'); + + foreach ($aTriggers as $aTrigger) { + $sTrigger = $aTrigger[0]; + $oTrigger = new $sTrigger; + $aInfo = array( + "document" => $this->document, + "aOptions" => $packed, + ); + $oTrigger->setInfo($aInfo); + $ret = $oTrigger->postValidate(); + } + + } + + /** + * This updates the system metadata on the document. + * + * @author KnowledgeTree Team + * @access public + * @param array $sysdata The system metadata to be applied + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function update_sysdata($sysdata) + { + global $default; + if (empty($sysdata)) + { + return; + } + $owner_mapping = array( + 'created_by'=>'creator_id', + 'modified_by'=>'modified_user_id', + 'owner'=>'owner_id' + ); + + $documents = array(); + $document_content = array(); + $indexContent = null; + $uniqueOemNo = false; + + foreach($sysdata as $rec) + { + if (is_object($rec)) + { + $name = $rec->name; + $value = sanitizeForSQL($rec->value); + } + elseif(is_array($rec)) + { + $name = $rec['name']; + $value = sanitizeForSQL($rec['value']); + } + else + { + // just ignore + continue; + } + switch(strtolower($name)) + { + case 'unique_oem_document_no': + $documents['oem_no'] = $value; + $uniqueOemNo = true; + break; + case 'oem_document_no': + $documents['oem_no'] = $value; + break; + case 'index_content': + $indexContent = $value; + break; + case 'created_date': + if (!empty($value)) $documents['created'] = $value; + break; + case 'modified_date': + if (!empty($value)) $documents['modified'] = $value; + break; + case 'is_immutable': + $documents['immutable'] = in_array(strtolower($value), array('1','true','on','yes'))?'1':'0'; + break; + case 'filename': + $value = KTUtil::replaceInvalidCharacters($value); + $document_content['filename'] = $value; + break; + case 'major_version': + $document_content['major_version'] = $value; + break; + case 'minor_version': + $document_content['minor_version'] = $value; + break; + case 'version': + list($major_version, $minor_version) = explode('.', $value); + $document_content['major_version'] = $major_version; + $document_content['minor_version'] = $minor_version; + break; + case 'mime_type': + $sql = "select id from mime_types where mimetypes='$value'"; + $value = DBUtil::getResultArray($sql); + if (PEAR::isError($value)) + { + $default->log->error("Problem resolving mime type '$value' for document id $this->documentid. Reason: " . $value->getMessage()); + return $value; + } + if (count($value) == 0) + { + $default->log->error("Problem resolving mime type '$value' for document id $this->documentid. None found."); + break; + } + $value = $value[0]['id']; + $document_content['mime_id'] = $value; + break; + case 'owner': + case 'created_by': + case 'modified_by': + $sql = "select id from users where name='$value'"; + $userId = DBUtil::getResultArray($sql); + if (PEAR::isError($userId)) + { + $default->log->error("Problem resolving user '$value' for document id $this->documentid. Reason: " . $userId->getMessage()); + return $userId; + } + if (empty($userId)) + { + $sql = "select id from users where username='$value'"; + $userId = DBUtil::getResultArray($sql); + if (PEAR::isError($userId)) + { + $default->log->error("Problem resolving username '$value' for document id $this->documentid. Reason: " . $userId->getMessage()); + return $userId; + } + } + if (empty($userId)) + { + $default->log->error("Problem resolving user based on '$value' for document id $this->documentid. No user found"); + // if not found, not much we can do + break; + } + $userId=$userId[0]; + $userId=$userId['id']; + + $name = $owner_mapping[$name]; + $documents[$name] = $userId; + break; + default: + $default->log->error("Problem updating field '$name' with value '$value' for document id $this->documentid. Field is unknown."); + // TODO: we should do some logging + //return new PEAR_Error('Unexpected field: ' . $name); + } + } + + if (count($documents) > 0) + { + $sql = "UPDATE documents SET "; + $i=0; + foreach($documents as $name=>$value) + { + if ($i++ > 0) $sql .= ","; + $value = sanitizeForSQL($value); + $sql .= "$name='$value'"; + } + $sql .= " WHERE id=$this->documentid"; + $result = DBUtil::runQuery($sql); + if (PEAR::isError($result)) + { + return $result; + } + + if ($uniqueOemNo) + { + $oem_no = sanitizeForSQL($documents['oem_no']); + $sql = "UPDATE documents SET oem_no=null WHERE oem_no = '$oem_no' AND id != $this->documentid"; + $result = DBUtil::runQuery($sql); + } + + } + if (count($document_content) > 0) + { + $content_id = $this->document->getContentVersionId(); + $sql = "UPDATE document_content_version SET "; + $i=0; + foreach($document_content as $name=>$value) + { + if ($i++ > 0) $sql .= ","; + $value = sanitizeForSQL($value); + $sql .= "$name='$value'"; + } + $sql .= " WHERE id=$content_id"; + $result = DBUtil::runQuery($sql); + if (PEAR::isError($result)) + { + return $result; + } + } + if (!is_null($indexContent)) + { + $indexer = Indexer::get(); + $result = $indexer->diagnose(); + if (empty($result)) + { + $indexer->updateDocumentIndex($this->documentid, $indexContent); + } + else + { + $default->log->error("Problem updating index with value '$value' for document id $this->documentid. Problem with indexer."); + } + } + } + + /** + * Clears the cached data on the document and refreshes the document object. + * + * @author KnowledgeTree Team + * @access public + */ + function clearCache() + { + // TODO: we should only clear the cache for the document we are working on + // this is a quick fix but not optimal!! + + + $metadataid = $this->document->getMetadataVersionId(); + $contentid = $this->document->getContentVersionId(); + + $cache = KTCache::getSingleton(); + + $cache->remove('KTDocumentMetadataVersion/id', $metadataid); + $cache->remove('KTDocumentContentVersion/id', $contentid); + $cache->remove('KTDocumentCore/id', $this->documentid); + $cache->remove('Document/id', $this->documentid); + unset($GLOBALS['_OBJECTCACHE']['KTDocumentMetadataVersion'][$metadataid]); + unset($GLOBALS['_OBJECTCACHE']['KTDocumentContentVersion'][$contentid]); + unset($GLOBALS['_OBJECTCACHE']['KTDocumentCore'][$this->documentid]); + + $this->document = &Document::get($this->documentid); + } + + /** + * Merge new metadata with previous metadata version + * + * @author KnowledgeTree Team + * @access public + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function mergeWithLastMetadataVersion() + { + // keep latest metadata version + $metadata_version = $this->document->getMetadataVersion(); + if ($metadata_version == 0) + { + // this could theoretically happen in the case we are updating metadata and sysdata, but no metadata fields are specified. + return; + } + + $metadata_id = $this->document->getMetadataVersionId(); + + // get previous version + $sql = "SELECT id, metadata_version FROM document_metadata_version WHERE id<$metadata_id AND document_id=$this->documentid order by id desc"; + $old = DBUtil::getResultArray($sql); + if (is_null($old) || PEAR::isError($old)) + { + return new PEAR_Error('Previous version could not be resolved'); + } + // only interested in the first one + $old=$old[0]; + $old_metadata_id = $old['id']; + $old_metadata_version = $old['metadata_version']; + + DBUtil::startTransaction(); + + // delete previous metadata version + + $sql = "DELETE FROM document_metadata_version WHERE id=$old_metadata_id"; + $rs = DBUtil::runQuery($sql); + if (PEAR::isError($rs)) + { + DBUtil::rollback(); + return $rs; + } + + // make latest equal to previous + $sql = "UPDATE document_metadata_version SET metadata_version=$old_metadata_version WHERE id=$metadata_id"; + $rs = DBUtil::runQuery($sql); + if (PEAR::isError($rs)) + { + DBUtil::rollback(); + return $rs; + } + $sql = "UPDATE documents SET metadata_version=$old_metadata_version WHERE id=$this->documentid"; + $rs = DBUtil::runQuery($sql); + if (PEAR::isError($rs)) + { + DBUtil::rollback(); + return $rs; + } + DBUtil::commit(); + + $this->clearCache(); + } + + /** + * This returns the workflow transitions available for the user on the document + * + * @author KnowledgeTree Team + * @access public + * @return array|PEAR_Error Array of the workflow transitions | a PEAR_Error on failure + */ + function get_workflow_transitions() + { + $user = $this->can_user_access_object_requiring_permission( $this->document, KTAPI_PERMISSION_WORKFLOW); + + if (PEAR::isError($user)) + { + return $user; + } + + $workflowid=$this->document->getWorkflowId(); + if (empty($workflowid)) + { + return array(); + } + + $result = array(); + + $transitions = KTWorkflowUtil::getTransitionsForDocumentUser($this->document, $user); + if (is_null($transitions) || PEAR::isError($transitions)) + { + return new KTAPI_Error(KTAPI_ERROR_WORKFLOW_INVALID, $transitions); + } + foreach($transitions as $transition) + { + $result[] = $transition->getName(); + } + + return $result; + } + + /** + * This returns the current workflow state + * + * @author KnowledgeTree Team + * @access public + * @return string Returns the name of the state | a PEAR_Error on failure + */ + function get_workflow_state() + { + $user = $this->can_user_access_object_requiring_permission($this->document, KTAPI_PERMISSION_WORKFLOW); + + if (PEAR::isError($user)) + { + return $user; + } + + $workflowid=$this->document->getWorkflowId(); + if (empty($workflowid)) + { + return new PEAR_Error(KTAPI_ERROR_WORKFLOW_NOT_IN_PROGRESS); + } + + $result = array(); + + $state = KTWorkflowUtil::getWorkflowStateForDocument($this->document); + if (is_null($state) || PEAR::isError($state)) + { + return new PEAR_Error(KTAPI_ERROR_WORKFLOW_INVALID); + } + + $statename = $state->getName(); + + return $statename; + + } + + /** + * Get the available permissions on the document. + * R = read, W = write, E = edit - if the document is checked out by the user. + * The method assumes read permissions is available. + * + * @author KnowledgeTree Team + * @access public + * @param Document $document The internal document object + * @return string The available permissions + */ + function get_permission_string($document) + { + $perms = 'R'; + if (Permission::userHasDocumentWritePermission($document)) + { + $perms .= 'W'; + + $user_id = $_SESSION['userID']; + $co_user_id = $document->getCheckedOutUserID(); + + if (!empty($co_user_id) && ($user_id == $co_user_id)) + { + $perms .= 'E'; + } + } + return $perms; + } + + /** + * This returns detailed information on the document. + * + * @author KnowledgeTree Team + * @access public + * @return array The document information + */ + function get_detail() + { + global $default; + // make sure we ge tthe latest + $this->clearCache(); + + $config = KTConfig::getSingleton(); + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION); + + $detail = array(); + $document = $this->document; + + // get the document id + $detail['document_id'] = (int) $document->getId(); + + $oem_document_no = null; + if ($wsversion >= 2) + { + $oem_document_no = $document->getOemNo(); + } + if (empty($oem_document_no)) + { + $oem_document_no = 'n/a'; + } + + $detail['custom_document_no'] = 'n/a'; + $detail['oem_document_no'] = $oem_document_no; + + // get the title + $detail['title'] = $document->getName(); + + // get the document type + $documenttypeid=$document->getDocumentTypeID(); + $documenttype = '* unknown *'; + if (is_numeric($documenttypeid)) + { + $dt = DocumentType::get($documenttypeid); + + if (!is_null($dt) && !PEAR::isError($dt)) + { + $documenttype=$dt->getName(); + } + } + $detail['document_type'] = $documenttype; + + // get the filename + $detail['filename'] = $document->getFilename(); + + // get the filesize + $detail['filesize'] = (int) $document->getFileSize(); + + // get the folder id + $detail['folder_id'] = (int) $document->getFolderID(); + + // get the creator + $userid = $document->getCreatorID(); + $username='n/a'; + if (is_numeric($userid)) + { + $username = '* unknown *'; + $user = User::get($userid); + if (!is_null($user) && !PEAR::isError($user)) + { + $username = $user->getName(); + } + } + $detail['created_by'] = $username; + + // get the creation date + $detail['created_date'] = $document->getCreatedDateTime(); + + // get the checked out user + $userid = $document->getCheckedOutUserID(); + $username='n/a'; + if (is_numeric($userid)) + { + $username = '* unknown *'; + $user = User::get($userid); + if (!is_null($user) && !PEAR::isError($user)) + { + $username = $user->getName(); + } + } + $detail['checked_out_by'] = $username; + + // get the checked out date + list($major, $minor, $fix) = explode('.', $default->systemVersion); + if ($major == 3 && $minor >= 5) + { + $detail['checked_out_date'] = $document->getCheckedOutDate(); + } + else + { + $detail['checked_out_date'] = $detail['modified_date']; + } + if (is_null($detail['checked_out_date'])) $detail['checked_out_date'] = 'n/a'; + + // get the modified user + $userid = $document->getModifiedUserId(); + $username='n/a'; + if (is_numeric($userid)) + { + $username = '* unknown *'; + $user = User::get($userid); + if (!is_null($user) && !PEAR::isError($user)) + { + $username = $user->getName(); + } + } + $detail['modified_by'] = $detail['updated_by'] = $username; + + // get the modified date + $detail['updated_date'] = $detail['modified_date'] = $document->getLastModifiedDate(); + + // get the owner + $userid = $document->getOwnerID(); + $username='n/a'; + if (is_numeric($userid)) + { + $username = '* unknown *'; + $user = User::get($userid); + if (!is_null($user) && !PEAR::isError($user)) + { + $username = $user->getName(); + } + } + $detail['owned_by'] = $username; + + // get the version + $detail['version'] = $document->getVersion(); + if ($wsversion >= 2) + { + $detail['version'] = (float) $detail['version']; + } + //get the content_id + $detail['content_id'] = $document->getContentVersionId(); + + //might be unset at the bottom in case of old webservice version + //make sure we're using the real document for this one + $this->document->switchToRealCore(); + $detail['linked_document_id'] = $document->getLinkedDocumentId(); + $this->document->switchToLinkedCore(); + + // check immutability + $detail['is_immutable'] = (bool) $document->getImmutable(); + + // check permissions + $detail['permissions'] = KTAPI_Document::get_permission_string($document); + + // get workflow name + $workflowid = $document->getWorkflowId(); + $workflowname='n/a'; + if (is_numeric($workflowid)) + { + $workflow = KTWorkflow::get($workflowid); + if (!is_null($workflow) && !PEAR::isError($workflow)) + { + $workflowname = $workflow->getName(); + } + } + $detail['workflow'] = $workflowname; + + // get the workflow state + $stateid = $document->getWorkflowStateId(); + $workflowstate = 'n/a'; + if (is_numeric($stateid)) + { + $state = KTWorkflowState::get($stateid); + if (!is_null($state) && !PEAR::isError($state)) + { + $workflowstate = $state->getName(); + } + } + $detail['workflow_state']=$workflowstate; + + // get the full path + $detail['full_path'] = '/' . $this->document->getFullPath(); + + // get mime info + $mimetypeid = $document->getMimeTypeID(); + $detail['mime_type'] =KTMime::getMimeTypeName($mimetypeid); + $detail['mime_icon_path'] =KTMime::getIconPath($mimetypeid); + $detail['mime_display'] =KTMime::getFriendlyNameForString($detail['mime_type']); + + // get the storage path + $detail['storage_path'] = $document->getStoragePath(); + + if ($wsversion >= 2) + { + unset($detail['updated_by']); + unset($detail['updated_date']); + } + if($wsversion < 3){ + unset($detail['linked_document_id']); + } + + return $detail; + } + + /** + * Gets the title of the document + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * $title = $document->get_title(); + * + * + * @author KnowledgeTree Team + * @access public + * @return string The document title + */ + function get_title() + { + return $this->document->getDescription(); + } + + /** + * Gets the url which can be used to download the document. + * + * @param int $version Not implemented. The content version of the document + */ + function get_download_url($version = null) + { + $session = $this->ktapi->get_session(); + + // Create the url that can be used to download the document + $download_manager = new KTDownloadManager(); + $download_manager->set_session($session->session); + $download_manager->cleanup(); + $url = $download_manager->allow_download($this); + + // Log the transaction + $this->download(); + + return $url; + } + + /** + * Logs the document transaction for a download. + * + * @author KnowledgeTree Team + * @access public + */ + function download() + { + $storage =& KTStorageManagerUtil::getSingleton(); + $options = array(); + + $oDocumentTransaction = new DocumentTransaction($this->document, 'Document downloaded', 'ktcore.transactions.download', $aOptions); + $oDocumentTransaction->create(); + } + + /** + * Function to fetch the actual file content of a document + * + * @return $content the document file content + */ + function get_document_content() + { + // fetch the content + $content = KTDocumentUtil::getDocumentContent($this->document); + + // TODO what if the file could not be found? + + // Log the transaction + $this->download(); + + // return the document content + return $content; + } + + /** + * This returns the transaction history for the document. + * + * @author KnowledgeTree Team + * @access public + * @return array The list of transactions | a PEAR_Error on failure + */ + function get_transaction_history() + { + $sQuery = 'SELECT DTT.name AS transaction_name, U.name AS username, DT.version AS version, DT.comment AS comment, DT.datetime AS datetime ' . + 'FROM ' . KTUtil::getTableName('document_transactions') . ' AS DT INNER JOIN ' . KTUtil::getTableName('users') . ' AS U ON DT.user_id = U.id ' . + 'INNER JOIN ' . KTUtil::getTableName('transaction_types') . ' AS DTT ON DTT.namespace = DT.transaction_namespace ' . + 'WHERE DT.document_id = ? ORDER BY DT.datetime DESC'; + $aParams = array($this->documentid); + + $transactions = DBUtil::getResultArray(array($sQuery, $aParams)); + if (is_null($transactions) || PEAR::isError($transactions)) + { + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $transactions ); + } + + $config = KTConfig::getSingleton(); + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION); + foreach($transactions as $key=>$transaction) + { + $transactions[$key]['version'] = (float) $transaction['version']; + } + + return $transactions; + } + + /** + * This returns the version history on the document. + * + * @author KnowledgeTree Team + * @access public + * @return array The version history + */ + function get_version_history() + { + $metadata_versions = KTDocumentMetadataVersion::getByDocument($this->document); + + $config = KTConfig::getSingleton(); + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION); + + $versions = array(); + foreach ($metadata_versions as $version) + { + $document = &Document::get($this->documentid, $version->getId()); + + $version = array(); + + $userid = $document->getModifiedUserId(); + $user = User::get($userid); + $username = 'Unknown'; + if (!PEAR::isError($user)) + { + $username = is_null($user)?'n/a':$user->getName(); + } + + $version['user'] = $username; + $version['metadata_version'] = $document->getMetadataVersion(); + $version['content_version'] = $document->getVersion(); + if ($wsversion >= 2) + { + $version['metadata_version'] = (int) $version['metadata_version']; + $version['content_version'] = (float) $version['content_version']; + } + + $versions[] = $version; + } + return $versions; + } + + /** + * This expunges a document from the system. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * $document = $ktapi->get_document_by_id($documentid); + * if($document->is_deleted()){ + * $document->expunge(); + * } + * + * + * @author KnowledgeTree Team + * @access public + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function expunge() + { + if ($this->document->getStatusID() != 3) + { + return new PEAR_Error('You should not purge this'); + } + DBUtil::startTransaction(); + + $transaction = new DocumentTransaction($this->document, "Document expunged", 'ktcore.transactions.expunge'); + + $transaction->create(); + + $this->document->delete(); + + $this->document->cleanupDocumentData($this->documentid); + + $storage =& KTStorageManagerUtil::getSingleton(); + + $result= $storage->expunge($this->document); + + DBUtil::commit(); + } + + /** + * Restores a deleted document + * + * @author KnowledgeTree Team + * @access public + */ + function restore() + { + DBUtil::startTransaction(); + + $storage =& KTStorageManagerUtil::getSingleton(); + + $folder = Folder::get($this->document->getRestoreFolderId()); + if (PEAR::isError($folder)) + { + $this->document->setFolderId(1); + $folder = Folder::get(1); + } + else + { + $this->document->setFolderId($this->document->getRestoreFolderId()); + } + + $storage->restore($this->document); + + $this->document->setStatusId(LIVE); + $this->document->setPermissionObjectId($folder->getPermissionObjectId()); + $res = $this->document->update(); + + $res = KTPermissionUtil::updatePermissionLookup($this->document); + + $user = $this->ktapi->get_user(); + + $oTransaction = new DocumentTransaction($this->document, 'Restored from deleted state by ' . $user->getName(), 'ktcore.transactions.update'); + $oTransaction->create(); + + DBUtil::commit(); + } + + /** + * Returns the internal document object + * + * @author KnowledgeTree Team + * @access public + * @return Document The document object + */ + public function getObject() + { + return $this->document; + } + + /** + * Get the role allocation for the document + * + * @return KTAPI_RoleAllocation Instance of the role allocation object + */ + public function getRoleAllocation() + { + $allocation = KTAPI_RoleAllocation::getAllocation($this->ktapi, $this); + + return $allocation; + } + + /** + * Get the permission allocation for the document + * + * @return KTAPI_PermissionAllocation Instance of the permission allocation object + */ + public function getPermissionAllocation() + { + $allocation = KTAPI_PermissionAllocation::getAllocation($this->ktapi, $this); + + return $allocation; + } + + /** + * Checks if the user is subscribed to the document + * + * @author KnowledgeTree Team + * @access public + * @return bool $result TRUE if subscribed | FALSE if not + */ + public function isSubscribed() + { + $subscriptionType = SubscriptionEvent::subTypes('Document'); + $user = $this->ktapi->get_user(); + $document = $this->document; + + $result = Subscription::exists($user->getId(), $document->getId(), $subscriptionType); + return $result; + } + + /** + * Removes the users subscription to the document + * + * @author KnowledgeTree Team + * @access public + * @return boolean|object $result SUCCESS Boolean result of operation | FAILURE - a pear error object + */ + public function unsubscribe() + { + if (!$this->isSubscribed()) + { + return TRUE; + } + + $subscriptionType = SubscriptionEvent::subTypes('Document'); + $user = $this->ktapi->get_user(); + $document = $this->document; + + $subscription = & Subscription::getByIDs($user->getId(), $document->getId(), $subscriptionType); + $result = $subscription->delete(); + + if(PEAR::isError($result)){ + return $result->getMessage(); + } + if($result){ + return $result; + } + + return $_SESSION['errorMessage']; + } + + /** + * Subscribes the user to the document + * + * @author KnowledgeTree Team + * @access public + * @return boolean|object $result SUCCESS Boolean result of operation | FAILURE - a pear error object + */ + public function subscribe() + { + if ($this->isSubscribed()) + { + return TRUE; + } + + $subscriptionType = SubscriptionEvent::subTypes('Document'); + $user = $this->ktapi->get_user(); + $document = $this->document; + + $subscription = new Subscription($user->getId(), $document->getId(), $subscriptionType); + $result = $subscription->create(); + + if(PEAR::isError($result)){ + return $result->getMessage(); + } + if($result){ + return $result; + } + + return $_SESSION['errorMessage']; + } + + /** + * Checks if the document is immutable + * + * @author KnowledgeTree Team + * @access public + * @return bool TRUE if it is immutable | FALSE if not + */ + public function isImmutable() + { + return $this->document->getImmutable(); + } + + /** + * Sets a document to be immutable + * + * @author KnowledgeTree Team + * @access public + */ + public function immute() + { + if($this->is_checked_out()){ + return new PEAR_Error('Document is checked out and can\'t be set to immutable.'); + } + $this->document->setImmutable(true); + $this->document->update(); + } + + /** + * Removes the immutability of a document + * + * @author KnowledgeTree Team + * @access public + */ + public function unimmute() + { + $this->document->setImmutable(false); + $this->document->update(); + } + + /** + * Emails a document as an attachment or hyperlink to a list of users, groups or external email addresses. + * In the case of external addresses, if a hyperlink is used then a timed download link (via webservices) is sent + * allowing the recipient a window period in which to download the document. + * The period is set through the webservices config option webservice/downloadExpiry. Defaults to 30 minutes. + * + * @author KnowledgeTree Team + * @access public + * @param array $members The email recipients - KTPAI_Users, KTAPI_Groups or email addresses + * @param string $comment Content to be appended to the email + * @param bool $attachDocument TRUE if document is an attachment | FALSE if using a hyperlink to the document + * + * NOTE this function requires that the Email Plugin be active. + * It seems that it is possible for this to be unintentionally turned off during a plugin re-read. + */ + public function email($members, $comment, $attachDocument = true) + { + // check for active email plugin + if (!KTPluginUtil::pluginIsActive('ktstandard.email.plugin')) { + return new PEAR_Error('Email Plugin is not active'); + } + if (empty($members)) { + return new PEAR_Error('No recipients specified'); + } + + $userIds = array(); + $groupIds = array(); + $emailAddrs = array(); + + foreach($members as $member) + { + if ($member instanceof KTAPI_User) { + $userIds[] = $member->Id; + } + else if ($member instanceof KTAPI_Group) { + $groupIds[] = $member->Id; + } + else if (is_string($member)) { + $emailAddrs[] = $member; + } + } + + $config = KTConfig::getSingleton(); + $allowAttachment = $config->get('email/allowAttachment', false); + $allowEmailAddresses = $config->get('email/allowEmailAddresses', false); + + // if attachments aren't allowed, set $attachDocument to false + if(!$allowAttachment) { + $attachDocument = false; + } + + // If sending to external email addresses is not allowed - set array of external recipients to empty + if(!$allowEmailAddresses) { + $emailAddrs = array(); + } + + $emailErrors = array(); + $userEmails = array(); + $listEmails = array(); + + sendGroupEmails($groupIds, $userEmails, $emailErrors); + sendUserEmails($userIds, $userEmails, $emailErrors); + + if ($attachDocument) { + sendManualEmails($emailAddrs, $userEmails, $emailErrors); + } + else { + sendExternalEmails($emailAddrs, $this->documentid, $this->get_title(), $comment, $emailErrors); + } + + if(empty($userEmails)) { + return; + } + + $listEmails = array_keys($userEmails); + sendEmail($listEmails, $this->documentid, $this->get_title(), $comment, (boolean)$attachDocument, $emailErrors); + + } + + /** + * Get a list of Documents + * + * @param String Where clause (not required) + * @return Array array of Documents objects, false otherwise. + */ + static public function getList($whereClause = null) + { + return Document::getList($whereClause); + } +} + +?> diff --git a/ktapi/KTAPIFolder.inc.php b/ktapi/KTAPIFolder.inc.php new file mode 100644 index 0000000..b0e4fec --- /dev/null +++ b/ktapi/KTAPIFolder.inc.php @@ -0,0 +1,1596 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * + * @copyright 2008-2009, KnowledgeTree Inc. + * @license GNU General Public License version 3 + * @author KnowledgeTree Team + * @package KTAPI + * @version Version 0.9 +*/ + + +require_once(KT_DIR . '/ktwebservice/KTUploadManager.inc.php'); +require_once(KT_LIB_DIR . '/mime.inc.php'); + +/** + * This class handles folder related operations + * + * @author KnowledgeTree Team + * @package KTAPI + * @version Version 0.9 + * +*/ +class KTAPI_Folder extends KTAPI_FolderItem +{ + /** + * This is a reference to a base Folder object. + * + * @access private + * @var Folder + */ + var $folder; + + /** + * This is the id of the folder on the database. + * + * @access private + * @var int + */ + var $folderid; + + /** + * This is used to get a folder based on a folder id. + * @author KnowledgeTree Team + * @access private + * @param KTAPI $ktapi + * @param int $folderid + * @return KTAPI_Folder + */ + function get(&$ktapi, $folderid) + { + assert(!is_null($ktapi)); + assert(is_a($ktapi, 'KTAPI')); + assert(is_numeric($folderid)); + + $folderid += 0; + + $folder = &Folder::get($folderid); + if (is_null($folder) || PEAR::isError($folder)) + { + return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID,$folder); + } + + // A special case. We ignore permission checking on the root folder. + if ($folderid != 1) + { + $user = $ktapi->can_user_access_object_requiring_permission($folder, KTAPI_PERMISSION_READ); + + if (is_null($user) || PEAR::isError($user)) + { + $user = $ktapi->can_user_access_object_requiring_permission($folder, KTAPI_PERMISSION_VIEW_FOLDER); + if (is_null($user) || PEAR::isError($user)) + { + return $user; + } + } + } + + return new KTAPI_Folder($ktapi, $folder); + } + + /** + * Checks if the folder is a shortcut + * + * @author KnowledgeTree Team + * @access public + * @return boolean + */ + function is_shortcut() + { + return $this->folder->isSymbolicLink(); + } + + /** + * Retrieves the shortcuts linking to this folder + * + * @author KnowledgeTree Team + * @access public + * @return array + */ + function get_shortcuts() + { + return $this->folder->getSymbolicLinks(); + } + + /** + * This is the constructor for the KTAPI_Folder. + * + * @author KnowledgeTree Team + * @access private + * @param KTAPI $ktapi + * @param Folder $folder + * @return KTAPI_Folder + */ + function KTAPI_Folder(&$ktapi, &$folder) + { + $this->ktapi = &$ktapi; + $this->folder = &$folder; + $this->folderid = $folder->getId(); + } + + /** + * This returns a reference to the internal folder object. + * + * @author KnowledgeTree Team + * @access protected + * @return Folder + */ + function get_folder() + { + return $this->folder; + } + + /** + * This returns detailed information on the folder object. + * + * @author KnowledgeTree Team + * @access public + * @return array + */ + function get_detail() + { + $this->clearCache(); + + $config = KTConfig::getSingleton(); + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION); + + $detail = array( + 'id'=>(int) $this->folderid, + 'folder_name'=>$this->get_folder_name(), + 'parent_id'=>(int) $this->get_parent_folder_id(), + 'full_path'=>$this->get_full_path(), + 'linked_folder_id'=>$this->folder->getLinkedFolderId(), + 'permissions' => KTAPI_Folder::get_permission_string($this->folder), + ); + + if($wsversion<3){ + unset($detail['linked_folder_id']); + } + + $folder = $this->folder; + + // get the creator + $userid = $folder->getCreatorID(); + $username='n/a'; + if (is_numeric($userid)) + { + $username = '* unknown *'; + $user = User::get($userid); + if (!is_null($user) && !PEAR::isError($user)) + { + $username = $user->getName(); + } + } + $detail['created_by'] = $username; + + // get the creation date + $detail['created_date'] = $folder->getCreatedDateTime(); + + // get the modified user + $userid = $folder->getModifiedUserId(); + $username='n/a'; + if (is_numeric($userid)) + { + $username = '* unknown *'; + $user = User::get($userid); + if (!is_null($user) && !PEAR::isError($user)) + { + $username = $user->getName(); + } + } + $detail['modified_by'] = $detail['updated_by'] = $username; + + // get the modified date + $detail['updated_date'] = $detail['modified_date'] = $folder->getLastModifiedDate(); + + return $detail; + } + + /** + * This clears the global object cache of the folder class. + * + * @author KnowledgeTree Team + * @access public + * + */ + + function clearCache() + { + // TODO: we should only clear the cache for the document we are working on + // this is a quick fix but not optimal!! + + $GLOBALS["_OBJECTCACHE"]['Folder'] = array(); + + $this->folder = &Folder::get($this->folderid); + } + + /** + * + * + * @author KnowledgeTree Team + * @access public + * @return unknown + */ + function get_parent_folder_id() + { + return (int) $this->folder->getParentID(); + } + + /** + * + * @author KnowledgeTree Team + * @access public + * @return unknown + */ + function get_folder_name() + { + return $this->folder->getFolderName($this->folderid); + } + + + /** + * This returns the folderid. + * @author KnowledgeTree Team + * @access public + * @return int + */ + function get_folderid() + { + return (int) $this->folderid; + } + + /** + * This function will return a folder by it's name (not ID) + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI $ktapi + * @param string $foldername + * @param int $folderid + * @return KTAPI_Folder + */ + function _get_folder_by_name($ktapi, $foldername, $folderid) + { + $foldername=trim($foldername); + if (empty($foldername)) + { + return new PEAR_Error('A valid folder name must be specified.'); + } + + $split = explode('/', $foldername); + + foreach($split as $foldername) + { + if (empty($foldername)) + { + continue; + } + $foldername = KTUtil::replaceInvalidCharacters($foldername); + $foldername = sanitizeForSQL($foldername); + $sql = "SELECT id FROM folders WHERE + (name='$foldername' and parent_id=$folderid) OR + (name='$foldername' and parent_id is null and $folderid=1)"; + $row = DBUtil::getOneResult($sql); + if (is_null($row) || PEAR::isError($row)) + { + return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID,$row); + } + $folderid = $row['id']; + } + + return KTAPI_Folder::get($ktapi, $folderid); + } + + + /** + * This can resolve a folder relative to the current directy by name + * + * @author KnowledgeTree Team + * @access public + * @param string $foldername + * @return KTAPI_Folder + */ + function get_folder_by_name($foldername) + { + return KTAPI_Folder::_get_folder_by_name($this->ktapi, $foldername, $this->folderid); + } + + /** + * This will return the full path string of the current folder object + * + * @author KnowledgeTree Team + * @access public + * @return string + */ + function get_full_path() + { + $path = $this->folder->getFullPath(); + if (empty($path)) $path = '/'; + + return $path; + } + + /** + * This gets a document by filename or name. + * + * @author KnowledgeTree Team + * @access private + * @param string $documentname + * @param string $function + * @return KTAPI_Document + */ + function _get_document_by_name($documentname, $function='getByNameAndFolder') + { + $documentname=trim($documentname); + if (empty($documentname)) + { + return new PEAR_Error('A valid document name must be specified.'); + } + + $foldername = dirname($documentname); + $documentname = basename($documentname); + $documentname = KTUtil::replaceInvalidCharacters($documentname); + + $ktapi_folder = $this; + + if (!empty($foldername) && ($foldername != '.')) + { + $ktapi_folder = $this->get_folder_by_name($foldername); + } + + $currentFolderName = $this->get_folder_name(); + + if (PEAR::isError($ktapi_folder) && substr($foldername, 0, strlen($currentFolderName)) == $currentFolderName) + { + if ($currentFolderName == $foldername) + { + $ktapi_folder = $this; + } + else + { + $foldername = substr($foldername, strlen($currentFolderName)+1); + $ktapi_folder = $this->get_folder_by_name($foldername); + } + } + + if (is_null($ktapi_folder) || PEAR::isError($ktapi_folder)) + { + return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID, $ktapi_folder); + } + + //$folder = $ktapi_folder->get_folder(); + $folderid = $ktapi_folder->folderid; + + $document = Document::$function($documentname, $folderid); + if (is_null($document) || PEAR::isError($document)) + { + return new KTAPI_Error(KTAPI_ERROR_DOCUMENT_INVALID, $document); + } + + $user = $this->can_user_access_object_requiring_permission($document, KTAPI_PERMISSION_READ); + if (PEAR::isError($user)) + { + return $user; + } + + return new KTAPI_Document($this->ktapi, $ktapi_folder, $document); + } + + /** + * This can resolve a document relative to the current directy by name. + * @author KnowledgeTree Team + * @access public + * @param string $documentname + * @return KTAPI_Document + */ + function get_document_by_name($documentname) + { + return $this->_get_document_by_name($documentname,'getByNameAndFolder'); + } + + /** + * This can resolve a document relative to the current directy by filename . + * + * @author KnowledgeTree Team + * @access public + * @param string $documentname + * @return KTAPI_Document + */ + function get_document_by_filename($documentname) + { + return $this->_get_document_by_name($documentname,'getByFilenameAndFolder'); + } + + /** + * Gets a User class based on the user id + * + * @author KnowledgeTree Team + * @param int $userid + * @return User + */ + function _resolve_user($userid) + { + $user=null; + + if (!is_null($userid)) + { + $user=User::get($userid); + if (is_null($user) || PEAR::isError($user)) + { + $user=null; + } + } + return $user; + } + + /** + * Get's a permission string for a folder eg: 'RW' or 'RWA' + * + * @author KnowledgeTree Team + * @access public + * @param Folder $folder + * @return string + */ + function get_permission_string($folder) + { + $perms = ''; + if (Permission::userHasFolderReadPermission($folder)) + { + $perms .= 'R'; + } + if (Permission::userHasFolderWritePermission($folder)) + { + $perms .= 'W'; + } + if (Permission::userHasAddFolderPermission($folder)) + { + $perms .= 'A'; + } + + // root folder cannot be renamed or deleted. + if ($folder->iId != 1) { + if (Permission::userHasRenameFolderPermission($folder)) + { + $perms .= 'N'; + } + if (Permission::userHasDeleteFolderPermission($folder)) + { + $perms .= 'D'; + } + } + return $perms; + } + + /** + * Get's a folder listing, recursing to the given depth + * + * + * $root = $this->ktapi->get_root_folder(); + * $listing = $root->get_listing(); + * foreach($listing as $val) { + * if($val['item_type'] == 'F') { + * // It's a folder + * echo $val['title']; + * } + * } + * + * + * @author KnowledgeTree Team + * @access public + * @param int $depth + * @param string $what + * @return array + */ + function get_listing($depth=1, $what='DFS') + { + if ($depth < 1) + { + return array(); + } + + $what = strtoupper($what); + $read_permission = &KTPermission::getByName(KTAPI_PERMISSION_READ); + $folder_permission = &KTPermission::getByName(KTAPI_PERMISSION_VIEW_FOLDER); + + $config = KTConfig::getSingleton(); + + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION); + + $user = $this->ktapi->get_user(); + + $contents = array(); + + if (strpos($what,'F') !== false) + { + + $folder_children = Folder::getList(array('parent_id = ?', $this->folderid)); + + foreach ($folder_children as $folder) + { + if(KTPermissionUtil::userHasPermissionOnItem($user, $folder_permission, $folder) || + KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $folder)) + { + if ($depth-1 > 0) + { + $sub_folder = &$this->ktapi->get_folder_by_id($folder->getId()); + $items = $sub_folder->get_listing($depth-1, $what); + } + else + { + $items=array(); + } + + $creator=$this->_resolve_user($folder->getCreatorID()); + + + if ($wsversion >= 2) + { + $array = array( + 'id' => (int) $folder->getId(), + 'item_type' => 'F', + + 'custom_document_no'=>'n/a', + 'oem_document_no'=>'n/a', + + 'title' => $folder->getName(), + 'document_type' => 'n/a', + 'filename' => $folder->getName(), + 'filesize' => 'n/a', + + 'created_by' => is_null($creator)?'n/a':$creator->getName(), + 'created_date' => 'n/a', + + 'checked_out_by' => 'n/a', + 'checked_out_date' => 'n/a', + + 'modified_by' => 'n/a', + 'modified_date' => 'n/a', + + 'owned_by' => 'n/a', + + 'version' => 'n/a', + + 'is_immutable'=> 'n/a', + 'permissions' => KTAPI_Folder::get_permission_string($folder), + + 'workflow'=>'n/a', + 'workflow_state'=>'n/a', + + 'mime_type' => 'folder', + 'mime_icon_path' => 'folder', + 'mime_display' => 'Folder', + + 'storage_path' => 'n/a', + + + ); + + if($wsversion>=3){ + $array['linked_folder_id'] = $folder->getLinkedFolderId(); + if($folder->isSymbolicLink()){ + $array['item_type'] = "S"; + } + } + $array['items']=$items; + if($wsversion<3 || (strpos($what,'F') !== false && !$folder->isSymbolicLink()) || ($folder->isSymbolicLink() && strpos($what,'S') !== false)){ + $contents[] = $array; + } + } + else + { + + $contents[] = array( + 'id' => (int) $folder->getId(), + 'item_type'=>'F', + 'title'=>$folder->getName(), + 'creator'=>is_null($creator)?'n/a':$creator->getName(), + 'checkedoutby'=>'n/a', + 'modifiedby'=>'n/a', + 'filename'=>$folder->getName(), + 'size'=>'n/a', + 'major_version'=>'n/a', + 'minor_version'=>'n/a', + 'storage_path'=>'n/a', + 'mime_type'=>'folder', + 'mime_icon_path'=>'folder', + 'mime_display'=>'Folder', + 'items'=>$items, + 'workflow'=>'n/a', + 'workflow_state'=>'n/a' + ); + } + + } + } + + } + + if (strpos($what,'D') !== false) + { + $document_children = Document::getList(array('folder_id = ? AND status_id = 1', $this->folderid)); + + // I hate that KT doesn't cache things nicely... + $mime_cache=array(); + + foreach ($document_children as $document) + { + if (KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $document)) + { + $created_by=$this->_resolve_user($document->getCreatorID()); + $created_date = $document->getCreatedDateTime(); + if (empty($created_date)) $created_date = 'n/a'; + + $checked_out_by=$this->_resolve_user($document->getCheckedOutUserID()); + $checked_out_date = $document->getCheckedOutDate(); + if (empty($checked_out_date)) $checked_out_date = 'n/a'; + + $modified_by=$this->_resolve_user($document->getCreatorID()); + $modified_date = $document->getLastModifiedDate(); + if (empty($modified_date)) $modified_date = 'n/a'; + + $owned_by =$this->_resolve_user($document->getOwnerID()); + + $mimetypeid=$document->getMimeTypeID(); + if (!array_key_exists($mimetypeid, $mime_cache)) + { + + $type=KTMime::getMimeTypeName($mimetypeid); + $icon=KTMime::getIconPath($mimetypeid); + $display=KTMime::getFriendlyNameForString($type); + $mime_cache[$mimetypeid] = array( + 'type'=>$type, + 'icon'=>$icon, + 'display'=>$display + + ); + } + $mimeinfo=$mime_cache[$mimetypeid]; + + $workflow='n/a'; + $state='n/a'; + + $wf = KTWorkflowUtil::getWorkflowForDocument($document); + + if (!is_null($wf) && !PEAR::isError($wf)) + { + $workflow=$wf->getHumanName(); + + $ws=KTWorkflowUtil::getWorkflowStateForDocument($document); + if (!is_null($ws) && !PEAR::isError($ws)) + { + $state=$ws->getHumanName(); + } + } + + if ($wsversion >= 2) + { + $docTypeId = $document->getDocumentTypeID(); + $documentType = DocumentType::get($docTypeId); + + $oemDocumentNo = $document->getOemNo(); + if (empty($oemDocumentNo)) $oemDocumentNo = 'n/a'; + + + $array = array( + 'id' => (int) $document->getId(), + 'item_type' => 'D', + + 'custom_document_no'=>'n/a', + 'oem_document_no'=>$oemDocumentNo, + + 'title' => $document->getName(), + 'document_type'=>$documentType->getName(), + 'filename' => $document->getFileName(), + 'filesize' => $document->getFileSize(), + + 'created_by' => is_null($created_by)?'n/a':$created_by->getName(), + 'created_date' => $created_date, + + 'checked_out_by' => is_null($checked_out_by)?'n/a':$checked_out_by->getName(), + 'checked_out_date' => $checked_out_date, + + 'modified_by' => is_null($modified_by)?'n/a':$modified_by->getName(), + 'modified_date' => $modified_date, + + 'owned_by' => is_null($owned_by)?'n/a':$owned_by->getName(), + + 'version' => $document->getMajorVersionNumber() . '.' . $document->getMinorVersionNumber(), + 'content_id' => $document->getContentVersionId(), + + 'is_immutable'=> $document->getImmutable()?'true':'false', + 'permissions' => KTAPI_Document::get_permission_string($document), + + 'workflow'=> $workflow, + 'workflow_state'=> $state, + + 'mime_type' => $mime_cache[$mimetypeid]['type'], + 'mime_icon_path' => $mime_cache[$mimetypeid]['icon'], + 'mime_display' => $mime_cache[$mimetypeid]['display'], + + 'storage_path' => $document->getStoragePath(), + ); + if($wsversion>=3){ + $document->switchToRealCore(); + $array['linked_document_id'] = $document->getLinkedDocumentId(); + $document->switchToLinkedCore(); + if($document->isSymbolicLink()){ + $array['item_type'] = "S"; + } + } + + $array['items']=array(); + + + if($wsversion<3 || (strpos($what,'D') !== false && !$document->isSymbolicLink()) || ($document->isSymbolicLink() && strpos($what,'S') !== false)){ + $contents[] = $array; + } + } + else + { + + + $contents[] = array( + 'id' => (int) $document->getId(), + 'item_type'=>'D', + 'title'=>$document->getName(), + 'creator'=>is_null($created_by)?'n/a':$created_by->getName(), + 'checkedoutby'=>is_null($checked_out_by)?'n/a':$checked_out_by->getName(), + 'modifiedby'=>is_null($modified_by)?'n/a':$modified_by->getName(), + 'filename'=>$document->getFileName(), + 'size'=>$document->getFileSize(), + 'major_version'=>$document->getMajorVersionNumber(), + 'minor_version'=>$document->getMinorVersionNumber(), + 'storage_path'=>$document->getStoragePath(), + 'mime_type'=>$mime_cache[$mimetypeid]['type'], + 'mime_icon_path'=>$mime_cache[$mimetypeid]['icon'], + 'mime_display'=>$mime_cache[$mimetypeid]['display'], + 'items'=>array(), + 'workflow'=>$workflow, + 'workflow_state'=>$state + ); + + } + } + } + } + + return $contents; + } + + /** + * Get's a folder listing, recursing to the maximum depth. + * Derived from the get_listing function. + * + * + * $root = $this->ktapi->get_root_folder(); + * $listing = $root->get_full_listing(); + * foreach($listing as $val) { + * if($val['item_type'] == 'F') { + * // It's a folder + * echo $val['title']; + * } + * } + * + * + * @author KnowledgeTree Team + * @access public + * @param string $what + * @return array + */ + function get_full_listing($what='DFS') + { + $what = strtoupper($what); + $read_permission = &KTPermission::getByName(KTAPI_PERMISSION_READ); + $folder_permission = &KTPermission::getByName(KTAPI_PERMISSION_VIEW_FOLDER); + + $config = KTConfig::getSingleton(); + + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION); + + $user = $this->ktapi->get_user(); + + $contents = array(); + + if (strpos($what,'F') !== false) + { + + $folder_children = Folder::getList(array('parent_id = ?', $this->folderid)); + + foreach ($folder_children as $folder) + { + if(KTPermissionUtil::userHasPermissionOnItem($user, $folder_permission, $folder) || + KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $folder)) + { + $sub_folder = &$this->ktapi->get_folder_by_id($folder->getId()); + if (!PEAR::isError($sub_folder)) + { + $items = $sub_folder->get_full_listing($what); + } + else + { + $items = array(); + } + + $creator = $this->_resolve_user($folder->getCreatorID()); + + + if ($wsversion >= 2) + { + $array = array( + 'id' => (int) $folder->getId(), + 'item_type' => 'F', + + 'custom_document_no'=>'n/a', + 'oem_document_no'=>'n/a', + + 'title' => $folder->getName(), + 'document_type' => 'n/a', + 'filename' => $folder->getName(), + 'filesize' => 'n/a', + + 'created_by' => is_null($creator)?'n/a':$creator->getName(), + 'created_date' => 'n/a', + + 'checked_out_by' => 'n/a', + 'checked_out_date' => 'n/a', + + 'modified_by' => 'n/a', + 'modified_date' => 'n/a', + + 'owned_by' => 'n/a', + + 'version' => 'n/a', + + 'is_immutable'=> 'n/a', + 'permissions' => KTAPI_Folder::get_permission_string($folder), + + 'workflow'=>'n/a', + 'workflow_state'=>'n/a', + + 'mime_type' => 'folder', + 'mime_icon_path' => 'folder', + 'mime_display' => 'Folder', + + 'storage_path' => 'n/a', + ); + + if($wsversion>=3) + { + $array['linked_folder_id'] = $folder->getLinkedFolderId(); + if($folder->isSymbolicLink()) { + $array['item_type'] = "S"; + } + } + + $array['items']=$items; + if($wsversion<3 || (strpos($what,'F') !== false && !$folder->isSymbolicLink()) || + ($folder->isSymbolicLink() && strpos($what,'S') !== false)) { + $contents[] = $array; + } + } + else + { + $contents[] = array( + 'id' => (int) $folder->getId(), + 'item_type'=>'F', + 'title'=>$folder->getName(), + 'creator'=>is_null($creator)?'n/a':$creator->getName(), + 'checkedoutby'=>'n/a', + 'modifiedby'=>'n/a', + 'filename'=>$folder->getName(), + 'size'=>'n/a', + 'major_version'=>'n/a', + 'minor_version'=>'n/a', + 'storage_path'=>'n/a', + 'mime_type'=>'folder', + 'mime_icon_path'=>'folder', + 'mime_display'=>'Folder', + 'items'=>$items, + 'workflow'=>'n/a', + 'workflow_state'=>'n/a' + ); + } + + } + } + + } + + if (strpos($what,'D') !== false) + { + $document_children = Document::getList(array('folder_id = ? AND status_id = 1', $this->folderid)); + + // I hate that KT doesn't cache things nicely... + $mime_cache = array(); + + foreach ($document_children as $document) + { + if (KTPermissionUtil::userHasPermissionOnItem($user, $read_permission, $document)) + { + $created_by=$this->_resolve_user($document->getCreatorID()); + $created_date = $document->getCreatedDateTime(); + if (empty($created_date)) $created_date = 'n/a'; + + $checked_out_by=$this->_resolve_user($document->getCheckedOutUserID()); + $checked_out_date = $document->getCheckedOutDate(); + if (empty($checked_out_date)) $checked_out_date = 'n/a'; + + $modified_by=$this->_resolve_user($document->getCreatorID()); + $modified_date = $document->getLastModifiedDate(); + if (empty($modified_date)) $modified_date = 'n/a'; + + $owned_by =$this->_resolve_user($document->getOwnerID()); + + $mimetypeid=$document->getMimeTypeID(); + if (!array_key_exists($mimetypeid, $mime_cache)) + { + + $type=KTMime::getMimeTypeName($mimetypeid); + $icon=KTMime::getIconPath($mimetypeid); + $display=KTMime::getFriendlyNameForString($type); + $mime_cache[$mimetypeid] = array( + 'type'=>$type, + 'icon'=>$icon, + 'display'=>$display + + ); + } + $mimeinfo=$mime_cache[$mimetypeid]; + + $workflow='n/a'; + $state='n/a'; + + $wf = KTWorkflowUtil::getWorkflowForDocument($document); + + if (!is_null($wf) && !PEAR::isError($wf)) + { + $workflow=$wf->getHumanName(); + + $ws=KTWorkflowUtil::getWorkflowStateForDocument($document); + if (!is_null($ws) && !PEAR::isError($ws)) + { + $state=$ws->getHumanName(); + } + } + + if ($wsversion >= 2) + { + $docTypeId = $document->getDocumentTypeID(); + $documentType = DocumentType::get($docTypeId); + + $oemDocumentNo = $document->getOemNo(); + if (empty($oemDocumentNo)) $oemDocumentNo = 'n/a'; + + + $array = array( + 'id' => (int) $document->getId(), + 'item_type' => 'D', + + 'custom_document_no'=>'n/a', + 'oem_document_no'=>$oemDocumentNo, + + 'title' => $document->getName(), + 'document_type'=>$documentType->getName(), + 'filename' => $document->getFileName(), + 'filesize' => $document->getFileSize(), + + 'created_by' => is_null($created_by)?'n/a':$created_by->getName(), + 'created_date' => $created_date, + + 'checked_out_by' => is_null($checked_out_by)?'n/a':$checked_out_by->getName(), + 'checked_out_date' => $checked_out_date, + + 'modified_by' => is_null($modified_by)?'n/a':$modified_by->getName(), + 'modified_date' => $modified_date, + + 'owned_by' => is_null($owned_by)?'n/a':$owned_by->getName(), + + 'version' => $document->getMajorVersionNumber() . '.' . $document->getMinorVersionNumber(), + 'content_id' => $document->getContentVersionId(), + + 'is_immutable'=> $document->getImmutable()?'true':'false', + 'permissions' => KTAPI_Document::get_permission_string($document), + + 'workflow'=> $workflow, + 'workflow_state'=> $state, + + 'mime_type' => $mime_cache[$mimetypeid]['type'], + 'mime_icon_path' => $mime_cache[$mimetypeid]['icon'], + 'mime_display' => $mime_cache[$mimetypeid]['display'], + + 'storage_path' => $document->getStoragePath(), + ); + if($wsversion>=3){ + $document->switchToRealCore(); + $array['linked_document_id'] = $document->getLinkedDocumentId(); + $document->switchToLinkedCore(); + if($document->isSymbolicLink()){ + $array['item_type'] = "S"; + } + } + + $array['items']=array(); + + + if($wsversion<3 || (strpos($what,'D') !== false && !$document->isSymbolicLink()) || ($document->isSymbolicLink() && strpos($what,'S') !== false)){ + $contents[] = $array; + } + } + else + { + $contents[] = array( + 'id' => (int) $document->getId(), + 'item_type'=>'D', + 'title'=>$document->getName(), + 'creator'=>is_null($created_by)?'n/a':$created_by->getName(), + 'checkedoutby'=>is_null($checked_out_by)?'n/a':$checked_out_by->getName(), + 'modifiedby'=>is_null($modified_by)?'n/a':$modified_by->getName(), + 'filename'=>$document->getFileName(), + 'size'=>$document->getFileSize(), + 'major_version'=>$document->getMajorVersionNumber(), + 'minor_version'=>$document->getMinorVersionNumber(), + 'storage_path'=>$document->getStoragePath(), + 'mime_type'=>$mime_cache[$mimetypeid]['type'], + 'mime_icon_path'=>$mime_cache[$mimetypeid]['icon'], + 'mime_display'=>$mime_cache[$mimetypeid]['display'], + 'items'=>array(), + 'workflow'=>$workflow, + 'workflow_state'=>$state + ); + } + } + } + } + + return $contents; + } + + /** + * This adds a shortcut to an existing document to the current folder + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id The ID of the document to create a shortcut to + * @return KTAPI_Document + * + */ + function add_document_shortcut($document_id){ + $user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_WRITE); + if (PEAR::isError($user)) + { + return $user; + } + $oDocument = Document::get($document_id); + if(PEAR::isError($oDocument)){ + return $oDocument; + } + + $user = $this->can_user_access_object_requiring_permission($oDocument, KTAPI_PERMISSION_READ); + if (PEAR::isError($user)) + { + return $user; + } + $document = KTDocumentUtil::createSymbolicLink($document_id,$this->folder,$user); + if (PEAR::isError($document)) + { + return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR . ' : ' . $document->getMessage()); + } + + return new KTAPI_Document($this->ktapi,$this,$document); + } + + /** + * This adds a shortcut pointing to an existing folder to the current folder + * + * @author KnowledgeTree Team + * @access public + * @param int $folder_id The ID of the folder to create a shortcut to + * @return KTAPI_Folder + */ + function add_folder_shortcut($folder_id){ + $user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_WRITE); + if (PEAR::isError($user)) + { + return $user; + } + $oFolder = Folder::get($folder_id); + if(PEAR::isError($oFolder)){ + return $oFolder; + } + + $user = $this->can_user_access_object_requiring_permission($oFolder, KTAPI_PERMISSION_READ); + if (PEAR::isError($user)) + { + return $user; + } + $folder = & KTFolderUtil::createSymbolicLink($folder_id,$this->folder,$user); + if (PEAR::isError($folder)) + { + return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR . ' : ' . $folder->getMessage()); + } + + return new KTAPI_Folder($this->ktapi,$folder); + } + + /** + * This adds a document to the current folder. + * + * + * $kt = new KTAPI(); + * $kt->start_session("admin", "admin"); + * $folder = $kt->get_folder_by_name("My New folder"); + * $res = $folder->add_document("Test Document", "test.txt", "Default", $tmpfname); + * + * + * @author KnowledgeTree Team + * @access public + * @param string $title This is the title for the file in the repository. + * @param string $filename This is the filename in the system for the file. + * @param string $documenttype This is the name or id of the document type. It first looks by name, then by id. + * @param string $tempfilename This is a reference to the file that is accessible locally on the file system. + * @return KTAPI_Document + */ + function add_document($title, $filename, $documenttype, $tempfilename) + { + if (!is_file($tempfilename)) + { + return new PEAR_Error('File does not exist.'); + } + + $user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_WRITE); + if (PEAR::isError($user)) + { + return $user; + } + + //KTS-4016: removed the replacing of special characters from the title as they should be allowed there + //$title = KTUtil::replaceInvalidCharacters($title); + $filename = basename($filename); + $filename = KTUtil::replaceInvalidCharacters($filename); + $documenttypeid = KTAPI::get_documenttypeid($documenttype); + if (PEAR::isError($documenttypeid)) + { + $config = KTCache::getSingleton(); + $defaultToDefaultDocType = $config->get('webservice/useDefaultDocumentTypeIfInvalid',true); + if ($defaultToDefaultDocType) + { + $documenttypeid = KTAPI::get_documenttypeid('Default'); + } + else + { + return new KTAPI_DocumentTypeError('The document type could not be resolved or is disabled: ' . $documenttype); + } + } + + + $options = array( + 'contents' => new KTFSFileLike($tempfilename), + 'temp_file' => $tempfilename, + 'novalidate' => true, + 'documenttype' => DocumentType::get($documenttypeid), + 'description' => $title, + 'metadata'=>array(), + 'cleanup_initial_file' => true + ); + + DBUtil::startTransaction(); + $document =& KTDocumentUtil::add($this->folder, $filename, $user, $options); + + if (PEAR::isError($document)) + { + DBUtil::rollback(); + return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR . ' : ' . $document->getMessage()); + } + DBUtil::commit(); + + KTUploadManager::temporary_file_imported($tempfilename); + + return new KTAPI_Document($this->ktapi, $this, $document); + } + + /** + * This adds a subfolder folder to the current folder. + * + * + * start_session("admin", "admin"); + * $root = $kt->get_root_folder(); + * $root->add_folder("My New folder"); + * ?> + * + * + * @author KnowledgeTree Team + * @access public + * @param string $foldername + * @return KTAPI_Folder + */ + function add_folder($foldername) + { + $user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_ADD_FOLDER); + + if (PEAR::isError($user)) + { + return $user; + } + $foldername = KTUtil::replaceInvalidCharacters($foldername); + + DBUtil::startTransaction(); + $result = KTFolderUtil::add($this->folder, $foldername, $user); + + if (PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result); + } + DBUtil::commit(); + $folderid = $result->getId(); + + return $this->ktapi->get_folder_by_id($folderid); + } + + /** + * This deletes the current folder. + * + * + * $kt = new KTAPI(); + * $kt->start_session("admin", "admin"); + * $folder = $kt->get_folder_by_name("My New folder"); + * $folder->delete("It was getting old!"); + * + * + * @author KnowledgeTree Team + * @access public + * @param string $reason + */ + function delete($reason) + { + $user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_DELETE); + if (PEAR::isError($user)) + { + return $user; + } + + if ($this->folderid == 1) + { + return new PEAR_Error('Cannot delete root folder!'); + } + + DBUtil::startTransaction(); + $result = KTFolderUtil::delete($this->folder, $user, $reason); + + if (PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result); + } + DBUtil::commit(); + } + + /** + * This renames the folder + * + * @author KnowledgeTree Team + * @access public + * @param string $newname + */ + function rename($newname) + { + $user = $this->can_user_access_object_requiring_permission($this->folder, KTAPI_PERMISSION_RENAME_FOLDER); + if (PEAR::isError($user)) + { + return $user; + } + $newname = KTUtil::replaceInvalidCharacters($newname); + + DBUtil::startTransaction(); + $result = KTFolderUtil::rename($this->folder, $newname, $user); + + if (PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result); + } + DBUtil::commit(); + } + + /** + * This moves the folder to another location. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Folder $ktapi_target_folder + * @param string $reason + */ + function move($ktapi_target_folder, $reason='') + { + assert(!is_null($ktapi_target_folder)); + assert(is_a($ktapi_target_folder,'KTAPI_Folder')); + + $user = $this->ktapi->get_user(); + + $target_folder = $ktapi_target_folder->get_folder(); + + $result = $this->can_user_access_object_requiring_permission($target_folder, KTAPI_PERMISSION_WRITE); + if (PEAR::isError($result)) + { + return $result; + } + + DBUtil::startTransaction(); + $result = KTFolderUtil::move($this->folder, $target_folder, $user, $reason); + + if (PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result); + } + + // regenerate internal folder object + $res = $this->updateObject(); + + if (PEAR::isError($res)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result); + } + DBUtil::commit(); + } + + /** + * This copies a folder to another location. + * + * + * $root = $this->ktapi->get_root_folder(); + * $folder = $root->add_folder("Test folder"); + * $new_folder = $root->add_folder("New test folder"); + * $res = $folder->copy($new_folder, "Test copy"); + * + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI_Folder $ktapi_target_folder + * @param string $reason + */ + function copy($ktapi_target_folder, $reason='') + { + assert(!is_null($ktapi_target_folder)); + assert(is_a($ktapi_target_folder,'KTAPI_Folder')); + + $user = $this->ktapi->get_user(); + + $target_folder = $ktapi_target_folder->get_folder(); + + $result =$this->can_user_access_object_requiring_permission($target_folder, KTAPI_PERMISSION_WRITE); + + if (PEAR::isError($result)) + { + return $result; + } + + DBUtil::startTransaction(); + $result = KTFolderUtil::copy($this->folder, $target_folder, $user, $reason); + + if (PEAR::isError($result)) + { + DBUtil::rollback(); + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $result); + } + DBUtil::commit(); + } + + /** + * This returns all permissions linked to the folder. + * + * @author KnowledgeTree Team + * @access public + * @return array + */ + function get_permissions() + { + return new PEAR_Error('TODO'); + } + + + /** + * This returns the transaction history for the document. + * + * @author KnowledgeTree Team + * @access public + * @return array The list of transactions | a PEAR_Error on failure + */ + function get_transaction_history() + { + $sQuery = 'SELECT DTT.name AS transaction_name, U.name AS username, DT.comment AS comment, DT.datetime AS datetime ' . + 'FROM ' . KTUtil::getTableName('folder_transactions') . ' AS DT INNER JOIN ' . KTUtil::getTableName('users') . ' AS U ON DT.user_id = U.id ' . + 'INNER JOIN ' . KTUtil::getTableName('transaction_types') . ' AS DTT ON DTT.namespace = DT.transaction_namespace ' . + 'WHERE DT.folder_id = ? ORDER BY DT.datetime DESC'; + $aParams = array($this->folderid); + + $transactions = DBUtil::getResultArray(array($sQuery, $aParams)); + if (is_null($transactions) || PEAR::isError($transactions)) + { + return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $transactions ); + } + + $config = KTConfig::getSingleton(); + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION); + foreach($transactions as $key=>$transaction) + { + $transactions[$key]['version'] = (float) $transaction['version']; + } + + return $transactions; + } + + /** + * Gets the KTAPI_Folder object of this instance + * + * @author KnowledgeTree Team + * @access public + * @return KTAPI_Folder + */ + public function getObject() + { + return $this->folder; + } + + /** + * Updates the Folder object + */ + private function updateObject() + { + $folder = &Folder::get($this->folderid); + if (is_null($folder) || PEAR::isError($folder)) + { + return new KTAPI_Error(KTAPI_ERROR_FOLDER_INVALID, $folder); + } + + $this->folder = $folder; + } + + /** + * Get the role allocation for the folder + * + * @return KTAPI_RoleAllocation Instance of the role allocation object + */ + public function getRoleAllocation() + { + $allocation = KTAPI_RoleAllocation::getAllocation($this->ktapi, $this); + + return $allocation; + } + + /** + * Get the permission allocation for the folder + * + * @return KTAPI_PermissionAllocation Instance of the permission allocation object + */ + public function getPermissionAllocation() + { + $allocation = KTAPI_PermissionAllocation::getAllocation($this->ktapi, $this); + + return $allocation; + } + + /** + * Determines whether the currently logged on user is subscribed + * + * @author KnowledgeTree Team + * @access public + * @return boolean + */ + public function isSubscribed() + { + $subscriptionType = SubscriptionEvent::subTypes('Folder'); + $user = $this->ktapi->get_user(); + $folder = $this->folder; + + $result = Subscription::exists($user->getId(), $folder->getId(), $subscriptionType); + return $result; + } + + /** + * + * @author KnowledgeTree Team + * @access public + * + */ + public function unsubscribe() + { + if (!$this->isSubscribed()) + { + return TRUE; + } + + $subscriptionType = SubscriptionEvent::subTypes('Folder'); + $user = $this->ktapi->get_user(); + $folder = $this->folder; + + $subscription = & Subscription::getByIDs($user->getId(), $folder->getId(), $subscriptionType); + $result = $subscription->delete(); + + if(PEAR::isError($result)){ + return $result->getMessage(); + } + if($result){ + return $result; + } + + return $_SESSION['errorMessage']; + } + + /** + * Subscribes the currently logged in KTAPI user to the folder + * + * @author KnowledgeTree Team + * @access public + * + */ + public function subscribe() + { + if ($this->isSubscribed()) + { + return TRUE; + } + $subscriptionType = SubscriptionEvent::subTypes('Folder'); + $user = $this->ktapi->get_user(); + $folder = $this->folder; + + $subscription = new Subscription($user->getId(), $folder->getId(), $subscriptionType); + $result = $subscription->create(); + + if(PEAR::isError($result)){ + return $result->getMessage(); + } + if($result){ + return $result; + } + + return $_SESSION['errorMessage']; + } +} + +?> diff --git a/ktapi/KTAPISession.inc.php b/ktapi/KTAPISession.inc.php new file mode 100644 index 0000000..6890672 --- /dev/null +++ b/ktapi/KTAPISession.inc.php @@ -0,0 +1,556 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * + * @copyright 2008-2009, KnowledgeTree Inc. + * @license GNU General Public License version 3 + * @author KnowledgeTree Team + * @package KTAPI + * @version Version 0.9 + */ + +/** + * API for the handling the KnowledgeTree session + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_Session +{ + /** + * This is a reference to the ktapi object. + * + * @access protected + * @var KTAPI + */ + var $ktapi; + + /** + * This is a reference to the user object. + * + * @access protected + * @var User + */ + var $user = null; + + /** + * This is a reference to the internal session object. + * + * @access protected + * @var Session + */ + var $session = ''; + + /** + * The sessionid from the database + * + * @access protected + * @var int + */ + var $sessionid = -1; + + /** + * Indicates if the session is active and the user is logged in + * + * @access protected + * @var bool + */ + var $active; + + /** + * The users id of the user logged in before a new user session was initiated. + * + * @access protected + * @var int + */ + var $origUserId; + + /** + * Creates a new KTAPI_Session, sets up the internal variables. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI $ktapi Instance of the KTAPI object + * @param User $user Instance of the USER object + * @return KTAPI_Session + */ + function KTAPI_Session(&$ktapi, &$user) + { + assert(!is_null($ktapi)); + assert(is_a($ktapi,'KTAPI')); + assert(!is_null($user)); + assert(is_a($user,'User')); + + $this->ktapi=&$ktapi; + $this->user=&$user; + $this->origUserId = isset($_SESSION['userID'])?$_SESSION['userID']:null; + $_SESSION['userID']=$user->getId(); + $this->active = false; + } + + /** + * Returns the internal session object + * + * @author KnowledgeTree Team + * @access public + * @return Session + */ + function get_session() + { + return $this->session; + } + + /** + * This returns the sessionid in the database. + * + * @author KnowledgeTree Team + * @access public + * @return int + */ + function get_sessionid() + { + return $this->sessionid; + } + + /** + * Returns the user object + * + * @author KnowledgeTree Team + * @access public + * @return User + */ + function &get_user() + { + return $this->user; + } + + /** + * Logs the user out of the session. Sets the session userid back to the original userid + * + * @author KnowledgeTree Team + * @access public + */ + function logout() + { + $_SESSION['userID'] = $this->origUserId; + $this->active=false; + // don't need to do anything really + } + + /** + * Checks whether the session is active + * + * @author KnowledgeTree Team + * @access public + * @return bool TRUE if active | FALSE if not + */ + function is_active() + { + return $this->active; + } + +} + +/** + * API for the handling a users session in KnowledgeTree + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_UserSession extends KTAPI_Session +{ + + /** + * The users ip address + * + * @access protected + * @var int + */ + var $ip = null; + + /** + * Create a KTAPI_Session for the current user + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI $ktapi The KTAPI object + * @param USER $user The User object + * @param SESSION $session The current session object + * @param int $sessionid The id for the current session + * @param int $ip The users IP address + * @return KTAPI_UserSession + */ + function KTAPI_UserSession(&$ktapi, &$user, $session, $sessionid, $ip) + { + parent::KTAPI_Session($ktapi, $user); + + $this->ktapi = &$ktapi; + $this->user = &$user; + $this->session = $session; + $this->sessionid = $sessionid; + $this->ip = $ip; + + // TODO: get documenttransaction to not look at the session variable! + $_SESSION["userID"] = $user->getId(); + $_SESSION["sessionID"] = $this->sessionid; + $this->active = true; + } + + /** + * This resolves the user's ip address + * + * @author KnowledgeTree Team + * @access private + * @return string + */ + function resolveIP() + { + if (getenv("REMOTE_ADDR")) + { + $ip = getenv("REMOTE_ADDR"); + } + elseif (getenv("HTTP_X_FORWARDED_FOR")) + { + $forwardedip = getenv("HTTP_X_FORWARDED_FOR"); + list($ip,$ip2,$ip3,$ip4)= split (",", $forwardedip); + } + elseif (getenv("HTTP_CLIENT_IP")) + { + $ip = getenv("HTTP_CLIENT_IP"); + } + + if ($ip == '') + { + $ip = '127.0.0.1'; + } + + return $ip; + } + + /** + * Checks whether a session exists for the given user and creates a new one or updates the existing one. + * + * @author KnowledgeTree Team + * @access protected + * @static + * @param User $user The User object + * @param int $ip The users IP address + * @param string $app The originating application type - ws => webservices | webapp => web application | webdav + * @return array|PEAR_Error Returns the session string and session id (DB) | a PEAR_Error on failure + */ + function _check_session(&$user, $ip, $app) + { + $user_id = $user->getId(); + + Session::removeStaleSessions($user_id); + + $config = &KTConfig::getSingleton(); + $validateSession = $config->get('webservice/validateSessionCount', false); + + if ($validateSession) + { + $sql = "SELECT count(*) >= u.max_sessions as over_limit FROM active_sessions ass INNER JOIN users u ON ass.user_id=u.id WHERE ass.user_id = $user_id AND ass.apptype = 'webapp'"; + $row = DBUtil::getOneResult($sql); + + if (PEAR::isError($row)) + { + return $row; + } + if (is_null($row)) + { + return new PEAR_Error('No record found for user?'); + } + if ($row['over_limit']+0 == 1) + { + return new PEAR_Error('Session limit exceeded. Logout of any active sessions.'); + } + } + + $session = session_id(); + $newSessionRequired = false; + if ($app != 'webapp') + { + $sql = "select id from active_sessions where user_id=$user_id AND apptype='$app' and ip='$ip'"; + + $row = DBUtil::getOneResult($sql); + if (empty($row)) + { + $newSessionRequired = true; + } + else + { + $sessionid = $row['id']; + $sql = "update active_sessions set session_id='$session' where id=$sessionid"; + + DBUtil::runQuery($sql); + } + } + else + { + $newSessionRequired = true; + } + + if ($newSessionRequired) + { + $sessionid = DBUtil::autoInsert('active_sessions', + array( + 'user_id' => $user_id, + 'session_id' => session_id(), + 'lastused' => date('Y-m-d H:i:s'), + 'ip' => $ip, + 'apptype'=>$app + )); + if (PEAR::isError($sessionid) ) + { + return $sessionid; + } + } + + return array($session,$sessionid); + } + + + /** + * This returns a session object based on authentication credentials. + * + * @author KnowledgeTree Team + * @access public + * @static + * @param KTAPI $ktapi Instance of the KTAPI object + * @param string $username The users username + * @param string $password The users password + * @param string $ip Optional. The users IP address - if null, the method will attempt to resolve it + * @param string $app Optional. The originating application type - Default is ws => webservices | webapp => The web application + * @return KTAPI_Session|PEAR_Error Returns the KATPI_UserSession | a PEAR_Error on failure + */ + function &start_session(&$ktapi, $username, $password, $ip=null, $app='ws') + { + $this->active=false; + if ( empty($username) ) + { + return new PEAR_Error(_kt('The username is empty.')); + } + + $user =& User::getByUsername($username); + if (PEAR::isError($user) || ($user === false)) + { + return new KTAPI_Error(sprintf(_kt("The user '%s' cound not be found.") , $username),$user); + } + + if ( empty($password) ) + { + return new PEAR_Error(_kt('The password is empty.')); + } + + $authenticated = KTAuthenticationUtil::checkPassword($user, $password); + + if (PEAR::isError($authenticated) || $authenticated === false) + { + $ret=new KTAPI_Error(_kt("The password is invalid."),$authenticated); + return $ret; + } + + if (is_null($ip)) + { + //$ip = '127.0.0.1'; + $ip = KTAPI_UserSession::resolveIP(); + } + + $result = KTAPI_UserSession::_check_session($user, $ip, $app); + + if (PEAR::isError($result)) + { + return $result; + } + + list($session,$sessionid) = $result; + + $session = &new KTAPI_UserSession($ktapi, $user, $session, $sessionid, $ip); + + return $session; + } + + /** + * Returns an active session based on the session string and the ip address if supplied. + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI $ktapi Instance of the KTAPI object + * @param string $session The session string + * @param string $ip The users ip address + * @param string $app Optional. The originating application type - Default is ws => webservices | webapp => The web application + * @return KTAPI_Session|PEAR_Error Returns the session object | a PEAR_Error on failure + */ + function &get_active_session(&$ktapi, $session, $ip, $app='ws') + { + $sql = "SELECT id, user_id FROM active_sessions WHERE session_id='$session' and apptype='$app'"; + if (!empty($ip)) + { + $sql .= " AND ip='$ip'"; + } + + $row = DBUtil::getOneResult($sql); + if (is_null($row) || PEAR::isError($row)) + { + $ret= new KTAPI_Error(KTAPI_ERROR_SESSION_INVALID, $row); + return $ret; + } + + $sessionid = $row['id']; + $userid = $row['user_id']; + + $user = &User::get($userid); + if (is_null($user) || PEAR::isError($user)) + { + return new KTAPI_Error(KTAPI_ERROR_USER_INVALID, $user); + } + + $now=date('Y-m-d H:i:s'); + $sql = "UPDATE active_sessions SET lastused='$now' WHERE id=$sessionid"; + DBUtil::runQuery($sql); + + if ($user->isAnonymous()) + $session = &new KTAPI_AnonymousSession($ktapi, $user, $session, $sessionid, $ip); + else + $session = &new KTAPI_UserSession($ktapi, $user, $session, $sessionid, $ip); + return $session; + } + + /** + * Ends the current session. + * + * @author KnowledgeTree Team + * @access public + * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure + */ + function logout() + { + $sql = "DELETE FROM active_sessions WHERE id=$this->sessionid"; + $result = DBUtil::runQuery($sql); + if (PEAR::isError($result)) + { + return $result; + } + + $this->user = null; + $this->session = ''; + $this->sessionid = -1; + $this->active=false; + } + +} + +/** + * API for the handling the session for an anonymous user in KnowledgeTree + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_AnonymousSession extends KTAPI_UserSession +{ + /** + * Creates a session for an anonymous user + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI $ktapi Instance of the KTAPI object + * @param string $ip The users ip address + * @param string $app Optional. The originating application type - Default is ws => webservices | webapp => The web application + * @return KTAPI_Session|PEAR_Error Returns a session object | a PEAR_Error on failure + */ + function &start_session(&$ktapi, $ip=null, $app = 'ws') + { + $user =& User::get(-2); + if (is_null($user) || PEAR::isError($user) || ($user === false) || !$user->isAnonymous()) + { + return new KTAPI_Error(_kt("The anonymous user could not be found."), $user); + } + + $authenticated = true; + + $config = &KTConfig::getSingleton(); + $allow_anonymous = $config->get('session/allowAnonymousLogin', false); + + if (!$allow_anonymous) + { + return new PEAR_Error(_kt('Anonymous user not allowed')); + } + + if (is_null($ip)) + { + $ip = '127.0.0.1'; + //$ip = KTAPI_Session::resolveIP(); + } + + list($session,$sessionid) = KTAPI_UserSession::_check_session($user, $ip, $app); + if (PEAR::isError($sessionid)) + { + return $sessionid; + } + + $session = &new KTAPI_AnonymousSession($ktapi, $user, $session, $sessionid, $ip); + + return $session; + } +} + +/** + * API for the handling the system in KnowledgeTree + * + * @author KnowledgeTree Team + * @package KTAPI + * @version 0.9 + */ +class KTAPI_SystemSession extends KTAPI_Session +{ + /** + * Creates a system session + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI $ktapi Instance of the KTAPI object + * @param USER $user Instance of the user object + * @return KTAPI_SystemSession + */ + function KTAPI_SystemSession(&$ktapi, &$user) + { + parent::KTAPI_Session($ktapi, $user); + $this->active=true; + } +} + +?> diff --git a/ktapi/ktapi.inc.php b/ktapi/ktapi.inc.php new file mode 100644 index 0000000..dea6953 --- /dev/null +++ b/ktapi/ktapi.inc.php @@ -0,0 +1,4934 @@ +. +* +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, +* California 94120-7775, or email info@knowledgetree.com. +* +* The interactive user interfaces in modified source and object code versions +* of this program must display Appropriate Legal Notices, as required under +* Section 5 of the GNU General Public License version 3. +* +* In accordance with Section 7(b) of the GNU General Public License version 3, +* these Appropriate Legal Notices must retain the display of the "Powered by +* KnowledgeTree" logo and retain the original copyright notice. If the display of the +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices +* must display the words "Powered by KnowledgeTree" and retain the original +* copyright notice. +* +* @copyright 2008-2009, KnowledgeTree Inc. +* @license GNU General Public License version 3 +* @author KnowledgeTree Team +* @package KTAPI +* @version Version 0.9 +*/ + +$_session_id = session_id(); +if (empty($_session_id)) session_start(); +unset($_session_id); + +require_once(realpath(dirname(__FILE__) . '/../config/dmsDefaults.php')); +require_once(KT_LIB_DIR . '/filelike/fsfilelike.inc.php'); +require_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php'); +require_once(KT_LIB_DIR . '/browse/DocumentCollection.inc.php'); +require_once(KT_LIB_DIR . "/browse/columnregistry.inc.php"); + +define('KTAPI_DIR', KT_DIR . '/ktapi'); + +require_once(KTAPI_DIR .'/KTAPIConstants.inc.php'); +require_once(KTAPI_DIR .'/KTAPISession.inc.php'); +require_once(KTAPI_DIR .'/KTAPIFolder.inc.php'); +require_once(KTAPI_DIR .'/KTAPIDocument.inc.php'); +require_once(KTAPI_DIR .'/KTAPIAcl.inc.php'); +require_once(KTAPI_DIR .'/KTAPICollection.inc.php'); +require_once(KTAPI_DIR .'/KTAPIBulkActions.inc.php'); + +/** +* This class defines functions that MUST exist in the inheriting class +* +* @abstract +* @author KnowledgeTree Team +* @package KTAPI +* @version Version 0.9 +*/ +abstract class KTAPI_FolderItem +{ + /** + * This is a reference to the core KTAPI controller + * + * @author KnowledgeTree Team + * @access protected + * @var object $ktapi The KTAPI object + */ + protected $ktapi; + + /** + * This checks if a user can access an object with a certain permission. + * + * @author KnowledgeTree Team + * @access public + * @param object $object The object the user is trying to access + * @param string $permission The permissions string + * @return object $user The User object + */ + public function &can_user_access_object_requiring_permission(&$object, $permission) + { + $user = $this->ktapi->can_user_access_object_requiring_permission($object, $permission); + return $user; + } + + public abstract function getObject(); + + public abstract function getRoleAllocation(); + + public abstract function getPermissionAllocation(); + + public abstract function isSubscribed(); + + public abstract function unsubscribe(); + + public abstract function subscribe(); + +} + +/** +* This class extends the PEAR_Error class for errors in the KTAPI class +* +* @author KnowledgeTree Team +* @package KTAPI +* @version Version 0.9 +*/ +class KTAPI_Error extends PEAR_Error +{ + /** + * This method determines if there is an error in the object itself or just a common error + * + * @author KnowledgeTree Team + * @access public + * @return VOID + */ + public function KTAPI_Error($msg, $obj = null) + { + if (PEAR::isError($obj)) + { + parent::PEAR_Error($msg . ' - ' . $obj->getMessage()); + } + else + { + parent::PEAR_Error($msg); + } + } +} + +/** +* This class extends the KTAPI_Error class for errors in the KTAPI Document class +* +* @author KnowledgeTree Team +* @package KTAPI +* @version Version 0.9 +*/ +class KTAPI_DocumentTypeError extends KTAPI_Error +{ + +} + +/** +* This is the main KTAPI class +* +* @author KnowledgeTree Team +* @package KTAPI +* @version Version 0.9 +*/ + +class KTAPI +{ + /** + * This is the current session. + * + * @author KnowledgeTree Team + * @access protected + * @var object $session The KTAPI_Session object + */ + protected $session = null; + + protected $version = 3; + + private $esig_enabled; + + public function KTAPI() + { + $this->esig_enabled = $this->electronic_sig_enabled(); + } + + /** + * This returns the current session. + * + * @author KnowledgeTree Team + * @access protected + * @return object $session The KTAPI_Session object + */ + public function &get_session() + { + $session = $this->session; + return $session; + } + + /** + * This returns the session user object or an error object. + * + * @author KnowledgeTree Team + * @access protected + * @return object $user SUCCESS - The User object | FAILURE - an error object + */ + public function & get_user() + { + $ktapi_session = $this->get_session(); + if (is_null($ktapi_session) || PEAR::isError($ktapi_session)) + { + $error = new PEAR_Error(KTAPI_ERROR_SESSION_INVALID); + return $error; + } + + $user = $ktapi_session->get_user(); + if (is_null($user) || PEAR::isError($user)) + { + $error = new PEAR_Error(KTAPI_ERROR_USER_INVALID); + return $error; + } + return $user; + } + + /** + * Get the available columns for the given view (browse | search) + * + * @author KnowledgeTree Team + * @access public + * @param string $view The namespace for the view - ktcore.views.browse | ktcore.views.search + * @return unknown + */ + function get_columns_for_view($view = 'ktcore.views.browse') { + $ktapi_session = $this->get_session(); + if (is_null($ktapi_session) || PEAR::isError($ktapi_session)) + { + $error = new PEAR_Error(KTAPI_ERROR_SESSION_INVALID); + return $error; + } + + $collection = new KTAPI_Collection(); + return $collection->get_columns($view); + } + + /** + * This returns a permission object or an error object. + * + * @author KnowledgeTree Team + * @access protected + * @param string $permission The permissions string + * @return object $permissions SUCCESS - The KTPermission object | FAILURE - an error object + */ + public function &get_permission($permission) + { + $permissions = & KTPermission::getByName($permission); + if (is_null($permissions) || PEAR::isError($permissions)) + { + $error = new PEAR_Error(KTAPI_ERROR_PERMISSION_INVALID); + return $error; + } + return $permissions; + } + + /** + * Returns an associative array of permission namespaces and their names + * + * @author KnowledgeTree Team + * @access public + * @return array + */ + + public function get_permission_types() { + $types = array(); + $list = KTAPI_Permission::getList(); + foreach($list as $val) { + $types[$val->getNameSpace()] = $val->getName(); + } + return $types; + } + + /** + * Returns folder permissions + * + * @author KnowledgeTree Team + * @access public + * @param string + * @param int + * + */ + public function get_folder_permissions($username, $folder_id) { + if (is_null($this->session)) + { + return array( + "status_code" => 1, + "message" => "Your session is not active" + ); + } + /* We need to create a new instance of KTAPI to get another user */ + $user_ktapi = new KTAPI(); + $user_ktapi->start_system_session($username); + + $folder = KTAPI_Folder::get($user_ktapi, $folder_id); + + $permissions = $folder->getPermissionAllocation(); + + $user_ktapi->session_logout(); + + return array( + "status_code" => 0, + "results" => $permissions->permissions + ); + + } + + /** + * Returns folder permissions + * + * @access public + * @param string + * @param int + * + */ + public function get_document_permissions($username, $document_id) { + if (is_null($this->session)) + { + return array( + "status_code" => 1, + "message" => "Your session is not active" + ); + } + /* We need to create a new instance of KTAPI to get another user */ + $user_ktapi = new KTAPI(); + $user_ktapi->start_system_session($username); + + $document = KTAPI_Document::get($user_ktapi, $document_id); + + if (get_class($document) == 'PEAR_Error') { + return array( + "status_code" => 0, + "results" => null + ); + } + + $permissions = $document->getPermissionAllocation(); + + $user_ktapi->session_logout(); + + return array( + "status_code" => 0, + "results" => $permissions->permissions + ); + + } + + /** + * Add folder permission + * + * @author KnowledgeTree Team + * @access public + * @param string + * @param string + * @param int + * + */ + public function add_folder_user_permissions($username, $folder_id, $namespace, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.permissions_change'); + if ($response['status_code'] == 1) return $response; + + if (is_null($this->session)) + { + return array( + "status_code" => 1, + "message" => "Your session is not active" + ); + } + + /* First check that user trying to add permission can actually do so */ + $folder = KTAPI_Folder::get($this, $folder_id); + $permissions = $folder->getPermissionAllocation(); + $detail = $permissions->permissions; + if(!in_array("Manage security", $detail)) { + return array( + "status_code" => 1, + "message" => "User does not have permission to manage security" + ); + } + + /* We need to create a new instance of KTAPI to get another user */ + $user_ktapi = new KTAPI(); + $user_ktapi->start_system_session($username); + + $folder = KTAPI_Folder::get($user_ktapi, $folder_id); + if(PEAR::isError($folder)) + { + $user_ktapi->session_logout(); + return array( + "status_code" => 1, + "message" => $folder->getMessage() + ); + } + + $permission = KTAPI_Permission::getByNamespace($namespace); + if(PEAR::isError($permission)) { + $user_ktapi->session_logout(); + return array( + "status_code" => 1, + "message" => $permission->getMessage() + ); + } + + + $user = KTAPI_User::getByUsername($username); + if(PEAR::isError($user)) { + $user_ktapi->session_logout(); + return array( + "status_code" => 1, + "message" => $user->getMessage() + ); + } + + $permissions = $folder->getPermissionAllocation(); + + $permissions->add($user, $permission); + $permissions->save(); + } + + /** + * Add folder role permission + * + * @access public + * @param string + * @param string + * @param int + * + */ + public function add_folder_role_permissions($role, $folder_id, $namespace, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.permissions_change'); + if ($response['status_code'] == 1) return $response; + + if (is_null($this->session)) + { + return array( + "status_code" => 1, + "message" => "Your session is not active" + ); + } + + /* First check that user trying to add permission can actually do so */ + $folder = KTAPI_Folder::get($this, $folder_id); + $permissions = $folder->getPermissionAllocation(); + $detail = $permissions->permissions; + if(!in_array("Manage security", $detail)) { + return array( + "status_code" => 1, + "message" => "User does not have permission to manage security" + ); + } + + $folder = KTAPI_Folder::get($this, $folder_id); + if(PEAR::isError($folder)) + { + return array( + "status_code" => 1, + "message" => $folder->getMessage() + ); + } + + $permission = KTAPI_Permission::getByNamespace($namespace); + if(PEAR::isError($permission)) { + return array( + "status_code" => 1, + "message" => $permission->getMessage() + ); + } + + + $role = KTAPI_Role::getByName($role); + if(PEAR::isError($role)) { + return array( + "status_code" => 1, + "message" => $role->getMessage() + ); + } + + $permissions = $folder->getPermissionAllocation(); + + $permissions->add($role, $permission); + $permissions->save(); + } + + /** + * Add folder group permission + * + * @access public + * @param string + * @param string + * @param int + * + */ + public function add_folder_group_permissions($group, $folder_id, $namespace, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.permissions_change'); + if ($response['status_code'] == 1) return $response; + + if (is_null($this->session)) + { + return array( + "status_code" => 1, + "message" => "Your session is not active" + ); + } + + /* First check that user trying to add permission can actually do so */ + $folder = KTAPI_Folder::get($this, $folder_id); + $permissions = $folder->getPermissionAllocation(); + $detail = $permissions->permissions; + if(!in_array("Manage security", $detail)) { + return array( + "status_code" => 1, + "message" => "User does not have permission to manage security" + ); + } + + $folder = KTAPI_Folder::get($this, $folder_id); + if(PEAR::isError($folder)) + { + return array( + "status_code" => 1, + "message" => $folder->getMessage() + ); + } + + $permission = KTAPI_Permission::getByNamespace($namespace); + if(PEAR::isError($permission)) { + return array( + "status_code" => 1, + "message" => $permission->getMessage() + ); + } + + + $group = KTAPI_Role::getByName($group); + if(PEAR::isError($group)) { + return array( + "status_code" => 1, + "message" => $group->getMessage() + ); + } + + $permissions = $folder->getPermissionAllocation(); + + $permissions->add($group, $permission); + $permissions->save(); + } + + /** + * This checks if a user can access an object with a certain permission. + * + * @author KnowledgeTree Team + * @access public + * @param object $object The internal document object or a folder object + * @param string $permission The permissions string + * @return object $user SUCCESS - The User object | FAILURE - an error object + */ + public function can_user_access_object_requiring_permission(&$object, $permission) + { + assert(!is_null($object)); + assert(is_a($object,'DocumentProxy') || is_a($object,'FolderProxy') || is_a($object,'Document') || is_a($object,'Folder')); + /* + if(is_null($object) || PEAR::isError($object)){ + $error = $object; + return $object; + } + + if(!is_a($object,'DocumentProxy') && !is_a($object,'FolderProxy') && !is_a($object,'Document') && !is_a($object,'Folder')){ + $error = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); + return $error; + } + */ + + $permissions = &KTAPI::get_permission($permission); + if (is_null($permissions) || PEAR::isError($permissions)) + { + $error = $permissions; + return $error; + } + + $user = &KTAPI::get_user(); + if (is_null($user) || PEAR::isError($user)) + { + $error = $user; + return $error; + } + + if (!KTPermissionUtil::userHasPermissionOnItem($user, $permission, $object)) + { + $error = new PEAR_Error(KTAPI_ERROR_INSUFFICIENT_PERMISSIONS); + return $error; + } + + return $user; + } + + /** + * Returns the version id for the associated version number + * + * @param int $document_id + * @param string $version_number + * @return int + */ + function get_url_version_number($document_id, $version_number) { + $ktapi_session = $this->get_session(); + if (is_null($ktapi_session) || PEAR::isError($ktapi_session)) + { + $error = new PEAR_Error(KTAPI_ERROR_SESSION_INVALID); + return $error; + } + + $document_id = sanitizeForSQL($document_id); + $version_number = sanitizeForSQL($version_number); + + $pos = strpos($version_number, "."); + $major = substr($version_number, 0, $pos); + $minor = substr($version_number, ($pos+1)); + + $sql = "SELECT id FROM document_content_version WHERE document_id = {$document_id} AND major_version = '{$major}' AND minor_version = '{$minor}'"; + $row = DBUtil::getOneResult($sql); + $row = (int)$row['id']; + if (is_null($row) || PEAR::isError($row)) + { + $row = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $row); + } + return $row; + } + + /** + * Search for documents matching the oem_no. + * + * Note that oem_no is associated with a document and not with version of file (document content). + * oem_no is set on a document using document::update_sysdata(). + * + * @author KnowledgeTree Team + * @access public + * @param string $oem_no The oem number + * @param boolean $idsOnly Defaults to true + * @return array|object $results SUCCESS - the list of documents | FAILURE - and error object + */ + public function get_documents_by_oem_no($oem_no, $idsOnly=true) + { + $sql = array("SELECT id FROM documents WHERE oem_no=?",$oem_no); + $rows = DBUtil::getResultArray($sql); + if (is_null($rows) || PEAR::isError($rows)) + { + $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); + } + else + { + $results = array(); + foreach($rows as $row) + { + $documentid = $row['id']; + + $results[] = $idsOnly ? $documentid : KTAPI_Document::get($this, $documentid); + } + } + return $results; + } + + /** + * This returns a session object based on a session id. + * + * @author KnowledgeTree Team + * @access public + * @param string $session The sesssion id + * @param string $ip The users ip address + * @param string $app The originating application type Webservices|Webdav|Webapp + * @return object $session_object SUCCESS - The KTAPI_Session object | FAILURE - an error object + */ + public function & get_active_session($session, $ip=null, $app='ws') + { + if (!is_null($this->session)) + { + $error = new PEAR_Error('A session is currently active.'); + return $error; + } + + $session_object = &KTAPI_UserSession::get_active_session($this, $session, $ip, $app); + + if (is_null($session_object) || PEAR::isError($session_object)) + { + $error = new PEAR_Error('Session is invalid'); + return $error; + } + + $this->session = &$session_object; + return $session_object; + } + + /** + * Creates a session and returns the session object based on authentication credentials. + * + * @author KnowledgeTree Team + * @access public + * @param string $username The users username + * @param string $password The password of the user + * @param string $ip The users ip address + * @param string $app The originating application type Webservices|Webdav|Webapp + * @return object $session SUCCESS - The KTAPI_Session object | FAILURE - an error object + */ + public function & start_session($username, $password, $ip=null, $app='ws') + { + if (!is_null($this->session)) + { + $error = new PEAR_Error('A session is currently active.'); + return $error; + } + + $session = &KTAPI_UserSession::start_session($this, $username, $password, $ip, $app); + if (is_null($session)) + { + $error = new PEAR_Error('Session is null.'); + return $error; + } + if (PEAR::isError($session)) + { + $error = new PEAR_Error('Session is invalid. ' . $session->getMessage()); + return $error; + } + + $this->session = &$session; + return $session; + } + + /** + * start a root session. + * + * @author KnowledgeTree Team + * @access public + * @return object $session The KTAPI_SystemSession + */ + public function & start_system_session($username = null) + { + if(is_null($username)) + { + $user = User::get(1); + } else { + $user = User::getByUserName($username); + } + + if(PEAR::isError($user)) { + return new PEAR_Error('Username invalid'); + } + + $session = & new KTAPI_SystemSession($this, $user); + $this->session = &$session; + + return $session; + } + + /** + * Starts an anonymous session. + * + * @author KnowledgeTree Team + * @param string $ip The users ip address + * @return object $session SUCCESS - The KTAPI_Session object | FAILURE - an error object + */ + function &start_anonymous_session($ip=null) + { + if (!is_null($this->session)) + { + $error = new PEAR_Error('A session is currently active.'); + return $error; + } + + $session = &KTAPI_AnonymousSession::start_session($this, $ip); + if (is_null($session)) + { + $error = new PEAR_Error('Session is null.'); + return $error; + } + if (PEAR::isError($session)) + { + $error = new PEAR_Error('Session is invalid. ' . $session->getMessage()); + return $error; + } + + $this->session = &$session; + return $session; + } + + function session_logout() + { + $this->session->logout(); + $this->session = null; + } + + /** + * Gets the root folder. + * Root folder id is always equal to '1' + * + * @author KnowledgeTree Team + * @access public + * @return object $folder The KTAPI_Folder object + */ + public function &get_root_folder() + { + $folder = $this->get_folder_by_id(1); + return $folder; + } + + /** + * Obtains the folder using a folder id. + * + * @author KnowledgeTree Team + * @access public + * @param integer $folderid The id of the folder + * @return object $session SUCCESS - The KTAPI_Folder object | FAILURE - an error object + */ + public function &get_folder_by_id($folderid) + { + if (is_null($this->session)) + { + $error = new PEAR_Error('A session is not active'); + return $error; + } + + $folder = KTAPI_Folder::get($this, $folderid); + return $folder; + } + + /** + * Gets the the folder object based on the folder name + * + * @author KnowledgeTree Team + * @access public + * @param string $foldername The folder name + * @return object $folder The KTAPI_Folder object + */ + public function &get_folder_by_name($foldername, $parentId = 1) + { + $folder = KTAPI_Folder::_get_folder_by_name($this, $foldername, $parentId); + return $folder; + } + + /** + * This returns a refererence to a document based on document id. + * + * @author KnowledgeTree Team + * @access public + * @param integer $documentid The document id + * @return object $document The KTAPI_Document object + */ + public function &get_document_by_id($documentid) + { + $document = KTAPI_Document::get($this, $documentid); + return $document; + } + + /** + * This returns a document type id based on the name or an error object. + * + * @author KnowledgeTree Team + * @access public + * @param string $documenttype The document type + * @return integer|object $result SUCCESS - the document type id | FAILURE - an error object + */ + public function get_documenttypeid($documenttype) + { + $sql = array("SELECT id FROM document_types_lookup WHERE name=? and disabled=0", $documenttype); + $row = DBUtil::getOneResult($sql); + if (is_null($row) || PEAR::isError($row)) + { + $result = new KTAPI_DocumentTypeError(KTAPI_ERROR_DOCUMENT_TYPE_INVALID, $row); + } + else + { + $result = $row['id']; + } + return $result; + } + + /** + * Returns the id for a link type or an error object. + * + * @author KnowledgeTree Team + * @access public + * @param string $linktype The link type + * @return integer|object $result SUCCESS - the link type id | FAILURE - an error object + */ + public function get_link_type_id($linktype) + { + $sql = array("SELECT id FROM document_link_types WHERE name=?",$linktype); + $row = DBUtil::getOneResult($sql); + if (is_null($row) || PEAR::isError($row)) + { + $result = new PEAR_Error(KTAPI_ERROR_DOCUMENT_LINK_TYPE_INVALID); + } + else + { + $result = $row['id']; + } + return $result; + } + + /** + * Returns an array of document types or an error object. + * + * @author KnowledgeTree Team + * @access public + * @return array|object $results SUCCESS - the array of document types | FAILURE - an error object + */ + public function get_documenttypes() + { + $sql = "SELECT name FROM document_types_lookup WHERE disabled=0"; + $rows = DBUtil::getResultArray($sql); + if (is_null($rows) || PEAR::isError($rows)) + { + $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); + } + else + { + $results = array(); + foreach($rows as $row) + { + $results[] = $row['name']; + } + } + return $results; + } + + /** + * Returns an array of document link types or an error object. + * + * @author KnowledgeTree Team + * @access public + * @return array|object $results SUCCESS - the array of document link types | FAILURE - an error object + */ + public function get_document_link_types() + { + $sql = "SELECT name FROM document_link_types order by name"; + $rows = DBUtil::getResultArray($sql); + if (is_null($rows) || PEAR::isError($rows)) + { + $response['status_code'] = 1; + if(is_null($rows)) + { + $response['message'] = "No types"; + } else { + $response['message'] = $rows->getMessage(); + } + + return $response; + } + else + { + $results = array(); + foreach($rows as $row) + { + $results[] = $row['name']; + } + } + $response['status_code'] = 0; + $response['results'] = $results; + return $response; + } + + /** + * This should actually not be in ktapi, but in webservice + * This method gets metadata fieldsets based on the document type + * + * @author KnowledgeTree Team + * @access public + * @param string $document_type The type of document + * @return mixed Error object|SOAP object|Array of fieldsets + */ + public function get_document_type_metadata($document_type='Default') + { + // now get document type specifc ids + $typeid =$this->get_documenttypeid($document_type); + + if (is_a($typeid, 'KTAPI_DocumentTypeError')) + { + return $typeid; + } + + if (is_null($typeid) || PEAR::isError($typeid)) + { + $response['message'] = $typeid->getMessage(); + return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $response); + } + + $doctype_ids = KTFieldset::getForDocumentType($typeid, array('ids' => false)); + if (is_null($doctype_ids) || PEAR::isError($doctype_ids)) + { + $response['message'] = $generic_ids->getMessage(); + return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $response); + } + + // first get generic ids + $generic_ids = KTFieldset::getGenericFieldsets(array('ids' => false)); + if (is_null($generic_ids) || PEAR::isError($generic_ids)) + { + $response['message'] = $generic_ids->getMessage(); + return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $response); + } + + // lets merge the results + $fieldsets = kt_array_merge($generic_ids, $doctype_ids); + + $results = array(); + + foreach ($fieldsets as $fieldset) + { + if ($fieldset->getIsConditional()) { /* this is not implemented...*/ continue; } + + $fields = $fieldset->getFields(); + $result = array( + 'fieldset' => $fieldset->getName(), + 'description' => $fieldset->getDescription() + ); + + $fieldsresult = array(); + + foreach ($fields as $field) + { + $value = 'n/a'; + + + //$controltype = 'string'; + + // Replace with true + $controltype = strtolower($field->getDataType()); + if ($field->getHasLookup()) + { + $controltype = 'lookup'; + if ($field->getHasLookupTree()) + { + $controltype = 'tree'; + } + } + $options = array(); + + if ($field->getInetLookupType() == 'multiwithcheckboxes' || $field->getInetLookupType() == 'multiwithlist') { + $controltype = 'multiselect'; + } + + + switch ($controltype) + { + case 'lookup': + $selection = KTAPI::get_metadata_lookup($field->getId()); + break; + case 'tree': + $selection = KTAPI::get_metadata_tree($field->getId()); + break; + case 'large text': + $options = array( + 'ishtml' => $field->getIsHTML(), + 'maxlength' => $field->getMaxLength() + ); + $selection= array(); + break; + case 'multiselect': + $selection = KTAPI::get_metadata_lookup($field->getId()); + $options = array( + 'type' => $field->getInetLookupType() + ); + break; + default: + $selection= array(); + } + + + $fieldsresult[] = array( + 'name' => $field->getName(), + 'required' => $field->getIsMandatory(), + 'value' => $value, + 'description' => $field->getDescription(), + 'control_type' => $controltype, + 'selection' => $selection, + 'options' => $options + ); + } + $result['fields'] = $fieldsresult; + $results [] = $result; + } + + return $results; + } + + /** + * Returns an array of username/name combinations or an error object. + * + * @author KnowledgeTree Team + * @access public + * @return array|object $results SUCCESS - the array of all username/name combinations | FAILURE - an error object + */ + public function get_users() + { + $sql = "SELECT username, name FROM users WHERE disabled=0"; + $rows = DBUtil::getResultArray($sql); + if (is_null($rows) || PEAR::isError($rows)) + { + $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); + } + else + { + $results = $rows; + } + return $results; + } + + /** + * This returns an array for a metadata tree lookup or an error object. + * + * @author KnowledgeTree Team + * @access public + * @param integer $fieldid The field id to get metadata for + * @return array|object $results SUCCESS - the array of metedata for the field | FAILURE - an error object + */ + public function get_metadata_lookup($fieldid) + { + $sql = "SELECT name FROM metadata_lookup WHERE disabled=0 AND document_field_id=$fieldid ORDER BY name"; + $rows = DBUtil::getResultArray($sql); + if (is_null($rows) || PEAR::isError($rows)) + { + $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); + } + else + { + $results = array(); + foreach($rows as $row) + { + $results[] = $row['name']; + } + } + return $results; + } + + /** + * This returns a metadata tree or an error object. + * + * @author KnowledgeTree Team + * @access private + * @param integer $fieldid The field id of the document to get data for + * @param integer $parentid The id of the parent of the metadata tree + * @return array|object $results SUCCESS - the array of metadata for the field | FAILURE - an error object + */ + private function _load_metadata_tree($fieldid, $parentid=0) + { + $results = KTAPI::get_metadata_lookup($fieldid); + return $results; + /* + $sql = "SELECT id, name FROM metadata_lookup_tree WHERE document_field_id=$fieldid AND metadata_lookup_tree_parent=$parentid"; + $rows = DBUtil::getResultArray($sql); + if (is_null($rows) || PEAR::isError($rows)) + { + return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR); + } + $results=array(); + foreach($rows as $row) + { + $result=array( + 'name' => $row['name'], + 'children' => load($fieldid, $row['id']) + ); + $results[] = $result; + } + return $results;*/ + } + + /** + * This returns a metadata tree or an error object. + * + * @author KnowledgeTree Team + * @access public + * @param integer $fieldid The id of the tree field to get the metadata for + * @return array|object $results SUCCESS - the array of metadata for the field | FAILURE - an error object + */ + public function get_metadata_tree($fieldid) + { + $results = KTAPI::_load_metadata_tree($fieldid); + return $results; + } + + /** + * Returns a list of active workflows or an error object. + * + * @author KnowledgeTree Team + * @access public + * @return array|object $results SUCCESS - the array of active workflows | FAILURE - an error object + */ + public function get_workflows() + { + $sql = "SELECT name FROM workflows WHERE enabled=1"; + $rows=DBUtil::getResultArray($sql); + if (is_null($rows) || PEAR::isError($rows)) + { + $results = new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $rows); + } + else + { + $results = array(); + foreach($rows as $row) + { + $results[] = $row['name']; + } + } + return $results; + } + + /** + * Get the users subscriptions + * + * @author KnowledgeTree Team + * @access public + * @param string $filter + * @return array of Subscription + */ + public function getSubscriptions($filter=null) + { + $user = $this->get_user(); + $userId = $user->getID(); + + $subscriptions = SubscriptionManager::listSubscriptions($userId); + + return $subscriptions; + } + + /** + * Perform a bulk action on a list of folders and documents + * Available actions are copy, move, delete, archive, checkout, undo_checkout and immute. + * + * + * $ktapi = new KTAPI(); + * $session = $ktapi->start_system_session(); + * + * $items = array(); + * $items['documents'][] = $document_id; + * $items['folders'][] = $folder_id; + * + * $response = $ktapi->performBulkAction('move', $items, 'Reason for moving', $target_folder_id); + * if($response['status_code'] != 0) return 'ERROR'; + * + * + * + * @author KnowledgeTree Team + * @access public + * @param string $action The action to be performed + * @param array $items A list of id's and item type in the format array('documents' => array(1,6), 'folders' => array(3,4)) + * @param string $reason The reason for performing the action - only immute does not require a reason. + * @param integer $target_folder_id The id of the target folder if required - copy and move require this. + * @return array The response array. On success response['results'] will be empty | contain an array of failed items. + */ + public function performBulkAction($action, $items, $reason = '', $target_folder_id = null, + $sig_username = '', $sig_password = '') + { + // NOTE at the moment this checks for the electronic signature on ANY bulk action + // this is fine for now as the only actions defined are: + // copy, move, delete, archive, checkout, undo_checkout and immute + // ALL of which require signature checking when turned on + // IF you are adding more actions. be sure they require signature checking + // or EXCLUDE them from the check to prevent them being affected + $response = $this->_check_electronic_signature($target_folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.permissions_change'); + if ($response['status_code'] == 1) return $response; + + $response['status_code'] = 1; + + if(!is_array($items)){ + $response['message'] = sprintf(_kt("The list of id's must be an array of format array('documents' => array(1,2), 'folders' => array(2,3)). Received: %s") , $items); + return $response; + } + + if(empty($items)){ + $response['message'] = _kt('No items found to perform the action on.'); + return $response; + } + + if(!is_string($action)){ + $response['message'] = sprintf(_kt("The bulk action to perform must be a string. Received: %s") , $action); + return $response; + } + + // Check that the action exists in the bulk actions class + $bulkActions = new ReflectionClass('KTAPI_BulkActions'); + $methods = $bulkActions->getMethods(); + + $exists = false; + foreach ($methods as $method){ + if($method->getName() == $action){ + $actionMethod = $method; + $exists = true; + break; + } + } + + if(!$exists) { + $response['message'] = sprintf(_kt("The requested action has not been implemented: %s") , $action); + return $response; + } + + // Create the document and folder objects + $objects = array(); + if(isset($items['folders'])){ + foreach($items['folders'] as $item) { + $folder = $this->get_folder_by_id($item); + $objects[] = $folder; + } + } + + if(isset($items['documents'])){ + foreach($items['documents'] as $item) { + $document = $this->get_document_by_id($item); + $objects[] = $document; + } + } + + if(empty($objects)){ + $response['message'] = _kt('No folder or document items found to perform the action on.'); + return $response; + } + + // perform the action + $ktapi_bulkactions = new KTAPI_BulkActions($this); + + // Get target folder object if required + if(in_array($action, array('move', 'copy'))){ + if(!is_int($target_folder_id) || empty($target_folder_id)){ + $response['message'] = _kt('No target folder has been specified.'); + return $response; + } + $target = $this->get_folder_by_id($target_folder_id); + + // call the action + $result = $ktapi_bulkactions->$action($objects, $target, $reason); + }else if($action == 'immute'){ + // call the action + $result = $ktapi_bulkactions->$action($objects); + }else { + // call the action + $result = $ktapi_bulkactions->$action($objects, $reason); + } + + if(PEAR::isError($result)) { + $response['message'] = sprintf(_kt("The bulk action failed: %s") , $result->getMessage()); + return $response; + } + + // if failed items are returned - flatten the objects + if(is_array($result)){ + if(isset($result['docs'])){ + foreach ($result['docs'] as $key => $item){ + $result['docs'][$key]['object'] = $item['object']->get_detail(); + } + } + if(isset($result['folders'])){ + foreach ($result['folders'] as $key => $item){ + $result['folders'][$key]['object'] = $item['object']->get_detail(); + } + } + } + + // For a successful action + $response['status_code'] = 0; + $response['results'] = $result; + return $response; + } + + /* *** ACL Roles and Role_Allocation *** */ + + /** + * Get a list of available roles + * + * @author KnowledgeTree Team + * @access public + * @param string $filter The beginning letter(s) of the role being searched for + * @return array Response. + */ + public function get_roles($filter = null) + { + $response['status_code'] = 1; + + // check the filter + if(!empty($filter)) { + if(!is_string($filter)){ + $response['message'] = _kt('Filter should be a string.'); + return $response; + } + + // escape filter string - prevent sql injection + $filter = addslashes($filter); + $filter = "name like '{$filter}%'"; + } + + $listing = KTAPI_Role::getList($filter); + + if(PEAR::isError($listing)){ + $response['message'] = $listing->getMessage(); + return $response; + } + + // flatten role objects + $roles = array(); + foreach ($listing as $ktapi_roll) { + $roles[] = array( + 'id' => $ktapi_roll->getId(), + 'name' => $ktapi_roll->getName(), + ); + } + + $response['status_code'] = 0; + $response['results'] = $roles; + return $response; + } + + /** + * Get a role using its id + * + * @author KnowledgeTree Team + * @access public + * @param integer $role_id The id of the role + * @return array Response + */ + public function get_role_by_id($role_id) + { + $response['status_code'] = 1; + if(!is_numeric($role_id)){ + $response['message'] = _kt('Role id must be numeric.'); + return $response; + + } + + $role = KTAPI_Role::getById($role_id); + + if(PEAR::isError($role)) { + $response['message'] = $role->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['results'] = array( + 'id' => $role->getId(), + 'name' => $role->getName() + ); + + return $response; + } + + /** + * Get a role based on its name + * + * @author KnowledgeTree Team + * @access public + * @param string $role_name The name of the role + * @return array Response + */ + public function get_role_by_name($role_name) + { + $response['status_code'] = 1; + if(!is_string($role_name)){ + $response['message'] = _kt('Role name must be a string.'); + return $response; + + } + + $role = KTAPI_Role::getByName($role_name); + + if(PEAR::isError($role)) { + $response['message'] = $role->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['results'] = array( + 'id' => $role->getId(), + 'name' => $role->getName() + ); + + return $response; + } + + /** + * Get the list of role allocations on a folder + * + * @author KnowledgeTree Team + * @access public + * @param integar $folder_id The id of the folder + * @return array Response + */ + public function get_role_allocation_for_folder($folder_id) + { + $response['status_code'] = 1; + if(!is_numeric($folder_id)){ + $response['message'] = _kt('Folder id must be numeric.'); + return $response; + + } + + $folder = $this->get_folder_by_id($folder_id); + + if(PEAR::isError($folder)) { + $response['message'] = $folder->getMessage(); + return $response; + } + + $role_allocation = $folder->getRoleAllocation(); + + // flatten object + $membership = $role_allocation->getMembership(); + + $response['status_code'] = 0; + $response['results'] = $membership; + return $response; + } + + /** + * Add a user to a role on a folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @param integer $role_id The id of the role being modified + * @param integer $user_id The id of the user to be added + * @return array Response + */ + public function add_user_to_role_on_folder($folder_id, $role_id, $user_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.role_allocations_change'); + if ($response['status_code'] == 1) return $response; + + $response['status_code'] = 1; + if(!is_numeric($user_id)){ + $response['message'] = _kt('User id must be numeric.'); + return $response; + } + $member['users'][] = $user_id; + + return $this->add_members_to_role_on_folder($folder_id, $role_id, $member, $sig_username, $sig_password, $reason); + } + + /** + * Add a group to a role on a folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @param integer $role_id The id of the role being modified + * @param integer $group_id The id of the group to be added + * @return array Response + */ + public function add_group_to_role_on_folder($folder_id, $role_id, $group_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.role_allocations_change'); + if ($response['status_code'] == 1) return $response; + + $response['status_code'] = 1; + if(!is_numeric($group_id)){ + $response['message'] = _kt('Group id must be numeric.'); + return $response; + } + $member['groups'][] = $group_id; + + return $this->add_members_to_role_on_folder($folder_id, $role_id, $member, $sig_username, $sig_password, $reason); + } + + /** + * Remove a user from a role on a folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @param integer $role_id The id of the role being modified + * @param integer $user_id The id of the user to be removed + * @return array Response + */ + public function remove_user_from_role_on_folder($folder_id, $role_id, $user_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.role_allocations_change'); + if ($response['status_code'] == 1) return $response; + + $response['status_code'] = 1; + if(!is_numeric($user_id)){ + $response['message'] = _kt('User id must be numeric.'); + return $response; + } + $member['users'][] = $user_id; + + return $this->remove_members_from_role_on_folder($folder_id, $role_id, $member, $sig_username, $sig_password, $reason); + } + + /** + * Remove a group from a role on a folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @param integer $role_id The id of the role being modified + * @param integer $group_id The id of the group to be removied + * @return array Response + */ + public function remove_group_from_role_on_folder($folder_id, $role_id, $group_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.role_allocations_change'); + if ($response['status_code'] == 1) return $response; + + $response['status_code'] = 1; + if(!is_numeric($group_id)){ + $response['message'] = _kt('Group id must be numeric.'); + return $response; + } + $member['groups'][] = $group_id; + + return $this->remove_members_from_role_on_folder($folder_id, $role_id, $member, $sig_username, $sig_password, $reason); + } + + /** + * Remove members (user, group) from a role on a folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @param integer $role_id The id of the role being modified + * @param array $members The list of id's of members to be removed - array('users' => array(1,2), 'groups' => array(2,4)) + * @return array Response + */ + public function remove_members_from_role_on_folder($folder_id, $role_id, $members, $sig_username = '', $sig_password = '', $reason = '') + { + return $this->update_members_on_role_on_folder($folder_id, $role_id, $members, 'remove', $sig_username, $sig_password, $reason); + } + + /** + * Add members (user, group) to a role on a folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @param integer $role_id The id of the role being modified + * @param array $members The list of id's of members to be added - array('users' => array(1,2), 'groups' => array(2,4)) + * @return array Response + */ + public function add_members_to_role_on_folder($folder_id, $role_id, $members, $sig_username = '', $sig_password = '', $reason = '') + { + return $this->update_members_on_role_on_folder($folder_id, $role_id, $members, 'add', $sig_username, $sig_password, $reason); + } + + /** + * Add / remove members (user, group) to / from a role on a folder + * + * @author KnowledgeTree Team + * @access private + * @param integer $folder_id The folder id + * @param integer $role_id The id of the role being modified + * @param array $members The list of id's of members to be updated - array('users' => array(1,2), 'groups' => array(2,4)) + * @param string $update The type of modification - add | remove + * @return array Response + */ + private function update_members_on_role_on_folder($folder_id, $role_id, $members, $update = 'add', + $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.role_allocations_change'); + if ($response['status_code'] == 1) return $response; + + // Check input information + $response['status_code'] = 1; + if(!is_numeric($folder_id)){ + $response['message'] = _kt('Folder id must be numeric.'); + return $response; + } + + if(!is_numeric($role_id)){ + $response['message'] = _kt('Role id must be numeric.'); + return $response; + } + + if(!is_array($members)){ + $response['message'] = _kt("The list of members must be in the format: array('users' => array(1,2), 'groups' => array(2,4)).')"); + return $response; + } + + if(!isset($members['users']) && !isset($members['groups'])){ + $response['message'] = _kt("The list of members must be in the format: array('users' => array(1,2), 'groups' => array(2,4)).')"); + return $response; + } + + // Get folder and role objects + $folder = $this->get_folder_by_id($folder_id); + if(PEAR::isError($folder)) { + $response['message'] = $folder->getMessage(); + return $response; + } + + $role = KTAPI_Role::getById($role_id); + if(PEAR::isError($role)) { + $response['message'] = $role->getMessage(); + return $response; + } + + // Get the role allocation for the folder + $role_allocation = $folder->getRoleAllocation(); + + // Get member objects and add them to the role + // Users + if(isset($members['users'])){ + + foreach($members['users'] as $user_id){ + // Get the user object + $member = KTAPI_User::getById($user_id); + + if(PEAR::isError($member)) { + $response['message'] = $member->getMessage(); + return $response; + } + + // Add to / remove from the role + $role_allocation->$update($role, $member); + } + } + + // Groups + if(isset($members['groups'])){ + + foreach($members['groups'] as $group_id){ + // Get the group object + $member = KTAPI_Group::getById($group_id); + + if(PEAR::isError($member)) { + $response['message'] = $member->getMessage(); + return $response; + } + + // Add to / remove from the role + $role_allocation->$update($role, $member); + } + } + + // Save the new allocations + $role_allocation->save(); + + $response['status_code'] = 0; + return $response; + } + + /** + * Check if a user or group is allocated to a role on the folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @param integer $role_id The id of the role being checked + * @param integer $member_id The id of the user or group + * @param string $member_type user | group + * @return array Response + */ + public function is_member_in_role_on_folder($folder_id, $role_id, $member_id, $member_type = 'user') + { + $response['status_code'] = 1; + + // Get folder and role objects + $folder = $this->get_folder_by_id($folder_id); + if(PEAR::isError($folder)) { + $response['message'] = $folder->getMessage(); + return $response; + } + + $role = KTAPI_Role::getById($role_id); + if(PEAR::isError($role)) { + $response['message'] = $role->getMessage(); + return $response; + } + + // get the member object + switch($member_type){ + case 'user': + $member = KTAPI_User::getById($member_id); + break; + case 'group': + $member = KTAPI_Group::getById($member_id); + break; + default: + $response['message'] = _kt('Unrecognised member type. Must be group or user.'); + return $response; + } + + if(PEAR::isError($member)) { + $response['message'] = $member->getMessage(); + return $response; + } + + // Get the role allocation for the folder + $role_allocation = $folder->getRoleAllocation(); + $check = $role_allocation->doesRoleHaveMember($role, $member); + $result = ($check) ? 'YES' : 'NO'; + + $response['status_code'] = 0; + $response['results'] = $result; + return $response; + } + + /** + * Removes all members (users, groups) from all roles or from the specified role on the folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @param integer $role_id Optional. The id of the role being reset. + * @return array Response + */ + public function remove_all_role_allocation_from_folder($folder_id, $role_id = null, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.role_allocations_change'); + if ($response['status_code'] == 1) return $response; + + $response['status_code'] = 1; + + // Get folder and role objects + $folder = $this->get_folder_by_id($folder_id); + if(PEAR::isError($folder)) { + $response['message'] = $folder->getMessage(); + return $response; + } + + $role = null; + if(!empty($role_id)){ + $role = KTAPI_Role::getById($role_id); + if(PEAR::isError($role)) { + $response['message'] = $role->getMessage(); + return $response; + } + } + + // Get the role allocation for the folder + $role_allocation = $folder->getRoleAllocation(); + $role_allocation->removeAll($role); + $role_allocation->save(); + + $response['status_code'] = 0; + $response['results'] = $result; + return $response; + } + + /** + * Overrides the parents role allocation + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @return array Response + */ + public function override_role_allocation_on_folder($folder_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.role_allocations_change'); + if ($response['status_code'] == 1) return $response; + + $response['status_code'] = 1; + + // Get folder object + $folder = $this->get_folder_by_id($folder_id); + if(PEAR::isError($folder)) { + $response['message'] = $folder->getMessage(); + return $response; + } + + // Get the role allocation for the folder + $role_allocation = $folder->getRoleAllocation(); + $result = $role_allocation->overrideAllocation(); + + $response['status_code'] = 0; + $response['results'] = $result; + return $response; + } + + /** + * Inherits the role allocation from the parent + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The folder id + * @return array Response + */ + public function inherit_role_allocation_on_folder($folder_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.role_allocations_change'); + if ($response['status_code'] == 1) return $response; + + $response['status_code'] = 1; + + // Get folder object + $folder = $this->get_folder_by_id($folder_id); + if(PEAR::isError($folder)) { + $response['message'] = $folder->getMessage(); + return $response; + } + + // Get the role allocation for the folder + $role_allocation = $folder->getRoleAllocation(); + $result = $role_allocation->inheritAllocation(); + + $response['status_code'] = 0; + $response['results'] = $result; + return $response; + } + + + /* *** Refactored web services functions *** */ + + /** + * Creates a new anonymous session. + * + * @author KnowledgeTree Team + * @access public + * @param string $ip The users IP address + * @return array Response 'results' contain the session id | 'message' contains the error message on failure + */ + function anonymous_login($ip=null) + { + $session = $this->start_anonymous_session($ip); + if(PEAR::isError($session)){ + $response['status_code'] = 1; + $response['message']= $session->getMessage(); + return $response; + } + + $session= $session->get_session(); + $response['results'] = $session; + $response['message'] = ''; + + $response['status_code'] = 0; + return $response; + } + + /** + * Creates a new session for the user. + * + * @author KnowledgeTree Team + * @access public + * @param string $username The users username + * @param string $password The users password + * @param string $ip Optional. The users IP address + * @return array Response 'results' contain the session id | 'message' contains the error message on failure + */ + function login($username, $password, $ip=null) + { + $session = $this->start_session($username,$password, $ip); + if(PEAR::isError($session)){ + $response['status_code'] = 1; + $response['message']= $session->getMessage(); + return $response; + } + + $session = $session->get_session(); + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $session; + return $response; + } + + /** + * Closes an active session. + * + * @author KnowledgeTree Team + * @access public + * @return array Response Empty on success | 'message' contains the error message on failure + */ + function logout() + { + $session = &$this->get_session(); + if(PEAR::isError($session)){ + $response['status_code'] = 1; + $response['message']= $session->getMessage(); + return $response; + } + $session->logout(); + + $response['status_code'] = 0; + return $response; + } + + /** + * Returns the folder details for a given folder id. + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The id of the folder + * @return array Response 'results' contains kt_folder_detail | 'message' contains error message on failure + */ + function get_folder_detail($folder_id) + { + $folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $folder->get_detail(); + return $response; + } + + /** + * Retrieves all shortcuts linking to a specific folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The id of the folder + * @return array Response 'results' contains kt_folder_shortcuts | 'message' contains error message on failure + * + */ + function get_folder_shortcuts($folder_id) + { + $folder = $this->get_folder_by_id($folder_id); + if(PEAR::isError($folder)){ + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + + $shortcuts = $folder->get_shortcuts(); + if(PEAR::isError($shortcuts)){ + $response['status_code'] = 1; + $response['message']= $shortcuts->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $shortcuts; + return $response; + } + + /** + * Returns folder detail given a folder name which could include a full path. + * + * @author KnowledgeTree Team + * @access public + * @param string $folder_name The name of the folder + * @return array Response 'results' contains kt_folder_detail | 'message' contains error message on failure + */ + function get_folder_detail_by_name($folder_name) + { + $folder = &$this->get_folder_by_name($folder_name); + if(PEAR::isError($folder)){ + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $folder->get_detail(); + return $response; + } + + /** + * Returns the contents of a folder - list of contained documents and folders + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The id of the folder + * @param integer $depth The depth to display - 1 = direct contents, 2 = include contents of the contained folders, etc + * @param string $what Filter on what should be returned, takes a combination of the following: D = documents, F = folders, S = shortcuts + * @return array Response 'results' contains kt_folder_contents | 'message' contains error message on failure + */ + function get_folder_contents($folder_id, $depth=1, $what='DFS') + { + $folder = &$this->get_folder_by_id($folder_id); + if(PEAR::isError($folder)){ + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + $listing = $folder->get_listing($depth, $what); + + $contents = array( + 'folder_id' => $folder_id+0, + 'folder_name'=>$folder->get_folder_name(), + 'full_path'=>$folder->get_full_path(), + 'items'=>$listing + ); + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $contents; + + return $response; + } + + /** + * Creates a new folder inside the given folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The id of the parent folder + * @param string $folder_name The name of the new folder + * @return array Response 'results' contains kt_folder_detail | 'message' contains error message on failure + */ + function create_folder($folder_id, $folder_name, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.add'); + if ($response['status_code'] == 1) return $response; + + $folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + $newfolder = $folder->add_folder($folder_name); + if (PEAR::isError($newfolder)) + { + $response['status_code'] = 1; + $response['message']= $newfolder->getMessage(); + return $response; + } + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $newfolder->get_detail(); + return $response; + } + + /** + * Creates a shortcut to an existing folder + * + * @author KnowledgeTree Team + * @access public + * @param integer $target_folder_id Id of the folder containing the shortcut. + * @param integer $source_folder_id Id of the folder to which the shortcut will point. + * @return array Response 'results' contains kt_shortcut_detail | 'message' contains error message on failure + */ + function create_folder_shortcut($target_folder_id, $source_folder_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.create_shortcut'); + if ($response['status_code'] == 1) return $response; + + $folder = &$this->get_folder_by_id($target_folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + + $source_folder = &$this->get_folder_by_id($source_folder_id); + if (PEAR::isError($source_folder)) + { + $response['status_code'] = 1; + $response['message']= $source_folder->getMessage(); + return $response; + } + + $shortcut = &$folder->add_folder_shortcut($source_folder_id); + if (PEAR::isError($shortcut)) + { + $response['status_code'] = 1; + $response['message']= $shortcut->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $shortcut->get_detail(); + return $response; + } + + /** + * Creates a shortcut to an existing document + * + * @author KnowledgeTree Team + * @access public + * @param integer $target_folder_id Id of the parent folder containing the shortcut + * @param integer $source_document_id Id of the document to which the shortcut will point + * @return array Response 'results' contains kt_document_detail | 'message' contains error message on failure + */ + function create_document_shortcut($target_folder_id, $source_document_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.create_shortcut'); + if ($response['status_code'] == 1) return $response; + + $folder = &$this->get_folder_by_id($target_folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + + $source_document = &$this->get_document_by_id($source_document_id); + if (PEAR::isError($source_document)) + { + $response['status_code'] = 1; + $response['message']= $source_document->getMessage(); + return $response; + } + + $shortcut = &$folder->add_document_shortcut($source_document_id); + if (PEAR::isError($shortcut)) + { + $response['status_code'] = 1; + $response['message']= $shortcut->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $shortcut->get_detail(); + return $response; + } + + /** + * Deletes a folder. + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The id of the folder to delete + * @param string $reason The reason for performing the deletion + * @return array Response | 'message' contains error message on failure + */ + function delete_folder($folder_id, $reason, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.delete'); + if ($response['status_code'] == 1) return $response; + + $folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + + $result = $folder->delete($reason); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message']= $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + return $response; + } + + /** + * Renames a folder. + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The id of the folder + * @param string $newname The new name of the folder + * @return array Response | 'message' contains error message on failure + */ + function rename_folder($folder_id, $newname, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($folder_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.rename'); + if ($response['status_code'] == 1) return $response; + + $folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message']= $folder->getMessage(); + return $response; + } + $result = $folder->rename($newname); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message']= $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + return $response; + } + + /** + * Makes a copy of a folder in another location. + * + * @author KnowledgeTree Team + * @access public + * @param integer $sourceid The id of the folder to be copied + * @param integer $targetid The id of the folder in which the copy should be placed + * @param string $reason The reason for performing the copy + * @return array Response | 'message' contains error message on failure + */ + function copy_folder($source_id, $target_id, $reason, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($source_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.copy'); + if ($response['status_code'] == 1) return $response; + + $src_folder = &$this->get_folder_by_id($source_id); + if (PEAR::isError($src_folder)) + { + $response['status_code'] = 1; + $response['message']= $src_folder->getMessage(); + return $response; + } + + $tgt_folder = &$this->get_folder_by_id($target_id); + if (PEAR::isError($tgt_folder)) + { + $response['status_code'] = 1; + $response['message']= $tgt_folder->getMessage(); + return $response; + } + + $result= $src_folder->copy($tgt_folder, $reason); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message']= $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + + if($this->version >= 2){ + $sourceName = $src_folder->get_folder_name(); + $targetPath = $tgt_folder->get_full_path(); + + $response['results'] = $this->get_folder_detail_by_name($targetPath . '/' . $sourceName); + return $response; + } + + return $response; + } + + /** + * Moves a folder to another location. + * + * @author KnowledgeTree Team + * @access public + * @param integer $sourceid The id of the folder to be moved + * @param integer $targetid The id of the folder into which the folder should be moved + * @param string $reason The reason for performing the move + * @return array Response | 'message' contains error message on failure + */ + function move_folder($source_id, $target_id, $reason, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($source_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.move'); + if ($response['status_code'] == 1) return $response; + + $src_folder = &$this->get_folder_by_id($source_id); + if (PEAR::isError($src_folder)) + { + $response['status_code'] = 1; + $response['message']= $src_folder->getMessage(); + return $response; + } + + $tgt_folder = &$this->get_folder_by_id($target_id); + if (PEAR::isError($tgt_folder)) + { + $response['status_code'] = 1; + $response['message']= $tgt_folder->getMessage(); + return $response; + } + + $result = $src_folder->move($tgt_folder, $reason); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message']= $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + + if($this->version >= 2){ + $response['results'] = $this->get_folder_detail($source_id); + return $response; + } + + return $response; + + } + + /** + * Returns a list of document types. + * + * @author KnowledgeTree Team + * @access public + * @return array Response 'results' contain kt_document_types_response | 'message' contains error message on failure + */ + public function get_document_types() + { + $result = $this->get_documenttypes(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message']= $result->getMessage(); + return $response; + } + + $response['status_code']= 0; + $response['results']= $result; + + return $response; + + } + + /** + * Returns a list of document link types - Attachment, Reference, etc + * + * @return array Response 'results' contain kt_document_link_types_response | 'message' contains error message on failure + */ + public function get_document_link_types_list() + { + $result = $this->get_document_link_types(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message']= $result->getMessage(); + + return $response; + } + + $response['status_code']= 0; + $response['results'] = $result; + + return $response; + + } + + /** + * Returns document details given a document_id. + * Details can be filtered using a combination of the following: M = metadata, L = links, T = workflow transitions, + * V = version history, H = transaction history + * + * @author KnowledgeTree Team + * @access public + * @param integer $document_id The id of the document + * @param string $detailstr Optional. Filter on the level of detail to return. + * @return array Response 'results' contain kt_document_detail | 'message' contains error message on failure + */ + public function get_document_detail($document_id, $detailstr='') + { + $document = $this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message']= $document->getMessage(); + return $response; + } + + $detail = $document->get_detail(); + if (PEAR::isError($detail)) + { + $response['status_code'] = 1; + $response['message']= $detail->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + + if ($this->version >= 2) + { + $detail['metadata'] = array(); + $detail['links'] = array(); + $detail['transitions'] = array(); + $detail['version_history'] = array(); + $detail['transaction_history'] = array(); + + if (stripos($detailstr,'M') !== false) + { + $response = $this->get_document_metadata($document_id); + $detail['metadata'] = $response['results']; + $detail['name'] = 'metadata'; + } + + if (stripos($detailstr,'L') !== false) + { + $response = $this->get_document_links($document_id); + $detail['links'] = $response['results']; + $detail['name'] = 'links'; + } + + if (stripos($detailstr,'T') !== false) + { + $response = $this->get_document_workflow_transitions($document_id); + $detail['transitions'] = $response['results'] ; + $detail['name'] = 'transitions'; + } + + if (stripos($detailstr,'V') !== false) + { + $response = $this->get_document_version_history($document_id); + $detail['version_history'] = $response['results']; + $detail['name'] = 'version_history'; + } + + if (stripos($detailstr,'H') !== false) + { + $response = $this->get_document_transaction_history($document_id); + $detail['transaction_history'] = $response['results']; + $detail['name'] = 'transaction_history'; + } + } + + $response['results'] = $detail; + return $response; + } + + /** + * Returns the document details given the filename of the document + * Details can be filtered using a combination of the following: M = metadata, L = links, T = workflow transitions, + * V = version history, H = transaction history + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The id of the folder in which to find the document + * @param string $filename The filename of the document + * @param string $detail Optional. Filter on the level of detail to return. + * @return array Response 'results' contain kt_document_detail | 'message' contains error message on failure + */ + public function get_document_detail_by_filename($folder_id, $filename, $detail='') + { + return $this->get_document_detail_by_name($folder_id, $filename, 'F', $detail); + } + + /** + * Returns the document details give the title of the document + * Details can be filtered using a combination of the following: M = metadata, L = links, T = workflow transitions, + * V = version history, H = transaction history + * + * @author KnowledgeTree Team + * @access public + * @param interger $folder_id The id of the folder in which to find the document + * @param string $title The title of the document + * @param string $detail Optional. Filter on the level of detail to return. + * @return array Response 'results' contain kt_document_detail | 'message' contains error message on failure + */ + public function get_document_detail_by_title($folder_id, $title, $detail='') + { + return $this->get_document_detail_by_name($folder_id, $title, 'T', $detail); + } + + /** + * Returns document detail given a document name which could include a full path. + * Details can be filtered using a combination of the following: M = metadata, L = links, T = workflow transitions, + * V = version history, H = transaction history + * + * @author KnowledgeTree Team + * @access public + * @param integer $folder_id The id of the folder in which to find the document + * @param string $document_name The name of the document + * @param string @what Optional. Defaults to T. The type of name - F = filename or T = title + * @param string $detail Optional. Filter on the level of detail to return. + * @return array Response 'results' contain kt_document_detail | 'message' contains error message on failure + */ + public function get_document_detail_by_name($folder_id, $document_name, $what='T', $detail='') + { + $response['status_code'] = 1; + if (empty($document_name)) + { + $response['message'] = 'Document_name is empty.'; + return $response; + } + + if (!in_array($what, array('T','F'))) + { + $response['message'] = 'Invalid what code'; + return $response; + } + + if ($folder_id < 1) $folder_id = 1; + $root = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($root)) + { + $response['message'] = $root->getMessage(); + return $response; + } + + if ($what == 'T') + { + $document = &$root->get_document_by_name($document_name); + } + else + { + $document = &$root->get_document_by_filename($document_name); + } + if (PEAR::isError($document)) + { + $response['message'] = $document->getMessage(); + return $response; + } + + return $this->get_document_detail($document->documentid, $detail); + } + + /** + * Returns the role allocation on the document + * + * @author KnowledgeTree Team + * @access public + * @author KnowledgeTree Team + * @access public + * @param integer $document_id The id of the document + * @return array Response + */ + public function get_role_allocation_for_document($document_id) + { + $document = $this->get_document_by_id($document_id); + if(PEAR::isError($document)){ + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $allocation = $document->getRoleAllocation(); + + $response['status_code'] = 0; + $response['results'] = $allocation->getMembership(); + return $response; + } + + /** + * Emails a document as an attachment or hyperlink to a list of users, groups or external email addresses. + * In the case of external addresses, if a hyperlink is used then a timed download link (via webservices) is sent allowing the recipient a window period in which to download the document. + * The period is set through the webservices config option webservice/downloadExpiry. Defaults to 30 minutes. + * + * @author KnowledgeTree Team + * @access public + * @param string $document_id The id of the document + * @param array $members The email recipients (users, groups, external) in the format: array('users' => array(1,2), 'groups' => array(3,1), 'external' => array('name@email.com')) + * @param string $comment Content to be appended to the email + * @param bool $attach TRUE if document is an attachment | FALSE if using a hyperlink to the document + * @return array Response + */ + public function email_document($document_id, $members, $content = '', $attach = true) + { + $response['status_code'] = 1; + if(!isset($members['users']) && !isset($members['groups']) && !isset($members['external'])){ + $response['message'] = _kt("No recipients were provided. The list of recipients should be in the format: array('users' => array(1,2), 'groups' => array(3,1), 'external' => array('name@email.com'))."); + return $response; + } + + $document = $this->get_document_by_id($document_id); + if(PEAR::isError($document)){ + $response['message'] = $document->getMessage(); + return $response; + } + + $recipients = array(); + + // Get member objects and add them to the role + // Users + if(isset($members['users'])){ + foreach($members['users'] as $user_id){ + // Get the user object + $member = KTAPI_User::getById($user_id); + + if(PEAR::isError($member)) { + $response['message'] = $member->getMessage(); + return $response; + } + + // Add to recipients list + $recipients[] = $member; + } + } + + // Groups + if(isset($members['groups'])){ + foreach($members['groups'] as $group_id){ + // Get the group object + $member = KTAPI_Group::getById($group_id); + + if(PEAR::isError($member)) { + $response['message'] = $member->getMessage(); + return $response; + } + + // Add to recipients list + $recipients[] = $member; + } + } + + // External recipients + if(isset($members['external'])){ + foreach ($members['external'] as $email_address){ + // Add to recipients list + $recipients[] = $member; + } + } + + $result = $document->email($recipients, $content, $attach); + + if (PEAR::isError($result)) { + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + return $response; + } + + /** + * Retrieves all shortcuts linking to a specific document + * + * @author KnowledgeTree Team + * @access public + * @param ing $document_id + * @return kt_document_shortcuts. + * + */ + public function get_document_shortcuts($document_id) + { + $document = $this->get_document_by_id($document_id); + if(PEAR::isError($document)){ + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $shortcuts = $document->get_shortcuts(); + if(PEAR::isError($shortcuts)){ + $response['status_code'] = 1; + $response['message'] = $shortcuts->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $shortcuts; + return $response; + } + + /** + * Adds a document to the repository. + * + * @author KnowledgeTree Team + * @access public + * @param int $folder_id + * @param string $title + * @param string $filename + * @param string $documenttype + * @param string $tempfilename + * @return kt_document_detail. + */ + public function add_document($folder_id, $title, $filename, $documenttype, $tempfilename, + $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.add'); + if ($response['status_code'] == 1) return $response; + + // we need to add some security to ensure that people don't frig the checkin process to access restricted files. + // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome. + $upload_manager = new KTUploadManager(); + if (!$upload_manager->is_valid_temporary_file($tempfilename)) + { + $response['status_code'] = 1; + $response['message'] = "Invalid temporary file: $tempfilename. Not compatible with $upload_manager->temp_dir."; + return $response; + } + + $folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message'] = $folder->getMessage(); + return $response; + } + + $document = &$folder->add_document($title, $filename, $documenttype, $tempfilename); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $document->get_detail(); + return $response; + } + + public function add_small_document_with_metadata($folder_id, $title, $filename, $documenttype, $base64, $metadata, $sysdata, + $sig_username = '', $sig_password = '', $reason = '') + { + $add_result = $this->add_small_document($folder_id, $title, $filename, $documenttype, $base64, + $sig_username, $sig_password, $reason); + + if($add_result['status_code'] != 0){ + return $add_result; + } + + $document_id = $add_result['results']['document_id']; + + $update_result = $this->update_document_metadata($document_id, $metadata, $sysdata, $sig_username, $sig_password, $reason); + if($update_result['status_code'] != 0){ + $this->delete_document($document_id, 'Rollback because metadata could not be added', false); + return $update_result; + } + + $document = $this->get_document_by_id($document_id); + $result = $document->removeUpdateNotification(); + if (PEAR::isError($result)) + { + // not much we can do, maybe just log! + } + $result = $document->mergeWithLastMetadataVersion(); + if (PEAR::isError($result)) + { + // not much we can do, maybe just log! + } + + return $update_result; + } + + public function add_document_with_metadata($folder_id, $title, $filename, $documenttype, $tempfilename, $metadata, $sysdata, + $sig_username = '', $sig_password = '', $reason = '') + { + $add_result = $this->add_document($folder_id, $title, $filename, $documenttype, $tempfilename, + $sig_username, $sig_password, $reason); + + if($add_result['status_code'] != 0){ + return $add_result; + } + + $document_id = $add_result['results']['document_id']; + + $update_result = $this->update_document_metadata($document_id, $metadata, $sysdata, $sig_username, $sig_password, $reason); + if($update_result['status_code'] != 0){ + $this->delete_document($document_id, 'Rollback because metadata could not be added', false); + return $update_result; + } + + $document = $this->get_document_by_id($document_id); + $result = $document->removeUpdateNotification(); + if (PEAR::isError($result)) + { + // not much we can do, maybe just log! + } + + $result = $document->mergeWithLastMetadataVersion(); + if (PEAR::isError($result)) + { + // not much we can do, maybe just log! + } + + return $update_result; + } + + + /** + * Find documents matching the document oem (integration) no + * + * @author KnowledgeTree Team + * @access public + * @param string $oem_no + * @param string $detail + * @return kt_document_collection_response + */ + public function get_documents_detail_by_oem_no($oem_no, $detail) + { + $documents = $this->get_documents_by_oem_no($oem_no); + + $collection = array(); + foreach($documents as $documentId) + { + $detail = $this->get_document_detail($documentId, $detail); + if ($detail['status_code'] != 0) + { + continue; + } + $collection[] = $detail->value; + } + + $response=array(); + $response['status_code'] = 0; + $response['message'] = empty($collection) ? _kt('No documents were found matching the specified document no') : ''; + $response['results'] = $collection; + return $collection; + } + + /** + * Adds a document to the repository. + * + * @author KnowledgeTree Team + * @access public + * @param int $folder_id + * @param string $title + * @param string $filename + * @param string $documenttype + * @param string $base64 + * @return kt_document_detail. + */ + public function add_small_document($folder_id, $title, $filename, $documenttype, $base64, + $sig_username = '', $sig_password = '', $reason = '') + { + $folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message'] = $folder->getMessage(); + return $response; + } + + $upload_manager = new KTUploadManager(); + $tempfilename = $upload_manager->store_base64_file($base64); + if (PEAR::isError($tempfilename)) + { + $reason = $tempfilename->getMessage(); + $response['status_code'] = 1; + $response['message'] = 'Cannot write to temp file: ' . $tempfilename . ". Reason: $reason"; + return $response; + } + + // simulate the upload + $tempfilename = $upload_manager->uploaded($filename,$tempfilename, 'A'); + + // add the document + $document = &$folder->add_document($title, $filename, $documenttype, $tempfilename); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $document->get_detail(); + return $response; + } + + /** + * Does a document checkin. + * + * @author KnowledgeTree Team + * @access public + * @param int $folder_id + * @param string $title + * @param string $filename + * @param string $documenttype + * @param string $tempfilename + * @return kt_document_detail. status_code can be KTWS_ERR_INVALID_SESSION, KTWS_ERR_INVALID_FOLDER, KTWS_ERR_INVALID_DOCUMENT or KTWS_SUCCESS + */ + public function checkin_document($document_id, $filename, $reason, $tempfilename, $major_update, + $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.check_in'); + if ($response['status_code'] == 1) return $response; + + // we need to add some security to ensure that people don't frig the checkin process to access restricted files. + // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome. + $upload_manager = new KTUploadManager(); + if (!$upload_manager->is_valid_temporary_file($tempfilename)) + { + $response['status_code'] = 1; + $response['message'] = 'Invalid temporary file'; + return $response; + } + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + // checkin + $result = $document->checkin($filename, $reason, $tempfilename, $major_update); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + // get status after checkin + return $this->get_document_detail($document_id); + } + + public function checkin_small_document_with_metadata($document_id, $filename, $reason, $base64, $major_update, + $metadata, $sysdata, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.check_in'); + if ($response['status_code'] == 1) return $response; + + $add_result = $this->checkin_small_document($document_id, $filename, $reason, $base64, $major_update, + $sig_username, $sig_password); + + if($add_result['status_code'] != 0){ + return $add_result; + } + + $update_result = $this->update_document_metadata($document_id, $metadata, $sysdata, $sig_username, $sig_password, $reason); + + if($update_result['status_code'] != 0){ + return $update_result; + } + + $document = $this->get_document_by_id($document_id); + $result = $document->removeUpdateNotification(); + if (PEAR::isError($result)) + { + // not much we can do, maybe just log! + } + $result = $document->mergeWithLastMetadataVersion(); + if (PEAR::isError($result)) + { + // not much we can do, maybe just log! + } + + return $update_result; + } + + public function checkin_document_with_metadata($document_id, $filename, $reason, $tempfilename, $major_update, + $metadata, $sysdata, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.check_in'); + if ($response['status_code'] == 1) return $response; + + $add_result = $this->checkin_document($document_id, $filename, $reason, $tempfilename, $major_update, + $sig_username, $sig_password); + + if($add_result['status_code'] != 0){ + return $add_result; + } + + $update_result = $this->update_document_metadata($session_id, $document_id, $metadata, $sysdata, $sig_username, $sig_password, $reason); + if($update_result['status_code'] != 0){ + return $update_result; + } + + $document = $this->get_document_by_id($document_id); + $result = $document->removeUpdateNotification(); + if (PEAR::isError($result)) + { + // not much we can do, maybe just log! + } + $result = $document->mergeWithLastMetadataVersion(); + if (PEAR::isError($result)) + { + // not much we can do, maybe just log! + } + + return $update_result; + } + + /** + * Does a document checkin. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $filename + * @param string $reason + * @param string $base64 + * @param boolean $major_update + * @return kt_document_detail. + */ + public function checkin_small_document($document_id, $filename, $reason, $base64, $major_update, $sig_username = '', $sig_password = '' ) + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.check_in'); + if ($response['status_code'] == 1) return $response; + + $upload_manager = new KTUploadManager(); + $tempfilename = $upload_manager->store_base64_file($base64, 'su_'); + if (PEAR::isError($tempfilename)) + { + $reason = $tempfilename->getMessage(); + $response['status_code'] = 1; + $response['message'] = 'Cannot write to temp file: ' . $tempfilename . ". Reason: $reason"; + return $response; + } + + // simulate the upload + $tempfilename = $upload_manager->uploaded($filename,$tempfilename, 'C'); + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->checkin($filename, $reason, $tempfilename, $major_update); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + // get status after checkin + return $this->get_document_detail($document_id); + } + + /** + * Does a document checkout. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $reason + * @return kt_document_detail. + */ + public function checkout_document($document_id, $reason, $download = true, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.check_out'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->checkout($reason); + + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $session = &$this->get_session(); + + $url = ''; + if ($download) + { + $download_manager = new KTDownloadManager(); + $download_manager->set_session($session->session); + $download_manager->cleanup(); + $url = $download_manager->allow_download($document); + } + + if ($this->version >= 2) + { + $response = $this->get_document_detail($document_id); + $response['results']['url'] = $url; + + return $response; + } + + $response['status_code'] = 0; + $response['message'] = ''; + $response['results'] = $url; + + return $response; + } + + /** + * Does a document checkout. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $reason + * @param boolean $download + * @return kt_document_detail + */ + public function checkout_small_document($document_id, $reason, $download, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.check_out'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->checkout($reason); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $content=''; + if ($download) + { + $document = $document->document; + + $oStorage =& KTStorageManagerUtil::getSingleton(); + $filename = $oStorage->temporaryFile($document); + + $fp=fopen($filename,'rb'); + if ($fp === false) + { + $response['status_code'] = 1; + $response['message'] = 'The file is not in the storage system. Please contact an administrator!'; + return $response; + } + $content = fread($fp, filesize($filename)); + fclose($fp); + $content = base64_encode($content); + } + + if ($this->version >= 2) + { + $result = $this->get_document_detail($document_id); + $result['results']['content'] = $content; + + return $result; + } + + $response['status_code'] = 0; + $response['results'] = $content; + return $response; + } + + /** + * Undoes a document checkout. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $reason + * @return kt_document_detail. + */ + public function undo_document_checkout($document_id, $reason, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.force_checkin'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->undo_checkout($reason); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + if ($this->version >= 2) + { + return $this->get_document_detail($document_id); + } + + $response['status_code'] = 0; + return $response; + } + + /** + * Fetches a list of checked out documents (optionally limited to the logged in user) + * + * @param boolean $userSpecific limit to current user + * @return $checkedout An array of checked out documents + */ + // TODO determine whether the listing is showing docs the user should not be able to see + // (when not restricting to docs checked out by that user) + public function get_checkedout_docs($userSpecific = true) + { + $checkedout = array(); + + $where = null; + // limit to current user? + if ($userSpecific) { + $where = array('checked_out_user_id = ?', $this->get_user()->getId()); + } + else { + $where = array('is_checked_out = ?', 1); + } + $checkedout = KTAPI_Document::getList($where); + + return $checkedout; + } + + /** + * Returns a reference to a file to be downloaded. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @return kt_response. + */ + public function download_document($document_id, $version=null) + { + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->download(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $session = &$this->get_session(); + $download_manager = new KTDownloadManager(); + $download_manager->set_session($session->session); + $download_manager->cleanup(); + $url = $download_manager->allow_download($document); + + $response['status_code'] = 0; + $response['results'] = urlencode($url); + + return $response; + } + + /** + * Returns a reference to a file to be downloaded. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @return kt_response. + */ + public function download_small_document($document_id, $version=null) + { + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->download(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $content=''; + + $document = $document->document; + + $oStorage =& KTStorageManagerUtil::getSingleton(); + $filename = $oStorage->temporaryFile($document); + + $fp=fopen($filename,'rb'); + if ($fp === false) + { + $response['status_code'] = 1; + $response['message'] = 'The file is not in the storage system. Please contact an administrator!'; + return $response; + } + $content = fread($fp, filesize($filename)); + fclose($fp); + $content = base64_encode($content); + + + $response['status_code'] = 0; + $response['results'] = $content; + + return $response; + } + + /** + * Deletes a document. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $reason + * @return kt_response + */ + public function delete_document($document_id, $reason, $auth_sig = true, $sig_username = '', $sig_password = '') + { + if ($auth_sig) + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.delete'); + if ($response['status_code'] == 1) return $response; + } + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->delete($reason); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + return $response; + + } + + /** + * Change the document type. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $documenttype + * @return array + */ + public function change_document_type($document_id, $documenttype, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.document_type_change'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->change_document_type($documenttype); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + return $this->get_document_detail($document_id); + + } + + /** + * Copy a document to another folder. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param int $folder_id + * @param string $reason + * @param string $newtitle + * @param string $newfilename + * @return array + */ + public function copy_document($document_id,$folder_id,$reason,$newtitle=null,$newfilename=null, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.copy'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $tgt_folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($tgt_folder)) + { + $response['status_code'] = 1; + $response['message'] = $tgt_folder->getMessage(); + return $response; + } + + $result = $document->copy($tgt_folder, $reason, $newtitle, $newfilename); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $new_document_id = $result->documentid; + return $this->get_document_detail($new_document_id, ''); + } + + /** + * Move a document to another location. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param int $folder_id + * @param string $reason + * @param string $newtitle + * @param string $newfilename + * @return array + */ + public function move_document($document_id,$folder_id,$reason,$newtitle=null,$newfilename=null, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.move'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + if ($document->ktapi_folder->folderid != $folder_id) + { + // we only have to do something if the source and target folders are different + + $tgt_folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($tgt_folder)) + { + $response['status_code'] = 1; + $response['message'] = $tgt_folder->getMessage(); + return $response; + } + + $result = $document->move($tgt_folder, $reason, $newtitle, $newfilename); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + } + + return $this->get_document_detail($document_id, ''); + } + + /** + * Changes the document title. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $newtitle + * @return arry + */ + public function rename_document_title($document_id,$newtitle, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.rename'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->rename($newtitle); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + return $this->get_document_detail($document_id); + } + + /** + * Renames the document filename. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $newfilename + * @return array + */ + public function rename_document_filename($document_id,$newfilename, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.rename'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->renameFile($newfilename); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + return $this->get_document_detail($document_id); + + } + + /** + * Changes the owner of a document. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $username + * @param string $reason + * @return array + */ + public function change_document_owner($document_id, $username, $reason, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.document_owner_change'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->change_owner($username, $reason); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + return $this->get_document_detail($document_id); + } + + /** + * Start a workflow on a document + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $workflow + * @return array + */ + public function start_document_workflow($document_id,$workflow, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.workflow_state_transition'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = &$document->start_workflow($workflow); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + return $this->get_document_detail($document_id); + } + + /** + * Removes the workflow process on a document. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @return array + */ + public function delete_document_workflow($document_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.workflow_state_transition'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->delete_workflow(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + return $this->get_document_detail($document_id); + } + + /** + * Starts a transitions on a document with a workflow. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param string $transition + * @param string $reason + * @return array + */ + public function perform_document_workflow_transition($document_id,$transition,$reason, $sig_username = '', $sig_password = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.workflow_state_transition'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->perform_workflow_transition($transition,$reason); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result>getMessage(); + return $response; + } + + return $this->get_document_detail($document_id); + } + + /** + * Returns the metadata on a document. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @return array + */ + public function get_document_metadata($document_id) + { + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $metadata = $document->get_metadata(); + + $num_metadata=count($metadata); + for($i=0;$i<$num_metadata;$i++) + { + $num_fields = count($metadata[$i]['fields']); + for($j=0;$j<$num_fields;$j++) + { + $selection=$metadata[$i]['fields'][$j]['selection']; + $new = array(); + + foreach($selection as $item) + { + $new[] = array( + 'id'=>null, + 'name'=>$item, + 'value'=>$item, + 'parent_id'=>null + ); + } + $metadata[$i]['fields'][$j]['selection'] = $new; + } + } + + $response['status_code'] = 0; + $response['result'] = $metadata; + return $response; + } + + /** + * Updates document metadata. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @param array $metadata + * @return array + */ + public function update_document_metadata($document_id,$metadata, $sysdata=null, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.metadata_update'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->update_metadata($metadata); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + + $result = $document->update_sysdata($sysdata); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + return $this->get_document_detail($document_id, 'M'); + + } + + /** + * Returns a list of available transitions on a give document with a workflow. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @return array + */ + public function get_document_workflow_transitions($document_id) + { + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->get_workflow_transitions(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['transitions'] = $result; + return $response; + } + + /** + * Returns the current state that the document is in. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @return array + */ + public function get_document_workflow_state($document_id) + { + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->get_workflow_state(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['message'] = $result; + return $response; + } + + /** + * Returns the document transaction history. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @return array + */ + public function get_document_transaction_history($document_id) + { + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->get_transaction_history(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['history'] = $result; + return $response; + } + + /** + * Returns the folder transaction history. + * + * @author KnowledgeTree Team + * @access public + * @param int $folder_id + * @return array + */ + public function get_folder_transaction_history($folder_id) + { + $folder = &$this->get_folder_by_id($folder_id); + if (PEAR::isError($folder)) + { + $response['status_code'] = 1; + $response['message'] = $folder->getMessage(); + return $response; + } + + $result = $folder->get_transaction_history(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['history'] = $result; + return $response; + } + + /** + * Returns the version history. + * + * @author KnowledgeTree Team + * @access public + * @param int $document_id + * @return kt_document_version_history_response + */ + public function get_document_version_history($document_id) + { + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $result = $document->get_version_history(); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + $response['history'] = $result; + return $response; + } + + /** + * Returns a list of linked documents + * + * @author KnowledgeTree Team + * @access public + * @param string $session_id + * @param int $document_id + * @return array + * + * + */ + public function get_document_links($document_id) + { + $response['status_code'] = 1; + $response['message'] = ''; + $response['parent_document_id'] = (int) $document_id; + $response['links'] = array(); + + $document = &$this->get_document_by_id($document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $links = $document->get_linked_documents(); + + $response['status_code'] = 0; + $response['links'] = $links; + return $response; + } + + /** + * Removes a link between documents + * + * @author KnowledgeTree Team + * @access public + * @param int $parent_document_id + * @param int $child_document_id + * @return kt_response + */ + public function unlink_documents($parent_document_id, $child_document_id, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($parent_document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.unlink'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($parent_document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $child_document = &$this->get_document_by_id($child_document_id); + if (PEAR::isError($child_document)) + { + $response['status_code'] = 1; + $response['message'] = $child_document->getMessage(); + return $response; + } + + $result = $document->unlink_document($child_document); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + return $response; + } + + /** + * Creates a link between documents + * + * @author KnowledgeTree Team + * @access public + * @param int $parent_document_id + * @param int $child_document_id + * @param string $type + * @return boolean + */ + public function link_documents($parent_document_id, $child_document_id, $type, $sig_username = '', $sig_password = '', $reason = '') + { + $response = $this->_check_electronic_signature($parent_document_id, $sig_username, $sig_password, $reason, $reason, + 'ktcore.transactions.link'); + if ($response['status_code'] == 1) return $response; + + $document = &$this->get_document_by_id($parent_document_id); + if (PEAR::isError($document)) + { + $response['status_code'] = 1; + $response['message'] = $document->getMessage(); + return $response; + } + + $child_document = &$this->get_document_by_id($child_document_id); + if (PEAR::isError($child_document)) + { + $response['status_code'] = 1; + $response['message'] = $child_document->getMessage(); + return $response; + } + + $result = $document->link_document($child_document, $type); + if (PEAR::isError($result)) + { + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['status_code'] = 0; + return $response; + } + + /** + * Retrieves the server policies for this server + * + * @author KnowledgeTree Team + * @access public + * @return array $response The formatted response array + */ + public function get_client_policies($client=null) + { + $config = KTConfig::getSingleton(); + + $policies = array( + array( + 'name' => 'explorer_metadata_capture', + 'value' => bool2str($config->get('clientToolPolicies/explorerMetadataCapture')), + 'type' => 'boolean' + ), + array( + 'name' => 'office_metadata_capture', + 'value' => bool2str($config->get('clientToolPolicies/officeMetadataCapture')), + 'type' => 'boolean' + ), + array( + 'name' => 'capture_reasons_delete', + 'value' => bool2str($config->get('clientToolPolicies/captureReasonsDelete')), + 'type' => 'boolean' + ), + array( + 'name' => 'capture_reasons_checkin', + 'value' => bool2str($config->get('clientToolPolicies/captureReasonsCheckin')), + 'type' => 'boolean' + ), + array( + 'name' => 'capture_reasons_checkout', + 'value' => bool2str($config->get('clientToolPolicies/captureReasonsCheckout')), + 'type' => 'boolean' + ), + array( + 'name' => 'capture_reasons_cancelcheckout', + 'value' => bool2str($config->get('clientToolPolicies/captureReasonsCancelCheckout')), + 'type' => 'boolean' + ), + array( + 'name' => 'capture_reasons_copyinkt', + 'value' => bool2str($config->get('clientToolPolicies/captureReasonsCopyInKT')), + 'type' => 'boolean' + ), + array( + 'name' => 'capture_reasons_moveinkt', + 'value' => bool2str($config->get('clientToolPolicies/captureReasonsMoveInKT')), + 'type' => 'boolean' + ), + array( + 'name' => 'allow_remember_password', + 'value' => bool2str($config->get('clientToolPolicies/allowRememberPassword')), + 'type' => 'boolean' + ), + ); + + + $response['policies'] = $policies; + $response['message'] = _kt('Knowledgetree client policies retrieval succeeded.'); + $response['status_code'] = 0; + + return $response; + } + + /** + * This is the search interface + * + * @author KnowledgeTree Team + * @access public + * @param string $query + * @param string $options + * @return array $response The formatted response array + */ + public function search($query, $options) + { + $response['status_code'] = 1; + $response['results'] = array(); + + $results = processSearchExpression($query); + if (PEAR::isError($results)) + { + $response['message'] = _kt('Could not process query.') . $results->getMessage(); + return $response; + } + + $response['message'] = ''; + if(empty($results)){ + $response['message'] = _kt('Your search did not return any results'); + } + $response['status_code'] = 0; + $response['results'] = $results; + + return $response; + } + + /** + * Method to create a saved search + * + * @author KnowledgeTree Team + * @access public + * @param string $name The name of the saved search + * @param string $query The saved search query + * @return array $response The formatted response array + */ + public function create_saved_search($name, $query) + { + $savedSearch = new savedSearches($this); + if(PEAR::isError($savedSearch)){ + $response['status_code'] = 1; + $response['message'] = $savedSearch->getMessage(); + return $response; + } + + $result = $savedSearch->create($name, $query); + if(PEAR::isError($result)){ + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['message'] = ''; + $response['status_code'] = 0; + $response['results']['search_id'] = $result; + + return $response; + } + + /** + * Method to retrieve a saved search + * + * @author KnowledgeTree Team + * @access public + * @param string $searchID The id of the saved search + * @return array $response The formatted response array + */ + public function get_saved_search($searchID) + { + $savedSearch = new savedSearches($this); + if(PEAR::isError($savedSearch)){ + $response['status_code'] = 1; + $response['message'] = $savedSearch->getMessage(); + return $response; + } + + $result = $savedSearch->get_saved_search($searchID); + if(PEAR::isError($result)){ + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + if(empty($result)){ + $response['status_code'] = 1; + $response['message'] = _kt('No saved searches found'); + return $response; + } + + $response['message'] = ''; + $response['status_code'] = 0; + $response['results'] = $result[0]; + + return $response; + } + + /** + * Method to retrieve a list of saved searches + * + * @author KnowledgeTree Team + * @access public + * @return array $response The formatted response array + */ + public function get_saved_search_list() + { + $savedSearch = new savedSearches($this); + if(PEAR::isError($savedSearch)){ + $response['status_code'] = 1; + $response['message'] = $savedSearch->getMessage(); + return $response; + } + + $result = $savedSearch->get_list(); + if(PEAR::isError($result)){ + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + if(empty($result)){ + $response['status_code'] = 1; + $response['message'] = _kt('No saved searches found'); + return $response; + } + + $response['message'] = ''; + $response['status_code'] = 0; + $response['results'] = $result; + + return $response; + } + + /** + * Method to delete a saved searche + * + * @author KnowledgeTree Team + * @access public + * @param string $searchID The id of the saved search to delete + * @return array $response The formatted response array + */ + public function delete_saved_search($searchID) + { + $savedSearch = new savedSearches($this); + if(PEAR::isError($savedSearch)){ + $response['status_code'] = 1; + $response['message'] = $savedSearch->getMessage(); + return $response; + } + + $result = $savedSearch->delete($searchID); + if(PEAR::isError($result)){ + $response['status_code'] = 1; + $response['message'] = $result->getMessage(); + return $response; + } + + $response['message'] = ''; + $response['status_code'] = 0; + + return $response; + } + + /** + * Method to retrieve a list of saved searches + * + * @author KnowledgeTree Team + * @access public + * @param string $searchID The id of the saved search to delete + * @return array $response The formatted response array + */ + public function run_saved_search($searchID) + { + $savedSearch = new savedSearches($this); + if(PEAR::isError($savedSearch)){ + $response['status_code'] = 1; + $response['message'] = $savedSearch->getMessage(); + return $response; + } + + $results = $savedSearch->run_saved_search($searchID); + if(PEAR::isError($results)){ + $response['status_code'] = 1; + $response['message'] = $results->getMessage(); + return $response; + } + + $response['message'] = ''; + if(empty($results)){ + $response['message'] = _kt('Your saved search did not return any results'); + } + $response['status_code'] = 0; + $response['results'] = $results; + + return $response; + } + + /** + * Method to get the details of a user + * + * @author KnowledgeTree Team + * @access private + * @param object $oUser The user object + * @return array $results The user details in an array + */ + private function _get_user_details($oUser) + { + $results['user_id'] = $oUser->getId(); + $results['username'] = $oUser->getUsername(); + $results['name'] = $oUser->getName(); + $results['email'] = $oUser->getEmail(); + + return $results; + } + + /** + * Method to return a user based on the userID + * + * @author KnowledgeTree Team + * @access public + * @param string $userID The id of the user + * @return array $response The formatted response array + */ + public function get_user_by_id($userID) + { + $user = KTAPI_User::getById($userID); + if(PEAR::isError($user)){ + $response['status_code'] = 1; + $response['message'] = $user->getMessage(); + return $response; + } + + $results = $this->_get_user_details($user); + $response['message'] = ''; + $response['status_code'] = 0; + $response['results'] = $results; + + return $response; + } + + /** + * Method to return a user based on the username + * + * @author KnowledgeTree Team + * @access public + * @param string $username The username of the user + * @return array $response The formatted response array + */ + public function get_user_by_username($username) + { + $user = KTAPI_User::getByUsername($username); + if(PEAR::isError($user)){ + $response['status_code'] = 1; + $response['message'] = $user->getMessage(); + return $response; + } + + $results = $this->_get_user_details($user); + $response['message'] = ''; + $response['status_code'] = 0; + $response['results'] = $results; + + return $response; + } + + /** + * Method to return a user based on the username + * + * @author KnowledgeTree Team + * @access public + * @param string $username The username of the user + * @return array $response The formatted response array + */ + public function get_user_object_by_username($username) + { + return KTAPI_User::getByUsername($username); + } + + /** + * Method to return a user based on the name + * + * @author KnowledgeTree Team + * @access public + * @param string $name The name of the user + * @return array $response The formatted response array + */ + public function get_user_by_name($name) + { + $user = KTAPI_User::getByName($name); + if(PEAR::isError($user)){ + $response['status_code'] = 1; + $response['message'] = $user->getMessage(); + return $response; + } + + $results = $this->_get_user_details($user); + $response['message'] = ''; + $response['status_code'] = 0; + $response['results'] = $results; + + return $response; + } + + /** + * Method to return a list of users matching the filter criteria + * + * @author KnowledgeTree Team + * @access public + * @param string $filter + * @param string $options + * @return array $response The formatted response array + */ + public function get_user_list($filter = NULL, $options = NULL) + { + $users = KTAPI_User::getList($filter, $options); + if(PEAR::isError($users)){ + $response['status_code'] = 1; + $response['message'] = $users->getMessage(); + return $response; + } + foreach($users as $user){ + $results[] = $this->_get_user_details($user); + } + $response['message'] = ''; + $response['status_code'] = 0; + $response['results'] = $results; + + return $response; + } + + /** + * Method to check if a document is subscribed + * + * @author KnowledgeTree Team + * @access public + * @param string $documentID The id of the document + * @return array $response The formatted response array + */ + public function is_document_subscribed($documentID) + { + $document = $this->get_document_by_id($documentID); + if(PEAR::isError($document)){ + $response['message'] = $document->getMessage(); + $response['status_code'] = 1; + return $response; + } + + $result = $document->isSubscribed(); + $response['message'] = ''; + $response['status_code'] = 0; + if($result){ + $response['results']['subscribed'] = 'TRUE'; + }else{ + $response['results']['subscribed'] = 'FALSE'; + } + return $response; + } + + /** + * Method to subscribe to a document + * + * @author KnowledgeTree Team + * @access public + * @param string $documentID The id of the document + * @return array $response The formatted response array + */ + public function subscribe_to_document($documentID) + { + $document = $this->get_document_by_id($documentID); + if(PEAR::isError($document)){ + $response['message'] = $document->getMessage(); + $response['status_code'] = 1; + return $response; + } + + $result = $document->subscribe(); + if($result === TRUE){ + $response['message'] = ''; + $response['status_code'] = 0; + $response['results']['action_result'] = 'TRUE'; + }else{ + $response['message'] = $result; + $response['status_code'] = 1; + } + return $response; + } + + /** + * Method to unsubscribe from a document + * + * @author KnowledgeTree Team + * @access public + * @param string $documentID The id of the document + * @return array $response The formatted response array + */ + public function unsubscribe_from_document($documentID) + { + $document = $this->get_document_by_id($documentID); + if(PEAR::isError($document)){ + $response['message'] = $document->getMessage(); + $response['status_code'] = 1; + return $response; + } + + $result = $document->unsubscribe(); + if($result === TRUE){ + $response['message'] = ''; + $response['status_code'] = 0; + $response['results']['action_result'] = 'TRUE'; + }else{ + $response['message'] = $result; + $response['status_code'] = 1; + } + return $response; + } + + /** + * Method to check if a folder is subscribed + * + * @author KnowledgeTree Team + * @access public + * @param string $folderID The id of the folder + * @return array $response The formatted response array + */ + public function is_folder_subscribed($folderID) + { + $folder = $this->get_folder_by_id($folderID); + if(PEAR::isError($folder)){ + $response['message'] = $folder->getMessage(); + $response['status_code'] = 1; + return $response; + } + + $result = $folder->isSubscribed(); + $response['message'] = ''; + $response['status_code'] = 0; + if($result){ + $response['results']['subscribed'] = 'TRUE'; + }else{ + $response['results']['subscribed'] = 'FALSE'; + } + return $response; + } + + /** + * Method to subscribe to a folder + * + * @author KnowledgeTree Team + * @access public + * @param string $folderID The id of the folder + * @return array $response The formatted response array + */ + public function subscribe_to_folder($folderID) + { + $folder = $this->get_folder_by_id($folderID); + if(PEAR::isError($folder)){ + $response['message'] = $folder->getMessage(); + $response['status_code'] = 1; + return $response; + } + + $result = $folder->subscribe(); + if($result === TRUE){ + $response['message'] = ''; + $response['status_code'] = 0; + $response['results']['action_result'] = 'TRUE'; + }else{ + $response['message'] = $result; + $response['status_code'] = 1; + } + return $response; + } + + /** + * Method to unsubscribe from a folder + * + * @author KnowledgeTree Team + * @access public + * @param string $folderID The id of the folder + * @return array $response The formatted response array + */ + public function unsubscribe_from_folder($folderID) + { + $folder = $this->get_folder_by_id($folderID); + if(PEAR::isError($folder)){ + $response['message'] = $folder->getMessage(); + $response['status_code'] = 1; + return $response; + } + + $result = $folder->unsubscribe(); + if($result === TRUE){ + $response['message'] = ''; + $response['status_code'] = 0; + $response['results']['action_result'] = 'TRUE'; + }else{ + $response['message'] = $result; + $response['status_code'] = 1; + } + return $response; + } + + public function is_latest_version($documentID, $contentID) + { + $sql = 'SELECT COUNT(document_content_version.id) AS newdocumentcount + FROM document_content_version + WHERE document_content_version.document_id ="'.$documentID.'" AND + document_content_version.id > "'.$contentID.'"'; + + $row = DBUtil::getOneResult($sql); + $row = (int)$row['newdocumentcount']; + + if ($row > 0) { + $response['is_latest'] = 'FALSE'; + } else { + $response['is_latest'] = 'TRUE'; + } + + $response['status_code'] = 0; + + return $response; + } + + /** + * Method to check whether electronic signatures are enabled + * + * @author KnowledgeTree Team + * @access public + * @return bool $enabled true or false + */ + public function electronic_sig_enabled() + { + // Check that the wintools plugin is active and available, return false if not. + if (!KTPluginUtil::pluginIsActive('ktdms.wintools')) { + return false; + } + + // Check config for api signatures enabled + $oConfig =& KTConfig::getSingleton(); + $enabled = $oConfig->get('e_signatures/enableApiSignatures', false); + // Check that the license is valid + $enabled = (BaobabKeyUtil::getLicenseCount() >= MIN_LICENSES) & $enabled; + + return $enabled; + } + + /** + * Attempts authentication of the signature + * + * @author KnowledgeTree Team + * @access private + * @param string $username The user's username + * @param string $password The user's password + * @param string $comment A comment on the action performed + * @param string $action The action performed + * @param string $details Details about the action performed + * @return bool True if authenticated | False if rejected + */ + private function _authenticateSignature($username, $password, $comment, $action, $details) + { + $eSignature = new ESignature('api'); + $result = $eSignature->sign($username, $password, $comment, $action, $details); + if(!$result){ + $this->esig_error = $eSignature->getError(); + } + + return $result; + } + + /** + * Method to execute electronic signature checks on action + * + * @author KnowledgeTree Team + * @access private + * @param string $item_id ID of document/folder which will be used as detail string in authentication records + * @param string $username The user's username + * @param string $password The user's password + * @param string $comment A comment on the action performed + * @param string $details Unused + * @param string $action The action performed + * @return array $response containing success/failure result and appropriate message + */ + private function _check_electronic_signature($item_id, $username, $password, $comment, $details, $action) + { + $response = array(); + $response['status_code'] = 0; + + // check electronic signature authentication, if on + if ($this->esig_enabled && !$this->_authenticateSignature($username, $password, $comment, $action, $item_id)) + { + $response['status_code'] = 1; + $response['message'] = $this->esig_error; + + return $response; + } + + return $response; + } +} + + +/** +* This class handles the saved search functionality within the API +* +* @author KnowledgeTree Team +* @package KTAPI +* @version Version 0.9 +*/ +class savedSearches +{ + /** + * Instance of the KTAPI object + * + * @access private + */ + private $ktapi; + + /** + * Constructs the bulk actions object + * + * @author KnowledgeTree Team + * @access public + * @param KTAPI $ktapi Instance of the KTAPI object + */ + function __construct(&$ktapi) + { +// $this->ktapi = new KTAPI(); + $this->ktapi = $ktapi; + } + + /** + * This method creates the saved search + * + * @author KnowledgeTree Team + * @access public + * @param string $name The name of the search + * @param string $query The query string to be saved + * @return string|object $result SUCCESS - The id of the saved search | FAILURE - an error object + */ + public function create($name, $query) + { + $user = $this->ktapi->get_user(); + if (is_null($user) || PEAR::isError($user)) + { + $result = new PEAR_Error(KTAPI_ERROR_USER_INVALID); + return $result; + } + $userID = $user->getId(); + + $result = SearchHelper::saveSavedSearch($name, $query, $userID); + return $result; + } + + /** + * This method gets a saved searche based on the id + * + * @author KnowledgeTree Tean + * @access public + * @param integer $searchID The id of the saved search + * @return array|object $search SUCESS - The saved search data | FAILURE - a pear error object + */ + public function get_saved_search($searchID) + { + $search = SearchHelper::getSavedSearch($searchID); + return $search; + } + + /** + * This method gets a list of saved searches + * + * @author KnowledgeTree Tean + * @access public + * @return array|object $list SUCESS - The list of saved searches | FAILURE - an error object + */ + public function get_list() + { + $user = $this->ktapi->get_user(); + if (is_null($user) || PEAR::isError($user)) + { + $list = new PEAR_Error(KTAPI_ERROR_USER_INVALID); + return $list; + } + $userID = $user->getId(); + + $list = SearchHelper::getSavedSearches($userID); + if (PEAR::isError($list)) + { + $list = new PEAR_Error('Invalid saved search result'); + return $list; + } + return $list; + } + + /** + * This method deletes the saved search + * + * @author KnowledgeTree Team + * @access public + * @param string $searchID The id of the saved search + * @return void + */ + public function delete($searchID) + { + SearchHelper::deleteSavedSearch($searchID); + } + + /** + * This method runs the saved search bsed on the id of the saved search + * + * @author KnowledgeTree Team + * @access public + * @param integer $searchID The id of the saved search + * @return array|object $results SUCCESS - The results of the saved serach | FAILURE - a pear error object + */ + public function run_saved_search($searchID) + { + $search = $this->get_saved_search($searchID); + if(is_null($search) || PEAR::isError($search)){ + $results = new PEAR_Error('Invalid saved search'); + return $results; + } + $query = $search[0]['expression']; + + $results = processSearchExpression($query); + return $results; + } +} + +?> diff --git a/kthelp/.htaccess b/kthelp/.htaccess new file mode 100644 index 0000000..2c1b49f --- /dev/null +++ b/kthelp/.htaccess @@ -0,0 +1,3 @@ +Order deny,allow +Deny from all + diff --git a/kthelp/ktcore/EN/admin/admin-mode.html b/kthelp/ktcore/EN/admin/admin-mode.html new file mode 100644 index 0000000..ad57bc1 --- /dev/null +++ b/kthelp/ktcore/EN/admin/admin-mode.html @@ -0,0 +1,33 @@ + + + Administrator Mode + + + + + +

+Administrator mode is a system state that allows KnowledgeTree administrative users to override the permissions system, in an audited fashion, in order to access all documents in the system. With administrator mode enabled, Unit administrators will only be provided access to all documents in their Unit. +

+
+

+Administrator mode provides an audited method of fixing errors on documents or in folders where even administrative users are usually denied access, such as content containing classified information. +

+
+

+Note: Administrators are not able to delete immutable documents using the 'Delete' button in Browse Documents, even if they're working in Administrator mode. To delete an immutable document, use the 'Delete' action from the immutable document's Document Detail page. This ensures that immutable documents are only deleted one at a time, and avoids the mistaken deletion of an immutable document in a mass action delete. +

+
+

How to Enable and Disable Administrator Mode

+

+

    +
  • 1. Open Browse Documents.
  • +
  • 2. Locate the Administrator mode menu; then, click the maximize icon to expand the Administrator mode menu.
  • +
      +
    • To ENABLE administrator mode, click 'Enable Admin Mode'.
    • +
    • To DISABLE administrator mode, click 'Disable Admin Mode'.
    • +
    +
+

+ + diff --git a/kthelp/ktcore/EN/admin/archived documents.html b/kthelp/ktcore/EN/admin/archived documents.html new file mode 100644 index 0000000..23814d0 --- /dev/null +++ b/kthelp/ktcore/EN/admin/archived documents.html @@ -0,0 +1,15 @@ + + + Archived Documents + + +

Archived Documents

+This page lets you restores a document that has previously been archived. +



+Note: By default, documents are restored to the folder location where they were originally archived. If that folder no longer exists on the system, the document is restored to the root directory in the repository. + + + + + + diff --git a/kthelp/ktcore/EN/admin/authentication sources.html b/kthelp/ktcore/EN/admin/authentication sources.html new file mode 100644 index 0000000..ed4d48f --- /dev/null +++ b/kthelp/ktcore/EN/admin/authentication sources.html @@ -0,0 +1,79 @@ + + + AUTHENTICATION SOURCES + + + + +

ABOUT AUTHENTICATION SOURCES

+
+

KnowledgeTree Default - Database Authentication

+

+By default, KnowledgeTree's inbuilt authentication method stores information about users and groups in the KnowledgeTree database, and retrieves this information to control access to the KnowledgeTree document management system (DMS). +

+
+

External Authentication Sources

+

+If you want to maintain your own predefined user and group information to control access to KnowledgeTree, you can add users from a preconfigured external authentication source. +

+
+

+When using external authentication sources, you need to add the authentication source, then, when adding your users to KnowledgeTree, select your preferred authentication source. When a user from your preferred authentication source first logs in to KnowledgeTree, their user credentials are automatically imported into KnowledgeTree. +

+
+

HOW TO VIEW / ADD / EDIT / DELETE AN EXTERNAL AUTHENTICATION SOURCE

+ +

+

    +
  • 1. In DMS Administration, click 'Users and Groups'.
  • +
  • 2. To open the Authentication configuration page, click 'Authentication'.
  • +
  • 3. What do you want to do?
  • +
+

+
+

+

VIEW EXISTING EXTERNAL AUTHENTICATION SOURCES

+
  • a. External authentication source that have been added to your system are listed on the page.
  • +

    +
    +

    +

    ADD A NEW EXTERNAL AUTHENTICATION SOURCE

    +
      +
    • a. To open the 'Add an authentication source' page, click 'Add a new authentication source'.
    • +
    • b. Define a name for the authentication source.
    • +
    • c. Select an authentication provider - by default, the pick list contains the standard options (LDAP, and Active Directory). To add more authentication providers, check the KnowledgeTree community forums at www.knowledgetree.com for developer information.
    • +
    • d. Click 'Add a new source'.
    • +
    • e. The authentication provider settings page opens, where you can edit the authentication provider settings.
    • +
    +

    +
    +

    +

    EDIT THE STANDARD CONFIGURATION FOR AN EXISTING AUTHENTICATION SOURCE (NAME AND PROVIDER)

    +
      +
    • a. On the Authentication page, view the list of existing authentication sources.
    • +
    • b. In the Edit column for the relevant listed authentication source, click the 'Edit' icon to open the 'Edit an authentication source' page.
    • +
    • c. Edit the authentication source name and/or the authentication provider.
    • +
    • d. Click 'Save'.
    • +
    +

    +
    +

    +

    EDIT AUTHENTICATION PROVIDER SETTINGS FOR AN EXISTING AUTHENTICATION SOURCE

    +
      +
    • a. On the Authentication page, view the list of existing authentication sources.
    • +
    • b. In the 'Edit Provider Information' column for the relevant listed authentication source, click the 'Edit' icon to open the 'Edit an authentication source' page.
    • +
    • c. Add or edit the following settings: server name, port, whether to use Transaction Layer Security, base DN, search user, search password, search attributes, object classes.
    • +
    • d. Click 'Save'.
    • +
    +

    +
    +

    +

    DELETE AN AUTHENTICATION SOURCE

    +
      +
    • a. On the Authentication page, view the list of existing authentication sources.
    • +
    • b. Click the Delete icon for the authentication source you want to remove.
    • +
    +

    + + + diff --git a/kthelp/ktcore/EN/admin/automatic workflows.html b/kthelp/ktcore/EN/admin/automatic workflows.html new file mode 100644 index 0000000..96b59df --- /dev/null +++ b/kthelp/ktcore/EN/admin/automatic workflows.html @@ -0,0 +1,17 @@ + + + + Automatic workflows + + +

    Automatic workflows

    + +

    +Automatic workflows allow you to define the conditions for automatically assigning a +specific workflow to a document.

    +Workflow assignment may occur on a per folder basis or on a per document type +basis. Only one mode may be selected for a particular system.

    + + + \ No newline at end of file diff --git a/kthelp/ktcore/EN/admin/control units.html b/kthelp/ktcore/EN/admin/control units.html new file mode 100644 index 0000000..685af50 --- /dev/null +++ b/kthelp/ktcore/EN/admin/control units.html @@ -0,0 +1,31 @@ + + + Unit Administration + + +

    Unit Administration

    +

    +KnowledgeTree's Unit concept allows you to arrange the content of your document management system into standalone, separately managed sections. +

    +
    +

    +For example, you may want to create Units that match the business model of your organization, such as a Unit folder for each department or regional office. +

    +
    +

    +Units are also useful where you want to restrict access to certain parts of the DMS for specific users. User-level control is thus set up for specific Units - when these users log on, they will see only the Unit folder/s where they have been granted at least the 'read' permission. All other system folders and files are hidden. +

    +
    +

    +As with other system folders, Unit level access is controlled through KnowledgeTree's permissions system, by user group, and on specific folders. +

    +
    +

    +Note: By default, new Unit folders are added to the root directory, but you can specify a different location in the DMS. +

    +
    +

    +The KnowledgeTree system administrator adds Units, and assigns Unit administrator privileges to one or more users who are responsible for managing content and users in their Unit. The system administrator retains administrator privileges over the entire DMS, including all Units. +

    + + diff --git a/kthelp/ktcore/EN/admin/deleted documents.html b/kthelp/ktcore/EN/admin/deleted documents.html new file mode 100644 index 0000000..2a7ef5c --- /dev/null +++ b/kthelp/ktcore/EN/admin/deleted documents.html @@ -0,0 +1,17 @@ + + + + Deleted Documents + + +

    Deleted Documents

    +

    +Documents that are deleted from Browse Documents in the DMS are not permanently deleted - they are 'soft deleted' and hidden from view until the system administrator restores those documents or permanently removes them from the system (expunge). +

    +
    +

    +Expunging deleted documents frees up disk space in your system. Restored documents are returned to their original folder location or to the root directory if the original folder no longer exists. +

    + + diff --git a/kthelp/ktcore/EN/admin/document checkout.html b/kthelp/ktcore/EN/admin/document checkout.html new file mode 100644 index 0000000..99bd99f --- /dev/null +++ b/kthelp/ktcore/EN/admin/document checkout.html @@ -0,0 +1,20 @@ + + + + + Document Checkout + + + + +

    Override Document Check out

    +

    +The KnowledgeTree administrator may override the checked-out status of a document to force a document back in to the repository. This action restores the content version of the document as it was before it was checked out. +

    +
    +

    +Forced check-in is used when a checked out document is urgently required back in the repository so that another user can check out the document to update it, and the original document is no longer available and/or the user who checked that document out is not available to check-in the document. +

    + + diff --git a/kthelp/ktcore/EN/admin/document fieldsets.html b/kthelp/ktcore/EN/admin/document fieldsets.html new file mode 100644 index 0000000..01c2aed --- /dev/null +++ b/kthelp/ktcore/EN/admin/document fieldsets.html @@ -0,0 +1,78 @@ + + + + Document Fieldsets + + +

    +A Fieldset is a collection of Fields that may be associated with a specific Document Type, or with all Document Types in the system. +

    +
    +

    +

    Types of Fields

    +There are three types of fields: +
      +
    • Normal - stores text metadata, such as invoice code
    • +
    • Lookup - contains a list of selectable options that display in a pick list
    • +
    • Tree - allows you to select metadata values by browsing a tree structure
    • +
    +

    +
    +

    +

    Types of Fieldsets

    +

    +The following two fieldset types are KnowledgeTree defaults: +

    +

    +Note: You can add plugins to KnowledgeTree that add different types of fieldsets, if required. +

    +

    +

      +
    • Normal - may contain a variety of field types, i.e. one or more, or a combination, of Lookup field's, Tree field's, and Normal field's.
    • +
    • Conditional - contains two or more Lookup fields. This fieldset must be configured in the Fieldset editing pages after you add the fieldset, in order to set one field as the 'master' field, and to define how user-selected values in the master field determine the display of subsequent fields and values that are presented when the user adds document metadata. Since conditional fieldsets comprise a collection of interdependent fields and values, you need to plan the fieldset structure before creating the fieldset in the DMS. To use this feature, enable the 'Conditional Metadata' plugin in DMS Administration >> Miscellaneous
    • +
    . +

    +

    Generic Fieldsets

    +

    +A fieldset that is defined as 'generic' is automatically associated with each document type you add to the repository. Define a fielset as 'generic' when adding or editing the fieldset. +

    +
    +

    +

    Working with Fieldsets

    +How to View Existing Fieldsets +

    +

  • 1. To open the Fieldset management page, click Document Fieldsets in Document Metadata and Workflow Configuration.
  • +
  • 2. On the Document Fieldsets page, view existing fieldsets listed in the table.
  • +

    +
    +

    +

    How to Add a New Fieldset

    +

    +

  • 1. On the Fieldset management page in DMS Administration, click Create New Fieldset.
  • +
  • 2. Define a name for the fieldset in the Fieldset Name field; then, add a description in the Description field.
  • +
  • 3. In the Fieldset Type section, define whether the fieldset is 'Normal' or Conditional'; then, define whether this is a 'generic' fieldset.
  • +
  • 4. Click Create Fieldset.
  • +

    +
    +

    +

    How to Add a New Conditional Fieldset

    +

    +Before you begin, plan the fieldset, and its lookup fields and lookup values. +

    +
    +

    +

      +
    • 1. Add a new fieldset, and define the fieldset as 'Conditional'.
    • +
    • 2. On the Edit Fieldset page, click Add New Field to add two or more lookup fields to this fieldset, and add lookup values for each field.
    • +
    • 3. Once you have added all the fields and their lookup fields, set one field as the 'master' field - click Manage Field Ordering on the Edit Fieldset page.
    • +
    • 4. Define the control field / dependent field relationship between all fields in the fieldset, starting with the master field - click Manage Field Ordering on the Edit Fieldset page. Repeat this step until all fields have been ordered into the control / dependent structure.
    • +
    • 5. Edit fieldset rules to define conditional behaviour. To do this, click Manage Conditional Behaviour on the Edit Fieldset page.
    • +
    • 6. For each control field, select a lookup value; then, select two or more lookup values in the dependent field - the dependent field values will display when the user selects the control field lookup value in the conditional fieldset. Click save this dependency to save each behaviour; then, when you're ready to configure the next field, click edit field.
    • +
    • 7. When fieldset rules (conditional behaviour) have been set up on all control/dependent fields, click View Overview on the Edit Fieldset page to walk through a test of the fieldset you created.
    • +
    +

    +
    +

    + + \ No newline at end of file diff --git a/kthelp/ktcore/EN/admin/document types.html b/kthelp/ktcore/EN/admin/document types.html new file mode 100644 index 0000000..65bf119 --- /dev/null +++ b/kthelp/ktcore/EN/admin/document types.html @@ -0,0 +1,91 @@ + + + +Document Types + + +

    Document Types

    +

    +KnowledgeTree uses Document Types to group documents in the repository. This allows you to search for and manage your documents by 'Document Type', e.g. Invoice, Report, Template, Order, etc. +

    +
    +

    +For each Document Type, you can create a collection of fields, called 'fieldsets', and then associate the fieldsets (one or more) with selected Document Types. For example, for an 'Invoice' document type, you could create a fieldset called 'Invoice Details', for which you can create a collection of fields, such as: Invoice Number, Customer Name, Date, etc. When a user adds a document of the type 'Invoice', the fields display, and the user is required to enter field values, such as the invoice number, the name of the customer, and the date. When adding fieldsets and fields, you can specify whether they are 'required' - i.e. whether the user is must enter values for those fields. +

    +
    +

    +Note: Fields, Fieldsets, and Document Type are Metadata - they are descriptive references for documents in the repository. +

    +
    +

    +

    Working with Document Types

    +

    +
    +

    +

    How to Add a New Document Type

    +
      +
    • 1. On the Document Types page, enter a name for the new document type in the Name field.
    • +
    • 2. Click Create.
    • +
    • 3. On the document type configuration screen that displays, you can:
    • +
        +
      • change the document type name (click Change to save the new document type name)
      • +
      • associate one or more fieldsets with this document type (available fieldsets are listed in the Available Fieldsets menu; or you can add more fieldsets in the Fieldset configuration section of DMS Administration, and then return to this page to associate additional fieldsets). When you're done, click Associate Fieldsets.
      • +
      +
    +

    +
    +

    +

    How to View Existing Document Types

    +
      +
    • 1. Existing document types are listed in a table on the Document Types page. The table provides access to the following configuration options:
    • +
        +
      • Edit document type (edit document type name and associated fieldsets)
      • +
      • Enable / disable the document type
      • +
      • Delete document type (if the document type may be deleted)
      • +
      +
    +

    +
    +

    +

    How to Edit a Document Type

    +
      +
    • 1. View existing document types in the table on the Document Types page.
    • +

      +
      +

      +

    • 2. Do you want to ...
    • +
        +
      • change the document type name? Click the Edit icon in the Edit column for the relevant document type. On the editing screen, change the name of the document type. Click Change.
      • +
      • associate or disassociate fieldsets on a document type? Click the Edit icon in the Edit column for the relevant document type. To associate fieldsets, on the editing screen, select fieldsets in the menu; then, click Associate Fieldsets; Or, to disassociate fieldsets, on the editing screen, select fieldsets you want to remove from this document type; then, click Disassociate Fieldsets.
      • +
      +
    +

    +
    +

    +

    ENABLE OR DISABLE A DOCUMENT TYPE

    +
      +
    • 1. View existing document types in the table on the Document Types page.
    • +
    • 2. Click on the icon in the Enable/Disable column for the relevant document type. If the document type is currently disabled, clicking the icon enables the document type; if the document type is currently enabled, clicking the icon disables the document type.
    • +
    +

    +
    +

    +

    EDIT A FIELDSET ASSOCIATED WITH A DOCUMENT TYPE

    +
      +
    • 1. View existing document types in the table on the Document Types page.
    • +
    • 2. Click on the fieldset you want to edit (listed in the Associated Fieldsets column for the relevant document type).
    • +
    • 3. On the Edit Fieldset page, to edit the fieldset name, description, and to define whether the fieldset is generic, click Edit these details); you can also manage (add, edit, or remove) fields in the fieldset.
    • +
    +

    +
    +

    +

    DELETE A DOCUMENT TYPE

    +
      +
    • 1. View existing document types in the table on the Document Types page.
    • +
    • 2. Click the delete icon in the Delete column for the relevant document type.
    • +Note: You may only delete document types that have no associated documents in the repository - i.e. you cannot delete the 'Invoice' document type if you have documents in the repository of the type 'Invoice'. This prevents the removal of required metadata. You may however 'disable' a document type if you have no further use for it. +
    +

    + + \ No newline at end of file diff --git a/kthelp/ktcore/EN/admin/dynamic conditions.html b/kthelp/ktcore/EN/admin/dynamic conditions.html new file mode 100644 index 0000000..c22d6dd --- /dev/null +++ b/kthelp/ktcore/EN/admin/dynamic conditions.html @@ -0,0 +1,37 @@ + + + + Dynamic Conditions + + +

    Dynamic Conditions

    +

    +A dynamic condition filters content in the system to selectively apply permissions to documents that meet the criteria of the condition. +

    +
    +

    +After creating the dynamic condition you need to associate permissions with it on the Folder Permissions management page in Browse Documents. +

    +
    +

    +

    Dynamic Conditions and Workflows

    +

    +

    +Dynamic Conditions are also used to create Guard permissions, which are required to perform transitions on Workflows. +

    +
    +

    +

    Viewing / Adding / Editing / Running Dynamic Conditions

    +

    +

    +On the Dynamic Conditions page you can perform the following actions: +

      +
    • View existing dynamic conditions
    • +
    • Add a new dynamic condition
    • +
    • Edit an existing dynamic condition - add/remove/or edit criteria
    • +
    • Run a dynamic condition to test results
    • +
    +

    + + diff --git a/kthelp/ktcore/EN/admin/help administration.html b/kthelp/ktcore/EN/admin/help administration.html new file mode 100644 index 0000000..4665bae --- /dev/null +++ b/kthelp/ktcore/EN/admin/help administration.html @@ -0,0 +1,48 @@ + + + + Help Administration + + +

    Help Administration

    +KnowledgeTree Document Management System contains several built-in Help files. +

    +
    +

    +You can access Help for the page you're on, wherever you see this icon (?) in the bar at the top right of the page. The Help file that displays provides information on using the system function relevant to your current location in the DMS. +

    +
    +

    +You can customize any Help file and restore the default text if necessary. +

    +
    +

    +

    Customize a Help File

    +
      +
    • 1. Open the relevant Help file in KnowledgeTree's Web interface.
    • +
    • 2. Click the Help icon in the top bar to open the file.
    • +
    • 3. Click Edit this help page to open the file editing screen.
    • +
    • 4. Make the required changes; then, click Update.
    • +
    +

    +
    +

    +

    View Your Customized Help Files

    +
      +
    • 1. In DMS Administration - Miscellaneous - Edit Help Files, click Edit Help Files to open the Current Help Assignments page.
    • +
    • 2. View the list of files (if any) in the Existing Customized Help Pages section.
    • +
    +

    +
    +

    +

      +

      Delete a Custom Help File

      +
    • 1. View the list of custom help files.
    • +
    • 2. Click Delete for the relevant file.
    • +
    • 3. The default file replaces the custom file.
    • +
    +

    +
    + + \ No newline at end of file diff --git a/kthelp/ktcore/EN/admin/images/castle.gif b/kthelp/ktcore/EN/admin/images/castle.gif new file mode 100644 index 0000000..32305e8 Binary files /dev/null and b/kthelp/ktcore/EN/admin/images/castle.gif differ diff --git a/kthelp/ktcore/EN/admin/link type management.html b/kthelp/ktcore/EN/admin/link type management.html new file mode 100644 index 0000000..7d5edad --- /dev/null +++ b/kthelp/ktcore/EN/admin/link type management.html @@ -0,0 +1,47 @@ + + + + Link Type Management + + +

    Link Type Management

    +You can create various types of links between documents in the system that informs the user about the relationship between the linked documents. +

    +When creating a link, you specify the type of link, such as 'associated with' or 'duplicated by'. When a document is linked to one or more other documents, the link to associated documents display on the document's Document Details page. +

    +
    +

    +

    Viewing Existing Link Types

    +
      +
    • 1. Scroll down to the bottom of the page, to the 'Manage Existing Link Types' section, where you can view existing link types.
    • +
    +

    +
    +

    +

    Editing Link Types

    +
      +
    • 1. Click the Edit icon for the relevant link type to open the the link type editing screen.
    • +
    • 2. Make the required changes (change the name or description).
    • +
    • 3. Click Change Link Type.
    • +
    +

    +
    +

    +

    Adding New Link Types

    +
      +
    • 1. Define a name for the link type in the Name field.
    • +
    • 2. Provide a brief description of the link in the Description field.
    • +
    • 3. Click Add Link Type.
    • +
    +

    +
    +

    +

    Deleting Link Type

    +
      +
    • 1. Locate the link type in the Manage Existing Link Types section at the bottom of the page.
    • +
    • 2. Click the Delete icon for the relevant link.
    • +
    +

    + + \ No newline at end of file diff --git a/kthelp/ktcore/EN/admin/manage groups.html b/kthelp/ktcore/EN/admin/manage groups.html new file mode 100644 index 0000000..13bec64 --- /dev/null +++ b/kthelp/ktcore/EN/admin/manage groups.html @@ -0,0 +1,42 @@ + + + + Manage Groups + + +

    Manage Groups

    +

    +Any system User may belong to more than one Group, and any Group may be added as a member of another Group, as a Sub Group. +

    +
    +

    +Permissions and Group Membership +

    +
    +

    +KnowledgeTree permissions are assigned at the Group level (and also at the Role level), but not to individual users. Each user requiring access to the system must be added to KnowledgeTree as an individual user, and then that user is added to one or more Groups, or is assigned to a Role, in order to obtain the permissions allocated to the Group (or the Role). +

    +
    +

    +Permissions are passed on to users through their membership of a Group (or a Role), and any sub group that is a member of another Group (the parent) obtains the permissions that are allocated to the parent group. +

    +
    +

    +Add users to groups in DMS Administration - Manage Users. +

    +
    +

    +

    Tasks in Manage Groups

    +

    +

    +In Manage Groups you can perform the following tasks: +

      +
    • View existing groups - search for a group by entering all or part of the group name, or click View All Groups to display a list of all groups
    • +
    • Add new groups
    • +
    • Edit groups - change the name of a group, allocate Unit Administrator rights and/or System Administrator rights to group members, remove a Group from a Unit
    • +
    • Add or remove sub groups from a Group
    • +
    +

    + + diff --git a/kthelp/ktcore/EN/admin/manage permissions.html b/kthelp/ktcore/EN/admin/manage permissions.html new file mode 100644 index 0000000..38a840d --- /dev/null +++ b/kthelp/ktcore/EN/admin/manage permissions.html @@ -0,0 +1,41 @@ + + + + Manage Permissions + + +

    Manage Permissions

    +

    +KnowledgeTree provides several default (core) permissions: +

      +
    • Read
    • +
    • Write
    • +
    • Add Folder
    • +
    • Manage Security
    • +
    • Delete
    • +
    • Manage Workflow
    • +
    • Folder Details
    • +
    • Rename Folder
    • +
    +

    +
    +

    +You may create additional (custom) Permissions, which are useful where you want to control access for Plug-ins, or to create Permissions as Guard permissions on Workflows. +

    +
    +

    +Note: Only custom permissions may be deleted. +

    +
    +

    Tasks in Manage Permissions

    +

    +In this section you can perform the following tasks: +

      +
    • View existing permissions
    • +
    • Remove custom permissions
    • +
    • Add new custom permissions
    • +
    +

    + + diff --git a/kthelp/ktcore/EN/admin/manage plugins.html b/kthelp/ktcore/EN/admin/manage plugins.html new file mode 100644 index 0000000..62b23c1 --- /dev/null +++ b/kthelp/ktcore/EN/admin/manage plugins.html @@ -0,0 +1,38 @@ + + + + Manage plugins + + +

    Manage plugins

    +

    +KnowledgeTree allows the use of Plugins that extend the functionality of the document management system. +

    +
    +

    +View descriptions of the plugins on the Plugins Index at the KnowledgeTree Forge. +

    +
    +

    Updating Plugins

    +

    +The plugins list must be re-read from the filesystem in the following instances: +

      +
    • if you have moved the location of your KnowledgeTree installation to another server
    • +
    • after installing or upgrading KnowledgeTree
    • +
    • if you have installed new plugins or removed unwanted plugins from the filesystem
    • +
    +

    +
    +

    +Rereading the plugins from the filesystem refreshes the plugins list that displays on the Manage Plugins page in the DMS. +

    +
    +

    Enabling and Disabling Plugins

    +

    +Most plugins are enabled by default. To enable a plugin so that you can use this functionality in the system, select the check box adjacent to the plugin name. To disable a plugin, deselect the check box. When you're done, save your changes. +

    +
    +

    + + diff --git a/kthelp/ktcore/EN/admin/manage users.html b/kthelp/ktcore/EN/admin/manage users.html new file mode 100644 index 0000000..b011a24 --- /dev/null +++ b/kthelp/ktcore/EN/admin/manage users.html @@ -0,0 +1,115 @@ + + + + + Manage Users + + +

    Manage Users

    +

    +

    In DMS Administration >> User and Groups >> Manage Users you can:

    +
      +
    • add new users (add users manually, or import user details from an external authentication source)
    • +
    • search for users
    • +
    • view a list of all users that exist in the system
    • +
    • enable, disable, or delete users
    • +
    • edit users (add and edit login name, username, email address, mobile number, enable/disable email notification, password, maximum login sessions)
    • +
    • view, add, and edit a user's group membership
    • +
    +

    +
    +

    +

    Adding Users

    +

    Adding New Users (manually)

    +
      +
    • 1. Click Add a new user.
    • +
    • 2. Add details for the user:
    • +
    +
      +
    • login name
    • +
    • full name
    • +
    • email address
    • +
    • define whether to enable email enable notifications
    • +
    • password
    • +
    • mobile number
    • +
    • maximum login sessions (prevents multiple users logging in on the same account)
    • +
    +
  • 3. Click create user.
  • + +

    +
    +

    Adding New Users (From External Authentication Source)

    +

    +KnowledgeTree uses the information you specified when adding the user or group to retrieve their details from the specified authentication source. The user or group's login details and permissions are verified when they first log in to the DMS. +

    +
    +

    +Note: You can't change the authentication source for a user after adding the user from a selected authentication source. +

    +
    +

    +Prerequisites: +

      +
    • Add the authentication source to KnowledgeTree
    • +
    • Ensure the authentication provider plugin is registered and enabled
    • +
    +

    +
    +

    +

      +
    • 1. In the Add User From Authentication Source section, select an authentication source from the pick list.
    • +
    • 2. Click Add from Source to open the Search for user page for the authentication source you selected; then, do one of the following:
    • +
        +
      • search for the user
      • +
      • select Mass Import (adds all users from the authentication source); then, click search for users.
      • +
      +
    +

    +
    +

    +Note: You won't be able to verify the details of individual users added through Mass Import. When bulk adding users, users that already exist in the system are duplicated in KnowledgeTree with 'duplicate' appended to the username. +

    +
    +

    +

    Display All Users

    +
      +
    • 1. In Search for Users, click View All Users. A list of all users displays at the bottom of the page.
    • +
    +

    +
    +

    +

    Search for Users

    +
      +
    • 1. In Search for Users, enter all or part of the username in the Username field.
    • +
    • 2. Click Search for Users to display the user's details.
    • +
    +

    +
    +

    +

    Enable / Disable User

    +
      +
    • 1. Search for the user.
    • +
    • 2. Select the user; then, click Enable or Disable as required.
    • +
    +

    +
    +

    +

    Edit User Details

    +
      +
    • 1. Search for the user to display the user's details.
    • +
    • 2. Click the Edit icon for the user to open the Edit User Details page.
    • +
    • 3. Make the required changes; then, save your changes.
    • +
    +

    +
    +

    +

    Edit User's Group Membership

    +
      +
    • 1. Search for the user.
    • +
    • 2. Click Manage Groups for the relevant user to open the Change [username] Groups page.
    • +
    • 3. Make the required changes (add user to groups, remove user from groups).
    • +
    • 4. Save your changes.
    • +
    + + \ No newline at end of file diff --git a/kthelp/ktcore/EN/admin/portlets/admin-mode.html b/kthelp/ktcore/EN/admin/portlets/admin-mode.html new file mode 100644 index 0000000..1d60013 --- /dev/null +++ b/kthelp/ktcore/EN/admin/portlets/admin-mode.html @@ -0,0 +1,19 @@ + + + Administrator Mode + + + + + +

    Administrator Mode

    +

    +There are instances where systems administrators may be denied access to certain documents in the repository - management level documents containing classified information, for example. +

    +

    +However, because problems with these documents in the repository will also need to be fixed, administrators must be granted a way of overriding the controls in an audited manner that protects this information. +

    +Enabling Administrator mode allows system and unit administrators to view and manage all documents in the system, including those documents where they are normally denied access. +

    + + diff --git a/kthelp/ktcore/EN/admin/role administration.html b/kthelp/ktcore/EN/admin/role administration.html new file mode 100644 index 0000000..506e880 --- /dev/null +++ b/kthelp/ktcore/EN/admin/role administration.html @@ -0,0 +1,47 @@ + + + + Role Administration + + +

    Role Administration

    +

    In DMS Administration >> Security Management >> Role Management page, you can:

    +

    +

      +
    • add new roles
    • +
    • edit roles (change the name of the role)
    • +
    • delete a role
    • +
    +

    +
    +

    + +

    What are Roles?

    +

    + +

    +To access the DMS, users must be assigned to Groups, or to Roles. Permissions are assigned to Groups and Roles on the Folder level. Roles are used to assign permissions to specific users for specific tasks. Example Roles may be: Reviewer, Publisher, Writer, Editor, Developer, Secretary, Anonymous. In smaller organizations there are likely to be groups with only one user, e.g. the 'manager', and in this case the Group concept can be replaced entirely by the 'Role'. +

    +
    +

    + + +

    Roles and Workflows

    +

    + +

    +Workflow actions, e.g. 'review', or 'publish', are typically assigned to a specific Role. The Role is granted permissions for working with the document, based on the type of tasks their role performs - e.g. reviewers need read and write permissions. +

    +
    +

    + + +

    Groups and Roles

    +

    + +

    +User Groups are allocated to Roles on a per-directory basis (by location), and are inherited from the root folder of the DMS. When assigning permissions or actions to Roles in a Workflow, you can use that Workflow anywhere in the site by assigning the appropriate Groups to it in that location. +

    + + diff --git a/kthelp/ktcore/EN/admin/system information.html b/kthelp/ktcore/EN/admin/system information.html new file mode 100644 index 0000000..40784e6 --- /dev/null +++ b/kthelp/ktcore/EN/admin/system information.html @@ -0,0 +1,31 @@ + + + + System information + + +

    System information

    +

    +In DMS Administration >> Miscellaneous >> Support and System Information you can download support information that helps you to identify and fix problems. +

    +
    +

    View System Support Information

    +

    +1. Click Download Support Information. +

    +
    +

    +This action downloads a collection of information on your KnowledgeTree installation. +

    +
    +

    +Note: You may required to send this information to KnowledgeTree support staff to assist with your issue. Sanitize the information before sending it to us if you believe that distribution represents a security risk for your organization, or enquire about sending the information directly to the KnowledgeTree developer dealing with your issue. +

    +
    +

    KnowledgeTree Issue Tracker

    +

    +To report bugs, view known issues, or to find out whether fixes have already applied for your problem in a newer version of KnowledgeTree, click on the link to the KnowledgeTree Issue Tracker. +

    + + diff --git a/kthelp/ktcore/EN/admin/workflow.html b/kthelp/ktcore/EN/admin/workflow.html new file mode 100644 index 0000000..a2efe82 --- /dev/null +++ b/kthelp/ktcore/EN/admin/workflow.html @@ -0,0 +1,64 @@ + + +Workflow + + + + +

    Workflow

    +

    Workflow may be defined as the process a document goes +through to serve its purpose in an organization. For example, an invoice is +created, distributed, then paid; a report may be created, reviewed, edited, and +distributed.

    +

    Some documents, such as tenders, may have complex +workflows, requiring input from several people within and outside of your +organization before the work is complete.

    +

    The KnowledgeTree administrator defines and manages +document workflows in DMS administration, and any KnowledgeTree user may be +involved in a document workflow.

    +

    Workflows in KnowledgeTree involve three key areas:

    +
      +
    1. Assigning workflows
    2. +
    3. States and Transitions
    4. +
    5. Workflow effects (Actions)
    6. +
    +

    Assigning workflows

    +

    A document in the repository can have +only one workflow attached to it at any given time. By default, workflows are +not automatically attached to new documents when they're added to the +repository. However, the administrator may configure the system to assign +workflows when new documents are created, or to assign workflows only to +specific documents. Users are also allowed to select and assign workflows to the +documents they are working with — provided they have the permissions to do so. +

    +

    States and Transitions

    +

    Workflows consist of states and +transitions. A state may be defined as a stage in a document's lifecycle, such +as 'billed' or 'draft'. Each workflow has a starting state, which is the initial +state for any document in a workflow.

    +

    Transitions, which may be defined as the +way in which documents move between states, are an essential part of the +workflow. Each state can have one or more transitions, depending on how the +administrator has created the workflow.

    +

    Transitions point to the next step in +the workflow, such as send to client or review, which effectively changes the +state of the document. Transitions represent the actions that may be performed +on a document. For example, an invoice starts in the generated state; then it is +sent to client, before it is marked as billed. Transitions are said to be +guarded — not all users are allowed to access them. In a publication workflow +for example, only users with the role reviewer would be allowed to review a +document, and to move it from draft to published.

    +

    Workflow effects (Actions)

    +

    Workflows are more than just states and +transitions. Users and administrators use workflows to restrict, deny or grant +access to documents in the repository, based on the document's position in the +workflow. For example, a state can restrict both actions and permissions on a +document — only reviewers may be allowed to discuss draft documents for +instance, while clients will be disallowed from viewing unbilled invoices, and +published documents will be prevented from being checked in or checked out of +the repository. Additionally, users in specified Roles or Groups can be notified +when a document reaches a certain state in a workflow. These notifications +display on the Dashboard and are emailed to users with specified email accounts.

    + + + diff --git a/kthelp/ktcore/EN/admin/workflow/overview.html b/kthelp/ktcore/EN/admin/workflow/overview.html new file mode 100644 index 0000000..4c5894c --- /dev/null +++ b/kthelp/ktcore/EN/admin/workflow/overview.html @@ -0,0 +1,28 @@ + + + + + + Workflow Overview + + + + +

    Workflow Overview

    + +

    Workflow allows you to assign a series of steps to the document creation and +management process. For example, a "News" workflow might have documents which +go from Research to Draft to Under Review +to Published, +with different people participating in the document's +lifecycle at each stage.  Naturally, not all documents have the +same needs in terms of workflow:  Invoices (which must be drawn up, mailed, and then marked as paid) are very different from Marketing documents. 

    +

    To facilitate this, KnowledgeTree allows the Administrator to +define a number of different workflows, each of which can be applied to +different documents as their organisation requires.

    + +

    Also see A Thing.

    +

    Back to Admin Help.

    + + + diff --git a/kthelp/ktcore/EN/browse.html b/kthelp/ktcore/EN/browse.html new file mode 100644 index 0000000..00d6b5b --- /dev/null +++ b/kthelp/ktcore/EN/browse.html @@ -0,0 +1,19 @@ + + + Browse Documents + + + +

    Browse Documents

    + + + + + + diff --git a/kthelp/ktcore/EN/dashboard.html b/kthelp/ktcore/EN/dashboard.html new file mode 100644 index 0000000..0acfe82 --- /dev/null +++ b/kthelp/ktcore/EN/dashboard.html @@ -0,0 +1,29 @@ + + + Dashboard + + +

    Dashboard

    +The Dashboard displays items relevant to the logged in user, such as a list of the documents you have checked out, and items requiring your attention. + + +

    Items that require your attention

    + +

    This section may include links to the following types of documents in the repository:

    + +
      +
    • Pending documents - documents in an approval workflow that need to be approved
    • + +
    • Subscription alerts and Notifications - documents that you have subscribed to, and which have been added, deleted, or modified. This section also lists documents requiring your input in the workflow cycle.
    • + +
    • Orphaned folders - orphaned folders are sub folders of parent folders where you do not have the appropriate view or other permissions. You have permissions for accessing the orphan folder, but you are not allowed to access the parent folder. The dashboard provides a direct link to the orphaned folder in the repository. This is because you do not have permissions to navigate to the folder through its' parent folder.
    • +
    + +

    Your Checked-out Documents

    + +This section lists the documents - if any - that the logged in user currently has checked out of the repository. You can click the link provided to go directly to the document in the repository, where you can download the document to view it, check the document back in, or cancel the document check out. + + + + + diff --git a/kthelp/ktcore/EN/loginDisclaimer.html b/kthelp/ktcore/EN/loginDisclaimer.html new file mode 100644 index 0000000..a0c94d0 --- /dev/null +++ b/kthelp/ktcore/EN/loginDisclaimer.html @@ -0,0 +1,4 @@ + +Login Disclaimer + + diff --git a/kthelp/ktcore/EN/pageDisclaimer.html b/kthelp/ktcore/EN/pageDisclaimer.html new file mode 100644 index 0000000..aeacfc3 --- /dev/null +++ b/kthelp/ktcore/EN/pageDisclaimer.html @@ -0,0 +1,4 @@ + +Page Disclaimer + + diff --git a/kthelp/ktcore/EN/search.html b/kthelp/ktcore/EN/search.html new file mode 100644 index 0000000..8e21e81 --- /dev/null +++ b/kthelp/ktcore/EN/search.html @@ -0,0 +1,19 @@ + +Search + +

    Search

    +

    KnowledgeTree provides three versatile search options Ā– +simple (quick) search, advanced search, and saved searches. Search is +permissions-based, so the system only returns items that the logged in user is +allowed to access.

    + +

    Specify a search term to search all text - including +document metadata and the contents of the following file types (if your +administrator has configured these options): MS Word, MS Excel, MS PowerPoint, +Adobe PDF, and Plain Text files.

    + +

    Please Note: words shorter than 4 characters long (e.g. "the" or +"for") are discarded from the search. Search also only ever returns fully matching words +(e.g. "Know" will not match "KnowledgeTree").

    + + \ No newline at end of file diff --git a/kthelp/ktcore/EN/user/portlets/Browse By.html b/kthelp/ktcore/EN/user/portlets/Browse By.html new file mode 100644 index 0000000..10eaff9 --- /dev/null +++ b/kthelp/ktcore/EN/user/portlets/Browse By.html @@ -0,0 +1,25 @@ + + + Browse By + + + +

    Browse By

    +

    +The Browse by ... menu in the Browse Documents tab allows you to select a 'browse mode' for navigating the document management system. +

    +
    +

    +KnowledgeTree's default 'browse mode' is browse by Folder. +

    +
    +

    Browse Modes

    +
      +
    • Folder - allows you to browse the folder through the folder hierarchy
    • +
    • Document Type - allows you to filter content to browse only documents of a selected document type.
    • +
    • Lookup Value - allows you to filter content to browse only documents that contain a selected lookup value.
    • +
    + + + + diff --git a/kthelp/ktcore/EN/user/portlets/Document Actions.html b/kthelp/ktcore/EN/user/portlets/Document Actions.html new file mode 100644 index 0000000..cbaf872 --- /dev/null +++ b/kthelp/ktcore/EN/user/portlets/Document Actions.html @@ -0,0 +1,91 @@ + + + Document Actions + + +

    Document Info menu

    + +

    Display Details

    + +Displays information about a currently selected document; e.g. filename, custom document number, file type, document version, created by, owned by, last update by, document type, workflow, document id, tags, category, author, media type, associated fieldsets, fields, field values +

    +

    Download

    +Downloads a copy of the current document without checking it out of the document management system. You can open the document to view it and/or save it to your local computer. +

    +

    Permissions

    +Displays the current permissions setup on the document. +

    +

    Transaction History

    +Displays a transaction history on the currently selected document, and includes a record of all transactions performed on the document. +

    +

    Version History

    +Displays a record of past content versions and past metadata versions of a currently selected document, and allows you to compare versions. +

    +

    View Roles

    +Displays current role allocations on the selected document. +

    + +

    Document Actions menu

    +

    Archive

    +Archives a currently selected document and renders the document invisible to non-administrative users. Only administrative users are allowed to restore archived documents. Archiving clears space in the repository in order to speed up search and document viewing. +

    +

    Change Document Ownership

    +Changes the document ownership. The new user becomes the document 'owner'. Note that changing the document owner may restrict access to the document if the new owner does not have the correct permissions on the document. +

    +

    Check-out

    +Checks the document out of the document management system, updates the transaction history, locks the document against check out and editing by other users, and downloads the document to your local computer, where you can edit the document before checking it back in to KnowledgeTree. +

    +

    Cancel Checkout

    +Displays only if you have the current document checked out. This action overrides the document's checked out status. The pre-checkout version of the document is restored to the document management system. To add any changes you made to your local copy of the document you will have to check it out again, add your changes, and check the document back in. +

    +

    Check-in

    +Displays only if you have the current document checked out. This action allows you to update the current document with the changes you made to your local, checked out copy, and increments the version by 0.1 on check-in. +

    +

    Copy

    +Copies the currently selected document to another location in the repository. +

    +

    Delete

    +Moves a document out of the folder hierarchy so that it is no longer available to system users. Deleted documents may be restored or expunged by the KnowledgeTree administrator. +

    +

    Discussion

    +Displays discussion threads on the document (if any) and allows you to create new threads, add to existing threads or add a post to an existing thread. Discussions are a low level collaboration tool that provides a forum for users to share their ideas on a document. +

    +

    Edit Metadata

    +Displays existing metadata on the currently selected document and allows you to edit the document's generic metadata. +

    +

    Email

    +Allows you to send an email message to one or more KnowledgeTree users or groups, and provides a link to the currently selected document. +

    +

    Generate PDF

    +Converts a currently selected document to PDF format. To view the file you need to have a PDF Reader installed. KnowledgeTree supports PDF conversion for the following file formats: doc, ods, odt, ott, txt, rtf, sxw, stw, xml, pdb, psw, ods, ots, sxc, stc, dif, dbf, xls, xlt, slk, csv, pxl, odp, otp, sxi, sti, ppt, pot, sxd, odg, otg, std, asc +This action displays only when the file format of the currently selected document is one of the supported options. +By default, the converted PDF is downloaded to your desktop. You may browse to select another location. +

    +

    Links

    +Allows you to display or remove existing links and create new links, and to open linked documents on a currently selected document. Document links establish associations between documents in the repository, and link to pages or sites on the Internet. Note that when creating document link types, the administrator specifies the type of relationship that the link implies between the linked documents – i.e. ā€˜associated with’, or ā€˜duplicated by’. KnowledgeTree ships with the following predefined link types: Attachment, Reference, Copy. +

    +

    Make Immutable

    +Locks the currently selected document so that no further content changes can be made to this document, and only administrators (in administration mode) can make changes to the metadata or can move or delete it. If you require assistance from an administrator to perform one of these tasks, use the Request Assistance action. +

    +

    Move

    +Moves the currently selected document to another location in the repository. Only users with the read and write permissions on a folder are allowed to move an item to another location in the repository. +

    +

    RSS

    +Generates a link on a currently selected document. You may copy the document link to an external aggregator to create a RSS Feed on the document in the repository. Ensure that your RSS reader is RSS 2.0 compatible. +

    +

    Rename

    +Renames the file name of a document, if you have 'write' permissions on the document. This action does not change the document title. It only changes the file name. For example, if you have a jpeg image file in the repository, and you want to change it into a bitmap. This involves renaming the file from filename .jpg to filename .bmp; then, checking out the .jpg file and checking in the bitmap version. +

    +

    Request Assistance

    +Sends a request for assistance on a document to the system administrator and the document owner. +

    +

    View Inline

    +Displays the content of a document within the document management system so that you can view it inline. Currently (April 2008), the View Inline plugin supports the following file types: png, jpeg, gif, tiff, html, xml, plain text documents +Future versions of KnowledgeTree may support additional file types. To preview other file types, convert the document to PDF, then download the document to view it. This action displays only when the current document is of a supported file type. +

    +

    Workflow

    +Displays assigned workflows (if any), and allows you to perform transitions on an existing workflow. This action also allows you to start a workflow on a currently selected document (if there is no existing workflow on the document). + + + + diff --git a/kthelp/ktcore/EN/user/portlets/Folder Actions.html b/kthelp/ktcore/EN/user/portlets/Folder Actions.html new file mode 100644 index 0000000..b78868f --- /dev/null +++ b/kthelp/ktcore/EN/user/portlets/Folder Actions.html @@ -0,0 +1,47 @@ + + + Folder Actions + + + + +

    About this folder

    +

    Display Details

    +Displays folder content. +

    +

    Folder Transactions

    +Displays a transaction history for the currently selected folder. Details include: username, action taken, date, comment. +

    +

    Actions on this folder

    +

    Add Document

    +Allows you to add a new document to the currently selected folder in KnowledgeTree's web interface. The document is uploaded from your local computer. +

    +

    Add a Folder

    +Adds a new sub folder (child folder) to the currently selected folder. Only users with the 'Add Folder' permission on a parent folder may add folders to the that parent folder in the repository. +

    +

    Allocate Roles

    +Only the KnowledgeTree administrator may allocate and edit roles. This action displays only for administrative users. +

    +

    Bulk Download

    +Downloads the entire contents of a folder stored in the document management system to a zipped file, which you can save to your computer for local viewing. This action displays only when you have permissions for this action on the folder. +

    +

    Bulk Upload

    +This action is only available where the functionality is available for your installation. Files should be placed in a zipped archive at the source location before performing this action. Bulk uploaded files retain the directory structure defined in the zip archive. Ensure that you use a supported compression format for bulk uploads to KnowledgeTree: Tgz, Tar, Zip, Deb, Ar +

    +

    Import from Server Location

    +Adds all documents and folders that are located at a specified location on your local server. This action is only available to the KnowledgeTree administrator. +

    +

    Permissions

    +Displays permissions setup on the currently selected folder. This action displays only if you have permissions for this action on the folder. +

    +

    RSS

    +Generates a link on a currently selected folder. You may copy the document link to an external aggregator to create a RSS Feed on the folder. Ensure that your RSS reader is RSS 2.0 compatible. +

    +

    Rename

    +Allows you to change the name of the currently selected folder. This action displays only if you have the required permissions on the folder, and is only allowed on the root folder. +

    +

    Usage Information

    +Displays reports on how the folder and its sub folders have been used. Usage information may be filtered by user, by general activity (date range, transaction type), and by folder content (workflow and document type). +

    + + diff --git a/kthelp/ktcore/EN/user/portlets/Search.html b/kthelp/ktcore/EN/user/portlets/Search.html new file mode 100644 index 0000000..b13c2df --- /dev/null +++ b/kthelp/ktcore/EN/user/portlets/Search.html @@ -0,0 +1,29 @@ + + + Search + + + +

    Search

    +

    KnowledgeTree provides three versatile search options simple (quick) search, advanced search, and saved searches. Search is +permissions-based, so the system only returns items that the logged in user is +allowed to access.

    +

    Note: words shorter than 4 characters long (e.g. "the" or "for") are discarded from the search. Search also only ever returns fully matching words (e.g. "Know" will not match "KnowledgeTree").

    +

    Simple (quick) search

    +

    Specify a search term to search all text - including +document metadata and the contents of the following file types (if your +administrator has configured these options): MS Word, MS Excel, MS PowerPoint, +Adobe PDF, and Plain Text files.

    +

    Advanced Search

    +

    Define criteria to launch a detailed Boolean search of the +repository. This search allows more detailed search requests (using document +metadata). For example, you can search for all MS Excel documents containing the +word 'Invoice'.

    +

    Saved search

    +

    The saved search function allows KnowledgeTree +administrators to pre-save useful advanced searches. For example, you may want +to save a search that shows all documents in a completed state of a workflow. +Saved searches save time on commonly used searches.

    + + + diff --git a/kthelp/ktcore/EN/user/portlets/Subscriptions.html b/kthelp/ktcore/EN/user/portlets/Subscriptions.html new file mode 100644 index 0000000..053e13f --- /dev/null +++ b/kthelp/ktcore/EN/user/portlets/Subscriptions.html @@ -0,0 +1,19 @@ + + +Subscriptions + + +

    Subscriptions

    +

    +Use the Subscriptions menu to view and remove existing subscriptions, and add new subscriptions on documents and folders. +

    +
    +

    +Subscribing to a document or folder allows notifications to be sent to you via email (if you have this feature activated on your system) when the document or folder is checked in/checked out, deleted, moved, archived, etc. +

    +
    +

    +User-specific notifications display on the Dashboard as internal RSS Feeds. Remove a subscription (unsubscribe from the document or folder) to stop receiving notifications. +

    + + diff --git a/kthelp/ktcore/EN/user/workflow.html b/kthelp/ktcore/EN/user/workflow.html new file mode 100644 index 0000000..50140b5 --- /dev/null +++ b/kthelp/ktcore/EN/user/workflow.html @@ -0,0 +1,90 @@ + + + + Workflow Overview + + + +

    View Assigned Workflows on a Selected Document

    +
      +
    • 1. Open the Document Details page of the document.
    • +
    • 2. Click Workflow.
    • +
    • 3. View settings for the workflow.
    • +
    +
    +

    Start a Workflow on a Document

    +You cannot override an existing workflow on a document. +
      +
    • 1. Open the Document Details page of the document.
    • +
    • 2. Click Workflow.
    • +
    • 3. Select a workflow.
    • +
    • 4. Click Start Workflow.
    • +
    +
    +

    Transition a Workflow

    +
      +
    • 1. Open the Document Details page of the document.
    • +
    • 2. Click Workflow.
    • +
    • 3. View settings for the workflow.
    • +
    • 4. Select a transition. Provide a reason for the transition.
    • +
    • 6. Click Perform Transition.
    • +
    +
    +

    Working with Workflows

    +The KnowledgeTree administrator defines and manages document workflows in DMS administration. When adding workflows, the administrator defines the workflow states, transitions, and workflow effects. +

    +

    Assigning workflows

    +A document may only have one workflow attached to it at any time. Workflows may be assigned manually on a per document basis, or automatically to specified documents. +

    + +

    States and Transitions

    +Workflows consist of States and Transitions. Transitions point to the next step in the workflow, and represent actions that may be performed on a document. For example, on a workflow called 'invoicing', 'billed may be a starting state, and 'paid' the end state; the workflow may be moved into the final state by the transition 'payment received'. Each state can have one or more transitions, depending on the workflow configuration. Some transitions may be 'guard transitions' that may only be performed by specified users. +

    + +

    Adding and Using Workflows

    +

    Workflow planning

    +1. Define the following details and business process of the workflow: +
      +
    • define a name for the workflow
    • +
    • plan workflow states
    • +
    • plan the transitions that lead to the states
    • +
    • consider workflow security at the various states and transitions - i.e. Will you only allow users that have been allocated to specific roles to perform one or more transitions? Must users have permissions to perform some transitions?
    • +
    +
    +

    Getting Started

    +1. Add the workflow to KnowledgeTree: +
      +
    • 1.1. define the workflow name
    • +
    • 1.2. list the states
    • +
    • 1.3. list the transitions
    • +
    • 1.4. connect transitions and states (configure the workflow process)
    • +
    +
    +2. Configure the workflow - set up security by state; assign permissions that are controlled by each state in the workflow; allocate state controlled permissions to groups and roles +

    +2.2. Set up notifications by state - select groups and roles who will receive notifications at specified states +

    +2.3. Configure transitions - set up guard triggers, and add transition effects (actions), which define what happens after the transition occurs, e.g. perhaps the document moves to a particular folder. +

    + +

    Working with existing workflows

    +After adding and configuring the workflow, you can perform the following tasks, if required: +
      +
    • edit the workflow name
    • +
    • enable / disable the workflow
    • +
    • add new states
    • +
    • add new transitions
    • +
    • edit the workflow process - i.e. change the connections you set up between states and transitions
    • +
    • view permissions that are currently controlled by states
    • +
    • remove state control of permissions
    • +
    • remove state-controlled permissions from groups and roles
    • +
    • view actions that are blocked by each state in the workflow
    • +
    • unblock document actions that are currently blocked by states in the workflow
    • +
    • view existing notifications
    • +
    • edit notifications
    • +
    • change the transition name
    • +
    • edit the transition restrictions
    • +
    • edit transition actions
    • +
    + + diff --git a/kthelp/ktcore/EN/welcome.html b/kthelp/ktcore/EN/welcome.html new file mode 100644 index 0000000..dc66eb8 --- /dev/null +++ b/kthelp/ktcore/EN/welcome.html @@ -0,0 +1,34 @@ + + +Welcome to #APP_NAME# + + +

    #APP_NAME# is Document Management Made Simple.


    + +

    Easily and securely + manage your company's document creation, editing, versioning, and sharing - all from + a powerful Web interface and Microsoft® Office® and Windows® Explorer® tools.

    +
    +

    #APP_NAME# Community Edition is licensed free of charge and supplied with +no support, no maintenance, +and no warranty.

    +
    + +

    Commercially supported and feature-enhanced editions of + #APP_NAME# are available:

    + +
    • KnowledgeTreeLive is an easy to use and powerful online + document management service based on the #APP_NAME# application you're currently + using. KnowledgeTreeLive provides you with all the powerful features of the premium + editions of #APP_NAME# without requiring you to invest in, and maintain, your own + servers.
    • +
    • #APP_NAME# Premium, Plus and Basic editions are commercially supported and + feature-enhanced editions of #APP_NAME#, providing your organization with the + peace of mind that you will always have access to our support engineers, powerful + desktop and Microsoft® Office® integration and other document management features.
    • + +
    +
    + + + diff --git a/kthelp/ktcore/EN/welcomeCommercial.html b/kthelp/ktcore/EN/welcomeCommercial.html new file mode 100644 index 0000000..b4793a2 --- /dev/null +++ b/kthelp/ktcore/EN/welcomeCommercial.html @@ -0,0 +1,14 @@ + + +Welcome to #APP_NAME# + + +

    #APP_NAME# is Document Management Made Simple.


    + + +

    Easily and securely manage your company's document creation, editing, versioning, and sharing - all from a powerful Web interface and Microsoft® Office and Windows® Explorer tools.


    + +

    A subscription to #APP_NAME# provides your organization with product updates, enhanced document management features, and commercial support. Please view your welcome mailer for information on accessing these services.


    + + + diff --git a/kthelp/ktcore/EN/workflow.html b/kthelp/ktcore/EN/workflow.html new file mode 100644 index 0000000..9d9e042 --- /dev/null +++ b/kthelp/ktcore/EN/workflow.html @@ -0,0 +1,64 @@ + + +Workflow + + + + +

    Workflow

    +

    Workflow may be defined as the process a document goes +through to serve its purpose in an organization. For example, an invoice is +created, distributed, then paid; a report may be created, reviewed, edited, and +distributed.

    +

    Some documents, such as tenders, may have complex +workflows, requiring input from several people within and outside of your +organization before the work is complete.

    +

    The KnowledgeTree administrator defines and manages +document workflows in DMS administration, and any KnowledgeTree user may be +involved in a document workflow.

    +

    Workflows in KnowledgeTree involve three key areas:

    +
      +
    1. Assigning workflows
    2. +
    3. States and Transitions
    4. +
    5. Workflow effects (Actions)
    6. +
    +

    Assigning workflows

    +

    A document in the repository can have +only one workflow attached to it at any given time. By default, workflows are +not automatically attached to new documents when theyĀ’re added to the +repository. However, the administrator may configure the system to assign +workflows when new documents are created, or to assign workflows only to +specific documents. Users are also allowed to select and assign workflows to the +documents they are working with Ā– provided they have the permissions to do so. +

    +

    States and Transitions

    +

    Workflows consist of states and +transitions. A state may be defined as a stage in a document’s lifecycle, such +as ‘billed’ or ‘draft’. Each workflow has a starting state, which is the initial +state for any document in a workflow.

    +

    Transitions, which may be defined as the +way in which documents move between states, are an essential part of the +workflow. Each state can have one or more transitions, depending on how the +administrator has created the workflow.

    +

    Transitions point to the next step in +the workflow, such as send to client or review, which effectively changes the +state of the document. Transitions represent the actions that may be performed +on a document. For example, an invoice starts in the generated state; then it is +sent to client, before it is marked as billed. Transitions are said to be +guarded Ā– not all users are allowed to access them. In a publication workflow +for example, only users with the role reviewer would be allowed to review a +document, and to move it from draft to published.

    +

    Workflow effects (Actions)

    +

    Workflows are more than just states and +transitions. Users and administrators use workflows to restrict, deny or grant +access to documents in the repository, based on the documentĀ’s position in the +workflow. For example, a state can restrict both actions and permissions on a +document Ā– only reviewers may be allowed to discuss draft documents for +instance, while clients will be disallowed from viewing unbilled invoices, and +published documents will be prevented from being checked in or checked out of +the repository. Additionally, users in specified Roles or Groups can be notified +when a document reaches a certain state in a workflow. These notifications +display on the Dashboard and are emailed to users with specified email accounts.

    + + + diff --git a/ktwebdav/index.php b/ktwebdav/index.php new file mode 100644 index 0000000..e40fd98 --- /dev/null +++ b/ktwebdav/index.php @@ -0,0 +1,46 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +/* Redirect to a different page in the current directory that was requested */ +$host = $_SERVER['HTTP_HOST']; +$uri = rtrim( dirname( $_SERVER['PHP_SELF']), '/\\'); +$page= 'ktwebdav.php'; +header( "Location: http://$host$uri/$page"); +exit; +?> diff --git a/ktwebdav/ktwebdav.php b/ktwebdav/ktwebdav.php new file mode 100644 index 0000000..8b42235 --- /dev/null +++ b/ktwebdav/ktwebdav.php @@ -0,0 +1,54 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + + $userAgentValue = $_SERVER['HTTP_USER_AGENT']; + if (stristr($userAgentValue, "Microsoft Data Access Internet Publishing Provider DAV")) { + // Fix for Novell Netdrive + chdir(realpath(dirname(__FILE__))); + } + + $webdav_pear_path = 'thirdparty/pear'; + $kt_pear_path = '../thirdparty/pear'; + $include_path = ini_get('include_path'); + ini_set('include_path', $webdav_pear_path . PATH_SEPARATOR . $kt_pear_path . PATH_SEPARATOR . $include_path); + + require_once "lib/KTWebDAVServer.inc.php"; + $ktwebdav = new KTWebDAVServer(); + $ktwebdav->ServeRequest(); +?> diff --git a/ktwebdav/lib/KTWebDAVServer.inc.php b/ktwebdav/lib/KTWebDAVServer.inc.php new file mode 100644 index 0000000..cb4d796 --- /dev/null +++ b/ktwebdav/lib/KTWebDAVServer.inc.php @@ -0,0 +1,2613 @@ +. + * + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, + * California 94120-7775, or email info@knowledgetree.com. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "Powered by + * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. + * Contributor( s): ______________________________________ + * + */ + +require_once 'HTTP/WebDAV/Server.php'; // thirdparty PEAR +require_once 'Config.php'; // thirdparty PEAR +require_once 'Log.php'; // thirdparty PEAR + +$userAgentValue = $_SERVER['HTTP_USER_AGENT']; +if (stristr($userAgentValue, "Microsoft Data Access Internet Publishing Provider DAV")) { + // Fix for Novell Netdrive + chdir(realpath(dirname(__FILE__))); + require_once '../../config/dmsDefaults.php'; // This is our plug into KT. +}else{ + require_once '../config/dmsDefaults.php'; // This is our plug into KT. +} + +DEFINE('STATUS_WEBDAV', 5); // Status code to handle 0 byte PUT FIXME: Do we still need this! + +/** + * KnowledgeTree access using WebDAV protocol + * + * @access public + */ +class KTWebDAVServer extends HTTP_WebDAV_Server +{ + /** + * String to be used in "X-Dav-Powered-By" header + * + * @var string + */ + var $dav_powered_by = 'KTWebDAV (1.0.0)'; + + /** + * Realm string to be used in authentication + * + * @var string + */ + var $http_auth_realm = 'KTWebDAV Server'; + + /** + * Path to KT install root + * + * @var string + */ + var $ktdmsPath = ''; + + /** + * Debug Info Toggle + * + * @var string + */ + var $debugInfo = 'off'; + + /** + * Safe Mode Toggle + * + * @var string + */ + var $safeMode = 'on'; + + /** + * Configuration Array + * + * @var array + */ + var $config = array(); + + /** + * Settings Section Configuration Array + * + * @var array + */ + var $settings = array(); + + /** + * Current User ID + * + * @var int + */ + var $userID; + + /** + * Current Method + * + * @var string + */ + var $currentMethod; + + /** + * Last Created Folder ID + * + * @var string + */ + var $lastFolderID; + + /** + * DAV Client + * + * @var String + */ + var $dav_client; + + /** + * Root Folder Name + * + * @var String + */ + var $rootFolder = 'Root Folder'; + + /** + * Last Message + * + * @var String + */ + var $lastMsg = ''; + + /** + * Constructor + * + * @param void + * @return void + */ + function KTWebDAVServer() { + // CGI compatible auth setup + $altinfo = KTUtil::arrayGet( $_SERVER, 'kt_auth', KTUtil::arrayGet( $_SERVER, 'REDIRECT_kt_auth')); + if ( !empty( $altinfo) && !isset( $_SERVER['PHP_AUTH_USER'])) { + $val = $altinfo; + $pieces = explode( ' ', $val); // bad. + if ( $pieces[0] == 'Basic') { + $chunk = $pieces[1]; + $decoded = base64_decode( $chunk); + $credential_info = explode( ':', $decoded); + if ( count( $credential_info) == 2) { + $_SERVER['PHP_AUTH_USER'] = $credential_info[0]; + $_SERVER['PHP_AUTH_PW'] = $credential_info[1]; + $_SERVER["AUTH_TYPE"] = 'Basic'; + } + } + } + + // Let the base class do it's thing + parent::HTTP_WebDAV_Server(); + + // Load KTWebDAV config + if (!$this->initConfig()) { + $this->ktwebdavLog('Could not load configuration.', 'error'); + exit(0); + } + + if ($this->debugInfo == 'on') { + + $this->ktwebdavLog('====================='); + $this->ktwebdavLog(' Debug Info is : ' . $this->debugInfo); + $this->ktwebdavLog(' SafeMode is : ' . $this->safeMode); + $this->ktwebdavLog(' Root Folder is : ' . $this->rootFolder); + $this->ktwebdavLog('====================='); + } + + } + + /** + * Load KTWebDAV configuration from conf file + * + * @param void + * @return bool true on success + */ + function initConfig() { + + global $default; + $oConfig =& KTConfig::getSingleton(); + + // Assign Content + $this->debugInfo = $oConfig->get('KTWebDAVSettings/debug', 'off'); + $this->safeMode = $oConfig->get('KTWebDAVSettings/safemode', 'on'); + $this->rootFolder = $oConfig->get('KTWebDAVSettings/rootfolder', 'Root Folder'); + $this->kt_version = $default->systemVersion; + + return true; + } + + /** + * Log to the KTWebDAV logfile + * + * @todo Add other log levels for warning, profile, etc + * @param string log message + * @param bool debug only? + * @return bool true on success + */ + function ktwebdavLog($entry, $type = 'info', $debug_only = false) { + + if ($debug_only && $this->debugInfo != 'on') return false; + + $ident = 'KTWEBDAV'; + $conf = array('mode' => 0644, 'timeFormat' => '%X %x'); + $logger = &Log::singleton('file', '../../var/log/ktwebdav-' . date('Y-m-d') . '.txt', $ident, $conf); + if ($type == 'error') $logger->log($entry, PEAR_LOG_ERR); + else $logger->log($entry, PEAR_LOG_INFO); + return true; + } + + /** + * Get the current UserID + * + * @access private + * @param void + * @return int userID + */ + function _getUserID() { + return $this->userID; + } + + /** + * Set the current UserID + * + * @access private + * @param void + * @return int UserID + */ + function _setUserID($iUserID) { + return $this->userID = $iUserID; + } + + /** + * Serve a webdav request + * + * @access public + * @param void + * @return void + */ + function ServeRequest() { + + global $default; + + if ($this->debugInfo == 'on') { + + $this->ktwebdavLog('_SERVER is ' . print_r($_SERVER, true), 'info', true); + } + + // Check for electronic signatures - if enabled exit + $oConfig =& KTConfig::getSingleton(); + $enabled = $oConfig->get('e_signatures/enableApiSignatures', false); + if($enabled){ + $this->ktwebdavLog('Electronic Signatures have been enabled, disabling WebDAV.', 'info'); + + $data = "KTWebDAV - The KnowledgeTree WebDAV Server"; + $data .= ""; + $data .= "

    "; + $data .= "

    Welcome to KnowledgeTree WebDAV Server



    "; + $data .= "
    The WebDAV Server has been disabled!


    "; + $data .= "
    Electronic Signatures are enabled.


    "; + $data .= ""; + + header('HTTP/1.1 403 Forbidden'); + header('Content-Type: text/html; charset="utf-8"'); + echo $data; + + exit(0); + } + + // Get the client info + $this->checkSafeMode(); + + // identify ourselves + $this->ktwebdavLog('WebDAV Server : ' . $this->dav_powered_by . ' [KT:'.$default->systemVersion."]", 'info', true); + header('X-Dav-Powered-By: '.$this->dav_powered_by . ' [KT:'.$default->systemVersion.']'); + + // check authentication + if (!$this->_check_auth()) { + $this->ktwebdavLog('401 Unauthorized - Authorisation failed.' .$this->lastMsg, 'info', true); + $this->ktwebdavLog('----------------------------------------', 'info', true); + $this->http_status('401 Unauthorized - Authorisation failed. ' .$this->lastMsg); + + // RFC2518 says we must use Digest instead of Basic + // but Microsoft Clients do not support Digest + // and we don't support NTLM and Kerberos + // so we are stuck with Basic here + header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"'); + + return; + } + + // check + if(! $this->_check_if_header_conditions()) { + $this->http_status('412 Precondition failed'); + return; + } + + // set path + $request_uri = $this->_urldecode(!empty($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/'); + $this->path = str_replace($_SERVER['SCRIPT_NAME'], '', $request_uri); + if(ini_get('magic_quotes_gpc')) { + $this->path = stripslashes($this->path); + } + + $this->ktwebdavLog('PATH_INFO is ' . $_SERVER['PATH_INFO'], 'info', true); + $this->ktwebdavLog('REQUEST_URI is ' . $_SERVER['REQUEST_URI'], 'info', true); + $this->ktwebdavLog('SCRIPT_NAME is ' . $_SERVER['SCRIPT_NAME'], 'info', true); + $this->ktwebdavLog('PHP_SELF is ' . $_SERVER['PHP_SELF'], 'info', true); + $this->ktwebdavLog('path set to ' . $this->path, 'info', true); + + // detect requested method names + $method = strtolower($_SERVER['REQUEST_METHOD']); + $wrapper = 'http_'.$method; + + $this->currentMethod = $method; + // activate HEAD emulation by GET if no HEAD method found + if ($method == 'head' && !method_exists($this, 'head')) { + // rfc2068 Sec: 10.2.1 + //HEAD the entity-header fields corresponding to the requested resource + // are sent in the response without any message-body + $method = 'get'; + } + $this->ktwebdavLog("Entering $method request", 'info', true); + + if (method_exists($this, $wrapper) && ($method == 'options' || method_exists($this, $method))) { + $this->$wrapper(); // call method by name + } else { // method not found/implemented + if ($_SERVER['REQUEST_METHOD'] == 'LOCK') { + $this->http_status('412 Precondition failed'); + } else { + $this->http_status('405 Method not allowed'); + header('Allow: '.join(', ', $this->_allow())); // tell client what's allowed + } + } + + $this->ktwebdavLog("Exiting $method request", 'info', true); + } + + /** + * check authentication if check is implemented + * + * @param void + * @return bool true if authentication succeded or not necessary + */ + function _check_auth() + { + $this->ktwebdavLog('Entering _check_auth...', 'info', true); + + // Workaround for mod_auth when running php cgi + if(!isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['HTTP_AUTHORIZATION'])){ + list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); + } + + if (method_exists($this, 'checkAuth')) { + // PEAR style method name + return $this->checkAuth(@$_SERVER['AUTH_TYPE'], + @$_SERVER['PHP_AUTH_USER'], + @$_SERVER['PHP_AUTH_PW']); + } else if (method_exists($this, 'check_auth')) { + // old (pre 1.0) method name + return $this->check_auth(@$_SERVER['AUTH_TYPE'], + @$_SERVER['PHP_AUTH_USER'], + @$_SERVER['PHP_AUTH_PW']); + } else { + // no method found -> no authentication required + return true; + } + } + + /** + * Authenticate user + * + * @access private + * @param string HTTP Authentication type (Basic, Digest, ...) + * @param string Username + * @param string Password + * @return bool true on successful authentication + */ + function checkAuth($sType, $sUser, $sPass) { + + $this->ktwebdavLog('Entering checkAuth params are: ', 'info', true); + $this->ktwebdavLog('sType: ' . $sType, 'info', true); + $this->ktwebdavLog('sUser: ' . $sUser, 'info', true); + $this->ktwebdavLog('sPass: ' . $sPass, 'info', true); + + // Authenticate user + + require_once(KT_LIB_DIR . '/authentication/authenticationutil.inc.php'); + + if ( empty($sUser) ) { + $this->ktwebdavLog('sUser is empty, returning false.', 'info', true); + return false; + } + + if ( empty($sPass) ) { + $this->ktwebdavLog('sPass is empty, returning false.', 'info', true); + return false; + } + + $sUser = iconv('ISO-8859-1', 'UTF-8', $sUser); + $sPass = iconv('ISO-8859-1', 'UTF-8', $sPass); + $oUser =& User::getByUsername($sUser); + if (PEAR::isError($oUser) || ($oUser === false)) { + $this->ktwebdavLog('User not found: ' . $sUser . '.', 'error'); + $this->lastMsg = 'User not found: ' . $sUser . '.'; + return false; + } + $authenticated = KTAuthenticationUtil::checkPassword($oUser, $sPass); + + if ($authenticated === false) { + $this->ktwebdavLog('Password incorrect for ' . $sUser . '.', 'error'); + $this->lastMsg = 'Password incorrect for ' . $sUser . '.'; + return false; + } + + if (PEAR::isError($authenticated)) { + $this->ktwebdavLog('Password incorrect for ' . $sUser . '.', 'error'); + $this->lastMsg = 'Password incorrect for ' . $sUser . '.'; + return false; + } + + $oUser->setLastLogin(date('Y-m-d H:i:s')); + $oUser->update(); + + $this->ktwebdavLog('Session ID is: '.$sessionID, 'info', true); + $this->ktwebdavLog('UserID is: ' . $oUser->getId(), 'info', true ); + $this->_setUserID($oUser->getId()); + $_SESSION['userID'] = $this->_getUserID(); + $this->ktwebdavLog('SESSION UserID is: ' . $_SESSION['userID'], 'info', true ); + + $this->ktwebdavLog("Authentication Success.", 'info', true); + + return true; + } + + /** + * PROPFIND method handler + * + * @param array options + * @param array return array for file properties + * @return bool true on success + */ + function PROPFIND(&$options, &$files) { + + $this->ktwebdavLog("Entering PROPFIND. options are " . print_r($options, true), 'info', true); + + global $default; + + $fspath = $default->documentRoot . "/" . $this->rootFolder . $options["path"]; + $this->ktwebdavLog("fspath is " . $fspath, 'info', true); + + $path = $options["path"]; + + // Fix for the Mac Goliath Client + // Mac adds DS_Store files when folders are added and ._filename files when files are added + // The PUT function doesn't add these files to the dms but PROPFIND still looks for the .DS_Store file, + // and returns an error if not found. We emulate its existence by returning a positive result. + if($this->dav_client == 'MG'){ + // Remove filename from path + $aPath = explode('/', $path); + $fileName = $aPath[count($aPath)-1]; + + if(strtolower($fileName) == '.ds_store'){ + $this->ktwebdavLog("Using a Mac client. Filename is .DS_Store so we emulate a positive result.", 'info', true); + // ignore + return true; + } + if($fileName[0] == '.' && $fileName[1] == '_'){ + $this->ktwebdavLog("Using a Mac client. Filename is ._Filename so we emulate a positive result.", 'info', true); + // ignore + return true; + } + } + + list($iFolderID, $iDocumentID) = $this->_folderOrDocument($path); + $this->ktwebdavLog("Folder/Doc is " . print_r(array($iFolderID, $iDocumentID), true), 'info', true); + + // Folder does not exist + if($iFolderID == '') return false; + + if (is_null($iDocumentID)) { + return $this->_PROPFINDFolder($options, $files, $iFolderID); + } + return $this->_PROPFINDDocument($options, $files, $iDocumentID); + + } + + /** + * PROPFIND helper for Folders + * + * @param array options + * @param array Return array for file props + * @param int Folder ID + * @return bool true on success + */ + function _PROPFINDFolder(&$options, &$files, $iFolderID) { + + global $default; + + $this->ktwebdavLog("Entering PROPFINDFolder. options are " . print_r($options, true), 'info', true); + + $folder_path = $options["path"]; + if (substr($folder_path, -1) != "/") { + $folder_path .= "/"; + } + $options["path"] = $folder_path; + + $files["files"] = array(); + $files["files"][] = $this->_fileinfoForFolderID($iFolderID, $folder_path); + + $oPerm =& KTPermission::getByName('ktcore.permissions.read'); + $oUser =& User::get($this->userID); + + if (!empty($options["depth"])) { + $aChildren = Folder::getList(array('parent_id = ?', $iFolderID)); + // FIXME: Truncation Time Workaround + //foreach (array_slice($aChildren, 0, 50) as $oChildFolder) { + foreach ($aChildren as $oChildFolder) { + // Check if the user has permissions to view this folder + $oFolderDetailsPerm =& KTPermission::getByName('ktcore.permissions.folder_details'); + + if(KTPermissionUtil::userHasPermissionOnItem($oUser, $oFolderDetailsPerm, $oChildFolder)) + { + $this->ktwebdavLog("Folder Details permissions GRANTED for user ". $_SESSION["userID"] ." on folder " . $oChildFolder->getName(), 'info', true); + $files["files"][] = $this->_fileinfoForFolder($oChildFolder, $folder_path . $oChildFolder->getName()); + } + else + { + $this->ktwebdavLog("Folder Details permissions DENIED for ". $_SESSION["userID"] ." on folder " . $oChildFolder->getName(), 'info', true); + } + } + $aDocumentChildren = Document::getList(array('folder_id = ? AND status_id = 1', $iFolderID)); + // FIXME: Truncation Time Workaround + //foreach (array_slice($aDocumentChildren, 0, 50) as $oChildDocument) { + foreach ($aDocumentChildren as $oChildDocument) { + // Check if the user has permissions to view this document + if (KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oChildDocument)) { + $this->ktwebdavLog("Read permissions GRANTED for ". $_SESSION["userID"] ." on document " . $oChildDocument->getName(), 'info', true); + $files["files"][] = $this->_fileinfoForDocument($oChildDocument, $folder_path . $oChildDocument->getFileName()); + } else $this->ktwebdavLog("Read permissions DENIED for ". $_SESSION["userID"] ." on document " . $oChildDocument->getName(), 'info', true); + } + } + return true; + } + + /** + * PROPFIND helper for Documents + * + * @param array options + * @param array Return array for file props + * @param int Document ID + * @return bool true on success + */ + function _PROPFINDDocument(&$options, &$files, $iDocumentID) { + + global $default; + + $this->ktwebdavLog("Entering PROPFINDDocument. files are " . print_r($files, true), 'info', true); + + $res = $this->_fileinfoForDocumentID($iDocumentID, $options["path"]); + $this->ktwebdavLog("_fileinfoForDocumentID result is " . print_r($res, true), 'info', true); + if ($res === false) { + return false; + } + $files["files"] = array(); + $files["files"][] = $res; + return true; + } + + /** + * PROPFIND helper for Document Info + * + * @param Document Document Object + * @param string Path + * @return array Doc info array + */ + function _fileinfoForDocument(&$oDocument, $path) { + + global $default; + + $this->ktwebdavLog("Entering _fileinfoForDocument. Document is " . print_r($oDocument, true), 'info', true); + + $fspath = $default->documentRoot . "/" . $this->rootFolder . $path; + $this->ktwebdavLog("fspath is " . $fspath, 'info', true); + + // create result array + // Modified - 25/10/07 - spaces prevent files displaying in finder + if($this->dav_client == 'MC'){ + $path = str_replace('%2F', '/', urlencode($path)); + } + $path = str_replace('&', '%26', $path); + + $info = array(); + $info["path"] = $path; + $info["props"] = array(); + + // no special beautified displayname here ... + $info["props"][] = $this->mkprop("displayname", $oDocument->getName()); + + // creation and modification time + $info["props"][] = $this->mkprop("creationdate", strtotime($oDocument->getCreatedDateTime())); + $info["props"][] = $this->mkprop("getlastmodified", strtotime($oDocument->getVersionCreated())); + + // plain file (WebDAV resource) + $info["props"][] = $this->mkprop("resourcetype", ''); + // FIXME: Direct database access + $sQuery = array("SELECT mimetypes FROM $default->mimetypes_table WHERE id = ?", array($oDocument->getMimeTypeID())); + $res = DBUtil::getOneResultKey($sQuery, 'mimetypes'); + $info["props"][] = $this->mkprop("getcontenttype", $res); + + $info["props"][] = $this->mkprop("getcontentlength", $oDocument->getFileSize()); + + // explorer wants these? + $info["props"][] = $this->mkprop("name", ''); + $info["props"][] = $this->mkprop("parentname", ''); + $info["props"][] = $this->mkprop("href", ''); + $info["props"][] = $this->mkprop("ishidden", ''); + $info["props"][] = $this->mkprop("iscollection", ''); + $info["props"][] = $this->mkprop("isreadonly", ''); + $info["props"][] = $this->mkprop("contentclass", ''); + $info["props"][] = $this->mkprop("getcontentlanguage", ''); + $info["props"][] = $this->mkprop("lastaccessed", ''); + $info["props"][] = $this->mkprop("isstructureddocument", ''); + $info["props"][] = $this->mkprop("defaultdocument", ''); + $info["props"][] = $this->mkprop("isroot", ''); + + return $info; + } + + + /** + * PROPFIND helper for Document Info + * + * @param int Document ID + * @param string path + * @return array Doc info array + */ + function _fileinfoForDocumentID($iDocumentID, $path) { + + global $default; + + $this->ktwebdavLog("Entering _fileinfoForDocumentID. DocumentID is " . print_r($iDocumentID, true), 'info', true); + + if ($iDocumentID == '') return false; + + $oDocument =& Document::get($iDocumentID); + + if (is_null($oDocument) || ($oDocument === false) || PEAR::isError($oDocument)) { + return false; + } + + return $this->_fileinfoForDocument($oDocument, $path); + + } + + /** + * PROPFIND helper for Folder Info + * + * @param Folder Folder Object + * @param string $path + * @return array Folder info array + */ + function _fileinfoForFolder($oFolder, $path) { + + global $default; + + $this->ktwebdavLog("Entering _fileinfoForFolder. Folder is " . print_r($oFolder, true), 'info', true); + + // Fix for Mac + // Modified - 25/10/07 - spaces prevent files displaying in finder + if($this->dav_client == 'MC'){ + $path = str_replace('%2F', '/', urlencode(utf8_encode($path))); + } + $path = str_replace('&', '%26', $path); + + // create result array + $info = array(); + $info["path"] = $path; + $fspath = $default->documentRoot . "/" . $this->rootFolder . $path; + //$fspath = $default->documentRoot . '/' . $oFolder->generateFolderPath($oFolder->getID()); + + $info["props"] = array(); + // no special beautified displayname here ... + $info["props"][] = $this->mkprop("displayname", $oFolder->getName()); + + // creation and modification time + //$info["props"][] = $this->mkprop("creationdate", strtotime($oFolder->getCreatedDateTime())); + //$info["props"][] = $this->mkprop("getlastmodified", strtotime($oFolder->getVersionCreated())); + + // directory (WebDAV collection) + $info["props"][] = $this->mkprop("resourcetype", "collection"); + $info["props"][] = $this->mkprop("getcontenttype", "httpd/unix-directory"); + $info["props"][] = $this->mkprop("getcontentlength", 0); + + return $info; + } + + /** + * PROPFIND method handler + * + * @param void + * @return void + */ + function http_PROPFIND() + { + $options = Array(); + $options["path"] = $this->path; + + // search depth from header (default is "infinity) + if (isset($_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // analyze request payload + $propinfo = new _parse_propfind("php://input"); + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + $options['props'] = $propinfo->props; + + // call user handler + if (!$this->PROPFIND($options, $files)) { + $this->http_status("404 Not Found"); + return; + } + + // collect namespaces here + $ns_hash = array(); + + // Microsoft Clients need this special namespace for date and time values + $ns_defs = "xmlns:ns0=\"urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/\""; + + // now we loop over all returned file entries + foreach($files["files"] as $filekey => $file) { + + // nothing to do if no properties were returned for a file + if (!isset($file["props"]) || !is_array($file["props"])) { + continue; + } + + // now loop over all returned properties + foreach($file["props"] as $key => $prop) { + // as a convenience feature we do not require that user handlers + // restrict returned properties to the requested ones + // here we strip all unrequested entries out of the response + + switch($options['props']) { + case "all": + // nothing to remove + break; + + case "names": + // only the names of all existing properties were requested + // so we remove all values + unset($files["files"][$filekey]["props"][$key]["val"]); + break; + + default: + $found = false; + + // search property name in requested properties + foreach((array)$options["props"] as $reqprop) { + if ( $reqprop["name"] == $prop["name"] + && $reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + // unset property and continue with next one if not found/requested + if (!$found) { + $files["files"][$filekey]["props"][$key]=''; + continue(2); + } + break; + } + + // namespace handling + if (empty($prop["ns"])) continue; // no namespace + $ns = $prop["ns"]; + if ($ns == "DAV:") continue; // default namespace + if (isset($ns_hash[$ns])) continue; // already known + + // register namespace + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$ns] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$ns\""; + } + + // we also need to add empty entries for properties that were requested + // but for which no values where returned by the user handler + if (is_array($options['props'])) { + foreach($options["props"] as $reqprop) { + if($reqprop['name']=='') continue; // skip empty entries + + $found = false; + + // check if property exists in result + foreach($file["props"] as $prop) { + if ( $reqprop["name"] == $prop["name"] + && $reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + if (!$found) { + if($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") { + // lockdiscovery is handled by the base class + $files["files"][$filekey]["props"][] + = $this->mkprop("DAV:", + "lockdiscovery" , + $this->lockdiscovery($files["files"][$filekey]['path'])); + } else { + // add empty value for this property + $files["files"][$filekey]["noprops"][] = $this->mkprop($reqprop["xmlns"], $reqprop["name"], ''); + + // register property namespace if not known yet + if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$reqprop["xmlns"]] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\""; + } + } + } + } + } + } + + // now we generate the reply header ... + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + // ... and payload + echo "\n"; + echo "\n"; + + foreach($files["files"] as $file) { + // ignore empty or incomplete entries + if(!is_array($file) || empty($file) || !isset($file["path"])) continue; + $path = $file['path']; + if(!is_string($path) || $path==='') continue; + + echo " \n"; + + $tempHref = $this->_mergePathes($_SERVER['SCRIPT_NAME'], $path); + + // Ensure collections end in a slash + if(isset($file['props'])){ + foreach($file['props'] as $v){ + if($v['name'] == 'resourcetype'){ + if($v['val'] == 'collection'){ + $tempHref = $this->_slashify($tempHref); + continue; + } + } + } + } + + $href = htmlspecialchars($tempHref); + + echo " $href\n"; + + $this->ktwebdavLog("\nfile is: " . print_r($file, true), 'info', true); + + // report all found properties and their values (if any) + if (isset($file["props"]) && is_array($file["props"])) { + echo " \n"; + echo " \n"; + + foreach($file["props"] as $key => $prop) { + + if (!is_array($prop)) continue; + if (!isset($prop["name"])) continue; + + $this->ktwebdavLog("Namespace is " . $prop["ns"], 'info', true); + + if (!isset($prop["val"]) || $prop["val"] === '' || $prop["val"] === false) { + // empty properties (cannot use empty() for check as "0" is a legal value here) + if($prop["ns"]=="DAV:") { + echo " \n"; + } else if(!empty($prop["ns"])) { + echo " <".$ns_hash[$prop["ns"]].":$prop[name]/>\n"; + } else { + echo " <$prop[name] xmlns=\"\"/>"; + } + } else if ($prop["ns"] == "DAV:") { + $this->ktwebdavLog("Getting DAV: Properties...", 'info', true); + // some WebDAV properties need special treatment + switch ($prop["name"]) { + case "creationdate": + $this->ktwebdavLog("Getting creationdate...", 'info', true); + echo " " + . gmdate("Y-m-d\\TH:i:s\\Z",$prop['val']) + . "\n"; + break; + case "getlastmodified": + $this->ktwebdavLog("Getting getlastmodified...", 'info', true); + echo " " + . gmdate("D, d M Y H:i:s ", $prop['val']) + . "GMT\n"; + break; + case "resourcetype": + $this->ktwebdavLog("Getting resourcetype...", 'info', true); + echo " \n"; + break; + case "supportedlock": + $this->ktwebdavLog("Getting supportedlock...", 'info', true); + echo " $prop[val]\n"; + break; + case "lockdiscovery": + $this->ktwebdavLog("Getting lockdiscovery...", 'info', true); + echo " \n"; + echo $prop["val"]; + echo " \n"; + break; + default: + $this->ktwebdavLog("Getting default...", 'info', true); + $this->ktwebdavLog("name is: " . $prop['name'], 'info', true); + $this->ktwebdavLog("val is: " . $this->_prop_encode(htmlspecialchars($prop['val'])), 'info', true); + echo " " + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + break; + } + } else { + // properties from namespaces != "DAV:" or without any namespace + $this->ktwebdavLog('Getting != "DAV:" or without any namespace Properties...', 'info', true); + if ($prop["ns"]) { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]>" + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + } else { + echo " <$prop[name] xmlns=\"\">" + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + } + } + } + + echo " \n"; + echo " HTTP/1.1 200 OK\n"; + echo " \n"; + } + + // now report all properties requested but not found + $this->ktwebdavLog('Getting all properties requested but not found...', 'info', true); + if (isset($file["noprops"])) { + echo " \n"; + echo " \n"; + + foreach($file["noprops"] as $key => $prop) { + if ($prop["ns"] == "DAV:") { + echo " \n"; + } else if ($prop["ns"] == '') { + echo " <$prop[name] xmlns=\"\"/>\n"; + } else { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n"; + } + } + + echo " \n"; + echo " HTTP/1.1 404 Not Found\n"; + echo " \n"; + } + + echo " \n"; + } + + echo "\n"; + } + + /** + * PROPFIND helper for Folder Info + * + * @param int Folder ID + * @param string path + * @return array Folder info array + */ + function _fileinfoForFolderID($iFolderID, $path) { + + global $default; + + $this->ktwebdavLog("Entering _fileinfoForFolderID. FolderID is " . $iFolderID, 'info', true); + + if($iFolderID == '') return false; + + $oFolder =& Folder::get($iFolderID); + + if (is_null($oFolder) || ($oFolder === false)) { + $this->ktwebdavLog("oFolderID error. ", 'info', true); + return false; + } + + return $this->_fileinfoForFolder($oFolder, $path); + } + + /** + * GET method handler + * + * @param array parameter passing array + * @return bool true on success + */ + function GET(&$options) + { + // required for KT + global $default; + + $this->ktwebdavLog("Entering GET. options are " . print_r($options, true), 'info', true); + + // Get the client info + $this->checkSafeMode(); + + // get path to requested resource + $path = $options["path"]; + + // Fix for Mac Clients + // Mac adds DS_Store files when folders are added and ._filename files when files are added + // The PUT function doesn't add these files to the dms but PROPFIND still looks for the .DS_Store file, + // and returns an error if not found. We emulate its existence by returning a positive result. + if($this->dav_client == 'MC' || $this->dav_client == 'MG'){ + // Remove filename from path + $aPath = explode('/', $path); + $fileName = $aPath[count($aPath)-1]; + + if(strtolower($fileName) == '.ds_store'){ + $this->ktwebdavLog("Using a Mac client. Filename is .DS_Store so we emulate a positive result.", 'info', true); + // ignore + return true; + } + if($fileName[0] == '.' && $fileName[1] == '_'){ + $this->ktwebdavLog("Using a Mac client. Filename is ._Filename so we emulate a positive result.", 'info', true); + // ignore + return true; + } + } + + list($iFolderID, $iDocumentID) = $this->_folderOrDocument($path); + + if ($iDocumentID === false) { + $this->ktwebdavLog("Document not found.", 'info', true); + return "404 Not found - Document not found."; + } + + if (is_null($iDocumentID)) { + return $this->_GETFolder($options, $iFolderID); + } + return $this->_GETDocument($options, $iDocumentID); + + } + + /** + * GET method helper + * + * @param array parameter passing array + * @param int MainFolder ID + * @return bool true on success + */ + function _GETFolder(&$options, $iMainFolderID) { + + global $default; + + $this->ktwebdavLog("Entering _GETFolder. options are " . print_r($options, true), 'info', true); + + $oMainFolder =& Folder::get($iMainFolderID); + $aFolderID = array(); + $aChildren = Folder::getList(array('parent_id = ?', $iMainFolderID)); + // $sFolderName = $oMainFolder->getName(); + + if (is_writeable("../var") && is_writeable("../var/log")) { + $writeperms = "OK"; + }else { + $writeperms = "NOT SET"; + } + + if ($this->ktdmsPath != '') { + $ktdir = $this->ktdmsPath; + } + + $srv_proto = split('/', $_SERVER['SERVER_PROTOCOL']); + $proto = strtolower($srv_proto[0]); + + // check if ssl enabled + if($proto == 'http' && $default->sslEnabled){ + $proto = 'https'; + } + + $dataSafe = ''; + if($this->safeMode != 'off'){ + $dataSafe = "
    NOTE: Safe mode is currently enabled, only viewing and downloading of documents will be allowed.


    "; + } + + $data = "KTWebDAV - The KnowledgeTree WebDAV Server"; + $data .= ""; + $data .= "

    "; + $data .= "

    Welcome to KnowledgeTree WebDAV Server



    "; + $data .= "
    To access KTWebDAV copy the following URL and paste it into your WebDAV enabled client...


    "; + $data .= $dataSafe; + $data .= "
    " . $proto . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . "
    "; + $data .= ""; + + $options['mimetype'] = 'text/html'; + $options["data"] = $data; + return true; + } + + /** + * GET method helper + * + * @param array parameter passing array + * @param int Document ID + * @return bool true on success + */ + function _GETDocument(&$options, $iDocumentID) { + global $default; + + $oDocument =& Document::get($iDocumentID); + + // get a temp file, and read. NOTE: NEVER WRITE TO THIS + $oStorage =& KTStorageManagerUtil::getSingleton(); + $fspath = $oStorage->temporaryFile($oDocument); + + $this->ktwebdavLog("Filesystem Path is " . $fspath, 'info', true ); + + // detect resource type + $mimetype = KTMime::getMimeTypeName($oDocument->getMimeTypeID()); + $options['mimetype'] = KTMime::getFriendlyNameForString($mimetype); + // detect modification time + // see rfc2518, section 13.7 + // some clients seem to treat this as a reverse rule + // requiering a Last-Modified header if the getlastmodified header was set + + $options['mtime'] = $oDocument->getVersionCreated(); + + // detect resource size + $options['size'] = $oDocument->getFileSize(); + + // no need to check result here, it is handled by the base class + $options['stream'] = fopen($fspath, "r"); + + $this->ktwebdavLog("Method is " . $this->currentMethod, 'info', true ); + + if ($this->currentMethod == "get") { + + // create the document transaction record + include_once(KT_LIB_DIR . '/documentmanagement/DocumentTransaction.inc'); + $oDocumentTransaction = & new DocumentTransaction($oDocument, "Document viewed via KTWebDAV", 'ktcore.transactions.view'); + $oDocumentTransaction->iUserID = $this->userID; + $oDocumentTransaction->create(); + + } + return true; + } + + /** + * GET method helper + * Method takes a directory path and checks whether it refers to a document or folder. The relevant folder and/or document id is returned. + * + * @param $path string The directory path + * @return array or bool Either returns an array of folder/document id's or false if an error occurred + */ + function _folderOrDocument($path) { + + global $default; + + $this->ktwebdavLog("Entering _folderOrDocument. path is " . $path, 'info', true); + + /* ** Get the directory path and the folder/document being acted on ** */ + $sFileName = basename($path); + // for windows replace backslash with forwardslash + $sFolderPath = str_replace("\\", '/', dirname($path) ); + + /* ** Get the starting point for recursing through the directory structure + FolderId = 0 if we're in the root folder + FolderId = 1 the starting point for locating any other folder ** */ + if ($sFolderPath == "/" || $sFolderPath == "/ktwebdav") { + $this->ktwebdavLog("This is the root folder.", 'info', true); + $sFolderPath = $this->rootFolder; + $iFolderID = 0; + } else $iFolderID = 1; + if ($sFileName == "ktwebdav.php") { + $this->ktwebdavLog("This is the root folder file.", 'info', true); + $sFileName = ''; + } + + $this->ktwebdavLog("sFileName is " . $sFileName, 'info', true); + $this->ktwebdavLog("sFolderName is " . $sFolderPath, 'info', true); + $this->ktwebdavLog("iFolderID is " . $iFolderID, 'info', true); + + /* ** Break up the directory path into its component directory's, + recurse through the directory's to find the correct id of the current directory. + Avoids situations where several directory's have the same name. ** */ + $aFolderNames = split('/', $sFolderPath); + + $this->ktwebdavLog("aFolderNames are: " . print_r($aFolderNames, true), 'info', true); + $aRemaining = $aFolderNames; + while (count($aRemaining)) { + $sFolderName = $aRemaining[0]; + $aRemaining = array_slice($aRemaining, 1); + if (empty($sFolderName)) { + continue; + } + // FIXME: Direct database access + if($iFolderID == 0){ + $sQuery = "SELECT id FROM folders WHERE parent_id is null AND name = ?"; + $aParams = array($sFolderName); + }else{ + $sQuery = "SELECT id FROM folders WHERE parent_id = ? AND name = ?"; + $aParams = array($iFolderID, $sFolderName); + } + $id = DBUtil::getOneResultKey(array($sQuery, $aParams), 'id'); + if (PEAR::isError($id)) { + $this->ktwebdavLog("A DB error occurred in _folderOrDocument", 'info', true); + return false; + } + if (is_null($id)) { + // Some intermediary folder path doesn't exist + $this->ktwebdavLog("Some intermediary folder does not exist in _folderOrDocument", 'error', true); + return array(false, false); + } + $iFolderID = (int)$id; + $this->ktwebdavLog("iFolderID set to " . $iFolderID, 'info', true); + } + + /* ** Get the document id using the basename and parent folder id as parameters. + If an id is obtained then the path refers to a document. + If no id is returned then the path refers to a folder or a non-existing document. ** */ + // FIXME: Direct database access + // $sQuery = "SELECT id FROM documents WHERE folder_id = ? AND filename = ? AND status_id = 1"; + $sQuery = "SELECT D.id "; + $sQuery .= "FROM documents AS D "; + $sQuery .= "LEFT JOIN document_metadata_version AS DM "; + $sQuery .= "ON D.metadata_version_id = DM.id "; + $sQuery .= "LEFT JOIN document_content_version AS DC "; + $sQuery .= "ON DM.content_version_id = DC.id "; + $sQuery .= "WHERE D.folder_id = ? AND DC.filename = ? AND D.status_id=1"; + + $aParams = array($iFolderID, $sFileName); + $iDocumentID = DBUtil::getOneResultKey(array($sQuery, $aParams), 'id'); + + if (PEAR::isError($iDocumentID)) { + $this->ktwebdavLog("iDocumentID error in _folderOrDocument", 'info', true); + return false; + } + + /* ** If the path refers to a folder or a non-existing document, + Get the folder id using the basename and parent folder id as parameters. + If an id is obtained then the path refers to an existing folder. + If no id is returned and the basename is empty then path refers to the root folder. + If no id is returned and the basename is not empty, then the path refers to either a non-existing folder or document. ** */ + if ($iDocumentID === null) { + $this->ktwebdavLog("iDocumentID is null", 'info', true); + // FIXME: Direct database access + $sQuery = "SELECT id FROM folders WHERE parent_id = ? AND name = ?"; + $aParams = array($iFolderID, $sFileName); + $id = DBUtil::getOneResultKey(array($sQuery, $aParams), 'id'); + + if (PEAR::isError($id)) { + $this->ktwebdavLog("A DB(2) error occurred in _folderOrDocument", 'info', true); + return false; + } + if (is_null($id)) { + if ($sFileName == '') { + return array($iFolderID, null); + } + $this->ktwebdavLog("id is null in _folderOrDocument", 'info', true); + return array($iFolderID, false); + } + if (substr($path, -1) !== "/") { + $this->ktwebdavLog("Setting Location Header to " . "Location: " . $_SERVER["PHP_SELF"] . "/", 'info', true); + header("Location: " . $_SERVER["PHP_SELF"] . "/"); + } + $this->ktwebdavLog("DEBUG: return id ".$id, 'info', true); + return array($id, null); + } + + return array($iFolderID, (int)$iDocumentID); + } + + /** + * PUT method handler + * + * @param array parameter passing array + * @return string HTTP status code or false + */ + function PUT(&$options) + { + global $default; + + if ($this->checkSafeMode()) { + + $this->ktwebdavLog("Entering PUT. options are " . print_r($options, true), 'info', true); + $this->ktwebdavLog("dav_client is: " . $this->dav_client, 'info', true); + + $path = $options["path"]; + + // Fix for Mac + // Modified - 22/10/07 + // Mac adds DS_Store files when folders are added and ._filename files when files are added + // we want to ignore them. + if($this->dav_client == 'MC' || $this->dav_client == 'MG'){ + // Remove filename from path + $aPath = explode('/', $path); + $fileName = $aPath[count($aPath)-1]; + + if(strtolower($fileName) == '.ds_store'){ + $this->ktwebdavLog("Using a mac client. Ignore the .DS_Store files created with every folder.", 'info', true); + // ignore + return "204 No Content"; + } + + if($fileName[0] == '.' && $fileName[1] == '_'){ + $fileName = substr($fileName, 2); + $this->ktwebdavLog("Using a mac client. Ignore the ._filename files created with every file.", 'info', true); + // ignore + return "204 No Content"; + } + } + + $res = $this->_folderOrDocument($path); + list($iFolderID, $iDocumentID) = $res; + + if ($iDocumentID === false && $iFolderID === false) { + // Couldn't find intermediary paths + /* + * RFC2518: 8.7.1 PUT for Non-Collection Resources + * + * 409 (Conflict) - A PUT that would result in the creation + * of a resource without an appropriately scoped parent collection + * MUST fail with a 409 (Conflict). + */ + return "409 Conflict - Couldn't find intermediary paths"; + } + + $oParentFolder =& Folder::get($iFolderID); + // Check if the user has permissions to write in this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.write'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oParentFolder)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + + $this->ktwebdavLog("iDocumentID is " . $iDocumentID, 'info', true); + + if (is_null($iDocumentID)) { + // This means there is a folder with the given path + $this->ktwebdavLog("405 Method not allowed", 'info', true); + return "405 Method not allowed - There is a folder with the given path"; + } + + if ($iDocumentID == false) { + $this->ktwebdavLog("iDocumentID is false", 'info', true); + } + + if ($iDocumentID !== false) { + // This means there is a document with the given path + $oDocument = Document::get($iDocumentID); + + $this->ktwebdavLog("oDocument is " . print_r($oDocument, true), 'info', true); + $this->ktwebdavLog("oDocument statusid is " . print_r($oDocument->getStatusID(), true), 'info', true); + + if ( ( (int)$oDocument->getStatusID() != STATUS_WEBDAV ) && ( (int)$oDocument->getStatusID() != DELETED )) { + $this->ktwebdavLog("Trying to PUT to an existing document", 'info', true); + if (!$this->dav_client == "MS" && !$this->dav_client == "MC") return "409 Conflict - There is a document with the given path"; + } + + // FIXME: Direct filesystem access + $fh = $options["stream"]; + $sTempFilename = tempnam('/tmp', 'ktwebdav_dav_put'); + $ofh = fopen($sTempFilename, 'w'); + + $contents = ''; + while (!feof($fh)) { + $contents .= fread($fh, 8192); + } + $fres = fwrite($ofh, $contents); + $this->ktwebdavLog("A DELETED or CHECKEDOUT document exists. Overwriting...", 'info', true); + $this->ktwebdavLog("Temp Filename is: " . $sTempFilename, 'info', true ); + $this->ktwebdavLog("File write result size was: " . $fres, 'info', true ); + + fflush($fh); + fclose($fh); + fflush($ofh); + fclose($ofh); + $this->ktwebdavLog("Files have been flushed and closed.", 'info', true ); + + $name = basename($path); + $aFileArray = array( + "name" => $name, + "size" => filesize($sTempFilename), + "type" => false, + "userID" => $this->_getUserID(), + ); + $this->ktwebdavLog("aFileArray is " . print_r($aFileArray, true), 'info', true); + + //include_once(KT_LIB_DIR . '/filelike/fsfilelike.inc.php'); + $aOptions = array( + //'contents' => new KTFSFileLike($sTempFilename), + 'temp_file' => $sTempFilename, + 'metadata' => array(), + 'novalidate' => true, + ); + $this->ktwebdavLog("DEBUG: overwriting file. Options: ".print_r($aOptions, true)); + $this->ktwebdavLog("DEBUG: overwriting file. Temp name: ".$sTempFilename.' '.print_r($sTempFilename, true)); + $this->ktwebdavLog("DEBUG: overwriting file. Name: ".$name.' '.print_r($name, true)); + + // Modified - 25/10/07 - changed add to overwrite + //$oDocument =& KTDocumentUtil::add($oParentFolder, $name, $oUser, $aOptions); + $oDocument =& KTDocumentUtil::overwrite($oDocument, $name, $sTempFilename, $oUser, $aOptions); + + if(PEAR::isError($oDocument)) { + $this->ktwebdavLog("oDocument ERROR: " . $oDocument->getMessage(), 'info', true); + unlink($sTempFilename); + return "409 Conflict - " . $oDocument->getMessage(); + } + + $this->ktwebdavLog("oDocument is " . print_r($oDocument, true), 'info', true); + + unlink($sTempFilename); + return "201 Created"; + } + + $options["new"] = true; + // FIXME: Direct filesystem access + $fh = $options["stream"]; + $sTempFilename = tempnam('/tmp', 'ktwebdav_dav_put'); + $ofh = fopen($sTempFilename, 'w'); + + $contents = ''; + while (!feof($fh)) { + $contents .= fread($fh, 8192); + } + $fres = fwrite( $ofh, $contents); + $this->ktwebdavLog("Content length was not 0, doing the whole thing.", 'info', true ); + $this->ktwebdavLog("Temp Filename is: " . $sTempFilename, 'info', true ); + $this->ktwebdavLog("File write result size was: " . $fres, 'info', true ); + + fflush($fh); + fclose($fh); + fflush($ofh); + fclose($ofh); + $this->ktwebdavLog("Files have been flushed and closed.", 'info', true ); + + $name = basename($path); + $aFileArray = array( + "name" => $name, + "size" => filesize($sTempFilename), + "type" => false, + "userID" => $this->_getUserID(), + ); + $this->ktwebdavLog("aFileArray is " . print_r($aFileArray, true), 'info', true); + + //include_once(KT_LIB_DIR . '/filelike/fsfilelike.inc.php'); + $aOptions = array( + //'contents' => new KTFSFileLike($sTempFilename), + 'temp_file' => $sTempFilename, + 'metadata' => array(), + 'novalidate' => true, + ); + $oDocument =& KTDocumentUtil::add($oParentFolder, $name, $oUser, $aOptions); + + if(PEAR::isError($oDocument)) { + $this->ktwebdavLog("oDocument ERROR: " . $oDocument->getMessage(), 'info', true); + unlink($sTempFilename); + return "409 Conflict - " . $oDocument->getMessage(); + } + + $this->ktwebdavLog("oDocument is " . print_r($oDocument, true), 'info', true); + + unlink($sTempFilename); + return "201 Created"; + + } else return "423 Locked - KTWebDAV is in SafeMode"; + + } + + /** + * MKCOL method handler + * + * @param array parameter passing array + * @return string HTTP status code or false + */ + function MKCOL($options) + { + $this->ktwebdavLog("Entering MKCOL. options are " . print_r($options, true), 'info', true); + + if ($this->checkSafeMode()) { + + global $default; + + if (!empty($_SERVER["CONTENT_LENGTH"])) { + /* + * RFC2518: 8.3.2 MKCOL status codes + * + * 415 (Unsupported Media Type)- The server does not support + * the request type of the body. + */ + return "415 Unsupported media type"; + } + + // Take Windows's escapes out + $path = str_replace('\\', '' , $options['path']); + + + $res = $this->_folderOrDocument($path); + list($iFolderID, $iDocumentID) = $res; + + if ($iDocumentID === false && $iFolderID === false) { + // Couldn't find intermediary paths + /* + * RFC2518: 8.3.2 MKCOL status codes + * + * 409 (Conflict) - A collection cannot be made at the + * Request-URI until one or more intermediate collections + * have been created. + */ + $this->ktwebdavLog("409 Conflict in MKCOL", 'info', true); + return "409 Conflict - Couldn't find intermediary paths"; + } + + + if (is_null($iDocumentID)) { + // This means there is a folder with the given path + /* + * RFC2518: 8.3.2 MKCOL status codes + * + * 405 (Method Not Allowed) - MKCOL can only be executed on + * a deleted/non-existent resource. + */ + $this->ktwebdavLog("405 Method not allowed - There is a folder with the given path", 'info', true); + return "405 Method not allowed - There is a folder with the given path"; + } + if ($iDocumentID !== false) { + // This means there is a document with the given path + /* + * RFC2518: 8.3.2 MKCOL status codes + * + * 405 (Method Not Allowed) - MKCOL can only be executed on + * a deleted/non-existent resource. + */ + $this->ktwebdavLog("405 Method not allowed - There is a document with the given path", 'info', true); + return "405 Method not allowed - There is a document with the given path"; + } + + $sFolderName = basename($path); + $sFolderPath = dirname($path); + + $dest_fspath = $default->documentRoot . "/" . $this->rootFolder . $path; + $this->ktwebdavLog("Will create a physical path of " . $dest_fspath, 'info', true); + + $oParentFolder =& Folder::get($iFolderID); + $this->ktwebdavLog("Got an oParentFolder of " . print_r($oParentFolder, true), 'info', true); + + // Check if the user has permissions to write in this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.addFolder'); + $oUser =& User::get($this->userID); + + $this->ktwebdavLog("oPerm is " . print_r($oPerm, true), 'info', true); + $this->ktwebdavLog("oUser is " . print_r($oUser, true), 'info', true); + $this->ktwebdavLog("oFolder is " . print_r($oParentFolder, true), 'info', true); + + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oParentFolder)) { + $this->ktwebdavLog("Permission denied.", 'info', true); + return "403 Forbidden - User does not have sufficient permissions"; + } else $this->ktwebdavLog("Permission granted.", 'info', true); + + + include_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php'); + + KTFolderUtil::add($oParentFolder, $sFolderName, $oUser); + /* + * RFC 2518: 8.3.2 MKCOL status codes + * + * 201 (Created) - The collection or structured resource was + * created in its entirety. + */ + $this->ktwebdavLog("201 Created", 'info', true); + return "201 Created"; + + } else return "423 Locked - KTWebDAV is in SafeMode"; + } + + + /** + * DELETE method handler + * + * @param array parameter passing array + * @return string HTTP status code or false + */ + function DELETE($options) + { + $this->ktwebdavLog("Entering DELETE. options are " . print_r($options, true), 'info', true); + + if ($this->checkSafeMode()) { + + $path = $options["path"]; + $res = $this->_folderOrDocument($path); + $this->ktwebdavLog("DELETE res is " . print_r($res, true), 'info', true); + if ($res === false) { + $this->ktwebdavLog("404 Not found - The Document was not found.", 'info', true); + return "404 Not found - The Document was not found."; + } + list($iFolderID, $iDocumentID) = $res; + + if ($iDocumentID === false) { + $this->ktwebdavLog("404 Not found - The Folder was not found.", 'info', true); + return "404 Not found - The Folder was not found."; + } + + if (is_null($iDocumentID)) { + return $this->_DELETEFolder($options, $iFolderID); + } + return $this->_DELETEDocument($options, $iFolderID, $iDocumentID); + + } else return "423 Locked - KTWebDAV is in SafeMode"; + } + + /** + * DELETE method helper for Documents + * + * @param array parameter passing array + * @param int Folder ID + * @param int Document ID + * @return string HTTP status code or false + */ + function _DELETEDocument($options, $iFolderID, $iDocumentID) { + + $this->ktwebdavLog("Entering _DELETEDocument. options are " . print_r($options, true), 'info', true); + + global $default; + + $oDocument =& Document::get($iDocumentID); + + // Check if the user has permissions to delete this document + $oPerm =& KTPermission::getByName('ktcore.permissions.delete'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oDocument)) { + return "403 Forbidden - The user does not have sufficient permissions"; + } + + $res = KTDocumentUtil::delete($oDocument, $_SERVER['HTTP_REASON']); + + if (PEAR::isError($res)) { + $this->ktwebdavLog("404 Not Found - " . $res->getMessage(), 'info', true); + return "404 Not Found - " . $res->getMessage(); + } + + $this->ktwebdavLog("204 No Content", 'info', true); + return "204 No Content"; + } + + /** + * DELETE method helper for Folders + * + * @param array paramter passing array + * @param int Folder ID + * @return string HTTP status code or false + */ + function _DELETEFolder($options, $iFolderID) { + + $this->ktwebdavLog("Entering _DELETEFolder. options are " . print_r($options, true), 'info', true); + + global $default; + + require_once(KT_LIB_DIR . "/foldermanagement/folderutil.inc.php"); + + // Check if the user has permissions to delete this folder + $oFolder =& Folder::get($iFolderID); + $oPerm =& KTPermission::getByName('ktcore.permissions.delete'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oFolder)) { + return "403 Forbidden - The user does not have sufficient permissions"; + } + $this->ktwebdavLog("Got an oFolder of " . print_r($oFolder, true), 'info', true); + $this->ktwebdavLog("Got an oUser of " . print_r($oUser, true), 'info', true); + $res = KTFolderUtil::delete($oFolder, $oUser, 'KTWebDAV Delete'); + + if (PEAR::isError($res)) { + $this->ktwebdavLog("Delete Result error " . print_r($res, true), 'info', true); + return "403 Forbidden - ".$res->getMessage(); + } + + return "204 No Content"; + } + + /** + * MOVE method handler + * Method checks if the source path refers to a document / folder then calls the appropriate method handler. + * + * @param $options array parameter passing array + * @return string HTTP status code or false + */ + function MOVE($options) + { + $this->ktwebdavLog("Entering MOVE. options are " . print_r($options, true), 'info', true); + + /* ** Check that write is allowed ** */ + if ($this->checkSafeMode()) { + + if (!empty($_SERVER["CONTENT_LENGTH"])) { // no body parsing yet + $this->ktwebdavLog("415 Unsupported media type", 'info', true); + return "415 Unsupported media type"; + } + + /* // no moving to different WebDAV Servers yet + if (isset($options["dest_url"])) { + $this->ktwebdavLog("502 bad gateway - No moving to different WebDAV Servers yet", 'info', true); + return "502 bad gateway - No moving to different WebDAV Servers yet"; + } + */ + + /* ** Get the path to the document/folder to be copied. + Call function to check if the path refers to a document or a folder. + Return 404 error if the path is invalid. ** */ + $source_path = $options["path"]; + + // Fix for Mac Goliath + // Modified - 30/10/07 + // Mac adds ._filename files when files are added / copied / moved + // we want to ignore them. + if($this->dav_client == 'MG'){ + // Remove filename from path + $aPath = explode('/', $source_path); + $fileName = $aPath[count($aPath)-1]; + +// if(strtolower($fileName) == '.ds_store'){ +// $this->ktwebdavLog("Using a mac client. Ignore the .DS_Store files created with every folder.", 'info', true); +// // ignore +// return "204 No Content"; +// } + + if($fileName[0] == '.' && $fileName[1] == '_'){ + $fileName = substr($fileName, 2); + $this->ktwebdavLog("Using a mac client. Ignore the ._filename files created with every file.", 'info', true); + // ignore + return "204 No Content"; + } + } + + $source_res = $this->_folderOrDocument($source_path); + if ($source_res === false) { + $this->ktwebdavLog("404 Not found - Document was not found.", 'info', true); + return "404 Not found - Document was not found."; + } + + /* ** Get the returned parent folder id and document/folder id. + If the parent folder id is false, return 404 error. + If the document id is either false or null, then the source is a folder. + If the document id exists then the source is a document. + If the source is a folder then call _MOVEFolder. + If the source is a document then check if its checked out and call _MOVEDocument. ** */ + list($iFolderID, $iDocumentID) = $source_res; + if ($iFolderID === false && ($iDocumentID === false || is_null($iDocumentID))) { + $this->ktwebdavLog("404 Not found - Folder was not found.", 'info', true); + return "404 Not found - Folder was not found."; + } + + if (is_null($iDocumentID) || $iDocumentID === false) { + // Source is a folder + $this->ktwebdavLog("Source is a Folder.", 'info', true); + $movestat = $this->_MOVEFolder($options, $iFolderID); + + } else { + // Source is a document + $this->ktwebdavLog("Source is a Document.", 'info', true); + if ($this->canCopyMoveRenameDocument($iDocumentID)) { + $movestat = $this->_MOVEDocument($options, $iFolderID, $iDocumentID); + } else { + return "423 Locked - Cannot MOVE document because it is checked out by another user."; + } + } + + $this->ktwebdavLog("Final movestat result is: " . $movestat, 'info', true); + return $movestat; + + } else return "423 Locked - KTWebDAV is in SafeMode"; + + } + + /** + * MOVE method helper for Documents + * + * @param array parameter passing array + * @param int Folder ID + * @param int Document ID + * @return string HTTP status code or false + */ + function _MOVEDocument($options, $iFolderID, $iDocumentID) { + + /* ** Ensure that the destination path exists ** */ + if ($options['dest'] == '') $options["dest"] = substr($options["dest_url"], strlen($_SERVER["SCRIPT_NAME"])); + $this->ktwebdavLog("Entering _MOVEDocument. options are " . print_r($options, true), 'info', true); + + // Fix for Mac Goliath + // Modified - 25/10/07 - remove ktwebdav from document path + if($this->dav_client == 'MG' || $this->dav_client == 'MS'){ + $this->ktwebdavLog("Remove ktwebdav from destination path: ".$options['dest'], 'info', true); + if(!(strpos($options['dest'], 'ktwebdav/ktwebdav.php/') === FALSE)){ + $options['dest'] = substr($options['dest'], 22); + } + if($options['dest'][0] != '/'){ + $options['dest'] = '/'.$options['dest']; + } + } + + global $default; + $new = true; + + /* ** Get the relevant paths. Get the basename of the destination path as the destination filename. + Check whether the destination path refers to a folder / document. ** */ + $oDocument = Document::get($iDocumentID); + $oSrcFolder = Folder::get($iFolderID); + $oUser =& User::get($this->userID); + + $source_path = $options["path"]; + $dest_path = urldecode($options["dest"]); + + /* ** Get the source folder object. + If the destination document is null, then the destination is a folder, continue. + If the destination document returns an id, then the document exists. Check overwrite. + If overwrite is true, then check permissions and delete the document, continue. + If the destination document is false, then continue. ** */ + list($iDestFolder, $iDestDoc) = $this->_folderOrDocument($dest_path); + + if (is_null($iDestDoc)) { + // the dest is a folder + $this->ktwebdavLog("Destination is a folder.", 'info', true); + } else if ($iDestDoc !== false) { + // Document exists + $this->ktwebdavLog("Destination Document exists.", 'info', true); + $oReplaceDoc = Document::get($iDestDoc); + if ($options['overwrite'] != 'T') { + $this->ktwebdavLog("Overwrite needs to be TRUE.", 'info', true); + return "412 Precondition Failed - Destination Document exists. Overwrite needs to be TRUE."; + } + $this->ktwebdavLog("Overwrite is TRUE, deleting Destination Document.", 'info', true); + + // Check if the user has permissions to delete this document + $oPerm =& KTPermission::getByName('ktcore.permissions.delete'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oReplaceDoc)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + KTDocumentUtil::delete($oReplaceDoc, 'KTWebDAV move overwrites target.'); + $new = false; + } + + /* ** Check if the source and destination directories are the same and the destination is not a folder. + Then action is probably a rename. + Check if user has permission to write to the document and folder. + Rename the document. ** */ + if ((dirname($source_path) == dirname($dest_path)) && !is_null($iDestDoc)) { + // This is a rename + $this->ktwebdavLog("This is a rename.", 'info', true); + $this->ktwebdavLog("Got an oDocument of " . print_r($oDocument, true), 'info', true); + $this->ktwebdavLog("Got a new name of " . basename($dest_path), 'info', true); + + // Check if the user has permissions to write this document + $oPerm =& KTPermission::getByName('ktcore.permissions.write'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oDocument)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + + // Perform rename + $res = KTDocumentUtil::rename($oDocument, basename($dest_path), $oUser); + if (PEAR::isError($res) || is_null($res) || ($res === false)) { + return "404 Not Found - " . $res->getMessage(); + } else if($new) { + $this->ktwebdavLog("201 Created", 'info', true); + return "201 Created"; + }else { + $this->ktwebdavLog("204 No Content", 'info', true); + return "204 No Content"; + } + } + + /* ** Get the destination folder object and the source document object. + Check if user has permission to write to the document and folder. + Move the document. ** */ + $oDestFolder = Folder::get($iDestFolder); + $this->ktwebdavLog("Got a destination folder of " . print_r($oDestFolder, true), 'info', true); + + // Check if the user has permissions to write in this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.write'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oDestFolder)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + + $reason = (isset($_SERVER['HTTP_REASON']) && !empty($_SERVER['HTTP_REASON'])) ? $_SERVER['HTTP_REASON'] : "KTWebDAV Move."; + + $res = KTDocumentUtil::move($oDocument, $oDestFolder, $oUser, $reason); + + if(PEAR::isError($res)){ + $this->ktwebdavLog("Move on document failed: ".$res->getMessage(), 'info', true); + return "500 Internal Server Error - Move on document failed."; + } + + if ($new) { + $this->ktwebdavLog("201 Created", 'info', true); + return "201 Created"; + } else { + $this->ktwebdavLog("204 No Content", 'info', true); + return "204 No Content"; + } + } + + /** + * MOVE method helper for Folders + * + * @param array parameter passing array + * @param int Folder ID + * @return string HTTP status code or false + + */ + function _MOVEFolder($options, $iFolderID) { + + /* ** Ensure that the destination path exists ** */ + if ($options['dest'] == '') $options["dest"] = substr($options["dest_url"], strlen($_SERVER["SCRIPT_NAME"])); + $options['dest'] = $this->_slashify($options['dest']); + $this->ktwebdavLog("Entering _MOVEFolder. options are " . print_r($options, true), 'info', true); + + /* ** RFC 2518 Section 8.9.2. A folder move must have a depth of 'infinity'. + Check the requested depth. If depth is set to '0' or '1' return a 400 error. ** */ + if ($options["depth"] != "infinity") { + $this->ktwebdavLog("400 Bad request", 'info', true); + return "400 Bad request - depth must be 'inifinity'."; + } + + // Fix for Mac Goliath - and for Novell Netdrive + // Modified - 30/10/07 - remove ktwebdav from folder path + if($this->dav_client == 'MG' || $this->dav_client == 'MS'){ + $this->ktwebdavLog("Remove ktwebdav from destination path: ".$options['dest'], 'info', true); + if(!(strpos($options['dest'], 'ktwebdav/ktwebdav.php/') === FALSE)){ + $options['dest'] = substr($options['dest'], 22); + } + if($options['dest'][0] != '/'){ + $options['dest'] = '/'.$options['dest']; + } + } + + global $default; + + /* ** Get the relevant paths. + Check whether the destination path refers to a folder / document. ** */ + $source_path = $options["path"]; + $dest_path = urldecode($options["dest"]); + list($iDestFolder, $iDestDoc) = $this->_folderOrDocument($dest_path); + + /* ** Get the source folder objects. + If the destination document is null, then the destination is an existing folder. Check overwrite. + If overwrite is true, then check permissions and delete the folder, continue. + If the destination document returns an id, then the destination is a document, check overwrite. + If overwrite is true, then check permissions and delete the document, continue. + If the destination document is false, then continue. ** */ + $oSrcFolder = Folder::get($iFolderID); + $oDestFolder = Folder::get($iDestFolder); + + $new = true; + if (is_null($iDestDoc)) { + // Folder exists + $this->ktwebdavLog("Destination Folder exists.", 'info', true); + $oReplaceFolder = $oDestFolder; + if ($options['overwrite'] != 'T') { + $this->ktwebdavLog("Overwrite needs to be TRUE.", 'info', true); + return "412 Precondition Failed - Destination Folder exists. Overwrite needs to be TRUE."; + } + $this->ktwebdavLog("Overwrite is TRUE, deleting Destination Folder.", 'info', true); + + // Check if the user has permissions to delete this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.delete'); + $oUser =& User::get($this->userID); + + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oReplaceFolder)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + + KTFolderUtil::delete($oReplaceFolder, $oUser, 'KTWebDAV move overwrites target.'); + + // Destination folder has been replaced so we need to get the parent folder object + list($iDestFolder, $iDestDoc) = $this->_folderOrDocument($dest_path); + $oDestFolder = Folder::get($iDestFolder); + + $new = false; + } else if ($iDestDoc !== false) { + // Destination is a document + $this->ktwebdavLog("Destination is a document.", 'info', true); + $oReplaceDoc = Document::get($iDestDoc); + if ($options['overwrite'] != 'T') { + $this->ktwebdavLog("Overwrite needs to be TRUE.", 'info', true); + return "412 Precondition Failed - Destination Folder is a document. Overwrite needs to be TRUE."; + } + $this->ktwebdavLog("Overwrite is TRUE, deleting Destination Document.", 'info', true); + + // Check if the user has permissions to delete this document + $oPerm =& KTPermission::getByName('ktcore.permissions.delete'); + $oUser =& User::get($this->userID); + + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oReplaceDoc)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + KTDocumentUtil::delete($oReplaceDoc, 'KTWebDAV move overwrites target.'); + $new = false; + } + + /* ** Check if the source and destination directories are the same and the destination is not an existing folder. + Then action is probably a rename. + Check if user has permission to write to the folder. + Rename the document. ** */ + if (dirname($source_path) == dirname($dest_path) && !is_null($iDestDoc)) { + // This is a rename + $this->ktwebdavLog("Rename collection.", 'info', true); + $this->ktwebdavLog("Got an oSrcFolder of " . print_r($oSrcFolder, true), 'info', true); + $this->ktwebdavLog("Got an new name of " . basename($dest_path), 'info', true); + + include_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php'); + + // Check if the user has permissions to write this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.folder_rename'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oSrcFolder)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + $res = KTFolderUtil::rename($oSrcFolder, basename($dest_path), $oUser); + if (PEAR::isError($res) || is_null($res) || ($res === false)) { + return "404 Not Found - " . $res->getMessage(); + } else { + if($new){ + $this->ktwebdavLog("201 Created", 'info', true); + return "201 Created"; + }else{ + $this->ktwebdavLog("204 No Content", 'info', true); + return "204 No Content"; + } + } + + } + + include_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php'); + + /* ** Get the destination folder object and the source document object. + Check if user has permission to write to the folder. + Move the folder. ** */ + $oUser =& User::get($this->userID); + $this->ktwebdavLog("Got an oSrcFolder of " . print_r($oSrcFolder, true), 'info', true); + $this->ktwebdavLog("Got an oDestFolder of " . print_r($oDestFolder, true), 'info', true); + $this->ktwebdavLog("Got an oUser of " . print_r($oUser, true), 'info', true); + + // Check if the user has permissions to write in this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.write'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oDestFolder)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + + $res = KTFolderUtil::move($oSrcFolder, $oDestFolder, $oUser); + + if(PEAR::isError($res)){ + $this->ktwebdavLog("Move on folder failed: ".$res->getMessage(), 'info', true); + return "500 Internal Server Error - Move on folder failed."; + } + + if($new){ + $this->ktwebdavLog("201 Created", 'info', true); + return "201 Created"; + }else{ + $this->ktwebdavLog("204 No Content", 'info', true); + return "204 No Content"; + } + } + + /** + * COPY method handler + * Method checks if the source path refers to a document / folder then calls the appropriate method handler. + * + * @param $options array parameter passing array + * @param $del string delete source flag + * @return string HTTP status code or false + */ + function COPY($options, $del = false) + { + $this->ktwebdavLog("Entering COPY. options are " . print_r($options, true), 'info', true); + $this->ktwebdavLog("del is: " . $del, 'info', true); + + /* ** Check that writing to the server is allowed * **/ + if ($this->checkSafeMode()) { + + if (!empty($_SERVER["CONTENT_LENGTH"])) { // no body parsing yet + $this->ktwebdavLog("415 Unsupported media type", 'info', true); + return "415 Unsupported media type - No body parsing yet"; + } + + /* // no copying to different WebDAV Servers yet + if (isset($options["dest_url"])) { + $this->ktwebdavLog("502 bad gateway", 'info', true); + return "502 bad gateway - No copying to different WebDAV Servers yet"; + } + */ + + /* ** Get the path to the document/folder to be copied. + Call function to check if the path refers to a document or a folder. + Return 404 error if the path is invalid. ** */ + $source_path = $options["path"]; + $this->ktwebdavLog("SourcePath is: " . $source_path, 'info', true); + $source_res = $this->_folderOrDocument($source_path); + if ($source_res === false) { + $this->ktwebdavLog("404 Not found - The document could not be found.", 'info', true); + return "404 Not found - The document could not be found."; + } + + /* ** Get the returned parent folder id and document/folder id. + If the parent folder id is false, return 404 error. + If the document id is either false or null, then the source is a folder. + If the document id exists then the source is a document. + If the source is a folder then call _COPYFolder. + If the source is a document then check if its checked out and call _COPYDocument. ** */ + list($iFolderID, $iDocumentID) = $source_res; + if ($iFolderID === false && ($iDocumentID === false || is_null($iDocumentID))) { + $this->ktwebdavLog("404 Not found - The folder could not be found.", 'info', true); + return "404 Not found - The folder could not be found."; + } + + if (is_null($iDocumentID) || $iDocumentID === false) { + // Source is a folder + $this->ktwebdavLog("Source is a Folder.", 'info', true); + $copystat = $this->_COPYFolder($options, $iFolderID); + + } else { + // Source is a document + $this->ktwebdavLog("Source is a Document.", 'info', true); + + if ($this->canCopyMoveRenameDocument($iDocumentID)) { + $copystat = $this->_COPYDocument($options, $iFolderID, $iDocumentID); + } else { + // Document is locked + return "423 Locked - Cannot COPY document because it is checked out by another user."; + } + + } + + /* ** Deprecated. If the request is a move then delete the source ** + // Delete the source if this is a move and the copy was ok + if ($del && ($copystat{0} == "2")) { + $delstat = $this->DELETE(array("path" => $options["path"])); + $this->ktwebdavLog("DELETE in COPY/MOVE stat is: " . $delstat, 'info', true); + if (($delstat{0} != "2") && (substr($delstat, 0, 3) != "404")) { + return $delstat; + } + } + */ + + $this->ktwebdavLog("Final copystat result is: " . $copystat, 'info', true); + return $copystat; + + } else return "423 Locked - KTWebDAV is in SafeMode"; + } + + /** + * COPY method helper for Documents + * + * @param $options array parameter passing array + * @param $iFolderID int Folder ID + * @param $iDocumentID int Document ID + * @return string HTTP status code or false + */ + function _COPYDocument($options, $iFolderID, $iDocumentID) { + + /* ** Ensure that the destination path exists ** */ + if ($options['dest'] == '') $options["dest"] = substr($options["dest_url"], strlen($_SERVER["SCRIPT_NAME"])); + $this->ktwebdavLog("Entering _COPYDocument. options are " . print_r($options, true), 'info', true); + + /* ** Get the relevant paths. Get the basename of the destination path as the destination filename. + Check whether the destination path refers to a folder / document. ** */ + $source_path = $options["path"]; + $dest_path = urldecode($options["dest"]); + $sDestFileName = basename($dest_path); + + list($iDestFolder, $iDestDoc) = $this->_folderOrDocument($dest_path); + + if($iDestFolder === false){ + return "409 Conflict - Destination folder does not exist."; + } + + /* ** Depth must be infinity to copy a document ** */ + if ($options["depth"] != "infinity") { + // RFC 2518 Section 9.2, last paragraph + $this->ktwebdavLog("400 Bad request", 'info', true); + return "400 Bad request - Depth must be 'infinity'."; + } + + global $default; + + /* ** Get the source folder object. + If the destination document is null, then the destination is a folder, set the destination filename to empty, continue. + If the destination document returns an id, then the document exists. Check overwrite. + If overwrite is true, then check permissions and delete the document, continue. + If the destination document is false, then continue. ** */ + $oSrcFolder = Folder::get($iFolderID); + + $new = true; + if (is_null($iDestDoc)) { + // the dest is a folder + // $this->ktwebdavLog("400 Bad request", 'info', true); + $this->ktwebdavLog("Destination is a folder.", 'info', true); + $sDestFileName = ''; + //return "400 Bad request - Destination is a Folder"; + } else if ($iDestDoc !== false) { + // Document exists + $this->ktwebdavLog("Destination Document exists.", 'info', true); + $oReplaceDoc = Document::get($iDestDoc); + if ($options['overwrite'] != 'T') { + $this->ktwebdavLog("Overwrite needs to be TRUE.", 'info', true); + return "412 Precondition Failed - Destination Document exists. Overwrite needs to be TRUE."; + } + $this->ktwebdavLog("Overwrite is TRUE, deleting Destination Document.", 'info', true); + + // Check if the user has permissions to delete this document + $oPerm =& KTPermission::getByName('ktcore.permissions.delete'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oReplaceDoc)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + KTDocumentUtil::delete($oReplaceDoc, 'KTWebDAV copy with overwrite set.'); + $new = false; + } + + /* ** Get the destination folder object and the source document object. + Check if user has permission to write to the document and folder. + Copy the document. ** */ + $oDestFolder = Folder::get($iDestFolder); + $oSrcDoc = Document::get($iDocumentID); + + include_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php'); + + $this->ktwebdavLog("Got an oSrcDoc of " .$oSrcDoc->getName() . print_r($oSrcDoc, true), 'info', true); + $this->ktwebdavLog("Got an oDestFolder of " .$oDestFolder->getName() . print_r($oDestFolder, true), 'info', true); + + // Check if the user has permissions to write in this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.write'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oDestFolder)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + + $reason = (isset($_SERVER['HTTP_REASON']) && !empty($_SERVER['HTTP_REASON'])) ? $_SERVER['HTTP_REASON'] : "KTWebDAV Copy."; + + $oDesDoc = KTDocumentUtil::copy($oSrcDoc, $oDestFolder, $reason, $sDestFileName); + + if(PEAR::isError($oDesDoc)){ + $this->ktwebdavLog("Copy on document failed: ".$oDesDoc->getMessage(), 'info', true); + return "500 Internal Server Error - Copy on document failed."; + } + + if ($new) { + $this->ktwebdavLog("201 Created", 'info', true); + return "201 Created"; + } else { + $this->ktwebdavLog("204 No Content", 'info', true); + return "204 No Content"; + } + } + + /** + * COPY method helper for Folders + * + * @param array parameter passing array + * @param int Parent Folder ID + * @return string HTTP status code or false + */ + function _COPYFolder($options, $iFolderID) { + + /* ** Ensure that the destination path exists ** */ + if ($options['dest'] == '') $options["dest"] = substr($options["dest_url"], strlen($_SERVER["SCRIPT_NAME"])); + $this->ktwebdavLog("Entering _COPYFolder. options are " . print_r($options, true), 'info', true); + + /* ** RFC 2518 Section 8.8.3. DAV compliant servers must support depth headers of '0' and 'infinity'. + Check the requested depth. If depth is set to '0', set copyall to false. A depth of 0 indicates + that the folder is copied without any children. If depth is set to '1', return a 400 error. ** */ + $copyAll = true; + if ($options["depth"] != "infinity") { + if($options['depth'] == '0'){ + $copyAll = false; + $this->ktwebdavLog("Depth is 0. Copy only the base folder.", 'info', true); + }else{ + $this->ktwebdavLog("400 Bad request. Depth must be infinity or 0.", 'info', true); + return "400 Bad request - Depth must be 'infinity' or '0'."; + } + } + + global $default; + + $new = true; + + /* ** Get the relevant paths. Get the basename of the destination path as the destination path name. + Check whether the destination path refers to a folder / document. ** */ + $source_path = $options["path"]; + $dest_path = urldecode($options["dest"]); + $sDestPathName = basename($dest_path); + + list($iDestFolder, $iDestDoc) = $this->_folderOrDocument($dest_path); + + /* ** Get the source and destination folder objects. + If the destination document is null, then the destination is an existing folder. Check overwrite. + If overwrite is true, then check permissions and delete the folder, continue. + If the destination document returns an id, then the destination is a document, return 409 error. + If the destination document is false, then continue. ** */ + $oSrcFolder = Folder::get($iFolderID); + $oDestFolder = Folder::get($iDestFolder); + + include_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php'); + + if(is_null($iDestDoc)) { + // Destination is a folder and exists + //$sDestPathName = ''; + $this->ktwebdavLog("Destination Folder exists.", 'info', true); + + $oReplaceFolder = $oDestFolder; + if ($options['overwrite'] != 'T') { + $this->ktwebdavLog("Overwrite needs to be TRUE.", 'info', true); + return "412 Precondition Failed - Destination Folder exists. Overwrite needs to be TRUE."; + } + $this->ktwebdavLog("Overwrite is TRUE, deleting Destination Folder.", 'info', true); + + // Check if the user has permissions to delete this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.delete'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oReplaceFolder)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + KTFolderUtil::delete($oReplaceFolder, $oUser, 'KTWebDAV move overwrites target.'); + + // Destination folder has been deleted - get new object of destination parent folder + list($iDestFolder, $iDestDoc) = $this->_folderOrDocument($dest_path); + $oDestFolder = Folder::get($iDestFolder); + + $new = false; + } else if ($iDestDoc !== false) { + // Destination is a document + return "409 Conflict - Can't write a collection to a document"; + } + + /* ** Get the destination folder object and the source document object. + Check if user has permission to write to the folder. + Copy the document. Pass parameters for the destination folder name and the depth of copy. ** */ + $oUser =& User::get($this->userID); + $this->ktwebdavLog("Got an oSrcFolder of " . print_r($oSrcFolder, true), 'info', true); + $this->ktwebdavLog("Got an oDestFolder of " . print_r($oDestFolder, true), 'info', true); + $this->ktwebdavLog("Got an oUser of " . print_r($oUser, true), 'info', true); + + // Check if the user has permissions to write in this folder + $oPerm =& KTPermission::getByName('ktcore.permissions.write'); + $oUser =& User::get($this->userID); + if (!KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oDestFolder)) { + return "403 Forbidden - User does not have sufficient permissions"; + } + + $reason = (isset($_SERVER['HTTP_REASON']) && !empty($_SERVER['HTTP_REASON'])) ? $_SERVER['HTTP_REASON'] : "KTWebDAV Copy."; + + $res = KTFolderUtil::copy($oSrcFolder, $oDestFolder, $oUser, $reason, $sDestPathName, $copyAll); + + if(PEAR::isError($res)){ + $this->ktwebdavLog("Copy on folder failed: ".$res->getMessage(), 'info', true); + return "500 Internal Server Error - Copy on folder failed."; + } + + if ($new) { + $this->ktwebdavLog("201 Created", 'info', true); + return "201 Created"; + } else { + $this->ktwebdavLog("204 No Content", 'info', true); + return "204 No Content"; + } + + } + + /** + * LOCK method handler + * + * @param array parameter passing array + * @return string HTTP status code or false + */ + function LOCK(&$options) + { + return "200 OK"; + } + + /** + * UNLOCK method handler + * + * @param array parameter passing array + * @return string HTTP status code or false + */ + function UNLOCK(&$options) + { + return "200 OK"; + } + + /** + * checkLock() helper + * + * @param string resource path to check for locks + * @return string HTTP status code or false + */ + function checkLock($path) + { + $result = false; + + return $result; + } + + + /** + * canCopyMoveRenameDocument() helper + * checks if document is checked out; if not, returns true + * if checked out, cheks if checked out by same user; if yes, returns true; + * else returns false + * + * @return bool true or false + */ + function canCopyMoveRenameDocument($iDocumentID) + { + $this->ktwebdavLog("Entering canCopyMoveRenameDocument ", 'info', true); + + $oDocument =& Document::get($iDocumentID); + + if (is_null($oDocument) || ($oDocument === false) || PEAR::isError($oDocument)) { + $this->ktwebdavLog("Document invalid ". print_r($oDocument, true), 'info', true); + return false; + } + + if($oDocument->getIsCheckedOut()) { + $info = array(); + $info["props"][] = $this->mkprop($sNameSpace, 'CheckedOut', $oDocument->getCheckedOutUserID()); + //$this->ktwebdavLog("getIsCheckedOut ". print_r($info,true), 'info', true); + + $oCOUser = User::get( $oDocument->getCheckedOutUserID() ); + + if (PEAR::isError($oCOUser) || is_null($oCOUser) || ($oCOUser === false)) { + $couser_id = '0'; + } else { + $couser_id = $oCOUser->getID(); + } + + //$this->ktwebdavLog("getCheckedOutUserID " .$couser_id, 'info', true); + + $oUser =& User::get($this->userID); + + //$this->ktwebdavLog("this UserID " .$oUser->getID(), 'info', true); + + if (PEAR::isError($oUser) || is_null($oUser) || ($oUser === false)) { + $this->ktwebdavLog("User invalid ". print_r($oUser, true), 'info', true); + return false; + } else { + $ouser_id = $oUser->getID(); + } + + //$this->ktwebdavLog("that UserID " .$oCOUser->getID(), 'info', true); + + if ($couser_id != $ouser_id) { + $this->ktwebdavLog("Document checked out by another user $couser_id != $ouser_id", 'info', true); + return false; + } else { + $this->ktwebdavLog("Document checked out by this user", 'info', true); + return true; + } + } else { + //not checked out + $this->ktwebdavLog("Document not checked out by any user", 'info', true); + return true; + } + } + + /** + * checkSafeMode() helper + * + * @return bool true or false + */ + function checkSafeMode() + { + + // Check/Set the WebDAV Client + $userAgentValue = $_SERVER['HTTP_USER_AGENT']; + // KT Explorer + if (stristr($userAgentValue,"Microsoft Data Access Internet Publishing Provider")) { + $this->dav_client = "MS"; + $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true); + } + // Mac Finder + if (stristr($userAgentValue,"Macintosh") || stristr($userAgentValue,"Darwin")) { + $this->dav_client = "MC"; + $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true); + } + // Mac Goliath + if (stristr($userAgentValue,"Goliath")) { + $this->dav_client = "MG"; + $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true); + } + // Konqueror + if (stristr($userAgentValue,"Konqueror")) { + $this->dav_client = "KO"; + $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true); + } + // Neon Library ( Gnome Nautilus, cadaver, etc) + if (stristr($userAgentValue,"neon")) { + $this->dav_client = "NE"; + $this->ktwebdavLog("WebDAV Client : " . $userAgentValue, 'info', true); + } + // Windows WebDAV + if ($this->dav_client == 'MS' && $this->safeMode == 'off') { + + $this->ktwebdavLog("This is MS type client with SafeMode Off.", 'info', true); + return true; + + } + if ($this->dav_client == 'MS' && $this->safeMode != 'off') { + + $this->ktwebdavLog("This is MS type client with SafeMode On.", 'info', true); + return false; + + } + // Mac Finder + if ($this->dav_client == 'MC' && $this->safeMode == 'off') { + + $this->ktwebdavLog("This is Mac Finder type client with SafeMode off.", 'info', true); + return true; + + } + if ($this->dav_client == 'MC' && $this->safeMode != 'off') { + + $this->ktwebdavLog("This is Mac Finder type client with SafeMode on.", 'info', true); + return false; + + } + // Mac Goliath + if ($this->dav_client == 'MG' && $this->safeMode == 'off') { + + $this->ktwebdavLog("This is a Mac Goliath type client with SafeMode off.", 'info', true); + return true; + + } + // Mac Goliath + if ($this->dav_client == 'MG' && $this->safeMode != 'off') { + + $this->ktwebdavLog("This is a Mac Goliath type client with SafeMode on.", 'info', true); + return false; + + } + // Konqueror + if ($this->dav_client == 'KO' && $this->safeMode == 'off') { + + $this->ktwebdavLog("This is Konqueror type client with SafeMode Off.", 'info', true); + return true; + + } + if ($this->dav_client == 'KO' && $this->safeMode != 'off') { + + $this->ktwebdavLog("This is Konqueror type client with SafeMode On.", 'info', true); + return false; + + } + // Neon Library (Gnome Nautilus, cadaver, etc.) + if ($this->dav_client == 'NE' && $this->safeMode == 'off') { + + $this->ktwebdavLog("This is Neon type client with SafeMode Off.", 'info', true); + return true; + + } + if ($this->dav_client == 'NE' && $this->safeMode != 'off') { + + $this->ktwebdavLog("This is Neon type client with SafeMode On.", 'info', true); + return false; + + } + + $this->ktwebdavLog("Unknown client. SafeMode needed.", 'info', true); + return false; + + } + + } + + + ?> diff --git a/ktwebdav/thirdparty/pear/HTTP/WebDAV/Server.php b/ktwebdav/thirdparty/pear/HTTP/WebDAV/Server.php new file mode 100644 index 0000000..76d7135 --- /dev/null +++ b/ktwebdav/thirdparty/pear/HTTP/WebDAV/Server.php @@ -0,0 +1,2046 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: Server.php,v 1.56 2006/10/10 11:53:16 hholzgra Exp $ +// +require_once "HTTP/WebDAV/Tools/_parse_propfind.php"; +require_once "HTTP/WebDAV/Tools/_parse_proppatch.php"; +require_once "HTTP/WebDAV/Tools/_parse_lockinfo.php"; + +/** + * Virtual base class for implementing WebDAV servers + * + * WebDAV server base class, needs to be extended to do useful work + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package_version@ + */ +class HTTP_WebDAV_Server +{ + // {{{ Member Variables + + /** + * complete URI for this request + * + * @var string + */ + var $uri; + + + /** + * base URI for this request + * + * @var string + */ + var $base_uri; + + + /** + * URI path for this request + * + * @var string + */ + var $path; + + /** + * Realm string to be used in authentification popups + * + * @var string + */ + var $http_auth_realm = "PHP WebDAV"; + + /** + * String to be used in "X-Dav-Powered-By" header + * + * @var string + */ + var $dav_powered_by = ""; + + /** + * Remember parsed If: (RFC2518/9.4) header conditions + * + * @var array + */ + var $_if_header_uris = array(); + + /** + * HTTP response status/message + * + * @var string + */ + var $_http_status = "200 OK"; + + /** + * encoding of property values passed in + * + * @var string + */ + var $_prop_encoding = "utf-8"; + + /** + * Copy of $_SERVER superglobal array + * + * Derived classes may extend the constructor to + * modify its contents + * + * @var array + */ + var $_SERVER; + + // }}} + + // {{{ Constructor + + /** + * Constructor + * + * @param void + */ + function HTTP_WebDAV_Server() + { + // PHP messages destroy XML output -> switch them off + ini_set("display_errors", 0); + + // copy $_SERVER variables to local _SERVER array + // so that derived classes can simply modify these + $this->_SERVER = $_SERVER; + } + + // }}} + + // {{{ ServeRequest() + /** + * Serve WebDAV HTTP request + * + * dispatch WebDAV HTTP request to the apropriate method handler + * + * @param void + * @return void + */ + function ServeRequest() + { + // prevent warning in litmus check 'delete_fragment' + if (strstr($this->_SERVER["REQUEST_URI"], '#')) { + $this->http_status("400 Bad Request"); + return; + } + + // default uri is the complete request uri + $uri = (@$this->_SERVER["HTTPS"] === "on" ? "https:" : "http:"); + $uri.= "//$this->_SERVER[HTTP_HOST]$this->_SERVER[SCRIPT_NAME]"; + + $path_info = empty($this->_SERVER["PATH_INFO"]) ? "/" : $this->_SERVER["PATH_INFO"]; + + $this->base_uri = $uri; + $this->uri = $uri . $path_info; + + // set path + $this->path = $this->_urldecode($path_info); + if (!strlen($this->path)) { + if ($this->_SERVER["REQUEST_METHOD"] == "GET") { + // redirect clients that try to GET a collection + // WebDAV clients should never try this while + // regular HTTP clients might ... + header("Location: ".$this->base_uri."/"); + return; + } else { + // if a WebDAV client didn't give a path we just assume '/' + $this->path = "/"; + } + } + + if (ini_get("magic_quotes_gpc")) { + $this->path = stripslashes($this->path); + } + + + // identify ourselves + if (empty($this->dav_powered_by)) { + header("X-Dav-Powered-By: PHP class: ".get_class($this)); + } else { + header("X-Dav-Powered-By: ".$this->dav_powered_by); + } + + // check authentication + // for the motivation for not checking OPTIONS requests on / see + // http://pear.php.net/bugs/bug.php?id=5363 + if ( ( !(($this->_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/"))) + && (!$this->_check_auth())) { + // RFC2518 says we must use Digest instead of Basic + // but Microsoft Clients do not support Digest + // and we don't support NTLM and Kerberos + // so we are stuck with Basic here + header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"'); + + // Windows seems to require this being the last header sent + // (changed according to PECL bug #3138) + $this->http_status('401 Unauthorized'); + + return; + } + + // check + if (! $this->_check_if_header_conditions()) { + return; + } + + // detect requested method names + $method = strtolower($this->_SERVER["REQUEST_METHOD"]); + $wrapper = "http_".$method; + + // activate HEAD emulation by GET if no HEAD method found + if ($method == "head" && !method_exists($this, "head")) { + $method = "get"; + } + + if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) { + $this->$wrapper(); // call method by name + } else { // method not found/implemented + if ($this->_SERVER["REQUEST_METHOD"] == "LOCK") { + $this->http_status("412 Precondition failed"); + } else { + $this->http_status("405 Method not allowed"); + header("Allow: ".join(", ", $this->_allow())); // tell client what's allowed + } + } + } + + // }}} + + // {{{ abstract WebDAV methods + + // {{{ GET() + /** + * GET implementation + * + * overload this method to retrieve resources from your server + *
    + * + * + * @abstract + * @param array &$params Array of input and output parameters + *
    input
      + *
    • path - + *
    + *
    output
      + *
    • size - + *
    + * @returns int HTTP-Statuscode + */ + + /* abstract + function GET(&$params) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PUT() + /** + * PUT implementation + * + * PUT implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PUT() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ COPY() + + /** + * COPY implementation + * + * COPY implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function COPY() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ MOVE() + + /** + * MOVE implementation + * + * MOVE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function MOVE() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ DELETE() + + /** + * DELETE implementation + * + * DELETE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function DELETE() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ PROPFIND() + + /** + * PROPFIND implementation + * + * PROPFIND implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPFIND() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PROPPATCH() + + /** + * PROPPATCH implementation + * + * PROPPATCH implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPPATCH() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ LOCK() + + /** + * LOCK implementation + * + * LOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function LOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ UNLOCK() + + /** + * UNLOCK implementation + * + * UNLOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function UNLOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // }}} + + // {{{ other abstract methods + + // {{{ check_auth() + + /** + * check authentication + * + * overload this method to retrieve and confirm authentication information + * + * @abstract + * @param string type Authentication type, e.g. "basic" or "digest" + * @param string username Transmitted username + * @param string passwort Transmitted password + * @returns bool Authentication status + */ + + /* abstract + function checkAuth($type, $username, $password) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ checklock() + + /** + * check lock status for a resource + * + * overload this method to return shared and exclusive locks + * active for this resource + * + * @abstract + * @param string resource Resource path to check + * @returns array An array of lock entries each consisting + * of 'type' ('shared'/'exclusive'), 'token' and 'timeout' + */ + + /* abstract + function checklock($resource) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // }}} + + // {{{ WebDAV HTTP method wrappers + + // {{{ http_OPTIONS() + + /** + * OPTIONS method handler + * + * The OPTIONS method handler creates a valid OPTIONS reply + * including Dav: and Allowed: heaers + * based on the implemented methods found in the actual instance + * + * @param void + * @return void + */ + function http_OPTIONS() + { + // Microsoft clients default to the Frontpage protocol + // unless we tell them to use WebDAV + header("MS-Author-Via: DAV"); + + // get allowed methods + $allow = $this->_allow(); + + // dav header + $dav = array(1); // assume we are always dav class 1 compliant + if (isset($allow['LOCK'])) { + $dav[] = 2; // dav class 2 requires that locking is supported + } + + // tell clients what we found + $this->http_status("200 OK"); + header("DAV: " .join(", ", $dav)); + header("Allow: ".join(", ", $allow)); + + header("Content-length: 0"); + } + + // }}} + + + // {{{ http_PROPFIND() + + /** + * PROPFIND method handler + * + * @param void + * @return void + */ + function http_PROPFIND() + { + $options = Array(); + $files = Array(); + + $options["path"] = $this->path; + + // search depth from header (default is "infinity) + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // analyze request payload + $propinfo = new _parse_propfind("php://input"); + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + $options['props'] = $propinfo->props; + + // call user handler + if (!$this->PROPFIND($options, $files)) { + $files = array("files" => array()); + if (method_exists($this, "checkLock")) { + // is locked? + $lock = $this->checkLock($this->path); + + if (is_array($lock) && count($lock)) { + $created = isset($lock['created']) ? $lock['created'] : time(); + $modified = isset($lock['modified']) ? $lock['modified'] : time(); + $files['files'][] = array("path" => $this->_slashify($this->path), + "props" => array($this->mkprop("displayname", $this->path), + $this->mkprop("creationdate", $created), + $this->mkprop("getlastmodified", $modified), + $this->mkprop("resourcetype", ""), + $this->mkprop("getcontenttype", ""), + $this->mkprop("getcontentlength", 0)) + ); + } + } + + if (empty($files['files'])) { + $this->http_status("404 Not Found"); + return; + } + } + + // collect namespaces here + $ns_hash = array(); + + // Microsoft Clients need this special namespace for date and time values + $ns_defs = "xmlns:ns0=\"urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/\""; + + // now we loop over all returned file entries + foreach ($files["files"] as $filekey => $file) { + + // nothing to do if no properties were returend for a file + if (!isset($file["props"]) || !is_array($file["props"])) { + continue; + } + + // now loop over all returned properties + foreach ($file["props"] as $key => $prop) { + // as a convenience feature we do not require that user handlers + // restrict returned properties to the requested ones + // here we strip all unrequested entries out of the response + + switch($options['props']) { + case "all": + // nothing to remove + break; + + case "names": + // only the names of all existing properties were requested + // so we remove all values + unset($files["files"][$filekey]["props"][$key]["val"]); + break; + + default: + $found = false; + + // search property name in requested properties + foreach ((array)$options["props"] as $reqprop) { + if ( $reqprop["name"] == $prop["name"] + && @$reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + // unset property and continue with next one if not found/requested + if (!$found) { + $files["files"][$filekey]["props"][$key]=""; + continue(2); + } + break; + } + + // namespace handling + if (empty($prop["ns"])) continue; // no namespace + $ns = $prop["ns"]; + if ($ns == "DAV:") continue; // default namespace + if (isset($ns_hash[$ns])) continue; // already known + + // register namespace + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$ns] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$ns\""; + } + + // we also need to add empty entries for properties that were requested + // but for which no values where returned by the user handler + if (is_array($options['props'])) { + foreach ($options["props"] as $reqprop) { + if ($reqprop['name']=="") continue; // skip empty entries + + $found = false; + + // check if property exists in result + foreach ($file["props"] as $prop) { + if ( $reqprop["name"] == $prop["name"] + && @$reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + if (!$found) { + if ($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") { + // lockdiscovery is handled by the base class + $files["files"][$filekey]["props"][] + = $this->mkprop("DAV:", + "lockdiscovery", + $this->lockdiscovery($files["files"][$filekey]['path'])); + } else { + // add empty value for this property + $files["files"][$filekey]["noprops"][] = + $this->mkprop($reqprop["xmlns"], $reqprop["name"], ""); + + // register property namespace if not known yet + if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$reqprop["xmlns"]] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\""; + } + } + } + } + } + } + + // now we generate the reply header ... + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + // ... and payload + echo "\n"; + echo "\n"; + + foreach ($files["files"] as $file) { + // ignore empty or incomplete entries + if (!is_array($file) || empty($file) || !isset($file["path"])) continue; + $path = $file['path']; + if (!is_string($path) || $path==="") continue; + + echo " \n"; + + /* TODO right now the user implementation has to make sure + collections end in a slash, this should be done in here + by checking the resource attribute */ + $href = $this->_mergePathes($this->_SERVER['SCRIPT_NAME'], $path); + + echo " $href\n"; + + // report all found properties and their values (if any) + if (isset($file["props"]) && is_array($file["props"])) { + echo " \n"; + echo " \n"; + + foreach ($file["props"] as $key => $prop) { + + if (!is_array($prop)) continue; + if (!isset($prop["name"])) continue; + + if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) { + // empty properties (cannot use empty() for check as "0" is a legal value here) + if ($prop["ns"]=="DAV:") { + echo " \n"; + } else if (!empty($prop["ns"])) { + echo " <".$ns_hash[$prop["ns"]].":$prop[name]/>\n"; + } else { + echo " <$prop[name] xmlns=\"\"/>"; + } + } else if ($prop["ns"] == "DAV:") { + // some WebDAV properties need special treatment + switch ($prop["name"]) { + case "creationdate": + echo " " + . gmdate("Y-m-d\\TH:i:s\\Z", $prop['val']) + . "\n"; + break; + case "getlastmodified": + echo " " + . gmdate("D, d M Y H:i:s ", $prop['val']) + . "GMT\n"; + break; + case "resourcetype": + echo " \n"; + break; + case "supportedlock": + echo " $prop[val]\n"; + break; + case "lockdiscovery": + echo " \n"; + echo $prop["val"]; + echo " \n"; + break; + default: + echo " " + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + break; + } + } else { + // properties from namespaces != "DAV:" or without any namespace + if ($prop["ns"]) { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]>" + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + } else { + echo " <$prop[name] xmlns=\"\">" + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + } + } + } + + echo " \n"; + echo " HTTP/1.1 200 OK\n"; + echo " \n"; + } + + // now report all properties requested but not found + if (isset($file["noprops"])) { + echo " \n"; + echo " \n"; + + foreach ($file["noprops"] as $key => $prop) { + if ($prop["ns"] == "DAV:") { + echo " \n"; + } else if ($prop["ns"] == "") { + echo " <$prop[name] xmlns=\"\"/>\n"; + } else { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n"; + } + } + + echo " \n"; + echo " HTTP/1.1 404 Not Found\n"; + echo " \n"; + } + + echo " \n"; + } + + echo "\n"; + } + + + // }}} + + // {{{ http_PROPPATCH() + + /** + * PROPPATCH method handler + * + * @param void + * @return void + */ + function http_PROPPATCH() + { + if ($this->_check_lock_status($this->path)) { + $options = Array(); + + $options["path"] = $this->path; + + $propinfo = new _parse_proppatch("php://input"); + + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + + $options['props'] = $propinfo->props; + + $responsedescr = $this->PROPPATCH($options); + + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + echo "\n"; + + echo "\n"; + echo " \n"; + echo " ".$this->_urlencode($this->_mergePathes($this->_SERVER["SCRIPT_NAME"], $this->path))."\n"; + + foreach ($options["props"] as $prop) { + echo " \n"; + echo " <$prop[name] xmlns=\"$prop[ns]\"/>\n"; + echo " HTTP/1.1 $prop[status]\n"; + echo " \n"; + } + + if ($responsedescr) { + echo " ". + $this->_prop_encode(htmlspecialchars($responsedescr)). + "\n"; + } + + echo " \n"; + echo "\n"; + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_MKCOL() + + /** + * MKCOL method handler + * + * @param void + * @return void + */ + function http_MKCOL() + { + $options = Array(); + + $options["path"] = $this->path; + + $stat = $this->MKCOL($options); + + $this->http_status($stat); + } + + // }}} + + + // {{{ http_GET() + + /** + * GET method handler + * + * @param void + * @returns void + */ + function http_GET() + { + // TODO check for invalid stream + $options = Array(); + $options["path"] = $this->path; + + $this->_get_ranges($options); + + if (true === ($status = $this->GET($options))) { + if (!headers_sent()) { + $status = "200 OK"; + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + + if (isset($options['stream'])) { + // GET handler returned a stream + if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) { + // partial request and stream is seekable + + if (count($options['ranges']) === 1) { + $range = $options['ranges'][0]; + + if (isset($range['start'])) { + fseek($options['stream'], $range['start'], SEEK_SET); + if (feof($options['stream'])) { + $this->http_status("416 Requested range not satisfiable"); + return; + } + + if (isset($range['end'])) { + $size = $range['end']-$range['start']+1; + $this->http_status("206 partial"); + header("Content-length: $size"); + header("Content-range: $range[start]-$range[end]/" + . (isset($options['size']) ? $options['size'] : "*")); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= strlen($buffer); + echo $buffer; + } + } else { + $this->http_status("206 partial"); + if (isset($options['size'])) { + header("Content-length: ".($options['size'] - $range['start'])); + header("Content-range: ".$range['start']."-".$range['end']."/" + . (isset($options['size']) ? $options['size'] : "*")); + } + fpassthru($options['stream']); + } + } else { + header("Content-length: ".$range['last']); + fseek($options['stream'], -$range['last'], SEEK_END); + fpassthru($options['stream']); + } + } else { + $this->_multipart_byterange_header(); // init multipart + foreach ($options['ranges'] as $range) { + // TODO what if size unknown? 500? + if (isset($range['start'])) { + $from = $range['start']; + $to = !empty($range['end']) ? $range['end'] : $options['size']-1; + } else { + $from = $options['size'] - $range['last']-1; + $to = $options['size'] -1; + } + $total = isset($options['size']) ? $options['size'] : "*"; + $size = $to - $from + 1; + $this->_multipart_byterange_header($options['mimetype'], $from, $to, $total); + + + fseek($options['stream'], $from, SEEK_SET); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= strlen($buffer); + echo $buffer; + } + } + $this->_multipart_byterange_header(); // end multipart + } + } else { + // normal request or stream isn't seekable, return full content + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + fpassthru($options['stream']); + return; // no more headers + } + } elseif (isset($options['data'])) { + if (is_array($options['data'])) { + // reply to partial request + } else { + header("Content-length: ".strlen($options['data'])); + echo $options['data']; + } + } + } + } + + if (!headers_sent()) { + if (false === $status) { + $this->http_status("404 not found"); + } else { + // TODO: check setting of headers in various code pathes above + $this->http_status("$status"); + } + } + } + + + /** + * parse HTTP Range: header + * + * @param array options array to store result in + * @return void + */ + function _get_ranges(&$options) + { + // process Range: header if present + if (isset($this->_SERVER['HTTP_RANGE'])) { + + // we only support standard "bytes" range specifications for now + if (preg_match('/bytes\s*=\s*(.+)/', $this->_SERVER['HTTP_RANGE'], $matches)) { + $options["ranges"] = array(); + + // ranges are comma separated + foreach (explode(",", $matches[1]) as $range) { + // ranges are either from-to pairs or just end positions + list($start, $end) = explode("-", $range); + $options["ranges"][] = ($start==="") + ? array("last"=>$end) + : array("start"=>$start, "end"=>$end); + } + } + } + } + + /** + * generate separator headers for multipart response + * + * first and last call happen without parameters to generate + * the initial header and closing sequence, all calls inbetween + * require content mimetype, start and end byte position and + * optionaly the total byte length of the requested resource + * + * @param string mimetype + * @param int start byte position + * @param int end byte position + * @param int total resource byte size + */ + function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false) + { + if ($mimetype === false) { + if (!isset($this->multipart_separator)) { + // initial + + // a little naive, this sequence *might* be part of the content + // but it's really not likely and rather expensive to check + $this->multipart_separator = "SEPARATOR_".md5(microtime()); + + // generate HTTP header + header("Content-type: multipart/byteranges; boundary=".$this->multipart_separator); + } else { + // final + + // generate closing multipart sequence + echo "\n--{$this->multipart_separator}--"; + } + } else { + // generate separator and header for next part + echo "\n--{$this->multipart_separator}\n"; + echo "Content-type: $mimetype\n"; + echo "Content-range: $from-$to/". ($total === false ? "*" : $total); + echo "\n\n"; + } + } + + + + // }}} + + // {{{ http_HEAD() + + /** + * HEAD method handler + * + * @param void + * @return void + */ + function http_HEAD() + { + $status = false; + $options = Array(); + $options["path"] = $this->path; + + if (method_exists($this, "HEAD")) { + $status = $this->head($options); + } else if (method_exists($this, "GET")) { + ob_start(); + $status = $this->GET($options); + if (!isset($options['size'])) { + $options['size'] = ob_get_length(); + } + ob_end_clean(); + } + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + + if ($status === true) $status = "200 OK"; + if ($status === false) $status = "404 Not found"; + + $this->http_status($status); + } + + // }}} + + // {{{ http_PUT() + + /** + * PUT method handler + * + * @param void + * @return void + */ + function http_PUT() + { + if ($this->_check_lock_status($this->path)) { + $options = Array(); + $options["path"] = $this->path; + $options["content_length"] = $this->_SERVER["CONTENT_LENGTH"]; + + // get the Content-type + if (isset($this->_SERVER["CONTENT_TYPE"])) { + // for now we do not support any sort of multipart requests + if (!strncmp($this->_SERVER["CONTENT_TYPE"], "multipart/", 10)) { + $this->http_status("501 not implemented"); + echo "The service does not support mulipart PUT requests"; + return; + } + $options["content_type"] = $this->_SERVER["CONTENT_TYPE"]; + } else { + // default content type if none given + $options["content_type"] = "application/octet-stream"; + } + + /* RFC 2616 2.6 says: "The recipient of the entity MUST NOT + ignore any Content-* (e.g. Content-Range) headers that it + does not understand or implement and MUST return a 501 + (Not Implemented) response in such cases." + */ + foreach ($this->_SERVER as $key => $val) { + if (strncmp($key, "HTTP_CONTENT", 11)) continue; + switch ($key) { + case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11 + // TODO support this if ext/zlib filters are available + $this->http_status("501 not implemented"); + echo "The service does not support '$val' content encoding"; + return; + + case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12 + // we assume it is not critical if this one is ignored + // in the actual PUT implementation ... + $options["content_language"] = $val; + break; + + case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14 + /* The meaning of the Content-Location header in PUT + or POST requests is undefined; servers are free + to ignore it in those cases. */ + break; + + case 'HTTP_CONTENT_RANGE': // RFC 2616 14.16 + // single byte range requests are supported + // the header format is also specified in RFC 2616 14.16 + // TODO we have to ensure that implementations support this or send 501 instead + if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) { + $this->http_status("400 bad request"); + echo "The service does only support single byte ranges"; + return; + } + + $range = array("start"=>$matches[1], "end"=>$matches[2]); + if (is_numeric($matches[3])) { + $range["total_length"] = $matches[3]; + } + $option["ranges"][] = $range; + + // TODO make sure the implementation supports partial PUT + // this has to be done in advance to avoid data being overwritten + // on implementations that do not support this ... + break; + + case 'HTTP_CONTENT_MD5': // RFC 2616 14.15 + // TODO: maybe we can just pretend here? + $this->http_status("501 not implemented"); + echo "The service does not support content MD5 checksum verification"; + return; + + default: + // any other unknown Content-* headers + $this->http_status("501 not implemented"); + echo "The service does not support '$key'"; + return; + } + } + + $options["stream"] = fopen("php://input", "r"); + + $stat = $this->PUT($options); + + if ($stat === false) { + $stat = "403 Forbidden"; + } else if (is_resource($stat) && get_resource_type($stat) == "stream") { + $stream = $stat; + + $stat = $options["new"] ? "201 Created" : "204 No Content"; + + if (!empty($options["ranges"])) { + // TODO multipart support is missing (see also above) + if (0 == fseek($stream, $range[0]["start"], SEEK_SET)) { + $length = $range[0]["end"]-$range[0]["start"]+1; + if (!fwrite($stream, fread($options["stream"], $length))) { + $stat = "403 Forbidden"; + } + } else { + $stat = "403 Forbidden"; + } + } else { + while (!feof($options["stream"])) { + if (false === fwrite($stream, fread($options["stream"], 4096))) { + $stat = "403 Forbidden"; + break; + } + } + } + + fclose($stream); + } + + $this->http_status($stat); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_DELETE() + + /** + * DELETE method handler + * + * @param void + * @return void + */ + function http_DELETE() + { + // check RFC 2518 Section 9.2, last paragraph + if (isset($this->_SERVER["HTTP_DEPTH"])) { + if ($this->_SERVER["HTTP_DEPTH"] != "infinity") { + $this->http_status("400 Bad Request"); + return; + } + } + + // check lock status + if ($this->_check_lock_status($this->path)) { + // ok, proceed + $options = Array(); + $options["path"] = $this->path; + + $stat = $this->DELETE($options); + + $this->http_status($stat); + } else { + // sorry, its locked + $this->http_status("423 Locked"); + } + } + + // }}} + + // {{{ http_COPY() + + /** + * COPY method handler + * + * @param void + * @return void + */ + function http_COPY() + { + // no need to check source lock status here + // destination lock status is always checked by the helper method + $this->_copymove("copy"); + } + + // }}} + + // {{{ http_MOVE() + + /** + * MOVE method handler + * + * @param void + * @return void + */ + function http_MOVE() + { + if ($this->_check_lock_status($this->path)) { + // destination lock status is always checked by the helper method + $this->_copymove("move"); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_LOCK() + + /** + * LOCK method handler + * + * @param void + * @return void + */ + function http_LOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + if (isset($this->_SERVER["HTTP_TIMEOUT"])) { + $options["timeout"] = explode(",", $this->_SERVER["HTTP_TIMEOUT"]); + } + + if (empty($this->_SERVER['CONTENT_LENGTH']) && !empty($this->_SERVER['HTTP_IF'])) { + // check if locking is possible + if (!$this->_check_lock_status($this->path)) { + $this->http_status("423 Locked"); + return; + } + + // refresh lock + $options["locktoken"] = substr($this->_SERVER['HTTP_IF'], 2, -2); + $options["update"] = $options["locktoken"]; + + // setting defaults for required fields, LOCK() SHOULD overwrite these + $options['owner'] = "unknown"; + $options['scope'] = "exclusive"; + $options['type'] = "write"; + + + $stat = $this->LOCK($options); + } else { + // extract lock request information from request XML payload + $lockinfo = new _parse_lockinfo("php://input"); + if (!$lockinfo->success) { + $this->http_status("400 bad request"); + } + + // check if locking is possible + if (!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared")) { + $this->http_status("423 Locked"); + return; + } + + // new lock + $options["scope"] = $lockinfo->lockscope; + $options["type"] = $lockinfo->locktype; + $options["owner"] = $lockinfo->owner; + $options["locktoken"] = $this->_new_locktoken(); + + $stat = $this->LOCK($options); + } + + if (is_bool($stat)) { + $http_stat = $stat ? "200 OK" : "423 Locked"; + } else { + $http_stat = $stat; + } + $this->http_status($http_stat); + + if ($http_stat{0} == 2) { // 2xx states are ok + if ($options["timeout"]) { + // more than a million is considered an absolute timestamp + // less is more likely a relative value + if ($options["timeout"]>1000000) { + $timeout = "Second-".($options['timeout']-time()); + } else { + $timeout = "Second-$options[timeout]"; + } + } else { + $timeout = "Infinite"; + } + + header('Content-Type: text/xml; charset="utf-8"'); + header("Lock-Token: <$options[locktoken]>"); + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " $options[depth]\n"; + echo " $options[owner]\n"; + echo " $timeout\n"; + echo " $options[locktoken]\n"; + echo " \n"; + echo " \n"; + echo "\n\n"; + } + } + + + // }}} + + // {{{ http_UNLOCK() + + /** + * UNLOCK method handler + * + * @param void + * @return void + */ + function http_UNLOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // strip surrounding <> + $options["token"] = substr(trim($this->_SERVER["HTTP_LOCK_TOKEN"]), 1, -1); + + // call user method + $stat = $this->UNLOCK($options); + + $this->http_status($stat); + } + + // }}} + + // }}} + + // {{{ _copymove() + + function _copymove($what) + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER["HTTP_DEPTH"])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + extract(parse_url($this->_SERVER["HTTP_DESTINATION"])); + $path = urldecode($path); + $http_host = $host; + if (isset($port) && $port != 80) + $http_host.= ":$port"; + + $http_header_host = preg_replace("/:80$/", "", $this->_SERVER["HTTP_HOST"]); + + if ($http_host == $http_header_host && + !strncmp($this->_SERVER["SCRIPT_NAME"], $path, + strlen($this->_SERVER["SCRIPT_NAME"]))) { + $options["dest"] = substr($path, strlen($this->_SERVER["SCRIPT_NAME"])); + if (!$this->_check_lock_status($options["dest"])) { + $this->http_status("423 Locked"); + return; + } + + } else { + $options["dest_url"] = $this->_SERVER["HTTP_DESTINATION"]; + } + + // see RFC 2518 Sections 9.6, 8.8.4 and 8.9.3 + if (isset($this->_SERVER["HTTP_OVERWRITE"])) { + $options["overwrite"] = $this->_SERVER["HTTP_OVERWRITE"] == "T"; + } else { + $options["overwrite"] = true; + } + + $stat = $this->$what($options); + $this->http_status($stat); + } + + // }}} + + // {{{ _allow() + + /** + * check for implemented HTTP methods + * + * @param void + * @return array something + */ + function _allow() + { + // OPTIONS is always there + $allow = array("OPTIONS" =>"OPTIONS"); + + // all other METHODS need both a http_method() wrapper + // and a method() implementation + // the base class supplies wrappers only + foreach (get_class_methods($this) as $method) { + if (!strncmp("http_", $method, 5)) { + $method = strtoupper(substr($method, 5)); + if (method_exists($this, $method)) { + $allow[$method] = $method; + } + } + } + + // we can emulate a missing HEAD implemetation using GET + if (isset($allow["GET"])) + $allow["HEAD"] = "HEAD"; + + // no LOCK without checklok() + if (!method_exists($this, "checklock")) { + unset($allow["LOCK"]); + unset($allow["UNLOCK"]); + } + + return $allow; + } + + // }}} + + /** + * helper for property element creation + * + * @param string XML namespace (optional) + * @param string property name + * @param string property value + * @return array property array + */ + function mkprop() + { + $args = func_get_args(); + if (count($args) == 3) { + return array("ns" => $args[0], + "name" => $args[1], + "val" => $args[2]); + } else { + return array("ns" => "DAV:", + "name" => $args[0], + "val" => $args[1]); + } + } + + // {{{ _check_auth + + /** + * check authentication if check is implemented + * + * @param void + * @return bool true if authentication succeded or not necessary + */ + function _check_auth() + { + if (method_exists($this, "checkAuth")) { + // PEAR style method name + return $this->checkAuth(@$this->_SERVER["AUTH_TYPE"], + @$this->_SERVER["PHP_AUTH_USER"], + @$this->_SERVER["PHP_AUTH_PW"]); + } else if (method_exists($this, "check_auth")) { + // old (pre 1.0) method name + return $this->check_auth(@$this->_SERVER["AUTH_TYPE"], + @$this->_SERVER["PHP_AUTH_USER"], + @$this->_SERVER["PHP_AUTH_PW"]); + } else { + // no method found -> no authentication required + return true; + } + } + + // }}} + + // {{{ UUID stuff + + /** + * generate Unique Universal IDentifier for lock token + * + * @param void + * @return string a new UUID + */ + function _new_uuid() + { + // use uuid extension from PECL if available + if (function_exists("uuid_create")) { + return uuid_create(); + } + + // fallback + $uuid = md5(microtime().getmypid()); // this should be random enough for now + + // set variant and version fields for 'true' random uuid + $uuid{12} = "4"; + $n = 8 + (ord($uuid{16}) & 3); + $hex = "0123456789abcdef"; + $uuid{16} = $hex{$n}; + + // return formated uuid + return substr($uuid, 0, 8)."-" + . substr($uuid, 8, 4)."-" + . substr($uuid, 12, 4)."-" + . substr($uuid, 16, 4)."-" + . substr($uuid, 20); + } + + /** + * create a new opaque lock token as defined in RFC2518 + * + * @param void + * @return string new RFC2518 opaque lock token + */ + function _new_locktoken() + { + return "opaquelocktoken:".$this->_new_uuid(); + } + + // }}} + + // {{{ WebDAV If: header parsing + + /** + * + * + * @param string header string to parse + * @param int current parsing position + * @return array next token (type and value) + */ + function _if_header_lexer($string, &$pos) + { + // skip whitespace + while (ctype_space($string{$pos})) { + ++$pos; + } + + // already at end of string? + if (strlen($string) <= $pos) { + return false; + } + + // get next character + $c = $string{$pos++}; + + // now it depends on what we found + switch ($c) { + case "<": + // URIs are enclosed in <...> + $pos2 = strpos($string, ">", $pos); + $uri = substr($string, $pos, $pos2 - $pos); + $pos = $pos2 + 1; + return array("URI", $uri); + + case "[": + //Etags are enclosed in [...] + if ($string{$pos} == "W") { + $type = "ETAG_WEAK"; + $pos += 2; + } else { + $type = "ETAG_STRONG"; + } + $pos2 = strpos($string, "]", $pos); + $etag = substr($string, $pos + 1, $pos2 - $pos - 2); + $pos = $pos2 + 1; + return array($type, $etag); + + case "N": + // "N" indicates negation + $pos += 2; + return array("NOT", "Not"); + + default: + // anything else is passed verbatim char by char + return array("CHAR", $c); + } + } + + /** + * parse If: header + * + * @param string header string + * @return array URIs and their conditions + */ + function _if_header_parser($str) + { + $pos = 0; + $len = strlen($str); + $uris = array(); + + // parser loop + while ($pos < $len) { + // get next token + $token = $this->_if_header_lexer($str, $pos); + + // check for URI + if ($token[0] == "URI") { + $uri = $token[1]; // remember URI + $token = $this->_if_header_lexer($str, $pos); // get next token + } else { + $uri = ""; + } + + // sanity check + if ($token[0] != "CHAR" || $token[1] != "(") { + return false; + } + + $list = array(); + $level = 1; + $not = ""; + while ($level) { + $token = $this->_if_header_lexer($str, $pos); + if ($token[0] == "NOT") { + $not = "!"; + continue; + } + switch ($token[0]) { + case "CHAR": + switch ($token[1]) { + case "(": + $level++; + break; + case ")": + $level--; + break; + default: + return false; + } + break; + + case "URI": + $list[] = $not."<$token[1]>"; + break; + + case "ETAG_WEAK": + $list[] = $not."[W/'$token[1]']>"; + break; + + case "ETAG_STRONG": + $list[] = $not."['$token[1]']>"; + break; + + default: + return false; + } + $not = ""; + } + + if (@is_array($uris[$uri])) { + $uris[$uri] = array_merge($uris[$uri], $list); + } else { + $uris[$uri] = $list; + } + } + + return $uris; + } + + /** + * check if conditions from "If:" headers are meat + * + * the "If:" header is an extension to HTTP/1.1 + * defined in RFC 2518 section 9.4 + * + * @param void + * @return void + */ + function _check_if_header_conditions() + { + if (isset($this->_SERVER["HTTP_IF"])) { + $this->_if_header_uris = + $this->_if_header_parser($this->_SERVER["HTTP_IF"]); + + foreach ($this->_if_header_uris as $uri => $conditions) { + if ($uri == "") { + $uri = $this->uri; + } + // all must match + $state = true; + foreach ($conditions as $condition) { + // lock tokens may be free form (RFC2518 6.3) + // but if opaquelocktokens are used (RFC2518 6.4) + // we have to check the format (litmus tests this) + if (!strncmp($condition, "$/', $condition)) { + $this->http_status("423 Locked"); + return false; + } + } + if (!$this->_check_uri_condition($uri, $condition)) { + $this->http_status("412 Precondition failed"); + $state = false; + break; + } + } + + // any match is ok + if ($state == true) { + return true; + } + } + return false; + } + return true; + } + + /** + * Check a single URI condition parsed from an if-header + * + * Check a single URI condition parsed from an if-header + * + * @abstract + * @param string $uri URI to check + * @param string $condition Condition to check for this URI + * @returns bool Condition check result + */ + function _check_uri_condition($uri, $condition) + { + // not really implemented here, + // implementations must override + + // a lock token can never be from the DAV: scheme + // litmus uses DAV:no-lock in some tests + if (!strncmp(" ignored for now + if (method_exists($this, "checkLock")) { + // is locked? + $lock = $this->checkLock($path); + + // ... and lock is not owned? + if (is_array($lock) && count($lock)) { + // FIXME doesn't check uri restrictions yet + if (!isset($this->_SERVER["HTTP_IF"]) || !strstr($this->_SERVER["HTTP_IF"], $lock["token"])) { + if (!$exclusive_only || ($lock["scope"] !== "shared")) + return false; + } + } + } + return true; + } + + + // }}} + + + /** + * Generate lockdiscovery reply from checklock() result + * + * @param string resource path to check + * @return string lockdiscovery response + */ + function lockdiscovery($path) + { + // no lock support without checklock() method + if (!method_exists($this, "checklock")) { + return ""; + } + + // collect response here + $activelocks = ""; + + // get checklock() reply + $lock = $this->checklock($path); + + // generate block for returned data + if (is_array($lock) && count($lock)) { + // check for 'timeout' or 'expires' + if (!empty($lock["expires"])) { + $timeout = "Second-".($lock["expires"] - time()); + } else if (!empty($lock["timeout"])) { + $timeout = "Second-$lock[timeout]"; + } else { + $timeout = "Infinite"; + } + + // genreate response block + $activelocks.= " + + + + $lock[depth] + $lock[owner] + $timeout + $lock[token] + + "; + } + + // return generated response + return $activelocks; + } + + /** + * set HTTP return status and mirror it in a private header + * + * @param string status code and message + * @return void + */ + function http_status($status) + { + // simplified success case + if ($status === true) { + $status = "200 OK"; + } + + // remember status + $this->_http_status = $status; + + // generate HTTP status response + header("HTTP/1.1 $status"); + header("X-WebDAV-Status: $status", true); + } + + /** + * private minimalistic version of PHP urlencode() + * + * only blanks and XML special chars must be encoded here + * full urlencode() encoding confuses some clients ... + * + * @param string URL to encode + * @return string encoded URL + */ + function _urlencode($url) + { + return strtr($url, array(" "=>"%20", + "&"=>"%26", + "<"=>"%3C", + ">"=>"%3E", + )); + } + + /** + * private version of PHP urldecode + * + * not really needed but added for completenes + * + * @param string URL to decode + * @return string decoded URL + */ + function _urldecode($path) + { + return urldecode($path); + } + + /** + * UTF-8 encode property values if not already done so + * + * @param string text to encode + * @return string utf-8 encoded text + */ + function _prop_encode($text) + { + switch (strtolower($this->_prop_encoding)) { + case "utf-8": + return $text; + case "iso-8859-1": + case "iso-8859-15": + case "latin-1": + default: + return utf8_encode($text); + } + } + + /** + * Slashify - make sure path ends in a slash + * + * @param string directory path + * @returns string directory path wiht trailing slash + */ + function _slashify($path) + { + if ($path[strlen($path)-1] != '/') { + $path = $path."/"; + } + return $path; + } + + /** + * Unslashify - make sure path doesn't in a slash + * + * @param string directory path + * @returns string directory path wihtout trailing slash + */ + function _unslashify($path) + { + if ($path[strlen($path)-1] == '/') { + $path = substr($path, 0, strlen($path) -1); + } + return $path; + } + + /** + * Merge two pathes, make sure there is exactly one slash between them + * + * @param string parent path + * @param string child path + * @return string merged path + */ + function _mergePathes($parent, $child) + { + if ($child{0} == '/') { + return $this->_unslashify($parent).$child; + } else { + return $this->_slashify($parent).$child; + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_lockinfo.php b/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_lockinfo.php new file mode 100644 index 0000000..8d33ead --- /dev/null +++ b/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_lockinfo.php @@ -0,0 +1,237 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_lockinfo.php,v 1.4 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing LOCK request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_lockinfo +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * lock type, currently only "write" + * + * @var string + * @access public + */ + var $locktype = ""; + + /** + * lock scope, "shared" or "exclusive" + * + * @var string + * @access public + */ + var $lockscope = ""; + + /** + * lock owner information + * + * @var string + * @access public + */ + var $owner = ""; + + /** + * flag that is set during lock owner read + * + * @var bool + * @access private + */ + var $collect_owner = false; + + /** + * constructor + * + * @param string path of stream to read + * @access public + */ + function _parse_lockinfo($path) + { + // we assume success unless problems occur + $this->success = true; + + // remember if any input was parsed + $had_input = false; + + // open stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create namespace aware parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + // parse input + while ($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if ($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // check if required tags where found + $this->success &= !empty($this->locktype); + $this->success &= !empty($this->lockscope); + + // free parser resource + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + } + + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + + if ($this->collect_owner) { + // everything within the tag needs to be collected + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= "<$ns_short$tag$ns_attr>"; + } else if ($ns == "DAV:") { + // parse only the essential tags + switch ($tag) { + case "write": + $this->locktype = $tag; + break; + case "exclusive": + case "shared": + $this->lockscope = $tag; + break; + case "owner": + $this->collect_owner = true; + break; + } + } + } + + /** + * data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) + { + // only the tag has data content + if ($this->collect_owner) { + $this->owner .= $data; + } + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + // finished? + if (($ns == "DAV:") && ($tag == "owner")) { + $this->collect_owner = false; + } + + // within we have to collect everything + if ($this->collect_owner) { + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= ""; + } + } +} + +?> diff --git a/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_propfind.php b/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_propfind.php new file mode 100644 index 0000000..efc8b64 --- /dev/null +++ b/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_propfind.php @@ -0,0 +1,178 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_propfind.php,v 1.4 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing PROPFIND request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_propfind +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * found properties are collected here + * + * @var array + * @access public + */ + var $props = false; + + /** + * internal tag nesting depth counter + * + * @var int + * @access private + */ + var $depth = 0; + + + /** + * constructor + * + * @access public + */ + function _parse_propfind($path) + { + // success state flag + $this->success = true; + + // property storage array + $this->props = array(); + + // internal tag depth counter + $this->depth = 0; + + // remember if any input was parsed + $had_input = false; + + // open input stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create XML parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + + // parse input + while ($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if ($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // free parser + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + + // if no input was parsed it was a request + if(!count($this->props)) $this->props = "all"; // default + } + + + /** + * start tag handler + * + * @access private + * @param resource parser + * @param string tag name + * @param array tag attributes + */ + function _startElement($parser, $name, $attrs) + { + // name space handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + // special tags at level 1: and + if ($this->depth == 1) { + if ($tag == "allprop") + $this->props = "all"; + + if ($tag == "propname") + $this->props = "names"; + } + + // requested properties are found at level 2 + if ($this->depth == 2) { + $prop = array("name" => $tag); + if ($ns) + $prop["xmlns"] = $ns; + $this->props[] = $prop; + } + + // increment depth count + $this->depth++; + } + + + /** + * end tag handler + * + * @access private + * @param resource parser + * @param string tag name + */ + function _endElement($parser, $name) + { + // here we only need to decrement the depth count + $this->depth--; + } +} + + +?> diff --git a/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_proppatch.php b/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_proppatch.php new file mode 100644 index 0000000..396c3e3 --- /dev/null +++ b/ktwebdav/thirdparty/pear/HTTP/WebDAV/Tools/_parse_proppatch.php @@ -0,0 +1,223 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_proppatch.php,v 1.6 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing PROPPATCH request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_proppatch +{ + /** + * + * + * @var + * @access + */ + var $success; + + /** + * + * + * @var + * @access + */ + var $props; + + /** + * + * + * @var + * @access + */ + var $depth; + + /** + * + * + * @var + * @access + */ + var $mode; + + /** + * + * + * @var + * @access + */ + var $current; + + /** + * constructor + * + * @param string path of input stream + * @access public + */ + function _parse_proppatch($path) + { + $this->success = true; + + $this->depth = 0; + $this->props = array(); + $had_input = false; + + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + xml_parser_free($xml_parser); + + fclose($f_in); + } + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + if ($this->depth == 1) { + $this->mode = $tag; + } + + if ($this->depth == 3) { + $prop = array("name" => $tag); + $this->current = array("name" => $tag, "ns" => $ns, "status"=> 200); + if ($this->mode == "set") { + $this->current["val"] = ""; // default set val + } + } + + if ($this->depth >= 4) { + $this->current["val"] .= "<$tag"; + if (isset($attr)) { + foreach ($attr as $key => $val) { + $this->current["val"] .= ' '.$key.'="'.str_replace('"','"', $val).'"'; + } + } + $this->current["val"] .= ">"; + } + + + + $this->depth++; + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + $this->depth--; + + if ($this->depth >= 4) { + $this->current["val"] .= ""; + } + + if ($this->depth == 3) { + if (isset($this->current)) { + $this->props[] = $this->current; + unset($this->current); + } + } + } + + /** + * input data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) + { + if (isset($this->current)) { + $this->current["val"] .= $data; + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode:nil + * End: + */ diff --git a/ktwebservice/1-20090903194035 b/ktwebservice/1-20090903194035 new file mode 100644 index 0000000..fc36c0f --- /dev/null +++ b/ktwebservice/1-20090903194035 @@ -0,0 +1,68 @@ + +Acorn Layout1247050268296_43541024768false + + + + + + + +