Commit b1fdb3859a28d77072e45cec325106d40ee35441

Authored by kevin_fourie
1 parent 1f2708d5

Merged in from DEV trunk...

Updated license header in two omitted files.

WSA-72
"Add missing fields to document detail structure in web services"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Megan Watson

KTS-2730
"When adding a document, the document util's add function dies on encountering an unlink"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Megan Watson

WSA-49
"Add missing fields to search structure in web services"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2732
"Create a new way to setup resources in plugins"
Fixed. Added a function to the base class called run_setup that gets called when the plugins are loaded.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen

WSA-78
"download manager does not construct a full url for the webservice download"
Fixed.

Committed By: Conrad Vermeulen
Reviewed By: Martin Kirsten

KTS-2733
"Colouration of DiskUsageDashlet is incorrect"

Fixed. Thanks Dirk!

Committed By: Kevin Fourie
Reviewed By: Jonathan Byrne

KTC-271
"Bulk upload does not work"
Fixed. Added 'temp_file' to the options array. 

KTC-273
"All files uploaded with the function 'Import from Server Location' has a size of 0kb after upload"
Fixed.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen

KTS-2734
"sanitize to html removes information from data stored in the database. It was discovered that slashes were removed"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Philip Arckoll

KTS-2735
"Metadata values should not be sanitized until display on whichever interface."
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Philip Arckoll

KTS-2736
"Metadata values constrained to 255 characters. some clients want larger values."
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Philip Arckoll

KTC-275
"Files that are uploaded with the 'Import from Server Location' is MOVED instead of COPIED to the DMS."
Fixed. Added a flag to aOptions to copy a file when uploading to the DMS instead of moving it.

Committed By: Megan Watson
Reviewed By: Conrad Vermeulen

KTS-2301
"Number of characters allowed in a field is not 250 as is mostly specified"
Updated. Changed filename and comment to be mediumtext compatible with other fields in other tables.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

WSA-76
"Update unit tests for document detail in web service"
Updated. Added missing fields.

WSA-79
"cater for custom_document_no and oem_document_id in webservices"
Updated. Added placeholders for future use.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

WSA-77
"Update unit tests for search structure in web service"
Updated. Added missing fields.

WSA-79
"cater for custom_document_no and oem_document_id in webservices"
Updated. Added placeholders for future use.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

WSA-75
"Create unit test for get_folder_contents in web services"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

WSA-49
"Improve the document_detail and folder_detail records to incorporate more fields available on the document"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2737
"Folder util sanitises too much which results in additional slashes being added to the database"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

WSA-77
"Update unit tests for search structure in web service"
Updated. Added missing fields.

WSA-79
"cater for custom_document_no and oem_document_id in webservices"
Updated. Added placeholders for future use.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2744
"Documents are not being indexed in the queue"

Fixed. Using new exec system.

Committed By: Kevin Fourie
Reviewed By: Conrad Vermeulen

KTS-2708
"Refactor plugins registration and loading"
Updated. Added the upgrade sql.

Committed by: Kevin Fourie
Reviewed by: Conrad Vermeulen

KTS-2745
"More detailed errors need to be returned when a failure occurs when adding a document."

Fixed. Added more detailed error messages.

Committed By: Jonathan Byrne
Reviewed By: Jalaloedien Abrahams

KTS-2718
"Tags added to documents when the Tag Cloud add-in is disabled does not show in that Tag Cloud Dashlet once it has been enabled again."

Fixed. Moved tag cloud trigger into core so it isn't dependant on the plugin.

Committed By: Jonathan Byrne
Reviewed By: Kevin Fourie

KTS-2708
"Refactor plugins registration and loading"
Updated. Added the upgrade sql.

Committed by: Kevin Fourie
Reviewed by: Conrad Vermeulen

KTS-2600
"Document Indexer Statistics Dashlet - improve text / US spelling / Capitalization / Link to Management Page"
Fixed. 

Committed By:Yusuf Davids
Reviewed By:Jalaloedien Abrahams

KTS-2646
"Database exception handler needs to be fixed"
Fixed. All database errors are now logged and the user is sent to an improved page.
Committed By:Yusuf Davids
Reviewed By:Jalaloedien Abrahams

KTS-2645
" A general exception handler is required to deal with thrown exceptions not caught by the application"
Fixed. 

Committed By:Yusuf Davids
Reviewed By:Jalaloedien Abrahams

KTC-256
"UI not displaying correctly"
Fixed. UI changed.

Committed By:Yusuf Davids
Reviewed By:Jalaloedien Abrahams

KTS-2748
"Wrong filesize units at DiskUsageDashlet and zero-byte lines"

Fixed. Corrected parition and filesize methods and catered to 0 size file.

Committed By: Kevin Fourie
Reviewed By: Jonathan Byrne

Updated SVN tags.

Committed By: Kevin Fourie
Reviewed By: Jonathan Byrne

KTC-239
"CLONE -Performance has become tragically slow (SUP-443)"
Fixed. Added the DB optimise script to the scheduler. Modified the script to log messages instead of printing them. Added a check on the id to the scheduler tasks in the upgrade script.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen

KTS-2748
"Wrong filesize units at DiskUsageDashlet and zero-byte lines"
Updated. Fixed use of incorrect constants (replaced MEGA with MB).

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen

KTS-2746
"CLONE -Put the custom metadata fields in alphabetical order(SUP-304)"
Fixed. Added a new config under ui. Put a usort on the fields.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen

WSA-87
"Comparison of folders when validating upload path does not work on windows correctly"
Fixed. Refactored some functionality and made the path seperator consistent.

Committed By: Conrad Vermeulen
Reviewed By: Isaac Lundal

KTS-2751
"Logging statement in trigger registry has typo. this can cause php to bomb!"
Fixed.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2752
"Folder Usage plugin must check the existance of the folder it is scanning"
Fixed.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2600
"Document Indexer Statistics Dashlet - improve text / US spelling / Capitalization / Link to Management Page"
Fixed.

Committed By:Yusuf Davids
Reviewed By:Jalaloedien Abrahams

KTC-277
"Tags associated to documents that have been deleted still show in the Tag Clouds dashlet."
Fixed. Altered the dashlet query.

Committed By: Jalaloedien Abrahams
Reviewed By: Conrad Vermeulen

KTS-1850
"Major performance issue - SQL query"
Fixed. Incorporated some of the changes from the optimisation patch into the core.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen

KTS-2606
"KnowledgeTree 3.5 requires php5 to be installed. It should detect php4 and provide an elegant error message that it is no longer supported."
Fixed. Inserted phpversion check in dmsDefaults.php.

Committed By:Yusuf Davids
Reviewed By:Jonathan Byrne

WSA-87
"Comparison of folders when validating upload path does not work on windows correctly"
Fixed. Refactored some functionality and made the path seperator consistent. Path was not being returned correctly in some cases.

Committed By: Conrad Vermeulen
Reviewed By: Isaac Lundal

KTS-1850
"Major performance issue - SQL query"
Updated. Removed lines replaced by the patch.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen

Version bump to 3.5.2 Beta1

KTS-2669
"Discussion thread text rendering creates <br> tags"
Fixed. Updated sanitize.

Committed By:Yusuf Davids
Reviewed By:Jonathan Byrne

KTC-239
"CLONE -Performance has become tragically slow (SUP-443)"
Updated. Added the @ sign in front of id when inserting.

Committed by: Martin Kirsten
Reviewed by: Megan Watson

KTC-292
"Minor version does not increase when the Document Title is changed."
Fixed. Added a new content version and updated the version number.

Committed by: Megan Watson
Reviewed by: Jonathan Byrne

KTS-
""
Updated. Location of error.css changed.

Committed By:Yusuf Davids
Reviewed By:

KTS-
""
Updated. Location of error_01.gif and error.css changed.

Committed By:Yusuf Davids
Reviewed By:

KTS-2709
"After re-activating the Tag Cloud plugin this does not work"

Fixed. Hid Tag fieldset and linked it to tag cloud plugin.

Committed By: Jonathan Byrne
Reviewed By: Jalaoedien Abrahams

KTS-2759
"Extend scheduler looping every 30 seconds by default vs 10 seconds"
Updated. Also added copyright.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2760
"Powerpoint files not being indexed"
Fixed. powerpoint was missing.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2761
"Last run time in Indexer Dashlet is not updated"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2761
"Last run time in Indexer Dashlet is not updated"
Fixed. queue updated to reflect live files only.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2762
"KTUtil::filesizeToString returns wrong filesizes"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

BBS-868
"CLONE -Login - remember password"
Added a client policy to the server.

Committed By: Isaac Lundall
Reviewed By: Martin Kirsten

KTS-2754
"Add a Document Fails"

Updated. Added better error checking.

Committed By: Kevin Fourie
Reviewed By: Conrad Vermeulen

KTS-2763
"pdf extractor does not have quotes around application name. this results in pdftotext not being called correcly in windows."
Fixed.

Committed By: Conrad Vermeulen
Reviewed By: Jonathan Byrne

KTC-296
"Bulk Download scrambles the folder hierarchy and only exports the first non-empty subfolder."
Fixed. The document paths were missing the last folder in the path and being added to the one below.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen

KTS-2157
"bulk upload does not validate that file is a zip file."
Fixed. Added a check on the file type.

Committed By: Megan Watson
Reviewed By: Conrad Vermeulen

Version bump to 3.5.2 beta1

KTS-2765
"csv mime type does not have an icon"
Updated.

Committed By: Conrad Vermeulen
Reviewed By: Kevin Fourie

KTS-2765
"csv mime type does not have an icon"
Updated. Added omitted upgrades table entries.

Committed By: Kevin Fourie
Reviewed By: Conrad Vermeulen



git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/STABLE/trunk@7812 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing 85 changed files with 2849 additions and 1966 deletions
bin/dbmaint.php
@@ -2,51 +2,57 @@ @@ -2,51 +2,57 @@
2 2
3 require_once('../config/dmsDefaults.php'); 3 require_once('../config/dmsDefaults.php');
4 4
5 -print _kt('DB Maintenance') . "...\n\n";  
6 -  
7 $action = 'check'; 5 $action = 'check';
8 $sqlaction = 'check table'; 6 $sqlaction = 'check table';
9 if ($argc > 0) 7 if ($argc > 0)
10 { 8 {
11 foreach($argv as $arg) 9 foreach($argv as $arg)
12 { 10 {
13 - $arg=strtolower($arg);  
14 - switch ($arg) 11 + $action=strtolower($arg);
  12 + switch ($action)
15 { 13 {
16 - case 'check':  
17 case 'repair': 14 case 'repair':
  15 + $sqlaction='repair table';
  16 + break;
18 case 'optimize': 17 case 'optimize':
19 - $sqlaction="$arg table";  
20 - $action = $arg; 18 + $sqlaction='optimize table';
21 break; 19 break;
22 case 'help': 20 case 'help':
23 print "Usage: dbmaint.php repair|check|optimize\n"; 21 print "Usage: dbmaint.php repair|check|optimize\n";
24 exit; 22 exit;
  23 + case 'check':
  24 + default:
  25 + $action = 'check';
  26 + $sqlaction='check table';
  27 + break;
25 } 28 }
26 } 29 }
27 } 30 }
28 31
29 -print '* ' . sprintf(_kt("Action selected: %s"), $action) . "\n\n"; 32 +$default->log->info("DB Maintenance... \nAction selected: {$action}");
30 33
31 $sql = "show tables"; 34 $sql = "show tables";
32 $tables = DBUtil::getResultArray($sql); 35 $tables = DBUtil::getResultArray($sql);
33 -foreach($tables as $table)  
34 -{  
35 - $key = array_keys($table);  
36 -  
37 - $tablename=$table[$key[0]];  
38 - $sql = "$sqlaction $tablename";  
39 - $result = DBUtil::getOneResult($sql);  
40 36
41 - if (PEAR::isError($result))  
42 - {  
43 - print sprintf(_kt("Attempted: %s"), $sql) . "\n";  
44 - print sprintf(_kt(' *: %s'), $result->getMessage()) . "\n";  
45 - continue;  
46 - }  
47 - print sprintf(_kt("Running: %s - %s"), $sql, $result['Msg_text']) . "\n"; 37 +if(!empty($tables)){
  38 + foreach($tables as $table)
  39 + {
  40 + $key = array_keys($table);
  41 +
  42 + $tablename=$table[$key[0]];
  43 + $sql = "$sqlaction $tablename;";
  44 + $result = DBUtil::getOneResult($sql);
  45 +
  46 + if (PEAR::isError($result))
  47 + {
  48 + $default->log->error('Attempted: '.$sql);
  49 + $default->log->error(' *: '.$result->getMessage());
  50 + continue;
  51 + }
  52 + $default->log->info('Running: '.$sql .' - '. $result['Msg_text']);
  53 + }
48 } 54 }
49 55
50 -print _kt('Done.') . "\n"; 56 +$default->log->info('Done.');
51 57
52 ?> 58 ?>
53 \ No newline at end of file 59 \ No newline at end of file
bin/scheduler.php
@@ -199,13 +199,16 @@ if (empty($aList)) @@ -199,13 +199,16 @@ if (empty($aList))
199 $dirname = dirname($file); 199 $dirname = dirname($file);
200 chdir($dirname); 200 chdir($dirname);
201 201
202 - $cmd = "$phpPath $cmd"; 202 + $cmd = "\"$phpPath\" $cmd";
203 } 203 }
204 204
205 if (OS_WINDOWS) 205 if (OS_WINDOWS)
206 - {  
207 - $cmd = str_replace( '/','\\',$cmd);  
208 - $res = `$cmd`; 206 + { $default->log->info("Scheduler - dirname: $dirname cmd: $cmd");
  207 + //$WshShell = new COM("WScript.Shell");
  208 + //$res = $WshShell->Run($cmd, 0, true);
  209 +
  210 + KTUtil::pexec($cmd);
  211 +
209 } 212 }
210 else 213 else
211 { 214 {
bin/win32/schedulerService.php
1 <?php 1 <?php
2 2
  3 +/**
  4 + * $Id: $
  5 + *
  6 + * KnowledgeTree Open Source Edition
  7 + * Document Management Made Simple
  8 + * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
  9 + *
  10 + * This program is free software; you can redistribute it and/or modify it under
  11 + * the terms of the GNU General Public License version 3 as published by the
  12 + * Free Software Foundation.
  13 + *
  14 + * This program is distributed in the hope that it will be useful, but WITHOUT
  15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  16 + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  17 + * details.
  18 + *
  19 + * You should have received a copy of the GNU General Public License
  20 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
  21 + *
  22 + * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
  23 + * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
  24 + *
  25 + * The interactive user interfaces in modified source and object code versions
  26 + * of this program must display Appropriate Legal Notices, as required under
  27 + * Section 5 of the GNU General Public License version 3.
  28 + *
  29 + * In accordance with Section 7(b) of the GNU General Public License version 3,
  30 + * these Appropriate Legal Notices must retain the display of the "Powered by
  31 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
  32 + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
  33 + * must display the words "Powered by KnowledgeTree" and retain the original
  34 + * copyright notice.
  35 + * Contributor( s): ______________________________________
  36 + *
  37 + */
  38 +
3 $myservicename = 'ktscheduler'; 39 $myservicename = 'ktscheduler';
4 40
5 // Connect to service dispatcher and notify that startup was successful 41 // Connect to service dispatcher and notify that startup was successful
@@ -12,7 +48,7 @@ require_once(&#39;../../config/dmsDefaults.php&#39;); @@ -12,7 +48,7 @@ require_once(&#39;../../config/dmsDefaults.php&#39;);
12 global $default; 48 global $default;
13 49
14 $config = KTConfig::getSingleton(); 50 $config = KTConfig::getSingleton();
15 -$schedulerInterval = $config->get('KnowledgeTree/schedulerInterval',10); // interval in seconds 51 +$schedulerInterval = $config->get('KnowledgeTree/schedulerInterval',30); // interval in seconds
16 //$phpPath = $config->get('externalBinary/php','php'); // TODO - fix me 52 //$phpPath = $config->get('externalBinary/php','php'); // TODO - fix me
17 53
18 // Change to knowledgeTree/bin folder 54 // Change to knowledgeTree/bin folder
@@ -48,13 +84,16 @@ while ($loop) @@ -48,13 +84,16 @@ while ($loop)
48 win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls 84 win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
49 } 85 }
50 // Run the scheduler script 86 // Run the scheduler script
51 - $cmd = "\"$phpPath\" scheduler.php"; 87 + $cmd = "\"$phpPath\" \"$dir/scheduler.php\"";
  88 +$default->log->info('Scheduler Service: cmd - ' .$cmd );
52 89
53 - $cmd = str_replace( '/','\\',$cmd);  
54 - $res = `"$cmd" 2>&1`; 90 + $WshShell = new COM("WScript.Shell");
  91 + $res = $WshShell->Run($cmd, 0, true);
  92 + //$cmd = str_replace( '/','\\',$cmd);
  93 + //$res = `$cmd 2>&1`;
55 if (!empty($res)) 94 if (!empty($res))
56 { 95 {
57 - $default->log->error('Scheduler: unexpected output - ' .$res); 96 + $default->log->error('Scheduler Service: unexpected output - ' .$res);
58 } 97 }
59 98
60 sleep($schedulerInterval); 99 sleep($schedulerInterval);
config/config.ini
@@ -135,6 +135,9 @@ fakeMimetype = default @@ -135,6 +135,9 @@ fakeMimetype = default
135 ; "dot" command location 135 ; "dot" command location
136 dot = dot 136 dot = dot
137 137
  138 +; sort the metadata fields alphabetically
  139 +metadata_sort = true
  140 +
138 [i18n] 141 [i18n]
139 ; Default language for the interface 142 ; Default language for the interface
140 defaultLanguage = en 143 defaultLanguage = en
@@ -197,7 +200,7 @@ uiUrl = ${rootUrl}/presentation/lookAndFeel/knowledgeTree @@ -197,7 +200,7 @@ uiUrl = ${rootUrl}/presentation/lookAndFeel/knowledgeTree
197 200
198 ;dedicated feed url 201 ;dedicated feed url
199 ;dedicatedrsstitle = RSS Feed Title 202 ;dedicatedrsstitle = RSS Feed Title
200 -;dedicatedrssurl = 203 +;dedicatedrssurl =
201 204
202 ; files 205 ; files
203 stopwordsFile = ${fileSystemRoot}/config/stopwords.txt 206 stopwordsFile = ${fileSystemRoot}/config/stopwords.txt
@@ -351,6 +354,8 @@ captureReasonsCheckout = true @@ -351,6 +354,8 @@ captureReasonsCheckout = true
351 captureReasonsCancelCheckout = true 354 captureReasonsCancelCheckout = true
352 captureReasonsCopyInKT = true 355 captureReasonsCopyInKT = true
353 captureReasonsMoveInKT = true 356 captureReasonsMoveInKT = true
  357 +;This setting governs whether the password can be stored on the client.
  358 +allowRememberPassword = true
354 359
355 ; settings for the Disk Usage dashlet 360 ; settings for the Disk Usage dashlet
356 [DiskUsage] 361 [DiskUsage]
@@ -362,3 +367,10 @@ warningThreshold=10 @@ -362,3 +367,10 @@ warningThreshold=10
362 ; the disk usage dashlet will will highlight the mount in RED 367 ; the disk usage dashlet will will highlight the mount in RED
363 urgentThreshold=5 368 urgentThreshold=5
364 369
  370 +[CustomErrorMessages]
  371 +;Turn custom error messages on or off here // account wide
  372 +customerrormessages=on
  373 +;name or url of custom error page
  374 +customerrorpagepath=customerrorpage.php
  375 +;Turn custom error handler on or off
  376 +customerrorhandler=on
365 \ No newline at end of file 377 \ No newline at end of file
config/dmsDefaults.php
@@ -353,8 +353,20 @@ class KTInit { @@ -353,8 +353,20 @@ class KTInit {
353 } 353 }
354 return false; 354 return false;
355 } 355 }
  356 +
356 // }}} 357 // }}}
357 358
  359 +function catchFatalErrors($p_OnOff='On'){
  360 + ini_set('display_errors','On');
  361 + $phperror='><div id="phperror" style="display:none">';
  362 + ini_set('error_prepend_string',$phperror);
  363 +
  364 + $phperror='</div>><form name="catcher" action="/customerrorpage.php" method="post" ><input type="hidden" name="fatal" value=""></form>
  365 + <script> document.catcher.fatal.value = document.getElementById("phperror").innerHTML; document.catcher.submit();</script>';
  366 + ini_set('error_append_string',$phperror);
  367 +}
  368 +
  369 +
358 370
359 // {{{ guessRootUrl() 371 // {{{ guessRootUrl()
360 function guessRootUrl() { 372 function guessRootUrl() {
@@ -505,6 +517,8 @@ class KTInit { @@ -505,6 +517,8 @@ class KTInit {
505 $oKTConfig->setdefaultns('clientToolPolicies', 'captureReasonsCopyInKT', true); 517 $oKTConfig->setdefaultns('clientToolPolicies', 'captureReasonsCopyInKT', true);
506 $oKTConfig->setdefaultns('clientToolPolicies', 'captureReasonsMoveInKT', true); 518 $oKTConfig->setdefaultns('clientToolPolicies', 'captureReasonsMoveInKT', true);
507 519
  520 + $oKTConfig->setdefaultns('clientToolPolicies', 'allowRememberPassword', true);
  521 +
508 $res = $this->readConfig(); 522 $res = $this->readConfig();
509 if (PEAR::isError($res)) { return $res; } 523 if (PEAR::isError($res)) { return $res; }
510 524
@@ -595,6 +609,21 @@ require_once(KT_LIB_DIR . &#39;/util/ktutil.inc&#39;); @@ -595,6 +609,21 @@ require_once(KT_LIB_DIR . &#39;/util/ktutil.inc&#39;);
595 609
596 require_once(KT_LIB_DIR . '/ktentity.inc'); 610 require_once(KT_LIB_DIR . '/ktentity.inc');
597 611
  612 +$KTInit->catchFatalErrors();
  613 +
  614 +if (phpversion()<5){
  615 +
  616 + $sErrorPage = 'http://'.$_SERVER['HTTP_HOST'].'/'.'customerrorpage.php';
  617 +
  618 + session_start();
  619 +
  620 + $_SESSION['sErrorMessage'] = 'KnowledgeTree now requires that PHP version 5 is installed. PHP version 4 is no longer supported.';
  621 +
  622 +
  623 + header('location:'. $sErrorPage ) ;
  624 +
  625 +}
  626 +
598 require_once(KT_LIB_DIR . '/config/config.inc.php'); 627 require_once(KT_LIB_DIR . '/config/config.inc.php');
599 require_once(KT_DIR . '/search2/indexing/indexerCore.inc.php'); 628 require_once(KT_DIR . '/search2/indexing/indexerCore.inc.php');
600 629
customerrorpage.php 0 โ†’ 100644
  1 +<?php
  2 +
  3 +if (array_key_exists('fatal', $_POST))
  4 +{
  5 + $posted = $_POST['fatal'];
  6 +
  7 +}
  8 +
  9 +if (array_key_exists('Error_MessageOne', $_POST) && array_key_exists('Error_MessageTwo', $_POST))
  10 +{
  11 + $sErrorMessage = $_POST['Error_MessageOne'].''.$_POST['Error_MessageTwo'];
  12 +
  13 +}
  14 +
  15 +session_start();
  16 +if (array_key_exists('sErrorMessage', $_SESSION))
  17 +{
  18 +$phperror = $_SESSION['sErrorMessage'];
  19 +}
  20 +
  21 +
  22 +
  23 +?>
  24 +
  25 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>
  26 + <head>
  27 + <title>Knowledgetree - Desklet</title>
  28 + <link rel="stylesheet" type="text/css" href="/resources/css/errors.css" />
  29 +
  30 + <script type="text/javascript">
  31 +
  32 +function Click()
  33 +{
  34 +var open = document.getElementById('exp');
  35 +open.style.display = 'block';
  36 +}
  37 +
  38 +</script>
  39 +
  40 + </head>
  41 + <body>
  42 +
  43 + <div id="error-container">
  44 +
  45 + <div id="acc-error">
  46 +
  47 +
  48 + <h1>Error!! - You have encountered a problem starting your document management system.</h1>
  49 + <p><h2>Please contact your systems administrator</h2></p>
  50 + <p>For more details, click here <img src="/resources/graphics/info.gif" style="cursor: pointer;" onclick="Click()" /><div id ="exp" style="display: none; "> <?php if(isset($sErrorMessage)){ echo $sErrorMessage; }else if(isset($posted)){ echo $posted; } else if($phperror){ echo $phperror; } ?></div></p>
  51 +
  52 + </div>
  53 + </div>
  54 +
  55 + </body>
  56 +</html>
0 \ No newline at end of file 57 \ No newline at end of file
docs/VERSION-NAME.txt
1 -OSS 3.5.2 1 +OSS 3.5.2 beta1
docs/VERSION-OSS.txt
1 -3.5.2 1 +3.5.2 beta1
error_01.gif 0 โ†’ 100644

2.09 KB

errors.css 0 โ†’ 100644
  1 +div#error-container {
  2 + width: 500px;
  3 + color: #555;
  4 + font-size: 11px;
  5 + font-family: Verdana, Arial, sans-serif;
  6 +}
  7 +div#error-container div {
  8 + height: 140px;
  9 +}
  10 +div#error-container h1 {
  11 + font-weight: lighter;
  12 + font-size: 22px;
  13 + margin-left: 100px;
  14 +}
  15 +div#error-container p {
  16 + margin-left: 100px;
  17 +}
  18 +
  19 + div#acc-error {
  20 + background: transparent url(error_01.gif) no-repeat top left;
  21 + }
  22 + div#acc-suspend {
  23 + background: transparent url(error_02.gif) no-repeat top left;
  24 + }
  25 + div#acc-maint {
  26 + background: transparent url(error_03.gif) no-repeat top left;
  27 + }
  28 +
  29 +
  30 +
  31 +
  32 +
  33 +
  34 +
  35 +
  36 +
  37 +
  38 +
  39 +
  40 +
  41 +
  42 +
  43 +
0 \ No newline at end of file 44 \ No newline at end of file
ktapi/KTAPIDocument.inc.php
@@ -35,6 +35,8 @@ @@ -35,6 +35,8 @@
35 * 35 *
36 */ 36 */
37 37
  38 +//require_once(KT_DIR . '/ktwebservice/KTUploadManager.inc.php');
  39 +
38 class KTAPI_Document extends KTAPI_FolderItem 40 class KTAPI_Document extends KTAPI_FolderItem
39 { 41 {
40 /** 42 /**
@@ -175,14 +177,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -175,14 +177,7 @@ class KTAPI_Document extends KTAPI_FolderItem
175 } 177 }
176 DBUtil::commit(); 178 DBUtil::commit();
177 179
178 - $tempfilename=addslashes($tempfilename);  
179 - $sql = "DELETE FROM uploaded_files WHERE tempfilename='$tempfilename'";  
180 - $result = DBUtil::runQuery($sql);  
181 - if (PEAR::isError($result))  
182 - {  
183 - return $result;  
184 - }  
185 - 180 + KTUploadManager::temporary_file_imported($tempfilename);
186 } 181 }
187 182
188 /** 183 /**
@@ -261,7 +256,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -261,7 +256,7 @@ class KTAPI_Document extends KTAPI_FolderItem
261 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res); 256 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res);
262 } 257 }
263 258
264 - $oDocumentTransaction = & new DocumentTransaction($this->document, $reason, 'ktcore.transactions.force_checkin'); 259 + $oDocumentTransaction = new DocumentTransaction($this->document, $reason, 'ktcore.transactions.force_checkin');
265 260
266 $res = $oDocumentTransaction->create(); 261 $res = $oDocumentTransaction->create();
267 if (($res === false) || PEAR::isError($res)) { 262 if (($res === false) || PEAR::isError($res)) {
@@ -280,13 +275,15 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -280,13 +275,15 @@ class KTAPI_Document extends KTAPI_FolderItem
280 dcv.size, 275 dcv.size,
281 w.name as workflow, 276 w.name as workflow,
282 ws.name as workflow_state, 277 ws.name as workflow_state,
283 - dlt.name as link_type 278 + dlt.name as link_type, dtl.name as document_type,
  279 + dcv.major_version, dcv.minor_version
284 FROM 280 FROM
285 document_link dl 281 document_link dl
286 INNER JOIN document_link_types dlt ON dl.link_type_id=dlt.id 282 INNER JOIN document_link_types dlt ON dl.link_type_id=dlt.id
287 INNER JOIN documents d ON dl.child_document_id=d.id 283 INNER JOIN documents d ON dl.child_document_id=d.id
288 INNER JOIN document_metadata_version dmv ON d.metadata_version_id=dmv.id 284 INNER JOIN document_metadata_version dmv ON d.metadata_version_id=dmv.id
289 INNER JOIN document_content_version dcv ON dmv.content_version_id=dcv.id 285 INNER JOIN document_content_version dcv ON dmv.content_version_id=dcv.id
  286 + INNER JOIN document_types_lookup dtl ON dtl.id=dmv.document_type_id
290 LEFT OUTER JOIN workflow_documents wd ON d.id=wd.document_id 287 LEFT OUTER JOIN workflow_documents wd ON d.id=wd.document_id
291 LEFT OUTER JOIN workflows w ON w.id=wd.workflow_id 288 LEFT OUTER JOIN workflows w ON w.id=wd.workflow_id
292 LEFT OUTER JOIN workflow_states ws ON wd.state_id=ws.id 289 LEFT OUTER JOIN workflow_states ws ON wd.state_id=ws.id
@@ -319,8 +316,12 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -319,8 +316,12 @@ class KTAPI_Document extends KTAPI_FolderItem
319 316
320 $result[] = array( 317 $result[] = array(
321 'document_id'=>(int)$row['document_id'], 318 'document_id'=>(int)$row['document_id'],
  319 + 'custom_document_no'=>'n/a',
  320 + 'oem_document_no'=>'n/a',
322 'title'=> $row['title'], 321 'title'=> $row['title'],
323 - 'size'=>(int)$row['size'], 322 + 'document_type'=> $row['document_type'],
  323 + 'version'=> (float) ($row['major_version'] . '.' . $row['minor_version']),
  324 + 'filesize'=>(int)$row['size'],
324 'workflow'=>empty($row['workflow'])?'n/a':$row['workflow'], 325 'workflow'=>empty($row['workflow'])?'n/a':$row['workflow'],
325 'workflow_state'=>empty($row['workflow_state'])?'n/a':$row['workflow_state'], 326 'workflow_state'=>empty($row['workflow_state'])?'n/a':$row['workflow_state'],
326 'link_type'=>empty($row['link_type'])?'unknown':$row['link_type'], 327 'link_type'=>empty($row['link_type'])?'unknown':$row['link_type'],
@@ -432,7 +433,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -432,7 +433,7 @@ class KTAPI_Document extends KTAPI_FolderItem
432 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res ); 433 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR,$res );
433 } 434 }
434 435
435 - $oDocumentTransaction = & new DocumentTransaction($this->document, $reason, 'ktcore.transactions.permissions_change'); 436 + $oDocumentTransaction = new DocumentTransaction($this->document, $reason, 'ktcore.transactions.permissions_change');
436 437
437 $res = $oDocumentTransaction->create(); 438 $res = $oDocumentTransaction->create();
438 if (($res === false) || PEAR::isError($res)) { 439 if (($res === false) || PEAR::isError($res)) {
@@ -776,7 +777,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -776,7 +777,7 @@ class KTAPI_Document extends KTAPI_FolderItem
776 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res); 777 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res);
777 } 778 }
778 779
779 - $oDocumentTransaction = & new DocumentTransaction($this->document, sprintf(_kt('Document archived: %s'), $reason), 'ktcore.transactions.update'); 780 + $oDocumentTransaction = new DocumentTransaction($this->document, sprintf(_kt('Document archived: %s'), $reason), 'ktcore.transactions.update');
780 $oDocumentTransaction->create(); 781 $oDocumentTransaction->create();
781 782
782 DBUtil::commit(); 783 DBUtil::commit();
@@ -1339,7 +1340,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1339,7 +1340,7 @@ class KTAPI_Document extends KTAPI_FolderItem
1339 $workflowid=$this->document->getWorkflowId(); 1340 $workflowid=$this->document->getWorkflowId();
1340 if (empty($workflowid)) 1341 if (empty($workflowid))
1341 { 1342 {
1342 - return new PEAR_Error(KTAPI_ERROR_WORKFLOW_NOT_IN_PROGRESS); 1343 + return array();
1343 } 1344 }
1344 1345
1345 $result = array(); 1346 $result = array();
@@ -1402,126 +1403,169 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1402,126 +1403,169 @@ class KTAPI_Document extends KTAPI_FolderItem
1402 // make sure we ge tthe latest 1403 // make sure we ge tthe latest
1403 $this->clearCache(); 1404 $this->clearCache();
1404 1405
  1406 + $config = KTConfig::getSingleton();
  1407 + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
  1408 +
1405 $detail = array(); 1409 $detail = array();
1406 $document = $this->document; 1410 $document = $this->document;
1407 1411
  1412 + // get the document id
  1413 + $detail['document_id'] = (int) $document->getId();
  1414 +
  1415 + $detail['custom_document_no'] = 'n/a';
  1416 + $detail['oem_document_no'] = 'n/a';
  1417 +
  1418 + // get the title
1408 $detail['title'] = $document->getName(); 1419 $detail['title'] = $document->getName();
1409 1420
  1421 + // get the document type
1410 $documenttypeid=$document->getDocumentTypeID(); 1422 $documenttypeid=$document->getDocumentTypeID();
  1423 + $documenttype = '* unknown *';
1411 if (is_numeric($documenttypeid)) 1424 if (is_numeric($documenttypeid))
1412 { 1425 {
1413 - $documenttype = DocumentType::get($documenttypeid); 1426 + $dt = DocumentType::get($documenttypeid);
1414 1427
1415 - $documenttype=$documenttype->getName();  
1416 - }  
1417 - else  
1418 - {  
1419 - $documenttype = '* unknown *'; 1428 + if (!is_null($dt) && !PEAR::isError($dt))
  1429 + {
  1430 + $documenttype=$dt->getName();
  1431 + }
1420 } 1432 }
1421 $detail['document_type'] = $documenttype; 1433 $detail['document_type'] = $documenttype;
1422 1434
1423 - $detail['version'] = $document->getVersion(); 1435 + // get the filename
1424 $detail['filename'] = $document->getFilename(); 1436 $detail['filename'] = $document->getFilename();
1425 1437
1426 - $detail['created_date'] = $document->getCreatedDateTime(); 1438 + // get the filesize
  1439 + $detail['filesize'] = (int) $document->getFileSize();
  1440 +
  1441 + // get the folder id
  1442 + $detail['folder_id'] = (int) $document->getFolderID();
1427 1443
  1444 + // get the creator
1428 $userid = $document->getCreatorID(); 1445 $userid = $document->getCreatorID();
  1446 + $username='n/a';
1429 if (is_numeric($userid)) 1447 if (is_numeric($userid))
1430 { 1448 {
  1449 + $username = '* unknown *';
1431 $user = User::get($userid); 1450 $user = User::get($userid);
1432 - $username=(is_null($user) || PEAR::isError($user))?'* unknown *':$user->getName();  
1433 - }  
1434 - else  
1435 - {  
1436 - $username='n/a'; 1451 + if (!is_null($user) && !PEAR::isError($user))
  1452 + {
  1453 + $username = $user->getName();
  1454 + }
1437 } 1455 }
1438 $detail['created_by'] = $username; 1456 $detail['created_by'] = $username;
1439 - $detail['updated_date'] = $document->getLastModifiedDate();  
1440 - $detail['modified_date'] = $document->getLastModifiedDate();  
1441 1457
1442 - $userid = $document->getModifiedUserId(); 1458 + // get the creation date
  1459 + $detail['created_date'] = $document->getCreatedDateTime();
  1460 +
  1461 + // get the checked out user
  1462 + $userid = $document->getCheckedOutUserID();
  1463 + $username='n/a';
1443 if (is_numeric($userid)) 1464 if (is_numeric($userid))
1444 { 1465 {
  1466 + $username = '* unknown *';
1445 $user = User::get($userid); 1467 $user = User::get($userid);
1446 - $username=(is_null($user) || PEAR::isError($user))?'* unknown *':$user->getName();  
1447 - }  
1448 - else  
1449 - {  
1450 - $username='n/a';  
1451 - }  
1452 - $detail['modified_by'] = $username;  
1453 - $detail['updated_by'] = $username;  
1454 - $detail['document_id'] = (int) $document->getId();  
1455 - $detail['folder_id'] = (int) $document->getFolderID();  
1456 -  
1457 - $workflowid = $document->getWorkflowId();  
1458 - if (is_numeric($workflowid))  
1459 - {  
1460 - $workflow = KTWorkflow::get($workflowid);  
1461 - $workflowname=(is_null($workflow) || PEAR::isError($workflow))?'* unknown *':$workflow->getName();  
1462 - }  
1463 - else  
1464 - {  
1465 - $workflowname='n/a'; 1468 + if (!is_null($user) && !PEAR::isError($user))
  1469 + {
  1470 + $username = $user->getName();
  1471 + }
1466 } 1472 }
1467 - $detail['workflow'] = $workflowname; 1473 + $detail['checked_out_by'] = $username;
1468 1474
1469 - $stateid = $document->getWorkflowStateId();  
1470 - if (is_numeric($stateid)) 1475 + // get the checked out date
  1476 + list($major, $minor, $fix) = explode('.', $default->systemVersion);
  1477 + if ($major == 3 && $minor >= 5)
1471 { 1478 {
1472 - $state = KTWorkflowState::get($stateid);  
1473 - $workflowstate=(is_null($state) || PEAR::isError($state))?'* unknown *':$state->getName(); 1479 + $detail['checked_out_date'] = $document->getCheckedOutDate();
1474 } 1480 }
1475 else 1481 else
1476 { 1482 {
1477 - $workflowstate = 'n/a'; 1483 + $detail['checked_out_date'] = $detail['modified_date'];
1478 } 1484 }
1479 - $detail['workflow_state']=$workflowstate;  
1480 -  
1481 - $userid = $document->getOwnerID(); 1485 + if (is_null($detail['checked_out_date'])) $detail['checked_out_date'] = 'n/a';
1482 1486
  1487 + // get the modified user
  1488 + $userid = $document->getModifiedUserId();
  1489 + $username='n/a';
1483 if (is_numeric($userid)) 1490 if (is_numeric($userid))
1484 { 1491 {
  1492 + $username = '* unknown *';
1485 $user = User::get($userid); 1493 $user = User::get($userid);
1486 - $username=(is_null($user) || PEAR::isError($user))?'* unknown *':$user->getName();  
1487 - }  
1488 - else  
1489 - {  
1490 - $username = 'n/a'; 1494 + if (!is_null($user) && !PEAR::isError($user))
  1495 + {
  1496 + $username = $user->getName();
  1497 + }
1491 } 1498 }
1492 - $detail['owner'] = $username;  
1493 -  
1494 - $detail['is_immutable'] = (bool) $document->getImmutable();  
1495 - 1499 + $detail['modified_by'] = $detail['updated_by'] = $username;
1496 1500
1497 - $userid = $document->getCheckedOutUserID(); 1501 + // get the modified date
  1502 + $detail['updated_date'] = $detail['modified_date'] = $document->getLastModifiedDate();
1498 1503
  1504 + // get the owner
  1505 + $userid = $document->getOwnerID();
  1506 + $username='n/a';
1499 if (is_numeric($userid)) 1507 if (is_numeric($userid))
1500 { 1508 {
  1509 + $username = '* unknown *';
1501 $user = User::get($userid); 1510 $user = User::get($userid);
1502 - $username=(is_null($user) || PEAR::isError($user))?'* unknown *':$user->getName(); 1511 + if (!is_null($user) && !PEAR::isError($user))
  1512 + {
  1513 + $username = $user->getName();
  1514 + }
1503 } 1515 }
1504 - else 1516 + $detail['owned_by'] = $username;
  1517 +
  1518 + // get the version
  1519 + $detail['version'] = $document->getVersion();
  1520 + if ($wsversion >= 2)
1505 { 1521 {
1506 - $username = 'n/a'; 1522 + $detail['version'] = (float) $detail['version'];
1507 } 1523 }
1508 - $detail['checked_out_by'] = $username;  
1509 1524
1510 - list($major, $minor, $fix) = explode('.', $default->systemVersion); 1525 + // check immutability
  1526 + $detail['is_immutable'] = (bool) $document->getImmutable();
1511 1527
  1528 + // check permissions
  1529 + $detail['permissions'] = 'n/a';
1512 1530
1513 - if ($major == 3 && $minor >= 5) 1531 + // get workflow name
  1532 + $workflowid = $document->getWorkflowId();
  1533 + $workflowname='n/a';
  1534 + if (is_numeric($workflowid))
1514 { 1535 {
1515 - $detail['checked_out_date'] = $document->getCheckedOutDate(); 1536 + $workflow = KTWorkflow::get($workflowid);
  1537 + if (!is_null($workflow) && !PEAR::isError($workflow))
  1538 + {
  1539 + $workflowname = $workflow->getName();
  1540 + }
1516 } 1541 }
1517 - else 1542 + $detail['workflow'] = $workflowname;
  1543 +
  1544 + // get the workflow state
  1545 + $stateid = $document->getWorkflowStateId();
  1546 + $workflowstate = 'n/a';
  1547 + if (is_numeric($stateid))
1518 { 1548 {
1519 - $detail['checked_out_date'] = $detail['modified_date']; 1549 + $state = KTWorkflowState::get($stateid);
  1550 + if (!is_null($state) && !PEAR::isError($state))
  1551 + {
  1552 + $workflowstate = $state->getName();
  1553 + }
1520 } 1554 }
1521 - if (is_null($detail['checked_out_date'])) $detail['checked_out_date'] = 'n/a'; 1555 + $detail['workflow_state']=$workflowstate;
1522 1556
  1557 + // get the full path
1523 $detail['full_path'] = $this->ktapi_folder->get_full_path() . '/' . $this->get_title(); 1558 $detail['full_path'] = $this->ktapi_folder->get_full_path() . '/' . $this->get_title();
1524 1559
  1560 + // get mime info
  1561 + $mimetypeid = $document->getMimeTypeID();
  1562 + $detail['mime_type'] =KTMime::getMimeTypeName($mimetypeid);
  1563 + $detail['mime_icon_path'] =KTMime::getIconPath($mimetypeid);
  1564 + $detail['mime_display'] =KTMime::getFriendlyNameForString($detail['mime_type']);
  1565 +
  1566 + // get the storage path
  1567 + $detail['storage_path'] = $document->getStoragePath();
  1568 +
1525 return $detail; 1569 return $detail;
1526 } 1570 }
1527 1571
@@ -1541,7 +1585,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1541,7 +1585,7 @@ class KTAPI_Document extends KTAPI_FolderItem
1541 $options = array(); 1585 $options = array();
1542 1586
1543 1587
1544 - $oDocumentTransaction = & new DocumentTransaction($this->document, 'Document downloaded', 'ktcore.transactions.download', $aOptions); 1588 + $oDocumentTransaction = new DocumentTransaction($this->document, 'Document downloaded', 'ktcore.transactions.download', $aOptions);
1545 $oDocumentTransaction->create(); 1589 $oDocumentTransaction->create();
1546 } 1590 }
1547 1591
@@ -1564,6 +1608,13 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1564,6 +1608,13 @@ class KTAPI_Document extends KTAPI_FolderItem
1564 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $transactions ); 1608 return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $transactions );
1565 } 1609 }
1566 1610
  1611 + $config = KTConfig::getSingleton();
  1612 + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
  1613 + foreach($transactions as $key=>$transaction)
  1614 + {
  1615 + $transactions[$key]['version'] = (float) $transaction['version'];
  1616 + }
  1617 +
1567 return $transactions; 1618 return $transactions;
1568 } 1619 }
1569 1620
@@ -1576,6 +1627,9 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1576,6 +1627,9 @@ class KTAPI_Document extends KTAPI_FolderItem
1576 { 1627 {
1577 $metadata_versions = KTDocumentMetadataVersion::getByDocument($this->document); 1628 $metadata_versions = KTDocumentMetadataVersion::getByDocument($this->document);
1578 1629
  1630 + $config = KTConfig::getSingleton();
  1631 + $wsversion = $config->get('webservice/version', LATEST_WEBSERVICE_VERSION);
  1632 +
1579 $versions = array(); 1633 $versions = array();
1580 foreach ($metadata_versions as $version) 1634 foreach ($metadata_versions as $version)
1581 { 1635 {
@@ -1585,18 +1639,20 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1585,18 +1639,20 @@ class KTAPI_Document extends KTAPI_FolderItem
1585 1639
1586 $userid = $document->getModifiedUserId(); 1640 $userid = $document->getModifiedUserId();
1587 $user = User::get($userid); 1641 $user = User::get($userid);
1588 - if (PEAR::isError($user))  
1589 - {  
1590 - $username = $user->getName();  
1591 - }  
1592 - else 1642 + $username = 'Unknown';
  1643 + if (!PEAR::isError($user))
1593 { 1644 {
1594 - $username = 'Unknown'; 1645 + $username = is_null($user)?'n/a':$user->getName();
1595 } 1646 }
1596 1647
1597 $version['user'] = $username; 1648 $version['user'] = $username;
1598 $version['metadata_version'] = $document->getMetadataVersion(); 1649 $version['metadata_version'] = $document->getMetadataVersion();
1599 $version['content_version'] = $document->getVersion(); 1650 $version['content_version'] = $document->getVersion();
  1651 + if ($wsversion >= 2)
  1652 + {
  1653 + $version['metadata_version'] = (int) $version['metadata_version'];
  1654 + $version['content_version'] = (float) $version['content_version'];
  1655 + }
1600 1656
1601 $versions[] = $version; 1657 $versions[] = $version;
1602 } 1658 }
@@ -1616,7 +1672,7 @@ class KTAPI_Document extends KTAPI_FolderItem @@ -1616,7 +1672,7 @@ class KTAPI_Document extends KTAPI_FolderItem
1616 } 1672 }
1617 DBUtil::startTransaction(); 1673 DBUtil::startTransaction();
1618 1674
1619 - $transaction = & new DocumentTransaction($this->document, "Document expunged", 'ktcore.transactions.expunge'); 1675 + $transaction = new DocumentTransaction($this->document, "Document expunged", 'ktcore.transactions.expunge');
1620 1676
1621 $transaction->create(); 1677 $transaction->create();
1622 1678
ktapi/KTAPIFolder.inc.php
@@ -35,6 +35,8 @@ @@ -35,6 +35,8 @@
35 * 35 *
36 */ 36 */
37 37
  38 +require_once(KT_DIR . '/ktwebservice/KTUploadManager.inc.php');
  39 +
38 class KTAPI_Folder extends KTAPI_FolderItem 40 class KTAPI_Folder extends KTAPI_FolderItem
39 { 41 {
40 /** 42 /**
@@ -197,6 +199,7 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -197,6 +199,7 @@ class KTAPI_Folder extends KTAPI_FolderItem
197 function get_full_path() 199 function get_full_path()
198 { 200 {
199 $path = $this->folder->getFullPath() . '/' . $this->folder->getName(); 201 $path = $this->folder->getFullPath() . '/' . $this->folder->getName();
  202 + if (substr($path,0,1) == '/') $path = substr($path,1);
200 203
201 return $path; 204 return $path;
202 } 205 }
@@ -350,7 +353,11 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -350,7 +353,11 @@ class KTAPI_Folder extends KTAPI_FolderItem
350 'id' => (int) $folder->getId(), 353 'id' => (int) $folder->getId(),
351 'item_type' => 'F', 354 'item_type' => 'F',
352 355
  356 + 'custom_document_no'=>'n/a',
  357 + 'oem_document_no'=>'n/a',
  358 +
353 'title' => $folder->getName(), 359 'title' => $folder->getName(),
  360 + 'document_type' => 'n/a',
354 'filename' => $folder->getName(), 361 'filename' => $folder->getName(),
355 'filesize' => 'n/a', 362 'filesize' => 'n/a',
356 363
@@ -367,7 +374,7 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -367,7 +374,7 @@ class KTAPI_Folder extends KTAPI_FolderItem
367 374
368 'version' => 'n/a', 375 'version' => 'n/a',
369 376
370 - 'immutable'=> 'n/a', 377 + 'is_immutable'=> 'n/a',
371 'permissions' => 'n/a', 378 'permissions' => 'n/a',
372 379
373 'workflow'=>'n/a', 380 'workflow'=>'n/a',
@@ -469,11 +476,19 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -469,11 +476,19 @@ class KTAPI_Folder extends KTAPI_FolderItem
469 476
470 if ($wsversion >= 2) 477 if ($wsversion >= 2)
471 { 478 {
  479 + $docTypeId = $document->getDocumentTypeID();
  480 + $documentType = DocumentType::get($docTypeId);
  481 +
  482 +
472 $contents[] = array( 483 $contents[] = array(
473 'id' => (int) $document->getId(), 484 'id' => (int) $document->getId(),
474 'item_type' => 'D', 485 'item_type' => 'D',
475 486
  487 + 'custom_document_no'=>'n/a',
  488 + 'oem_document_no'=>'n/a',
  489 +
476 'title' => $document->getName(), 490 'title' => $document->getName(),
  491 + 'document_type'=>$documentType->getName(),
477 'filename' => $document->getFileName(), 492 'filename' => $document->getFileName(),
478 'filesize' => $document->getFileSize(), 493 'filesize' => $document->getFileSize(),
479 494
@@ -490,7 +505,7 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -490,7 +505,7 @@ class KTAPI_Folder extends KTAPI_FolderItem
490 505
491 'version' => $document->getMajorVersionNumber() . '.' . $document->getMinorVersionNumber(), 506 'version' => $document->getMajorVersionNumber() . '.' . $document->getMinorVersionNumber(),
492 507
493 - 'immutable'=> $document->getImmutable()?'true':'false', 508 + 'is_immutable'=> $document->getImmutable()?'true':'false',
494 'permissions' => 'n/a', 509 'permissions' => 'n/a',
495 510
496 'workflow'=> $workflow, 511 'workflow'=> $workflow,
@@ -590,13 +605,7 @@ class KTAPI_Folder extends KTAPI_FolderItem @@ -590,13 +605,7 @@ class KTAPI_Folder extends KTAPI_FolderItem
590 } 605 }
591 DBUtil::commit(); 606 DBUtil::commit();
592 607
593 - $tempfilename=addslashes($tempfilename);  
594 - $sql = "DELETE FROM uploaded_files WHERE tempfilename='$tempfilename'";  
595 - $result = DBUtil::runQuery($sql);  
596 - if (PEAR::isError($result))  
597 - {  
598 - return $result;  
599 - } 608 + KTUploadManager::temporary_file_imported($tempfilename);
600 609
601 return new KTAPI_Document($this->ktapi, $this, $document); 610 return new KTAPI_Document($this->ktapi, $this, $document);
602 } 611 }
ktapi/KTAPISession.inc.php
@@ -54,7 +54,7 @@ class KTAPI_Session @@ -54,7 +54,7 @@ class KTAPI_Session
54 54
55 $this->ktapi=&$ktapi; 55 $this->ktapi=&$ktapi;
56 $this->user=&$user; 56 $this->user=&$user;
57 - $this->origUserId = $_SESSION['userID']; 57 + $this->origUserId = isset($_SESSION['userID'])?$_SESSION['userID']:null;
58 $_SESSION['userID']=$user->getId(); 58 $_SESSION['userID']=$user->getId();
59 $this->active = false; 59 $this->active = false;
60 } 60 }
ktwebdav/lib/KTWebDAVServer.inc.php
@@ -42,7 +42,7 @@ require_once &#39;Log.php&#39;; // thirdparty PEAR @@ -42,7 +42,7 @@ require_once &#39;Log.php&#39;; // thirdparty PEAR
42 42
43 $userAgentValue = $_SERVER['HTTP_USER_AGENT']; 43 $userAgentValue = $_SERVER['HTTP_USER_AGENT'];
44 if (stristr($userAgentValue, "Microsoft Data Access Internet Publishing Provider DAV")) { 44 if (stristr($userAgentValue, "Microsoft Data Access Internet Publishing Provider DAV")) {
45 - // Fix for Novell Netdrive 45 + // Fix for Novell Netdrive
46 chdir(realpath(dirname(__FILE__))); 46 chdir(realpath(dirname(__FILE__)));
47 require_once '../../config/dmsDefaults.php'; // This is our plug into KT. 47 require_once '../../config/dmsDefaults.php'; // This is our plug into KT.
48 }else{ 48 }else{
@@ -1217,7 +1217,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server @@ -1217,7 +1217,7 @@ class KTWebDAVServer extends HTTP_WebDAV_Server
1217 $sQuery .= "ON D.metadata_version_id = DM.id "; 1217 $sQuery .= "ON D.metadata_version_id = DM.id ";
1218 $sQuery .= "LEFT JOIN document_content_version AS DC "; 1218 $sQuery .= "LEFT JOIN document_content_version AS DC ";
1219 $sQuery .= "ON DM.content_version_id = DC.id "; 1219 $sQuery .= "ON DM.content_version_id = DC.id ";
1220 - $sQuery .= "WHERE D.folder_id = ? AND DC.filename = ?"; 1220 + $sQuery .= "WHERE D.folder_id = ? AND DC.filename = ? AND D.status_id=1";
1221 1221
1222 $aParams = array($iFolderID, $sFileName); 1222 $aParams = array($iFolderID, $sFileName);
1223 $iDocumentID = DBUtil::getOneResultKey(array($sQuery, $aParams), 'id'); 1223 $iDocumentID = DBUtil::getOneResultKey(array($sQuery, $aParams), 'id');
ktwebservice/KTDownloadManager.inc.php
@@ -2,39 +2,39 @@ @@ -2,39 +2,39 @@
2 2
3 /** 3 /**
4 * 4 *
5 - * $Id:$ 5 + * $Id$
6 * 6 *
7 * KTDownloadManager manages files in the download_files table. 7 * KTDownloadManager manages files in the download_files table.
8 * 8 *
9 * KnowledgeTree Open Source Edition 9 * KnowledgeTree Open Source Edition
10 * Document Management Made Simple 10 * Document Management Made Simple
11 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 11 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
12 - * 12 + *
13 * This program is free software; you can redistribute it and/or modify it under 13 * This program is free software; you can redistribute it and/or modify it under
14 * the terms of the GNU General Public License version 3 as published by the 14 * the terms of the GNU General Public License version 3 as published by the
15 * Free Software Foundation. 15 * Free Software Foundation.
16 - * 16 + *
17 * This program is distributed in the hope that it will be useful, but WITHOUT 17 * This program is distributed in the hope that it will be useful, but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 19 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
20 * details. 20 * details.
21 - * 21 + *
22 * You should have received a copy of the GNU General Public License 22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <http://www.gnu.org/licenses/>. 23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 - * 24 + *
25 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 25 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
26 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 26 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
27 - * 27 + *
28 * The interactive user interfaces in modified source and object code versions 28 * The interactive user interfaces in modified source and object code versions
29 * of this program must display Appropriate Legal Notices, as required under 29 * of this program must display Appropriate Legal Notices, as required under
30 * Section 5 of the GNU General Public License version 3. 30 * Section 5 of the GNU General Public License version 3.
31 - * 31 + *
32 * In accordance with Section 7(b) of the GNU General Public License version 3, 32 * In accordance with Section 7(b) of the GNU General Public License version 3,
33 * these Appropriate Legal Notices must retain the display of the "Powered by 33 * these Appropriate Legal Notices must retain the display of the "Powered by
34 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 34 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
35 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 35 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
36 - * must display the words "Powered by KnowledgeTree" and retain the original  
37 - * copyright notice. 36 + * must display the words "Powered by KnowledgeTree" and retain the original
  37 + * copyright notice.
38 * Contributor( s): ______________________________________ 38 * Contributor( s): ______________________________________
39 * 39 *
40 */ 40 */
@@ -57,7 +57,10 @@ class KTDownloadManager @@ -57,7 +57,10 @@ class KTDownloadManager
57 $config = &KTConfig::getSingleton(); 57 $config = &KTConfig::getSingleton();
58 58
59 $this->age = $config->get('webservice/downloadExpiry',5); 59 $this->age = $config->get('webservice/downloadExpiry',5);
60 - $this->download_url = $config->get('webservice/downloadUrl'); 60 +
  61 + $protocol = $config->get('KnowledgeTree/sslEnabled')?'https':'http';
  62 +
  63 + $this->download_url = $protocol . '://' . $_SERVER['HTTP_HOST'] . $config->get('webservice/downloadUrl');
61 $this->random=$config->get('webservice/randomKeyText','jhsdf8q1jkjpoiudfs7sd3ds1'); 64 $this->random=$config->get('webservice/randomKeyText','jhsdf8q1jkjpoiudfs7sd3ds1');
62 } 65 }
63 66
ktwebservice/KTUploadManager.inc.php
@@ -52,7 +52,8 @@ class KTUploadManager @@ -52,7 +52,8 @@ class KTUploadManager
52 $config = KTConfig::getSingleton(); 52 $config = KTConfig::getSingleton();
53 53
54 $this->age = $config->get('webservice/uploadExpiry',60); 54 $this->age = $config->get('webservice/uploadExpiry',60);
55 - $this->temp_dir= $config->get('webservice/uploadDirectory'); 55 + $this->temp_dir = $config->get('webservice/uploadDirectory');
  56 + $this->temp_dir = str_replace('\\','/', $this->temp_dir);
56 } 57 }
57 58
58 /** 59 /**
@@ -63,10 +64,48 @@ class KTUploadManager @@ -63,10 +64,48 @@ class KTUploadManager
63 function set_session($session) 64 function set_session($session)
64 { 65 {
65 $user = &$session->get_user(); 66 $user = &$session->get_user();
66 - $this->userid=$user->getId(); 67 + $this->userid=$_SESSION['userID'];
67 $this->session = $session->get_session(); 68 $this->session = $session->get_session();
68 } 69 }
69 70
  71 + function get_temp_filename($prefix)
  72 + {
  73 + $tempfilename = tempnam($this->temp_dir,$prefix);
  74 +
  75 + return $tempfilename;
  76 + }
  77 +
  78 + function is_valid_temporary_file($tempfilename)
  79 + {
  80 + $tempdir = substr($tempfilename,0,strlen($this->temp_dir));
  81 + $tempdir = str_replace('\\','/', $tempdir);
  82 + return ($tempdir == $this->temp_dir);
  83 + }
  84 +
  85 + function store_base64_file($base64, $prefix= 'sa_')
  86 + {
  87 + $tempfilename = $this->get_temp_filename($prefix);
  88 + if (!is_writable($tempfilename))
  89 + {
  90 + return new PEAR_Error("Cannot write to file: $tempfilename");
  91 + }
  92 +
  93 + if (!$this->is_valid_temporary_file($tempfilename))
  94 + {
  95 + return new PEAR_Error("Invalid temporary file: $tempfilename. There is a problem with the temporary storage path: $this->temp_dir.");
  96 + }
  97 +
  98 + $fp=fopen($tempfilename, 'wb');
  99 + if ($fp === false)
  100 + {
  101 + return new PEAR_Error("Cannot write content to temporary file: $tempfilename.");
  102 + }
  103 + fwrite($fp, base64_decode($base64));
  104 + fclose($fp);
  105 +
  106 + return $tempfilename;
  107 + }
  108 +
70 /** 109 /**
71 * This tells the manager to manage a file that has been uploaded. 110 * This tells the manager to manage a file that has been uploaded.
72 * 111 *
@@ -80,8 +119,9 @@ class KTUploadManager @@ -80,8 +119,9 @@ class KTUploadManager
80 $now=date('Y-m-d H:i:s'); 119 $now=date('Y-m-d H:i:s');
81 $now_str=date('YmdHis'); 120 $now_str=date('YmdHis');
82 121
83 - $newtempfile = realpath($this->temp_dir) . '/' . $this->userid . '-'. $now_str;  
84 - if (DIRECTORY_SEPARATOR == '\\') { 122 + $newtempfile = realpath($this->temp_dir) . '/' . $_SESSION['userID'] . '-'. $now_str;
  123 + if (OS_WINDOWS)
  124 + {
85 $tempfile = str_replace('/','\\',$tempfile); 125 $tempfile = str_replace('/','\\',$tempfile);
86 $newtempfile = str_replace('\\','/',$newtempfile); 126 $newtempfile = str_replace('\\','/',$newtempfile);
87 } 127 }
@@ -105,12 +145,19 @@ class KTUploadManager @@ -105,12 +145,19 @@ class KTUploadManager
105 return $id; 145 return $id;
106 } 146 }
107 global $php_errormsg; 147 global $php_errormsg;
108 - $result = @move_uploaded_file($tempfile, $newtempfile); 148 + if (is_uploaded_file($tempfile))
  149 + {
  150 + $result = @move_uploaded_file($tempfile, $newtempfile);
  151 + }
  152 + else
  153 + {
  154 + $result = @rename($tempfile, $newtempfile);
  155 + }
  156 +
109 $tmp = $php_errormsg; 157 $tmp = $php_errormsg;
110 158
111 if ($result == false) 159 if ($result == false)
112 { 160 {
113 -  
114 DBUtil::rollback(); 161 DBUtil::rollback();
115 return new PEAR_Error($tmp); 162 return new PEAR_Error($tmp);
116 } 163 }
@@ -136,11 +183,10 @@ class KTUploadManager @@ -136,11 +183,10 @@ class KTUploadManager
136 return $result; 183 return $result;
137 } 184 }
138 185
139 - function imported_file($action, $filename, $documentid) 186 + function temporary_file_imported($tempfilename)
140 { 187 {
141 - DBUtil::startTransaction();  
142 - $filename=basename($filename);  
143 - $sql = "DELETE FROM uploaded_files WHERE action='$action' AND filename='$filename'"; 188 + $tempfilename = addslashes(str_replace('\\','/',$tempfilename));
  189 + $sql = "DELETE FROM uploaded_files WHERE tempfilename='$tempfilename'";
144 $rs = DBUtil::runQuery($sql); 190 $rs = DBUtil::runQuery($sql);
145 if (PEAR::isError($rs)) 191 if (PEAR::isError($rs))
146 { 192 {
@@ -148,15 +194,7 @@ class KTUploadManager @@ -148,15 +194,7 @@ class KTUploadManager
148 return false; 194 return false;
149 } 195 }
150 196
151 - $sql = "INSERT INTO index_files(document_id, user_id) VALUES($documentid, $this->userid)";  
152 - DBUtil::runQuery($sql);  
153 - if (PEAR::isError($rs))  
154 - {  
155 - DBUtil::rollback();  
156 - return false;  
157 - }  
158 197
159 - DBUtil::commit();  
160 return true; 198 return true;
161 } 199 }
162 200
ktwebservice/nunit/README
@@ -11,6 +11,30 @@ The unit tests were written for NUnit. NUnit 2.2.0 was used during development. @@ -11,6 +11,30 @@ The unit tests were written for NUnit. NUnit 2.2.0 was used during development.
11 11
12 This framework was developed in Linux using Mono. 12 This framework was developed in Linux using Mono.
13 13
  14 +DATABASE
  15 +--------
  16 +
  17 +Review helper.cs to see the configuration settings. UnixODBC is used. Sample config files:
  18 +
  19 + # odbc.ini
  20 +
  21 +[ktdms]
  22 +Driver = myodbcdriver
  23 +Description = MySQL ODBC 2.50 Driver DSN
  24 +SERVER = localhost
  25 +PORT =
  26 +Socket = /tmp/mysql.sock
  27 +USER = root
  28 +Password =
  29 +Database = ktdms
  30 +OPTION = 3
  31 +
  32 + # odbcinst.ini
  33 +[myodbcdriver]
  34 +Description = MySQL ODBC 2.50 Driver DSN
  35 +Driver = /usr/lib64/unixODBC/libmyodbc3.so
  36 +
  37 +
14 The document type 'NewType' must be added to the database for the document_type.cs unit test to run. 38 The document type 'NewType' must be added to the database for the document_type.cs unit test to run.
15 39
16 40
@@ -37,3 +61,4 @@ For more information: @@ -37,3 +61,4 @@ For more information:
37 61
38 http://nunit.org/ 62 http://nunit.org/
39 http://www.mono-project.com/ 63 http://www.mono-project.com/
  64 +http://www.unixodbc.org
ktwebservice/nunit/document_add.cs
@@ -8,20 +8,20 @@ namespace MonoTests.KnowledgeTree @@ -8,20 +8,20 @@ namespace MonoTests.KnowledgeTree
8 public class AddDocumentTest : KTTest 8 public class AddDocumentTest : KTTest
9 { 9 {
10 10
11 - 11 +
12 private int _docId; 12 private int _docId;
13 private int _folderId; 13 private int _folderId;
14 private String _filename; 14 private String _filename;
15 - private String _content; 15 + private String _content;
16 16
17 public AddDocumentTest() : base() 17 public AddDocumentTest() : base()
18 - { 18 + {
19 this._folderId = 1; 19 this._folderId = 1;
20 - } 20 + }
21 21
22 [SetUp] 22 [SetUp]
23 public void SetUp() 23 public void SetUp()
24 - { 24 + {
25 this._filename = Helper.isUnix()?"/tmp/kt_unit_test1.txt":"c:\\kt_unit_test1.txt"; 25 this._filename = Helper.isUnix()?"/tmp/kt_unit_test1.txt":"c:\\kt_unit_test1.txt";
26 this._content = "hello world!"; 26 this._content = "hello world!";
27 27
@@ -29,10 +29,10 @@ namespace MonoTests.KnowledgeTree @@ -29,10 +29,10 @@ namespace MonoTests.KnowledgeTree
29 29
30 [TearDown] 30 [TearDown]
31 public void TearDown() 31 public void TearDown()
32 - {  
33 - Helper.deleteFile(this._filename);  
34 - }  
35 - 32 + {
  33 + Helper.deleteFile(this._filename);
  34 + }
  35 +
36 [Test] 36 [Test]
37 public void FindDocumentBeforeAdd() 37 public void FindDocumentBeforeAdd()
38 { 38 {
@@ -49,7 +49,7 @@ namespace MonoTests.KnowledgeTree @@ -49,7 +49,7 @@ namespace MonoTests.KnowledgeTree
49 { 49 {
50 System.Console.WriteLine("document not found. that is ok!"); 50 System.Console.WriteLine("document not found. that is ok!");
51 } 51 }
52 - } 52 + }
53 53
54 [Test] 54 [Test]
55 public void FindFolderBeforeAdd() 55 public void FindFolderBeforeAdd()
@@ -67,7 +67,7 @@ namespace MonoTests.KnowledgeTree @@ -67,7 +67,7 @@ namespace MonoTests.KnowledgeTree
67 { 67 {
68 if (this._verbose) System.Console.WriteLine("folder not found. that is ok!"); 68 if (this._verbose) System.Console.WriteLine("folder not found. that is ok!");
69 } 69 }
70 - } 70 + }
71 71
72 [Test] 72 [Test]
73 public void AddDocument() 73 public void AddDocument()
@@ -89,7 +89,7 @@ namespace MonoTests.KnowledgeTree @@ -89,7 +89,7 @@ namespace MonoTests.KnowledgeTree
89 Assert.AreEqual(0, response1.status_code); 89 Assert.AreEqual(0, response1.status_code);
90 Assert.AreEqual("kt unit test1", response1.title); 90 Assert.AreEqual("kt unit test1", response1.title);
91 Assert.AreEqual("Default", response1.document_type); 91 Assert.AreEqual("Default", response1.document_type);
92 - Assert.AreEqual("0.1", response1.version); 92 + Assert.AreEqual(0.1, response1.version);
93 Assert.AreEqual("kt_unit_test1.txt", response1.filename); 93 Assert.AreEqual("kt_unit_test1.txt", response1.filename);
94 94
95 Assert.IsFalse(response1.created_date == null); 95 Assert.IsFalse(response1.created_date == null);
@@ -172,7 +172,7 @@ namespace MonoTests.KnowledgeTree @@ -172,7 +172,7 @@ namespace MonoTests.KnowledgeTree
172 Assert.AreEqual(0, response1.status_code); 172 Assert.AreEqual(0, response1.status_code);
173 Assert.AreEqual(filename, response1.title); 173 Assert.AreEqual(filename, response1.title);
174 Assert.AreEqual("Default", response1.document_type); 174 Assert.AreEqual("Default", response1.document_type);
175 - Assert.AreEqual("0.1", response1.version); 175 + Assert.AreEqual(0.1, response1.version);
176 Assert.AreEqual("kt_unit_test1.txt", response1.filename); 176 Assert.AreEqual("kt_unit_test1.txt", response1.filename);
177 177
178 Assert.IsFalse(response1.created_date == null); 178 Assert.IsFalse(response1.created_date == null);
ktwebservice/nunit/document_contents.cs 0 โ†’ 100644
  1 +using NUnit.Framework;
  2 +using System;
  3 +using System.IO;
  4 +
  5 +namespace MonoTests.KnowledgeTree
  6 +{
  7 + [TestFixture]
  8 + public class DocumentContentsTest : KTTest
  9 + {
  10 + private int _folderId;
  11 + private Document _doc1;
  12 +
  13 +
  14 + [SetUp]
  15 + public void SetUp()
  16 + {
  17 +
  18 + this._doc1 = new Document(1, this._session, this._kt, this._verbose,false);
  19 + this._doc1.createFile(1);
  20 +
  21 + kt_folder_detail response = this._kt.create_folder(this._session, 1, "kt_unit_testabc");
  22 +
  23 +
  24 + this._folderId = response.id;
  25 +
  26 + }
  27 +
  28 + [TearDown]
  29 + public void TearDown()
  30 + {
  31 + this._doc1.deleteFile();
  32 + }
  33 +
  34 + [Test]
  35 + public void Query()
  36 + {
  37 +
  38 + kt_folder_contents response = this._kt.get_folder_contents(this._session, 1, 1, "DF");
  39 +
  40 + Assert.AreEqual(0, response.status_code);
  41 + Assert.AreEqual(2, response.items.Length);
  42 +
  43 + Assert.AreEqual(this._doc1.docId, response.items[1].id);
  44 +
  45 + Assert.AreEqual("n/a", response.items[1].custom_document_no);
  46 + Assert.AreEqual("n/a", response.items[1].oem_document_no);
  47 +
  48 + Assert.AreEqual("D", response.items[1].item_type);
  49 + Assert.AreEqual(this._doc1.title, response.items[1].title);
  50 + Assert.AreEqual(this._doc1.realFilename, response.items[1].filename);
  51 + Assert.AreEqual("Default", response.items[1].document_type);
  52 + Assert.AreEqual(this._doc1.filesize+1 + "", response.items[1].filesize);
  53 +
  54 + Assert.AreEqual("Administrator", response.items[1].created_by);
  55 + Assert.AreEqual("Administrator", response.items[1].modified_by);
  56 + Assert.AreEqual("n/a", response.items[1].checked_out_by);
  57 + Assert.AreEqual("Administrator", response.items[1].owned_by);
  58 + Assert.AreEqual("0.1", response.items[1].version);
  59 + Assert.AreEqual("false", response.items[1].is_immutable);
  60 + Assert.AreEqual("n/a", response.items[1].permissions);
  61 + Assert.AreEqual("n/a", response.items[1].workflow);
  62 + Assert.AreEqual("n/a", response.items[1].workflow_state);
  63 + Assert.AreEqual("text/plain", response.items[1].mime_type);
  64 + Assert.AreEqual("text", response.items[1].mime_icon_path);
  65 + Assert.AreEqual("Plain Text", response.items[1].mime_display);
  66 + Assert.IsTrue("" != response.items[1].storage_path);
  67 +
  68 + Assert.AreEqual(this._folderId, response.items[0].id);
  69 + Assert.AreEqual("F", response.items[0].item_type);
  70 + Assert.AreEqual("kt_unit_testabc", response.items[0].title);
  71 +
  72 + Assert.AreEqual("kt_unit_testabc", response.items[0].filename);
  73 + Assert.AreEqual("n/a", response.items[0].document_type);
  74 + Assert.AreEqual("n/a", response.items[0].filesize);
  75 +
  76 + Assert.AreEqual("Administrator", response.items[0].created_by);
  77 + Assert.AreEqual("n/a", response.items[0].modified_by);
  78 + Assert.AreEqual("n/a", response.items[0].checked_out_by);
  79 + Assert.AreEqual("n/a", response.items[0].owned_by);
  80 + Assert.AreEqual("n/a", response.items[0].version);
  81 + Assert.AreEqual("n/a", response.items[0].is_immutable);
  82 + Assert.AreEqual("n/a", response.items[0].permissions);
  83 + Assert.AreEqual("n/a", response.items[0].workflow);
  84 + Assert.AreEqual("n/a", response.items[0].workflow_state);
  85 + Assert.AreEqual("folder", response.items[0].mime_type);
  86 + Assert.AreEqual("folder", response.items[0].mime_icon_path);
  87 + Assert.AreEqual("Folder", response.items[0].mime_display);
  88 + Assert.AreEqual("n/a",response.items[0].storage_path);
  89 + }
  90 + }
  91 +}
ktwebservice/nunit/document_detail.cs
@@ -6,16 +6,16 @@ namespace MonoTests.KnowledgeTree @@ -6,16 +6,16 @@ namespace MonoTests.KnowledgeTree
6 { 6 {
7 [TestFixture] 7 [TestFixture]
8 public class DocumentDetailTest : KTTest 8 public class DocumentDetailTest : KTTest
9 - { 9 + {
10 private int _docId; 10 private int _docId;
11 private int _folderId; 11 private int _folderId;
12 private String _filename; 12 private String _filename;
13 - private String _content; 13 + private String _content;
14 14
15 15
16 [SetUp] 16 [SetUp]
17 public void SetUp() 17 public void SetUp()
18 - { 18 + {
19 19
20 this._filename = Helper.isUnix()?"/tmp/kt_unit_test1.txt":"c:\\kt_unit_test1.txt"; 20 this._filename = Helper.isUnix()?"/tmp/kt_unit_test1.txt":"c:\\kt_unit_test1.txt";
21 21
@@ -23,7 +23,7 @@ namespace MonoTests.KnowledgeTree @@ -23,7 +23,7 @@ namespace MonoTests.KnowledgeTree
23 23
24 this._content = "hello world!"; 24 this._content = "hello world!";
25 25
26 - Helper.writeFile(this._filename, this._content); 26 + Helper.writeFile(this._filename, this._content);
27 this._folderId = 1; 27 this._folderId = 1;
28 28
29 kt_document_detail response1 = this._kt.add_base64_document(this._session, this._folderId, filename, this._filename, "Default", Helper.ConvertFileToBase64Encoding(this._filename)); 29 kt_document_detail response1 = this._kt.add_base64_document(this._session, this._folderId, filename, this._filename, "Default", Helper.ConvertFileToBase64Encoding(this._filename));
@@ -47,7 +47,7 @@ namespace MonoTests.KnowledgeTree @@ -47,7 +47,7 @@ namespace MonoTests.KnowledgeTree
47 if (this._verbose && response.status_code != 0) 47 if (this._verbose && response.status_code != 0)
48 { 48 {
49 System.Console.WriteLine("Could not delete file: " + this._filename); 49 System.Console.WriteLine("Could not delete file: " + this._filename);
50 - } 50 + }
51 51
52 } 52 }
53 53
@@ -61,12 +61,54 @@ namespace MonoTests.KnowledgeTree @@ -61,12 +61,54 @@ namespace MonoTests.KnowledgeTree
61 [Test] 61 [Test]
62 public void DocumentExistanceTest() 62 public void DocumentExistanceTest()
63 { 63 {
64 - kt_document_detail response = this._kt.get_document_detail(this._session, this._docId,""); 64 + kt_document_detail response = this._kt.get_document_detail(this._session, this._docId,"MLTVH");
65 Assert.AreEqual(0, response.status_code); 65 Assert.AreEqual(0, response.status_code);
66 Assert.AreEqual(this._docId, response.document_id); 66 Assert.AreEqual(this._docId, response.document_id);
  67 + Assert.AreEqual("kt unit test1", response.title);
  68 + Assert.AreEqual("n/a", response.custom_document_no);
  69 + Assert.AreEqual("n/a", response.oem_document_no);
  70 + Assert.AreEqual("Default", response.document_type);
  71 + Assert.AreEqual("Root Folder/kt unit test1", response.full_path);
  72 + Assert.AreEqual("kt_unit_test1.txt", response.filename);
  73 + Assert.AreEqual(this._content.Length + 1, response.filesize);
  74 + Assert.AreEqual(this._folderId, response.folder_id);
  75 + Assert.AreEqual("Administrator", response.created_by);
  76 + Assert.IsTrue("" != response.created_date);
  77 + Assert.AreEqual("n/a", response.checked_out_by);
  78 + Assert.IsTrue("" != response.checked_out_date);
  79 + Assert.AreEqual("Administrator", response.modified_by);
  80 + Assert.IsTrue("" != response.modified_date);
  81 + Assert.AreEqual("Administrator", response.owned_by);
  82 + Assert.AreEqual(0.1, response.version);
  83 + Assert.AreEqual(false, response.is_immutable);
  84 + Assert.AreEqual("n/a", response.permissions);
  85 + Assert.AreEqual("n/a", response.workflow);
  86 + Assert.AreEqual("n/a", response.workflow_state);
  87 + Assert.AreEqual("text/plain", response.mime_type);
  88 + Assert.AreEqual("text", response.mime_icon_path);
  89 + Assert.AreEqual("Plain Text", response.mime_display);
  90 + Assert.IsTrue("" != response.storage_path);
  91 + Assert.AreEqual(2, response.metadata.Length);
  92 + Assert.AreEqual(null, response.links);
  93 +
  94 + Assert.AreEqual(1, response.transaction_history.Length);
  95 + Assert.AreEqual("Create", response.transaction_history[0].transaction_name);
  96 + Assert.AreEqual("Administrator", response.transaction_history[0].username);
  97 + Assert.AreEqual(0.1, response.transaction_history[0].version);
  98 + Assert.AreEqual("Document created", response.transaction_history[0].comment);
  99 + Assert.IsTrue("" != response.transaction_history[0].datetime);
  100 +
  101 + Assert.AreEqual(1, response.version_history.Length);
  102 + Assert.AreEqual("Administrator", response.version_history[0].user);
  103 + Assert.AreEqual(0, response.version_history[0].metadata_version);
  104 + Assert.AreEqual(0.1, response.version_history[0].content_version);
  105 +
  106 +
  107 +
  108 + Assert.AreEqual(null, response.transitions);
67 } 109 }
68 110
69 - [Test] 111 + //[Test]
70 public void GetDetailByTitleTest() 112 public void GetDetailByTitleTest()
71 { 113 {
72 kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt unit test1", "T",""); 114 kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt unit test1", "T","");
@@ -76,7 +118,7 @@ namespace MonoTests.KnowledgeTree @@ -76,7 +118,7 @@ namespace MonoTests.KnowledgeTree
76 } 118 }
77 119
78 120
79 - [Test] 121 + //[Test]
80 public void GetDetailByTitle2Test() 122 public void GetDetailByTitle2Test()
81 { 123 {
82 kt_document_detail response = this._kt.get_document_detail_by_title(this._session, 1, "Root Folder/kt unit test1", ""); 124 kt_document_detail response = this._kt.get_document_detail_by_title(this._session, 1, "Root Folder/kt unit test1", "");
@@ -85,7 +127,7 @@ namespace MonoTests.KnowledgeTree @@ -85,7 +127,7 @@ namespace MonoTests.KnowledgeTree
85 Assert.AreEqual(this._docId, response.document_id); 127 Assert.AreEqual(this._docId, response.document_id);
86 } 128 }
87 129
88 - [Test] 130 + //[Test]
89 public void GetDetailByFileTest() 131 public void GetDetailByFileTest()
90 { 132 {
91 kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt_unit_test1.txt", "F",""); 133 kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt_unit_test1.txt", "F","");
@@ -93,7 +135,7 @@ namespace MonoTests.KnowledgeTree @@ -93,7 +135,7 @@ namespace MonoTests.KnowledgeTree
93 Assert.AreEqual(0, response.status_code); 135 Assert.AreEqual(0, response.status_code);
94 Assert.AreEqual(this._docId, response.document_id); 136 Assert.AreEqual(this._docId, response.document_id);
95 } 137 }
96 - [Test] 138 + //[Test]
97 public void GetDetailByFile2Test() 139 public void GetDetailByFile2Test()
98 { 140 {
99 kt_document_detail response = this._kt.get_document_detail_by_filename(this._session, 1, "Root Folder/kt_unit_test1.txt", ""); 141 kt_document_detail response = this._kt.get_document_detail_by_filename(this._session, 1, "Root Folder/kt_unit_test1.txt", "");
@@ -102,7 +144,7 @@ namespace MonoTests.KnowledgeTree @@ -102,7 +144,7 @@ namespace MonoTests.KnowledgeTree
102 Assert.AreEqual(this._docId, response.document_id); 144 Assert.AreEqual(this._docId, response.document_id);
103 } 145 }
104 146
105 - [Test] 147 + //[Test]
106 public void GetDetailByUnknownNameTest() 148 public void GetDetailByUnknownNameTest()
107 { 149 {
108 kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt_unit_test1.ssssdasdasd", "F",""); 150 kt_document_detail response = this._kt.get_document_detail_by_name(this._session, 1, "Root Folder/kt_unit_test1.ssssdasdasd", "F","");
ktwebservice/nunit/document_download.cs
1 using NUnit.Framework; 1 using NUnit.Framework;
2 using System; 2 using System;
3 using System.IO; 3 using System.IO;
4 -using System.Net; 4 +using System.Net;
5 5
6 namespace MonoTests.KnowledgeTree 6 namespace MonoTests.KnowledgeTree
7 -{  
8 -  
9 - 7 +{
10 [TestFixture] 8 [TestFixture]
11 public class DocumentSystemMetadataTest : KTTest 9 public class DocumentSystemMetadataTest : KTTest
12 { 10 {
@@ -61,10 +59,11 @@ namespace MonoTests.KnowledgeTree @@ -61,10 +59,11 @@ namespace MonoTests.KnowledgeTree
61 59
62 60
63 long length = Helper.ConvertBase64EncodingToFile(update_resp.message, filename); 61 long length = Helper.ConvertBase64EncodingToFile(update_resp.message, filename);
64 - //System.Console.WriteLine(Helper.readFile(filename)); 62 + System.Console.WriteLine(Helper.readFile(filename));
65 63
66 // TODO - why??? 64 // TODO - why???
67 - //Assert.AreEqual(length, this._doc1.filesize); 65 + Assert.AreEqual(length, this._doc1.filesize+1);
  66 +
68 } 67 }
69 } 68 }
70 } 69 }
ktwebservice/nunit/document_links.cs
@@ -47,6 +47,15 @@ namespace MonoTests.KnowledgeTree @@ -47,6 +47,15 @@ namespace MonoTests.KnowledgeTree
47 Assert.AreEqual(this._doc1.docId, linkresp.parent_document_id); 47 Assert.AreEqual(this._doc1.docId, linkresp.parent_document_id);
48 Assert.AreEqual(1, linkresp.links.Length); 48 Assert.AreEqual(1, linkresp.links.Length);
49 Assert.AreEqual(this._doc2.docId, linkresp.links[0].document_id); 49 Assert.AreEqual(this._doc2.docId, linkresp.links[0].document_id);
  50 + Assert.AreEqual(this._doc2.title, linkresp.links[0].title);
  51 + Assert.AreEqual("Default", linkresp.links[0].document_type);
  52 + Assert.AreEqual(this._doc2.filesize+1, linkresp.links[0].filesize);
  53 + Assert.AreEqual(0.1, linkresp.links[0].version);
  54 + Assert.AreEqual("n/a", linkresp.links[0].workflow);
  55 + Assert.AreEqual("n/a", linkresp.links[0].workflow_state);
  56 + Assert.AreEqual("Reference", linkresp.links[0].link_type);
  57 + Assert.AreEqual("n/a", linkresp.links[0].custom_document_no);
  58 + Assert.AreEqual("n/a", linkresp.links[0].oem_document_no);
50 59
51 response = this._kt.unlink_documents(this._session, this._doc1.docId, this._doc2.docId); 60 response = this._kt.unlink_documents(this._session, this._doc1.docId, this._doc2.docId);
52 Assert.AreEqual(0, response.status_code); 61 Assert.AreEqual(0, response.status_code);
ktwebservice/nunit/document_metadata.cs
@@ -108,5 +108,42 @@ namespace MonoTests.KnowledgeTree @@ -108,5 +108,42 @@ namespace MonoTests.KnowledgeTree
108 108
109 } 109 }
110 110
  111 + [Test]
  112 + public void UpdateDocumentMetadataWithSpecialCharactersTest()
  113 + {
  114 + kt_metadata_fieldset[] fs = new kt_metadata_fieldset[1];
  115 + fs[0] = new kt_metadata_fieldset();
  116 + fs[0].fieldset = "General information";
  117 + fs[0].fields = new kt_metadata_field[3];
  118 + fs[0].fields[0] = new kt_metadata_field();
  119 + fs[0].fields[0].name = "Document Author";
  120 + fs[0].fields[0].value = "Joe \\Soap";
  121 + fs[0].fields[1] = new kt_metadata_field();
  122 + fs[0].fields[1].name = "Category";
  123 + fs[0].fields[1].value = "Tec/hn\\ical/";
  124 + fs[0].fields[2] = new kt_metadata_field();
  125 + fs[0].fields[2].name = "Media Type";
  126 + fs[0].fields[2].value = "Text'";
  127 +
  128 + kt_sysdata_item[] sysdata = new kt_sysdata_item[0];
  129 +
  130 + kt_document_detail update_resp = this._kt.update_document_metadata(this._session, this._docId, fs, sysdata);
  131 + Assert.AreEqual(0, update_resp.status_code);
  132 + Assert.AreEqual("General information", update_resp.metadata[1].fieldset);
  133 +
  134 + Assert.AreEqual("Document Author", update_resp.metadata[1].fields[0].name);
  135 + Assert.AreEqual("Joe \\Soap", update_resp.metadata[1].fields[0].value);
  136 +
  137 + Assert.AreEqual("Category", update_resp.metadata[1].fields[1].name);
  138 + Assert.AreEqual("Tec/hn\\ical/", update_resp.metadata[1].fields[1].value);
  139 +
  140 + Assert.AreEqual("Media Type", update_resp.metadata[1].fields[2].name);
  141 + Assert.AreEqual("Text'", update_resp.metadata[1].fields[2].value);
  142 +
  143 +
  144 + }
  145 +
  146 +
  147 +
111 } 148 }
112 } 149 }
ktwebservice/nunit/folder.cs
@@ -7,7 +7,7 @@ namespace MonoTests.KnowledgeTree @@ -7,7 +7,7 @@ namespace MonoTests.KnowledgeTree
7 [TestFixture] 7 [TestFixture]
8 public class FolderTest : KTTest 8 public class FolderTest : KTTest
9 { 9 {
10 - 10 +
11 private int _folder_id; 11 private int _folder_id;
12 private int _subfolder_id; 12 private int _subfolder_id;
13 13
@@ -18,7 +18,7 @@ namespace MonoTests.KnowledgeTree @@ -18,7 +18,7 @@ namespace MonoTests.KnowledgeTree
18 18
19 [TearDown] 19 [TearDown]
20 public void TearDown() 20 public void TearDown()
21 - { 21 + {
22 } 22 }
23 23
24 [Test] 24 [Test]
@@ -30,7 +30,7 @@ namespace MonoTests.KnowledgeTree @@ -30,7 +30,7 @@ namespace MonoTests.KnowledgeTree
30 Assert.AreEqual(1, response.id); 30 Assert.AreEqual(1, response.id);
31 Assert.AreEqual("Root Folder", response.folder_name); 31 Assert.AreEqual("Root Folder", response.folder_name);
32 Assert.AreEqual(0, response.parent_id); 32 Assert.AreEqual(0, response.parent_id);
33 - Assert.AreEqual("/Root Folder", response.full_path); // ??? DOESNT SEEM CONSISTENT - should be 'Root Filder' 33 + Assert.AreEqual("Root Folder", response.full_path);
34 } 34 }
35 35
36 [Test] 36 [Test]
@@ -74,8 +74,7 @@ namespace MonoTests.KnowledgeTree @@ -74,8 +74,7 @@ namespace MonoTests.KnowledgeTree
74 [Test] 74 [Test]
75 public void GetFolderContents() 75 public void GetFolderContents()
76 { 76 {
77 -  
78 - kt_folder_contents response = this._kt.get_folder_contents(this._session, this._folder_id, 1, "DF"); 77 + kt_folder_contents response = this._kt.get_folder_contents(this._session, this._folder_id, 1, "DF");
79 Assert.AreEqual(0,response.status_code); 78 Assert.AreEqual(0,response.status_code);
80 Assert.AreEqual(this._folder_id,response.folder_id); 79 Assert.AreEqual(this._folder_id,response.folder_id);
81 Assert.AreEqual("kt_unit_test", response.folder_name); 80 Assert.AreEqual("kt_unit_test", response.folder_name);
@@ -86,30 +85,43 @@ namespace MonoTests.KnowledgeTree @@ -86,30 +85,43 @@ namespace MonoTests.KnowledgeTree
86 Assert.AreEqual(this._subfolder_id, response2.folder_id); 85 Assert.AreEqual(this._subfolder_id, response2.folder_id);
87 Assert.AreEqual("subfolder", response2.folder_name); 86 Assert.AreEqual("subfolder", response2.folder_name);
88 Assert.AreEqual("Root Folder/kt_unit_test/subfolder", response2.full_path); 87 Assert.AreEqual("Root Folder/kt_unit_test/subfolder", response2.full_path);
89 - } 88 + }
90 89
91 [Test] 90 [Test]
92 public void RenameFolder() 91 public void RenameFolder()
93 { 92 {
94 -  
95 - kt_response response = this._kt.rename_folder(this._session, this._subfolder_id, "subfolder2"); 93 + kt_response response = this._kt.rename_folder(this._session, this._subfolder_id, "subfolde'r2");
96 Assert.AreEqual(0, response.status_code); 94 Assert.AreEqual(0, response.status_code);
97 95
98 kt_folder_detail response2 = this._kt.get_folder_detail(this._session, this._subfolder_id); 96 kt_folder_detail response2 = this._kt.get_folder_detail(this._session, this._subfolder_id);
99 Assert.AreEqual(0, response2.status_code); 97 Assert.AreEqual(0, response2.status_code);
100 Assert.AreEqual(this._subfolder_id, response2.id); 98 Assert.AreEqual(this._subfolder_id, response2.id);
101 - Assert.AreEqual("subfolder2", response2.folder_name); 99 + Assert.AreEqual("subfolde'r2", response2.folder_name);
102 Assert.AreEqual(this._folder_id, response2.parent_id); 100 Assert.AreEqual(this._folder_id, response2.parent_id);
103 - Assert.AreEqual("Root Folder/kt_unit_test/subfolder2", response2.full_path);  
104 - } 101 + Assert.AreEqual("Root Folder/kt_unit_test/subfolde'r2", response2.full_path);
  102 + }
105 103
106 [Test] 104 [Test]
107 public void RemoveFolder() 105 public void RemoveFolder()
108 { 106 {
109 -  
110 - kt_response response = this._kt.delete_folder(this._session, this._folder_id, "unit testing remove"); 107 + kt_response response = this._kt.delete_folder(this._session, this._folder_id, "unit testing remove");
111 Assert.AreEqual(0, response.status_code); 108 Assert.AreEqual(0, response.status_code);
112 - } 109 + }
113 110
  111 + [Test]
  112 + public void AddFolderWithSpecialCharacters()
  113 + {
  114 + kt_folder_detail response = this._kt.create_folder(this._session, 1, "kt.unit.test");
  115 + Assert.AreEqual(0,response.status_code);
  116 + Assert.AreEqual("kt.unit.test",response.folder_name);
  117 +
  118 + response = this._kt.create_folder(this._session, 1, "kt ' unit \" test");
  119 + Assert.AreEqual(0,response.status_code);
  120 + Assert.AreEqual("kt ' unit \" test",response.folder_name);
  121 +
  122 + response = this._kt.create_folder(this._session, 1, "kt - unit - test");
  123 + Assert.AreEqual(0,response.status_code);
  124 + Assert.AreEqual("kt - unit - test",response.folder_name);
  125 + }
114 } 126 }
115 } 127 }
ktwebservice/nunit/helper.cs
@@ -3,6 +3,8 @@ using System.Text; @@ -3,6 +3,8 @@ using System.Text;
3 using System.Net; 3 using System.Net;
4 using System.IO; 4 using System.IO;
5 using System.Collections; 5 using System.Collections;
  6 +using System.Data;
  7 +using System.Data.Odbc;
6 8
7 namespace MonoTests.KnowledgeTree 9 namespace MonoTests.KnowledgeTree
8 { 10 {
@@ -22,17 +24,56 @@ namespace MonoTests.KnowledgeTree @@ -22,17 +24,56 @@ namespace MonoTests.KnowledgeTree
22 { 24 {
23 protected KTWebService _kt; 25 protected KTWebService _kt;
24 protected String _session; 26 protected String _session;
25 - protected bool _verbose; 27 + protected bool _verbose;
  28 +
26 29
27 public KTTest() 30 public KTTest()
28 { 31 {
29 this._kt = new KTWebService(); 32 this._kt = new KTWebService();
30 kt_response response = this._kt.login("admin","admin","127.0.0.1"); 33 kt_response response = this._kt.login("admin","admin","127.0.0.1");
31 this._session = response.message; 34 this._session = response.message;
32 - this._verbose = false;  
33 - 35 + this._verbose = false;
  36 + this.setupDb();
34 } 37 }
35 38
  39 + void setupDb()
  40 + {
  41 +
  42 + String connectionString = "DSN=ktdms;" + "UID=root;" + "PWD=";
  43 + try
  44 + {
  45 + IDbConnection dbcon = new OdbcConnection(connectionString);
  46 + if (dbcon == null)
  47 + {
  48 + System.Console.WriteLine("Cannot create connection");
  49 + }
  50 + dbcon.Open();
  51 + IDbCommand dbcmd = dbcon.CreateCommand();
  52 + if (dbcmd == null)
  53 + {
  54 + System.Console.WriteLine("Cannot create command");
  55 + }
  56 + dbcmd.CommandText = "DELETE FROM folders WHERE id > 1";
  57 + dbcmd.CommandType = CommandType.Text;
  58 + dbcmd.ExecuteNonQuery();
  59 + dbcmd.CommandText = "DELETE FROM documents";
  60 + dbcmd.CommandType = CommandType.Text;
  61 + dbcmd.ExecuteNonQuery();
  62 + dbcmd.CommandText = "DELETE FROM document_types_lookup WHERE name = 'NewType'";
  63 + dbcmd.ExecuteNonQuery();
  64 + dbcmd.CommandText = "INSERT INTO document_types_lookup(id,name) VALUES(2,'NewType')";
  65 + dbcmd.ExecuteNonQuery();
  66 + dbcmd.Dispose();
  67 + dbcmd = null;
  68 + dbcon.Close();
  69 + dbcon = null;
  70 + }
  71 + catch(Exception ex)
  72 + {
  73 + System.Console.WriteLine(ex.Message);
  74 + }
  75 + }
  76 +
36 ~KTTest() 77 ~KTTest()
37 { 78 {
38 this._kt.logout(this._session); 79 this._kt.logout(this._session);
@@ -188,7 +229,7 @@ namespace MonoTests.KnowledgeTree @@ -188,7 +229,7 @@ namespace MonoTests.KnowledgeTree
188 this.title = "kt unit test" + offset; 229 this.title = "kt unit test" + offset;
189 this.realFilename = "kt_unit_test" + offset + ".txt"; 230 this.realFilename = "kt_unit_test" + offset + ".txt";
190 this.filename = (Helper.isUnix()?("/tmp/"):("c:\\")) + this.realFilename; 231 this.filename = (Helper.isUnix()?("/tmp/"):("c:\\")) + this.realFilename;
191 - this.content = "hello world!"; 232 + this.content = "Hello World!\nThis is a test! And more!\n\n\r\n";
192 this.docId = 0; 233 this.docId = 0;
193 this.session = session; 234 this.session = session;
194 this.kt = kt; 235 this.kt = kt;
@@ -423,7 +464,6 @@ namespace MonoTests.KnowledgeTree @@ -423,7 +464,6 @@ namespace MonoTests.KnowledgeTree
423 System.IO.FileStream inFile; 464 System.IO.FileStream inFile;
424 465
425 byte[] binaryData; 466 byte[] binaryData;
426 - string base64String = "";  
427 467
428 try 468 try
429 { 469 {
ktwebservice/nunit/makefile
1 -RESULTS= authentication.result document_detail.result document_add.result document_checkout.result document_type.result document_links.result document_owner.result document_rename.result document_history.result document_workflow.result document_copy.result folder.result document_metadata.result document_system_metadata.result query.result  
2 -#document_download.result 1 +RESULTS= authentication.result document_detail.result document_contents.result document_history.result folder.result document_metadata.result document_add.result document_checkout.result document_type.result document_links.result document_owner.result document_rename.result document_workflow.result document_copy.result document_system_metadata.result query.result document_download.result
3 PROXY=KTproxy.cs 2 PROXY=KTproxy.cs
4 WSDL=ktdms.wsdl 3 WSDL=ktdms.wsdl
5 ROOT_URL=http://ktdms.trunk 4 ROOT_URL=http://ktdms.trunk
@@ -9,10 +8,8 @@ all: ${RESULTS} @@ -9,10 +8,8 @@ all: ${RESULTS}
9 8
10 results: clean-results ${RESULTS} 9 results: clean-results ${RESULTS}
11 10
12 -KTproxy.dll: KTproxy.cs helper.cs  
13 - mcs -r:System.Web.Services /target:library KTproxy.cs helper.cs  
14 -  
15 - 11 +KTproxy.dll: KTproxy.cs helper.cs
  12 + mcs -r:System.Web.Services -r:System.Data.dll /target:library KTproxy.cs helper.cs
16 13
17 KTproxy.cs: ktdms.wsdl 14 KTproxy.cs: ktdms.wsdl
18 wsdl -out:${PROXY} ${WSDL} 15 wsdl -out:${PROXY} ${WSDL}
@@ -26,8 +23,8 @@ clean: @@ -26,8 +23,8 @@ clean:
26 clean-results: 23 clean-results:
27 rm -f ${RESULTS} 24 rm -f ${RESULTS}
28 25
29 -%.dll: %.cs KTproxy.dll  
30 - mcs -r:System.Web.Services -r:nunit.framework /r:KTproxy.dll -debug /target:library -out:$@ $< 26 +%.dll: %.cs KTproxy.dll
  27 + mcs -r:System.Web.Services -r:nunit.framework /r:KTproxy.dll -debug /target:library -out:$@ $<
31 28
32 %.result: %.dll 29 %.result: %.dll
33 (export KT_ROOT_URL=${ROOT_URL}; nunit-console $<) 30 (export KT_ROOT_URL=${ROOT_URL}; nunit-console $<)
ktwebservice/nunit/query.cs
@@ -7,16 +7,16 @@ namespace MonoTests.KnowledgeTree @@ -7,16 +7,16 @@ namespace MonoTests.KnowledgeTree
7 [TestFixture] 7 [TestFixture]
8 public class QueryTest : KTTest 8 public class QueryTest : KTTest
9 { 9 {
10 - 10 +
11 11
12 [SetUp] 12 [SetUp]
13 public void SetUp() 13 public void SetUp()
14 - { 14 + {
15 } 15 }
16 16
17 [TearDown] 17 [TearDown]
18 public void TearDown() 18 public void TearDown()
19 - { 19 + {
20 } 20 }
21 21
22 [Test] 22 [Test]
@@ -24,35 +24,38 @@ namespace MonoTests.KnowledgeTree @@ -24,35 +24,38 @@ namespace MonoTests.KnowledgeTree
24 { 24 {
25 Document doc = new Document(0,this._session, this._kt, false, false); 25 Document doc = new Document(0,this._session, this._kt, false, false);
26 doc.createFile(1); 26 doc.createFile(1);
27 - kt_search_response response = this._kt.search(this._session, "Filesize = \"13\"", ""); 27 + int filesize = doc.content.Length+1;
  28 + kt_search_response response = this._kt.search(this._session, "Filesize = \""+filesize+"\"", "");
28 29
29 Assert.AreEqual(0,response.status_code); 30 Assert.AreEqual(0,response.status_code);
30 - Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize); 31 + Assert.AreEqual("n/a", response.hits[0].custom_document_no);
  32 + Assert.AreEqual("n/a", response.hits[0].oem_document_no);
  33 + Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize);
31 Assert.AreEqual(doc.title,response.hits[0].title); 34 Assert.AreEqual(doc.title,response.hits[0].title);
32 - Assert.AreEqual(doc.realFilename,response.hits[0].filename);  
33 - 35 + Assert.AreEqual(doc.realFilename,response.hits[0].filename);
  36 +
34 response = this._kt.search(this._session, "DocumentId = \""+ response.hits[0].document_id +"\"", ""); 37 response = this._kt.search(this._session, "DocumentId = \""+ response.hits[0].document_id +"\"", "");
35 38
36 Assert.AreEqual(0,response.status_code); 39 Assert.AreEqual(0,response.status_code);
37 - Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize); 40 + Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize);
38 Assert.AreEqual(doc.title,response.hits[0].title); 41 Assert.AreEqual(doc.title,response.hits[0].title);
39 - Assert.AreEqual(doc.realFilename,response.hits[0].filename);  
40 - 42 + Assert.AreEqual(doc.realFilename,response.hits[0].filename);
  43 +
41 response = this._kt.search(this._session, "Title = \""+ response.hits[0].title +"\"", ""); 44 response = this._kt.search(this._session, "Title = \""+ response.hits[0].title +"\"", "");
42 45
43 Assert.AreEqual(0,response.status_code); 46 Assert.AreEqual(0,response.status_code);
44 - Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize); 47 + Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize);
45 Assert.AreEqual(doc.title,response.hits[0].title); 48 Assert.AreEqual(doc.title,response.hits[0].title);
46 - Assert.AreEqual(doc.realFilename,response.hits[0].filename);  
47 -  
48 - 49 + Assert.AreEqual(doc.realFilename,response.hits[0].filename);
  50 +
  51 +
49 response = this._kt.search(this._session, "Filename = \""+ response.hits[0].filename +"\"", ""); 52 response = this._kt.search(this._session, "Filename = \""+ response.hits[0].filename +"\"", "");
50 53
51 Assert.AreEqual(0,response.status_code); 54 Assert.AreEqual(0,response.status_code);
52 - Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize); 55 + Assert.AreEqual(doc.content.Length + 1,response.hits[0].filesize);
53 Assert.AreEqual(doc.title,response.hits[0].title); 56 Assert.AreEqual(doc.title,response.hits[0].title);
54 - Assert.AreEqual(doc.realFilename,response.hits[0].filename);  
55 - 57 + Assert.AreEqual(doc.realFilename,response.hits[0].filename);
  58 +
56 doc.deleteFile(); 59 doc.deleteFile();
57 } 60 }
58 } 61 }
ktwebservice/webservice.php
@@ -59,7 +59,18 @@ if (defined(&#39;HAS_SEARCH_FUNCTIONALITY&#39;)) @@ -59,7 +59,18 @@ if (defined(&#39;HAS_SEARCH_FUNCTIONALITY&#39;))
59 require_once(KT_DIR . '/search2/search/search.inc.php'); 59 require_once(KT_DIR . '/search2/search/search.inc.php');
60 } 60 }
61 61
62 -// TODO: Test getting files/metadata based on versioning works and implementation is consistent. 62 +// TODO: allow downloading of metadata versions
  63 +// TODO: allow downloading of document versions
  64 +// TODO: chunking search results
  65 +// TODO: add basic permissions management - add permissions to folder based on user/groups
  66 +// TODO: refactor!!! download manager, split this file into a few smaller ones, etc
  67 +// TOdO: define more reason codes!
  68 +// TODO: get_folder must have a 'create' option
  69 +// TODO: redo metadata encoding
  70 +// TODO: unit tests - metadata - test return values in selectin - list/tree
  71 +// TODO: ktwsapi/php must be made compatible with v2/v3
  72 +
  73 +// NOTE: some features are not implemented yet. most expected for v3. e.g. oem_document_no, custom_document_no, download($version)., get_metadata($version)
63 74
64 // Status Codes as defined in the specification. 75 // Status Codes as defined in the specification.
65 76
@@ -67,16 +78,24 @@ define(&#39;KTWS_SUCCESS&#39;, 0); @@ -67,16 +78,24 @@ define(&#39;KTWS_SUCCESS&#39;, 0);
67 define('KTWS_ERR_INVALID_SESSION', 1); 78 define('KTWS_ERR_INVALID_SESSION', 1);
68 define('KTWS_ERR_AUTHENTICATION_ERROR', 2); 79 define('KTWS_ERR_AUTHENTICATION_ERROR', 2);
69 define('KTWS_ERR_INSUFFICIENT_PERMISSIONS', 3); 80 define('KTWS_ERR_INSUFFICIENT_PERMISSIONS', 3);
  81 +
70 define('KTWS_ERR_FILE_NOT_FOUND', 10); 82 define('KTWS_ERR_FILE_NOT_FOUND', 10);
71 define('KTWS_ERR_INVALID_FILENAME', 20); 83 define('KTWS_ERR_INVALID_FILENAME', 20);
  84 +
72 define('KTWS_ERR_INVALID_DOCUMENT', 21); 85 define('KTWS_ERR_INVALID_DOCUMENT', 21);
73 define('KTWS_ERR_INVALID_FOLDER', 22); 86 define('KTWS_ERR_INVALID_FOLDER', 22);
74 define('KTWS_ERR_INVALID_METADATA', 23); 87 define('KTWS_ERR_INVALID_METADATA', 23);
75 define('KTWS_ERR_INVALID_REASON', 24); 88 define('KTWS_ERR_INVALID_REASON', 24);
76 define('KTWS_ERR_INVALID_DEPTH', 25); 89 define('KTWS_ERR_INVALID_DEPTH', 25);
  90 +define('KTWS_ERR_INVALID_DOCUMENT_TYPE', 26);
  91 +
77 define('KTWS_ERR_PROBLEM', 98); 92 define('KTWS_ERR_PROBLEM', 98);
78 define('KTWS_ERR_DB_PROBLEM', 99); 93 define('KTWS_ERR_DB_PROBLEM', 99);
79 94
  95 +if (!defined('LATEST_WEBSERVICE_VERSION'))
  96 +{
  97 + define('LATEST_WEBSERVICE_VERSION',2);
  98 +}
80 99
81 function bool2str($bool) 100 function bool2str($bool)
82 { 101 {
@@ -120,7 +139,7 @@ class KTWebService @@ -120,7 +139,7 @@ class KTWebService
120 var $version; 139 var $version;
121 var $ktapi; 140 var $ktapi;
122 141
123 - 142 + static $wsclass = 'KTWebService';
124 143
125 function KTWebService() 144 function KTWebService()
126 { 145 {
@@ -182,7 +201,11 @@ class KTWebService @@ -182,7 +201,11 @@ class KTWebService
182 'id' => 'int', 201 'id' => 'int',
183 'item_type' => 'string', 202 'item_type' => 'string',
184 203
  204 + 'custom_document_no' => 'string',
  205 + 'oem_document_no' => 'string',
  206 +
185 'title' => 'string', 207 'title' => 'string',
  208 + 'document_type' => 'string',
186 'filename' => 'string', 209 'filename' => 'string',
187 'filesize' => 'string', 210 'filesize' => 'string',
188 211
@@ -199,7 +222,7 @@ class KTWebService @@ -199,7 +222,7 @@ class KTWebService
199 222
200 'version' => 'string', 223 'version' => 'string',
201 224
202 - 'immutable'=>'boolean', 225 + 'is_immutable'=>'string',
203 'permissions' => 'string', 226 'permissions' => 'string',
204 227
205 'workflow'=>'string', 228 'workflow'=>'string',
@@ -258,23 +281,45 @@ class KTWebService @@ -258,23 +281,45 @@ class KTWebService
258 array( 281 array(
259 'status_code'=>'int', 282 'status_code'=>'int',
260 'message'=>'string', 283 'message'=>'string',
  284 +
  285 + 'document_id' => 'int',
  286 +
  287 + 'custom_document_no' => 'string',
  288 + 'oem_document_no' => 'string',
  289 +
261 'title' => 'string', 290 'title' => 'string',
262 'document_type' => 'string', 291 'document_type' => 'string',
263 - 'version' => 'string', 292 + 'full_path' => 'string',
264 'filename' => 'string', 293 'filename' => 'string',
265 - 'created_date' => 'string', 294 + 'filesize' => 'int',
  295 + 'folder_id' => 'int',
  296 +
266 'created_by' => 'string', 297 'created_by' => 'string',
267 - 'modified_date' => 'string', 298 + 'created_date' => 'string',
  299 +
  300 + 'checked_out_by'=>'string',
  301 + 'checked_out_date'=>'string',
  302 +
268 'modified_by' => 'string', 303 'modified_by' => 'string',
269 - 'document_id' => 'int',  
270 - 'folder_id' => 'int', 304 + 'modified_date' => 'string',
  305 +
  306 + 'owned_by'=>'string',
  307 +
  308 + 'version' => 'float',
  309 +
  310 + 'is_immutable'=>'boolean',
  311 + 'permissions' => 'string',
  312 +
271 'workflow' => 'string', 313 'workflow' => 'string',
272 'workflow_state' => 'string', 314 'workflow_state' => 'string',
273 - 'full_path' => 'string',  
274 - 'owner'=>'string',  
275 - 'is_immutable'=>'boolean',  
276 - 'checked_out_date'=>'string',  
277 - 'checked_out_by'=>'string', 315 +
  316 + 'mime_type' => 'string',
  317 + 'mime_icon_path' => 'string',
  318 + 'mime_display' => 'string',
  319 +
  320 + 'storage_path' => 'string',
  321 +
  322 +
278 'metadata' => "{urn:$this->namespace}kt_metadata_fieldsets", 323 'metadata' => "{urn:$this->namespace}kt_metadata_fieldsets",
279 'links' => "{urn:$this->namespace}kt_linked_documents", 324 'links' => "{urn:$this->namespace}kt_linked_documents",
280 'transitions' => "{urn:$this->namespace}kt_workflow_transitions", 325 'transitions' => "{urn:$this->namespace}kt_workflow_transitions",
@@ -289,25 +334,44 @@ class KTWebService @@ -289,25 +334,44 @@ class KTWebService
289 $this->__typedef["{urn:$this->namespace}kt_search_result_item"] = 334 $this->__typedef["{urn:$this->namespace}kt_search_result_item"] =
290 array( 335 array(
291 'document_id' => 'int', 336 'document_id' => 'int',
  337 +
  338 + 'custom_document_no' => 'string',
  339 + 'oem_document_no' => 'string',
  340 +
292 'relevance' => 'float', 341 'relevance' => 'float',
293 'text' => 'string', 342 'text' => 'string',
  343 +
294 'title' => 'string', 344 'title' => 'string',
  345 + 'document_type' => 'string',
295 'fullpath' => 'string', 346 'fullpath' => 'string',
296 - 'filesize' => 'int',  
297 - 'version' => 'string',  
298 - 'filename' => 'string', 347 + 'filename' => 'string',
  348 + 'filesize' => 'int',
299 'folder_id' => 'int', 349 'folder_id' => 'int',
300 - 'workflow' => 'string',  
301 - 'workflow_state' => 'string',  
302 - 'mime_type' => 'string',  
303 - 'owner' => 'string', 350 +
304 'created_by' => 'string', 351 'created_by' => 'string',
305 'created_date' => 'string', 352 'created_date' => 'string',
306 - 'modified_by' => 'string',  
307 - 'modified_date' => 'string', 353 +
308 'checked_out_by' => 'string', 354 'checked_out_by' => 'string',
309 'checked_out_date' => 'string', 355 'checked_out_date' => 'string',
  356 +
  357 + 'modified_by' => 'string',
  358 + 'modified_date' => 'string',
  359 +
  360 + 'owned_by' => 'string',
  361 +
  362 + 'version' => 'float',
310 'is_immutable' => 'boolean', 363 'is_immutable' => 'boolean',
  364 + 'permissions' => 'string',
  365 +
  366 + 'workflow' => 'string',
  367 + 'workflow_state' => 'string',
  368 +
  369 + 'mime_type' => 'string',
  370 + 'mime_icon_path' => 'string',
  371 + 'mime_display' => 'string',
  372 +
  373 + 'storage_path' => 'string',
  374 +
311 'status' => 'string', 375 'status' => 'string',
312 ); 376 );
313 377
@@ -351,7 +415,6 @@ class KTWebService @@ -351,7 +415,6 @@ class KTWebService
351 'parent_id' => 'int' 415 'parent_id' => 'int'
352 ); 416 );
353 417
354 -  
355 $this->__typedef["{urn:$this->namespace}kt_metadata_selection"] = 418 $this->__typedef["{urn:$this->namespace}kt_metadata_selection"] =
356 array( 419 array(
357 array( 420 array(
@@ -359,7 +422,6 @@ class KTWebService @@ -359,7 +422,6 @@ class KTWebService
359 ) 422 )
360 ); 423 );
361 424
362 -  
363 $this->__typedef["{urn:$this->namespace}kt_metadata_field"] = 425 $this->__typedef["{urn:$this->namespace}kt_metadata_field"] =
364 array( 426 array(
365 'name' => 'string', 427 'name' => 'string',
@@ -421,11 +483,27 @@ class KTWebService @@ -421,11 +483,27 @@ class KTWebService
421 'datetime' => 'string' 483 'datetime' => 'string'
422 ); 484 );
423 485
  486 + if ($this->version >= 2)
  487 + {
  488 + $this->__typedef["{urn:$this->namespace}kt_document_transaction_history_item"] =
  489 + array(
  490 + 'transaction_name'=>'string',
  491 + 'username'=>'string',
  492 + 'version' => 'float',
  493 + 'comment' => 'string',
  494 + 'datetime' => 'string'
  495 + );
  496 + }
  497 +
424 $this->__typedef["{urn:$this->namespace}kt_linked_document"] = 498 $this->__typedef["{urn:$this->namespace}kt_linked_document"] =
425 array( 499 array(
426 'document_id'=>'int', 500 'document_id'=>'int',
427 - 'title'=>'string',  
428 - 'size' => 'int', 501 + 'custom_document_no' => 'string',
  502 + 'oem_document_no' => 'string',
  503 + 'title'=>'string',
  504 + 'document_type'=>'string',
  505 + 'filesize' => 'int',
  506 + 'version' => 'float',
429 'workflow' => 'string', 507 'workflow' => 'string',
430 'workflow_state' => 'string', 508 'workflow_state' => 'string',
431 'link_type' => 'string' 509 'link_type' => 'string'
@@ -467,6 +545,16 @@ class KTWebService @@ -467,6 +545,16 @@ class KTWebService
467 'content_version'=>'string', 545 'content_version'=>'string',
468 ); 546 );
469 547
  548 + if ($this->version >= 2)
  549 + {
  550 + $this->__typedef["{urn:$this->namespace}kt_document_version_history_item"] =
  551 + array(
  552 + 'user'=>'string',
  553 + 'metadata_version'=>'int',
  554 + 'content_version'=>'float',
  555 + );
  556 + }
  557 +
470 $this->__typedef["{urn:$this->namespace}kt_document_version_history"] = 558 $this->__typedef["{urn:$this->namespace}kt_document_version_history"] =
471 array( 559 array(
472 array( 560 array(
@@ -509,7 +597,6 @@ class KTWebService @@ -509,7 +597,6 @@ class KTWebService
509 ) 597 )
510 ); 598 );
511 599
512 -  
513 $this->__typedef["{urn:$this->namespace}kt_client_policies_response"] = 600 $this->__typedef["{urn:$this->namespace}kt_client_policies_response"] =
514 array( 601 array(
515 'status_code' => 'int', 602 'status_code' => 'int',
@@ -520,7 +607,6 @@ class KTWebService @@ -520,7 +607,6 @@ class KTWebService
520 /* methods */ 607 /* methods */
521 if (defined('HAS_SEARCH_FUNCTIONALITY')) 608 if (defined('HAS_SEARCH_FUNCTIONALITY'))
522 { 609 {
523 -  
524 $this->__dispatch_map['search'] = array( 610 $this->__dispatch_map['search'] = array(
525 'in' => array('session_id' => 'string', 'search'=>'string' ,'options'=>'string'), 611 'in' => array('session_id' => 'string', 'search'=>'string' ,'options'=>'string'),
526 'out' => array('return' => "{urn:$this->namespace}kt_search_response" ), 612 'out' => array('return' => "{urn:$this->namespace}kt_search_response" ),
@@ -539,7 +625,6 @@ class KTWebService @@ -539,7 +625,6 @@ class KTWebService
539 'out' => array('return' => "{urn:$this->namespace}kt_response" ), 625 'out' => array('return' => "{urn:$this->namespace}kt_response" ),
540 ); 626 );
541 627
542 -  
543 // logout 628 // logout
544 $this->__dispatch_map['logout'] = 629 $this->__dispatch_map['logout'] =
545 array('in' => array('session_id' => 'string' ), 630 array('in' => array('session_id' => 'string' ),
@@ -552,12 +637,22 @@ class KTWebService @@ -552,12 +637,22 @@ class KTWebService
552 'out' => array('return' => "{urn:$this->namespace}kt_folder_detail"), 637 'out' => array('return' => "{urn:$this->namespace}kt_folder_detail"),
553 ); 638 );
554 639
  640 + if ($this->version >=3)
  641 + {
  642 + $this->__dispatch_map['get_folder_detail']['in'] = array('session_id' => 'string', 'folder_id' => 'int', 'create'=>'boolean' );
  643 + }
  644 +
555 // get_folder_detail_by_name 645 // get_folder_detail_by_name
556 $this->__dispatch_map['get_folder_detail_by_name'] = 646 $this->__dispatch_map['get_folder_detail_by_name'] =
557 array('in' => array('session_id' => 'string', 'folder_name' => 'string' ), 647 array('in' => array('session_id' => 'string', 'folder_name' => 'string' ),
558 'out' => array('return' => "{urn:$this->namespace}kt_folder_detail"), 648 'out' => array('return' => "{urn:$this->namespace}kt_folder_detail"),
559 ); 649 );
560 650
  651 + if ($this->version >=3)
  652 + {
  653 + $this->__dispatch_map['get_folder_detail_by_name']['in'] = array('session_id' => 'string', 'folder_id' => 'int', 'create'=>'boolean' );
  654 + }
  655 +
561 // get_folder_contents 656 // get_folder_contents
562 $this->__dispatch_map['get_folder_contents'] = 657 $this->__dispatch_map['get_folder_contents'] =
563 array('in' => array('session_id'=>'string','folder_id'=>'int','depth'=>'int','what'=>'string'), 658 array('in' => array('session_id'=>'string','folder_id'=>'int','depth'=>'int','what'=>'string'),
@@ -580,7 +675,6 @@ class KTWebService @@ -580,7 +675,6 @@ class KTWebService
580 ); 675 );
581 } 676 }
582 677
583 -  
584 // delete_folder 678 // delete_folder
585 $this->__dispatch_map['delete_folder'] = 679 $this->__dispatch_map['delete_folder'] =
586 array('in' => array('session_id'=>'string','folder_id'=>'int','reason' =>'string'), 680 array('in' => array('session_id'=>'string','folder_id'=>'int','reason' =>'string'),
@@ -635,7 +729,6 @@ class KTWebService @@ -635,7 +729,6 @@ class KTWebService
635 $this->__dispatch_map['get_document_detail']['in'] = array('session_id' => 'string', 'document_id' => 'int', 'detail'=>'string' ); 729 $this->__dispatch_map['get_document_detail']['in'] = array('session_id' => 'string', 'document_id' => 'int', 'detail'=>'string' );
636 } 730 }
637 731
638 -  
639 // checkin_document 732 // checkin_document
640 $this->__dispatch_map['checkin_document'] = 733 $this->__dispatch_map['checkin_document'] =
641 array('in' => array('session_id'=>'string','document_id'=>'int','filename'=>'string','reason' =>'string','tempfilename' =>'string', 'major_update'=>'boolean' ), 734 array('in' => array('session_id'=>'string','document_id'=>'int','filename'=>'string','reason' =>'string','tempfilename' =>'string', 'major_update'=>'boolean' ),
@@ -666,7 +759,6 @@ class KTWebService @@ -666,7 +759,6 @@ class KTWebService
666 array('in' => array('session_id'=>'string','document_id'=>'int','filename'=>'string','reason' =>'string','tempfilename' =>'string', 'major_update'=>'boolean', 'metadata'=>"{urn:$this->namespace}kt_metadata_fieldsets",'sysdata'=>"{urn:$this->namespace}kt_sysdata" ), 759 array('in' => array('session_id'=>'string','document_id'=>'int','filename'=>'string','reason' =>'string','tempfilename' =>'string', 'major_update'=>'boolean', 'metadata'=>"{urn:$this->namespace}kt_metadata_fieldsets",'sysdata'=>"{urn:$this->namespace}kt_sysdata" ),
667 'out' => array( 'return' => "{urn:$this->namespace}kt_document_detail" ) 760 'out' => array( 'return' => "{urn:$this->namespace}kt_document_detail" )
668 ); 761 );
669 -  
670 } 762 }
671 763
672 // add_document 764 // add_document
@@ -701,12 +793,8 @@ class KTWebService @@ -701,12 +793,8 @@ class KTWebService
701 array('in' => array('session_id'=>'string','folder_id'=>'int','title'=>'string','filename'=>'string','documentype' =>'string','tempfilename' =>'string', 'metadata'=>"{urn:$this->namespace}kt_metadata_fieldsets",'sysdata'=>"{urn:$this->namespace}kt_sysdata" ), 793 array('in' => array('session_id'=>'string','folder_id'=>'int','title'=>'string','filename'=>'string','documentype' =>'string','tempfilename' =>'string', 'metadata'=>"{urn:$this->namespace}kt_metadata_fieldsets",'sysdata'=>"{urn:$this->namespace}kt_sysdata" ),
702 'out' => array( 'return' => "{urn:$this->namespace}kt_document_detail" ) 794 'out' => array( 'return' => "{urn:$this->namespace}kt_document_detail" )
703 ); 795 );
704 -  
705 -  
706 } 796 }
707 797
708 -  
709 -  
710 // get_document_detail_by_name 798 // get_document_detail_by_name
711 $this->__dispatch_map['get_document_detail_by_name'] = 799 $this->__dispatch_map['get_document_detail_by_name'] =
712 array('in' => array('session_id' => 'string', 'document_name' => 'string', 'what'=>'string' ), 800 array('in' => array('session_id' => 'string', 'document_name' => 'string', 'what'=>'string' ),
@@ -742,7 +830,6 @@ class KTWebService @@ -742,7 +830,6 @@ class KTWebService
742 ); 830 );
743 } 831 }
744 832
745 -  
746 // checkout_small_document 833 // checkout_small_document
747 $this->__dispatch_map['checkout_small_document'] = 834 $this->__dispatch_map['checkout_small_document'] =
748 array('in' => array('session_id'=>'string','document_id'=>'int','reason' =>'string','download' => 'boolean'), 835 array('in' => array('session_id'=>'string','document_id'=>'int','reason' =>'string','download' => 'boolean'),
@@ -754,7 +841,6 @@ class KTWebService @@ -754,7 +841,6 @@ class KTWebService
754 $this->__dispatch_map['checkout_small_document']['out'] = array('return' => "{urn:$this->namespace}kt_document_detail" ); 841 $this->__dispatch_map['checkout_small_document']['out'] = array('return' => "{urn:$this->namespace}kt_document_detail" );
755 } 842 }
756 843
757 -  
758 // checkout_base64_document 844 // checkout_base64_document
759 $this->__dispatch_map['checkout_base64_document'] = 845 $this->__dispatch_map['checkout_base64_document'] =
760 array('in' => array('session_id'=>'string','document_id'=>'int','reason' =>'string','download' => 'boolean'), 846 array('in' => array('session_id'=>'string','document_id'=>'int','reason' =>'string','download' => 'boolean'),
@@ -767,7 +853,6 @@ class KTWebService @@ -767,7 +853,6 @@ class KTWebService
767 $this->__dispatch_map['checkout_base64_document']['out'] = array('return' => "{urn:$this->namespace}kt_document_detail" ); 853 $this->__dispatch_map['checkout_base64_document']['out'] = array('return' => "{urn:$this->namespace}kt_document_detail" );
768 } 854 }
769 855
770 -  
771 // undo_document_checkout 856 // undo_document_checkout
772 $this->__dispatch_map['undo_document_checkout'] = 857 $this->__dispatch_map['undo_document_checkout'] =
773 array('in' => array('session_id'=>'string','document_id'=>'int','reason' =>'string'), 858 array('in' => array('session_id'=>'string','document_id'=>'int','reason' =>'string'),
@@ -779,8 +864,6 @@ class KTWebService @@ -779,8 +864,6 @@ class KTWebService
779 $this->__dispatch_map['undo_document_checkout']['out'] = array('return' => "{urn:$this->namespace}kt_document_detail" ); 864 $this->__dispatch_map['undo_document_checkout']['out'] = array('return' => "{urn:$this->namespace}kt_document_detail" );
780 } 865 }
781 866
782 -  
783 -  
784 // download_document 867 // download_document
785 $this->__dispatch_map['download_document'] = 868 $this->__dispatch_map['download_document'] =
786 array('in' => array('session_id'=>'string','document_id'=>'int' ), 869 array('in' => array('session_id'=>'string','document_id'=>'int' ),
@@ -800,13 +883,19 @@ class KTWebService @@ -800,13 +883,19 @@ class KTWebService
800 'alias' => 'download_small_document' 883 'alias' => 'download_small_document'
801 ); 884 );
802 885
  886 + if ($this->version >= 3)
  887 + {
  888 + $this->__dispatch_map['download_document']['in'] = array('session_id'=>'string','document_id'=>'int', 'version'=>'string' );
  889 + $this->__dispatch_map['download_small_document']['in'] = array('session_id'=>'string','document_id'=>'int', 'version'=>'string' );
  890 + $this->__dispatch_map['download_base64_document']['in'] = array('session_id'=>'string','document_id'=>'int', 'version'=>'string' );
  891 + }
  892 +
803 // delete_document 893 // delete_document
804 $this->__dispatch_map['delete_document'] = 894 $this->__dispatch_map['delete_document'] =
805 array('in' => array('session_id'=>'string','document_id'=>'int','reason'=>'string'), 895 array('in' => array('session_id'=>'string','document_id'=>'int','reason'=>'string'),
806 'out' => array( 'return' => "{urn:$this->namespace}kt_response" ), 896 'out' => array( 'return' => "{urn:$this->namespace}kt_response" ),
807 ); 897 );
808 898
809 -  
810 // change_document_owner 899 // change_document_owner
811 $this->__dispatch_map['change_document_owner'] = 900 $this->__dispatch_map['change_document_owner'] =
812 array('in' => array('session_id'=>'string','document_id'=>'int','username'=>'string','reason'=>'string'), 901 array('in' => array('session_id'=>'string','document_id'=>'int','username'=>'string','reason'=>'string'),
@@ -818,7 +907,6 @@ class KTWebService @@ -818,7 +907,6 @@ class KTWebService
818 $this->__dispatch_map['change_document_owner']['out'] = array( 'return' => "{urn:$this->namespace}kt_document_detail" ); 907 $this->__dispatch_map['change_document_owner']['out'] = array( 'return' => "{urn:$this->namespace}kt_document_detail" );
819 } 908 }
820 909
821 -  
822 // copy_document 910 // copy_document
823 $this->__dispatch_map['copy_document'] = 911 $this->__dispatch_map['copy_document'] =
824 array('in' => array('session_id'=>'string','document_id'=>'int','folder_id'=>'int','reason'=>'string','newtitle'=>'string','newfilename'=>'string'), 912 array('in' => array('session_id'=>'string','document_id'=>'int','folder_id'=>'int','reason'=>'string','newtitle'=>'string','newfilename'=>'string'),
@@ -858,7 +946,6 @@ class KTWebService @@ -858,7 +946,6 @@ class KTWebService
858 $this->__dispatch_map['rename_document_filename']['out'] = array( 'return' => "{urn:$this->namespace}kt_document_detail" ); 946 $this->__dispatch_map['rename_document_filename']['out'] = array( 'return' => "{urn:$this->namespace}kt_document_detail" );
859 } 947 }
860 948
861 -  
862 // change_document_type 949 // change_document_type
863 $this->__dispatch_map['change_document_type'] = 950 $this->__dispatch_map['change_document_type'] =
864 array('in' => array('session_id'=>'string','document_id'=>'int', 'documenttype'=>'string' ), 951 array('in' => array('session_id'=>'string','document_id'=>'int', 'documenttype'=>'string' ),
@@ -916,6 +1003,11 @@ class KTWebService @@ -916,6 +1003,11 @@ class KTWebService
916 'out' => array( 'return' => "{urn:$this->namespace}kt_metadata_response" ), 1003 'out' => array( 'return' => "{urn:$this->namespace}kt_metadata_response" ),
917 ); 1004 );
918 1005
  1006 + if ($this->version >= 3)
  1007 + {
  1008 + $this->__dispatch_map['get_document_metadata']['in'] = array('session_id'=>'string','document_id'=>'int', 'version'=>'string');
  1009 + }
  1010 +
919 // get_document_type_metadata 1011 // get_document_type_metadata
920 $this->__dispatch_map['get_document_type_metadata'] = 1012 $this->__dispatch_map['get_document_type_metadata'] =
921 array('in' => array('session_id'=>'string','document_type'=>'string' ), 1013 array('in' => array('session_id'=>'string','document_type'=>'string' ),
@@ -934,17 +1026,14 @@ class KTWebService @@ -934,17 +1026,14 @@ class KTWebService
934 'out' => array( 'return' => "{urn:$this->namespace}kt_document_detail" ) 1026 'out' => array( 'return' => "{urn:$this->namespace}kt_document_detail" )
935 ); 1027 );
936 1028
937 -  
938 } 1029 }
939 1030
940 -  
941 //get_document_workflow_transitions 1031 //get_document_workflow_transitions
942 $this->__dispatch_map['get_document_workflow_transitions'] = 1032 $this->__dispatch_map['get_document_workflow_transitions'] =
943 array('in' => array('session_id'=>'string','document_id'=>'int' ), 1033 array('in' => array('session_id'=>'string','document_id'=>'int' ),
944 'out' => array( 'return' => "{urn:$this->namespace}kt_workflow_transitions_response" ), 1034 'out' => array( 'return' => "{urn:$this->namespace}kt_workflow_transitions_response" ),
945 ); 1035 );
946 1036
947 -  
948 //get_document_workflow_state 1037 //get_document_workflow_state
949 $this->__dispatch_map['get_document_workflow_state'] = 1038 $this->__dispatch_map['get_document_workflow_state'] =
950 array('in' => array('session_id'=>'string','document_id'=>'int' ), 1039 array('in' => array('session_id'=>'string','document_id'=>'int' ),
@@ -957,7 +1046,6 @@ class KTWebService @@ -957,7 +1046,6 @@ class KTWebService
957 'out' => array( 'return' => "{urn:$this->namespace}kt_document_transaction_history_response" ), 1046 'out' => array( 'return' => "{urn:$this->namespace}kt_document_transaction_history_response" ),
958 ); 1047 );
959 1048
960 -  
961 // get_document_version_history 1049 // get_document_version_history
962 $this->__dispatch_map['get_document_version_history'] = 1050 $this->__dispatch_map['get_document_version_history'] =
963 array('in' => array('session_id'=>'string','document_id'=>'int' ), 1051 array('in' => array('session_id'=>'string','document_id'=>'int' ),
@@ -982,7 +1070,21 @@ class KTWebService @@ -982,7 +1070,21 @@ class KTWebService
982 'out' => array( 'return' => "{urn:$this->namespace}kt_client_policies_response" ), 1070 'out' => array( 'return' => "{urn:$this->namespace}kt_client_policies_response" ),
983 ); 1071 );
984 1072
  1073 + if ($this->version >= 2)
  1074 + {
  1075 + $this->__dispatch_map['get_client_policies']['in'] = array('session_id'=>'string', 'client'=>'string');
  1076 + }
  1077 + }
985 1078
  1079 + function get()
  1080 + {
  1081 + static $ws = null;
  1082 + if (is_null($ws))
  1083 + {
  1084 + $classname = KTWebService::$wsclass;
  1085 + $ws = new $classname();
  1086 + }
  1087 + return $ws;
986 } 1088 }
987 1089
988 function debug($msg, $function = null, $level=0) 1090 function debug($msg, $function = null, $level=0)
@@ -1012,6 +1114,14 @@ class KTWebService @@ -1012,6 +1114,14 @@ class KTWebService
1012 } 1114 }
1013 } 1115 }
1014 1116
  1117 + function _status($code, $message='')
  1118 + {
  1119 + if (PEAR::isError($message))
  1120 + {
  1121 + $message = $message->getMessage();
  1122 + }
  1123 + return array('status_code'=>$code, 'message'=>$message);
  1124 + }
1015 1125
1016 /** 1126 /**
1017 * This is used by all exposed functions dependant on the sessionid. 1127 * This is used by all exposed functions dependant on the sessionid.
@@ -1032,12 +1142,7 @@ class KTWebService @@ -1032,12 +1142,7 @@ class KTWebService
1032 1142
1033 if ( PEAR::isError($session)) 1143 if ( PEAR::isError($session))
1034 { 1144 {
1035 - $response=array(  
1036 - 'status_code'=>KTWS_ERR_INVALID_SESSION,  
1037 - 'message'=>$session->getMessage()  
1038 - );  
1039 -  
1040 - return $response; 1145 + return KTWebService::_status(KTWS_ERR_INVALID_SESSION,$session);
1041 } 1146 }
1042 $this->ktapi = $kt; 1147 $this->ktapi = $kt;
1043 return $kt; 1148 return $kt;
@@ -1051,10 +1156,7 @@ class KTWebService @@ -1051,10 +1156,7 @@ class KTWebService
1051 */ 1156 */
1052 function anonymous_login($ip=null) 1157 function anonymous_login($ip=null)
1053 { 1158 {
1054 - $response = array(  
1055 - 'status_code'=>KTWS_ERR_AUTHENTICATION_ERROR,  
1056 - 'message'=>'',  
1057 - ); 1159 + $response = KTWebService::_status(KTWS_ERR_AUTHENTICATION_ERROR);
1058 1160
1059 $kt = new KTAPI(); 1161 $kt = new KTAPI();
1060 1162
@@ -1086,10 +1188,7 @@ class KTWebService @@ -1086,10 +1188,7 @@ class KTWebService
1086 */ 1188 */
1087 function login($username, $password, $ip=null) 1189 function login($username, $password, $ip=null)
1088 { 1190 {
1089 - $response = array(  
1090 - 'status_code'=>KTWS_ERR_AUTHENTICATION_ERROR,  
1091 - 'message'=>'',  
1092 - ); 1191 + $response = KTWebService::_status(KTWS_ERR_AUTHENTICATION_ERROR);
1093 1192
1094 $kt = new KTAPI(); 1193 $kt = new KTAPI();
1095 1194
@@ -1126,10 +1225,7 @@ class KTWebService @@ -1126,10 +1225,7 @@ class KTWebService
1126 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 1225 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
1127 } 1226 }
1128 1227
1129 - $response=array(  
1130 - 'status_code'=>KTWS_ERR_INVALID_SESSION,  
1131 - 'message'=>''  
1132 - ); 1228 + $response = KTWebService::_status(KTWS_ERR_INVALID_SESSION);
1133 1229
1134 $session = &$kt->get_session(); 1230 $session = &$kt->get_session();
1135 if (PEAR::isError($session)) 1231 if (PEAR::isError($session))
@@ -1164,10 +1260,7 @@ class KTWebService @@ -1164,10 +1260,7 @@ class KTWebService
1164 $folder = &$kt->get_folder_by_id($folder_id); 1260 $folder = &$kt->get_folder_by_id($folder_id);
1165 if (PEAR::isError($folder)) 1261 if (PEAR::isError($folder))
1166 { 1262 {
1167 - $response=array(  
1168 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1169 - 'message'=>$folder->getMessage()  
1170 - ); 1263 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER,$folder);
1171 $this->debug("get_folder_detail - " . $folder->getMessage(), $session_id); 1264 $this->debug("get_folder_detail - " . $folder->getMessage(), $session_id);
1172 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $response); 1265 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $response);
1173 } 1266 }
@@ -1198,10 +1291,7 @@ class KTWebService @@ -1198,10 +1291,7 @@ class KTWebService
1198 $folder = &$kt->get_folder_by_name($folder_name); 1291 $folder = &$kt->get_folder_by_name($folder_name);
1199 if (PEAR::isError($folder)) 1292 if (PEAR::isError($folder))
1200 { 1293 {
1201 - $response=array(  
1202 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1203 - 'message'=>$folder->getMessage()  
1204 - ); 1294 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER,$folder);
1205 $this->debug("get_folder_detail_by_name - cannot get folder $folder_name - " . $folder->getMessage(), $session_id); 1295 $this->debug("get_folder_detail_by_name - cannot get folder $folder_name - " . $folder->getMessage(), $session_id);
1206 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $response); 1296 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $response);
1207 } 1297 }
@@ -1211,48 +1301,6 @@ class KTWebService @@ -1211,48 +1301,6 @@ class KTWebService
1211 $detail['message']=''; 1301 $detail['message']='';
1212 1302
1213 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $detail); 1303 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $detail);
1214 -  
1215 - }  
1216 -  
1217 - /**  
1218 - * Encodes an array as kt_folder_item  
1219 - *  
1220 - * @param array $item  
1221 - * @param string $name  
1222 - * @return SOAP_Value of kt_folder_item  
1223 - * @access private  
1224 - * @static  
1225 - */  
1226 - function _encode_folder_item($item, $name='item')  
1227 - {  
1228 - $item['id'] = (int) $item['id'];  
1229 -  
1230 - if (!empty($item['items']))  
1231 - {  
1232 - $item['items'] = KTWebService::_encode_folder_items($item['items']);  
1233 - }  
1234 -  
1235 - return new SOAP_Value($name,"{urn:$this->namespace}kt_folder_item", $item);  
1236 - }  
1237 -  
1238 - /**  
1239 - * Encodes an array as kt_folder_items  
1240 - *  
1241 - * @param array $items  
1242 - * @param string $name  
1243 - * @return SOAP_Value of kt_folder_items  
1244 - * @access private  
1245 - * @static  
1246 - */  
1247 - function _encode_folder_items($items, $name='items')  
1248 - {  
1249 - $encoded=array();  
1250 - foreach($items as $item)  
1251 - {  
1252 - $encoded[] = KTWebService::_encode_folder_item($item);  
1253 - }  
1254 -  
1255 - return new SOAP_Value($name,"{urn:$this->namespace}kt_folder_items", $encoded);  
1256 } 1304 }
1257 1305
1258 /** 1306 /**
@@ -1264,12 +1312,17 @@ class KTWebService @@ -1264,12 +1312,17 @@ class KTWebService
1264 * @access private 1312 * @access private
1265 * @static 1313 * @static
1266 */ 1314 */
1267 - function _encode_folder_contents($contents, $name='return') 1315 + function _encode_folder_items($items)
1268 { 1316 {
1269 - $contents['items'] = KTWebService::_encode_folder_items($contents['items']);  
1270 - return new SOAP_Value($name,"{urn:$this->namespace}kt_folder_contents", $contents);  
1271 - } 1317 + foreach($items as $key=>$item)
  1318 + {
  1319 + $item['id'] = (int) $item['id'];
  1320 + $item['items'] = KTWebService::_encode_folder_items($item['items']);
1272 1321
  1322 + $items[$key] = new SOAP_Value('item',"{urn:$this->namespace}kt_folder_item", $item);
  1323 + }
  1324 + return new SOAP_Value('items',"{urn:$this->namespace}kt_folder_items", $items);
  1325 + }
1273 1326
1274 /** 1327 /**
1275 * Returns the contents of a folder. 1328 * Returns the contents of a folder.
@@ -1292,10 +1345,8 @@ class KTWebService @@ -1292,10 +1345,8 @@ class KTWebService
1292 $folder = &$kt->get_folder_by_id($folder_id); 1345 $folder = &$kt->get_folder_by_id($folder_id);
1293 if (PEAR::isError($folder)) 1346 if (PEAR::isError($folder))
1294 { 1347 {
1295 - $response=array(  
1296 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1297 - 'message'=>$folder->getMessage()  
1298 - ); 1348 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER,$folder);
  1349 +
1299 $this->debug("get_folder_contents - cannot get folderid $folder_id - " . $folder->getMessage(), $session_id); 1350 $this->debug("get_folder_contents - cannot get folderid $folder_id - " . $folder->getMessage(), $session_id);
1300 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_contents", $response); 1351 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_contents", $response);
1301 } 1352 }
@@ -1308,10 +1359,10 @@ class KTWebService @@ -1308,10 +1359,10 @@ class KTWebService
1308 'folder_id' => $folder_id+0, 1359 'folder_id' => $folder_id+0,
1309 'folder_name'=>$folder->get_folder_name(), 1360 'folder_name'=>$folder->get_folder_name(),
1310 'full_path'=>$folder->get_full_path(), 1361 'full_path'=>$folder->get_full_path(),
1311 - 'items'=>$listing 1362 + 'items'=>KTWebService::_encode_folder_items($listing)
1312 ); 1363 );
1313 1364
1314 - return KTWebService::_encode_folder_contents($contents); 1365 + return new SOAP_Value($name,"{urn:$this->namespace}kt_folder_contents", $contents);
1315 } 1366 }
1316 1367
1317 /** 1368 /**
@@ -1335,10 +1386,8 @@ class KTWebService @@ -1335,10 +1386,8 @@ class KTWebService
1335 $folder = &$kt->get_folder_by_id($folder_id); 1386 $folder = &$kt->get_folder_by_id($folder_id);
1336 if (PEAR::isError($folder)) 1387 if (PEAR::isError($folder))
1337 { 1388 {
1338 - $response=array(  
1339 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1340 - 'message'=>$folder->getMessage()  
1341 - ); 1389 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER,$folder);
  1390 +
1342 $this->debug("create_folder - cannot get folderid $folder_id - " . $folder->getMessage(), $session_id); 1391 $this->debug("create_folder - cannot get folderid $folder_id - " . $folder->getMessage(), $session_id);
1343 1392
1344 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $response); 1393 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $response);
@@ -1347,10 +1396,7 @@ class KTWebService @@ -1347,10 +1396,7 @@ class KTWebService
1347 $newfolder = &$folder->add_folder($folder_name); 1396 $newfolder = &$folder->add_folder($folder_name);
1348 if (PEAR::isError($newfolder)) 1397 if (PEAR::isError($newfolder))
1349 { 1398 {
1350 - $response=array(  
1351 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1352 - 'message'=>$newfolder->getMessage()  
1353 - ); 1399 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER,$newfolder);
1354 $this->debug("create_folder - cannot create folder $folder_name - " . $folder->getMessage(), $session_id); 1400 $this->debug("create_folder - cannot create folder $folder_name - " . $folder->getMessage(), $session_id);
1355 1401
1356 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $response); 1402 return new SOAP_Value('return',"{urn:$this->namespace}kt_folder_detail", $response);
@@ -1380,10 +1426,7 @@ class KTWebService @@ -1380,10 +1426,7 @@ class KTWebService
1380 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 1426 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
1381 } 1427 }
1382 1428
1383 - $response=array(  
1384 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1385 - 'message'=>''  
1386 - ); 1429 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER);
1387 1430
1388 $folder = &$kt->get_folder_by_id($folder_id); 1431 $folder = &$kt->get_folder_by_id($folder_id);
1389 if (PEAR::isError($folder)) 1432 if (PEAR::isError($folder))
@@ -1424,10 +1467,7 @@ class KTWebService @@ -1424,10 +1467,7 @@ class KTWebService
1424 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 1467 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
1425 } 1468 }
1426 1469
1427 - $response=array(  
1428 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1429 - 'message'=>''  
1430 - ); 1470 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER);
1431 1471
1432 $folder = &$kt->get_folder_by_id($folder_id); 1472 $folder = &$kt->get_folder_by_id($folder_id);
1433 if (PEAR::isError($folder)) 1473 if (PEAR::isError($folder))
@@ -1469,10 +1509,7 @@ class KTWebService @@ -1469,10 +1509,7 @@ class KTWebService
1469 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 1509 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
1470 } 1510 }
1471 1511
1472 - $response=array(  
1473 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1474 - 'message'=>''  
1475 - ); 1512 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER);
1476 1513
1477 $src_folder = &$kt->get_folder_by_id($source_id); 1514 $src_folder = &$kt->get_folder_by_id($source_id);
1478 if (PEAR::isError($src_folder)) 1515 if (PEAR::isError($src_folder))
@@ -1524,10 +1561,7 @@ class KTWebService @@ -1524,10 +1561,7 @@ class KTWebService
1524 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 1561 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
1525 } 1562 }
1526 1563
1527 - $response=array(  
1528 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1529 - 'message'=>''  
1530 - ); 1564 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER);
1531 1565
1532 $src_folder = &$kt->get_folder_by_id($source_id); 1566 $src_folder = &$kt->get_folder_by_id($source_id);
1533 if (PEAR::isError($src_folder)) 1567 if (PEAR::isError($src_folder))
@@ -1574,10 +1608,7 @@ class KTWebService @@ -1574,10 +1608,7 @@ class KTWebService
1574 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_types_response", $kt); 1608 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_types_response", $kt);
1575 } 1609 }
1576 1610
1577 - $response=array(  
1578 - 'status_code'=>KTWS_ERR_PROBLEM,  
1579 - 'message'=>''  
1580 - ); 1611 + $response = KTWebService::_status(KTWS_ERR_PROBLEM);
1581 1612
1582 $result = $kt->get_documenttypes(); 1613 $result = $kt->get_documenttypes();
1583 if (PEAR::isError($result)) 1614 if (PEAR::isError($result))
@@ -1604,10 +1635,7 @@ class KTWebService @@ -1604,10 +1635,7 @@ class KTWebService
1604 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_types_response", $kt); 1635 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_types_response", $kt);
1605 } 1636 }
1606 1637
1607 - $response=array(  
1608 - 'status_code'=>KTWS_ERR_PROBLEM,  
1609 - 'message'=>''  
1610 - ); 1638 + $response = KTWebService::_status(KTWS_ERR_PROBLEM);
1611 1639
1612 $result = $kt->get_document_link_types(); 1640 $result = $kt->get_document_link_types();
1613 if (PEAR::isError($result)) 1641 if (PEAR::isError($result))
@@ -1644,10 +1672,8 @@ class KTWebService @@ -1644,10 +1672,8 @@ class KTWebService
1644 $document = $kt->get_document_by_id($document_id); 1672 $document = $kt->get_document_by_id($document_id);
1645 if (PEAR::isError($document)) 1673 if (PEAR::isError($document))
1646 { 1674 {
1647 - $response=array(  
1648 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
1649 - 'message'=>$document->getMessage()  
1650 - ); 1675 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT,$document);
  1676 +
1651 $this->debug("get_document_detail - cannot get documentid $document_id - " . $document->getMessage(), $session_id); 1677 $this->debug("get_document_detail - cannot get documentid $document_id - " . $document->getMessage(), $session_id);
1652 1678
1653 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 1679 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);
@@ -1676,35 +1702,59 @@ class KTWebService @@ -1676,35 +1702,59 @@ class KTWebService
1676 $detail['version_history'] = array(); 1702 $detail['version_history'] = array();
1677 $detail['transaction_history'] = array(); 1703 $detail['transaction_history'] = array();
1678 1704
1679 -  
1680 if (stripos($detailstr,'M') !== false) 1705 if (stripos($detailstr,'M') !== false)
1681 { 1706 {
1682 $response = $this->get_document_metadata($session_id, $document_id); 1707 $response = $this->get_document_metadata($session_id, $document_id);
1683 $detail['metadata'] = $response->value['metadata']; 1708 $detail['metadata'] = $response->value['metadata'];
  1709 + $detail['metadata']->name = 'metadata';
  1710 + }
  1711 + else
  1712 + {
  1713 + $detail['metadata'] = KTWebService::_encode_metadata_fields($detail['metadata']);
1684 } 1714 }
1685 1715
1686 if (stripos($detailstr,'L') !== false) 1716 if (stripos($detailstr,'L') !== false)
1687 { 1717 {
1688 - $response = $this->get_document_metadata($session_id, $document_id); 1718 + $response = $this->get_document_links($session_id, $document_id);
1689 $detail['links'] = $response->value['links']; 1719 $detail['links'] = $response->value['links'];
  1720 + $detail['links']->name = 'links';
  1721 + }
  1722 + else
  1723 + {
  1724 + $detail['links'] = KTWebService::_encode_document_links($detail['links']);
1690 } 1725 }
1691 1726
1692 if (stripos($detailstr,'T') !== false) 1727 if (stripos($detailstr,'T') !== false)
1693 { 1728 {
1694 $response = $this->get_document_workflow_transitions($session_id, $document_id); 1729 $response = $this->get_document_workflow_transitions($session_id, $document_id);
1695 - $detail['transitions'] = $response->value['transitions']; 1730 + $detail['transitions'] = $response->value['transitions'] ;
  1731 + $detail['transitions']->name = 'transitions';
  1732 + }
  1733 + else
  1734 + {
  1735 + $detail['transitions'] = KTWebService::_encode_document_workflow_transitions($detail['transitions']);
1696 } 1736 }
1697 1737
1698 if (stripos($detailstr,'V') !== false) 1738 if (stripos($detailstr,'V') !== false)
1699 { 1739 {
1700 $response = $this->get_document_version_history($session_id, $document_id); 1740 $response = $this->get_document_version_history($session_id, $document_id);
1701 - $detail['version_history'] = $response->value['history']; 1741 + $detail['version_history'] = $response->value['history'];
  1742 + $detail['version_history']->name = 'version_history';
  1743 + }
  1744 + else
  1745 + {
  1746 + $detail['version_history'] = KTWebService::_encode_version_history($detail['version_history'],'version_history');
1702 } 1747 }
1703 1748
1704 if (stripos($detailstr,'H') !== false) 1749 if (stripos($detailstr,'H') !== false)
1705 { 1750 {
1706 $response = $this->get_document_transaction_history($session_id, $document_id); 1751 $response = $this->get_document_transaction_history($session_id, $document_id);
1707 - $detail['transaction_history'] = $response->value['history']; 1752 + $detail['transaction_history'] = $response->value['history'];
  1753 + $detail['transaction_history']->name = 'transaction_history';
  1754 + }
  1755 + else
  1756 + {
  1757 + $detail['transaction_history'] = KTWebService::_encode_transaction_history($detail['transaction_history'],'transaction_history');
1708 } 1758 }
1709 1759
1710 } 1760 }
@@ -1734,10 +1784,9 @@ class KTWebService @@ -1734,10 +1784,9 @@ class KTWebService
1734 function get_document_detail_by_name($session_id, $folder_id, $document_name, $what='T', $detail='') 1784 function get_document_detail_by_name($session_id, $folder_id, $document_name, $what='T', $detail='')
1735 { 1785 {
1736 $this->debug("get_document_detail_by_name('$session_id','$document_name','$what','$detail')"); 1786 $this->debug("get_document_detail_by_name('$session_id','$document_name','$what','$detail')");
1737 - $response=array(  
1738 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1739 - 'message'=>''  
1740 - ); 1787 +
  1788 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER);
  1789 +
1741 if (empty($document_name)) 1790 if (empty($document_name))
1742 { 1791 {
1743 $response['message'] = 'Document_name is empty.'; 1792 $response['message'] = 'Document_name is empty.';
@@ -1785,64 +1834,7 @@ class KTWebService @@ -1785,64 +1834,7 @@ class KTWebService
1785 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 1834 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);
1786 } 1835 }
1787 1836
1788 - $detailstr = $detail;  
1789 -  
1790 - $detail = $document->get_detail();  
1791 - if (PEAR::isError($detail))  
1792 - {  
1793 - $response['status_code'] = KTWS_ERR_PROBLEM;  
1794 - $response['message'] = $detail->getMessage();  
1795 -  
1796 - $this->debug("get_document_detail_by_name - cannot get document detail - " . $detail->getMessage(), $session_id);  
1797 -  
1798 - return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);  
1799 - }  
1800 -  
1801 - $detail['status_code']=KTWS_SUCCESS;  
1802 - $detail['message']='';  
1803 -  
1804 -  
1805 - if ($this->version >= 2)  
1806 - {  
1807 -  
1808 - $detail['metadata'] = array();  
1809 - $detail['links'] = array();  
1810 - $detail['transitions'] = array();  
1811 - $detail['version_history'] = array();  
1812 - $detail['transaction_history'] = array();  
1813 -  
1814 - if (stripos($detailstr,'M') !== false)  
1815 - {  
1816 - $response = $this->get_document_metadata($session_id, $document_id);  
1817 - $detail['metadata'] = $response->value['metadata'];  
1818 - }  
1819 -  
1820 - if (stripos($detailstr,'L') !== false)  
1821 - {  
1822 - $response = $this->get_document_metadata($session_id, $document_id);  
1823 - $detail['links'] = $response->value['links'];  
1824 - }  
1825 -  
1826 - if (stripos($detailstr,'T') !== false)  
1827 - {  
1828 - $response = $this->get_document_workflow_transitions($session_id, $document_id);  
1829 - $detail['transitions'] = $response->value['transitions'];  
1830 - }  
1831 -  
1832 - if (stripos($detailstr,'V') !== false)  
1833 - {  
1834 - $response = $this->get_document_version_history($session_id, $document_id);  
1835 - $detail['version_history'] = $response->value['history'];  
1836 - }  
1837 -  
1838 - if (stripos($detailstr,'H') !== false)  
1839 - {  
1840 - $response = $this->get_document_transaction_history($session_id, $document_id);  
1841 - $detail['transaction_history'] = $response->value['history'];  
1842 - }  
1843 - }  
1844 -  
1845 - return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $detail); 1837 + return $this->get_document_detail($session_id, $document->documentid, $detail);
1846 } 1838 }
1847 1839
1848 /** 1840 /**
@@ -1868,15 +1860,11 @@ class KTWebService @@ -1868,15 +1860,11 @@ class KTWebService
1868 // we need to add some security to ensure that people don't frig the checkin process to access restricted files. 1860 // we need to add some security to ensure that people don't frig the checkin process to access restricted files.
1869 // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome. 1861 // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome.
1870 $upload_manager = new KTUploadManager(); 1862 $upload_manager = new KTUploadManager();
1871 - $tempdir = substr($tempfilename,0,strlen($upload_manager->temp_dir));  
1872 - if ($tempdir != $upload_manager->temp_dir) 1863 + if (!$upload_manager->is_valid_temporary_file($tempfilename))
1873 { 1864 {
1874 - $response=array(  
1875 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1876 - 'message'=>'Invalid temporary file.'  
1877 - ); 1865 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT,"Invalid temporary file: $tempfilename. Not compatible with $upload_manager->temp_dir.");
1878 1866
1879 - $this->debug("add_document - $upload_manager->temp_dir != $tempdir", $session_id); 1867 + $this->debug("add_document - Invalid temporary file: $tempfilename. Not compatible with $upload_manager->temp_dir.", $session_id);
1880 1868
1881 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 1869 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);
1882 } 1870 }
@@ -1884,10 +1872,7 @@ class KTWebService @@ -1884,10 +1872,7 @@ class KTWebService
1884 $folder = &$kt->get_folder_by_id($folder_id); 1872 $folder = &$kt->get_folder_by_id($folder_id);
1885 if (PEAR::isError($folder)) 1873 if (PEAR::isError($folder))
1886 { 1874 {
1887 - $response=array(  
1888 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
1889 - 'message'=>$folder->getMessage()  
1890 - ); 1875 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER,$folder);
1891 1876
1892 $this->debug("add_document - cannot get folder $folder_id - " . $folder->getMessage(), $session_id); 1877 $this->debug("add_document - cannot get folder $folder_id - " . $folder->getMessage(), $session_id);
1893 1878
@@ -1897,13 +1882,8 @@ class KTWebService @@ -1897,13 +1882,8 @@ class KTWebService
1897 $document = &$folder->add_document($title, $filename, $documenttype, $tempfilename); 1882 $document = &$folder->add_document($title, $filename, $documenttype, $tempfilename);
1898 if (PEAR::isError($document)) 1883 if (PEAR::isError($document))
1899 { 1884 {
1900 - $response=array(  
1901 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
1902 - 'message'=>$document->getMessage()  
1903 - );  
1904 - 1885 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT,$document);
1905 $this->debug("add_document - cannot add document - " . $document->getMessage(), $session_id); 1886 $this->debug("add_document - cannot add document - " . $document->getMessage(), $session_id);
1906 -  
1907 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 1887 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);
1908 } 1888 }
1909 1889
@@ -1982,8 +1962,6 @@ class KTWebService @@ -1982,8 +1962,6 @@ class KTWebService
1982 return $update_result; 1962 return $update_result;
1983 } 1963 }
1984 1964
1985 -  
1986 -  
1987 /** 1965 /**
1988 * Adds a document to the repository. 1966 * Adds a document to the repository.
1989 * 1967 *
@@ -2001,77 +1979,37 @@ class KTWebService @@ -2001,77 +1979,37 @@ class KTWebService
2001 $kt = &$this->get_ktapi($session_id ); 1979 $kt = &$this->get_ktapi($session_id );
2002 if (is_array($kt)) 1980 if (is_array($kt))
2003 { 1981 {
2004 - return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $kt);  
2005 - }  
2006 -  
2007 - // create a temporary file  
2008 - $oConfig = KTConfig::getSingleton();  
2009 - $tmp_dir = $oConfig->get('webservice/uploadDirectory');  
2010 -  
2011 - $tempfilename = tempnam($tmp_dir,'sa_');  
2012 - if (!is_writable($tempfilename))  
2013 - {  
2014 - $response=array(  
2015 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
2016 - 'message'=>'Cannot write to temp folder: ' + $tempfilename  
2017 - );  
2018 - $this->debug("add_small_document - cannot write $tempfilename", $session_id);  
2019 -  
2020 - return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);  
2021 - }  
2022 -  
2023 - // we need to add some security to ensure that people don't frig the checkin process to access restricted files.  
2024 - // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome.  
2025 - $upload_manager = new KTUploadManager();  
2026 - $tempdir = substr($tempfilename,0,strlen($upload_manager->temp_dir));  
2027 - if ( $tempdir != $upload_manager->temp_dir)  
2028 - {  
2029 - $response=array(  
2030 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
2031 - 'message'=>'Invalid temporary file.'  
2032 - );  
2033 -  
2034 - $this->debug("add_small_document - $upload_manager->temp_dir != $tempdir ", $session_id);  
2035 -  
2036 - return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 1982 + return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $kt);
2037 } 1983 }
2038 1984
2039 $folder = &$kt->get_folder_by_id($folder_id); 1985 $folder = &$kt->get_folder_by_id($folder_id);
2040 if (PEAR::isError($folder)) 1986 if (PEAR::isError($folder))
2041 { 1987 {
2042 - $response=array(  
2043 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
2044 - 'message'=>$folder->getMessage()  
2045 - ); 1988 + $response = KTWebService::_status(KTWS_ERR_INVALID_FOLDER,$folder);
2046 $this->debug("add_small_document - cannot get folderid $folder_id - " . $folder->getMessage(), $session_id); 1989 $this->debug("add_small_document - cannot get folderid $folder_id - " . $folder->getMessage(), $session_id);
2047 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 1990 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);
2048 } 1991 }
2049 1992
2050 - // write to the temporary file  
2051 - $fp=fopen($tempfilename, 'wb');  
2052 - if ($fp === false)  
2053 - {  
2054 - $response=array(  
2055 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2056 - 'message'=>'Cannot write to temp file: ' + $tempfilename  
2057 - );  
2058 - $this->debug("add_small_document - cannot get folderid $folder_id" , $session_id); 1993 + $upload_manager = new KTUploadManager();
  1994 + $tempfilename = $upload_manager->store_base64_file($base64);
  1995 + if (PEAR::isError($tempfilename))
  1996 + {
  1997 + $reason = $tempfilename->getMessage();
  1998 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT,'Cannot write to temp file: ' + $tempfilename . ". Reason: $reason");
  1999 + $this->debug("add_small_document - cannot write $tempfilename. Reason: $reason", $session_id);
  2000 +
2059 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 2001 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);
2060 - }  
2061 - fwrite($fp, base64_decode($base64));  
2062 - fclose($fp); 2002 + }
2063 2003
2064 // simulate the upload 2004 // simulate the upload
2065 - $upload_manager->uploaded($filename,$tempfilename, 'A'); 2005 + $tempfilename = $upload_manager->uploaded($filename,$tempfilename, 'A');
2066 2006
2067 // add the document 2007 // add the document
2068 $document = &$folder->add_document($title, $filename, $documenttype, $tempfilename); 2008 $document = &$folder->add_document($title, $filename, $documenttype, $tempfilename);
2069 if (PEAR::isError($document)) 2009 if (PEAR::isError($document))
2070 { 2010 {
2071 - $response=array(  
2072 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2073 - 'message'=>$document->getMessage()  
2074 - ); 2011 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT,$document);
  2012 +
2075 $this->debug("add_small_document - cannot add document - " . $document->getMessage(), $session_id); 2013 $this->debug("add_small_document - cannot add document - " . $document->getMessage(), $session_id);
2076 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 2014 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);
2077 } 2015 }
@@ -2103,16 +2041,12 @@ class KTWebService @@ -2103,16 +2041,12 @@ class KTWebService
2103 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $kt); 2041 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $kt);
2104 } 2042 }
2105 2043
2106 - $response=array(  
2107 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2108 - 'message'=>'',  
2109 - ); 2044 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2110 2045
2111 - // we need to add some security to ensure that people don't frig the checkin process to access restricted files. 2046 + // we need to add some security to ensure that people don't frig the checkin process to access restricted files.
2112 // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome. 2047 // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome.
2113 $upload_manager = new KTUploadManager(); 2048 $upload_manager = new KTUploadManager();
2114 - $tempdir = substr($tempfilename,0,strlen($upload_manager->temp_dir));  
2115 - if ($tempdir != $upload_manager->temp_dir) 2049 + if (!$upload_manager->is_valid_temporary_file($tempfilename))
2116 { 2050 {
2117 $response['message'] = 'Invalid temporary file'; 2051 $response['message'] = 'Invalid temporary file';
2118 $this->debug("checkin_document - $upload_manager->temp_dir != $tempdir", $session_id); 2052 $this->debug("checkin_document - $upload_manager->temp_dir != $tempdir", $session_id);
@@ -2141,9 +2075,8 @@ class KTWebService @@ -2141,9 +2075,8 @@ class KTWebService
2141 return $this->get_document_detail($session_id, $document_id); 2075 return $this->get_document_detail($session_id, $document_id);
2142 } 2076 }
2143 2077
2144 -  
2145 - function checkin_small_document_with_metadata($session_id, $document_id, $filename, $reason, $base64, $major_update, $metadata, $sysdata)  
2146 - { 2078 + function checkin_small_document_with_metadata($session_id, $document_id, $filename, $reason, $base64, $major_update, $metadata, $sysdata)
  2079 + {
2147 $add_result = $this->checkin_small_document($session_id, $document_id, $filename, $reason, $base64, $major_update); 2080 $add_result = $this->checkin_small_document($session_id, $document_id, $filename, $reason, $base64, $major_update);
2148 2081
2149 $status_code = $add_result->value['status_code']; 2082 $status_code = $add_result->value['status_code'];
@@ -2173,10 +2106,10 @@ class KTWebService @@ -2173,10 +2106,10 @@ class KTWebService
2173 } 2106 }
2174 2107
2175 return $update_result; 2108 return $update_result;
2176 - } 2109 + }
2177 2110
2178 - function checkin_document_with_metadata($session_id, $document_id, $filename, $reason, $tempfilename, $major_update, $metadata, $sysdata)  
2179 - { 2111 + function checkin_document_with_metadata($session_id, $document_id, $filename, $reason, $tempfilename, $major_update, $metadata, $sysdata)
  2112 + {
2180 $add_result = $this->checkin_document($session_id, $document_id, $filename, $reason, $tempfilename, $major_update); 2113 $add_result = $this->checkin_document($session_id, $document_id, $filename, $reason, $tempfilename, $major_update);
2181 2114
2182 $status_code = $add_result->value['status_code']; 2115 $status_code = $add_result->value['status_code'];
@@ -2206,7 +2139,7 @@ class KTWebService @@ -2206,7 +2139,7 @@ class KTWebService
2206 } 2139 }
2207 2140
2208 return $update_result; 2141 return $update_result;
2209 - } 2142 + }
2210 2143
2211 2144
2212 /** 2145 /**
@@ -2229,55 +2162,21 @@ class KTWebService @@ -2229,55 +2162,21 @@ class KTWebService
2229 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $kt); 2162 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $kt);
2230 } 2163 }
2231 2164
2232 - $response=array(  
2233 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2234 - 'message'=>'',  
2235 - );  
2236 -  
2237 - // create a temporary file  
2238 - $oConfig = KTConfig::getSingleton();  
2239 - $tmp_dir = $oConfig->get('webservice/uploadDirectory');  
2240 -  
2241 - $tempfilename = tempnam($tmp_dir,'su_');  
2242 - if (!is_writable($tempfilename))  
2243 - {  
2244 - $response=array(  
2245 - 'status_code'=>KTWS_ERR_INVALID_FOLDER,  
2246 - 'message'=>'Cannot write to temp folder: ' + $tempfilename  
2247 - );  
2248 -  
2249 - $this->debug("checkin_small_document - $tempfilename is not writable", $session_id);  
2250 -  
2251 - return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);  
2252 - } 2165 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2253 2166
2254 - // we need to add some security to ensure that people don't frig the checkin process to access restricted files.  
2255 - // possibly should change 'tempfilename' to be a hash or id of some sort if this is troublesome.  
2256 $upload_manager = new KTUploadManager(); 2167 $upload_manager = new KTUploadManager();
2257 - $tempdir = substr($tempfilename,0,strlen($upload_manager->temp_dir));  
2258 - if ($tempdir != $upload_manager->temp_dir) 2168 + $tempfilename = $upload_manager->store_base64_file($base64, 'su_');
  2169 + if (PEAR::isError($tempfilename))
2259 { 2170 {
2260 - $response['message'] = 'Invalid temporary file';  
2261 - $this->debug("checkin_small_document - $upload_manager->temp_dir != $tempdir", $session_id);  
2262 - return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);  
2263 - } 2171 + $reason = $tempfilename->getMessage();
  2172 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT,'Cannot write to temp file: ' + $tempfilename . ". Reason: $reason");
  2173 + $this->debug("checkin_small_document - cannot write $tempfilename. Reason: $reason", $session_id);
2264 2174
2265 - // write to the temporary file  
2266 - $fp=fopen($tempfilename, 'wb');  
2267 - if ($fp === false)  
2268 - {  
2269 - $response=array(  
2270 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2271 - 'message'=>'Cannot write to temp file: ' + $tempfilename  
2272 - );  
2273 - $this->debug("checkin_small_document - cannot write $tempfilename", $session_id);  
2274 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response); 2175 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_detail", $response);
2275 - }  
2276 - fwrite($fp, base64_decode($base64));  
2277 - fclose($fp); 2176 + }
2278 2177
2279 // simulate the upload 2178 // simulate the upload
2280 - $upload_manager->uploaded($filename,$tempfilename, 'C'); 2179 + $tempfilename = $upload_manager->uploaded($filename,$tempfilename, 'C');
2281 2180
2282 $document = &$kt->get_document_by_id($document_id); 2181 $document = &$kt->get_document_by_id($document_id);
2283 if (PEAR::isError($document)) 2182 if (PEAR::isError($document))
@@ -2316,10 +2215,7 @@ class KTWebService @@ -2316,10 +2215,7 @@ class KTWebService
2316 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 2215 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
2317 } 2216 }
2318 2217
2319 - $response=array(  
2320 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2321 - 'message'=>''  
2322 - ); 2218 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2323 2219
2324 $document = &$kt->get_document_by_id($document_id); 2220 $document = &$kt->get_document_by_id($document_id);
2325 if (PEAR::isError($document)) 2221 if (PEAR::isError($document))
@@ -2381,10 +2277,7 @@ class KTWebService @@ -2381,10 +2277,7 @@ class KTWebService
2381 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 2277 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
2382 } 2278 }
2383 2279
2384 - $response=array(  
2385 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2386 - 'message'=>''  
2387 - ); 2280 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2388 2281
2389 $document = &$kt->get_document_by_id($document_id); 2282 $document = &$kt->get_document_by_id($document_id);
2390 if (PEAR::isError($document)) 2283 if (PEAR::isError($document))
@@ -2455,10 +2348,7 @@ class KTWebService @@ -2455,10 +2348,7 @@ class KTWebService
2455 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 2348 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
2456 } 2349 }
2457 2350
2458 - $response=array(  
2459 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2460 - 'message'=>''  
2461 - ); 2351 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2462 2352
2463 $document = &$kt->get_document_by_id($document_id); 2353 $document = &$kt->get_document_by_id($document_id);
2464 if (PEAR::isError($document)) 2354 if (PEAR::isError($document))
@@ -2496,7 +2386,7 @@ class KTWebService @@ -2496,7 +2386,7 @@ class KTWebService
2496 2386
2497 * @return kt_response. status_code can be KTWS_ERR_INVALID_SESSION, KTWS_ERR_INVALID_DOCUMENT or KTWS_SUCCESS 2387 * @return kt_response. status_code can be KTWS_ERR_INVALID_SESSION, KTWS_ERR_INVALID_DOCUMENT or KTWS_SUCCESS
2498 */ 2388 */
2499 - function download_document($session_id, $document_id) 2389 + function download_document($session_id, $document_id, $version=null)
2500 { 2390 {
2501 $this->debug("download_document('$session_id',$document_id)"); 2391 $this->debug("download_document('$session_id',$document_id)");
2502 2392
@@ -2506,10 +2396,7 @@ class KTWebService @@ -2506,10 +2396,7 @@ class KTWebService
2506 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 2396 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
2507 } 2397 }
2508 2398
2509 - $response=array(  
2510 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2511 - 'message'=>''  
2512 - ); 2399 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2513 2400
2514 $document = &$kt->get_document_by_id($document_id); 2401 $document = &$kt->get_document_by_id($document_id);
2515 if (PEAR::isError($document)) 2402 if (PEAR::isError($document))
@@ -2548,7 +2435,7 @@ class KTWebService @@ -2548,7 +2435,7 @@ class KTWebService
2548 2435
2549 * @return kt_response. status_code can be KTWS_ERR_INVALID_SESSION, KTWS_ERR_INVALID_DOCUMENT or KTWS_SUCCESS 2436 * @return kt_response. status_code can be KTWS_ERR_INVALID_SESSION, KTWS_ERR_INVALID_DOCUMENT or KTWS_SUCCESS
2550 */ 2437 */
2551 - function download_small_document($session_id, $document_id) 2438 + function download_small_document($session_id, $document_id, $version=null)
2552 { 2439 {
2553 $this->debug("download_small_document('$session_id',$document_id)"); 2440 $this->debug("download_small_document('$session_id',$document_id)");
2554 2441
@@ -2558,10 +2445,7 @@ class KTWebService @@ -2558,10 +2445,7 @@ class KTWebService
2558 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 2445 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
2559 } 2446 }
2560 2447
2561 - $response=array(  
2562 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2563 - 'message'=>''  
2564 - ); 2448 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2565 2449
2566 $document = &$kt->get_document_by_id($document_id); 2450 $document = &$kt->get_document_by_id($document_id);
2567 if (PEAR::isError($document)) 2451 if (PEAR::isError($document))
@@ -2620,10 +2504,8 @@ class KTWebService @@ -2620,10 +2504,8 @@ class KTWebService
2620 { 2504 {
2621 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 2505 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
2622 } 2506 }
2623 - $response=array(  
2624 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2625 - 'message'=>''  
2626 - ); 2507 +
  2508 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2627 2509
2628 $document = &$kt->get_document_by_id($document_id); 2510 $document = &$kt->get_document_by_id($document_id);
2629 if (PEAR::isError($document)) 2511 if (PEAR::isError($document))
@@ -2670,10 +2552,8 @@ class KTWebService @@ -2670,10 +2552,8 @@ class KTWebService
2670 { 2552 {
2671 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt); 2553 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt);
2672 } 2554 }
2673 - $response=array(  
2674 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2675 - 'message'=>''  
2676 - ); 2555 +
  2556 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2677 2557
2678 $document = &$kt->get_document_by_id($document_id); 2558 $document = &$kt->get_document_by_id($document_id);
2679 if (PEAR::isError($document)) 2559 if (PEAR::isError($document))
@@ -2687,6 +2567,7 @@ class KTWebService @@ -2687,6 +2567,7 @@ class KTWebService
2687 $result = $document->change_document_type($documenttype); 2567 $result = $document->change_document_type($documenttype);
2688 if (PEAR::isError($result)) 2568 if (PEAR::isError($result))
2689 { 2569 {
  2570 + $response['status_code'] = KTWS_ERR_INVALID_DOCUMENT_TYPE;
2690 $response['message'] = $result->getMessage(); 2571 $response['message'] = $result->getMessage();
2691 $this->debug("change_document_type - cannot change type - " . $result->getMessage(), $session_id); 2572 $this->debug("change_document_type - cannot change type - " . $result->getMessage(), $session_id);
2692 2573
@@ -2722,10 +2603,8 @@ class KTWebService @@ -2722,10 +2603,8 @@ class KTWebService
2722 { 2603 {
2723 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 2604 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
2724 } 2605 }
2725 - $response=array(  
2726 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2727 - 'message'=>''  
2728 - ); 2606 +
  2607 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2729 2608
2730 $document = &$kt->get_document_by_id($document_id); 2609 $document = &$kt->get_document_by_id($document_id);
2731 if (PEAR::isError($document)) 2610 if (PEAR::isError($document))
@@ -2780,10 +2659,8 @@ class KTWebService @@ -2780,10 +2659,8 @@ class KTWebService
2780 { 2659 {
2781 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 2660 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
2782 } 2661 }
2783 - $response=array(  
2784 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2785 - 'message'=>''  
2786 - ); 2662 +
  2663 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2787 2664
2788 $document = &$kt->get_document_by_id($document_id); 2665 $document = &$kt->get_document_by_id($document_id);
2789 if (PEAR::isError($document)) 2666 if (PEAR::isError($document))
@@ -2837,10 +2714,8 @@ class KTWebService @@ -2837,10 +2714,8 @@ class KTWebService
2837 { 2714 {
2838 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt); 2715 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt);
2839 } 2716 }
2840 - $response=array(  
2841 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2842 - 'message'=>''  
2843 - ); 2717 +
  2718 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2844 2719
2845 $document = &$kt->get_document_by_id($document_id); 2720 $document = &$kt->get_document_by_id($document_id);
2846 if (PEAR::isError($document)) 2721 if (PEAR::isError($document))
@@ -2890,10 +2765,8 @@ class KTWebService @@ -2890,10 +2765,8 @@ class KTWebService
2890 { 2765 {
2891 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt); 2766 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt);
2892 } 2767 }
2893 - $response=array(  
2894 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2895 - 'message'=>''  
2896 - ); 2768 +
  2769 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2897 2770
2898 $document = &$kt->get_document_by_id($document_id); 2771 $document = &$kt->get_document_by_id($document_id);
2899 if (PEAR::isError($document)) 2772 if (PEAR::isError($document))
@@ -2916,7 +2789,6 @@ class KTWebService @@ -2916,7 +2789,6 @@ class KTWebService
2916 return $this->get_document_detail($session_id, $document_id); 2789 return $this->get_document_detail($session_id, $document_id);
2917 } 2790 }
2918 2791
2919 -  
2920 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $response); 2792 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $response);
2921 } 2793 }
2922 2794
@@ -2946,10 +2818,7 @@ class KTWebService @@ -2946,10 +2818,7 @@ class KTWebService
2946 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt); 2818 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt);
2947 } 2819 }
2948 2820
2949 - $response=array(  
2950 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
2951 - 'message'=>''  
2952 - ); 2821 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
2953 2822
2954 $document = &$kt->get_document_by_id($document_id); 2823 $document = &$kt->get_document_by_id($document_id);
2955 if (PEAR::isError($document)) 2824 if (PEAR::isError($document))
@@ -2999,10 +2868,8 @@ class KTWebService @@ -2999,10 +2868,8 @@ class KTWebService
2999 { 2868 {
3000 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt); 2869 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt);
3001 } 2870 }
3002 - $response=array(  
3003 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3004 - 'message'=>''  
3005 - ); 2871 +
  2872 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3006 2873
3007 $document = &$kt->get_document_by_id($document_id); 2874 $document = &$kt->get_document_by_id($document_id);
3008 if (PEAR::isError($document)) 2875 if (PEAR::isError($document))
@@ -3049,10 +2916,8 @@ class KTWebService @@ -3049,10 +2916,8 @@ class KTWebService
3049 { 2916 {
3050 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt); 2917 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt);
3051 } 2918 }
3052 - $response=array(  
3053 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3054 - 'message'=>''  
3055 - ); 2919 +
  2920 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3056 2921
3057 $document = &$kt->get_document_by_id($document_id); 2922 $document = &$kt->get_document_by_id($document_id);
3058 if (PEAR::isError($document)) 2923 if (PEAR::isError($document))
@@ -3102,10 +2967,8 @@ class KTWebService @@ -3102,10 +2967,8 @@ class KTWebService
3102 { 2967 {
3103 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt); 2968 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt);
3104 } 2969 }
3105 - $response=array(  
3106 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3107 - 'message'=>''  
3108 - ); 2970 +
  2971 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3109 2972
3110 $document = &$kt->get_document_by_id($document_id); 2973 $document = &$kt->get_document_by_id($document_id);
3111 if (PEAR::isError($document)) 2974 if (PEAR::isError($document))
@@ -3133,100 +2996,41 @@ class KTWebService @@ -3133,100 +2996,41 @@ class KTWebService
3133 } 2996 }
3134 2997
3135 /** 2998 /**
3136 - * Encodes the array as a kt_metadata_selection_item  
3137 - *  
3138 - * @param aray $item  
3139 - * @param string $name  
3140 - * @return SOAP_Value of kt_metadata_selection_item  
3141 - * @access private  
3142 - * @static  
3143 - */  
3144 - function _encode_metadata_selection_item($item, $name='item')  
3145 - {  
3146 - if (!is_null($item['id']))  
3147 - {  
3148 - $item['id'] = (int) $item['id'];  
3149 - }  
3150 -  
3151 - if (!is_null($item['parent_id']))  
3152 - {  
3153 - $item['parent_id'] = (int) $item['parent_id'];  
3154 - }  
3155 -  
3156 - return new SOAP_Value($name,"{urn:$this->namespace}kt_metadata_selection_item", $item);  
3157 - }  
3158 -  
3159 - /**  
3160 - * Encode an array as kt_metadata_selection 2999 + * Encode an array as kt_metadata_fields
3161 * 3000 *
3162 - * @param array $selection 3001 + * @param array $fields
3163 * @param string $name 3002 * @param string $name
3164 - * @return SOAP_Value of kt_metadata_selection 3003 + * @return SOAP_Value of kt_metadata_fields
3165 * @access private 3004 * @access private
3166 * @static 3005 * @static
3167 */ 3006 */
3168 -  
3169 - function _encode_metadata_selection($selection, $name='selection') 3007 + function _encode_metadata_fields($fields)
3170 { 3008 {
3171 - $encoded=array();  
3172 - foreach($selection as $field)  
3173 - {  
3174 - $encoded[] = KTWebService::_encode_metadata_selection_item($field);  
3175 - }  
3176 -  
3177 - if (empty($encoded)) 3009 + foreach($fields as $key=>$field)
3178 { 3010 {
3179 - $encoded=null;  
3180 - } 3011 + $selection = $field['selection'];
  3012 + foreach($selection as $skey=>$sitem)
  3013 + {
  3014 + if (!is_null($item['id']))
  3015 + {
  3016 + $sitem['id'] = (int) $sitem['id'];
  3017 + }
  3018 +
  3019 + if (!is_null($sitem['parent_id']))
  3020 + {
  3021 + $sitem['parent_id'] = (int) $sitem['parent_id'];
  3022 + }
  3023 + $selection[$skey] = new SOAP_Value('item',"{urn:$this->namespace}kt_metadata_selection_item", $sitem);
  3024 + }
3181 3025
3182 - return new SOAP_Value($name,"{urn:$this->namespace}kt_metadata_selection", $encoded);  
3183 - } 3026 + $field['selection'] = new SOAP_Value('selection',"{urn:$this->namespace}kt_metadata_selection", $selection);
3184 3027
3185 - /**  
3186 - * Encode an array as kt_metadata_field  
3187 - *  
3188 - * @param arra $field  
3189 - * @param string $name  
3190 - * @return SOAP_Value of kt_metadata_field  
3191 - * @access private  
3192 - * @static  
3193 - */ 3028 + $field['required'] = is_null($field['required'])?false:(bool) $field['required'];
3194 3029
3195 - function _encode_metadata_field($field, $name='field')  
3196 - {  
3197 - if (!empty($field['selection']))  
3198 - {  
3199 - $field['selection'] = KTWebService::_encode_metadata_selection($field['selection']);  
3200 - }  
3201 - if (!is_null($field['required']))  
3202 - {  
3203 - $field['required'] = (bool) $field['required']; 3030 + $fields[$key] = new SOAP_Value('field',"{urn:$this->namespace}kt_metadata_field", $field);
3204 } 3031 }
3205 3032
3206 - return new SOAP_Value($name,"{urn:$this->namespace}kt_metadata_field", $field);  
3207 - }  
3208 -  
3209 - /**  
3210 - * Encode an array as kt_metadata_fields  
3211 - *  
3212 - * @param array $fields  
3213 - * @param string $name  
3214 - * @return SOAP_Value of kt_metadata_fields  
3215 - * @access private  
3216 - * @static  
3217 - */  
3218 - function _encode_metadata_fields($fields, $name='fields')  
3219 - {  
3220 - $encoded=array();  
3221 - foreach($fields as $field)  
3222 - {  
3223 - $encoded[] = KTWebService::_encode_metadata_field($field);  
3224 - }  
3225 - if (empty($encoded))  
3226 - {  
3227 - $encoded=null;  
3228 - }  
3229 - return new SOAP_Value($name,"{urn:$this->namespace}kt_metadata_fields", $encoded); 3033 + return new SOAP_Value('fields',"{urn:$this->namespace}kt_metadata_fields", $fields);
3230 } 3034 }
3231 3035
3232 /** 3036 /**
@@ -3291,7 +3095,6 @@ class KTWebService @@ -3291,7 +3095,6 @@ class KTWebService
3291 } 3095 }
3292 3096
3293 return new SOAP_Value($name,"{urn:$this->namespace}kt_metadata_response", $response); 3097 return new SOAP_Value($name,"{urn:$this->namespace}kt_metadata_response", $response);
3294 -  
3295 } 3098 }
3296 3099
3297 /** 3100 /**
@@ -3301,7 +3104,6 @@ class KTWebService @@ -3301,7 +3104,6 @@ class KTWebService
3301 * @param string $document_type 3104 * @param string $document_type
3302 * @return kt_metadata_response 3105 * @return kt_metadata_response
3303 */ 3106 */
3304 -  
3305 function get_document_type_metadata($session_id, $document_type) 3107 function get_document_type_metadata($session_id, $document_type)
3306 { 3108 {
3307 $this->debug("get_document_type_metadata('$session_id','$document_type')"); 3109 $this->debug("get_document_type_metadata('$session_id','$document_type')");
@@ -3310,10 +3112,8 @@ class KTWebService @@ -3310,10 +3112,8 @@ class KTWebService
3310 { 3112 {
3311 return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $kt); 3113 return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $kt);
3312 } 3114 }
3313 - $response=array(  
3314 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3315 - 'message'=>''  
3316 - ); 3115 +
  3116 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3317 3117
3318 $metadata = $kt->get_document_type_metadata($document_type); 3118 $metadata = $kt->get_document_type_metadata($document_type);
3319 if (PEAR::isError($metadata)) 3119 if (PEAR::isError($metadata))
@@ -3370,10 +3170,8 @@ class KTWebService @@ -3370,10 +3170,8 @@ class KTWebService
3370 { 3170 {
3371 return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $kt); 3171 return new SOAP_Value('return',"{urn:$this->namespace}kt_metadata_response", $kt);
3372 } 3172 }
3373 - $response=array(  
3374 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3375 - 'message'=>''  
3376 - ); 3173 +
  3174 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3377 3175
3378 $document = &$kt->get_document_by_id($document_id); 3176 $document = &$kt->get_document_by_id($document_id);
3379 if (PEAR::isError($document)) 3177 if (PEAR::isError($document))
@@ -3438,10 +3236,8 @@ class KTWebService @@ -3438,10 +3236,8 @@ class KTWebService
3438 { 3236 {
3439 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt); 3237 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $kt);
3440 } 3238 }
3441 - $response=array(  
3442 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3443 - 'message'=>''  
3444 - ); 3239 +
  3240 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3445 3241
3446 $document = &$kt->get_document_by_id($document_id); 3242 $document = &$kt->get_document_by_id($document_id);
3447 if (PEAR::isError($document)) 3243 if (PEAR::isError($document))
@@ -3459,7 +3255,6 @@ class KTWebService @@ -3459,7 +3255,6 @@ class KTWebService
3459 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $response); 3255 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $response);
3460 } 3256 }
3461 3257
3462 -  
3463 if ($this->version >= 2) 3258 if ($this->version >= 2)
3464 { 3259 {
3465 $result = $document->update_sysdata($sysdata); 3260 $result = $document->update_sysdata($sysdata);
@@ -3470,13 +3265,11 @@ class KTWebService @@ -3470,13 +3265,11 @@ class KTWebService
3470 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $response); 3265 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $response);
3471 } 3266 }
3472 3267
3473 -  
3474 return $this->get_document_detail($session_id, $document_id, 'M'); 3268 return $this->get_document_detail($session_id, $document_id, 'M');
3475 } 3269 }
3476 $response['status_code'] = KTWS_SUCCESS; 3270 $response['status_code'] = KTWS_SUCCESS;
3477 3271
3478 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $response); 3272 return new SOAP_Value('return',"{urn:$this->namespace}$responseType", $response);
3479 -  
3480 } 3273 }
3481 3274
3482 /** 3275 /**
@@ -3494,10 +3287,7 @@ class KTWebService @@ -3494,10 +3287,7 @@ class KTWebService
3494 { 3287 {
3495 return new SOAP_Value('return',"{urn:$this->namespace}kt_workflow_transitions_response", $kt); 3288 return new SOAP_Value('return',"{urn:$this->namespace}kt_workflow_transitions_response", $kt);
3496 } 3289 }
3497 - $response=array(  
3498 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3499 - 'message'=>''  
3500 - ); 3290 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3501 3291
3502 $document = &$kt->get_document_by_id($document_id); 3292 $document = &$kt->get_document_by_id($document_id);
3503 if (PEAR::isError($document)) 3293 if (PEAR::isError($document))
@@ -3517,11 +3307,16 @@ class KTWebService @@ -3517,11 +3307,16 @@ class KTWebService
3517 } 3307 }
3518 3308
3519 $response['status_code'] = KTWS_SUCCESS; 3309 $response['status_code'] = KTWS_SUCCESS;
3520 - $response['transitions'] = $result; 3310 + $response['transitions'] = KTWebService::_encode_document_workflow_transitions($result);
3521 3311
3522 return new SOAP_Value('return',"{urn:$this->namespace}kt_workflow_transitions_response", $response); 3312 return new SOAP_Value('return',"{urn:$this->namespace}kt_workflow_transitions_response", $response);
3523 } 3313 }
3524 3314
  3315 + function _encode_document_workflow_transitions($transitions, $name='transitions')
  3316 + {
  3317 + return new SOAP_Value($name,"{urn:$this->namespace}kt_workflow_transitions", $transitions);
  3318 + }
  3319 +
3525 /** 3320 /**
3526 * Returns the current state that the document is in. 3321 * Returns the current state that the document is in.
3527 * 3322 *
@@ -3538,10 +3333,7 @@ class KTWebService @@ -3538,10 +3333,7 @@ class KTWebService
3538 { 3333 {
3539 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 3334 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
3540 } 3335 }
3541 - $response=array(  
3542 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3543 - 'message'=>''  
3544 - ); 3336 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3545 3337
3546 $document = &$kt->get_document_by_id($document_id); 3338 $document = &$kt->get_document_by_id($document_id);
3547 if (PEAR::isError($document)) 3339 if (PEAR::isError($document))
@@ -3567,20 +3359,6 @@ class KTWebService @@ -3567,20 +3359,6 @@ class KTWebService
3567 } 3359 }
3568 3360
3569 /** 3361 /**
3570 - * Encode an array as kt_document_transaction_history_item  
3571 - *  
3572 - * @param array $item  
3573 - * @param string $name  
3574 - * @return SOAP_Value of kt_document_transaction_history_item  
3575 - * @access private  
3576 - * @static  
3577 - */  
3578 - function _encode_transaction_history_item($item, $name='item')  
3579 - {  
3580 - return new SOAP_Value($name,"{urn:$this->namespace}kt_document_transaction_history_item", $item);  
3581 - }  
3582 -  
3583 - /**  
3584 * Encode an array as kt_document_transaction_history 3362 * Encode an array as kt_document_transaction_history
3585 * 3363 *
3586 * @param array $history 3364 * @param array $history
@@ -3591,29 +3369,11 @@ class KTWebService @@ -3591,29 +3369,11 @@ class KTWebService
3591 */ 3369 */
3592 function _encode_transaction_history($history, $name='history') 3370 function _encode_transaction_history($history, $name='history')
3593 { 3371 {
3594 - $encoded=array();  
3595 - foreach($history as $item) 3372 + foreach($history as $key=>$item)
3596 { 3373 {
3597 - $encoded[] = KTWebService::_encode_transaction_history_item($item); 3374 + $history[$key] = new SOAP_Value('item',"{urn:$this->namespace}kt_document_transaction_history_item", $item);
3598 } 3375 }
3599 -  
3600 - return new SOAP_Value($name,"{urn:$this->namespace}kt_document_transaction_history", $encoded);  
3601 - }  
3602 -  
3603 - /**  
3604 - * Encode an array as kt_document_transaction_history_response  
3605 - *  
3606 - * @param array $response  
3607 - * @param string $name  
3608 - * @return SOAP_Value of kt_document_transaction_history_response  
3609 - * @access private  
3610 - * @static  
3611 - */  
3612 - function _encode_transaction_history_response($response, $name='return')  
3613 - {  
3614 - $response['history'] = KTWebService::_encode_transaction_history($response['history']);  
3615 -  
3616 - return new SOAP_Value($name,"{urn:$this->namespace}kt_document_transaction_history_response", $response); 3376 + return new SOAP_Value($name,"{urn:$this->namespace}kt_document_transaction_history", $history);
3617 } 3377 }
3618 3378
3619 /** 3379 /**
@@ -3631,10 +3391,7 @@ class KTWebService @@ -3631,10 +3391,7 @@ class KTWebService
3631 { 3391 {
3632 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_transaction_history_response", $kt); 3392 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_transaction_history_response", $kt);
3633 } 3393 }
3634 - $response=array(  
3635 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3636 - 'message'=>''  
3637 - ); 3394 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3638 3395
3639 $document = &$kt->get_document_by_id($document_id); 3396 $document = &$kt->get_document_by_id($document_id);
3640 if (PEAR::isError($document)) 3397 if (PEAR::isError($document))
@@ -3654,23 +3411,9 @@ class KTWebService @@ -3654,23 +3411,9 @@ class KTWebService
3654 } 3411 }
3655 3412
3656 $response['status_code'] = KTWS_SUCCESS; 3413 $response['status_code'] = KTWS_SUCCESS;
3657 - $response['history'] = $result; 3414 + $response['history'] = KTWebService::_encode_transaction_history($result);
3658 3415
3659 - return KTWebService::_encode_transaction_history_response($response);  
3660 - }  
3661 -  
3662 - /**  
3663 - * Encode an array as kt_document_version_history_item  
3664 - *  
3665 - * @param array $item  
3666 - * @param string $name  
3667 - * @return SOAP_Value of kt_document_version_history_item  
3668 - * @access private  
3669 - * @static  
3670 - */  
3671 - function _encode_version_history_item($item, $name='item')  
3672 - {  
3673 - return new SOAP_Value($name,"{urn:$this->namespace}kt_document_version_history_item", $item); 3416 + return new SOAP_Value('return',"{urn:$this->namespace}kt_document_transaction_history_response", $response);
3674 } 3417 }
3675 3418
3676 /** 3419 /**
@@ -3684,32 +3427,13 @@ class KTWebService @@ -3684,32 +3427,13 @@ class KTWebService
3684 */ 3427 */
3685 function _encode_version_history($history, $name='history') 3428 function _encode_version_history($history, $name='history')
3686 { 3429 {
3687 - $encoded=array();  
3688 - foreach($history as $item) 3430 + foreach($history as $key=>$item)
3689 { 3431 {
3690 - $encoded[] = KTWebService::_encode_version_history_item($item); 3432 + $history[$key] = new SOAP_Value('item',"{urn:$this->namespace}kt_document_version_history_item", $item);
3691 } 3433 }
3692 -  
3693 - return new SOAP_Value($name,"{urn:$this->namespace}kt_document_version_history", $encoded);  
3694 - }  
3695 -  
3696 - /**  
3697 - * Encode an array as kt_document_version_history_response  
3698 - *  
3699 - * @param array $response  
3700 - * @param string $name  
3701 - * @return SOAP_Value of kt_document_version_history_response  
3702 - * @access private  
3703 - * @static  
3704 - */  
3705 - function _encode_version_history_response($response, $name='return')  
3706 - {  
3707 - $response['history'] = KTWebService::_encode_version_history($response['history']);  
3708 -  
3709 - return new SOAP_Value($name,"{urn:$this->namespace}kt_document_version_history_response", $response); 3434 + return new SOAP_Value($name,"{urn:$this->namespace}kt_document_version_history", $history);
3710 } 3435 }
3711 3436
3712 -  
3713 /** 3437 /**
3714 * Returns the version history. 3438 * Returns the version history.
3715 * 3439 *
@@ -3726,10 +3450,7 @@ class KTWebService @@ -3726,10 +3450,7 @@ class KTWebService
3726 { 3450 {
3727 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_version_history_response", $kt); 3451 return new SOAP_Value('return',"{urn:$this->namespace}kt_document_version_history_response", $kt);
3728 } 3452 }
3729 - $response=array(  
3730 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3731 - 'message'=>''  
3732 - ); 3453 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3733 3454
3734 $document = &$kt->get_document_by_id($document_id); 3455 $document = &$kt->get_document_by_id($document_id);
3735 if (PEAR::isError($document)) 3456 if (PEAR::isError($document))
@@ -3749,12 +3470,11 @@ class KTWebService @@ -3749,12 +3470,11 @@ class KTWebService
3749 } 3470 }
3750 3471
3751 $response['status_code'] = KTWS_SUCCESS; 3472 $response['status_code'] = KTWS_SUCCESS;
3752 - $response['history'] = $result; 3473 + $response['history'] =KTWebService::_encode_version_history($result);
3753 3474
3754 - return KTWebService::_encode_version_history_response($response); 3475 + return new SOAP_Value('return',"{urn:$this->namespace}kt_document_version_history_response", $response);
3755 } 3476 }
3756 3477
3757 -  
3758 /** 3478 /**
3759 * Returns a list of linked documents 3479 * Returns a list of linked documents
3760 * 3480 *
@@ -3789,12 +3509,25 @@ class KTWebService @@ -3789,12 +3509,25 @@ class KTWebService
3789 } 3509 }
3790 3510
3791 $links = $document->get_linked_documents(); 3511 $links = $document->get_linked_documents();
3792 - $response['links'] = new SOAP_Value('links',"{urn:$this->namespace}kt_linked_documents", $links); 3512 + $response['links'] = KTWebService::_encode_document_links($links);
3793 $response['status_code'] = KTWS_SUCCESS; 3513 $response['status_code'] = KTWS_SUCCESS;
3794 3514
3795 return new SOAP_Value('return',"{urn:$this->namespace}kt_linked_document_response", $response); 3515 return new SOAP_Value('return',"{urn:$this->namespace}kt_linked_document_response", $response);
3796 } 3516 }
3797 3517
  3518 + function _encode_document_links($links, $name='links')
  3519 + {
  3520 + foreach($links as $key=>$link)
  3521 + {
  3522 + $link['document_id'] = (int) $link['document_id'];
  3523 + $link['filesize'] = (int) $link['filesize'];
  3524 +
  3525 + $links[$key] = new SOAP_Value('links',"{urn:$this->namespace}kt_linked_document", $link);
  3526 + }
  3527 +
  3528 + return new SOAP_Value($name,"{urn:$this->namespace}kt_linked_documents", $links);
  3529 + }
  3530 +
3798 /** 3531 /**
3799 * Removes a link between documents 3532 * Removes a link between documents
3800 * 3533 *
@@ -3812,10 +3545,7 @@ class KTWebService @@ -3812,10 +3545,7 @@ class KTWebService
3812 { 3545 {
3813 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 3546 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
3814 } 3547 }
3815 - $response=array(  
3816 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3817 - 'message'=>''  
3818 - ); 3548 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3819 3549
3820 $document = &$kt->get_document_by_id($parent_document_id); 3550 $document = &$kt->get_document_by_id($parent_document_id);
3821 if (PEAR::isError($document)) 3551 if (PEAR::isError($document))
@@ -3864,10 +3594,7 @@ class KTWebService @@ -3864,10 +3594,7 @@ class KTWebService
3864 { 3594 {
3865 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt); 3595 return new SOAP_Value('return',"{urn:$this->namespace}kt_response", $kt);
3866 } 3596 }
3867 - $response=array(  
3868 - 'status_code'=>KTWS_ERR_INVALID_DOCUMENT,  
3869 - 'message'=>''  
3870 - ); 3597 + $response = KTWebService::_status(KTWS_ERR_INVALID_DOCUMENT);
3871 3598
3872 $document = &$kt->get_document_by_id($parent_document_id); 3599 $document = &$kt->get_document_by_id($parent_document_id);
3873 if (PEAR::isError($document)) 3600 if (PEAR::isError($document))
@@ -3899,17 +3626,13 @@ class KTWebService @@ -3899,17 +3626,13 @@ class KTWebService
3899 } 3626 }
3900 3627
3901 function _encode_client_policies($policies) 3628 function _encode_client_policies($policies)
3902 - {  
3903 - $encoded=array();  
3904 - foreach($policies as $policy)  
3905 - {  
3906 - $encoded[] = new SOAP_Value('policy',"{urn:$this->namespace}kt_client_policy", $policy);  
3907 - }  
3908 - if (empty($encoded)) 3629 + {
  3630 + foreach($policies as $key=>$policy)
3909 { 3631 {
3910 - $encoded=null; 3632 + $policies[$key] = new SOAP_Value('policy',"{urn:$this->namespace}kt_client_policy", $policy);
3911 } 3633 }
3912 - return new SOAP_Value('policies',"{urn:$this->namespace}kt_client_policies_array", $encoded); 3634 +
  3635 + return new SOAP_Value('policies',"{urn:$this->namespace}kt_client_policies_array", $policies);
3913 } 3636 }
3914 3637
3915 /** 3638 /**
@@ -3918,7 +3641,7 @@ class KTWebService @@ -3918,7 +3641,7 @@ class KTWebService
3918 * @param string $session_id 3641 * @param string $session_id
3919 * @return kt_client_policies_response 3642 * @return kt_client_policies_response
3920 */ 3643 */
3921 - function get_client_policies($session_id) 3644 + function get_client_policies($session_id, $client=null)
3922 { 3645 {
3923 $this->debug("get_client_policies('$session_id')"); 3646 $this->debug("get_client_policies('$session_id')");
3924 $config = KTConfig::getSingleton(); 3647 $config = KTConfig::getSingleton();
@@ -3964,9 +3687,13 @@ class KTWebService @@ -3964,9 +3687,13 @@ class KTWebService
3964 'value' => bool2str($config->get('clientToolPolicies/captureReasonsMoveInKT')), 3687 'value' => bool2str($config->get('clientToolPolicies/captureReasonsMoveInKT')),
3965 'type' => 'boolean' 3688 'type' => 'boolean'
3966 ), 3689 ),
  3690 + array(
  3691 + 'name' => 'allow_remember_password',
  3692 + 'value' => bool2str($config->get('clientToolPolicies/allowRememberPassword')),
  3693 + 'type' => 'boolean'
  3694 + ),
3967 ); 3695 );
3968 3696
3969 -  
3970 $response['policies'] = $this->_encode_client_policies($policies); 3697 $response['policies'] = $this->_encode_client_policies($policies);
3971 $response['message'] = 'Knowledgetree client policies retrieval succeeded.'; 3698 $response['message'] = 'Knowledgetree client policies retrieval succeeded.';
3972 $response['status_code'] = KTWS_SUCCESS; 3699 $response['status_code'] = KTWS_SUCCESS;
@@ -3991,11 +3718,9 @@ class KTWebService @@ -3991,11 +3718,9 @@ class KTWebService
3991 { 3718 {
3992 return new SOAP_Value('return',"{urn:$this->namespace}kt_search_response", $kt); 3719 return new SOAP_Value('return',"{urn:$this->namespace}kt_search_response", $kt);
3993 } 3720 }
3994 - $response=array(  
3995 - 'status_code'=>KTWS_ERR_PROBLEM,  
3996 - 'message'=>'',  
3997 - 'hits'=>array()  
3998 - ); 3721 +
  3722 + $response = KTWebService::_status(KTWS_ERR_PROBLEM);
  3723 + $response['hits'] = array();
3999 3724
4000 if (!defined('HAS_SEARCH_FUNCTIONALITY')) 3725 if (!defined('HAS_SEARCH_FUNCTIONALITY'))
4001 { 3726 {
@@ -4024,7 +3749,6 @@ class KTWebService @@ -4024,7 +3749,6 @@ class KTWebService
4024 return new SOAP_Value('return',"{urn:$this->namespace}kt_search_response", $response); 3749 return new SOAP_Value('return',"{urn:$this->namespace}kt_search_response", $response);
4025 } 3750 }
4026 3751
4027 -  
4028 /** 3752 /**
4029 * The main json request processing function. 3753 * The main json request processing function.
4030 * 3754 *
@@ -4186,8 +3910,7 @@ class KTWebService @@ -4186,8 +3910,7 @@ class KTWebService
4186 3910
4187 } 3911 }
4188 3912
4189 -  
4190 -$webservice = new KTWebService(); 3913 +$webservice = KTWebService::get();
4191 $webservice->run(); 3914 $webservice->run();
4192 3915
4193 -?> 3916 -?>
  3917 +?>
4194 \ No newline at end of file 3918 \ No newline at end of file
lib/browse/DocumentCollection.inc.php
@@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 * 35 *
36 */ 36 */
@@ -618,4 +618,54 @@ class AdvancedCollection { @@ -618,4 +618,54 @@ class AdvancedCollection {
618 } 618 }
619 } 619 }
620 620
621 -?> 621 +class ExtCollection {
  622 +
  623 + var $columns;
  624 + var $folders;
  625 + var $documents;
  626 +
  627 + /**
  628 + * Add the column headers
  629 + *
  630 + * @param array $aColumns
  631 + */
  632 + function addColumns($aColumns) {
  633 + $this->columns = $aColumns;
  634 + }
  635 +
  636 + /**
  637 + * Add the folders under the folder
  638 + *
  639 + * @param array $aFolders
  640 + */
  641 + function addFolders($aFolders) {
  642 + $this->folders = $aFolders;
  643 + }
  644 +
  645 + /**
  646 + * Add the documents contained in the folder
  647 + *
  648 + * @param array $aDocuments
  649 + */
  650 + function addDocuments($aDocuments) {
  651 + $this->documents = $aDocuments;
  652 + }
  653 +
  654 + function render() {
  655 +
  656 + global $main;
  657 + $main->requireJSResource('thirdpartyjs/extjs/adapter/ext/ext-base.js');
  658 + $main->requireJSResource('thirdpartyjs/extjs/ext-all.js');
  659 + $main->requireJSResource('resources/js/browse_ext.js');
  660 +
  661 + $oTemplating =& KTTemplating::getSingleton();
  662 + $oTemplate = $oTemplating->loadTemplate('kt3/ext_collection');
  663 + $aTemplateData = array(
  664 + );
  665 +
  666 + // in order to allow OTHER things than batch to move us around, we do:
  667 + return $oTemplate->render($aTemplateData);
  668 + }
  669 +}
  670 +
  671 +?>
622 \ No newline at end of file 672 \ No newline at end of file
lib/cache/cache.inc.php
@@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 */ 35 */
36 36
@@ -75,9 +75,14 @@ class KTCache { @@ -75,9 +75,14 @@ class KTCache {
75 if (!file_exists($aOptions['cacheDir'])) { 75 if (!file_exists($aOptions['cacheDir'])) {
76 mkdir($aOptions['cacheDir']); 76 mkdir($aOptions['cacheDir']);
77 } 77 }
  78 +
  79 + // See thirdparty/pear/Cache/Lite.php to customize cache
78 $aOptions['lifeTime'] = 60; 80 $aOptions['lifeTime'] = 60;
79 $aOptions['memoryCaching'] = true; 81 $aOptions['memoryCaching'] = true;
80 $aOptions['automaticSerialization'] = true; 82 $aOptions['automaticSerialization'] = true;
  83 + /* Patched line */
  84 + // Disable fileCaching (when cache > 5Mo)
  85 + $aOptions['onlyMemoryCaching'] = true;
81 86
82 $this->cacheDir = $aOptions['cacheDir']; 87 $this->cacheDir = $aOptions['cacheDir'];
83 88
lib/dispatcher.inc.php
@@ -538,6 +538,39 @@ class KTErrorDispatcher extends KTStandardDispatcher { @@ -538,6 +538,39 @@ class KTErrorDispatcher extends KTStandardDispatcher {
538 538
539 function dispatch() { 539 function dispatch() {
540 require_once(KT_LIB_DIR . '/validation/errorviewer.inc.php'); 540 require_once(KT_LIB_DIR . '/validation/errorviewer.inc.php');
  541 + require_once(KT_LIB_DIR . '/validation/customerrorviewer.inc.php');
  542 +
  543 + $oCustomViewer =& KTCustomErrorViewer::initCustomErrorViewer();
  544 +
  545 + //if the custom error messages are set to 'on' in the config file
  546 + //we check if the error page exists and redirect to it if it does.
  547 + //if either the page doesn't exit or the custom error option is off in the config file
  548 + //we carry out default error reporting
  549 + if ($oCustomViewer->getCustomErrorConfigSetting() == 'on'){
  550 + $CustomErrorPage = $oCustomViewer->getCustomErrorRedirectPage();
  551 + if ( $CustomErrorPage != '0') //if an error is not returned from getCustomErrorRedirectPage();
  552 + {
  553 + $sErrorHandler = $oCustomViewer->getCustomErrorHandlerSetting();
  554 +
  555 + //redirect
  556 + if ($sErrorHandler == 'on')
  557 + {
  558 + //if custom error handler is set to on inside config.ini then send error object with error page
  559 + $oCustomViewer->doCustomErrorPageRedirect($CustomErrorPage, $this->oError);
  560 + }
  561 + else if ($sErrorHandler != 'on')
  562 + {
  563 + //if custom error handler is set to off inside config.ini then just send error page
  564 + $oCustomViewer->doCustomErrorPageRedirect($CustomErrorPage);
  565 + }
  566 +
  567 + //exit without errors
  568 + exit(0);
  569 + }
  570 + }
  571 +
  572 + //if either customer error messages is off or the custom error page doesn't exist the function will run
  573 + //the default error handling here
541 $oRegistry =& KTErrorViewerRegistry::getSingleton(); 574 $oRegistry =& KTErrorViewerRegistry::getSingleton();
542 $oViewer =& $oRegistry->getViewer($this->oError); 575 $oViewer =& $oRegistry->getViewer($this->oError);
543 $this->oPage->setTitle($oViewer->view()); 576 $this->oPage->setTitle($oViewer->view());
lib/documentmanagement/DocumentFieldLink.inc
@@ -7,39 +7,39 @@ @@ -7,39 +7,39 @@
7 * KnowledgeTree Open Source Edition 7 * KnowledgeTree Open Source Edition
8 * Document Management Made Simple 8 * Document Management Made Simple
9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
10 - * 10 + *
11 * This program is free software; you can redistribute it and/or modify it under 11 * This program is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU General Public License version 3 as published by the 12 * the terms of the GNU General Public License version 3 as published by the
13 * Free Software Foundation. 13 * Free Software Foundation.
14 - * 14 + *
15 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * This program is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 * details. 18 * details.
19 - * 19 + *
20 * You should have received a copy of the GNU General Public License 20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>. 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 - * 22 + *
23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
25 - * 25 + *
26 * The interactive user interfaces in modified source and object code versions 26 * The interactive user interfaces in modified source and object code versions
27 * of this program must display Appropriate Legal Notices, as required under 27 * of this program must display Appropriate Legal Notices, as required under
28 * Section 5 of the GNU General Public License version 3. 28 * Section 5 of the GNU General Public License version 3.
29 - * 29 + *
30 * In accordance with Section 7(b) of the GNU General Public License version 3, 30 * In accordance with Section 7(b) of the GNU General Public License version 3,
31 * these Appropriate Legal Notices must retain the display of the "Powered by 31 * these Appropriate Legal Notices must retain the display of the "Powered by
32 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 32 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
34 - * must display the words "Powered by KnowledgeTree" and retain the original  
35 - * copyright notice. 34 + * must display the words "Powered by KnowledgeTree" and retain the original
  35 + * copyright notice.
36 * Contributor( s): ______________________________________ 36 * Contributor( s): ______________________________________
37 */ 37 */
38 38
39 require_once(KT_LIB_DIR . "/util/sanitize.inc"); 39 require_once(KT_LIB_DIR . "/util/sanitize.inc");
40 40
41 class DocumentFieldLink extends KTEntity { 41 class DocumentFieldLink extends KTEntity {
42 - 42 +
43 /** document field link primary key */ 43 /** document field link primary key */
44 var $iId; 44 var $iId;
45 /** primary key of document to which field is linked */ 45 /** primary key of document to which field is linked */
@@ -55,9 +55,9 @@ class DocumentFieldLink extends KTEntity { @@ -55,9 +55,9 @@ class DocumentFieldLink extends KTEntity {
55 'iDocumentFieldId' => 'document_field_id', 55 'iDocumentFieldId' => 'document_field_id',
56 'sValue' => 'value', 56 'sValue' => 'value',
57 ); 57 );
58 - 58 +
59 /** 59 /**
60 - * Default constructor 60 + * Default constructor
61 * 61 *
62 * @param Primary key of document to which field is linked 62 * @param Primary key of document to which field is linked
63 * @param Primary key of field to which document is linked 63 * @param Primary key of field to which document is linked
@@ -71,7 +71,7 @@ class DocumentFieldLink extends KTEntity { @@ -71,7 +71,7 @@ class DocumentFieldLink extends KTEntity {
71 $this->iDocumentFieldId = $iNewDocumentFieldId; 71 $this->iDocumentFieldId = $iNewDocumentFieldId;
72 $this->sValue = $sNewValue; 72 $this->sValue = $sNewValue;
73 } 73 }
74 - 74 +
75 /** 75 /**
76 * Get the document field link primary key 76 * Get the document field link primary key
77 * 77 *
@@ -81,7 +81,7 @@ class DocumentFieldLink extends KTEntity { @@ -81,7 +81,7 @@ class DocumentFieldLink extends KTEntity {
81 function getId() { 81 function getId() {
82 return $this->iId; 82 return $this->iId;
83 } 83 }
84 - 84 +
85 /** 85 /**
86 * Get the primary key of the document to which the field is linked 86 * Get the primary key of the document to which the field is linked
87 * 87 *
@@ -91,7 +91,7 @@ class DocumentFieldLink extends KTEntity { @@ -91,7 +91,7 @@ class DocumentFieldLink extends KTEntity {
91 function getMetadataVersionId() { 91 function getMetadataVersionId() {
92 return $this->iMetadataVersionId; 92 return $this->iMetadataVersionId;
93 } 93 }
94 - 94 +
95 /** 95 /**
96 * Set the primary key of the document to which the field is linked 96 * Set the primary key of the document to which the field is linked
97 * 97 *
@@ -101,7 +101,7 @@ class DocumentFieldLink extends KTEntity { @@ -101,7 +101,7 @@ class DocumentFieldLink extends KTEntity {
101 function setMetadataVersionId($iNewValue) { 101 function setMetadataVersionId($iNewValue) {
102 $this->iMetadataVersionId = $iNewValue; 102 $this->iMetadataVersionId = $iNewValue;
103 } 103 }
104 - 104 +
105 /** 105 /**
106 * Get the primary key of the field to which the document is linked 106 * Get the primary key of the field to which the document is linked
107 * 107 *
@@ -111,7 +111,7 @@ class DocumentFieldLink extends KTEntity { @@ -111,7 +111,7 @@ class DocumentFieldLink extends KTEntity {
111 function getDocumentFieldId() { 111 function getDocumentFieldId() {
112 return $this->iDocumentFieldId; 112 return $this->iDocumentFieldId;
113 } 113 }
114 - 114 +
115 /** 115 /**
116 * Set the primary key of the field to which the document is related 116 * Set the primary key of the field to which the document is related
117 * 117 *
@@ -121,7 +121,7 @@ class DocumentFieldLink extends KTEntity { @@ -121,7 +121,7 @@ class DocumentFieldLink extends KTEntity {
121 function setDocumentFieldId($iNewVale) { 121 function setDocumentFieldId($iNewVale) {
122 $this->iDocumentFieldId = $iNewValue; 122 $this->iDocumentFieldId = $iNewValue;
123 } 123 }
124 - 124 +
125 /** 125 /**
126 * Get the value of the field 126 * Get the value of the field
127 * 127 *
@@ -129,9 +129,9 @@ class DocumentFieldLink extends KTEntity { @@ -129,9 +129,9 @@ class DocumentFieldLink extends KTEntity {
129 * 129 *
130 */ 130 */
131 function getValue() { 131 function getValue() {
132 - return sanitizeForSQLtoHTML($this->sValue); 132 + return $this->sValue;
133 } 133 }
134 - 134 +
135 /** 135 /**
136 * Set the value of the field 136 * Set the value of the field
137 * 137 *
@@ -145,7 +145,7 @@ class DocumentFieldLink extends KTEntity { @@ -145,7 +145,7 @@ class DocumentFieldLink extends KTEntity {
145 function _table () { 145 function _table () {
146 return KTUtil::getTableName('document_fields_link'); 146 return KTUtil::getTableName('document_fields_link');
147 } 147 }
148 - 148 +
149 /** 149 /**
150 * 150 *
151 * Static function. Given a document fields link primary key will create 151 * Static function. Given a document fields link primary key will create
lib/documentmanagement/documentcore.inc.php
@@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 * 35 *
36 */ 36 */
@@ -181,13 +181,16 @@ class KTDocumentCore extends KTEntity { @@ -181,13 +181,16 @@ class KTDocumentCore extends KTEntity {
181 181
182 // {{{ ktentity requirements 182 // {{{ ktentity requirements
183 function _fieldValues () { 183 function _fieldValues () {
184 - $sNewFullPath = Folder::generateFolderPath($this->iFolderId);  
185 - if (!PEAR::isError($sNewFullPath)) {  
186 - $this->sFullPath = $sNewFullPath;  
187 - }  
188 - $sNewParentFolderIds = Folder::generateFolderIds($this->iFolderId);  
189 - if (!PEAR::isError($sNewParentFolderIds)) {  
190 - $this->sParentFolderIds = $sNewParentFolderIds; 184 + static $lastFolder = null;
  185 + if (is_null($lastFolder) || $lastFolder->getID() !== $this->iFolderId) {
  186 + $lastFolder = Folder::get($this->iFolderId);
  187 + if (PEAR::isError($lastFolder)) {
  188 + $lastFolder = null;
  189 + }
  190 + }
  191 + if (!is_null($lastFolder)) {
  192 + $this->sFullPath = $lastFolder->getFullPath();
  193 + $this->sParentFolderIds = $lastFolder->getParentFolderIDs();
191 } 194 }
192 return parent::_fieldValues(); 195 return parent::_fieldValues();
193 } 196 }
@@ -256,6 +259,9 @@ class KTDocumentCore extends KTEntity { @@ -256,6 +259,9 @@ class KTDocumentCore extends KTEntity {
256 $this->bImmutable = false; 259 $this->bImmutable = false;
257 } 260 }
258 $oFolder = Folder::get($this->getFolderId()); 261 $oFolder = Folder::get($this->getFolderId());
  262 + if (PEAR::isError($oFolder) || ($oFolder === false) || empty($oFolder) ) {
  263 + return false;
  264 + }
259 $this->iPermissionObjectId = $oFolder->getPermissionObjectId(); 265 $this->iPermissionObjectId = $oFolder->getPermissionObjectId();
260 $res = parent::create(); 266 $res = parent::create();
261 267
lib/documentmanagement/documentutil.inc.php
@@ -561,7 +561,9 @@ class KTDocumentUtil { @@ -561,7 +561,9 @@ class KTDocumentUtil {
561 561
562 $oUploadChannel =& KTUploadChannel::getSingleton(); 562 $oUploadChannel =& KTUploadChannel::getSingleton();
563 $oUploadChannel->sendMessage(new KTUploadNewFile($sFilename)); 563 $oUploadChannel->sendMessage(new KTUploadNewFile($sFilename));
  564 + DBUtil::startTransaction();
564 $oDocument =& KTDocumentUtil::_add($oFolder, $sFilename, $oUser, $aOptions); 565 $oDocument =& KTDocumentUtil::_add($oFolder, $sFilename, $oUser, $aOptions);
  566 +
565 // $oUploadChannel->sendMessage(new KTUploadGenericMessage(_kt('Document created'))); 567 // $oUploadChannel->sendMessage(new KTUploadGenericMessage(_kt('Document created')));
566 if (PEAR::isError($oDocument)) { 568 if (PEAR::isError($oDocument)) {
567 return $oDocument; 569 return $oDocument;
@@ -633,6 +635,7 @@ class KTDocumentUtil { @@ -633,6 +635,7 @@ class KTDocumentUtil {
633 } 635 }
634 KTDocumentUtil::updateSearchableText($oDocument, true); 636 KTDocumentUtil::updateSearchableText($oDocument, true);
635 637
  638 + DBUtil::commit();
636 $oUploadChannel->sendMessage(new KTUploadGenericMessage(_kt('All done...'))); 639 $oUploadChannel->sendMessage(new KTUploadGenericMessage(_kt('All done...')));
637 640
638 return $oDocument; 641 return $oDocument;
@@ -718,7 +721,7 @@ class KTDocumentUtil { @@ -718,7 +721,7 @@ class KTDocumentUtil {
718 $iMimeTypeId = KTMime::getMimeTypeID($sType, $oDocument->getFileName()); 721 $iMimeTypeId = KTMime::getMimeTypeID($sType, $oDocument->getFileName());
719 $oDocument->setMimeTypeId($iMimeTypeId); 722 $oDocument->setMimeTypeId($iMimeTypeId);
720 723
721 - $res = $oStorage->upload($oDocument, $sFilename); 724 + $res = $oStorage->upload($oDocument, $sFilename, $aOptions);
722 if ($res === false) { 725 if ($res === false) {
723 return PEAR::raiseError(sprintf(_kt("Couldn't store contents: %s"), _kt('No reason given'))); 726 return PEAR::raiseError(sprintf(_kt("Couldn't store contents: %s"), _kt('No reason given')));
724 } 727 }
@@ -727,7 +730,7 @@ class KTDocumentUtil { @@ -727,7 +730,7 @@ class KTDocumentUtil {
727 } 730 }
728 KTDocumentUtil::setComplete($oDocument, 'contents'); 731 KTDocumentUtil::setComplete($oDocument, 'contents');
729 732
730 - if ($aOptions['cleanup_initial_file']) { 733 + if ($aOptions['cleanup_initial_file'] && file_exists($sFilename)) {
731 @unlink($sFilename); 734 @unlink($sFilename);
732 } 735 }
733 736
lib/foldermanagement/Folder.inc
@@ -7,32 +7,32 @@ @@ -7,32 +7,32 @@
7 * KnowledgeTree Open Source Edition 7 * KnowledgeTree Open Source Edition
8 * Document Management Made Simple 8 * Document Management Made Simple
9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
10 - * 10 + *
11 * This program is free software; you can redistribute it and/or modify it under 11 * This program is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU General Public License version 3 as published by the 12 * the terms of the GNU General Public License version 3 as published by the
13 * Free Software Foundation. 13 * Free Software Foundation.
14 - * 14 + *
15 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * This program is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 * details. 18 * details.
19 - * 19 + *
20 * You should have received a copy of the GNU General Public License 20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>. 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 - * 22 + *
23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
25 - * 25 + *
26 * The interactive user interfaces in modified source and object code versions 26 * The interactive user interfaces in modified source and object code versions
27 * of this program must display Appropriate Legal Notices, as required under 27 * of this program must display Appropriate Legal Notices, as required under
28 * Section 5 of the GNU General Public License version 3. 28 * Section 5 of the GNU General Public License version 3.
29 - * 29 + *
30 * In accordance with Section 7(b) of the GNU General Public License version 3, 30 * In accordance with Section 7(b) of the GNU General Public License version 3,
31 * these Appropriate Legal Notices must retain the display of the "Powered by 31 * these Appropriate Legal Notices must retain the display of the "Powered by
32 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 32 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
34 - * must display the words "Powered by KnowledgeTree" and retain the original  
35 - * copyright notice. 34 + * must display the words "Powered by KnowledgeTree" and retain the original
  35 + * copyright notice.
36 * Contributor( s): ______________________________________ 36 * Contributor( s): ______________________________________
37 */ 37 */
38 38
@@ -82,10 +82,10 @@ class Folder extends KTEntity { @@ -82,10 +82,10 @@ class Folder extends KTEntity {
82 // }}} 82 // }}}
83 83
84 function getID() { return $this->iId; } 84 function getID() { return $this->iId; }
85 - function getName() { return sanitizeForSQLtoHTML($this->sName); }  
86 - function setName($sNewValue) { $this->sName = sanitizeForSQL($sNewValue); }  
87 - function getDescription() { return sanitizeForSQLtoHTML($this->sDescription); }  
88 - function setDescription($sNewValue) { $this->sDescription = sanitizeForSQL($sNewValue); } 85 + function getName() { return ($this->sName); }
  86 + function setName($sNewValue) { $this->sName = ($sNewValue); }
  87 + function getDescription() { return ($this->sDescription); }
  88 + function setDescription($sNewValue) { $this->sDescription = ($sNewValue); }
89 function getParentID() { return $this->iParentID; } 89 function getParentID() { return $this->iParentID; }
90 function setParentID($iNewValue) { $this->iParentID = $iNewValue; } 90 function setParentID($iNewValue) { $this->iParentID = $iNewValue; }
91 function getCreatorID() { return $this->iCreatorID; } 91 function getCreatorID() { return $this->iCreatorID; }
lib/foldermanagement/compressionArchiveUtil.inc.php
@@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 * 35 *
36 */ 36 */
@@ -79,10 +79,17 @@ class ZipFolder { @@ -79,10 +79,17 @@ class ZipFolder {
79 /** 79 /**
80 * Add a document to the zip file 80 * Add a document to the zip file
81 */ 81 */
82 - function addDocumentToZip($oDocument) {  
83 - $sParentFolder = str_replace('<', '', str_replace('</', '', str_replace('>', '', sprintf('%s/%s', $this->sTmpPath, $oDocument->getFullPath())))); 82 + function addDocumentToZip($oDocument, $oFolder = null) {
  83 + if(empty($oFolder)){
  84 + $oFolder = Folder::get($oDocument->getFolderID());
  85 + }
  86 +
  87 + $sDocPath = $oFolder->getFullPath().'/'.$oFolder->getName();
  88 + $sDocName = $oDocument->getFileName();
  89 +
  90 + $sParentFolder = str_replace('<', '', str_replace('</', '', str_replace('>', '', sprintf('%s/%s', $this->sTmpPath, $sDocPath))));
84 $newDir = $this->sTmpPath; 91 $newDir = $this->sTmpPath;
85 - $sFullPath = str_replace('<', '', str_replace('</', '', str_replace('>', '', $this->_convertEncoding($oDocument->getFullPath(), true)))); 92 + $sFullPath = str_replace('<', '', str_replace('</', '', str_replace('>', '', $this->_convertEncoding($sDocPath, true))));
86 foreach (split('/', $sFullPath) as $dirPart) { 93 foreach (split('/', $sFullPath) as $dirPart) {
87 $newDir = sprintf("%s/%s", $newDir, $dirPart); 94 $newDir = sprintf("%s/%s", $newDir, $dirPart);
88 if (!file_exists($newDir)) { 95 if (!file_exists($newDir)) {
@@ -91,11 +98,11 @@ class ZipFolder { @@ -91,11 +98,11 @@ class ZipFolder {
91 } 98 }
92 99
93 $sOrigFile = str_replace('<', '', str_replace('</', '', str_replace('>', '', $this->oStorage->temporaryFile($oDocument)))); 100 $sOrigFile = str_replace('<', '', str_replace('</', '', str_replace('>', '', $this->oStorage->temporaryFile($oDocument))));
94 - $sFilename = sprintf("%s/%s", $sParentFolder, str_replace('<', '', str_replace('</', '', str_replace('>', '', $oDocument->getFileName())))); 101 + $sFilename = sprintf("%s/%s", $sParentFolder, str_replace('<', '', str_replace('</', '', str_replace('>', '', $sDocName))));
95 $sFilename = $this->_convertEncoding($sFilename, true); 102 $sFilename = $this->_convertEncoding($sFilename, true);
96 copy($sOrigFile, $sFilename); 103 copy($sOrigFile, $sFilename);
97 104
98 - $sPath = str_replace('<', '', str_replace('</', '', str_replace('>', '', sprintf("%s/%s", $oDocument->getFullPath(), $oDocument->getFileName())))); 105 + $sPath = str_replace('<', '', str_replace('</', '', str_replace('>', '', sprintf("%s/%s", $sDocPath, $sDocName))));
99 $sPath = str_replace($this->aReplaceKeys, $this->aReplaceValues, $sPath); 106 $sPath = str_replace($this->aReplaceKeys, $this->aReplaceValues, $sPath);
100 $sPath = $this->_convertEncoding($sPath, true); 107 $sPath = $this->_convertEncoding($sPath, true);
101 108
lib/foldermanagement/folderutil.inc.php
@@ -57,8 +57,8 @@ class KTFolderUtil { @@ -57,8 +57,8 @@ class KTFolderUtil {
57 } 57 }
58 $oStorage =& KTStorageManagerUtil::getSingleton(); 58 $oStorage =& KTStorageManagerUtil::getSingleton();
59 $oFolder =& Folder::createFromArray(array( 59 $oFolder =& Folder::createFromArray(array(
60 - 'name' => sanitizeForSQL($sFolderName),  
61 - 'description' => sanitizeForSQL($sFolderName), 60 + 'name' => ($sFolderName),
  61 + 'description' => ($sFolderName),
62 'parentid' => $oParentFolder->getID(), 62 'parentid' => $oParentFolder->getID(),
63 'creatorid' => $oUser->getID(), 63 'creatorid' => $oUser->getID(),
64 )); 64 ));
lib/import/bulkimport.inc.php
@@ -7,32 +7,32 @@ @@ -7,32 +7,32 @@
7 * KnowledgeTree Open Source Edition 7 * KnowledgeTree Open Source Edition
8 * Document Management Made Simple 8 * Document Management Made Simple
9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
10 - * 10 + *
11 * This program is free software; you can redistribute it and/or modify it under 11 * This program is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU General Public License version 3 as published by the 12 * the terms of the GNU General Public License version 3 as published by the
13 * Free Software Foundation. 13 * Free Software Foundation.
14 - * 14 + *
15 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * This program is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 * details. 18 * details.
19 - * 19 + *
20 * You should have received a copy of the GNU General Public License 20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>. 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 - * 22 + *
23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
25 - * 25 + *
26 * The interactive user interfaces in modified source and object code versions 26 * The interactive user interfaces in modified source and object code versions
27 * of this program must display Appropriate Legal Notices, as required under 27 * of this program must display Appropriate Legal Notices, as required under
28 * Section 5 of the GNU General Public License version 3. 28 * Section 5 of the GNU General Public License version 3.
29 - * 29 + *
30 * In accordance with Section 7(b) of the GNU General Public License version 3, 30 * In accordance with Section 7(b) of the GNU General Public License version 3,
31 * these Appropriate Legal Notices must retain the display of the "Powered by 31 * these Appropriate Legal Notices must retain the display of the "Powered by
32 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 32 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
34 - * must display the words "Powered by KnowledgeTree" and retain the original  
35 - * copyright notice. 34 + * must display the words "Powered by KnowledgeTree" and retain the original
  35 + * copyright notice.
36 * Contributor( s): ______________________________________ 36 * Contributor( s): ______________________________________
37 */ 37 */
38 38
@@ -72,7 +72,7 @@ class KTBulkImportManager { @@ -72,7 +72,7 @@ class KTBulkImportManager {
72 72
73 function _importfolder($oFolder, $sPath) { 73 function _importfolder($oFolder, $sPath) {
74 $oPermission = KTPermission::getByName('ktcore.permissions.addFolder'); 74 $oPermission = KTPermission::getByName('ktcore.permissions.addFolder');
75 - 75 +
76 $aDocPaths = $this->oStorage->listDocuments($sPath); 76 $aDocPaths = $this->oStorage->listDocuments($sPath);
77 if (PEAR::isError($aDocPaths)) { 77 if (PEAR::isError($aDocPaths)) {
78 return $aDocPaths; 78 return $aDocPaths;
@@ -91,7 +91,7 @@ class KTBulkImportManager { @@ -91,7 +91,7 @@ class KTBulkImportManager {
91 if (Folder::folderExistsName(utf8_encode(basename($sFolderPath)), KTUtil::getId($oFolder))) { 91 if (Folder::folderExistsName(utf8_encode(basename($sFolderPath)), KTUtil::getId($oFolder))) {
92 $_SESSION['KTErrorMessage'][] = sprintf(_kt("The folder %s is already present in %s. Adding files into pre-existing folder."), utf8_encode(basename($sFolderPath)), $oFolder->getName()); 92 $_SESSION['KTErrorMessage'][] = sprintf(_kt("The folder %s is already present in %s. Adding files into pre-existing folder."), utf8_encode(basename($sFolderPath)), $oFolder->getName());
93 $aOptions = Folder::getList("parent_id = " . KTUtil::getId($oFolder) . ' AND name = "' . DBUtil::escapeSimple(utf8_encode(basename($sFolderPath))) . '"'); 93 $aOptions = Folder::getList("parent_id = " . KTUtil::getId($oFolder) . ' AND name = "' . DBUtil::escapeSimple(utf8_encode(basename($sFolderPath))) . '"');
94 - if (PEAR::isError($aOptions)) { 94 + if (PEAR::isError($aOptions)) {
95 return $aOptions; 95 return $aOptions;
96 } 96 }
97 if (count($aOptions) != 1) { 97 if (count($aOptions) != 1) {
@@ -100,7 +100,7 @@ class KTBulkImportManager { @@ -100,7 +100,7 @@ class KTBulkImportManager {
100 $oThisFolder = $aOptions[0]; 100 $oThisFolder = $aOptions[0];
101 } 101 }
102 } else { 102 } else {
103 - 103 +
104 if(KTPermissionUtil::userHasPermissionOnItem($this->oUser, $oPermission, $oFolder)) 104 if(KTPermissionUtil::userHasPermissionOnItem($this->oUser, $oPermission, $oFolder))
105 { 105 {
106 $oThisFolder = KTFolderUtil::add($oFolder, utf8_encode(basename($sFolderPath)), $this->oUser); 106 $oThisFolder = KTFolderUtil::add($oFolder, utf8_encode(basename($sFolderPath)), $this->oUser);
@@ -119,7 +119,7 @@ class KTBulkImportManager { @@ -119,7 +119,7 @@ class KTBulkImportManager {
119 } 119 }
120 120
121 $res = $this->_importfolder($oThisFolder, $sFolderPath); 121 $res = $this->_importfolder($oThisFolder, $sFolderPath);
122 - 122 +
123 if (PEAR::isError($res)) { 123 if (PEAR::isError($res)) {
124 return $res; 124 return $res;
125 } 125 }
@@ -128,6 +128,7 @@ class KTBulkImportManager { @@ -128,6 +128,7 @@ class KTBulkImportManager {
128 128
129 function _importdocument($oFolder, $sPath) { 129 function _importdocument($oFolder, $sPath) {
130 $aInfo = $this->oStorage->getDocumentInfo($sPath); 130 $aInfo = $this->oStorage->getDocumentInfo($sPath);
  131 + $sTmpFileName = sprintf("%s/%s", $this->oStorage->sBasePath, $sPath);
131 if (PEAR::isError($aInfo)) { 132 if (PEAR::isError($aInfo)) {
132 return $aInfo; 133 return $aInfo;
133 } 134 }
@@ -135,7 +136,7 @@ class KTBulkImportManager { @@ -135,7 +136,7 @@ class KTBulkImportManager {
135 /*if (KTDocumentUtil::nameExists($oFolder, utf8_encode(basename($sPath)))) { 136 /*if (KTDocumentUtil::nameExists($oFolder, utf8_encode(basename($sPath)))) {
136 $_SESSION['KTErrorMessage'][] = sprintf(_kt("The document %s is already present in %s. Ignoring."), utf8_encode(basename($sPath)), $oFolder->getName()); 137 $_SESSION['KTErrorMessage'][] = sprintf(_kt("The document %s is already present in %s. Ignoring."), utf8_encode(basename($sPath)), $oFolder->getName());
137 $oDocument =& Document::getByNameAndFolder(utf8_encode(basename($sPath)), KTUtil::getId($oFolder)); 138 $oDocument =& Document::getByNameAndFolder(utf8_encode(basename($sPath)), KTUtil::getId($oFolder));
138 - return $oDocument; 139 + return $oDocument;
139 } else if (KTDocumentUtil::fileExists($oFolder, utf8_encode(basename($sPath)))) { 140 } else if (KTDocumentUtil::fileExists($oFolder, utf8_encode(basename($sPath)))) {
140 $_SESSION['KTErrorMessage'][] = sprintf(_kt("The document %s is already present in %s. Ignoring."), utf8_encode(basename($sPath)), $oFolder->getName()); 141 $_SESSION['KTErrorMessage'][] = sprintf(_kt("The document %s is already present in %s. Ignoring."), utf8_encode(basename($sPath)), $oFolder->getName());
141 $oDocument =& Document::getByFilenameAndFolder(utf8_encode(basename($sPath)), KTUtil::getId($oFolder)); 142 $oDocument =& Document::getByFilenameAndFolder(utf8_encode(basename($sPath)), KTUtil::getId($oFolder));
@@ -144,10 +145,12 @@ class KTBulkImportManager { @@ -144,10 +145,12 @@ class KTBulkImportManager {
144 // else 145 // else
145 $aOptions = array( 146 $aOptions = array(
146 // XXX: Multiversion Import 147 // XXX: Multiversion Import
147 - 'contents' => $aInfo->aVersions[0], 148 + //'contents' => $aInfo->aVersions[0],
  149 + 'temp_file' => $sTmpFileName,
148 'metadata' => $this->aMetadata, 150 'metadata' => $this->aMetadata,
149 'documenttype' => $this->oDocumentType, 151 'documenttype' => $this->oDocumentType,
150 ); 152 );
  153 + $aOptions = array_merge($aOptions, $this->aOptions);
151 $oDocument =& KTDocumentUtil::add($oFolder, utf8_encode(basename($sPath)), $this->oUser, $aOptions); 154 $oDocument =& KTDocumentUtil::add($oFolder, utf8_encode(basename($sPath)), $this->oUser, $aOptions);
152 return $oDocument; 155 return $oDocument;
153 } 156 }
lib/ktentity.inc
@@ -7,32 +7,32 @@ @@ -7,32 +7,32 @@
7 * KnowledgeTree Open Source Edition 7 * KnowledgeTree Open Source Edition
8 * Document Management Made Simple 8 * Document Management Made Simple
9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
10 - * 10 + *
11 * This program is free software; you can redistribute it and/or modify it under 11 * This program is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU General Public License version 3 as published by the 12 * the terms of the GNU General Public License version 3 as published by the
13 * Free Software Foundation. 13 * Free Software Foundation.
14 - * 14 + *
15 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * This program is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 * details. 18 * details.
19 - * 19 + *
20 * You should have received a copy of the GNU General Public License 20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>. 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 - * 22 + *
23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
25 - * 25 + *
26 * The interactive user interfaces in modified source and object code versions 26 * The interactive user interfaces in modified source and object code versions
27 * of this program must display Appropriate Legal Notices, as required under 27 * of this program must display Appropriate Legal Notices, as required under
28 * Section 5 of the GNU General Public License version 3. 28 * Section 5 of the GNU General Public License version 3.
29 - * 29 + *
30 * In accordance with Section 7(b) of the GNU General Public License version 3, 30 * In accordance with Section 7(b) of the GNU General Public License version 3,
31 * these Appropriate Legal Notices must retain the display of the "Powered by 31 * these Appropriate Legal Notices must retain the display of the "Powered by
32 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 32 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
34 - * must display the words "Powered by KnowledgeTree" and retain the original  
35 - * copyright notice. 34 + * must display the words "Powered by KnowledgeTree" and retain the original
  35 + * copyright notice.
36 * Contributor( s): ______________________________________ 36 * Contributor( s): ______________________________________
37 */ 37 */
38 38
@@ -742,58 +742,65 @@ class KTEntityUtil { @@ -742,58 +742,65 @@ class KTEntityUtil {
742 // var_dump("Building proxy for $sClassName"); 742 // var_dump("Building proxy for $sClassName");
743 $methods = get_class_methods($sClassName); 743 $methods = get_class_methods($sClassName);
744 $allcode = array(); 744 $allcode = array();
  745 + $allcode[] = sprintf('var $cacheGlobal = null;%s', "\n");
  746 +
745 foreach ($methods as $sMethod) { 747 foreach ($methods as $sMethod) {
746 - $code = sprintf('function %s() { $aArgs = func_get_args(); return $this->_callOnObject("%s", $aArgs); }%s', $sMethod, $sMethod, "\n");  
747 - $allcode[] = $code; 748 + if ($sMethod == 'getid') {
  749 + $code = sprintf('function getId() { return $this->iId; }');
  750 + } else if ($sMethod == '_table' || $sMethod == 'update' ) {
  751 + $code = sprintf('function %s() { return parent::%s(); }', $sMethod, $sMethod);
  752 + } else if ($sMethod == 'get') {
  753 + $code = sprintf('function get($oId) { return $this->get(%s, $oid); }', $sClassName);
  754 + } else {
  755 + $code = sprintf('function %s() { $aArgs = func_get_args(); return $this->_callOnObject("%s", $aArgs); }%s', $sMethod, $sMethod, "\n");
  756 + }
  757 + $allcode[] = $code;
748 } 758 }
749 759
750 $allcode[] = sprintf('function &_fetch() { 760 $allcode[] = sprintf('function &_fetch() {
751 - if (!empty($GLOBALS["_OBJECTCACHE"]["%s"][$this->iId])) {  
752 - $oObject =& $GLOBALS["_OBJECTCACHE"]["%s"][$this->iId]; 761 + if (!empty($this->cacheGlobal[$this->iId])) {
  762 + $oObject =& $this->cacheGlobal[$this->iId];
  763 + return $oObject;
  764 + }
  765 + $oObject =new %s;
  766 + $res = $oObject->load($this->iId);
  767 + if (PEAR::isError($res)) {
  768 + return $res;
  769 + }
  770 + $this->cacheGlobal[$this->iId] =& $oObject;
753 return $oObject; 771 return $oObject;
754 - }  
755 - $oObject =new %s;  
756 - $res = $oObject->load($this->iId);  
757 - if (PEAR::isError($res)) {  
758 - return $res;  
759 - }  
760 - $GLOBALS["_OBJECTCACHE"]["%s"][$this->iId] =& $oObject;  
761 - return $oObject;  
762 - }  
763 - ', $sClassName, $sClassName, $sClassName, $sClassName); 772 + }', $sClassName, $sClassName, $sClassName, $sClassName);
764 773
765 $allcode[] = sprintf('function _save(&$oObject) { 774 $allcode[] = sprintf('function _save(&$oObject) {
766 - $GLOBALS["_OBJECTCACHE"]["%s"][$this->iId] =& $oObject;  
767 - }  
768 - ', $sClassName); 775 + $this->cacheGlobal[$this->iId] =& $oObject;
  776 + }', $sClassName);
769 777
770 $allcode[] = 'function &_callOnObject($sName, $aArgs) { 778 $allcode[] = 'function &_callOnObject($sName, $aArgs) {
771 - $oObject =& $this->_fetch();  
772 - if (PEAR::isError($oObject)) {  
773 - return $oObject;  
774 - }  
775 - /* */  
776 - $res = call_user_func_array(array(&$oObject, $sName), $aArgs);  
777 - $this->_save($oObject);  
778 - return $res;  
779 - /* */ 779 + $oObject =& $this->_fetch();
  780 + if (PEAR::isError($oObject)) {
  781 + return $oObject;
  782 + }
  783 + /* */
  784 + $res = call_user_func_array(array(&$oObject, $sName), $aArgs);
  785 + $this->cacheGlobal[$this->iId] =& $oObject;
  786 + return $res;
  787 + /* */
780 788
781 - /* */  
782 - $aExecArgs = array();  
783 - $exec = \'$res =& $oObject->$sName(\';  
784 - foreach (array_keys($aArgs) as $iKey) {  
785 - $aExecArgs[] = \'$aArgs[\' . $iKey . \']\';  
786 - }  
787 - $exec .= join(", ", $aExecArgs);  
788 - $exec .= \');\';  
789 - eval($exec);  
790 - $this->_save($oObject);  
791 - return $res;  
792 - /* */  
793 - }  
794 - '; 789 + /* */
  790 + $aExecArgs = array();
  791 + $exec = \'$res =& $oObject->$sName(\';
  792 + foreach (array_keys($aArgs) as $iKey) {
  793 + $aExecArgs[] = \'$aArgs[\' . $iKey . \']\';
  794 + }
  795 + $exec .= join(", ", $aExecArgs);
  796 + $exec .= \');\';
  797 + eval($exec);
  798 + $this->cacheGlobal[$this->iId] =& $oObject;
  799 + return $res;
  800 + /* */
  801 + }';
795 802
796 - $allcode[] = sprintf('function %s ($iId) { $this->iId = $iId; }' . "\n", $sProxyClassName); 803 + $allcode[] = sprintf('function %s ($iId) { $this->iId = $iId; $this->cacheGlobal =& $GLOBALS["_OBJECTCACHE"][%s]; }' . "\n", $sProxyClassName, $sClassName);
797 804
798 $gen = sprintf("class %s extends %s {\n", $sProxyClassName, $sClassName); 805 $gen = sprintf("class %s extends %s {\n", $sProxyClassName, $sClassName);
799 $gen .= " " . join("\n ", $allcode) . "\n"; 806 $gen .= " " . join("\n ", $allcode) . "\n";
lib/metadata/fieldsetregistry.inc.php
1 <?php 1 <?php
2 /** 2 /**
3 * $Id$ 3 * $Id$
4 - * 4 + *
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 */ 35 */
36 36
37 -/* fun with adaptors. 37 +/* fun with adaptors.
38 * 38 *
39 * Each fieldset type needs to handle 39 * Each fieldset type needs to handle
40 * - widget generation 40 * - widget generation
@@ -44,23 +44,23 @@ @@ -44,23 +44,23 @@
44 * - fulltext generation 44 * - fulltext generation
45 * - search widget/criteria 45 * - search widget/criteria
46 * 46 *
47 - * Very little of this is actually handled in this version. In fact, at the  
48 - * moment the entire thing is faked. This is done to make add/edit a little 47 + * Very little of this is actually handled in this version. In fact, at the
  48 + * moment the entire thing is faked. This is done to make add/edit a little
49 * more sane. 49 * more sane.
50 * 50 *
51 * In the long term, the "correct" approach here will be to make the actual 51 * In the long term, the "correct" approach here will be to make the actual
52 * KTFieldsetType a class, and to extend fieldset with a "config_array" and 52 * KTFieldsetType a class, and to extend fieldset with a "config_array" and
53 - * "fieldset_type_namespace" params. 53 + * "fieldset_type_namespace" params.
54 * 54 *
55 * Comments and suggestions on this are welcome. 55 * Comments and suggestions on this are welcome.
56 */ 56 */
57 - 57 +
58 require_once(KT_LIB_DIR . "/widgets/widgetfactory.inc.php"); 58 require_once(KT_LIB_DIR . "/widgets/widgetfactory.inc.php");
59 require_once(KT_LIB_DIR . "/validation/validatorfactory.inc.php"); 59 require_once(KT_LIB_DIR . "/validation/validatorfactory.inc.php");
60 60
61 class KTFieldsetRegistry { 61 class KTFieldsetRegistry {
62 var $fieldsettypes; 62 var $fieldsettypes;
63 - 63 +
64 var $oVF; 64 var $oVF;
65 var $oWF; 65 var $oWF;
66 66
@@ -70,11 +70,11 @@ class KTFieldsetRegistry { @@ -70,11 +70,11 @@ class KTFieldsetRegistry {
70 } 70 }
71 return $GLOBALS['_KT_PLUGIN']['oKTFieldsetRegistry']; 71 return $GLOBALS['_KT_PLUGIN']['oKTFieldsetRegistry'];
72 } 72 }
73 - 73 +
74 function registerType($sClassname, $sNS, $sFile) { 74 function registerType($sClassname, $sNS, $sFile) {
75 // stub 75 // stub
76 } 76 }
77 - 77 +
78 function formElementsForFieldset($fieldsetOrType, $sContainerName, $oDocument = null) { 78 function formElementsForFieldset($fieldsetOrType, $sContainerName, $oDocument = null) {
79 // we want to create: 79 // we want to create:
80 // 80 //
@@ -82,32 +82,32 @@ class KTFieldsetRegistry { @@ -82,32 +82,32 @@ class KTFieldsetRegistry {
82 // - widgets 82 // - widgets
83 // 83 //
84 // use $oDocument as a stub *if* its set. 84 // use $oDocument as a stub *if* its set.
85 - 85 +
86 } 86 }
87 87
88 function widgetsForFieldset($fieldsetOrType, $sContainerName, $oDocument = null) { 88 function widgetsForFieldset($fieldsetOrType, $sContainerName, $oDocument = null) {
89 // this is likely to be called repeatedly. 89 // this is likely to be called repeatedly.
90 if (is_null($this->oWF)) { 90 if (is_null($this->oWF)) {
91 - $this->oWF =& KTWidgetFactory::getSingleton();  
92 - }  
93 - 91 + $this->oWF =& KTWidgetFactory::getSingleton();
  92 + }
  93 +
94 // we're going to create one of two things, here: 94 // we're going to create one of two things, here:
95 // - conditional fieldset widget 95 // - conditional fieldset widget
96 // - a "Fieldset" widget 96 // - a "Fieldset" widget
97 - 97 +
98 // FIXME delegate. 98 // FIXME delegate.
99 $oFieldset =& $fieldsetOrType; 99 $oFieldset =& $fieldsetOrType;
100 if ($oFieldset->getIsConditional()) { 100 if ($oFieldset->getIsConditional()) {
101 - return PEAR::raiseError(_kt("Conditional Fieldsets are not yet implemented")); 101 + return PEAR::raiseError(_kt("Conditional Fieldsets are not yet implemented"));
102 } else { 102 } else {
103 $widgets = array(); 103 $widgets = array();
104 $fields = $oFieldset->getFields(); 104 $fields = $oFieldset->getFields();
105 - 105 +
106 foreach ($fields as $oField) { 106 foreach ($fields as $oField) {
107 107
108 - $fname = 'metadata_' . $oField->getId(); 108 + $fname = 'metadata_' . $oField->getId();
109 $value = null; 109 $value = null;
110 - 110 +
111 // check if we had an old value 111 // check if we had an old value
112 if (!is_null($oDocument)) { 112 if (!is_null($oDocument)) {
113 $oFL = DocumentFieldLink::getByDocumentAndField($oDocument, $oField); 113 $oFL = DocumentFieldLink::getByDocumentAndField($oDocument, $oField);
@@ -115,7 +115,7 @@ class KTFieldsetRegistry { @@ -115,7 +115,7 @@ class KTFieldsetRegistry {
115 $value = $oFL->getValue(); 115 $value = $oFL->getValue();
116 } 116 }
117 } 117 }
118 - 118 +
119 // we have to hack in support for the hardcoded types of fields 119 // we have to hack in support for the hardcoded types of fields
120 // handled by the "generic" widget. 120 // handled by the "generic" widget.
121 // 121 //
@@ -150,7 +150,7 @@ class KTFieldsetRegistry { @@ -150,7 +150,7 @@ class KTFieldsetRegistry {
150 'id_method' => 'getName', 150 'id_method' => 'getName',
151 'label_method' => 'getName', 151 'label_method' => 'getName',
152 'unselected_label' => _kt("No selection."), 152 'unselected_label' => _kt("No selection."),
153 - 'simple_select' => false, 153 + 'simple_select' => false,
154 )); 154 ));
155 } else if ($type == 'ktcore.fields.tree') { 155 } else if ($type == 'ktcore.fields.tree') {
156 $widgets[] = $this->oWF->get('ktcore.widgets.treemetadata', array( 156 $widgets[] = $this->oWF->get('ktcore.widgets.treemetadata', array(
@@ -164,7 +164,7 @@ class KTFieldsetRegistry { @@ -164,7 +164,7 @@ class KTFieldsetRegistry {
164 )); 164 ));
165 } 165 }
166 } 166 }
167 - 167 +
168 return array($this->oWF->get('ktcore.widgets.fieldset',array( 168 return array($this->oWF->get('ktcore.widgets.fieldset',array(
169 'label' => $oFieldset->getName(), 169 'label' => $oFieldset->getName(),
170 'description' => $oFieldset->getDescription(), 170 'description' => $oFieldset->getDescription(),
@@ -173,33 +173,36 @@ class KTFieldsetRegistry { @@ -173,33 +173,36 @@ class KTFieldsetRegistry {
173 ))); 173 )));
174 } 174 }
175 } 175 }
176 - 176 +
177 177
178 function validatorsForFieldset($fieldsetOrType, $sContainerName, $oDocument = null, $bIncludeAuto = false) { 178 function validatorsForFieldset($fieldsetOrType, $sContainerName, $oDocument = null, $bIncludeAuto = false) {
179 // this is likely to be called repeatedly. 179 // this is likely to be called repeatedly.
180 if (is_null($this->oVF)) { 180 if (is_null($this->oVF)) {
181 - $this->oVF =& KTValidatorFactory::getSingleton();  
182 - }  
183 - 181 + $this->oVF =& KTValidatorFactory::getSingleton();
  182 + }
  183 +
184 // FIXME delegate. 184 // FIXME delegate.
185 $oFieldset =& $fieldsetOrType; 185 $oFieldset =& $fieldsetOrType;
186 if ($oFieldset->getIsConditional()) { 186 if ($oFieldset->getIsConditional()) {
187 - return PEAR::raiseError(_kt("Conditional Fieldsets are not yet implemented")); 187 + return PEAR::raiseError(_kt("Conditional Fieldsets are not yet implemented"));
188 } else { 188 } else {
189 $validators = array(); 189 $validators = array();
190 $fields = $oFieldset->getFields(); 190 $fields = $oFieldset->getFields();
191 - 191 +
192 if ($bIncludeAuto) { 192 if ($bIncludeAuto) {
193 // we need to do *all* validation 193 // we need to do *all* validation
194 // since we may be used outside a form. 194 // since we may be used outside a form.
195 // 195 //
196 // to prevent code duplication, we cheat and get the autovalidators 196 // to prevent code duplication, we cheat and get the autovalidators
197 // this makes add/edit forms marginally less efficient, but we'll deal. 197 // this makes add/edit forms marginally less efficient, but we'll deal.
198 - 198 +
199 $widgets = $this->widgetsForFieldset($oFieldset, $sContainerName, $sDocument); 199 $widgets = $this->widgetsForFieldset($oFieldset, $sContainerName, $sDocument);
200 $validators = kt_array_merge($validators, $widgets[0]->getValidators()); 200 $validators = kt_array_merge($validators, $widgets[0]->getValidators());
201 } 201 }
202 - 202 +
  203 + $config = KTConfig::getSingleton();
  204 + $maxLength = $config->get('KnowledgeTree/maxMetadataLength',10240);
  205 +
203 foreach ($fields as $oField) { 206 foreach ($fields as $oField) {
204 207
205 $type = ''; 208 $type = '';
@@ -212,11 +215,12 @@ class KTFieldsetRegistry { @@ -212,11 +215,12 @@ class KTFieldsetRegistry {
212 } else { 215 } else {
213 $type = 'ktcore.fields.string'; 216 $type = 'ktcore.fields.string';
214 } 217 }
215 - 218 +
216 $fname = 'metadata_' . $oField->getId(); 219 $fname = 'metadata_' . $oField->getId();
217 if ($type == 'ktcore.fields.string') { 220 if ($type == 'ktcore.fields.string') {
218 $validators[] = $this->oVF->get('ktcore.validators.string',array( 221 $validators[] = $this->oVF->get('ktcore.validators.string',array(
219 'test' => $fname, 222 'test' => $fname,
  223 + 'max_length'=>$maxLength,
220 'output' => $fname, 224 'output' => $fname,
221 )); 225 ));
222 } else if ($type == 'ktcore.fields.lookup') { 226 } else if ($type == 'ktcore.fields.lookup') {
@@ -238,14 +242,14 @@ class KTFieldsetRegistry { @@ -238,14 +242,14 @@ class KTFieldsetRegistry {
238 $validators[] = PEAR::raiseError(sprintf(_kt("Unable to deal with field: id %d"), $oField->getId())); 242 $validators[] = PEAR::raiseError(sprintf(_kt("Unable to deal with field: id %d"), $oField->getId()));
239 } 243 }
240 } 244 }
241 - 245 +
242 return array($this->oVF->get('ktcore.validators.fieldset',array( 246 return array($this->oVF->get('ktcore.validators.fieldset',array(
243 'test' => $sContainerName, 247 'test' => $sContainerName,
244 'output' => $sContainerName, 248 'output' => $sContainerName,
245 'validators' => $validators, 249 'validators' => $validators,
246 ))); 250 )));
247 } 251 }
248 - } 252 + }
249 } 253 }
250 254
251 ?> 255 ?>
lib/permissions/permissionutil.inc.php
@@ -196,15 +196,41 @@ class KTPermissionUtil { @@ -196,15 +196,41 @@ class KTPermissionUtil {
196 $sWhere = 'permission_object_id = ?'; 196 $sWhere = 'permission_object_id = ?';
197 $aParams = array($oPO->getID()); 197 $aParams = array($oPO->getID());
198 $aFolders =& Folder::getList(array($sWhere, $aParams)); 198 $aFolders =& Folder::getList(array($sWhere, $aParams));
  199 +
  200 + // init once time those var for speeding up updates
  201 + $oChannel =& KTPermissionChannel::getSingleton();
  202 + $aPermAssigns = KTPermissionAssignment::getByObjectMulti($oPO);
  203 + $aMapPermAllowed = array();
  204 + foreach ($aPermAssigns as $oPermAssign) {
  205 + $oPermDescriptor = KTPermissionDescriptor::get($oPermAssign->getPermissionDescriptorID());
  206 + $aGroupIDs = $oPermDescriptor->getGroups();
  207 + $aUserIDs = array();
  208 + $aRoleIDs = $oPermDescriptor->getRoles();
  209 + $aAllowed = array(
  210 + 'group' => $aGroupIDs,
  211 + 'user' => $aUserIDs,
  212 + 'role' => $aRoleIDs,
  213 + );
  214 + $aMapPermAllowed[$oPermAssign->getPermissionID()] = $aAllowed;
  215 + }
  216 + $aMapPermDesc = array();
  217 + foreach ($aMapPermAllowed as $iPermissionId => $aAllowed) {
  218 + $oLookupPD = KTPermissionUtil::getOrCreateDescriptor($aAllowed);
  219 + $aMapPermDesc[$iPermissionId] = $oLookupPD->getID();
  220 + }
  221 +
  222 + $oPermLookup = KTPermissionLookupAssignment::findOrCreateLookupByPermissionDescriptorMap($aMapPermDesc);
  223 + $aOptions = array('channel' => $oChannel, 'map_allowed' => $aMapPermAllowed, 'perm_lookup' => $oPermLookup);
  224 +
199 if (!PEAR::isError($aFolders)) { 225 if (!PEAR::isError($aFolders)) {
200 foreach ($aFolders as $oFolder) { 226 foreach ($aFolders as $oFolder) {
201 - KTPermissionUtil::updatePermissionLookup($oFolder); 227 + KTPermissionUtil::updatePermissionLookup($oFolder, $aOptions);
202 } 228 }
203 } 229 }
204 $aDocuments =& Document::getList(array($sWhere, $aParams)); 230 $aDocuments =& Document::getList(array($sWhere, $aParams));
205 if (!PEAR::isError($aDocuments)) { 231 if (!PEAR::isError($aDocuments)) {
206 foreach ($aDocuments as $oDocument) { 232 foreach ($aDocuments as $oDocument) {
207 - KTPermissionUtil::updatePermissionLookup($oDocument); 233 + KTPermissionUtil::updatePermissionLookup($oDocument, $aOptions);
208 } 234 }
209 } 235 }
210 } 236 }
@@ -248,18 +274,29 @@ class KTPermissionUtil { @@ -248,18 +274,29 @@ class KTPermissionUtil {
248 * Update's the permission lookup on one folder or document, 274 * Update's the permission lookup on one folder or document,
249 * non-recursively. 275 * non-recursively.
250 */ 276 */
251 - function updatePermissionLookup(&$oFolderOrDocument) {  
252 - if (!is_a($oFolderOrDocument, 'Folder')) {  
253 - if (!is_a($oFolderOrDocument, 'Document')) {  
254 - if (!is_a($oFolderOrDocument, 'KTDocumentCore')) {  
255 - return ; // we occasionally get handed a PEAR::raiseError. Just ignore it.  
256 - }  
257 - }  
258 - }  
259 -  
260 - $oChannel =& KTPermissionChannel::getSingleton();  
261 - if (is_a($oFolderOrDocument, 'Folder')) {  
262 - $msg = sprintf("Updating folder %s", join("/", $oFolderOrDocument->getPathArray())); 277 + function updatePermissionLookup(&$oFolderOrDocument, $aOptions = null) {
  278 + $is_a_folder = is_a($oFolderOrDocument, 'Folder');
  279 + $is_a_document = is_a($oFolderOrDocument, 'Document') || is_a($oFolderOrDocument, 'KTDocumentCore');
  280 +
  281 + $oChannel = null;
  282 + $aMapPermAllowed = null;
  283 + $oPermLookup = null;
  284 + if (!is_null($aOptions)) {
  285 + $oChannel = $aOptions['channel'];
  286 + $aMapPermAllowed = $aOptions['map_allowed'];
  287 + $oPermLookup = $aOptions['perm_lookup'];
  288 + }
  289 +
  290 + if (!$is_a_folder && !$is_a_document) {
  291 + return ; // we occasionally get handed a PEAR::raiseError. Just ignore it.
  292 + }
  293 +
  294 +
  295 + if (is_null($oChannel)) {
  296 + $oChannel =& KTPermissionChannel::getSingleton();
  297 + }
  298 + if ($is_a_folder) {
  299 + $msg = sprintf("Updating folder %s", join('/', $oFolderOrDocument->getPathArray()));
263 } else { 300 } else {
264 if (is_a($oFolderOrDocument, 'Document')) { 301 if (is_a($oFolderOrDocument, 'Document')) {
265 $msg = sprintf("Updating document %s", $oFolderOrDocument->getName()); 302 $msg = sprintf("Updating document %s", $oFolderOrDocument->getName());
@@ -273,23 +310,26 @@ class KTPermissionUtil { @@ -273,23 +310,26 @@ class KTPermissionUtil {
273 if (empty($iPermissionObjectId)) { 310 if (empty($iPermissionObjectId)) {
274 return; 311 return;
275 } 312 }
276 - $oPO = KTPermissionObject::get($iPermissionObjectId);  
277 - $aPAs = KTPermissionAssignment::getByObjectMulti($oPO);  
278 - $aMapPermAllowed = array();  
279 - foreach ($aPAs as $oPA) {  
280 - $oPD = KTPermissionDescriptor::get($oPA->getPermissionDescriptorID());  
281 - $aGroupIDs = $oPD->getGroups();  
282 - $aUserIDs = array();  
283 - $aRoleIDs = $oPD->getRoles();  
284 - $aAllowed = array(  
285 - "group" => $aGroupIDs,  
286 - "user" => $aUserIDs,  
287 - "role" => $aRoleIDs,  
288 - );  
289 - $aMapPermAllowed[$oPA->getPermissionID()] = $aAllowed;  
290 - }  
291 -  
292 - if (!is_a($oFolderOrDocument, 'Folder')) { 313 +
  314 + if (is_null($aMapPermAllowed)) {
  315 + $oPO = KTPermissionObject::get($iPermissionObjectId);
  316 + $aPAs = KTPermissionAssignment::getByObjectMulti($oPO);
  317 + $aMapPermAllowed = array();
  318 + foreach ($aPAs as $oPA) {
  319 + $oPD = KTPermissionDescriptor::get($oPA->getPermissionDescriptorID());
  320 + $aGroupIDs = $oPD->getGroups();
  321 + $aUserIDs = array();
  322 + $aRoleIDs = $oPD->getRoles();
  323 + $aAllowed = array(
  324 + 'group' => $aGroupIDs,
  325 + 'user' => $aUserIDs,
  326 + 'role' => $aRoleIDs,
  327 + );
  328 + $aMapPermAllowed[$oPA->getPermissionID()] = $aAllowed;
  329 + }
  330 + }
  331 +
  332 + if (!$is_a_folder) {
293 $aDynamicConditions = KTPermissionDynamicCondition::getByPermissionObject($oPO); 333 $aDynamicConditions = KTPermissionDynamicCondition::getByPermissionObject($oPO);
294 if (!PEAR::isError($aDynamicConditions)) { 334 if (!PEAR::isError($aDynamicConditions)) {
295 foreach ($aDynamicConditions as $oDynamicCondition) { 335 foreach ($aDynamicConditions as $oDynamicCondition) {
@@ -299,7 +339,7 @@ class KTPermissionUtil { @@ -299,7 +339,7 @@ class KTPermissionUtil {
299 $aPermissionIds = $oDynamicCondition->getAssignment(); 339 $aPermissionIds = $oDynamicCondition->getAssignment();
300 foreach ($aPermissionIds as $iPermissionId) { 340 foreach ($aPermissionIds as $iPermissionId) {
301 $aCurrentAllowed = KTUtil::arrayGet($aMapPermAllowed, $iPermissionId, array()); 341 $aCurrentAllowed = KTUtil::arrayGet($aMapPermAllowed, $iPermissionId, array());
302 - $aCurrentAllowed["group"][] = $iGroupId; 342 + $aCurrentAllowed['group'][] = $iGroupId;
303 $aMapPermAllowed[$iPermissionId] = $aCurrentAllowed; 343 $aMapPermAllowed[$iPermissionId] = $aCurrentAllowed;
304 } 344 }
305 } 345 }
@@ -307,7 +347,7 @@ class KTPermissionUtil { @@ -307,7 +347,7 @@ class KTPermissionUtil {
307 } 347 }
308 } 348 }
309 349
310 - if (!is_a($oFolderOrDocument, 'Folder')) { 350 + if (!$is_a_folder) {
311 $oState = KTWorkflowUtil::getWorkflowStateForDocument($oFolderOrDocument); 351 $oState = KTWorkflowUtil::getWorkflowStateForDocument($oFolderOrDocument);
312 if (!(PEAR::isError($oState) || is_null($oState) || ($oState == false))) { 352 if (!(PEAR::isError($oState) || is_null($oState) || ($oState == false))) {
313 $aWorkflowStatePermissionAssignments = KTWorkflowStatePermissionAssignment::getByState($oState); 353 $aWorkflowStatePermissionAssignments = KTWorkflowStatePermissionAssignment::getByState($oState);
@@ -320,9 +360,9 @@ class KTPermissionUtil { @@ -320,9 +360,9 @@ class KTPermissionUtil {
320 $aUserIDs = array(); 360 $aUserIDs = array();
321 $aRoleIDs = $oPD->getRoles(); 361 $aRoleIDs = $oPD->getRoles();
322 $aAllowed = array( 362 $aAllowed = array(
323 - "group" => $aGroupIDs,  
324 - "user" => $aUserIDs,  
325 - "role" => $aRoleIDs, 363 + 'group' => $aGroupIDs,
  364 + 'user' => $aUserIDs,
  365 + 'role' => $aRoleIDs,
326 ); 366 );
327 $aMapPermAllowed[$iPermissionId] = $aAllowed; 367 $aMapPermAllowed[$iPermissionId] = $aAllowed;
328 } 368 }
@@ -331,8 +371,11 @@ class KTPermissionUtil { @@ -331,8 +371,11 @@ class KTPermissionUtil {
331 371
332 // if we have roles: nearest folder. 372 // if we have roles: nearest folder.
333 $iRoleSourceFolder = null; 373 $iRoleSourceFolder = null;
334 - if (is_a($oFolderOrDocument, 'KTDocumentCore') || is_a($oFolderOrDocument, 'Document')) { $iRoleSourceFolder = $oFolderOrDocument->getFolderID(); }  
335 - else { $iRoleSourceFolder = $oFolderOrDocument->getId(); } 374 + if ($is_a_document) {
  375 + $iRoleSourceFolder = $oFolderOrDocument->getFolderID();
  376 + }else {
  377 + $iRoleSourceFolder = $oFolderOrDocument->getId();
  378 + }
336 379
337 // very minor perf win: map role_id (in context) to PD. 380 // very minor perf win: map role_id (in context) to PD.
338 $_roleCache = array(); 381 $_roleCache = array();
@@ -350,7 +393,7 @@ class KTPermissionUtil { @@ -350,7 +393,7 @@ class KTPermissionUtil {
350 } 393 }
351 if (!array_key_exists($iRoleId, $_roleCache)) { 394 if (!array_key_exists($iRoleId, $_roleCache)) {
352 $oRoleAllocation = null; 395 $oRoleAllocation = null;
353 - if (is_a($oFolderOrDocument, 'KTDocumentCore') || is_a($oFolderOrDocument, 'Document')) { 396 + if ($is_a_document) {
354 $oRoleAllocation =& DocumentRoleAllocation::getAllocationsForDocumentAndRole($oFolderOrDocument->getId(), $iRoleId); 397 $oRoleAllocation =& DocumentRoleAllocation::getAllocationsForDocumentAndRole($oFolderOrDocument->getId(), $iRoleId);
355 if (PEAR::isError($oRoleAllocation)) { $oRoleAllocation = null; } 398 if (PEAR::isError($oRoleAllocation)) { $oRoleAllocation = null; }
356 } 399 }
@@ -387,14 +430,17 @@ class KTPermissionUtil { @@ -387,14 +430,17 @@ class KTPermissionUtil {
387 */ 430 */
388 431
389 432
390 - $aMapPermDesc = array();  
391 - foreach ($aMapPermAllowed as $iPermissionId => $aAllowed) {  
392 - $oLookupPD = KTPermissionUtil::getOrCreateDescriptor($aAllowed);  
393 - $aMapPermDesc[$iPermissionId] = $oLookupPD->getID(); 433 + if (is_null($oPermLookup)) {
  434 + $aMapPermDesc = array();
  435 + foreach ($aMapPermAllowed as $iPermissionId => $aAllowed) {
  436 + $oLookupPD = KTPermissionUtil::getOrCreateDescriptor($aAllowed);
  437 + $aMapPermDesc[$iPermissionId] = $oLookupPD->getID();
  438 + }
  439 +
  440 + $oPermLookup = KTPermissionLookupAssignment::findOrCreateLookupByPermissionDescriptorMap($aMapPermDesc);
394 } 441 }
395 442
396 - $oPL = KTPermissionLookupAssignment::findOrCreateLookupByPermissionDescriptorMap($aMapPermDesc);  
397 - $oFolderOrDocument->setPermissionLookupID($oPL->getID()); 443 + $oFolderOrDocument->setPermissionLookupID($oPermLookup->getID());
398 $oFolderOrDocument->update(); 444 $oFolderOrDocument->update();
399 } 445 }
400 // }}} 446 // }}}
lib/plugins/plugin.inc.php
@@ -395,6 +395,9 @@ class KTPlugin { @@ -395,6 +395,9 @@ class KTPlugin {
395 $query = "SELECT * FROM plugin_helper h WHERE plugin = '{$this->sNamespace}'"; 395 $query = "SELECT * FROM plugin_helper h WHERE plugin = '{$this->sNamespace}'";
396 $aPluginHelpers = DBUtil::getResultArray($query); 396 $aPluginHelpers = DBUtil::getResultArray($query);
397 397
  398 + // Include any required resources, javascript files, etc
  399 + $this->run_setup();
  400 +
398 if(!empty($aPluginHelpers)){ 401 if(!empty($aPluginHelpers)){
399 foreach ($aPluginHelpers as $plugin) { 402 foreach ($aPluginHelpers as $plugin) {
400 $sName = $plugin['namespace']; 403 $sName = $plugin['namespace'];
@@ -632,6 +635,10 @@ class KTPlugin { @@ -632,6 +635,10 @@ class KTPlugin {
632 return; 635 return;
633 } 636 }
634 637
  638 + function run_setup() {
  639 + return;
  640 + }
  641 +
635 function stripKtDir($sFilename) { 642 function stripKtDir($sFilename) {
636 if (strpos($sFilename, KT_DIR) === 0 ||strpos($sFilename, realpath(KT_DIR)) === 0) { 643 if (strpos($sFilename, KT_DIR) === 0 ||strpos($sFilename, realpath(KT_DIR)) === 0) {
637 return substr($sFilename, strlen(KT_DIR) + 1); 644 return substr($sFilename, strlen(KT_DIR) + 1);
lib/storage/ondiskhashedstoragemanager.inc.php
@@ -44,7 +44,14 @@ require_once(KT_LIB_DIR . &#39;/documentmanagement/documentcontentversion.inc.php&#39;); @@ -44,7 +44,14 @@ require_once(KT_LIB_DIR . &#39;/documentmanagement/documentcontentversion.inc.php&#39;);
44 require_once(KT_LIB_DIR . '/filelike/fsfilelike.inc.php'); 44 require_once(KT_LIB_DIR . '/filelike/fsfilelike.inc.php');
45 45
46 class KTOnDiskHashedStorageManager extends KTStorageManager { 46 class KTOnDiskHashedStorageManager extends KTStorageManager {
47 - function upload(&$oDocument, $sTmpFilePath) { 47 + function upload(&$oDocument, $sTmpFilePath, $aOptions = null) {
  48 +
  49 + if (!file_exists($sTmpFilePath)) {
  50 +
  51 + return new PEAR_Error("$sTmpFilePath does not exist so we can't copy it into the repository! Options: " . print_r($aOptions,true) );
  52 + }
  53 +
  54 +
48 $oConfig =& KTConfig::getSingleton(); 55 $oConfig =& KTConfig::getSingleton();
49 $sStoragePath = $this->generateStoragePath($oDocument); 56 $sStoragePath = $this->generateStoragePath($oDocument);
50 if (PEAR::isError($sStoragePath)) { 57 if (PEAR::isError($sStoragePath)) {
@@ -60,7 +67,7 @@ class KTOnDiskHashedStorageManager extends KTStorageManager { @@ -60,7 +67,7 @@ class KTOnDiskHashedStorageManager extends KTStorageManager {
60 if (OS_WINDOWS) { 67 if (OS_WINDOWS) {
61 $sDocumentFileSystemPath = str_replace('\\','/',$sDocumentFileSystemPath); 68 $sDocumentFileSystemPath = str_replace('\\','/',$sDocumentFileSystemPath);
62 } 69 }
63 - if ($this->writeToFile($sTmpFilePath, $sDocumentFileSystemPath)) { 70 + if ($this->writeToFile($sTmpFilePath, $sDocumentFileSystemPath, $aOptions)) {
64 $end_time = KTUtil::getBenchmarkTime(); 71 $end_time = KTUtil::getBenchmarkTime();
65 global $default; 72 global $default;
66 $default->log->info(sprintf("Uploaded %d byte file in %.3f seconds", $file_size, $end_time - $start_time)); 73 $default->log->info(sprintf("Uploaded %d byte file in %.3f seconds", $file_size, $end_time - $start_time));
@@ -70,10 +77,10 @@ class KTOnDiskHashedStorageManager extends KTStorageManager { @@ -70,10 +77,10 @@ class KTOnDiskHashedStorageManager extends KTStorageManager {
70 if (file_exists($sDocumentFileSystemPath)) { 77 if (file_exists($sDocumentFileSystemPath)) {
71 return true; 78 return true;
72 } else { 79 } else {
73 - return false; 80 + return new PEAR_Error("$sDocumentFileSystemPath does not exist after write to storage path. Options: " . print_r($aOptions,true));
74 } 81 }
75 } else { 82 } else {
76 - return false; 83 + return new PEAR_Error("Could not write $sTmpFilePath to $sDocumentFileSystemPath with options: " . print_r($aOptions,true));
77 } 84 }
78 } 85 }
79 86
@@ -100,8 +107,11 @@ class KTOnDiskHashedStorageManager extends KTStorageManager { @@ -100,8 +107,11 @@ class KTOnDiskHashedStorageManager extends KTStorageManager {
100 return false; 107 return false;
101 } 108 }
102 109
103 - function writeToFile($sTmpFilePath, $sDocumentFileSystemPath) { 110 + function writeToFile($sTmpFilePath, $sDocumentFileSystemPath, $aOptions = null) {
104 // Make it easy to write compressed/encrypted storage 111 // Make it easy to write compressed/encrypted storage
  112 + if(isset($aOptions['copy_upload']) && ($aOptions['copy_upload'] == 'true')) {
  113 + return copy($sTmpFilePath, $sDocumentFileSystemPath);
  114 + }
105 115
106 if (is_uploaded_file($sTmpFilePath)) 116 if (is_uploaded_file($sTmpFilePath))
107 return move_uploaded_file($sTmpFilePath, $sDocumentFileSystemPath); 117 return move_uploaded_file($sTmpFilePath, $sDocumentFileSystemPath);
lib/templating/kt3template.inc.php
@@ -130,7 +130,7 @@ class KTPage { @@ -130,7 +130,7 @@ class KTPage {
130 $aJS[] = 'thirdpartyjs/MochiKit/MochiKitPacked.js'; 130 $aJS[] = 'thirdpartyjs/MochiKit/MochiKitPacked.js';
131 $aJS[] = 'resources/js/kt-utility.js'; 131 $aJS[] = 'resources/js/kt-utility.js';
132 $aJS[] = 'presentation/i18nJavascript.php'; 132 $aJS[] = 'presentation/i18nJavascript.php';
133 - $aJS[] = 'thirdpartyjs/curvycorners/rounded_corners_lite.inc.js'; 133 + $aJS[] = 'thirdpartyjs/curvycorners/rounded_corners.inc.js';
134 $aJS[] = 'resources/js/loader.js'; 134 $aJS[] = 'resources/js/loader.js';
135 $aJS[] = 'thirdpartyjs/yui/tools/tools.js'; 135 $aJS[] = 'thirdpartyjs/yui/tools/tools.js';
136 $aJS[] = 'thirdpartyjs/yui/connection/connection.js'; 136 $aJS[] = 'thirdpartyjs/yui/connection/connection.js';
lib/triggers/triggerregistry.inc.php
@@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 * 35 *
36 */ 36 */
@@ -78,7 +78,7 @@ class KTTriggerRegistry { @@ -78,7 +78,7 @@ class KTTriggerRegistry {
78 if (!class_exists($trigger[0])) 78 if (!class_exists($trigger[0]))
79 { 79 {
80 global $default; 80 global $default;
81 - $defailt->log->error(sprintf(_kt('Cannot locate trigger class %s for action %s slot %s.'), $trigger[0], $action, $slot)); 81 + $default->log->error(sprintf(_kt('Cannot locate trigger class %s for action %s slot %s.'), $trigger[0], $action, $slot));
82 } 82 }
83 } 83 }
84 } 84 }
lib/upgrades/UpgradeFunctions.inc.php
@@ -1011,6 +1011,7 @@ class UpgradeFunctions { @@ -1011,6 +1011,7 @@ class UpgradeFunctions {
1011 $ini->addItem('clientToolPolicies', 'captureReasonsCancelCheckout', 'true'); 1011 $ini->addItem('clientToolPolicies', 'captureReasonsCancelCheckout', 'true');
1012 $ini->addItem('clientToolPolicies', 'captureReasonsCopyInKT', 'true'); 1012 $ini->addItem('clientToolPolicies', 'captureReasonsCopyInKT', 'true');
1013 $ini->addItem('clientToolPolicies', 'captureReasonsMoveInKT', 'true'); 1013 $ini->addItem('clientToolPolicies', 'captureReasonsMoveInKT', 'true');
  1014 + $ini->addItem('clientToolPolicies', 'allowRememberPassword', 'true');
1014 1015
1015 // DiskUsage Section 1016 // DiskUsage Section
1016 $ini->addItem('DiskUsage', 'warningThreshold', '10', "When free space in a mount point is less than this percentage,\r\n; the disk usage dashlet will highlight the mount in ORANGE", "settings for the Disk Usage dashlet"); 1017 $ini->addItem('DiskUsage', 'warningThreshold', '10', "When free space in a mount point is less than this percentage,\r\n; the disk usage dashlet will highlight the mount in ORANGE", "settings for the Disk Usage dashlet");
lib/users/User.inc
@@ -7,32 +7,32 @@ @@ -7,32 +7,32 @@
7 * KnowledgeTree Open Source Edition 7 * KnowledgeTree Open Source Edition
8 * Document Management Made Simple 8 * Document Management Made Simple
9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
10 - * 10 + *
11 * This program is free software; you can redistribute it and/or modify it under 11 * This program is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU General Public License version 3 as published by the 12 * the terms of the GNU General Public License version 3 as published by the
13 * Free Software Foundation. 13 * Free Software Foundation.
14 - * 14 + *
15 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * This program is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 * details. 18 * details.
19 - * 19 + *
20 * You should have received a copy of the GNU General Public License 20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>. 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 - * 22 + *
23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
25 - * 25 + *
26 * The interactive user interfaces in modified source and object code versions 26 * The interactive user interfaces in modified source and object code versions
27 * of this program must display Appropriate Legal Notices, as required under 27 * of this program must display Appropriate Legal Notices, as required under
28 * Section 5 of the GNU General Public License version 3. 28 * Section 5 of the GNU General Public License version 3.
29 - * 29 + *
30 * In accordance with Section 7(b) of the GNU General Public License version 3, 30 * In accordance with Section 7(b) of the GNU General Public License version 3,
31 * these Appropriate Legal Notices must retain the display of the "Powered by 31 * these Appropriate Legal Notices must retain the display of the "Powered by
32 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 32 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
34 - * must display the words "Powered by KnowledgeTree" and retain the original  
35 - * copyright notice. 34 + * must display the words "Powered by KnowledgeTree" and retain the original
  35 + * copyright notice.
36 * Contributor( s): ______________________________________ 36 * Contributor( s): ______________________________________
37 */ 37 */
38 38
@@ -455,4 +455,26 @@ class User extends KTEntity { @@ -455,4 +455,26 @@ class User extends KTEntity {
455 return; 455 return;
456 456
457 } 457 }
  458 +
  459 + function hasPermission(&$oPermissionDescriptor) {
  460 + $pdgTable = KTUtil::getTableName('permission_descriptor_groups');
  461 + global $default;
  462 + $uglTable = $default->users_groups_table;
  463 +
  464 + $sQuery = "SELECT COUNT(*) AS num FROM $pdgTable INNER JOIN " .
  465 + "$uglTable ON $uglTable.group_id=$pdgTable.group_id" .
  466 + "WHERE $pdgTable.descriptor_id = ? AND " .
  467 + "$uglTable.user_id=?";
  468 + $aParams = array($oPermissionDescriptor->getID());
  469 + $aParams[] = $this->$iId;
  470 + $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'num');
  471 + if (PEAR::isError($res)) {
  472 + return $res;
  473 + }
  474 + if ((int)$res === 0) {
  475 + return false;
  476 + }
  477 + return true;
  478 + }
458 } 479 }
  480 +?>
459 \ No newline at end of file 481 \ No newline at end of file
lib/util/ktutil.inc
@@ -44,8 +44,10 @@ class KTUtil { @@ -44,8 +44,10 @@ class KTUtil {
44 const HOUR_IN_SECS = 3600; 44 const HOUR_IN_SECS = 3600;
45 const DAY_IN_SECS = 86400; 45 const DAY_IN_SECS = 86400;
46 const KB = 1024; 46 const KB = 1024;
47 - const MB = 1048576;  
48 - const GB = 1073741824; 47 + const MB = 1048576;
  48 + const GB = 1073741824;
  49 + const TB = 1099511627776;
  50 + const PB = 1125899906842624;
49 51
50 static function computePeriod($diff, $suffix = null, $returnArray=false) 52 static function computePeriod($diff, $suffix = null, $returnArray=false)
51 { 53 {
@@ -89,21 +91,29 @@ class KTUtil { @@ -89,21 +91,29 @@ class KTUtil {
89 { 91 {
90 $filesize = (int) $filesize; 92 $filesize = (int) $filesize;
91 93
92 - if ($filesize >= KTutil::GB) 94 + if ($filesize >= KTUtil::PB)
93 { 95 {
94 - return number_format($filesize / KTutil::GB, 2, '.',',') . _kt('GB'); 96 + return number_format($filesize / KTUtil::PB, 2, '.',',') . _kt('PB');
95 } 97 }
96 - elseif ($filesize >= KTutil::MB) 98 + elseif ($filesize >= KTUtil::TB)
97 { 99 {
98 - return number_format($filesize / KTutil::MB, 2, '.',',') . _kt('MB'); 100 + return number_format($filesize / KTUtil::TB, 2, '.',',') . _kt('TB');
99 } 101 }
100 - elseif ($filesize >= KTutil::KB) 102 + elseif ($filesize >= KTUtil::GB)
101 { 103 {
102 - return number_format($filesize / KTutil::KB, 2, '.',',') . _kt('KB'); 104 + return number_format($filesize / KTUtil::GB, 2, '.',',') . _kt('GB');
  105 + }
  106 + elseif ($filesize >= KTUtil::MB)
  107 + {
  108 + return number_format($filesize / KTUtil::MB, 2, '.',',') . _kt('MB');
  109 + }
  110 + elseif ($filesize >= KTUtil::KB)
  111 + {
  112 + return number_format($filesize / KTUtil::KB, 2, '.',',') . _kt('KB');
103 } 113 }
104 else 114 else
105 { 115 {
106 - return $filesize . _kt('b'); 116 + return $filesize . _kt('B');
107 } 117 }
108 } 118 }
109 119
lib/util/sanitize.inc
@@ -7,32 +7,32 @@ @@ -7,32 +7,32 @@
7 * KnowledgeTree Open Source Edition 7 * KnowledgeTree Open Source Edition
8 * Document Management Made Simple 8 * Document Management Made Simple
9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 9 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
10 - * 10 + *
11 * This program is free software; you can redistribute it and/or modify it under 11 * This program is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU General Public License version 3 as published by the 12 * the terms of the GNU General Public License version 3 as published by the
13 * Free Software Foundation. 13 * Free Software Foundation.
14 - * 14 + *
15 * This program is distributed in the hope that it will be useful, but WITHOUT 15 * This program is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 17 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 * details. 18 * details.
19 - * 19 + *
20 * You should have received a copy of the GNU General Public License 20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>. 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 - * 22 + *
23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 23 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 24 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
25 - * 25 + *
26 * The interactive user interfaces in modified source and object code versions 26 * The interactive user interfaces in modified source and object code versions
27 * of this program must display Appropriate Legal Notices, as required under 27 * of this program must display Appropriate Legal Notices, as required under
28 * Section 5 of the GNU General Public License version 3. 28 * Section 5 of the GNU General Public License version 3.
29 - * 29 + *
30 * In accordance with Section 7(b) of the GNU General Public License version 3, 30 * In accordance with Section 7(b) of the GNU General Public License version 3,
31 * these Appropriate Legal Notices must retain the display of the "Powered by 31 * these Appropriate Legal Notices must retain the display of the "Powered by
32 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 32 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 33 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
34 - * must display the words "Powered by KnowledgeTree" and retain the original  
35 - * copyright notice. 34 + * must display the words "Powered by KnowledgeTree" and retain the original
  35 + * copyright notice.
36 * Contributor( s): ______________________________________ 36 * Contributor( s): ______________________________________
37 */ 37 */
38 38
@@ -57,13 +57,13 @@ function sanitize($string) { @@ -57,13 +57,13 @@ function sanitize($string) {
57 } 57 }
58 58
59 function sanitizeForSQL($string, $min='', $max='') { 59 function sanitizeForSQL($string, $min='', $max='') {
60 - 60 +
61 $string = trim($string); 61 $string = trim($string);
62 if(get_magic_quotes_gpc()) $string = stripslashes($string); 62 if(get_magic_quotes_gpc()) $string = stripslashes($string);
63 - 63 +
64 $len = strlen($string); 64 $len = strlen($string);
65 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false; 65 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false;
66 - 66 +
67 if(function_exists("mysql_real_escape_string")) { 67 if(function_exists("mysql_real_escape_string")) {
68 return mysql_real_escape_string($string); 68 return mysql_real_escape_string($string);
69 } else { 69 } else {
@@ -71,12 +71,10 @@ function sanitizeForSQL($string, $min=&#39;&#39;, $max=&#39;&#39;) { @@ -71,12 +71,10 @@ function sanitizeForSQL($string, $min=&#39;&#39;, $max=&#39;&#39;) {
71 } 71 }
72 } 72 }
73 73
74 -function sanitizeForSQLtoHTML($string, $min='', $max='') {  
75 -  
76 - $string = str_ireplace("\r", '', $string);  
77 - $string = str_ireplace("\n", '', $string);  
78 - return stripslashes(trim($string));  
79 - 74 +function sanitizeForSQLtoHTML($string, $min='', $max='')
  75 +{
  76 + $string = str_replace(array("\r","\n"), array('',''), $string);
  77 + return $string;
80 } 78 }
81 79
82 function sanitizeForHTML($string, $min='', $max='') 80 function sanitizeForHTML($string, $min='', $max='')
@@ -86,7 +84,7 @@ function sanitizeForHTML($string, $min=&#39;&#39;, $max=&#39;&#39;) @@ -86,7 +84,7 @@ function sanitizeForHTML($string, $min=&#39;&#39;, $max=&#39;&#39;)
86 84
87 $len = strlen($string); 85 $len = strlen($string);
88 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false; 86 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false;
89 - 87 +
90 if(function_exists("htmlspecialchars")) { 88 if(function_exists("htmlspecialchars")) {
91 return htmlspecialchars($string); 89 return htmlspecialchars($string);
92 } else { 90 } else {
@@ -123,8 +121,8 @@ function sanitizeForSYSTEM($string, $min=&#39;&#39;, $max=&#39;&#39;) @@ -123,8 +121,8 @@ function sanitizeForSYSTEM($string, $min=&#39;&#39;, $max=&#39;&#39;)
123 121
124 $len = strlen($string); 122 $len = strlen($string);
125 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false; 123 if((($min != '') && ($len < $min)) || (($max != '') && ($len > $max))) return false;
126 -  
127 - $pattern = '/( ;|\||`|>|<|&|^|"|'."\n|\r|'".'|{|}|[|]|\)|\( )/i'; 124 +
  125 + $pattern = '/( ;|\||`|>|<|&|^|"|'."\n|\r|'".'|{|}|[|]|\)|\( )/i';
128 $string = preg_replace( $pattern, '', $string); 126 $string = preg_replace( $pattern, '', $string);
129 return '"'.preg_replace( '/\$/', '\\\$', $string).'"'; 127 return '"'.preg_replace( '/\$/', '\\\$', $string).'"';
130 } 128 }
lib/validation/customerrorhandler.php 0 โ†’ 100644
  1 +<?php
  2 +/**
  3 + *
  4 + * The contents of this file are subject to the KnowledgeTree Public
  5 + * License Version 1.1.2 ("License"); You may not use this file except in
  6 + * compliance with the License. You may obtain a copy of the License at
  7 + * http://www.knowledgetree.com/KPL
  8 + *
  9 + * Software distributed under the License is distributed on an "AS IS"
  10 + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
  11 + * See the License for the specific language governing rights and
  12 + * limitations under the License.
  13 + *
  14 + * All copies of the Covered Code must include on each user interface screen:
  15 + * (i) the "Powered by KnowledgeTree" logo and
  16 + * (ii) the KnowledgeTree copyright notice
  17 + * in the same form as they appear in the distribution. See the License for
  18 + * requirements.
  19 + *
  20 + * The Original Code is: KnowledgeTree Open Source
  21 + *
  22 + * The Initial Developer of the Original Code is The Jam Warehouse Software
  23 + * (Pty) Ltd, trading as KnowledgeTree.
  24 + * Portions created by The Jam Warehouse Software (Pty) Ltd are Copyright
  25 + * (C) 2007 The Jam Warehouse Software (Pty) Ltd;
  26 + * All Rights Reserved.
  27 + * Contributor( s): ______________________________________
  28 + *
  29 + */
  30 + require_once('config/dmsDefaults.php');
  31 + require_once(KT_LIB_DIR.'/Log.inc');
  32 +
  33 + class KTCustomErrorHandler
  34 + {
  35 + // {{{ initCustomErrorHandler()
  36 + function initCustomErrorHandler ()
  37 + {
  38 + return $oCustomErrorHandler =& new KTCustomErrorHandler;
  39 + }
  40 + // }}}
  41 +
  42 + // {{{ logError()
  43 + function logError($oError)
  44 +
  45 + {
  46 + global $default;
  47 +
  48 + $sErrorType = '';
  49 + if(substr($oError->toString(),1,2) == 'db')
  50 + {
  51 + $sErrorType = 'database_error';
  52 + }
  53 + else
  54 + {
  55 + $sErrorType = 'unknown_error';
  56 + }
  57 +
  58 +
  59 + $default->log->error($oError->toString());
  60 +
  61 + }
  62 + }
  63 + ?>
0 \ No newline at end of file 64 \ No newline at end of file
lib/validation/customerrorviewer.inc.php 0 โ†’ 100644
  1 +<?php
  2 +/**
  3 + *
  4 + * The contents of this file are subject to the KnowledgeTree Public
  5 + * License Version 1.1.2 ("License"); You may not use this file except in
  6 + * compliance with the License. You may obtain a copy of the License at
  7 + * http://www.knowledgetree.com/KPL
  8 + *
  9 + * Software distributed under the License is distributed on an "AS IS"
  10 + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
  11 + * See the License for the specific language governing rights and
  12 + * limitations under the License.
  13 + *
  14 + * All copies of the Covered Code must include on each user interface screen:
  15 + * (i) the "Powered by KnowledgeTree" logo and
  16 + * (ii) the KnowledgeTree copyright notice
  17 + * in the same form as they appear in the distribution. See the License for
  18 + * requirements.
  19 + *
  20 + * The Original Code is: KnowledgeTree Open Source
  21 + *
  22 + * The Initial Developer of the Original Code is The Jam Warehouse Software
  23 + * (Pty) Ltd, trading as KnowledgeTree.
  24 + * Portions created by The Jam Warehouse Software (Pty) Ltd are Copyright
  25 + * (C) 2007 The Jam Warehouse Software (Pty) Ltd;
  26 + * All Rights Reserved.
  27 + * Contributor( s): ______________________________________
  28 + *
  29 + */
  30 + require_once(KT_LIB_DIR.'/validation/customerrorhandler.php');
  31 +
  32 + class KTCustomErrorViewer
  33 + {
  34 + // {{{ initCustomErrorViewer()
  35 + function initCustomErrorViewer()
  36 + {
  37 + return $oCustomViewer =& new KTCustomErrorViewer;
  38 + }
  39 + //}}}
  40 +
  41 + //{{{ getCustomErrorConfigSetting()
  42 + function getCustomErrorConfigSetting()
  43 + {
  44 + $oKTConfig =& KTConfig::getSingleton();
  45 + $sCustomErrorCheck = $oKTConfig->get('CustomErrorMessages/customerrormessages');
  46 + return $sCustomErrorCheck;
  47 + }
  48 + //}}}
  49 +
  50 + //{{{ getCustomErrorHandlerSetting()
  51 + function getCustomErrorHandlerSetting()
  52 + {
  53 + $oKTConfig =& KTConfig::getSingleton();
  54 + $sCustomErrorCheck = $oKTConfig->get('CustomErrorMessages/customerrorhandler');
  55 + return $sCustomErrorCheck;
  56 + }
  57 + //}}}
  58 +
  59 + // {{{ getCustomErrorRedirectPage()
  60 + function getCustomErrorRedirectPage ()
  61 + {
  62 + $oKTErrorConfig =& KTConfig::getSingleton();
  63 + $sCustomErrorPage = $oKTErrorConfig->get('CustomErrorMessages/customerrorpagepath');
  64 +
  65 + //if a filname is specified in the config.ini file make it into a url
  66 + if (substr($sCustomErrorPage, 0, 4) != 'http')
  67 + {
  68 +
  69 + $sCustomErrorPage = 'http://'.$_SERVER['HTTP_HOST'].'/'.$sCustomErrorPage;
  70 +
  71 + }
  72 +
  73 + //checking if file exists
  74 + //curl options will return the page header, we can then check for an http error
  75 + $CurlSession = curl_init();
  76 + curl_setopt($CurlSession, CURLOPT_URL, $sCustomErrorPage);
  77 + curl_setopt($CurlSession, CURLOPT_HEADER, true);
  78 + curl_setopt($CurlSession, CURLOPT_NOBODY, true);
  79 + curl_setopt($CurlSession, CURLOPT_RETURNTRANSFER, true);
  80 + $data = curl_exec($CurlSession);
  81 + curl_close($CurlSession);
  82 + preg_match("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches);
  83 +
  84 + //checking for http error - if the retunr code isn't 200 then we have an error
  85 + //on an error we return 0
  86 + if ($matches[1] != '200')
  87 + {
  88 + //if file does not exist return error code of 0
  89 + return '0';
  90 + }
  91 + else
  92 + {
  93 + //if file exists return error page address
  94 + return $sCustomErrorPage;
  95 +
  96 + }
  97 + }
  98 + // }}}
  99 +
  100 + // {{{ customErrorPageRedirect()
  101 + function doCustomErrorPageRedirect($CustomErrorPage, $oError = null)
  102 + {
  103 + $sErrorMessage = '';
  104 + if($oError != null)
  105 + {
  106 + //call error handler
  107 +
  108 + $aErrorMessage = array ();
  109 + $aErrorMessage['Error_MessageOne'] = $oError->getMessage();
  110 + $aErrorMessage['Error_MessageTwo'] = $oError->getUserInfo();
  111 + //echo '<pre>';
  112 + //print_r($aErrorMessage);
  113 + //echo '</pre>';
  114 + //exit;
  115 + $customErrorHandler = KTCustomErrorHandler::initCustomErrorHandler();
  116 + $customErrorHandler->logError($oError);
  117 + }
  118 +
  119 + $ErrorPageCurlSession = curl_init($CustomErrorPage);
  120 + //curl_setopt($ErrorPageCurlSession, CURLOPT_SSL_VERIFYPEER, false);
  121 + curl_setopt($ErrorPageCurlSession, CURLOPT_POST, true);
  122 + curl_setopt($ErrorPageCurlSession, CURLOPT_POSTFIELDS, $aErrorMessage);
  123 + $ErrorPageSent = curl_exec($ErrorPageCurlSession);
  124 + curl_close($ErrorPageCurlSession);
  125 +
  126 + }
  127 + // }}}
  128 + }
  129 + ?>
lib/widgets/fieldsetDisplay.inc.php
@@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 * 35 *
36 */ 36 */
@@ -45,20 +45,20 @@ @@ -45,20 +45,20 @@
45 * "document_id" => $iDocumentId 45 * "document_id" => $iDocumentId
46 * 46 *
47 */ 47 */
48 - 48 +
49 // boilerplate 49 // boilerplate
50 -require_once(KT_LIB_DIR . "/templating/templating.inc.php");  
51 -require_once(KT_LIB_DIR . "/database/dbutil.inc"); 50 +require_once(KT_LIB_DIR . '/templating/templating.inc.php');
  51 +require_once(KT_LIB_DIR . '/database/dbutil.inc');
52 52
53 -require_once(KT_LIB_DIR . "/documentmanagement/MDTree.inc"); // :( 53 +require_once(KT_LIB_DIR . '/documentmanagement/MDTree.inc'); // :(
54 54
55 55
56 56
57 // data acquisition 57 // data acquisition
58 -require_once(KT_LIB_DIR . "/users/User.inc"); 58 +require_once(KT_LIB_DIR . '/users/User.inc');
59 require_once(KT_LIB_DIR . '/documentmanagement/MetaData.inc'); 59 require_once(KT_LIB_DIR . '/documentmanagement/MetaData.inc');
60 -require_once(KT_LIB_DIR . "/widgets/FieldsetDisplayRegistry.inc.php");  
61 -require_once(KT_LIB_DIR . "/widgets/fieldWidgets.php"); 60 +require_once(KT_LIB_DIR . '/widgets/FieldsetDisplayRegistry.inc.php');
  61 +require_once(KT_LIB_DIR . '/widgets/fieldWidgets.php');
62 62
63 63
64 /* it may be useful to move this to a factory, eventually? */ 64 /* it may be useful to move this to a factory, eventually? */
@@ -77,9 +77,9 @@ function getWidgetForMetadataField($field, $current_value, $page, $errors = null @@ -77,9 +77,9 @@ function getWidgetForMetadataField($field, $current_value, $page, $errors = null
77 if ($errors === null) { 77 if ($errors === null) {
78 $fieldErrors = array(); 78 $fieldErrors = array();
79 } else { 79 } else {
80 - $fieldErrors = $errors; 80 + $fieldErrors = $errors;
81 } 81 }
82 - 82 +
83 83
84 // now we need to break, based on a few aspects of the oField (DocumentField) 84 // now we need to break, based on a few aspects of the oField (DocumentField)
85 if ($field->getHasLookup()) { 85 if ($field->getHasLookup()) {
@@ -90,34 +90,47 @@ function getWidgetForMetadataField($field, $current_value, $page, $errors = null @@ -90,34 +90,47 @@ function getWidgetForMetadataField($field, $current_value, $page, $errors = null
90 // extract the lookup. 90 // extract the lookup.
91 if ($vocab === null) { // allow override 91 if ($vocab === null) { // allow override
92 $lookups = MetaData::getEnabledByDocumentField($field); 92 $lookups = MetaData::getEnabledByDocumentField($field);
93 - $fieldOptions["vocab"] = array(); // FIXME handle lookups  
94 - $fieldOptions['vocab'][''] = _kt('Select a value'); 93 + $fieldOptions['vocab'] = array(); // FIXME handle lookups
  94 + $fieldOptions['vocab'][''] = _kt('Select a value');
95 foreach ($lookups as $md) { 95 foreach ($lookups as $md) {
96 - $fieldOptions["vocab"][$md->getName()] = $md->getName(); 96 + $fieldOptions['vocab'][$md->getName()] = $md->getName();
97 } 97 }
98 } else { 98 } else {
99 - $fieldOptions["vocab"] = $vocab; 99 + $fieldOptions['vocab'] = $vocab;
100 } 100 }
101 -  
102 - $oField = new KTLookupWidget($fieldLabel, $fieldDescription, $fieldName, $fieldValue, $page, $fieldRequired, null, $fieldErrors, $fieldOptions); 101 +
  102 + $oField = new KTLookupWidget($fieldLabel, $fieldDescription, $fieldName, $fieldValue, $page, $fieldRequired, null, $fieldErrors, $fieldOptions);
103 } else { 103 } else {
104 // FIXME vocab's are _not_ supported for tree-inputs. this means conditional-tree-widgets are not unsupported. 104 // FIXME vocab's are _not_ supported for tree-inputs. this means conditional-tree-widgets are not unsupported.
105 - 105 +
106 // for trees, we are currently brutal. 106 // for trees, we are currently brutal.
107 $fieldTree = new MDTree(); 107 $fieldTree = new MDTree();
108 $fieldTree->buildForField($field->getId()); 108 $fieldTree->buildForField($field->getId());
109 $fieldTree->setActiveItem($current_value); 109 $fieldTree->setActiveItem($current_value);
110 $fieldOptions['tree'] = $fieldTree->_evilTreeRenderer($fieldTree, $fieldName); 110 $fieldOptions['tree'] = $fieldTree->_evilTreeRenderer($fieldTree, $fieldName);
111 -  
112 - $oField = new KTTreeWidget($fieldLabel, $fieldDescription, $fieldName, $fieldValue, $page, $fieldRequired, null, $fieldErrors, $fieldOptions); 111 +
  112 + $oField = new KTTreeWidget($fieldLabel, $fieldDescription, $fieldName, $fieldValue, $page, $fieldRequired, null, $fieldErrors, $fieldOptions);
113 } 113 }
114 } else { 114 } else {
115 - $oField = new KTBaseWidget($fieldLabel, $fieldDescription, $fieldName, $fieldValue, $page, $fieldRequired, null, $fieldErrors, $fieldOptions); 115 + $oField = new KTBaseWidget($fieldLabel, $fieldDescription, $fieldName, $fieldValue, $page, $fieldRequired, null, $fieldErrors, $fieldOptions);
116 } 116 }
117 117
118 return $oField; 118 return $oField;
119 } 119 }
120 120
  121 +/**
  122 + * Compare the fields within a fieldset for alphabetising.
  123 + *
  124 + * @param object $a
  125 + * @param object $b
  126 + * @return integer
  127 + */
  128 +function compareFieldSetField($a, $b)
  129 +{
  130 + if ($a['field']->getName() == $b['field']->getName()) return 0;
  131 + if ($a['field']->getName() < $b['field']->getName()) return -1;
  132 + return 1;
  133 +}
121 134
122 // FIXME need to establish some kind of api to pass in i18n information. 135 // FIXME need to establish some kind of api to pass in i18n information.
123 class KTFieldsetDisplay { 136 class KTFieldsetDisplay {
@@ -126,33 +139,33 @@ class KTFieldsetDisplay { @@ -126,33 +139,33 @@ class KTFieldsetDisplay {
126 function KTFieldsetDisplay($oFieldset) { 139 function KTFieldsetDisplay($oFieldset) {
127 $this->fieldset = $oFieldset; 140 $this->fieldset = $oFieldset;
128 } 141 }
129 - 142 +
130 143
131 function _dateHelper($dDate) { 144 function _dateHelper($dDate) {
132 $dColumnDate = strtotime($dDate); 145 $dColumnDate = strtotime($dDate);
133 - return date("Y-m-d H:i", $dColumnDate); 146 + return date('Y-m-d H:i', $dColumnDate);
134 } 147 }
135 -  
136 - 148 +
  149 +
137 function _sizeHelper($size) { 150 function _sizeHelper($size) {
138 $finalSize = $size; 151 $finalSize = $size;
139 $label = 'b'; 152 $label = 'b';
140 - 153 +
141 if ($finalSize > 1000) { $label='Kb'; $finalSize = floor($finalSize/1000); } 154 if ($finalSize > 1000) { $label='Kb'; $finalSize = floor($finalSize/1000); }
142 if ($finalSize > 1000) { $label='Mb'; $finalSize = floor($finalSize/1000); } 155 if ($finalSize > 1000) { $label='Mb'; $finalSize = floor($finalSize/1000); }
143 return $finalSize . $label; 156 return $finalSize . $label;
144 } 157 }
145 - 158 +
146 function _mimeHelper($iMimeTypeId) { 159 function _mimeHelper($iMimeTypeId) {
147 // FIXME lazy cache this. 160 // FIXME lazy cache this.
148 // FIXME extend mime_types to have something useful to say. 161 // FIXME extend mime_types to have something useful to say.
149 $sQuery = 'SELECT * FROM mime_types WHERE id = ?'; 162 $sQuery = 'SELECT * FROM mime_types WHERE id = ?';
150 $res = DBUtil::getOneResult(array($sQuery, array($iMimeTypeId))); 163 $res = DBUtil::getOneResult(array($sQuery, array($iMimeTypeId)));
151 - 164 +
152 if (PEAR::isError($res)) { 165 if (PEAR::isError($res)) {
153 return _kt('unknown type'); 166 return _kt('unknown type');
154 } 167 }
155 - 168 +
156 if (!empty($res['friendly_name'])) { 169 if (!empty($res['friendly_name'])) {
157 return _kt($res['friendly_name']); 170 return _kt($res['friendly_name']);
158 } else { 171 } else {
@@ -160,19 +173,19 @@ class KTFieldsetDisplay { @@ -160,19 +173,19 @@ class KTFieldsetDisplay {
160 } 173 }
161 174
162 } 175 }
163 -  
164 - 176 +
  177 +
165 // this should multiplex i18n_title 178 // this should multiplex i18n_title
166 function getTitle() { return $this->sTitle; } 179 function getTitle() { return $this->sTitle; }
167 - 180 +
168 function render($aDocumentData) { 181 function render($aDocumentData) {
169 return '<p class="ktError">Warning: Abstract Fieldset created.</p>'; 182 return '<p class="ktError">Warning: Abstract Fieldset created.</p>';
170 } 183 }
171 - 184 +
172 function renderComparison($aDocumentData, $aComparisonData) { 185 function renderComparison($aDocumentData, $aComparisonData) {
173 return '<div class="ktError">Not implemented: comparison rendering</div>'; 186 return '<div class="ktError">Not implemented: comparison rendering</div>';
174 } 187 }
175 - 188 +
176 // we need the $main to (potentially) add js, etc. 189 // we need the $main to (potentially) add js, etc.
177 function renderEdit($document_data) { 190 function renderEdit($document_data) {
178 return '<div class="ktError">Not Implemented: fieldset editing.</div>'; 191 return '<div class="ktError">Not Implemented: fieldset editing.</div>';
@@ -188,29 +201,29 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay { @@ -188,29 +201,29 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay {
188 201
189 // DON'T take anything. 202 // DON'T take anything.
190 function GenericFieldsetDisplay() { 203 function GenericFieldsetDisplay() {
191 - 204 +
192 } 205 }
193 - 206 +
194 function render($aDocumentData) { 207 function render($aDocumentData) {
195 // we do a fair bit of fetching, etc. in here. 208 // we do a fair bit of fetching, etc. in here.
196 - $document = $aDocumentData["document"]; 209 + $document = $aDocumentData['document'];
197 210
198 // creation 211 // creation
199 $creator =& User::get($document->getCreatorId()); 212 $creator =& User::get($document->getCreatorId());
200 if (PEAR::isError($creator)) { 213 if (PEAR::isError($creator)) {
201 - $creator_name = "<span class='ktError'>" . _kt("Unable to find the document's creator") . "</span>"; 214 + $creator_name = '<span class="ktError">' . _kt("Unable to find the document's creator") . '</span>';
202 } else { 215 } else {
203 $creator_name = $creator->getName(); 216 $creator_name = $creator->getName();
204 } 217 }
205 $owner =& User::get($document->getOwnerId()); 218 $owner =& User::get($document->getOwnerId());
206 if (PEAR::isError($owner)) { 219 if (PEAR::isError($owner)) {
207 - $owner_name = "<span class='ktError'>" . _kt("Unable to find the document's owner") . "</span>"; 220 + $owner_name = '<span class="ktError">' . _kt("Unable to find the document's owner") . '</span>';
208 } else { 221 } else {
209 $owner_name = $owner->getName(); 222 $owner_name = $owner->getName();
210 } 223 }
211 $modified_user =& User::get($document->getModifiedUserId()); 224 $modified_user =& User::get($document->getModifiedUserId());
212 if (PEAR::isError($modified_user)) { 225 if (PEAR::isError($modified_user)) {
213 - $modified_user_name = "<span class='ktError'>" . _kt("Unable to find the document's modifier") . "</span>"; 226 + $modified_user_name = '<span class="ktError">' . _kt("Unable to find the document's modifier") . '</span>';
214 } else { 227 } else {
215 $modified_user_name = $modified_user->getName(); 228 $modified_user_name = $modified_user->getName();
216 } 229 }
@@ -218,48 +231,48 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay { @@ -218,48 +231,48 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay {
218 231
219 // last mod 232 // last mod
220 $last_modified_date = $this->_dateHelper($document->getLastModifiedDate()); 233 $last_modified_date = $this->_dateHelper($document->getLastModifiedDate());
221 - 234 +
222 // document type // FIXME move this to view.php 235 // document type // FIXME move this to view.php
223 - $document_type = $aDocumentData["document_type"]->getName(); 236 + $document_type = $aDocumentData['document_type']->getName();
224 237
225 $oWorkflow = KTWorkflowUtil::getWorkflowForDocument($document); 238 $oWorkflow = KTWorkflowUtil::getWorkflowForDocument($document);
226 $oState = KTWorkflowUtil::getWorkflowStateForDocument($document); 239 $oState = KTWorkflowUtil::getWorkflowStateForDocument($document);
227 -  
228 -  
229 - $oTemplating =& KTTemplating::getSingleton();  
230 - $oTemplate = $oTemplating->loadTemplate("kt3/fieldsets/generic"); 240 +
  241 +
  242 + $oTemplating =& KTTemplating::getSingleton();
  243 + $oTemplate = $oTemplating->loadTemplate('kt3/fieldsets/generic');
231 $aTemplateData = array( 244 $aTemplateData = array(
232 - "context" => $this,  
233 - "document_data" => $aDocumentData,  
234 - "document" => $aDocumentData["document"],  
235 -  
236 - "filename" => $document->getFileName(),  
237 -  
238 - "creator" => $creator_name,  
239 - "owner" => $owner_name,  
240 - "creation_date" => $creation_date,  
241 -  
242 - "last_modified_by" => $modified_user_name,  
243 - "last_modified_date" => $last_modified_date,  
244 -  
245 - "document_type" => $document_type,  
246 -  
247 - "workflow_state" => $oState,  
248 - "workflow" => $oWorkflow, 245 + 'context' => $this,
  246 + 'document_data' => $aDocumentData,
  247 + 'document' => $aDocumentData['document'],
  248 +
  249 + 'filename' => $document->getFileName(),
  250 +
  251 + 'creator' => $creator_name,
  252 + 'owner' => $owner_name,
  253 + 'creation_date' => $creation_date,
  254 +
  255 + 'last_modified_by' => $modified_user_name,
  256 + 'last_modified_date' => $last_modified_date,
  257 +
  258 + 'document_type' => $document_type,
  259 +
  260 + 'workflow_state' => $oState,
  261 + 'workflow' => $oWorkflow,
249 ); 262 );
250 263
251 - return $oTemplate->render($aTemplateData); 264 + return $oTemplate->render($aTemplateData);
252 } 265 }
253 - 266 +
254 function renderComparison($aDocumentData, $aComparisonData) { 267 function renderComparison($aDocumentData, $aComparisonData) {
255 // we do a fair bit of fetching, etc. in here. 268 // we do a fair bit of fetching, etc. in here.
256 - $document = $aDocumentData["document"];  
257 - $comparison_document = $aComparisonData["document"]; 269 + $document = $aDocumentData['document'];
  270 + $comparison_document = $aComparisonData['document'];
258 271
259 // creation 272 // creation
260 $creator =& User::get($document->getCreatorId()); 273 $creator =& User::get($document->getCreatorId());
261 if (PEAR::isError($creator)) { 274 if (PEAR::isError($creator)) {
262 - $creator = "<span class='ktError'>" . _kt("Unable to find the document's creator") . "</span>"; 275 + $creator = '<span class="ktError">' . _kt("Unable to find the document's creator") . '</span>';
263 } else { 276 } else {
264 $creator = $creator->getName(); 277 $creator = $creator->getName();
265 } 278 }
@@ -268,30 +281,30 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay { @@ -268,30 +281,30 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay {
268 // last mod 281 // last mod
269 $last_modified_date = $this->_dateHelper($document->getVersionCreated()); 282 $last_modified_date = $this->_dateHelper($document->getVersionCreated());
270 $comparison_last_modified_date = $this->_dateHelper($comparison_document->getVersionCreated()); 283 $comparison_last_modified_date = $this->_dateHelper($comparison_document->getVersionCreated());
271 - 284 +
272 // document type // FIXME move this to view.php 285 // document type // FIXME move this to view.php
273 - $document_type = $aDocumentData["document_type"]->getName();  
274 - $comparison_document_type = $aComparisonData["document_type"]->getName();  
275 - 286 + $document_type = $aDocumentData['document_type']->getName();
  287 + $comparison_document_type = $aComparisonData['document_type']->getName();
  288 +
276 $modified_user =& User::get($document->getVersionCreatorId()); 289 $modified_user =& User::get($document->getVersionCreatorId());
277 if (PEAR::isError($modified_user)) { 290 if (PEAR::isError($modified_user)) {
278 - $modified_user = "<span class='ktError'>" . _kt("Unable to find the document's modifier") . "</span>"; 291 + $modified_user = "<span class='ktError'>" . _kt("Unable to find the document's modifier") . '</span>';
279 } else { 292 } else {
280 $modified_user = $modified_user->getName(); 293 $modified_user = $modified_user->getName();
281 } 294 }
282 295
283 $owner_user =& User::get($document->getOwnerId()); 296 $owner_user =& User::get($document->getOwnerId());
284 if (PEAR::isError($owner_user)) { 297 if (PEAR::isError($owner_user)) {
285 - $owner_user = "<span class='ktError'>" . _kt("Unable to find the document's owner") . "</span>"; 298 + $owner_user = "<span class='ktError'>" . _kt("Unable to find the document's owner") . '</span>';
286 } else { 299 } else {
287 $owner_user = $owner_user->getName(); 300 $owner_user = $owner_user->getName();
288 } 301 }
289 - 302 +
290 303
291 304
292 $comparison_modified_user =& User::get($comparison_document->getVersionCreatorId()); 305 $comparison_modified_user =& User::get($comparison_document->getVersionCreatorId());
293 if (PEAR::isError($comparison_modified_user)) { 306 if (PEAR::isError($comparison_modified_user)) {
294 - $comparison_modified_user = "<span class='ktError'>" . _kt("Unable to find the document's modifier") . "</span>"; 307 + $comparison_modified_user = "<span class='ktError'>" . _kt("Unable to find the document's modifier") . '</span>';
295 } else { 308 } else {
296 $comparison_modified_user = $comparison_modified_user->getName(); 309 $comparison_modified_user = $comparison_modified_user->getName();
297 } 310 }
@@ -300,59 +313,59 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay { @@ -300,59 +313,59 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay {
300 $oState = KTWorkflowUtil::getWorkflowStateForDocument($document); 313 $oState = KTWorkflowUtil::getWorkflowStateForDocument($document);
301 $oComparisonWorkflow = KTWorkflowUtil::getWorkflowForDocument($comparison_document); 314 $oComparisonWorkflow = KTWorkflowUtil::getWorkflowForDocument($comparison_document);
302 $oComparisonState = KTWorkflowUtil::getWorkflowStateForDocument($comparison_document); 315 $oComparisonState = KTWorkflowUtil::getWorkflowStateForDocument($comparison_document);
303 -  
304 -  
305 - $oTemplating =& KTTemplating::getSingleton();  
306 - $oTemplate = $oTemplating->loadTemplate("kt3/fieldsets/generic_versioned"); 316 +
  317 +
  318 + $oTemplating =& KTTemplating::getSingleton();
  319 + $oTemplate = $oTemplating->loadTemplate('kt3/fieldsets/generic_versioned');
307 $aTemplateData = array( 320 $aTemplateData = array(
308 - "context" => $this,  
309 - "document_data" => $aDocumentData,  
310 - "document" => $aDocumentData["document"],  
311 -  
312 - "title" => $document->getName(),  
313 - "comparison_title" => $comparison_document->getName(),  
314 -  
315 - "filename" => $document->getFileName(),  
316 - "comparison_filename" => $comparison_document->getFileName(),  
317 -  
318 - "creator" => $creator,  
319 - "creation_date" => $creation_date,  
320 - "owner" => $owner_user,  
321 -  
322 - "last_modified_by" => $modified_user,  
323 - "last_modified_date" => $last_modified_date,  
324 -  
325 - "comparison_last_modified_by" => $comparison_modified_user,  
326 - "comparison_last_modified_date" => $comparison_last_modified_date,  
327 -  
328 - "document_type" => $document_type,  
329 - "comparison_document_type" => $comparison_document_type,  
330 -  
331 - "workflow_state" => $oState,  
332 - "comparison_workflow_state" => $oComparisonState,  
333 - "workflow" => $oWorkflow,  
334 - "comparison_workflow" => $oComparisonWorkflow,  
335 -  
336 - "comparison_document" => $aComparisonData["document"], 321 + 'context' => $this,
  322 + 'document_data' => $aDocumentData,
  323 + 'document' => $aDocumentData['document'],
  324 +
  325 + 'title' => $document->getName(),
  326 + 'comparison_title' => $comparison_document->getName(),
  327 +
  328 + 'filename' => $document->getFileName(),
  329 + 'comparison_filename' => $comparison_document->getFileName(),
  330 +
  331 + 'creator' => $creator,
  332 + 'creation_date' => $creation_date,
  333 + 'owner' => $owner_user,
  334 +
  335 + 'last_modified_by' => $modified_user,
  336 + 'last_modified_date' => $last_modified_date,
  337 +
  338 + 'comparison_last_modified_by' => $comparison_modified_user,
  339 + 'comparison_last_modified_date' => $comparison_last_modified_date,
  340 +
  341 + 'document_type' => $document_type,
  342 + 'comparison_document_type' => $comparison_document_type,
  343 +
  344 + 'workflow_state' => $oState,
  345 + 'comparison_workflow_state' => $oComparisonState,
  346 + 'workflow' => $oWorkflow,
  347 + 'comparison_workflow' => $oComparisonWorkflow,
  348 +
  349 + 'comparison_document' => $aComparisonData['document'],
337 ); 350 );
338 -  
339 - return $oTemplate->render($aTemplateData); 351 +
  352 + return $oTemplate->render($aTemplateData);
340 } 353 }
341 - 354 +
342 function renderEdit($document_data) { 355 function renderEdit($document_data) {
343 global $main; // FIXME remove direct access to $main 356 global $main; // FIXME remove direct access to $main
344 - $oField = new KTBaseWidget(_kt("Document Title"), 357 + $oField = new KTBaseWidget(_kt('Document Title'),
345 sprintf(_kt("The document title is used as the main name of a document throughout %s&trade;."), APP_NAME), 358 sprintf(_kt("The document title is used as the main name of a document throughout %s&trade;."), APP_NAME),
346 - "generic_title", $document_data["document"]->getName(), $main, true, null, array()); 359 + 'generic_title', $document_data['document']->getName(), $main, true, null, array());
347 $aFields = array($oField); // its the only one editable from the basic set (currently). 360 $aFields = array($oField); // its the only one editable from the basic set (currently).
348 -  
349 - $oTemplating =& KTTemplating::getSingleton();  
350 - $oTemplate = $oTemplating->loadTemplate("kt3/fieldsets/simple_editable"); 361 +
  362 + $oTemplating =& KTTemplating::getSingleton();
  363 + $oTemplate = $oTemplating->loadTemplate('kt3/fieldsets/simple_editable');
351 $aTemplateData = array( 364 $aTemplateData = array(
352 - "context" => $this,  
353 - "fields" => $aFields,  
354 - "title" => _kt("Generic Document Information"),  
355 - "description" => sprintf(_kt("The information in this section is stored by %s&trade; for every document."), APP_NAME), 365 + 'context' => $this,
  366 + 'fields' => $aFields,
  367 + 'title' => _kt('Generic Document Information'),
  368 + 'description' => sprintf(_kt("The information in this section is stored by %s&trade; for every document."), APP_NAME),
356 ); 369 );
357 return $oTemplate->render($aTemplateData); 370 return $oTemplate->render($aTemplateData);
358 } 371 }
@@ -361,177 +374,184 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay { @@ -361,177 +374,184 @@ class GenericFieldsetDisplay extends KTFieldsetDisplay {
361 374
362 // The generic object 375 // The generic object
363 class SimpleFieldsetDisplay extends KTFieldsetDisplay { 376 class SimpleFieldsetDisplay extends KTFieldsetDisplay {
364 - 377 +
365 function render($aDocumentData) { 378 function render($aDocumentData) {
366 // we do a fair bit of fetching, etc. in here. 379 // we do a fair bit of fetching, etc. in here.
367 - $document = $aDocumentData["document"];  
368 - 380 + $document = $aDocumentData['document'];
  381 +
369 // we need to extract the fields. 382 // we need to extract the fields.
370 $fields =& $this->fieldset->getFields(); 383 $fields =& $this->fieldset->getFields();
371 -  
372 - 384 +
  385 +
373 // we now grab that subset of items which fit in here. 386 // we now grab that subset of items which fit in here.
374 // FIXME link value -> lookup where appropriate. 387 // FIXME link value -> lookup where appropriate.
375 // FIXME probably need to be more careful about the _type_ of field here. 388 // FIXME probably need to be more careful about the _type_ of field here.
376 $fieldset_values = array(); 389 $fieldset_values = array();
377 foreach ($fields as $oField) { 390 foreach ($fields as $oField) {
378 - $val = KTUtil::arrayGet($aDocumentData["field_values"], $oField->getId(), null);  
379 - $fieldset_values[] = array("field" => $oField, "value" => $val, ); 391 + $val = KTUtil::arrayGet($aDocumentData['field_values'], $oField->getId(), null);
  392 + $fieldset_values[] = array('field' => $oField, 'value' => $val, );
  393 + }
  394 +
  395 + // Alphabetise the metadata fields within a fieldset if set in config
  396 + $oKTConfig =& KTConfig::getSingleton();
  397 + $use_sort = $oKTConfig->get('ui/metadata_sort', false);
  398 +
  399 + if($use_sort){
  400 + usort($fieldset_values, 'compareFieldSetField');
380 } 401 }
381 -  
382 -  
383 -  
384 - $oTemplating =& KTTemplating::getSingleton();  
385 - $oTemplate = $oTemplating->loadTemplate("kt3/fieldsets/simple"); 402 +
  403 +
  404 + $oTemplating =& KTTemplating::getSingleton();
  405 + $oTemplate = $oTemplating->loadTemplate('kt3/fieldsets/simple');
386 $aTemplateData = array( 406 $aTemplateData = array(
387 - "context" => $this,  
388 - "document_data" => $aDocumentData,  
389 - "document" => $aDocumentData["document"],  
390 - "fieldset" => $this->fieldset,  
391 - "fieldset_values" => $fieldset_values,  
392 - "description" => $this->fieldset->getDescription(), 407 + 'context' => $this,
  408 + 'document_data' => $aDocumentData,
  409 + 'document' => $aDocumentData['document'],
  410 + 'fieldset' => $this->fieldset,
  411 + 'fieldset_values' => $fieldset_values,
  412 + 'description' => $this->fieldset->getDescription(),
393 ); 413 );
394 - return $oTemplate->render($aTemplateData); 414 + return $oTemplate->render($aTemplateData);
395 } 415 }
396 - 416 +
397 function renderComparison($aDocumentData, $aComparisonData) { 417 function renderComparison($aDocumentData, $aComparisonData) {
398 // we do a fair bit of fetching, etc. in here. 418 // we do a fair bit of fetching, etc. in here.
399 - $document = $aDocumentData["document"];  
400 - 419 + $document = $aDocumentData['document'];
  420 +
401 // we need to extract the fields. 421 // we need to extract the fields.
402 $fields =& $this->fieldset->getFields(); 422 $fields =& $this->fieldset->getFields();
403 -  
404 - 423 +
  424 +
405 // we now grab that subset of items which fit in here. 425 // we now grab that subset of items which fit in here.
406 // FIXME link value -> lookup where appropriate. 426 // FIXME link value -> lookup where appropriate.
407 // FIXME probably need to be more careful about the _type_ of field here. 427 // FIXME probably need to be more careful about the _type_ of field here.
408 $fieldset_values = array(); 428 $fieldset_values = array();
409 foreach ($fields as $oField) { 429 foreach ($fields as $oField) {
410 - $curr_val = KTUtil::arrayGet($aDocumentData["field_values"], $oField->getId(), null);  
411 - $old_val = KTUtil::arrayGet($aComparisonData["field_values"], $oField->getId(), null);  
412 - $fieldset_values[] = array("field" => $oField, "current_value" => $curr_val, "previous_value" => $old_val); 430 + $curr_val = KTUtil::arrayGet($aDocumentData['field_values'], $oField->getId(), null);
  431 + $old_val = KTUtil::arrayGet($aComparisonData['field_values'], $oField->getId(), null);
  432 + $fieldset_values[] = array('field' => $oField, 'current_value' => $curr_val, 'previous_value' => $old_val);
413 } 433 }
414 -  
415 -  
416 - $oTemplating =& KTTemplating::getSingleton();  
417 - $oTemplate = $oTemplating->loadTemplate("kt3/fieldsets/simple_versioned"); 434 +
  435 +
  436 + $oTemplating =& KTTemplating::getSingleton();
  437 + $oTemplate = $oTemplating->loadTemplate('kt3/fieldsets/simple_versioned');
418 $aTemplateData = array( 438 $aTemplateData = array(
419 - "context" => $this,  
420 - "document_data" => $aDocumentData,  
421 - "document" => $aDocumentData["document"],  
422 - "fieldset" => $this->fieldset,  
423 - "fieldset_values" => $fieldset_values, 439 + 'context' => $this,
  440 + 'document_data' => $aDocumentData,
  441 + 'document' => $aDocumentData['document'],
  442 + 'fieldset' => $this->fieldset,
  443 + 'fieldset_values' => $fieldset_values,
424 ); 444 );
425 - return $oTemplate->render($aTemplateData);  
426 - }  
427 - 445 + return $oTemplate->render($aTemplateData);
  446 + }
  447 +
428 function renderEdit($document_data) { 448 function renderEdit($document_data) {
429 global $main; // FIXME remove direct access to $main 449 global $main; // FIXME remove direct access to $main
430 - 450 +
431 $aFields = array(); 451 $aFields = array();
432 - 452 +
433 $fields =& $this->fieldset->getFields(); 453 $fields =& $this->fieldset->getFields();
434 - 454 +
435 foreach ($fields as $oField) { 455 foreach ($fields as $oField) {
436 - $val = KTUtil::arrayGet($document_data["field_values"], $oField->getId(), null);  
437 - 456 + $val = KTUtil::arrayGet($document_data['field_values'], $oField->getId(), null);
  457 +
438 $has_errors = KTUtil::arrayGet($document_data['errors'], $oField->getId(),false); 458 $has_errors = KTUtil::arrayGet($document_data['errors'], $oField->getId(),false);
439 if ($has_errors !== false) { 459 if ($has_errors !== false) {
440 // FIXME when the actual errors (meaningful) are passed out, fix this. 460 // FIXME when the actual errors (meaningful) are passed out, fix this.
441 $errors = array(_kt('The system rejected your value for this field.')); 461 $errors = array(_kt('The system rejected your value for this field.'));
442 - } else { 462 + } else {
443 $errors = null; 463 $errors = null;
444 } 464 }
445 - 465 +
446 $aFields[] = getWidgetForMetadataField($oField, $val, $main, $errors); // FIXME handle errors 466 $aFields[] = getWidgetForMetadataField($oField, $val, $main, $errors); // FIXME handle errors
447 } 467 }
448 $fieldset_name = $this->fieldset->getName(); 468 $fieldset_name = $this->fieldset->getName();
449 $fieldset_description = $this->fieldset->getDescription(); 469 $fieldset_description = $this->fieldset->getDescription();
450 - $oTemplating =& KTTemplating::getSingleton();  
451 - $oTemplate = $oTemplating->loadTemplate("kt3/fieldsets/simple_editable"); 470 + $oTemplating =& KTTemplating::getSingleton();
  471 + $oTemplate = $oTemplating->loadTemplate('kt3/fieldsets/simple_editable');
452 $aTemplateData = array( 472 $aTemplateData = array(
453 - "context" => $this,  
454 - "fields" => $aFields,  
455 - "title" => $fieldset_name,  
456 - "description" => $fieldset_description, 473 + 'context' => $this,
  474 + 'fields' => $aFields,
  475 + 'title' => $fieldset_name,
  476 + 'description' => $fieldset_description,
457 ); 477 );
458 -  
459 - 478 +
  479 +
460 return $oTemplate->render($aTemplateData); 480 return $oTemplate->render($aTemplateData);
461 } 481 }
462 - 482 +
463 } 483 }
464 484
465 485
466 // Handle the conditional case. 486 // Handle the conditional case.
467 class ConditionalFieldsetDisplay extends SimpleFieldsetDisplay { 487 class ConditionalFieldsetDisplay extends SimpleFieldsetDisplay {
468 - 488 +
469 function renderEdit($document_data) { 489 function renderEdit($document_data) {
470 global $main; // FIXME remove direct access to $main 490 global $main; // FIXME remove direct access to $main
471 $oPage =& $main; 491 $oPage =& $main;
472 - 492 +
473 // FIXME do this from inside the widgetry mojo. 493 // FIXME do this from inside the widgetry mojo.
474 $oPage->requireCSSResource('resources/css/kt-treewidget.css'); 494 $oPage->requireCSSResource('resources/css/kt-treewidget.css');
475 - 495 +
476 // FIXME this currently doesn't work, since we use NBM's half-baked Ajax on add/bulk ;) 496 // FIXME this currently doesn't work, since we use NBM's half-baked Ajax on add/bulk ;)
477 $oPage->requireJSResource('resources/js/taillog.js'); 497 $oPage->requireJSResource('resources/js/taillog.js');
478 $oPage->requireJSResource('resources/js/conditional_usage.js'); 498 $oPage->requireJSResource('resources/js/conditional_usage.js');
479 -  
480 - $aFields = array(); 499 +
  500 + $aFields = array();
481 $fields =& $this->fieldset->getFields(); 501 $fields =& $this->fieldset->getFields();
482 $values = array(); 502 $values = array();
483 $errors = $document_data['errors']; 503 $errors = $document_data['errors'];
484 504
485 $have_values = false; 505 $have_values = false;
486 foreach ($fields as $oField) { 506 foreach ($fields as $oField) {
487 - $val = KTUtil::arrayGet($document_data["field_values"], $oField->getId(), null); 507 + $val = KTUtil::arrayGet($document_data['field_values'], $oField->getId(), null);
488 if ($val !== null) { 508 if ($val !== null) {
489 $have_values = true; 509 $have_values = true;
490 -  
491 - }  
492 - 510 +
  511 + }
  512 +
493 $values[$oField->getId()] = $val; 513 $values[$oField->getId()] = $val;
494 - } 514 + }
  515 +
495 516
496 -  
497 // now, we need to do some extra work on conditional widgets. 517 // now, we need to do some extra work on conditional widgets.
498 // how? 518 // how?
499 - 519 +
500 $fieldset_name = $this->fieldset->getName(); 520 $fieldset_name = $this->fieldset->getName();
501 $fieldset_description = _kt($this->fieldset->getDescription()); // need a better approach. how do we handle database-resident translations? 521 $fieldset_description = _kt($this->fieldset->getDescription()); // need a better approach. how do we handle database-resident translations?
502 - $fieldset_description .= _kt("Note that the options which are available depends on previous choices within this fieldset.");  
503 - 522 + $fieldset_description .= _kt('Note that the options which are available depends on previous choices within this fieldset.');
  523 +
504 // FIXME handle the editable case _with_ values. 524 // FIXME handle the editable case _with_ values.
505 - 525 +
506 if ($have_values) { 526 if ($have_values) {
507 - $oTemplating =& KTTemplating::getSingleton();  
508 - $oTemplate = $oTemplating->loadTemplate("kt3/fieldsets/conditional_editable_values"); 527 + $oTemplating =& KTTemplating::getSingleton();
  528 + $oTemplate = $oTemplating->loadTemplate('kt3/fieldsets/conditional_editable_values');
509 $aTemplateData = array( 529 $aTemplateData = array(
510 - "context" => $this,  
511 - "fields" => $fields =& $this->fieldset->getFields(), 530 + 'context' => $this,
  531 + 'fields' => $fields =& $this->fieldset->getFields(),
512 'fieldset_id' => $this->fieldset->getId(), 532 'fieldset_id' => $this->fieldset->getId(),
513 - "title" => $fieldset_name,  
514 - "description" => $fieldset_description, 533 + 'title' => $fieldset_name,
  534 + 'description' => $fieldset_description,
515 'values' => $values, 535 'values' => $values,
516 'errors' => $errors, 536 'errors' => $errors,
517 ); 537 );
518 - 538 +
519 return $oTemplate->render($aTemplateData); 539 return $oTemplate->render($aTemplateData);
520 } // else { 540 } // else {
521 -  
522 - $oTemplating =& KTTemplating::getSingleton();  
523 - $oTemplate = $oTemplating->loadTemplate("kt3/fieldsets/conditional_editable"); 541 +
  542 + $oTemplating =& KTTemplating::getSingleton();
  543 + $oTemplate = $oTemplating->loadTemplate('kt3/fieldsets/conditional_editable');
524 $aTemplateData = array( 544 $aTemplateData = array(
525 - "context" => $this,  
526 - "field" => $oField, // first field, widget. 545 + 'context' => $this,
  546 + 'field' => $oField, // first field, widget.
527 'fieldset_id' => $this->fieldset->getId(), 547 'fieldset_id' => $this->fieldset->getId(),
528 - "title" => $fieldset_name,  
529 - "description" => $fieldset_description, 548 + 'title' => $fieldset_name,
  549 + 'description' => $fieldset_description,
530 ); 550 );
531 - 551 +
532 return $oTemplate->render($aTemplateData); 552 return $oTemplate->render($aTemplateData);
533 } 553 }
534 - 554 +
535 } 555 }
536 556
537 -?> 557 -?>
  558 +?>
538 \ No newline at end of file 559 \ No newline at end of file
plugins/housekeeper/DiskUsageDashlet.inc.php
1 <?php 1 <?php
2 2
3 /** 3 /**
4 - * $Id 4 + * $Id: $
5 * 5 *
6 * KnowledgeTree Open Source Edition 6 * KnowledgeTree Open Source Edition
7 * Document Management Made Simple 7 * Document Management Made Simple
@@ -106,6 +106,8 @@ class DiskUsageDashlet extends KTBaseDashlet @@ -106,6 +106,8 @@ class DiskUsageDashlet extends KTBaseDashlet
106 preg_match('/(.*)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\%\s+(.*)/', $line, $matches); 106 preg_match('/(.*)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\%\s+(.*)/', $line, $matches);
107 list($line, $filesystem, $size, $used, $avail, $usedp, $mount) = $matches; 107 list($line, $filesystem, $size, $used, $avail, $usedp, $mount) = $matches;
108 108
  109 + if ($size === 0) continue;
  110 +
109 if ($usedp >= 100 - $this->urgentPercent) 111 if ($usedp >= 100 - $this->urgentPercent)
110 { 112 {
111 $colour = 'red'; 113 $colour = 'red';
@@ -114,6 +116,10 @@ class DiskUsageDashlet extends KTBaseDashlet @@ -114,6 +116,10 @@ class DiskUsageDashlet extends KTBaseDashlet
114 { 116 {
115 $colour = 'orange'; 117 $colour = 'orange';
116 } 118 }
  119 + elseif ( $usedp < 100 - $this->warningPercent)
  120 + {
  121 + $colour = 'none';
  122 + }
117 123
118 $usage[] = array( 124 $usage[] = array(
119 'filesystem'=>$filesystem, 125 'filesystem'=>$filesystem,
plugins/housekeeper/FolderUsageDashlet.inc.php
1 <?php 1 <?php
2 2
3 /** 3 /**
4 - * $Id 4 + * $Id: $
5 * 5 *
6 * KnowledgeTree Open Source Edition 6 * KnowledgeTree Open Source Edition
7 * Document Management Made Simple 7 * Document Management Made Simple
8 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 8 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
9 - * 9 + *
10 * This program is free software; you can redistribute it and/or modify it under 10 * This program is free software; you can redistribute it and/or modify it under
11 * the terms of the GNU General Public License version 3 as published by the 11 * the terms of the GNU General Public License version 3 as published by the
12 * Free Software Foundation. 12 * Free Software Foundation.
13 - * 13 + *
14 * This program is distributed in the hope that it will be useful, but WITHOUT 14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 16 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * details. 17 * details.
18 - * 18 + *
19 * You should have received a copy of the GNU General Public License 19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>. 20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 - * 21 + *
22 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 22 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
23 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 23 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
24 - * 24 + *
25 * The interactive user interfaces in modified source and object code versions 25 * The interactive user interfaces in modified source and object code versions
26 * of this program must display Appropriate Legal Notices, as required under 26 * of this program must display Appropriate Legal Notices, as required under
27 * Section 5 of the GNU General Public License version 3. 27 * Section 5 of the GNU General Public License version 3.
28 - * 28 + *
29 * In accordance with Section 7(b) of the GNU General Public License version 3, 29 * In accordance with Section 7(b) of the GNU General Public License version 3,
30 * these Appropriate Legal Notices must retain the display of the "Powered by 30 * these Appropriate Legal Notices must retain the display of the "Powered by
31 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 31 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
32 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 32 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
33 - * must display the words "Powered by KnowledgeTree" and retain the original  
34 - * copyright notice. 33 + * must display the words "Powered by KnowledgeTree" and retain the original
  34 + * copyright notice.
35 * Contributor( s): ______________________________________ 35 * Contributor( s): ______________________________________
36 */ 36 */
37 37
@@ -55,7 +55,7 @@ class FolderUsageDashlet extends KTBaseDashlet @@ -55,7 +55,7 @@ class FolderUsageDashlet extends KTBaseDashlet
55 $files=0; 55 $files=0;
56 $filesize=0; 56 $filesize=0;
57 57
58 - if ($dh = opendir($path)) 58 + if (is_dir($path) && ($dh = opendir($path)))
59 { 59 {
60 while (($file = readdir($dh)) !== false) 60 while (($file = readdir($dh)) !== false)
61 { 61 {
@@ -131,7 +131,7 @@ class FolderUsageDashlet extends KTBaseDashlet @@ -131,7 +131,7 @@ class FolderUsageDashlet extends KTBaseDashlet
131 'description'=>$name, 131 'description'=>$name,
132 'folder'=>$directory, 132 'folder'=>$directory,
133 'files'=>number_format($temp['files'],0,'.',','), 133 'files'=>number_format($temp['files'],0,'.',','),
134 - 'filesize'=>KTUtil::filesizeToString($temp['filesize']), 134 + 'filesize'=>KTUtil::filesizeToString($temp['filesize']/1024),
135 'action'=>$i, 135 'action'=>$i,
136 'canClean'=>$canClean 136 'canClean'=>$canClean
137 ); 137 );
plugins/ktcore/KTBulkActions.php
@@ -661,6 +661,9 @@ class KTBrowseBulkExportAction extends KTBulkAction { @@ -661,6 +661,9 @@ class KTBrowseBulkExportAction extends KTBulkAction {
661 parent_folder_ids LIKE '%,{$sFolderId}'"; 661 parent_folder_ids LIKE '%,{$sFolderId}'";
662 $aFolderList = $this->oFolder->getList($sWhereClause); 662 $aFolderList = $this->oFolder->getList($sWhereClause);
663 663
  664 + $aFolderObjects = array();
  665 + $aFolderObjects[$sFolderId] = $oFolder;
  666 +
664 // Export the folder structure to ensure the export of empty directories 667 // Export the folder structure to ensure the export of empty directories
665 if(!empty($aFolderList)){ 668 if(!empty($aFolderList)){
666 foreach($aFolderList as $k => $oFolderItem){ 669 foreach($aFolderList as $k => $oFolderItem){
@@ -673,6 +676,7 @@ class KTBrowseBulkExportAction extends KTBulkAction { @@ -673,6 +676,7 @@ class KTBrowseBulkExportAction extends KTBulkAction {
673 $aDocuments = array_merge($aDocuments, $aFolderDocs); 676 $aDocuments = array_merge($aDocuments, $aFolderDocs);
674 } 677 }
675 $this->oZip->addFolderToZip($oFolderItem); 678 $this->oZip->addFolderToZip($oFolderItem);
  679 + $aFolderObjects[$oFolderItem->getId()] = $oFolderItem;
676 } 680 }
677 } 681 }
678 682
@@ -680,6 +684,8 @@ class KTBrowseBulkExportAction extends KTBulkAction { @@ -680,6 +684,8 @@ class KTBrowseBulkExportAction extends KTBulkAction {
680 if(!empty($aDocuments)){ 684 if(!empty($aDocuments)){
681 foreach($aDocuments as $sDocumentId){ 685 foreach($aDocuments as $sDocumentId){
682 $oDocument = Document::get($sDocumentId); 686 $oDocument = Document::get($sDocumentId);
  687 + $sDocFolderId = $oDocument->getFolderID();
  688 + $oFolder = isset($aFolderObjects[$sDocFolderId]) ? $aFolderObjects[$sDocFolderId] : Folder::get($sDocFolderId);
683 689
684 if ($this->bNoisy) { 690 if ($this->bNoisy) {
685 $oDocumentTransaction = new DocumentTransaction($oDocument, "Document part of bulk export", 'ktstandard.transactions.bulk_export', array()); 691 $oDocumentTransaction = new DocumentTransaction($oDocument, "Document part of bulk export", 'ktstandard.transactions.bulk_export', array());
@@ -689,11 +695,10 @@ class KTBrowseBulkExportAction extends KTBulkAction { @@ -689,11 +695,10 @@ class KTBrowseBulkExportAction extends KTBulkAction {
689 // fire subscription alerts for the downloaded document 695 // fire subscription alerts for the downloaded document
690 if($this->bNotifications){ 696 if($this->bNotifications){
691 $oSubscriptionEvent = new SubscriptionEvent(); 697 $oSubscriptionEvent = new SubscriptionEvent();
692 - $oFolder = Folder::get($oDocument->getFolderID());  
693 $oSubscriptionEvent->DownloadDocument($oDocument, $oFolder); 698 $oSubscriptionEvent->DownloadDocument($oDocument, $oFolder);
694 } 699 }
695 700
696 - $this->oZip->addDocumentToZip($oDocument); 701 + $this->oZip->addDocumentToZip($oDocument, $oFolder);
697 } 702 }
698 } 703 }
699 } 704 }
@@ -906,6 +911,9 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction { @@ -906,6 +911,9 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction {
906 parent_folder_ids LIKE '%,{$sFolderId}'"; 911 parent_folder_ids LIKE '%,{$sFolderId}'";
907 $aFolderList = $this->oFolder->getList($sWhereClause); 912 $aFolderList = $this->oFolder->getList($sWhereClause);
908 913
  914 + $aFolderObjects = array();
  915 + $aFolderObjects[$sFolderId] = $oFolder;
  916 +
909 // Get the documents within the folder 917 // Get the documents within the folder
910 if(!empty($aFolderList)){ 918 if(!empty($aFolderList)){
911 foreach($aFolderList as $k => $oFolderItem){ 919 foreach($aFolderList as $k => $oFolderItem){
@@ -921,6 +929,7 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction { @@ -921,6 +929,7 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction {
921 // Add the folder to the zip file 929 // Add the folder to the zip file
922 if($this->bDownload){ 930 if($this->bDownload){
923 $this->oZip->addFolderToZip($oFolderItem); 931 $this->oZip->addFolderToZip($oFolderItem);
  932 + $aFolderObjects[$oFolderItem->getId()] = $oFolderItem;
924 } 933 }
925 } 934 }
926 } 935 }
@@ -961,7 +970,9 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction { @@ -961,7 +970,9 @@ class KTBrowseBulkCheckoutAction extends KTBulkAction {
961 $oDocumentTransaction = new DocumentTransaction($oDocument, "Document part of bulk checkout", 'ktstandard.transactions.check_out', array()); 970 $oDocumentTransaction = new DocumentTransaction($oDocument, "Document part of bulk checkout", 'ktstandard.transactions.check_out', array());
962 $oDocumentTransaction->create(); 971 $oDocumentTransaction->create();
963 } 972 }
964 - $this->oZip->addDocumentToZip($oDocument); 973 + $sDocFolderId = $oDocument->getFolderID();
  974 + $oFolder = isset($aFolderObjects[$sDocFolderId]) ? $aFolderObjects[$sDocFolderId] : Folder::get($sDocFolderId);
  975 + $this->oZip->addDocumentToZip($oDocument, $oFolder);
965 } 976 }
966 } 977 }
967 } 978 }
plugins/ktcore/KTCorePlugin.php
@@ -158,6 +158,11 @@ class KTCorePlugin extends KTPlugin { @@ -158,6 +158,11 @@ class KTCorePlugin extends KTPlugin {
158 $this->registerTrigger('edit', 'postValidate', 'SavedSearchSubscriptionTrigger', 'ktcore.search2.savedsearch.subscription.edit', KT_DIR . '/plugins/search2/Search2Triggers.php'); 158 $this->registerTrigger('edit', 'postValidate', 'SavedSearchSubscriptionTrigger', 'ktcore.search2.savedsearch.subscription.edit', KT_DIR . '/plugins/search2/Search2Triggers.php');
159 $this->registerTrigger('add', 'postValidate', 'SavedSearchSubscriptionTrigger', 'ktcore.search2.savedsearch.subscription.add', KT_DIR . '/plugins/search2/Search2Triggers.php'); 159 $this->registerTrigger('add', 'postValidate', 'SavedSearchSubscriptionTrigger', 'ktcore.search2.savedsearch.subscription.add', KT_DIR . '/plugins/search2/Search2Triggers.php');
160 $this->registerTrigger('discussion', 'postValidate', 'SavedSearchSubscriptionTrigger', 'ktcore.search2.savedsearch.subscription.discussion', KT_DIR . '/plugins/search2/Search2Triggers.php'); 160 $this->registerTrigger('discussion', 'postValidate', 'SavedSearchSubscriptionTrigger', 'ktcore.search2.savedsearch.subscription.discussion', KT_DIR . '/plugins/search2/Search2Triggers.php');
  161 +
  162 + //Tag Cloud Triggers
  163 + $this->registerTrigger('add', 'postValidate', 'KTAddDocumentTrigger', 'ktcore.triggers.tagcloud.add', KT_DIR.'/plugins/tagcloud/TagCloudTriggers.php');
  164 + $this->registerTrigger('edit', 'postValidate', 'KTEditDocumentTrigger', 'ktcore.triggers.tagcloud.edit', KT_DIR.'/plugins/tagcloud/TagCloudTriggers.php');
  165 +
161 166
162 // widgets 167 // widgets
163 $this->registerWidget('KTCoreHiddenWidget', 'ktcore.widgets.hidden', 'KTWidgets.php'); 168 $this->registerWidget('KTCoreHiddenWidget', 'ktcore.widgets.hidden', 'KTWidgets.php');
plugins/ktcore/admin/documentFieldsv2.php
@@ -66,7 +66,7 @@ class KTDocumentFieldDispatcher extends KTAdminDispatcher { @@ -66,7 +66,7 @@ class KTDocumentFieldDispatcher extends KTAdminDispatcher {
66 66
67 $oTemplate->setData(array( 67 $oTemplate->setData(array(
68 'context' => $this, 68 'context' => $this,
69 - 'fieldsets' => KTFieldset::getList('disabled != true'), 69 + 'fieldsets' => KTFieldset::getList("disabled != true AND namespace != 'tagcloud'"),
70 )); 70 ));
71 return $oTemplate; 71 return $oTemplate;
72 } 72 }
plugins/ktcore/admin/plugins.php
@@ -75,6 +75,33 @@ class KTPluginDispatcher extends KTAdminDispatcher { @@ -75,6 +75,33 @@ class KTPluginDispatcher extends KTAdminDispatcher {
75 $sTable = KTUtil::getTableName('plugins'); 75 $sTable = KTUtil::getTableName('plugins');
76 $aIds = (array) KTUtil::arrayGet($_REQUEST, 'pluginids'); 76 $aIds = (array) KTUtil::arrayGet($_REQUEST, 'pluginids');
77 KTPluginEntity::setEnabled($aIds); 77 KTPluginEntity::setEnabled($aIds);
  78 + //enabling or disabling Tag fieldset depending on whether tag cloud plugin is enabled or disabled.
  79 + //Get tag cloud object
  80 + $oTagClouPlugin = KTPluginEntity::getByNamespace('ktcore.tagcloud.plugin');
  81 + if($oTagClouPlugin->getDisabled() == '1')
  82 + {
  83 + //disable tag fieldset
  84 + $aFV = array(
  85 + 'disabled' => true,
  86 + );
  87 + $aWFV = array(
  88 + 'namespace' => 'tagcloud'
  89 + );
  90 + $res = DBUtil::whereUpdate('fieldsets', $aFV, $aWFV);
  91 + }
  92 + //if Tag Cloud plugin disabled
  93 + if($oTagClouPlugin->getDisabled() == '0')
  94 + {
  95 + //enable tag fieldset
  96 + $aFV = array(
  97 + 'disabled' => false,
  98 + );
  99 + $aWFV = array(
  100 + 'namespace' => 'tagcloud'
  101 + );
  102 + $res = DBUtil::whereUpdate('fieldsets', $aFV, $aWFV);
  103 + }
  104 +
78 $this->successRedirectToMain(_kt('Plugins updated')); 105 $this->successRedirectToMain(_kt('Plugins updated'));
79 } 106 }
80 107
plugins/ktcore/document/edit.php
@@ -4,32 +4,32 @@ @@ -4,32 +4,32 @@
4 * KnowledgeTree Open Source Edition 4 * KnowledgeTree Open Source Edition
5 * Document Management Made Simple 5 * Document Management Made Simple
6 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 6 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
7 - * 7 + *
8 * This program is free software; you can redistribute it and/or modify it under 8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License version 3 as published by the 9 * the terms of the GNU General Public License version 3 as published by the
10 * Free Software Foundation. 10 * Free Software Foundation.
11 - * 11 + *
12 * This program is distributed in the hope that it will be useful, but WITHOUT 12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15 * details. 15 * details.
16 - * 16 + *
17 * You should have received a copy of the GNU General Public License 17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 - * 19 + *
20 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 20 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
21 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 21 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
22 - * 22 + *
23 * The interactive user interfaces in modified source and object code versions 23 * The interactive user interfaces in modified source and object code versions
24 * of this program must display Appropriate Legal Notices, as required under 24 * of this program must display Appropriate Legal Notices, as required under
25 * Section 5 of the GNU General Public License version 3. 25 * Section 5 of the GNU General Public License version 3.
26 - * 26 + *
27 * In accordance with Section 7(b) of the GNU General Public License version 3, 27 * In accordance with Section 7(b) of the GNU General Public License version 3,
28 * these Appropriate Legal Notices must retain the display of the "Powered by 28 * these Appropriate Legal Notices must retain the display of the "Powered by
29 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 29 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
30 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 30 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
31 - * must display the words "Powered by KnowledgeTree" and retain the original  
32 - * copyright notice. 31 + * must display the words "Powered by KnowledgeTree" and retain the original
  32 + * copyright notice.
33 * Contributor( s): ______________________________________ 33 * Contributor( s): ______________________________________
34 * 34 *
35 */ 35 */
@@ -198,6 +198,10 @@ class KTDocumentEditAction extends KTDocumentAction { @@ -198,6 +198,10 @@ class KTDocumentEditAction extends KTDocumentAction {
198 $this->oDocument->setDocumentTypeId($doctypeid); 198 $this->oDocument->setDocumentTypeId($doctypeid);
199 } 199 }
200 $this->oDocument->setName(($data['document_title'])); 200 $this->oDocument->setName(($data['document_title']));
  201 + $this->oDocument->startNewContentVersion($this->oUser);
  202 + $this->oDocument->setMinorVersionNumber($this->oDocument->getMinorVersionNumber()+1);
  203 + $this->oDocument->setLastModifiedDate(getCurrentDateTime());
  204 + $this->oDocument->setModifiedUserId($this->oUser->getId());
201 205
202 $res = $this->oDocument->update(); 206 $res = $this->oDocument->update();
203 if (PEAR::isError($res)) { 207 if (PEAR::isError($res)) {
plugins/ktcore/folder/BulkImport.php
@@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 * 35 *
36 */ 36 */
@@ -60,7 +60,7 @@ class KTBulkImportFolderAction extends KTFolderAction { @@ -60,7 +60,7 @@ class KTBulkImportFolderAction extends KTFolderAction {
60 function getInfo() { 60 function getInfo() {
61 if (!Permission::userIsSystemAdministrator($this->oUser->getId())) { 61 if (!Permission::userIsSystemAdministrator($this->oUser->getId())) {
62 return null; 62 return null;
63 - 63 +
64 } 64 }
65 return parent::getInfo(); 65 return parent::getInfo();
66 } 66 }
@@ -122,6 +122,7 @@ class KTBulkImportFolderAction extends KTFolderAction { @@ -122,6 +122,7 @@ class KTBulkImportFolderAction extends KTFolderAction {
122 $aOptions = array( 122 $aOptions = array(
123 'documenttype' => $oDocumentType, 123 'documenttype' => $oDocumentType,
124 'metadata' => $aFields, 124 'metadata' => $aFields,
  125 + 'copy_upload' => 'true',
125 ); 126 );
126 127
127 $po =& new JavascriptObserver($this); 128 $po =& new JavascriptObserver($this);
plugins/ktcore/folder/BulkUpload.php
@@ -114,7 +114,16 @@ class KTBulkUploadFolderAction extends KTFolderAction { @@ -114,7 +114,16 @@ class KTBulkUploadFolderAction extends KTFolderAction {
114 114
115 unset($aErrorOptions['message']); 115 unset($aErrorOptions['message']);
116 $aFile = $this->oValidator->validateFile($_FILES['file'], $aErrorOptions); 116 $aFile = $this->oValidator->validateFile($_FILES['file'], $aErrorOptions);
117 - 117 +
  118 + // Ensure file is a zip file
  119 + $sMime = $aFile['type'];
  120 + $pos = strpos($sMime, 'x-zip-compressed');
  121 + if($pos === false){
  122 + $this->addErrorMessage(_kt("Bulk Upload failed: File is not a zip file."));
  123 + controllerRedirect("browse", 'fFolderId=' . $this->oFolder->getID());
  124 + exit(0);
  125 + }
  126 +
118 $matches = array(); 127 $matches = array();
119 $aFields = array(); 128 $aFields = array();
120 foreach ($_REQUEST as $k => $v) { 129 foreach ($_REQUEST as $k => $v) {
@@ -132,6 +141,7 @@ class KTBulkUploadFolderAction extends KTFolderAction { @@ -132,6 +141,7 @@ class KTBulkUploadFolderAction extends KTFolderAction {
132 $bm =& new KTBulkImportManager($this->oFolder, $fs, $this->oUser, $aOptions); 141 $bm =& new KTBulkImportManager($this->oFolder, $fs, $this->oUser, $aOptions);
133 $this->startTransaction(); 142 $this->startTransaction();
134 $res = $bm->import(); 143 $res = $bm->import();
  144 +
135 $aErrorOptions['message'] = _kt("Bulk Upload failed"); 145 $aErrorOptions['message'] = _kt("Bulk Upload failed");
136 $this->oValidator->notError($res, $aErrorOptions); 146 $this->oValidator->notError($res, $aErrorOptions);
137 147
plugins/ktcore/folder/Permissions.php
1 <?php 1 <?php
2 /** 2 /**
3 * $Id$ 3 * $Id$
4 - * 4 + *
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 */ 35 */
36 36
@@ -141,22 +141,22 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -141,22 +141,22 @@ class KTFolderPermissionsAction extends KTFolderAction {
141 $sInherited = join(' > ', $oInherited->getPathArray()); 141 $sInherited = join(' > ', $oInherited->getPathArray());
142 } 142 }
143 // only allow inheritance if not inherited, -and- folders is editable 143 // only allow inheritance if not inherited, -and- folders is editable
144 - $bInheritable = $bEdit && ($oInherited->getId() !== $this->oFolder->getId()); 144 + $bInheritable = $bEdit && ($oInherited->getId() !== $this->oFolder->getId());
145 // only allow edit if the folder is editable. 145 // only allow edit if the folder is editable.
146 $bEdit = $bEdit && ($oInherited->getId() == $this->oFolder->getId()); 146 $bEdit = $bEdit && ($oInherited->getId() == $this->oFolder->getId());
147 - 147 +
148 $aConditions = array(); 148 $aConditions = array();
149 $aDynConditions = KTPermissionDynamicCondition::getByPermissionObject($oPO); 149 $aDynConditions = KTPermissionDynamicCondition::getByPermissionObject($oPO);
150 - 150 +
151 foreach ($aDynConditions as $oDynCondition) { 151 foreach ($aDynConditions as $oDynCondition) {
152 $g = Group::get($oDynCondition->getGroupId()); 152 $g = Group::get($oDynCondition->getGroupId());
153 if (is_null($g)) continue; // db integrity catch 153 if (is_null($g)) continue; // db integrity catch
154 - 154 +
155 if (PEAR::isError($g)) { continue; } 155 if (PEAR::isError($g)) { continue; }
156 - $c = KTSavedSearch::get($oDynCondition->getConditionId());  
157 - if (is_null($c)) continue; // db integrity catch 156 + $c = KTSavedSearch::get($oDynCondition->getConditionId());
  157 + if (is_null($c)) continue; // db integrity catch
158 if (PEAR::isError($c)) { continue; } 158 if (PEAR::isError($c)) { continue; }
159 - 159 +
160 $aInfo = array( 160 $aInfo = array(
161 'group' => $g->getName(), 161 'group' => $g->getName(),
162 'name' => $c->getName(), 162 'name' => $c->getName(),
@@ -183,7 +183,7 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -183,7 +183,7 @@ class KTFolderPermissionsAction extends KTFolderAction {
183 'edit' => $bEdit, 183 'edit' => $bEdit,
184 'inheritable' => $bInheritable, 184 'inheritable' => $bInheritable,
185 'inherited' => $sInherited, 185 'inherited' => $sInherited,
186 - 'conditions' => $aConditions, 186 + 'conditions' => $aConditions,
187 ); 187 );
188 return $oTemplate->render($aTemplateData); 188 return $oTemplate->render($aTemplateData);
189 } 189 }
@@ -206,15 +206,20 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -206,15 +206,20 @@ class KTFolderPermissionsAction extends KTFolderAction {
206 if (PEAR::isError($oPLA)) { 206 if (PEAR::isError($oPLA)) {
207 continue; 207 continue;
208 } 208 }
209 - $oDescriptor = KTPermissionDescriptor::get($oPLA->getPermissionDescriptorID()); 209 + $oDescriptor =& KTPermissionDescriptor::get($oPLA->getPermissionDescriptorID());
210 $iPermissionID = $oPermission->getID(); 210 $iPermissionID = $oPermission->getID();
211 $aMapPermissionGroup[$iPermissionID] = array(); 211 $aMapPermissionGroup[$iPermissionID] = array();
212 - foreach ($aUsers as $oUser) {  
213 - if (KTPermissionUtil::userHasPermissionOnItem($oUser, $oPermission, $this->oFolder)) {  
214 - $aMapPermissionUser[$iPermissionID][$oUser->getId()] = true;  
215 - $aActiveUsers[$oUser->getId()] = true;  
216 - }  
217 - } 212 +
  213 + $hasPermission = false;
  214 + $everyone = $oDescriptor->hasRoles(array(-3));
  215 + $authenticated = $oDescriptor->hasRoles(array(-4));
  216 + // TODO : paginate this page, when there are too many users
  217 + foreach ($aUsers as $oUser) {
  218 + if ($everyone || ($authenticated && $oUser->isAnonymous()) ||
  219 + $oUser->hasPermission($oDescriptor)) {
  220 + $aMapPermissionUser[$iPermissionID][$oUser->getId()] = true;
  221 + }
  222 + }
218 } 223 }
219 224
220 // now we constitute the actual sets. 225 // now we constitute the actual sets.
@@ -222,12 +227,7 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -222,12 +227,7 @@ class KTFolderPermissionsAction extends KTFolderAction {
222 $groups = array(); 227 $groups = array();
223 $roles = array(); // should _always_ be empty, barring a bug in permissions::updatePermissionLookup 228 $roles = array(); // should _always_ be empty, barring a bug in permissions::updatePermissionLookup
224 229
225 - // this should be quite limited - direct role -> user assignment is typically rare.  
226 - foreach ($aActiveUsers as $id => $marker) {  
227 - $oUser = User::get($id);  
228 - if (is_null($oUser)) continue;  
229 - $users[$oUser->getName()] = $oUser;  
230 - } 230 + $users = $aUsers;
231 asort($users); // ascending, per convention. 231 asort($users); // ascending, per convention.
232 232
233 $bEdit = false; 233 $bEdit = false;
@@ -245,23 +245,12 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -245,23 +245,12 @@ class KTFolderPermissionsAction extends KTFolderAction {
245 'aMapPermissionUser' => $aMapPermissionUser, 245 'aMapPermissionUser' => $aMapPermissionUser,
246 'edit' => $bEdit, 246 'edit' => $bEdit,
247 'inherited' => $sInherited, 247 'inherited' => $sInherited,
248 - 'foldername' => $this->oFolder->getName(),  
249 - 'iFolderId' => $this->oFolder->getId(), 248 + 'foldername' => $this->oFolder->getName(),
  249 + 'iFolderId' => $this->oFolder->getId(),
250 ); 250 );
251 return $oTemplate->render($aTemplateData); 251 return $oTemplate->render($aTemplateData);
252 } 252 }
253 253
254 -  
255 -  
256 -  
257 -  
258 -  
259 -  
260 -  
261 -  
262 -  
263 -  
264 -  
265 function _copyPermissions() { 254 function _copyPermissions() {
266 $oTransaction = KTFolderTransaction::createFromArray(array( 255 $oTransaction = KTFolderTransaction::createFromArray(array(
267 'folderid' => $this->oFolder->getId(), 256 'folderid' => $this->oFolder->getId(),
@@ -295,13 +284,13 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -295,13 +284,13 @@ class KTFolderPermissionsAction extends KTFolderAction {
295 $oInherited = KTPermissionUtil::findRootObjectForPermissionObject($oPO); 284 $oInherited = KTPermissionUtil::findRootObjectForPermissionObject($oPO);
296 if ($oInherited->getId() !== $this->oFolder->getId()) { 285 if ($oInherited->getId() !== $this->oFolder->getId()) {
297 $override = KTUtil::arrayGet($_REQUEST, 'override', false); 286 $override = KTUtil::arrayGet($_REQUEST, 'override', false);
298 - if (empty($override)) { 287 + if (empty($override)) {
299 $this->errorRedirectToMain(_kt('This folder does not override its permissions'), sprintf('fFolderId=%d', $this->oFolder->getId())); 288 $this->errorRedirectToMain(_kt('This folder does not override its permissions'), sprintf('fFolderId=%d', $this->oFolder->getId()));
300 } 289 }
301 $this->startTransaction(); 290 $this->startTransaction();
302 $this->_copyPermissions(); 291 $this->_copyPermissions();
303 $this->commitTransaction(); 292 $this->commitTransaction();
304 - $oPO = KTPermissionObject::get($this->oFolder->getPermissionObjectId()); 293 + $oPO = KTPermissionObject::get($this->oFolder->getPermissionObjectId());
305 } 294 }
306 295
307 296
@@ -325,15 +314,15 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -325,15 +314,15 @@ class KTFolderPermissionsAction extends KTFolderAction {
325 314
326 $perms = KTPermission::getList(); 315 $perms = KTPermission::getList();
327 $docperms = KTPermission::getDocumentRelevantList(); 316 $docperms = KTPermission::getDocumentRelevantList();
328 -  
329 - $aTemplateData = array( 317 +
  318 + $aTemplateData = array(
330 'iFolderId' => $this->oFolder->getId(), 319 'iFolderId' => $this->oFolder->getId(),
331 'roles' => Role::getList(), 320 'roles' => Role::getList(),
332 'groups' => Group::getList(), 321 'groups' => Group::getList(),
333 'conditions' => KTSavedSearch::getConditions(), 322 'conditions' => KTSavedSearch::getConditions(),
334 'dynamic_conditions' => $aDynamicConditions, 323 'dynamic_conditions' => $aDynamicConditions,
335 'context' => &$this, 324 'context' => &$this,
336 - 'foldername' => $this->oFolder->getName(), 325 + 'foldername' => $this->oFolder->getName(),
337 'jsonpermissions' => $sJSONPermissions, 326 'jsonpermissions' => $sJSONPermissions,
338 'edit' => true, 327 'edit' => true,
339 'permissions' => $perms, 328 'permissions' => $perms,
@@ -374,7 +363,7 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -374,7 +363,7 @@ class KTFolderPermissionsAction extends KTFolderAction {
374 $aRoleIds = $oDescriptor->getRoles(); 363 $aRoleIds = $oDescriptor->getRoles();
375 foreach ($aRoleIds as $iId) { 364 foreach ($aRoleIds as $iId) {
376 $aPermissionsMap['role'][$iId][$iPermissionId] = true; 365 $aPermissionsMap['role'][$iId][$iPermissionId] = true;
377 - } 366 + }
378 } 367 }
379 return $aPermissionsMap; 368 return $aPermissionsMap;
380 } 369 }
@@ -427,7 +416,7 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -427,7 +416,7 @@ class KTFolderPermissionsAction extends KTFolderAction {
427 'name' => $oGroup->getName(), 416 'name' => $oGroup->getName(),
428 'permissions' => $aPerm, 417 'permissions' => $aPerm,
429 'id' => $oGroup->getId()); 418 'id' => $oGroup->getId());
430 - } 419 + }
431 } 420 }
432 421
433 $aRoles = Role::getList(sprintf('name like \'%%%s%%\'', $sFilter)); 422 $aRoles = Role::getList(sprintf('name like \'%%%s%%\'', $sFilter));
@@ -436,9 +425,9 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -436,9 +425,9 @@ class KTFolderPermissionsAction extends KTFolderAction {
436 if(!is_array($aPerm)) { 425 if(!is_array($aPerm)) {
437 $aPerm = array(); 426 $aPerm = array();
438 } 427 }
439 - 428 +
440 if($bSelected) { 429 if($bSelected) {
441 - if(count($aPerm)) 430 + if(count($aPerm))
442 $aEntityList['r'.$oRole->getId()] = array('type' => 'role', 431 $aEntityList['r'.$oRole->getId()] = array('type' => 'role',
443 'display' => _kt('Role') . ': ' . $oRole->getName(), 432 'display' => _kt('Role') . ': ' . $oRole->getName(),
444 'name' => $oRole->getName(), 433 'name' => $oRole->getName(),
@@ -453,7 +442,7 @@ class KTFolderPermissionsAction extends KTFolderAction { @@ -453,7 +442,7 @@ class KTFolderPermissionsAction extends KTFolderAction {
453 'id' => $oRole->getId()); 442 'id' => $oRole->getId());
454 } 443 }
455 } 444 }
456 - } 445 + }
457 return $aEntityList; 446 return $aEntityList;
458 } 447 }
459 448
plugins/ktcore/folder/addDocument.php
@@ -324,7 +324,7 @@ class KTFolderAddDocumentAction extends KTFolderAction { @@ -324,7 +324,7 @@ class KTFolderAddDocumentAction extends KTFolderAction {
324 ); 324 );
325 325
326 $mpo->start(); 326 $mpo->start();
327 - $this->startTransaction(); 327 + //$this->startTransaction();
328 $oDocument =& KTDocumentUtil::add($this->oFolder, basename($aFile['name']), $this->oUser, $aOptions); 328 $oDocument =& KTDocumentUtil::add($this->oFolder, basename($aFile['name']), $this->oUser, $aOptions);
329 if (PEAR::isError($oDocument)) { 329 if (PEAR::isError($oDocument)) {
330 $message = $oDocument->getMessage(); 330 $message = $oDocument->getMessage();
@@ -333,7 +333,7 @@ class KTFolderAddDocumentAction extends KTFolderAction { @@ -333,7 +333,7 @@ class KTFolderAddDocumentAction extends KTFolderAction {
333 } 333 }
334 $this->addInfoMessage(_kt("Document added")); 334 $this->addInfoMessage(_kt("Document added"));
335 335
336 - $this->commitTransaction(); 336 + //$this->commitTransaction();
337 $mpo->redirectToDocument($oDocument->getId()); 337 $mpo->redirectToDocument($oDocument->getId());
338 exit(0); 338 exit(0);
339 339
plugins/ktstandard/KTBulkExportPlugin.php
@@ -5,32 +5,32 @@ @@ -5,32 +5,32 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 * 35 *
36 */ 36 */
@@ -109,9 +109,24 @@ class KTBulkExportAction extends KTFolderAction { @@ -109,9 +109,24 @@ class KTBulkExportAction extends KTFolderAction {
109 $this->oPage->template = "kt3/minimal_page"; 109 $this->oPage->template = "kt3/minimal_page";
110 $this->handleOutput(""); 110 $this->handleOutput("");
111 111
  112 + // Create associative array of folder items for use by the contained documents
  113 + $aFolderObjects = array();
  114 + $aFolderObjects[$sCurrentFolderId] = $this->oFolder;
  115 +
  116 + // Export the folder structure to ensure the export of empty directories
  117 + if(!empty($aFolderList)){
  118 + foreach($aFolderList as $k => $oFolderItem){
  119 + $this->oZip->addFolderToZip($oFolderItem);
  120 + $aFolderObjects[$oFolderItem->getId()] = $oFolderItem;
  121 + }
  122 + }
  123 +
112 if(!empty($aDocumentIds)){ 124 if(!empty($aDocumentIds)){
113 foreach ($aDocumentIds as $iId) { 125 foreach ($aDocumentIds as $iId) {
114 $oDocument = Document::get($iId); 126 $oDocument = Document::get($iId);
  127 + $sFolderId = $oDocument->getFolderID();
  128 +
  129 + $oFolder = isset($aFolderObjects[$sFolderId]) ? $aFolderObjects[$sFolderId] : Folder::get($sFolderId);
115 130
116 if ($bNoisy) { 131 if ($bNoisy) {
117 $oDocumentTransaction = & new DocumentTransaction($oDocument, "Document part of bulk export", 'ktstandard.transactions.bulk_export', array()); 132 $oDocumentTransaction = & new DocumentTransaction($oDocument, "Document part of bulk export", 'ktstandard.transactions.bulk_export', array());
@@ -121,19 +136,13 @@ class KTBulkExportAction extends KTFolderAction { @@ -121,19 +136,13 @@ class KTBulkExportAction extends KTFolderAction {
121 // fire subscription alerts for the downloaded document 136 // fire subscription alerts for the downloaded document
122 if($bNotifications){ 137 if($bNotifications){
123 $oSubscriptionEvent = new SubscriptionEvent(); 138 $oSubscriptionEvent = new SubscriptionEvent();
124 - $oFolder = Folder::get($oDocument->getFolderID());  
125 $oSubscriptionEvent->DownloadDocument($oDocument, $oFolder); 139 $oSubscriptionEvent->DownloadDocument($oDocument, $oFolder);
126 } 140 }
127 141
128 - $this->oZip->addDocumentToZip($oDocument); 142 + $this->oZip->addDocumentToZip($oDocument, $oFolder);
129 } 143 }
130 } 144 }
131 145
132 - // Export the folder structure to ensure the export of empty directories  
133 - foreach($aFolderList as $k => $oFolderItem){  
134 - $this->oZip->addFolderToZip($oFolderItem);  
135 - }  
136 -  
137 $sExportCode = $this->oZip->createZipFile(TRUE); 146 $sExportCode = $this->oZip->createZipFile(TRUE);
138 147
139 $oTransaction = KTFolderTransaction::createFromArray(array( 148 $oTransaction = KTFolderTransaction::createFromArray(array(
@@ -168,7 +177,7 @@ class KTBulkExportAction extends KTFolderAction { @@ -168,7 +177,7 @@ class KTBulkExportAction extends KTFolderAction {
168 return $res; 177 return $res;
169 } 178 }
170 list($sPermissionString, $aPermissionParams, $sPermissionJoin) = $res; 179 list($sPermissionString, $aPermissionParams, $sPermissionJoin) = $res;
171 - $aPotentialWhere = array($sPermissionString, 'D.parent_folder_ids = ? OR D.parent_folder_ids LIKE ?', 'D.status_id = 1'); 180 + $aPotentialWhere = array($sPermissionString, 'D.folder_id = ? OR D.parent_folder_ids = ? OR D.parent_folder_ids LIKE ?', 'D.status_id = 1');
172 $aWhere = array(); 181 $aWhere = array();
173 foreach ($aPotentialWhere as $sWhere) { 182 foreach ($aPotentialWhere as $sWhere) {
174 if (empty($sWhere)) { 183 if (empty($sWhere)) {
@@ -202,6 +211,7 @@ class KTBulkExportAction extends KTFolderAction { @@ -202,6 +211,7 @@ class KTBulkExportAction extends KTFolderAction {
202 array_shift($aParentFolderIds); 211 array_shift($aParentFolderIds);
203 } 212 }
204 $sParentFolderIds = join(',', $aParentFolderIds); 213 $sParentFolderIds = join(',', $aParentFolderIds);
  214 + $aParams[] = $this->oFolder->getId();
205 $aParams[] = $sParentFolderIds; 215 $aParams[] = $sParentFolderIds;
206 $aParams[] = $sParentFolderIds . ",%"; 216 $aParams[] = $sParentFolderIds . ",%";
207 return array($sQuery, $aParams); 217 return array($sQuery, $aParams);
plugins/search2/LuceneStatisticsDashlet.php
@@ -6,32 +6,32 @@ @@ -6,32 +6,32 @@
6 * KnowledgeTree Open Source Edition 6 * KnowledgeTree Open Source Edition
7 * Document Management Made Simple 7 * Document Management Made Simple
8 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 8 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
9 - * 9 + *
10 * This program is free software; you can redistribute it and/or modify it under 10 * This program is free software; you can redistribute it and/or modify it under
11 * the terms of the GNU General Public License version 3 as published by the 11 * the terms of the GNU General Public License version 3 as published by the
12 * Free Software Foundation. 12 * Free Software Foundation.
13 - * 13 + *
14 * This program is distributed in the hope that it will be useful, but WITHOUT 14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 16 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * details. 17 * details.
18 - * 18 + *
19 * You should have received a copy of the GNU General Public License 19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>. 20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 - * 21 + *
22 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 22 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
23 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 23 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
24 - * 24 + *
25 * The interactive user interfaces in modified source and object code versions 25 * The interactive user interfaces in modified source and object code versions
26 * of this program must display Appropriate Legal Notices, as required under 26 * of this program must display Appropriate Legal Notices, as required under
27 * Section 5 of the GNU General Public License version 3. 27 * Section 5 of the GNU General Public License version 3.
28 - * 28 + *
29 * In accordance with Section 7(b) of the GNU General Public License version 3, 29 * In accordance with Section 7(b) of the GNU General Public License version 3,
30 * these Appropriate Legal Notices must retain the display of the "Powered by 30 * these Appropriate Legal Notices must retain the display of the "Powered by
31 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 31 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
32 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 32 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
33 - * must display the words "Powered by KnowledgeTree" and retain the original  
34 - * copyright notice. 33 + * must display the words "Powered by KnowledgeTree" and retain the original
  34 + * copyright notice.
35 * Contributor( s): ______________________________________ 35 * Contributor( s): ______________________________________
36 * 36 *
37 */ 37 */
@@ -100,7 +100,8 @@ class LuceneStatisticsDashlet extends KTBaseDashlet @@ -100,7 +100,8 @@ class LuceneStatisticsDashlet extends KTBaseDashlet
100 $index = Indexer::get(); 100 $index = Indexer::get();
101 $docsInIndex = $index->getDocumentsInIndex(); 101 $docsInIndex = $index->getDocumentsInIndex();
102 102
103 - $sql = "SELECT count(*) as docsInQueue FROM index_files"; 103 + // we are only interested in documents that are active
  104 + $sql = "SELECT count(*) as docsInQueue FROM index_files q INNER JOIN documents d on q.document_id=d.id WHERE d.status_id=1";
104 $docsInQueue = DBUtil::getOneResultKey($sql, 'docsInQueue'); 105 $docsInQueue = DBUtil::getOneResultKey($sql, 'docsInQueue');
105 106
106 $sql = "SELECT count(*) as docsInRepository FROM documents"; 107 $sql = "SELECT count(*) as docsInRepository FROM documents";
plugins/tagcloud/TagCloudDashlet.php
1 <?php 1 <?php
2 2
3 /* 3 /*
4 - * $Id:$ 4 + * $Id$
5 * 5 *
6 * KnowledgeTree Open Source Edition 6 * KnowledgeTree Open Source Edition
7 * Document Management Made Simple 7 * Document Management Made Simple
@@ -134,13 +134,12 @@ class TagCloudDashlet extends KTBaseDashlet { @@ -134,13 +134,12 @@ class TagCloudDashlet extends KTBaseDashlet {
134 return false; 134 return false;
135 } 135 }
136 list($where, $params, $joins) = KTSearchUtil::permissionToSQL($this->oUser, null); 136 list($where, $params, $joins) = KTSearchUtil::permissionToSQL($this->oUser, null);
137 -  
138 $sql = " 137 $sql = "
139 SELECT 138 SELECT
140 TW.tag, count(*) as freq 139 TW.tag, count(*) as freq
141 FROM 140 FROM
142 document_tags DT INNER JOIN tag_words TW ON DT.tag_id=TW.id 141 document_tags DT INNER JOIN tag_words TW ON DT.tag_id=TW.id
143 - WHERE DT.document_id in (SELECT D.id FROM documents D $joins WHERE $where) GROUP BY TW.tag"; 142 + WHERE DT.document_id in (SELECT D.id FROM documents D $joins WHERE $where AND D.status_id = '1') GROUP BY TW.tag";
144 143
145 $tags = DBUtil::getResultArray( 144 $tags = DBUtil::getResultArray(
146 array($sql,$params) 145 array($sql,$params)
plugins/tagcloud/TagCloudPlugin.php
1 <?php 1 <?php
2 2
3 /* 3 /*
4 - * $Id:$ 4 + * $Id$
5 * 5 *
6 * KnowledgeTree Open Source Edition 6 * KnowledgeTree Open Source Edition
7 * Document Management Made Simple 7 * Document Management Made Simple
@@ -70,10 +70,7 @@ require_once(KT_LIB_DIR . &#39;/templating/templating.inc.php&#39;); @@ -70,10 +70,7 @@ require_once(KT_LIB_DIR . &#39;/templating/templating.inc.php&#39;);
70 $this->registerCriterion('TagCloudCriterion', 'ktcore.criteria.tagcloud', KT_LIB_DIR . '/browse/Criteria.inc'); 70 $this->registerCriterion('TagCloudCriterion', 'ktcore.criteria.tagcloud', KT_LIB_DIR . '/browse/Criteria.inc');
71 $this->registerDashlet('TagCloudDashlet', 'ktcore.tagcloud.feed.dashlet', 'TagCloudDashlet.php'); 71 $this->registerDashlet('TagCloudDashlet', 'ktcore.tagcloud.feed.dashlet', 'TagCloudDashlet.php');
72 $this->registerPage('TagCloudRedirection', 'TagCloudRedirectPage', __FILE__); 72 $this->registerPage('TagCloudRedirection', 'TagCloudRedirectPage', __FILE__);
73 - $this->registerTrigger('add', 'postValidate', 'KTAddDocumentTrigger',  
74 - 'ktcore.triggers.tagcloud.add');  
75 - $this->registerTrigger('edit', 'postValidate', 'KTEditDocumentTrigger',  
76 - 'ktcore.triggers.tagcloud.edit'); 73 +
77 74
78 // Check if the tagcloud fielset entry exists, if not, create it 75 // Check if the tagcloud fielset entry exists, if not, create it
79 if(!TagCloudPlugin::tagFieldsetExists()){ 76 if(!TagCloudPlugin::tagFieldsetExists()){
@@ -192,213 +189,4 @@ require_once(KT_LIB_DIR . &#39;/templating/templating.inc.php&#39;); @@ -192,213 +189,4 @@ require_once(KT_LIB_DIR . &#39;/templating/templating.inc.php&#39;);
192 $oPluginRegistry =& KTPluginRegistry::getSingleton(); 189 $oPluginRegistry =& KTPluginRegistry::getSingleton();
193 $oPluginRegistry->registerPlugin('TagCloudPlugin', 'ktcore.tagcloud.plugin', __FILE__); 190 $oPluginRegistry->registerPlugin('TagCloudPlugin', 'ktcore.tagcloud.plugin', __FILE__);
194 191
195 -/**  
196 - * Trigger for document add (postValidate)  
197 - *  
198 - */  
199 -class KTAddDocumentTrigger {  
200 - var $aInfo = null;  
201 - /**  
202 - * function to set the info for the trigger  
203 - *  
204 - * @param array $aInfo  
205 - */  
206 - function setInfo(&$aInfo) {  
207 - $this->aInfo =& $aInfo;  
208 - }  
209 -  
210 - /**  
211 - * postValidate method for trigger  
212 - *  
213 - * @return unknown  
214 - */  
215 - function postValidate() {  
216 - global $default;  
217 - $oDocument =& $this->aInfo['document'];  
218 - $aMeta = & $this->aInfo['aOptions'];  
219 -  
220 - $iDocId = $oDocument->getID();  
221 -  
222 - // get tag id from document_fields table where name = Tag  
223 - $sQuery = 'SELECT df.id AS id FROM document_fields AS df ' .  
224 - 'WHERE df.name = \'Tag\'';  
225 -  
226 - $sTags = DBUtil::getOneResultKey(array($sQuery), 'id');  
227 - if (PEAR::isError($sTags)) {  
228 - // XXX: log error  
229 - return false;  
230 - }  
231 - $tagString = '';  
232 - // add tags  
233 - if ($sTags) {  
234 - if (count($aMeta['metadata']) > 0)  
235 - {  
236 - foreach($aMeta['metadata'] as $aMetaData)  
237 - {  
238 -  
239 - $oProxy = $aMetaData[0];  
240 - if($oProxy->iId == $sTags)  
241 - {  
242 - $tagString = $aMetaData[1];  
243 - }  
244 - }  
245 - }  
246 - if($tagString != ''){  
247 - $words_table = KTUtil::getTableName('tag_words');  
248 - $tagString = str_replace(' ', '', $tagString);  
249 - $tags = explode(',',$tagString);  
250 -  
251 - $aTagIds = array();  
252 -  
253 - foreach($tags as $sTag)  
254 - {  
255 - $sTag=strtolower(trim($sTag));  
256 -  
257 - $res = DBUtil::getOneResult(array("SELECT id FROM $words_table WHERE tag = ?", array($sTag)));  
258 -  
259 - if (PEAR::isError($res)) {  
260 - return $res;  
261 - }  
262 -  
263 - if (is_null($res))  
264 - {  
265 - $id = & DBUtil::autoInsert($words_table, array('tag'=>$sTag));  
266 - $aTagIds[$sTag] = $id;  
267 - }  
268 - else  
269 - {  
270 - $aTagIds[$sTag] = $res['id'];  
271 - }  
272 - }  
273 -  
274 - $doc_tags = KTUtil::getTableName('document_tags');  
275 -  
276 - foreach($aTagIds as $sTag=>$tagid)  
277 - {  
278 - DBUtil::autoInsert($doc_tags, array(  
279 -  
280 - 'document_id'=>$iDocId,  
281 - 'tag_id'=>$tagid),  
282 - array('noid'=>true));  
283 - }  
284 - }  
285 - }  
286 - }  
287 -}  
288 -  
289 -/**  
290 - * Trigger for document edit (postValidate)  
291 - *  
292 - */  
293 -class KTEditDocumentTrigger {  
294 - var $aInfo = null;  
295 - /**  
296 - * function to set the info for the trigger  
297 - *  
298 - * @param array $aInfo  
299 - */  
300 - function setInfo(&$aInfo) {  
301 - $this->aInfo =& $aInfo;  
302 - }  
303 -  
304 - /**  
305 - * postValidate method for trigger  
306 - *  
307 - * @return unknown  
308 - */  
309 - function postValidate() {  
310 - global $default;  
311 - $oDocument =& $this->aInfo['document'];  
312 - $aMeta = & $this->aInfo['aOptions'];  
313 - // get document id  
314 - $iDocId = $oDocument->getID();  
315 -  
316 - // get all tags that are linked to the document  
317 - $sQuery = 'SELECT tw.id FROM tag_words AS tw, document_tags AS dt, documents AS d ' .  
318 - 'WHERE dt.tag_id = tw.id ' .  
319 - 'AND dt.document_id = d.id ' .  
320 - 'AND d.id = ?';  
321 - $aParams = array($iDocId);  
322 - $aTagId = DBUtil::getResultArray(array($sQuery, $aParams));  
323 - if (PEAR::isError($aTagId)) {  
324 - // XXX: log error  
325 - return false;  
326 - }  
327 - // if there are any related tags proceed  
328 - if ($aTagId) {  
329 - // delete all entries from document_tags table for the document  
330 - $sQuery = 'DELETE FROM document_tags ' .  
331 - 'WHERE document_id = ?';  
332 - $aParams = array($iDocId);  
333 - $removed = DBUtil::runQuery(array($sQuery, $aParams));  
334 - if (PEAR::isError($removed)) {  
335 - // XXX: log error  
336 - return false;  
337 - }  
338 - }  
339 - // proceed to add the tags as per normaly  
340 - $sQuery = 'SELECT df.id AS id FROM document_fields AS df ' .  
341 - 'WHERE df.name = \'Tag\'';  
342 -  
343 - $sTags = DBUtil::getOneResultKey(array($sQuery), 'id');  
344 - if (PEAR::isError($sTags)) {  
345 - // XXX: log error  
346 - return false;  
347 - }  
348 - $tagString = '';  
349 - if ($sTags) {  
350 - // it is actually correct using $aMeta. It is different to the add trigger above...  
351 - if (count($aMeta) > 0)  
352 - {  
353 - foreach($aMeta as $aMetaData)  
354 - {  
355 - $oProxy = $aMetaData[0];  
356 - if($oProxy->iId == $sTags)  
357 - {  
358 - $tagString = $aMetaData[1];  
359 - break;  
360 - }  
361 - }  
362 - }  
363 - if($tagString != ''){  
364 - $words_table = KTUtil::getTableName('tag_words');  
365 - $tagString = str_replace(' ', ' ', $tagString);  
366 - $tags = explode(',',$tagString);  
367 -  
368 - $aTagIds = array();  
369 -  
370 - foreach($tags as $sTag)  
371 - {  
372 - $sTag=strtolower(trim($sTag));  
373 -  
374 - $res = DBUtil::getOneResult(array("SELECT id FROM $words_table WHERE tag = ?", array($sTag)));  
375 -  
376 - if (PEAR::isError($res)) {  
377 - return $res;  
378 - }  
379 -  
380 - if (is_null($res))  
381 - {  
382 - $id = & DBUtil::autoInsert($words_table, array('tag'=>$sTag));  
383 - $aTagIds[$sTag] = $id;  
384 - }  
385 - else  
386 - {  
387 - $aTagIds[$sTag] = $res['id'];  
388 - }  
389 - }  
390 -  
391 - $doc_tags = KTUtil::getTableName('document_tags');  
392 -  
393 - foreach($aTagIds as $sTag=>$tagid)  
394 - {  
395 - DBUtil::autoInsert($doc_tags, array(  
396 - 'document_id'=>$iDocId,  
397 - 'tag_id'=>$tagid),  
398 - array('noid'=>true));  
399 - }  
400 - }  
401 - }  
402 - }  
403 -}  
404 ?> 192 ?>
plugins/tagcloud/TagCloudTriggers.php 0 โ†’ 100644
  1 +<?php
  2 +/*
  3 + * $Id: $
  4 + *
  5 + * KnowledgeTree Open Source Edition
  6 + * Document Management Made Simple
  7 + * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
  8 + *
  9 + * This program is free software; you can redistribute it and/or modify it under
  10 + * the terms of the GNU General Public License version 3 as published by the
  11 + * Free Software Foundation.
  12 + *
  13 + * This program is distributed in the hope that it will be useful, but WITHOUT
  14 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  15 + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  16 + * details.
  17 + *
  18 + * You should have received a copy of the GNU General Public License
  19 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20 + *
  21 + * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
  22 + * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
  23 + *
  24 + * The interactive user interfaces in modified source and object code versions
  25 + * of this program must display Appropriate Legal Notices, as required under
  26 + * Section 5 of the GNU General Public License version 3.
  27 + *
  28 + * In accordance with Section 7(b) of the GNU General Public License version 3,
  29 + * these Appropriate Legal Notices must retain the display of the "Powered by
  30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
  31 + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
  32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
  34 + * Contributor( s): ______________________________________
  35 + *
  36 + */
  37 +/**
  38 + * Trigger for document add (postValidate)
  39 + *
  40 + */
  41 +class KTAddDocumentTrigger {
  42 + var $aInfo = null;
  43 + /**
  44 + * function to set the info for the trigger
  45 + *
  46 + * @param array $aInfo
  47 + */
  48 + function setInfo(&$aInfo) {
  49 + $this->aInfo =& $aInfo;
  50 + }
  51 +
  52 + /**
  53 + * postValidate method for trigger
  54 + *
  55 + * @return unknown
  56 + */
  57 + function postValidate() {
  58 + global $default;
  59 + $oDocument =& $this->aInfo['document'];
  60 + $aMeta = & $this->aInfo['aOptions'];
  61 +
  62 + $iDocId = $oDocument->getID();
  63 +
  64 + // get tag id from document_fields table where name = Tag
  65 + $sQuery = 'SELECT df.id AS id FROM document_fields AS df ' .
  66 + 'WHERE df.name = \'Tag\'';
  67 +
  68 + $sTags = DBUtil::getOneResultKey(array($sQuery), 'id');
  69 + if (PEAR::isError($sTags)) {
  70 + // XXX: log error
  71 + return false;
  72 + }
  73 + $tagString = '';
  74 + // add tags
  75 + if ($sTags) {
  76 + if (count($aMeta['metadata']) > 0)
  77 + {
  78 + foreach($aMeta['metadata'] as $aMetaData)
  79 + {
  80 +
  81 + $oProxy = $aMetaData[0];
  82 + if($oProxy->iId == $sTags)
  83 + {
  84 + $tagString = $aMetaData[1];
  85 + }
  86 + }
  87 + }
  88 + if($tagString != ''){
  89 + $words_table = KTUtil::getTableName('tag_words');
  90 + $tagString = str_replace(' ', '', $tagString);
  91 + $tags = explode(',',$tagString);
  92 +
  93 + $aTagIds = array();
  94 +
  95 + foreach($tags as $sTag)
  96 + {
  97 + $sTag=strtolower(trim($sTag));
  98 +
  99 + $res = DBUtil::getOneResult(array("SELECT id FROM $words_table WHERE tag = ?", array($sTag)));
  100 +
  101 + if (PEAR::isError($res)) {
  102 + return $res;
  103 + }
  104 +
  105 + if (is_null($res))
  106 + {
  107 + $id = & DBUtil::autoInsert($words_table, array('tag'=>$sTag));
  108 + $aTagIds[$sTag] = $id;
  109 + }
  110 + else
  111 + {
  112 + $aTagIds[$sTag] = $res['id'];
  113 + }
  114 + }
  115 +
  116 + $doc_tags = KTUtil::getTableName('document_tags');
  117 +
  118 + foreach($aTagIds as $sTag=>$tagid)
  119 + {
  120 + DBUtil::autoInsert($doc_tags, array(
  121 +
  122 + 'document_id'=>$iDocId,
  123 + 'tag_id'=>$tagid),
  124 + array('noid'=>true));
  125 + }
  126 + }
  127 + }
  128 + }
  129 +}
  130 +
  131 +
  132 +/**
  133 + * Trigger for document edit (postValidate)
  134 + *
  135 + */
  136 +class KTEditDocumentTrigger {
  137 + var $aInfo = null;
  138 + /**
  139 + * function to set the info for the trigger
  140 + *
  141 + * @param array $aInfo
  142 + */
  143 + function setInfo(&$aInfo) {
  144 + $this->aInfo =& $aInfo;
  145 + }
  146 +
  147 + /**
  148 + * postValidate method for trigger
  149 + *
  150 + * @return unknown
  151 + */
  152 + function postValidate() {
  153 + global $default;
  154 + $oDocument =& $this->aInfo['document'];
  155 + $aMeta = & $this->aInfo['aOptions'];
  156 + // get document id
  157 + $iDocId = $oDocument->getID();
  158 +
  159 + // get all tags that are linked to the document
  160 + $sQuery = 'SELECT tw.id FROM tag_words AS tw, document_tags AS dt, documents AS d ' .
  161 + 'WHERE dt.tag_id = tw.id ' .
  162 + 'AND dt.document_id = d.id ' .
  163 + 'AND d.id = ?';
  164 + $aParams = array($iDocId);
  165 + $aTagId = DBUtil::getResultArray(array($sQuery, $aParams));
  166 + if (PEAR::isError($aTagId)) {
  167 + // XXX: log error
  168 + return false;
  169 + }
  170 + // if there are any related tags proceed
  171 + if ($aTagId) {
  172 + // delete all entries from document_tags table for the document
  173 + $sQuery = 'DELETE FROM document_tags ' .
  174 + 'WHERE document_id = ?';
  175 + $aParams = array($iDocId);
  176 + $removed = DBUtil::runQuery(array($sQuery, $aParams));
  177 + if (PEAR::isError($removed)) {
  178 + // XXX: log error
  179 + return false;
  180 + }
  181 + }
  182 + // proceed to add the tags as per normaly
  183 + $sQuery = 'SELECT df.id AS id FROM document_fields AS df ' .
  184 + 'WHERE df.name = \'Tag\'';
  185 +
  186 + $sTags = DBUtil::getOneResultKey(array($sQuery), 'id');
  187 + if (PEAR::isError($sTags)) {
  188 + // XXX: log error
  189 + return false;
  190 + }
  191 + $tagString = '';
  192 + if ($sTags) {
  193 + // it is actually correct using $aMeta. It is different to the add trigger above...
  194 + if (count($aMeta) > 0)
  195 + {
  196 + foreach($aMeta as $aMetaData)
  197 + {
  198 + $oProxy = $aMetaData[0];
  199 + if($oProxy->iId == $sTags)
  200 + {
  201 + $tagString = $aMetaData[1];
  202 + break;
  203 + }
  204 + }
  205 + }
  206 + if($tagString != ''){
  207 + $words_table = KTUtil::getTableName('tag_words');
  208 + $tagString = str_replace(' ', ' ', $tagString);
  209 + $tags = explode(',',$tagString);
  210 +
  211 + $aTagIds = array();
  212 +
  213 + foreach($tags as $sTag)
  214 + {
  215 + $sTag=strtolower(trim($sTag));
  216 +
  217 + $res = DBUtil::getOneResult(array("SELECT id FROM $words_table WHERE tag = ?", array($sTag)));
  218 +
  219 + if (PEAR::isError($res)) {
  220 + return $res;
  221 + }
  222 +
  223 + if (is_null($res))
  224 + {
  225 + $id = & DBUtil::autoInsert($words_table, array('tag'=>$sTag));
  226 + $aTagIds[$sTag] = $id;
  227 + }
  228 + else
  229 + {
  230 + $aTagIds[$sTag] = $res['id'];
  231 + }
  232 + }
  233 +
  234 + $doc_tags = KTUtil::getTableName('document_tags');
  235 +
  236 + foreach($aTagIds as $sTag=>$tagid)
  237 + {
  238 + DBUtil::autoInsert($doc_tags, array(
  239 + 'document_id'=>$iDocId,
  240 + 'tag_id'=>$tagid),
  241 + array('noid'=>true));
  242 + }
  243 + }
  244 + }
  245 + }
  246 +}
  247 +?>
0 \ No newline at end of file 248 \ No newline at end of file
resources/css/error_01.gif 0 โ†’ 100644

2.09 KB

resources/css/errors.css 0 โ†’ 100644
  1 +div#error-container {
  2 + width: 500px;
  3 + color: #555;
  4 + font-size: 11px;
  5 + font-family: Verdana, Arial, sans-serif;
  6 +}
  7 +div#error-container div {
  8 + height: 140px;
  9 +}
  10 +div#error-container h1 {
  11 + font-weight: lighter;
  12 + font-size: 22px;
  13 + margin-left: 100px;
  14 +}
  15 +div#error-container p {
  16 + margin-left: 100px;
  17 +}
  18 +
  19 + div#acc-error {
  20 + background: transparent url(error_01.gif) no-repeat top left;
  21 + }
  22 + div#acc-suspend {
  23 + background: transparent url(error_02.gif) no-repeat top left;
  24 + }
  25 + div#acc-maint {
  26 + background: transparent url(error_03.gif) no-repeat top left;
  27 + }
  28 +
  29 +
  30 +
  31 +
  32 +
  33 +
  34 +
  35 +
  36 +
  37 +
  38 +
  39 +
  40 +
  41 +
  42 +
  43 +
0 \ No newline at end of file 44 \ No newline at end of file
search2/indexing/extractorCore.inc.php
@@ -349,8 +349,21 @@ abstract class ExternalDocumentExtractor extends DocumentExtractor @@ -349,8 +349,21 @@ abstract class ExternalDocumentExtractor extends DocumentExtractor
349 */ 349 */
350 protected function exec($cmd) 350 protected function exec($cmd)
351 { 351 {
352 - $aRet = KTUtil::pexec($cmd);  
353 - return $aRet['ret'] == 0; 352 + if (OS_WINDOWS)
  353 + {
  354 +
  355 +
  356 + $WshShell = new COM("WScript.Shell");
  357 + $res = $WshShell->Run($cmd, 0, true);
  358 +
  359 +
  360 + return $res == 0;
  361 + }
  362 + else
  363 + {
  364 + $aRet = KTUtil::pexec($cmd);
  365 + return $aRet['ret'] == 0;
  366 + }
354 } 367 }
355 368
356 /** 369 /**
@@ -456,7 +469,8 @@ abstract class ApplicationExtractor extends ExternalDocumentExtractor @@ -456,7 +469,8 @@ abstract class ApplicationExtractor extends ExternalDocumentExtractor
456 { 469 {
457 $sources = array('{source}','{target}'); 470 $sources = array('{source}','{target}');
458 $target = array($this->sourcefile, $this->targetfile); 471 $target = array($this->sourcefile, $this->targetfile);
459 - $cmdline = $this->application . ' ' . str_replace($sources,$target, $this->params); 472 + $escape = OS_WINDOWS?'"':'\'';
  473 + $cmdline = $escape . $this->application . $escape . ' ' . str_replace($sources,$target, $this->params);
460 474
461 return $cmdline; 475 return $cmdline;
462 } 476 }
search2/indexing/extractors/OOPresentationExtractor.inc.php
@@ -56,6 +56,7 @@ class OOPresentationExtractor extends CompositeExtractor @@ -56,6 +56,7 @@ class OOPresentationExtractor extends CompositeExtractor
56 public function getSupportedMimeTypes() 56 public function getSupportedMimeTypes()
57 { 57 {
58 return array( 58 return array(
  59 + 'application/vnd.ms-powerpoint',
59 'application/vnd.oasis.opendocument.presentation', 60 'application/vnd.oasis.opendocument.presentation',
60 'application/vnd.oasis.opendocument.presentation-template', 61 'application/vnd.oasis.opendocument.presentation-template',
61 ); 62 );
search2/indexing/extractors/OOTextExtractor.inc.php
@@ -88,14 +88,16 @@ class OOTextExtractor extends ExternalDocumentExtractor @@ -88,14 +88,16 @@ class OOTextExtractor extends ExternalDocumentExtractor
88 88
89 protected function getCommandLine() 89 protected function getCommandLine()
90 { 90 {
91 - $sourcefile = escapeshellcmd($this->sourcefile); 91 + //$sourcefile = escapeshellcmd($this->sourcefile);
  92 + $sourcefile = ($this->sourcefile);
92 unlink($this->targetfile); 93 unlink($this->targetfile);
93 $this->targetfile .= '.' . $this->targetExtension; 94 $this->targetfile .= '.' . $this->targetExtension;
94 - $targetfile = escapeshellcmd($this->targetfile); 95 + //$targetfile = escapeshellcmd($this->targetfile);
  96 + $targetfile = ($this->targetfile);
95 97
96 $escape = OS_WINDOWS?'"':'\''; 98 $escape = OS_WINDOWS?'"':'\'';
97 99
98 - $cmdline = "{$this->python} {$escape}{$this->documentConverter}{$escape} {$escape}{$sourcefile}{$escape} {$escape}{$targetfile}{$escape} {$this->ooHost} {$this->ooPort}"; 100 + $cmdline = "{$escape}{$this->python}{$escape} {$escape}{$this->documentConverter}{$escape} {$escape}{$sourcefile}{$escape} {$escape}{$targetfile}{$escape} {$this->ooHost} {$this->ooPort}";
99 return $cmdline; 101 return $cmdline;
100 } 102 }
101 103
search2/indexing/indexerCore.inc.php
@@ -67,6 +67,10 @@ class QueryResultItem @@ -67,6 +67,10 @@ class QueryResultItem
67 protected $deleted; 67 protected $deleted;
68 protected $status; 68 protected $status;
69 protected $folderId; 69 protected $folderId;
  70 + protected $storagePath;
  71 + protected $documentType;
  72 + protected $mimeIconPath;
  73 + protected $mimeDisplay;
70 74
71 public function __construct($document_id, $rank=null, $title=null, $text=null) 75 public function __construct($document_id, $rank=null, $title=null, $text=null)
72 { 76 {
@@ -100,12 +104,14 @@ class QueryResultItem @@ -100,12 +104,14 @@ class QueryResultItem
100 d.folder_id, f.full_path, f.name, dcv.size as filesize, dcv.major_version, 104 d.folder_id, f.full_path, f.name, dcv.size as filesize, dcv.major_version,
101 dcv.minor_version, dcv.filename, cou.name as checkoutuser, w.human_name as workflow, ws.human_name as workflowstate, 105 dcv.minor_version, dcv.filename, cou.name as checkoutuser, w.human_name as workflow, ws.human_name as workflowstate,
102 mt.mimetypes as mimetype, md.mime_doc as mimedoc, d.checkedout, mbu.name as modifiedbyuser, d.modified, 106 mt.mimetypes as mimetype, md.mime_doc as mimedoc, d.checkedout, mbu.name as modifiedbyuser, d.modified,
103 - cbu.name as createdbyuser, ou.name as owneruser, d.immutable, d.status_id, d.created 107 + cbu.name as createdbyuser, ou.name as owneruser, d.immutable, d.status_id, d.created,dcv.storage_path, dtl.name as document_type,
  108 + mt.icon_path as mime_icon_path, mt.friendly_name as mime_display
104 FROM 109 FROM
105 documents d 110 documents d
106 INNER JOIN document_metadata_version dmv ON d.metadata_version_id = dmv.id 111 INNER JOIN document_metadata_version dmv ON d.metadata_version_id = dmv.id
107 INNER JOIN document_content_version dcv ON dmv.content_version_id = dcv.id 112 INNER JOIN document_content_version dcv ON dmv.content_version_id = dcv.id
108 INNER JOIN mime_types mt ON dcv.mime_id=mt.id 113 INNER JOIN mime_types mt ON dcv.mime_id=mt.id
  114 + LEFT JOIN document_types_lookup dtl ON dtl.id=dmv.document_type_id
109 LEFT JOIN folders f ON f.id=d.folder_id 115 LEFT JOIN folders f ON f.id=d.folder_id
110 LEFT JOIN users cou ON d.checked_out_user_id=cou.id 116 LEFT JOIN users cou ON d.checked_out_user_id=cou.id
111 LEFT JOIN workflows w ON dmv.workflow_id=w.id 117 LEFT JOIN workflows w ON dmv.workflow_id=w.id
@@ -134,6 +140,31 @@ class QueryResultItem @@ -134,6 +140,31 @@ class QueryResultItem
134 throw new Exception(_kt($msg)); 140 throw new Exception(_kt($msg));
135 } 141 }
136 142
  143 + // document_id, relevance, text, title
  144 +
  145 + $this->documentType = $result['document_type'];
  146 + $this->filename=$result['filename'];
  147 + $this->filesize = KTUtil::filesizeToString($result['filesize']);
  148 + $this->folderId = $result['folder_id'];
  149 +
  150 + $this->createdBy = $result['createdbyuser'];
  151 + $this->dateCreated = $result['created'];
  152 +
  153 + $this->modifiedBy = $result['modifiedbyuser'];
  154 + $this->dateModified = $result['modified'];
  155 +
  156 + $this->checkedOutUser = $result['checkoutuser'];
  157 + $this->dateCheckedout = $result['checkedout'];
  158 +
  159 + $this->owner = $result['owneruser'];
  160 +
  161 + $this->version = $result['major_version'] . '.' . $result['minor_version'];
  162 +
  163 + $this->immutable = ($result['immutable'] + 0)?_kt('Immutable'):'';
  164 +
  165 + $this->workflow = $result['workflow'];
  166 + $this->workflowState = $result['workflowstate'];
  167 +
137 if (is_null($result['name'])) 168 if (is_null($result['name']))
138 { 169 {
139 $this->fullpath = '(orphaned)'; 170 $this->fullpath = '(orphaned)';
@@ -144,28 +175,12 @@ class QueryResultItem @@ -144,28 +175,12 @@ class QueryResultItem
144 if (substr($this->fullpath,0,1) == '/') $this->fullpath = substr($this->fullpath,1); 175 if (substr($this->fullpath,0,1) == '/') $this->fullpath = substr($this->fullpath,1);
145 } 176 }
146 177
147 - $this->filesize = KTUtil::filesizeToString($result['filesize']);  
148 -  
149 - $this->version = $result['major_version'] . '.' . $result['minor_version'];  
150 - $this->filename=$result['filename'];  
151 - $this->checkedOutUser = $result['checkoutuser'];  
152 - $this->workflow = $result['workflow'];  
153 - $this->workflowState = $result['workflowstate'];  
154 -  
155 -  
156 $this->mimeType = $result['mimetype']; 178 $this->mimeType = $result['mimetype'];
157 - $this->dateCheckedout = $result['checkedout'];  
158 -  
159 - $this->modifiedBy = $result['modifiedbyuser'];  
160 - $this->dateModified = $result['modified'];  
161 - $this->createdBy = $result['createdbyuser'];  
162 - $this->dateCreated = $result['created']; 179 + $this->mimeIconPath = $result['mime_icon_path'];
  180 + $this->mimeDisplay = $result['mime_display'];
163 181
164 - $this->owner = $result['owneruser'];  
165 - $this->immutable = ($result['immutable'] + 0)?_kt('Immutable'):''; 182 + $this->storagePath = $result['storage_path'];
166 $this->status = Document::getStatusString($result['status_id']); 183 $this->status = Document::getStatusString($result['status_id']);
167 - $this->folderId = $result['folder_id'];  
168 -  
169 } 184 }
170 185
171 protected function __get($property) 186 protected function __get($property)
@@ -193,12 +208,15 @@ class QueryResultItem @@ -193,12 +208,15 @@ class QueryResultItem
193 case 'IsAvailable': 208 case 'IsAvailable':
194 return $this->Document->isLive(); 209 return $this->Document->isLive();
195 case 'CheckedOutUser': 210 case 'CheckedOutUser':
  211 + case 'CheckedOutBy':
196 return (string) $this->checkedOutUser; 212 return (string) $this->checkedOutUser;
197 case 'WorkflowOnly': 213 case 'WorkflowOnly':
  214 + case 'Workflow':
198 return (string)$this->workflow; 215 return (string)$this->workflow;
199 case 'WorkflowStateOnly': 216 case 'WorkflowStateOnly':
  217 + case 'WorkflowState':
200 return (string)$this->workflowState; 218 return (string)$this->workflowState;
201 - case 'Workflow': 219 + case 'WorkflowAndState':
202 if (is_null($this->workflow)) 220 if (is_null($this->workflow))
203 { 221 {
204 return ''; 222 return '';
@@ -206,6 +224,10 @@ class QueryResultItem @@ -206,6 +224,10 @@ class QueryResultItem
206 return "$this->workflow - $this->workflowState"; 224 return "$this->workflow - $this->workflowState";
207 case 'MimeType': 225 case 'MimeType':
208 return (string) $this->mimeType; 226 return (string) $this->mimeType;
  227 + case 'MimeIconPath':
  228 + return (string) $this->mimeIconPath;
  229 + case 'MimeDisplay':
  230 + return (string) $this->mimeDisplay;
209 case 'DateCheckedOut': 231 case 'DateCheckedOut':
210 return (string) $this->dateCheckedout; 232 return (string) $this->dateCheckedout;
211 case 'ModifiedBy': 233 case 'ModifiedBy':
@@ -217,11 +239,19 @@ class QueryResultItem @@ -217,11 +239,19 @@ class QueryResultItem
217 case 'DateCreated': 239 case 'DateCreated':
218 return (string) $this->dateCreated; 240 return (string) $this->dateCreated;
219 case 'Owner': 241 case 'Owner':
  242 + case 'OwnedBy':
220 return (string) $this->owner; 243 return (string) $this->owner;
  244 + case 'IsImmutable':
221 case 'Immutable': 245 case 'Immutable':
222 return (bool) $this->immutable; 246 return (bool) $this->immutable;
223 case 'Status': 247 case 'Status':
224 return $this->status; 248 return $this->status;
  249 + case 'StoragePath':
  250 + return $this->storagePath;
  251 + case 'DocumentType':
  252 + return $this->documentType;
  253 + case 'Permissions':
  254 + return 'not available';
225 case 'CanBeReadByUser': 255 case 'CanBeReadByUser':
226 if (!$this->live) 256 if (!$this->live)
227 return false; 257 return false;
@@ -231,7 +261,7 @@ class QueryResultItem @@ -231,7 +261,7 @@ class QueryResultItem
231 return true; 261 return true;
232 return false; 262 return false;
233 default: 263 default:
234 - throw new Exception("Unknown property '$property' to get on MatchResult"); 264 + throw new Exception("Unknown property '$property' to get on QueryResultItem");
235 } 265 }
236 return ''; // Should not be reached 266 return ''; // Should not be reached
237 } 267 }
@@ -766,6 +796,7 @@ abstract class Indexer @@ -766,6 +796,7 @@ abstract class Indexer
766 if ($this->debug) $default->log->debug('indexDocuments: stopping - db error'); 796 if ($this->debug) $default->log->debug('indexDocuments: stopping - db error');
767 return; 797 return;
768 } 798 }
  799 + KTUtil::setSystemSetting('luceneIndexingDate', time());
769 800
770 // bail if no work to do 801 // bail if no work to do
771 if (count($result) == 0) 802 if (count($result) == 0)
search2/search/search.inc.php
@@ -554,27 +554,48 @@ function processSearchExpression($query) @@ -554,27 +554,48 @@ function processSearchExpression($query)
554 { 554 {
555 $item = array( 555 $item = array(
556 'document_id' => (int) $hit->DocumentID, 556 'document_id' => (int) $hit->DocumentID,
557 - 'title' => (string) $hit->Title, 557 +
  558 + 'custom_document_no' => 'n/a',
  559 + 'oem_document_no' => 'n/a',
  560 +
558 'relevance' => (float) $hit->Rank, 561 'relevance' => (float) $hit->Rank,
559 'text' => (string) $noText?'':$hit->Text, 562 'text' => (string) $noText?'':$hit->Text,
560 - 'filesize' => (int) $hit->Filesize, 563 +
  564 + 'title' => (string) $hit->Title,
  565 + 'document_type'=> $hit->DocumentType,
561 'fullpath' => (string) $hit->FullPath, 566 'fullpath' => (string) $hit->FullPath,
562 - 'version' => (string) $hit->Version,  
563 'filename' => (string) $hit->Filename, 567 'filename' => (string) $hit->Filename,
564 - 'checked_out_by' => (string) $hit->CheckedOutUser, 568 + 'filesize' => (int) $hit->Filesize,
  569 + 'folder_id' => (int) $hit->FolderId,
  570 +
  571 + 'created_by' => (string) $hit->CreatedBy,
  572 + 'created_date' => (string) $hit->DateCreated,
  573 +
  574 + 'modified_by' => (string) $hit->ModifiedBy,
  575 + 'modified_date' => (string) $hit->DateModified,
  576 +
  577 + 'checked_out_by' => (string) $hit->CheckedOutUser,
565 'checked_out_date' => (string) $hit->DateCheckedOut, 578 'checked_out_date' => (string) $hit->DateCheckedOut,
566 - 'is_available' => (bool) $hit->IsAvailable, 579 +
  580 + 'owned_by' => (string) $hit->Owner,
  581 +
  582 + 'version' => (float) $hit->Version,
  583 + 'is_immutable'=> (bool) $hit->Immutable,
  584 + 'permissions'=> $hit->Permissions,
  585 +
567 'workflow' => (string) $hit->WorkflowOnly, 586 'workflow' => (string) $hit->WorkflowOnly,
568 'workflow_state' => (string) $hit->WorkflowStateOnly, 587 'workflow_state' => (string) $hit->WorkflowStateOnly,
569 - 'folder_id' => (int) $hit->FolderId, 588 +
570 'mime_type' => (string) $hit->MimeType, 589 'mime_type' => (string) $hit->MimeType,
571 - 'modified_by' => (string) $hit->ModifiedBy,  
572 - 'modified_date' => (string) $hit->DateModified,  
573 - 'created_by' => (string) $hit->CreatedBy,  
574 - 'created_date' => (string) $hit->DateCreated,  
575 - 'owner' => (string) $hit->Owner,  
576 - 'is_immutable'=> (bool) $hit->Immutable,  
577 - 'status' => (string) $hit->Status 590 + 'mime_icon_path' => (string) $hit->MimeIconPath,
  591 + 'mime_display' => (string) $hit->MimeDisplay,
  592 +
  593 + 'storage_path' => (string) $hit->StoragePath,
  594 +
  595 + 'status' => (string) $hit->Status,
  596 +
  597 + 'is_available' => (bool) $hit->IsAvailable,
  598 +
578 ); 599 );
579 600
580 $results[] = $item; 601 $results[] = $item;
sql/mysql/install/data.sql
No preview for this file type
sql/mysql/install/structure.sql
@@ -289,7 +289,7 @@ CREATE TABLE `document_fields` ( @@ -289,7 +289,7 @@ CREATE TABLE `document_fields` (
289 CREATE TABLE `document_fields_link` ( 289 CREATE TABLE `document_fields_link` (
290 `id` int(11) NOT NULL default '0', 290 `id` int(11) NOT NULL default '0',
291 `document_field_id` int(11) NOT NULL default '0', 291 `document_field_id` int(11) NOT NULL default '0',
292 - `value` char(255) NOT NULL default '', 292 + `value` mediumtext NOT NULL default '',
293 `metadata_version_id` int(11) default NULL, 293 `metadata_version_id` int(11) default NULL,
294 PRIMARY KEY (`id`), 294 PRIMARY KEY (`id`),
295 KEY `document_field_id` (`document_field_id`), 295 KEY `document_field_id` (`document_field_id`),
sql/mysql/upgrade/3.5.2/csv_mime.sql 0 โ†’ 100644
  1 +update mime_types set icon_path='excel' where filetypes = 'csv';
0 \ No newline at end of file 2 \ No newline at end of file
sql/mysql/upgrade/3.5.2/document_transactions.sql
1 -alter table document_transactions change version version varchar(50);  
2 -alter table document_transactions change ip ip varchar(15);  
3 -alter table document_transactions change filename filename varchar(255);  
4 -alter table document_transactions change comment comment varchar(1024); 1 +alter table document_transactions change version version varchar(50);
  2 +alter table document_transactions change ip ip varchar(15);
  3 +alter table document_transactions change filename filename mediumtext;
  4 +alter table document_transactions change comment comment mediumtext;
5 alter table document_transactions change transaction_namespace transaction_namespace varchar(255); 5 alter table document_transactions change transaction_namespace transaction_namespace varchar(255);
6 \ No newline at end of file 6 \ No newline at end of file
sql/mysql/upgrade/3.5.2/metadata_length.sql 0 โ†’ 100644
  1 +alter table document_fields_link change value value mediumtext not null;
0 \ No newline at end of file 2 \ No newline at end of file
sql/mysql/upgrade/3.5.2/scheduler_tasks.sql
@@ -2,4 +2,10 @@ ALTER TABLE `scheduler_tasks` ADD `status` ENUM( &#39;enabled&#39;, &#39;disabled&#39;, &#39;sy @@ -2,4 +2,10 @@ ALTER TABLE `scheduler_tasks` ADD `status` ENUM( &#39;enabled&#39;, &#39;disabled&#39;, &#39;sy
2 2
3 UPDATE `scheduler_tasks` SET `status` = 'system' WHERE `task` = 'Indexing' OR `task` = 'Index Migration' OR `task` = 'Index Optimisation'; 3 UPDATE `scheduler_tasks` SET `status` = 'system' WHERE `task` = 'Indexing' OR `task` = 'Index Migration' OR `task` = 'Index Optimisation';
4 4
5 -INSERT INTO `scheduler_tasks` VALUES (4,'Periodic Document Expunge','bin/expungeall.php','',0,'weekly','2007-10-01',NULL,0,'disabled');  
6 \ No newline at end of file 5 \ No newline at end of file
  6 +select @id:=ifnull(max(id),0)+1 from scheduler_tasks;
  7 +INSERT INTO `scheduler_tasks` VALUES (@id,'Periodic Document Expunge','bin/expungeall.php','',0,'weekly','2007-10-01',NULL,0,'disabled');
  8 +
  9 +select @id:=max(id)+1 from scheduler_tasks;
  10 +INSERT INTO `scheduler_tasks` VALUES (@id,'Database Maintenance','bin/dbmaint.php','optimize',0,'monthly','2007-10-01',NULL,0,'disabled');
  11 +
  12 +UPDATE zseq_scheduler_tasks set id=@id;
7 \ No newline at end of file 13 \ No newline at end of file
templates/ktcore/login.smarty
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 11
12 <link rel="stylesheet" href="{$rootUrl}/resources/css/kt-ie-icons.css" type="text/css" /> 12 <link rel="stylesheet" href="{$rootUrl}/resources/css/kt-ie-icons.css" type="text/css" />
13 13
14 - <script type="text/javascript" src="{$rootUrl}/thirdpartyjs/curvycorners/rounded_corners_lite.inc.js"> </script> 14 + <script type="text/javascript" src="{$rootUrl}/thirdpartyjs/curvycorners/rounded_corners.inc.js"> </script>
15 <script type="text/javascript" src="{$rootUrl}/resources/js/login_loader.js"> </script> 15 <script type="text/javascript" src="{$rootUrl}/resources/js/login_loader.js"> </script>
16 </head> 16 </head>
17 <body> 17 <body>
templates/ktcore/search2/lucene_statistics.smarty
@@ -3,44 +3,26 @@ @@ -3,44 +3,26 @@
3 {literal} 3 {literal}
4 <script type="text/javascript"> 4 <script type="text/javascript">
5 5
6 -function tog1(){  
7 -  
8 - var toggled = document.getElementById('expand');  
9 - var pImage = document.getElementById('id');  
10 - var mImage = document.getElementById('ie');  
11 - if(pImage.style.display == 'block'){  
12 - pImage.style.display = 'none';  
13 - mImage.style.display = 'block';  
14 - }else{  
15 - pImage.style.display = 'block';  
16 - mImage.style.display = 'none';  
17 - }  
18 - if(toggled.style.display == 'none'){  
19 - toggled.style.display = 'block';  
20 - }else{  
21 - toggled.style.display = 'none';  
22 - }  
23 - 6 +function mouseOver()
  7 +{
  8 +var toggle = document.getElementById('exp');
  9 +toggle.style.display = 'block';
  10 +}
  11 +function mouseOut()
  12 +{
  13 +var toggle = document.getElementById('exp');
  14 +toggle.style.display = 'none';
24 } 15 }
25 16
26 -function tog2(){  
27 -  
28 - var toggle = document.getElementById('exp');  
29 - var plusImage = document.getElementById('imgd');  
30 - var minusImage = document.getElementById('imge');  
31 - if(plusImage.style.display == 'block'){  
32 - plusImage.style.display = 'none';  
33 - minusImage.style.display = 'block';  
34 - }else{  
35 - plusImage.style.display = 'block';  
36 - minusImage.style.display = 'none';  
37 - }  
38 - if(toggle.style.display == 'none'){  
39 - toggle.style.display = 'block';  
40 - }else{  
41 - toggle.style.display = 'none';  
42 - }  
43 - 17 +function mouseOver1()
  18 +{
  19 +var toggle = document.getElementById('show');
  20 +toggle.style.display = 'block';
  21 +}
  22 +function mouseOut1()
  23 +{
  24 +var toggle = document.getElementById('show');
  25 +toggle.style.display = 'none';
44 } 26 }
45 27
46 </script> 28 </script>
@@ -49,44 +31,35 @@ function tog2(){ @@ -49,44 +31,35 @@ function tog2(){
49 31
50 <body> 32 <body>
51 <table> 33 <table>
52 -<tr><td width="495px">{i18n}Last Optimization Date:{/i18n}</td><td>{$stats.optimisationDate}</td></tr>  
53 -<tr></tr>  
54 -<tr><td>{i18n}Period Since Last Optimization:{/i18n}</td><td>{$stats.optimisationPeriod}</td></tr>  
55 -<tr><td>{i18n}Last Indexing Date:{/i18n}</td><td>{$stats.indexingDate}</td></tr>  
56 -<tr><td>{i18n}Period Since Last Indexing:{/i18n}</td><td>{$stats.indexingPeriod}</td></tr>  
57 -<tr><td>{i18n}Total # Documents in Repository:{/i18n}</td><td>{$stats.docsInRepository}</td></tr>  
58 -<tr><td>{i18n}Documents Indexed:{/i18n}</td><td>{$stats.docsInIndex}</td></tr>  
59 -<tr><td>{i18n}Documents in Indexing Queue:{/i18n}</td><td>{$stats.docsInQueue}</td></tr>  
60 -<tr><td><span onclick="tog1();">  
61 -<p id="id">  
62 -<img src="{$rootUrl}/resources/graphics/bullet_toggle_plus.png" style="cursor: pointer;"/>  
63 -Index Coverage:  
64 -</p>  
65 -<p id="ie">  
66 -<img src="{$rootUrl}/resources/graphics/bullet_toggle_minus.png" style="cursor: pointer;"/>  
67 -Index Coverage:  
68 -</p> 34 +<tr><td></td><td>{i18n}Last Optimization Date:{/i18n}</td><td>{$stats.optimisationDate}</td></tr>
  35 +<tr><td></td><td>{i18n}Period Since Last Optimization:{/i18n}</td><td>{$stats.optimisationPeriod}</td></tr>
  36 +<tr><td></td><td>{i18n}Last Indexing Date:{/i18n}</td><td>{$stats.indexingDate}</td></tr>
  37 +<tr><td></td><td>{i18n}Period Since Last Indexing:{/i18n}</td><td>{$stats.indexingPeriod}</td></tr>
  38 +<tr><td></td><td>{i18n}Total # Documents in Repository:{/i18n}</td><td>{$stats.docsInRepository}</td></tr>
  39 +<tr><td></td><td>{i18n}Documents Indexed:{/i18n}</td><td>{$stats.docsInIndex}</td></tr>
  40 +<tr><td></td><td>{i18n}Documents in Indexing Queue:{/i18n}</td><td>{$stats.docsInQueue}</td></tr>
  41 +<tr><td><img src="{$rootUrl}/resources/graphics/info.gif" style="cursor: pointer;" onmouseOver="mouseOver1()" onmouseOut="mouseOut1()"/></td>
  42 +<td><span>
  43 +{i18n}Index Coverage:{/i18n}
69 </span> 44 </span>
70 -<div id="expand" style="display: none;">  
71 -<i>{i18n}Indexing coverage percentage may vary from total - not all documents contain text.{/i18n}</i> 45 +
  46 +<div id="show" style="display: none; position: absolute; width: 340px; height: 40px; background-color: #CCCCCC;"><i>
  47 +{i18n}Indexing coverage percentage may vary from total - not all documents contain text.{/i18n}</i>
72 <br/> 48 <br/>
73 -</div></td><td>{$stats.indexingCoverage}</td></tr> 49 +</div>
  50 +<td>{$stats.indexingCoverage}</td></tr>
74 51
75 52
76 -<tr><td><span onclick="tog2();">  
77 -<p id="imgd">  
78 -<img src="{$rootUrl}/resources/graphics/bullet_toggle_plus.png" style="cursor: pointer;"/>  
79 -Queue Coverage:  
80 -</p>  
81 -<p id="imge">  
82 -<img src="{$rootUrl}/resources/graphics/bullet_toggle_minus.png" style="cursor: pointer;"/>  
83 -Queue Coverage:  
84 -</p> 53 +<tr><td><img src="{$rootUrl}/resources/graphics/info.gif" style="cursor: pointer;" onmouseOver="mouseOver()" onmouseOut="mouseOut()"/></td>
  54 +<td><span>
  55 +{i18n}Queue Coverage :{/i18n}
85 </span> 56 </span>
86 -<div id="exp" style="display: none;">  
87 -<i>{i18n}Queue coverage indicates percentage of documents currently queued for indexing in relation to total repository size{/i18n}</i> 57 +
  58 +<div id="exp" style="display: none; position: absolute; width: 410px; height: 40px; background-color: #CCCCCC;"><i>
  59 +{i18n}Queue coverage indicates percentage of documents currently queued for indexing in relation to total repository size.{/i18n}</i>
88 <br/> 60 <br/>
89 </div> 61 </div>
  62 +
90 </td><td>{$stats.queueCoverage}</td></tr> 63 </td><td>{$stats.queueCoverage}</td></tr>
91 64
92 </table> 65 </table>
@@ -101,17 +74,6 @@ Queue Coverage: @@ -101,17 +74,6 @@ Queue Coverage:
101 <tr><td colspan=2 align=right><a href="/search2.php?action=refreshLuceneStats" align=right>{i18n}Refresh{/i18n}</a></tr> 74 <tr><td colspan=2 align=right><a href="/search2.php?action=refreshLuceneStats" align=right>{i18n}Refresh{/i18n}</a></tr>
102 </table> 75 </table>
103 76
104 -<script type="text/javascript">  
105 -var plusImage = document.getElementById('imgd');  
106 -var minusImage = document.getElementById('imge');  
107 -plusImage.style.display = 'block';  
108 -minusImage.style.display = 'none';  
109 -  
110 -var pImage = document.getElementById('id');  
111 -var mImage = document.getElementById('ie');  
112 -pImage.style.display = 'block';  
113 -mImage.style.display = 'none';  
114 -</script>  
115 77
116 </body> 78 </body>
117 </html> 79 </html>
118 \ No newline at end of file 80 \ No newline at end of file
thirdparty/Smarty/plugins/modifier.sanitize_input.php
@@ -6,6 +6,7 @@ function smarty_modifier_sanitize_input($string, $esc_type = &#39;html&#39;, $charset=&#39;U @@ -6,6 +6,7 @@ function smarty_modifier_sanitize_input($string, $esc_type = &#39;html&#39;, $charset=&#39;U
6 $string = mb_ereg_replace('"',"&quot;", $string); 6 $string = mb_ereg_replace('"',"&quot;", $string);
7 $string = mb_ereg_replace('<',"&lt;", $string); 7 $string = mb_ereg_replace('<',"&lt;", $string);
8 $string = mb_ereg_replace('>',"&gt;", $string); 8 $string = mb_ereg_replace('>',"&gt;", $string);
  9 + $string = mb_ereg_replace('&lt;br/&gt;',"<br>", $string);
9 return $string; 10 return $string;
10 } 11 }
11 12
view.php
@@ -5,64 +5,64 @@ @@ -5,64 +5,64 @@
5 * KnowledgeTree Open Source Edition 5 * KnowledgeTree Open Source Edition
6 * Document Management Made Simple 6 * Document Management Made Simple
7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited 7 * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
8 - * 8 + *
9 * This program is free software; you can redistribute it and/or modify it under 9 * This program is free software; you can redistribute it and/or modify it under
10 * the terms of the GNU General Public License version 3 as published by the 10 * the terms of the GNU General Public License version 3 as published by the
11 * Free Software Foundation. 11 * Free Software Foundation.
12 - * 12 + *
13 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * details. 16 * details.
17 - * 17 + *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 - * 20 + *
21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, 21 * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. 22 * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
23 - * 23 + *
24 * The interactive user interfaces in modified source and object code versions 24 * The interactive user interfaces in modified source and object code versions
25 * of this program must display Appropriate Legal Notices, as required under 25 * of this program must display Appropriate Legal Notices, as required under
26 * Section 5 of the GNU General Public License version 3. 26 * Section 5 of the GNU General Public License version 3.
27 - * 27 + *
28 * In accordance with Section 7(b) of the GNU General Public License version 3, 28 * In accordance with Section 7(b) of the GNU General Public License version 3,
29 * these Appropriate Legal Notices must retain the display of the "Powered by 29 * these Appropriate Legal Notices must retain the display of the "Powered by
30 - * KnowledgeTree" logo and retain the original copyright notice. If the display of the 30 + * KnowledgeTree" logo and retain the original copyright notice. If the display of the
31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices 31 * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
32 - * must display the words "Powered by KnowledgeTree" and retain the original  
33 - * copyright notice. 32 + * must display the words "Powered by KnowledgeTree" and retain the original
  33 + * copyright notice.
34 * Contributor( s): ______________________________________ 34 * Contributor( s): ______________________________________
35 */ 35 */
36 36
37 // boilerplate. 37 // boilerplate.
38 -require_once("config/dmsDefaults.php");  
39 -require_once(KT_LIB_DIR . "/templating/templating.inc.php");  
40 -require_once(KT_LIB_DIR . "/templating/kt3template.inc.php");  
41 -require_once(KT_LIB_DIR . "/dispatcher.inc.php");  
42 -require_once(KT_LIB_DIR . "/util/ktutil.inc");  
43 -require_once(KT_LIB_DIR . "/database/dbutil.inc");  
44 -require_once(KT_LIB_DIR . "/util/sanitize.inc"); 38 +require_once('config/dmsDefaults.php');
  39 +require_once(KT_LIB_DIR . '/templating/templating.inc.php');
  40 +require_once(KT_LIB_DIR . '/templating/kt3template.inc.php');
  41 +require_once(KT_LIB_DIR . '/dispatcher.inc.php');
  42 +require_once(KT_LIB_DIR . '/util/ktutil.inc');
  43 +require_once(KT_LIB_DIR . '/database/dbutil.inc');
  44 +require_once(KT_LIB_DIR . '/util/sanitize.inc');
45 45
46 // document related includes 46 // document related includes
47 -require_once(KT_LIB_DIR . "/documentmanagement/Document.inc");  
48 -require_once(KT_LIB_DIR . "/documentmanagement/DocumentType.inc");  
49 -require_once(KT_LIB_DIR . "/documentmanagement/DocumentFieldLink.inc");  
50 -require_once(KT_LIB_DIR . "/documentmanagement/documentmetadataversion.inc.php");  
51 -require_once(KT_LIB_DIR . "/documentmanagement/documentcontentversion.inc.php");  
52 -require_once(KT_LIB_DIR . "/metadata/fieldset.inc.php");  
53 -require_once(KT_LIB_DIR . "/security/Permission.inc"); 47 +require_once(KT_LIB_DIR . '/documentmanagement/Document.inc');
  48 +require_once(KT_LIB_DIR . '/documentmanagement/DocumentType.inc');
  49 +require_once(KT_LIB_DIR . '/documentmanagement/DocumentFieldLink.inc');
  50 +require_once(KT_LIB_DIR . '/documentmanagement/documentmetadataversion.inc.php');
  51 +require_once(KT_LIB_DIR . '/documentmanagement/documentcontentversion.inc.php');
  52 +require_once(KT_LIB_DIR . '/metadata/fieldset.inc.php');
  53 +require_once(KT_LIB_DIR . '/security/Permission.inc');
54 54
55 // widget includes. 55 // widget includes.
56 -require_once(KT_LIB_DIR . "/widgets/portlet.inc.php");  
57 -require_once(KT_LIB_DIR . "/widgets/fieldsetDisplay.inc.php");  
58 -require_once(KT_LIB_DIR . "/widgets/FieldsetDisplayRegistry.inc.php");  
59 -require_once(KT_LIB_DIR . "/actions/documentaction.inc.php");  
60 -require_once(KT_LIB_DIR . "/browse/browseutil.inc.php"); 56 +require_once(KT_LIB_DIR . '/widgets/portlet.inc.php');
  57 +require_once(KT_LIB_DIR . '/widgets/fieldsetDisplay.inc.php');
  58 +require_once(KT_LIB_DIR . '/widgets/FieldsetDisplayRegistry.inc.php');
  59 +require_once(KT_LIB_DIR . '/actions/documentaction.inc.php');
  60 +require_once(KT_LIB_DIR . '/browse/browseutil.inc.php');
61 61
62 62
63 class ViewDocumentDispatcher extends KTStandardDispatcher { 63 class ViewDocumentDispatcher extends KTStandardDispatcher {
64 var $sName = 'ktcore.actions.document.displaydetails'; 64 var $sName = 'ktcore.actions.document.displaydetails';
65 - var $sSection = "view_details"; 65 + var $sSection = 'view_details';
66 var $sHelpPage = 'ktcore/browse.html'; 66 var $sHelpPage = 'ktcore/browse.html';
67 67
68 var $actions; 68 var $actions;
@@ -77,21 +77,21 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -77,21 +77,21 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
77 77
78 function check() { 78 function check() {
79 if (!parent::check()) { return false; } 79 if (!parent::check()) { return false; }
80 - 80 +
81 $this->persistParams(array('fDocumentId')); 81 $this->persistParams(array('fDocumentId'));
82 - 82 +
83 return true; 83 return true;
84 } 84 }
85 85
86 // FIXME identify the current location somehow. 86 // FIXME identify the current location somehow.
87 function addPortlets($currentaction = null) { 87 function addPortlets($currentaction = null) {
88 $currentaction = $this->sName; 88 $currentaction = $this->sName;
89 - 89 +
90 $actions = KTDocumentActionUtil::getDocumentActionsForDocument($this->oDocument, $this->oUser, 'documentinfo'); 90 $actions = KTDocumentActionUtil::getDocumentActionsForDocument($this->oDocument, $this->oUser, 'documentinfo');
91 $oPortlet = new KTActionPortlet(sprintf(_kt('Document info'))); 91 $oPortlet = new KTActionPortlet(sprintf(_kt('Document info')));
92 $oPortlet->setActions($actions, $currentaction); 92 $oPortlet->setActions($actions, $currentaction);
93 - $this->oPage->addPortlet($oPortlet);  
94 - 93 + $this->oPage->addPortlet($oPortlet);
  94 +
95 $this->actions = KTDocumentActionUtil::getDocumentActionsForDocument($this->oDocument, $this->oUser); 95 $this->actions = KTDocumentActionUtil::getDocumentActionsForDocument($this->oDocument, $this->oUser);
96 $oPortlet = new KTActionPortlet(sprintf(_kt('Document actions'), $this->oDocument->getName())); 96 $oPortlet = new KTActionPortlet(sprintf(_kt('Document actions'), $this->oDocument->getName()));
97 $oPortlet->setActions($this->actions, $currentaction); 97 $oPortlet->setActions($this->actions, $currentaction);
@@ -100,9 +100,9 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -100,9 +100,9 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
100 100
101 function do_main() { 101 function do_main() {
102 // fix legacy, broken items. 102 // fix legacy, broken items.
103 - if (KTUtil::arrayGet($_REQUEST, "fDocumentID", true) !== true) {  
104 - $_REQUEST["fDocumentId"] = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, "fDocumentID"));  
105 - unset($_REQUEST["fDocumentID"]); 103 + if (KTUtil::arrayGet($_REQUEST, 'fDocumentID', true) !== true) {
  104 + $_REQUEST['fDocumentId'] = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, 'fDocumentID'));
  105 + unset($_REQUEST['fDocumentID']);
106 } 106 }
107 107
108 $document_data = array(); 108 $document_data = array();
@@ -118,7 +118,7 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -118,7 +118,7 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
118 return $this->do_error(); 118 return $this->do_error();
119 } 119 }
120 $document_id = $oDocument->getId(); 120 $document_id = $oDocument->getId();
121 - $document_data["document_id"] = $oDocument->getId(); 121 + $document_data['document_id'] = $oDocument->getId();
122 122
123 123
124 if (!KTBrowseUtil::inAdminMode($this->oUser, $oDocument->getFolderId())) { 124 if (!KTBrowseUtil::inAdminMode($this->oUser, $oDocument->getFolderId())) {
@@ -143,20 +143,20 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -143,20 +143,20 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
143 $this->oPage->setSecondaryTitle($oDocument->getName()); 143 $this->oPage->setSecondaryTitle($oDocument->getName());
144 144
145 $aOptions = array( 145 $aOptions = array(
146 - "documentaction" => "viewDocument",  
147 - "folderaction" => "browse", 146 + 'documentaction' => 'viewDocument',
  147 + 'folderaction' => 'browse',
148 ); 148 );
149 149
150 $this->oDocument =& $oDocument; 150 $this->oDocument =& $oDocument;
151 $this->aBreadcrumbs = kt_array_merge($this->aBreadcrumbs, KTBrowseUtil::breadcrumbsForDocument($oDocument, $aOptions)); 151 $this->aBreadcrumbs = kt_array_merge($this->aBreadcrumbs, KTBrowseUtil::breadcrumbsForDocument($oDocument, $aOptions));
152 - $this->oPage->setBreadcrumbDetails(_kt("document details"));  
153 - $this->addPortlets("Document Details"); 152 + $this->oPage->setBreadcrumbDetails(_kt('document details'));
  153 + $this->addPortlets('Document Details');
154 154
155 - $document_data["document"] = $oDocument;  
156 - $document_data["document_type"] =& DocumentType::get($oDocument->getDocumentTypeID()); 155 + $document_data['document'] = $oDocument;
  156 + $document_data['document_type'] =& DocumentType::get($oDocument->getDocumentTypeID());
157 $is_valid_doctype = true; 157 $is_valid_doctype = true;
158 158
159 - if (PEAR::isError($document_data["document_type"])) { 159 + if (PEAR::isError($document_data['document_type'])) {
160 $this->oPage->addError(_kt('The document you requested has an invalid <strong>document type</strong>. Unfortunately, this means that we cannot effectively display it.')); 160 $this->oPage->addError(_kt('The document you requested has an invalid <strong>document type</strong>. Unfortunately, this means that we cannot effectively display it.'));
161 $is_valid_doctype = false; 161 $is_valid_doctype = false;
162 } 162 }
@@ -171,7 +171,7 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -171,7 +171,7 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
171 171
172 //var_dump($field_values); 172 //var_dump($field_values);
173 173
174 - $document_data["field_values"] = $field_values; 174 + $document_data['field_values'] = $field_values;
175 175
176 // Fieldset generation. 176 // Fieldset generation.
177 // 177 //
@@ -186,7 +186,9 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -186,7 +186,9 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
186 186
187 $fieldsetDisplayReg =& KTFieldsetDisplayRegistry::getSingleton(); 187 $fieldsetDisplayReg =& KTFieldsetDisplayRegistry::getSingleton();
188 188
189 - foreach (KTMetadataUtil::fieldsetsForDocument($oDocument) as $oFieldset) { 189 + $aDocFieldsets = KTMetadataUtil::fieldsetsForDocument($oDocument);
  190 +
  191 + foreach ($aDocFieldsets as $oFieldset) {
190 $displayClass = $fieldsetDisplayReg->getHandler($oFieldset->getNamespace()); 192 $displayClass = $fieldsetDisplayReg->getHandler($oFieldset->getNamespace());
191 array_push($fieldsets, new $displayClass($oFieldset)); 193 array_push($fieldsets, new $displayClass($oFieldset));
192 } 194 }
@@ -216,35 +218,35 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -216,35 +218,35 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
216 $aViewletActions = KTDocumentActionUtil::getDocumentActionsForDocument($this->oDocument, $this->oUser, 'documentviewlet'); 218 $aViewletActions = KTDocumentActionUtil::getDocumentActionsForDocument($this->oDocument, $this->oUser, 'documentviewlet');
217 foreach ($aViewletActions as $oAction) { 219 foreach ($aViewletActions as $oAction) {
218 $aInfo = $oAction->getInfo(); 220 $aInfo = $oAction->getInfo();
219 - 221 +
220 if ($aInfo !== null) { 222 if ($aInfo !== null) {
221 - $aViewlets[] = $oAction->display_viewlet(); // use the action, since we display_viewlet() later. 223 + $aViewlets[] = $oAction->display_viewlet(); // use the action, since we display_viewlet() later.
222 } 224 }
223 - }  
224 -  
225 - $viewlet_data = implode(" ", $aViewlets); 225 + }
  226 +
  227 + $viewlet_data = implode(' ', $aViewlets);
226 $viewlet_data = trim($viewlet_data); 228 $viewlet_data = trim($viewlet_data);
227 - 229 +
228 $content_class = 'view'; 230 $content_class = 'view';
229 if (!empty($viewlet_data)) { 231 if (!empty($viewlet_data)) {
230 $content_class = 'view withviewlets'; 232 $content_class = 'view withviewlets';
231 - } 233 + }
232 $this->oPage->setContentClass($content_class); 234 $this->oPage->setContentClass($content_class);
233 -  
234 235
235 - 236 +
  237 +
236 $oTemplating =& KTTemplating::getSingleton(); 238 $oTemplating =& KTTemplating::getSingleton();
237 - $oTemplate = $oTemplating->loadTemplate("ktcore/document/view"); 239 + $oTemplate = $oTemplating->loadTemplate('ktcore/document/view');
238 $aTemplateData = array( 240 $aTemplateData = array(
239 - "context" => $this,  
240 - "sCheckoutUser" => $checkout_user,  
241 - "isCheckoutUser" => ($this->oUser->getId() == $oDocument->getCheckedOutUserId()),  
242 - "canCheckin" => $bCanCheckin,  
243 - "document_id" => $document_id,  
244 - "document" => $oDocument,  
245 - "documentName" => $oDocument->getName(),  
246 - "document_data" => $document_data,  
247 - "fieldsets" => $fieldsets, 241 + 'context' => $this,
  242 + 'sCheckoutUser' => $checkout_user,
  243 + 'isCheckoutUser' => ($this->oUser->getId() == $oDocument->getCheckedOutUserId()),
  244 + 'canCheckin' => $bCanCheckin,
  245 + 'document_id' => $document_id,
  246 + 'document' => $oDocument,
  247 + 'documentName' => $oDocument->getName(),
  248 + 'document_data' => $document_data,
  249 + 'fieldsets' => $fieldsets,
248 'viewlet_data' => $viewlet_data, 250 'viewlet_data' => $viewlet_data,
249 ); 251 );
250 //return '<pre>' . print_r($aTemplateData, true) . '</pre>'; 252 //return '<pre>' . print_r($aTemplateData, true) . '</pre>';
@@ -256,86 +258,86 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -256,86 +258,86 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
256 // fDocumentId (document to compare against) 258 // fDocumentId (document to compare against)
257 // fComparisonVersion (the metadata_version of the appropriate document) 259 // fComparisonVersion (the metadata_version of the appropriate document)
258 function do_viewComparison() { 260 function do_viewComparison() {
259 - 261 +
260 $document_data = array(); 262 $document_data = array();
261 $document_id = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, 'fDocumentId')); 263 $document_id = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, 'fDocumentId'));
262 if ($document_id === null) { 264 if ($document_id === null) {
263 $this->oPage->addError(sprintf(_kt("No document was requested. Please <a href=\"%s\">browse</a> for one."), KTBrowseUtil::getBrowseBaseUrl())); 265 $this->oPage->addError(sprintf(_kt("No document was requested. Please <a href=\"%s\">browse</a> for one."), KTBrowseUtil::getBrowseBaseUrl()));
264 return $this->do_error(); 266 return $this->do_error();
265 } 267 }
266 -  
267 - $document_data["document_id"] = $document_id;  
268 - 268 +
  269 + $document_data['document_id'] = $document_id;
  270 +
269 $base_version = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, 'fBaseVersion')); 271 $base_version = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, 'fBaseVersion'));
270 - 272 +
271 // try get the document. 273 // try get the document.
272 $oDocument =& Document::get($document_id, $base_version); 274 $oDocument =& Document::get($document_id, $base_version);
273 if (PEAR::isError($oDocument)) { 275 if (PEAR::isError($oDocument)) {
274 $this->oPage->addError(sprintf(_kt("The base document you attempted to retrieve is invalid. Please <a href=\"%s\">browse</a> for one."), KTBrowseUtil::getBrowseBaseUrl())); 276 $this->oPage->addError(sprintf(_kt("The base document you attempted to retrieve is invalid. Please <a href=\"%s\">browse</a> for one."), KTBrowseUtil::getBrowseBaseUrl()));
275 return $this->do_error(); 277 return $this->do_error();
276 } 278 }
277 - 279 +
278 if (!Permission::userHasDocumentReadPermission($oDocument)) { 280 if (!Permission::userHasDocumentReadPermission($oDocument)) {
279 // FIXME inconsistent. 281 // FIXME inconsistent.
280 $this->oPage->addError(_kt('You are not allowed to view this document')); 282 $this->oPage->addError(_kt('You are not allowed to view this document'));
281 return $this->permissionDenied(); 283 return $this->permissionDenied();
282 } 284 }
283 - 285 +
284 $this->oDocument =& $oDocument; 286 $this->oDocument =& $oDocument;
285 $this->oPage->setSecondaryTitle($oDocument->getName()); 287 $this->oPage->setSecondaryTitle($oDocument->getName());
286 $aOptions = array( 288 $aOptions = array(
287 - "documentaction" => "viewDocument",  
288 - "folderaction" => "browse", 289 + 'documentaction' => 'viewDocument',
  290 + 'folderaction' => 'browse',
289 ); 291 );
290 - 292 +
291 $this->aBreadcrumbs = kt_array_merge($this->aBreadcrumbs, KTBrowseUtil::breadcrumbsForDocument($oDocument, $aOptions)); 293 $this->aBreadcrumbs = kt_array_merge($this->aBreadcrumbs, KTBrowseUtil::breadcrumbsForDocument($oDocument, $aOptions));
292 - $this->oPage->setBreadcrumbDetails(_kt("compare versions"));  
293 - 294 + $this->oPage->setBreadcrumbDetails(_kt('compare versions'));
  295 +
294 $comparison_version = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, 'fComparisonVersion')); 296 $comparison_version = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, 'fComparisonVersion'));
295 if ($comparison_version=== null) { 297 if ($comparison_version=== null) {
296 $this->oPage->addError(sprintf(_kt("No comparison version was requested. Please <a href=\"%s\">select a version</a>."), KTUtil::addQueryStringSelf('action=history&fDocumentId=' . $document_id))); 298 $this->oPage->addError(sprintf(_kt("No comparison version was requested. Please <a href=\"%s\">select a version</a>."), KTUtil::addQueryStringSelf('action=history&fDocumentId=' . $document_id)));
297 return $this->do_error(); 299 return $this->do_error();
298 } 300 }
299 - 301 +
300 $oComparison =& Document::get($oDocument->getId(), $comparison_version); 302 $oComparison =& Document::get($oDocument->getId(), $comparison_version);
301 if (PEAR::isError($oComparison)) { 303 if (PEAR::isError($oComparison)) {
302 $this->errorRedirectToMain(_kt('Invalid document to compare against.')); 304 $this->errorRedirectToMain(_kt('Invalid document to compare against.'));
303 } 305 }
304 $comparison_data = array(); 306 $comparison_data = array();
305 $comparison_data['document_id'] = $oComparison->getId(); 307 $comparison_data['document_id'] = $oComparison->getId();
306 -  
307 - $document_data["document"] = $oDocument; 308 +
  309 + $document_data['document'] = $oDocument;
308 $comparison_data['document'] = $oComparison; 310 $comparison_data['document'] = $oComparison;
309 -  
310 - $document_data["document_type"] =& DocumentType::get($oDocument->getDocumentTypeID());  
311 - $comparison_data["document_type"] =& DocumentType::get($oComparison->getDocumentTypeID());  
312 - 311 +
  312 + $document_data['document_type'] =& DocumentType::get($oDocument->getDocumentTypeID());
  313 + $comparison_data['document_type'] =& DocumentType::get($oComparison->getDocumentTypeID());
  314 +
313 // follow twice: once for normal, once for comparison. 315 // follow twice: once for normal, once for comparison.
314 $is_valid_doctype = true; 316 $is_valid_doctype = true;
315 -  
316 - if (PEAR::isError($document_data["document_type"])) { 317 +
  318 + if (PEAR::isError($document_data['document_type'])) {
317 $this->oPage->addError(_kt('The document you requested has an invalid <strong>document type</strong>. Unfortunately, this means that we cannot effectively display it.')); 319 $this->oPage->addError(_kt('The document you requested has an invalid <strong>document type</strong>. Unfortunately, this means that we cannot effectively display it.'));
318 $is_valid_doctype = false; 320 $is_valid_doctype = false;
319 } 321 }
320 - 322 +
321 // we want to grab all the md for this doc, since its faster that way. 323 // we want to grab all the md for this doc, since its faster that way.
322 $mdlist =& DocumentFieldLink::getList(array('metadata_version_id = ?', array($oDocument->getMetadataVersionId()))); 324 $mdlist =& DocumentFieldLink::getList(array('metadata_version_id = ?', array($oDocument->getMetadataVersionId())));
323 - 325 +
324 $field_values = array(); 326 $field_values = array();
325 foreach ($mdlist as $oFieldLink) { 327 foreach ($mdlist as $oFieldLink) {
326 $field_values[$oFieldLink->getDocumentFieldID()] = $oFieldLink->getValue(); 328 $field_values[$oFieldLink->getDocumentFieldID()] = $oFieldLink->getValue();
327 } 329 }
328 -  
329 - $document_data["field_values"] = $field_values; 330 +
  331 + $document_data['field_values'] = $field_values;
330 $mdlist =& DocumentFieldLink::getList(array('metadata_version_id = ?', array($comparison_version))); 332 $mdlist =& DocumentFieldLink::getList(array('metadata_version_id = ?', array($comparison_version)));
331 - 333 +
332 $field_values = array(); 334 $field_values = array();
333 foreach ($mdlist as $oFieldLink) { 335 foreach ($mdlist as $oFieldLink) {
334 $field_values[$oFieldLink->getDocumentFieldID()] = $oFieldLink->getValue(); 336 $field_values[$oFieldLink->getDocumentFieldID()] = $oFieldLink->getValue();
335 } 337 }
336 -  
337 - $comparison_data["field_values"] = $field_values;  
338 - 338 +
  339 + $comparison_data['field_values'] = $field_values;
  340 +
339 // Fieldset generation. 341 // Fieldset generation.
340 // 342 //
341 // we need to create a set of FieldsetDisplay objects 343 // we need to create a set of FieldsetDisplay objects
@@ -343,47 +345,47 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -343,47 +345,47 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
343 // to the view (i.e. ZX3). Unfortunately, we don't have 345 // to the view (i.e. ZX3). Unfortunately, we don't have
344 // any of the plumbing to do it, so we handle this here. 346 // any of the plumbing to do it, so we handle this here.
345 $fieldsets = array(); 347 $fieldsets = array();
346 - 348 +
347 // we always have a generic. 349 // we always have a generic.
348 array_push($fieldsets, new GenericFieldsetDisplay()); 350 array_push($fieldsets, new GenericFieldsetDisplay());
349 - 351 +
350 // FIXME can we key this on fieldset namespace? or can we have duplicates? 352 // FIXME can we key this on fieldset namespace? or can we have duplicates?
351 // now we get the other fieldsets, IF there is a valid doctype. 353 // now we get the other fieldsets, IF there is a valid doctype.
352 - 354 +
353 if ($is_valid_doctype) { 355 if ($is_valid_doctype) {
354 // these are the _actual_ fieldsets. 356 // these are the _actual_ fieldsets.
355 $fieldsetDisplayReg =& KTFieldsetDisplayRegistry::getSingleton(); 357 $fieldsetDisplayReg =& KTFieldsetDisplayRegistry::getSingleton();
356 - 358 +
357 // and the generics 359 // and the generics
358 $activesets = KTFieldset::getGenericFieldsets(); 360 $activesets = KTFieldset::getGenericFieldsets();
359 foreach ($activesets as $oFieldset) { 361 foreach ($activesets as $oFieldset) {
360 $displayClass = $fieldsetDisplayReg->getHandler($oFieldset->getNamespace()); 362 $displayClass = $fieldsetDisplayReg->getHandler($oFieldset->getNamespace());
361 array_push($fieldsets, new $displayClass($oFieldset)); 363 array_push($fieldsets, new $displayClass($oFieldset));
362 } 364 }
363 - 365 +
364 $activesets = KTFieldset::getForDocumentType($oDocument->getDocumentTypeID()); 366 $activesets = KTFieldset::getForDocumentType($oDocument->getDocumentTypeID());
365 foreach ($activesets as $oFieldset) { 367 foreach ($activesets as $oFieldset) {
366 $displayClass = $fieldsetDisplayReg->getHandler($oFieldset->getNamespace()); 368 $displayClass = $fieldsetDisplayReg->getHandler($oFieldset->getNamespace());
367 array_push($fieldsets, new $displayClass($oFieldset)); 369 array_push($fieldsets, new $displayClass($oFieldset));
368 } 370 }
369 } 371 }
370 - 372 +
371 // FIXME handle ad-hoc fieldsets. 373 // FIXME handle ad-hoc fieldsets.
372 $this->addPortlets(); 374 $this->addPortlets();
373 - $oTemplate = $this->oValidator->validateTemplate("ktcore/document/compare"); 375 + $oTemplate = $this->oValidator->validateTemplate('ktcore/document/compare');
374 $aTemplateData = array( 376 $aTemplateData = array(
375 - "context" => $this,  
376 - "document_id" => $document_id,  
377 - "document" => $oDocument,  
378 - "document_data" => $document_data,  
379 - "comparison_data" => $comparison_data,  
380 - "comparison_document" => $oComparison,  
381 - "fieldsets" => $fieldsets, 377 + 'context' => $this,
  378 + 'document_id' => $document_id,
  379 + 'document' => $oDocument,
  380 + 'document_data' => $document_data,
  381 + 'comparison_data' => $comparison_data,
  382 + 'comparison_document' => $oComparison,
  383 + 'fieldsets' => $fieldsets,
382 ); 384 );
383 - //var_dump($aTemplateData["comparison_data"]); 385 + //var_dump($aTemplateData['comparison_data']);
384 return $oTemplate->render($aTemplateData); 386 return $oTemplate->render($aTemplateData);
385 } 387 }
386 - 388 +
387 function do_error() { 389 function do_error() {
388 return '&nbsp;'; // don't actually do anything. 390 return '&nbsp;'; // don't actually do anything.
389 } 391 }
@@ -399,4 +401,4 @@ class ViewDocumentDispatcher extends KTStandardDispatcher { @@ -399,4 +401,4 @@ class ViewDocumentDispatcher extends KTStandardDispatcher {
399 $oDispatcher = new ViewDocumentDispatcher; 401 $oDispatcher = new ViewDocumentDispatcher;
400 $oDispatcher->dispatch(); 402 $oDispatcher->dispatch();
401 403
402 -?> 404 -?>
  405 +?>
403 \ No newline at end of file 406 \ No newline at end of file