Commit e0a528792eb9dd5d66048b375d98970468badd29

Authored by Megan Watson
1 parent 40419fcf

KTS-3437

"Document upload failed: Could not create directory"
Fixed. Refactored the code slightly, changed the order in which things are loaded. Added caching back in.

Committed by: Megan Watson
Reviewed by: Conrad Vermeulen



git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@8613 c91229c3-7414-0410-bfa2-8a42b809f60b
config/dmsDefaults.php
... ... @@ -104,12 +104,12 @@ require_once(KT_LIB_DIR . '/validation/customerror.php');
104 104  
105 105 // {{{ prependPath()
106 106 function prependPath ($path) {
107   -
  107 +
108 108 $include_path = ini_get('include_path');
109 109 ini_set('include_path', $path . PATH_SEPARATOR . $include_path);
110 110 }
111 111 // }}}
112   -
  112 +
113 113 prependPath(KT_DIR . '/thirdparty/ZendFramework/library');
114 114 prependPath(KT_DIR . '/thirdparty/pear');
115 115 prependPath(KT_DIR . '/thirdparty/Smarty');
... ... @@ -128,11 +128,11 @@ require_once(KT_LIB_DIR . '/util/ktutil.inc');
128 128 require_once(KT_LIB_DIR . '/ktentity.inc');
129 129  
130 130 require_once(KT_LIB_DIR . '/config/config.inc.php');
131   -require_once(KT_DIR . '/search2/indexing/indexerCore.inc.php');
  131 +require_once(KT_DIR . '/search2/indexing/indexerCore.inc.php');
132 132  
133 133 // {{{ KTInit
134 134 class KTInit {
135   -
  135 +
136 136 // {{{ setupLogging()
137 137 function setupLogging () {
138 138 global $default;
... ... @@ -202,7 +202,7 @@ class KTInit {
202 202 }
203 203 // }}}
204 204  
205   -
  205 +
206 206  
207 207 // {{{ cleanGlobals()
208 208 function cleanGlobals () {
... ... @@ -373,25 +373,25 @@ class KTInit {
373 373  
374 374 function catchFatalErrors()
375 375 {
376   -
  376 +
377 377 $CustomErrorPage = KTCustomErrorViewer::getCustomErrorRedirectPage();
378 378 if($CustomErrorPage != '0')
379 379 {
380 380 ini_set('display_errors','On');
381 381 $phperror='><div id="phperror" style="display:none">';
382 382 ini_set('error_prepend_string',$phperror);
383   -
  383 +
384 384 $sUrl = KTInit::guessRootUrl();
385 385 global $default;
386 386 $sRootUrl = ($default->sslEnabled ? 'https' : 'http') .'://'.$_SERVER['HTTP_HOST'].$sUrl;
387   -
  387 +
388 388 $CustomErrorPage = basename($CustomErrorPage);
389   -
  389 +
390 390 $phperror='</div>><form name="catcher" action="'.$sRootUrl.'/'.$CustomErrorPage.'" method="post" ><input type="hidden" name="fatal" value=""></form>
391 391 <script> document.catcher.fatal.value = document.getElementById("phperror").innerHTML; document.catcher.submit();</script>';
392 392 ini_set('error_append_string',$phperror);
393 393 }
394   -
  394 +
395 395 }
396 396  
397 397  
... ... @@ -450,61 +450,79 @@ class KTInit {
450 450 // {{{ initConfig
451 451 function initConfig() {
452 452 global $default;
  453 + $oKTConfig = KTConfig::getSingleton();
  454 +
  455 + // TODO: refactor when all the config settings are stored in the database
  456 + // Check for the config cache
453 457 $use_cache = false;
454 458 $store_cache = false;
455   - if (file_exists(KT_DIR . '/config/cache-path')) {
  459 + $cachePathFile = KT_DIR . '/config/cache-path';
  460 + if (file_exists($cachePathFile)) {
456 461 $store_cache = true;
457   - $user = KTLegacyLog::running_user();
458   - // handle vhosts.
459   - $truehost = KTUtil::arrayGet($_SERVER, 'HTTP_HOST', 'default');
460   - $trueport = KTUtil::arrayGet($_SERVER, 'SERVER_PORT', '80');
461   - $cache_file = trim(file_get_contents(KT_DIR . '/config/cache-path')) . '/configcache' . $user . $truehost . $trueport;
462   - if (!KTUtil::isAbsolutePath($cache_file)) { $cache_file = sprintf('%s/%s', KT_DIR, $cache_file); }
463   - $config_file = trim(file_get_contents(KT_DIR . '/config/config-path'));
  462 + // Get the path to the config cache
  463 + $cachePath = trim(file_get_contents($cachePathFile));
  464 + $cachePath .= '/configcache';
  465 +
  466 + $cachePath = (!KTUtil::isAbsolutePath($cachePath)) ? sprintf('%s/%s', KT_DIR, $cachePath) : $cachePath;
  467 +
  468 + // Get the path to the config file
  469 + $configPathFile = KT_DIR . '/config/config-path';
  470 + $configPath = trim(file_get_contents($configPathFile));
  471 +
  472 + $configPath = (!KTUtil::isAbsolutePath($configPath)) ? sprintf('%s/%s', KT_DIR, $configPath) : $configPath;
  473 +
464 474 // Remove any double slashes
465   - $config_file = str_replace('//', '/', $config_file);
466   - $config_file = str_replace('\\\\', '\\', $config_file);
467   - if (!KTUtil::isAbsolutePath($config_file)) { $config_file = sprintf('%s/%s', KT_DIR, $config_file); }
468   -
469   - $exists = file_exists($cache_file);
470   - if ($exists) {
471   - $cachestat = stat($cache_file);
472   - $configstat = stat($config_file);
  475 + $configPath = str_replace('//', '/', $configPath);
  476 + $configPath = str_replace('\\\\', '\\', $configPath);
  477 +
  478 + // This check can be removed once all config settings are in the database
  479 + // Check if the config file has been updated since the last time the cache file was generated.
  480 + if (file_exists($cachePath)) {
  481 + $cachestat = stat($cachePath);
  482 + $configstat = stat($configPath);
473 483 $tval = 9;
474   - // print sprintf("is %d > %d\n", $cachestat[$tval], $configstat[$tval]);
475 484 if ($cachestat[$tval] > $configstat[$tval]) {
476 485 $use_cache = true;
  486 + $store_cache = false;
477 487 }
478 488 }
479   - }
480 489  
481   -/*
482   - if ($use_cache) {
483   - $oKTConfig =& KTConfig::getSingleton();
484   - $oKTConfig->loadCache($cache_file);
  490 + if ($use_cache) {
  491 + $oKTConfig->loadCache($cachePath);
485 492  
486   - foreach ($oKTConfig->flat as $k => $v) {
487   - $default->$k = $oKTConfig->get($k);
488   - }
489   - } else {
490   - //fail safe will be put here
491   -
492   -
493   - if (PEAR::isError($res)) { return $res; }
494   -
495   - //$oKTConfig =& KTConfig::getSingleton();
496   - @touch($cache_file);
497   - if ($store_cache && is_writable($cache_file)) {
498   - $oKTConfig->createCache($cache_file);
  493 + foreach ($oKTConfig->flat as $k => $v) {
  494 + $default->$k = $oKTConfig->get($k);
  495 + }
499 496 }
  497 + }
  498 +
  499 + //Read in DB settings and config settings
  500 + if(!$use_cache) $oKTConfig->readDBConfig();
  501 + $dbSetup = $oKTConfig->setupDB();
  502 +
  503 + if(PEAR::isError($dbSetup))
  504 + {
  505 + $this->handleInitError($dbSetup);
  506 + }
  507 +
  508 + // Get default server url settings
  509 + if(!$use_cache) $this->getDynamicConfigSettings();
  510 +
  511 + // Read in the config settings from the database
  512 + // Create the global $default array
  513 + if(!$use_cache) $res = $oKTConfig->readConfig();
500 514  
501 515  
  516 + if($store_cache && isset($cachePath)){
  517 + @touch($cachePath);
  518 + if (is_writable($cachePath)) {
  519 + $oKTConfig->createCache($cachePath);
  520 + }
502 521 }
503   -*/
504 522 }
505 523 // }}}
506 524  
507   -
  525 +
508 526  
509 527 // {{{ initTesting
510 528 function initTesting() {
... ... @@ -530,31 +548,11 @@ class KTInit {
530 548 }
531 549 // }}}
532 550  
533   -//Creating all the config settings
534   -//====================================
535   -$oKTConfig = KTConfig::getSingleton();
536   -
537   -//Read in DB specific config settings
538   -$res = $oKTConfig->readDBConfig();
539   -//Set up DB connection
540   -$dbSetup = $oKTConfig->setupDB();
541 551  
542 552 $KTInit = new KTInit();
543   -
544   -if(PEAR::isError($dbSetup))
545   -{
546   - $KTInit->handleInitError($dbSetup);
547   -}
548   -
549   -
550   -
551   -$KTInit->getDynamicConfigSettings();
552 553 $KTInit->initConfig();
553 554 $KTInit->setupI18n();
554 555  
555   -//Create final flatns and $default arrays to finish config setup
556   -$res = $oKTConfig->readConfig();
557   -
558 556 //====================================
559 557  
560 558 define('KTLOG_CACHE',false);
... ... @@ -563,8 +561,7 @@ if (isset($GLOBALS[&#39;kt_test&#39;])) {
563 561 $KTInit->initTesting();
564 562 }
565 563  
566   -
567   -
  564 +$oKTConfig = KTConfig::getSingleton();
568 565  
569 566 if($oKTConfig->get('CustomErrorMessages/customerrormessages') == 'on')
570 567 {
... ...
lib/config/config.inc.php
... ... @@ -6,31 +6,31 @@
6 6 * Document Management Made Simple
7 7 * Copyright (C) 2008 KnowledgeTree Inc.
8 8 * Portions copyright The Jam Warehouse Software (Pty) Limited
9   - *
  9 + *
10 10 * This program is free software; you can redistribute it and/or modify it under
11 11 * the terms of the GNU General Public License version 3 as published by the
12 12 * Free Software Foundation.
13   - *
  13 + *
14 14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 16 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 17 * details.
18   - *
  18 + *
19 19 * You should have received a copy of the GNU General Public License
20 20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21   - *
22   - * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
  21 + *
  22 + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
23 23 * California 94120-7775, or email info@knowledgetree.com.
24   - *
  24 + *
25 25 * The interactive user interfaces in modified source and object code versions
26 26 * of this program must display Appropriate Legal Notices, as required under
27 27 * Section 5 of the GNU General Public License version 3.
28   - *
  28 + *
29 29 * In accordance with Section 7(b) of the GNU General Public License version 3,
30 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 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
  33 + * must display the words "Powered by KnowledgeTree" and retain the original
34 34 * copyright notice.
35 35 * Contributor( s): ______________________________________
36 36 *
... ... @@ -44,11 +44,10 @@ require_once (KT_LIB_DIR. &#39;/database/dbutil.inc&#39;);
44 44 class KTConfig {
45 45 var $conf = array();
46 46 var $aSectionFile;
47   - var $aFileRoot;
48 47 var $flat = array();
49 48 var $flatns = array();
50   - var $aDBConfig = array();
51   - var $aConfFile = array();
  49 + var $expanded = array();
  50 + var $expanding = array();
52 51  
53 52 // FIXME nbm: how do we cache errors here?
54 53 function loadCache($filename) {
... ... @@ -58,62 +57,44 @@ class KTConfig {
58 57 $this->flatns = $config_cache['flatns'];
59 58 $this->expanded = $config_cache['expanded'];
60 59 $this->expanding = $config_cache['expanding'];
61   - /*
62   - print "----- Me\n";
63   - unset($this->aFileRoot);
64   - unset($this->aSectionFile);
65   - var_dump($this);
66   - print "----- Cache\n";
67   - var_dump($config_cache);
68   - */
69   -
70 60 return true;
71 61 }
72   -
  62 +
  63 + function createCache($filename) {
  64 + $config_cache = array();
  65 + $config_cache['flat'] = $this->flat;
  66 + $config_cache['flatns'] = $this->flatns;
  67 + $config_cache['expanded'] = $this->expanded;
  68 + $config_cache['expanding'] = $this->expanding;
  69 +
  70 + file_put_contents($filename, serialize($config_cache));
  71 + }
  72 +
73 73 // {{{ readConfig
74 74 function readConfig () {
75 75 global $default;
76   -
  76 +
77 77 //Load config data from the database
78 78 $sQuery = 'select group_name, item, value, default_value from config_settings';
79 79 $confResult = DBUtil::getResultArray($sQuery);
80 80  
81   - foreach ($confResult as $confItem)
  81 + foreach ($confResult as $confItem)
82 82 {
83   -
84   - //if $aConfFile doesn't contain the value already set the value
85   -
86   - if(!isset($this->aConfFile[$confItem['group_name']][$confItem['item']]) || $this->aConfFile[$confItem['group_name']][$confItem['item']] == 'default')
87   - {
88   - if($confItem['value'] != 'default')
89   - {
90   - $this->flatns[$confItem['group_name'].'/'.$confItem['item']] = $confItem['value'];
91   - $this->flat[$confItem['item']] = $confItem['value'];
92   -
93   - }
94   - else
95   - {
96   - $this->flatns[$confItem['group_name'].'/'.$confItem['item']] = $confItem['default_value'];
97   - $this->flat[$confItem['item']] = $confItem['default_value'];
98   -
99   - }
100   - }
101   - else //if $aConfFile does have the value set $default and flatns with $aConfFile
102   - {
103   - $this->flatns[$confItem['group_name'].'/'.$confItem['item']] = $this->aConfFile[$confItem['group_name']][$confItem['item']];
104   - $this->flat[$confItem['item']] = $this->aConfFile[$confItem['group_name']][$confItem['item']];
105   -
  83 + if(!isset($this->flatns[$confItem['group_name'].'/'.$confItem['item']])){
  84 + $this->setns($confItem['group_name'], $confItem['item'], $confItem['value'], $confItem['default_value']);
106 85 }
107 86 }
  87 +
  88 + // Populate the global $default array
108 89 foreach($this->flatns as $sGroupItem => $sValue)
109 90 {
110 91 $aGroupItemArray = explode('/', $sGroupItem);
111 92 $default->$aGroupItemArray[1] = $this->expand($this->flatns[$sGroupItem]);
112 93 }
113   -
  94 +
114 95 }
115 96 // }}}
116   -
  97 +
117 98 // {{{ readDBConfig()
118 99 function readDBConfig()
119 100 {
... ... @@ -125,7 +106,7 @@ class KTConfig {
125 106 }
126 107 }
127 108 // }}}
128   -
  109 +
129 110 // {{{ loadDBFile()
130 111 function loadDBFile($filename, $bDefault = false)
131 112 {
... ... @@ -136,27 +117,22 @@ class KTConfig {
136 117 return $root;
137 118 }
138 119  
139   - $this->aFileRoot[$filename] =& $root;
140   -
141   - $conf =& $root->toArray();
142   -
143   - //Set the database specific config details here
144   - $this->aDBConfig = $conf['root']['db'];
145   -
146   - //load entire config file into $aConfFile array
147   - //These values will override those given by the database
148   - //This is in case the system fails and the user cannot get to the admin page
149   - //all items given the value default will be poplulated either by the DB or
150   - //by the setdefaultns function
151   - foreach($conf['root'] as $sItem => $sValue)
152   - {
153   - $this->aConfFile[$sItem] = $sValue;
  120 + $conf = $root->toArray();
  121 +
  122 + // Populate the flat and flatns array with the settings from the config file
  123 + // These setting will be overwritten with the settings from the database.
  124 + if(isset($conf['root']) && !empty($conf['root'])){
  125 + foreach($conf['root'] as $group => $item){
  126 + foreach ($item as $key => $value){
  127 + $this->setns($group, $key, $value, false);
  128 + }
  129 + }
154 130 }
155   -
156 131 }
157 132 // }}}
158   -
  133 +
159 134 function setupDB () {
  135 +
160 136 global $default;
161 137  
162 138 require_once('DB.php');
... ... @@ -171,27 +147,25 @@ class KTConfig {
171 147 // KTEntity is the database-backed base class
172 148 require_once(KT_LIB_DIR . '/ktentity.inc');
173 149  
174   -
175   -
176 150 $prefix = defined('USE_DB_ADMIN_USER')?'Admin':'';
177 151  
178   - $sUser = 'dbUser';
179   - $sPass = 'dbPass';
180   -
  152 + $sUser = 'db/dbUser';
  153 + $sPass = 'db/dbPass';
  154 +
181 155 if ($prefix == 'Admin')
182 156 {
183   - $sUser = 'dbAdminUser';
184   - $sPass = 'dbAdminPass';
  157 + $sUser = 'db/dbAdminUser';
  158 + $sPass = 'db/dbAdminPass';
185 159 }
186 160 $dsn = array(
187   - 'phptype' => $this->aDBConfig['dbType'],
188   - 'username' => $this->aDBConfig[$sUser],
189   - 'password' => $this->aDBConfig[$sPass],
190   - 'hostspec' => $this->aDBConfig['dbHost'],
191   - 'database' => $this->aDBConfig['dbName'],
192   - 'port' => $this->aDBConfig['dbPort']
  161 + 'phptype' => $this->flatns['db/dbType'],
  162 + 'username' => $this->flatns[$sUser],
  163 + 'password' => $this->flatns[$sPass],
  164 + 'hostspec' => $this->flatns['db/dbHost'],
  165 + 'database' => $this->flatns['db/dbName'],
  166 + 'port' => $this->flatns['db/dbPort']
193 167 );
194   -
  168 +
195 169 $options = array(
196 170 'debug' => 2,
197 171 'portability' => DB_PORTABILITY_ERRORS,
... ... @@ -204,24 +178,14 @@ class KTConfig {
204 178 return $default->_db;
205 179 }
206 180 $default->_db->setFetchMode(DB_FETCHMODE_ASSOC);
207   -
208   - }
209   -
210   - function createCache($filename) {
211   - $config_cache = array();
212   - $config_cache['flat'] = $this->flat;
213   - $config_cache['flatns'] = $this->flatns;
214   - $config_cache['expanded'] = $this->expanded;
215   - $config_cache['expanding'] = $this->expanding;
216   -
217   - file_put_contents($filename, serialize($config_cache));
218   -
219   -
220 181 }
221 182  
222 183 function setns($seck, $k, $v, $bDefault = false) {
223 184 if ($v === "default") {
224   - return;
  185 + if($bDefault === false){
  186 + return;
  187 + }
  188 + $v = $bDefault;
225 189 } elseif ($v === "true") {
226 190 $v = true;
227 191 } elseif ($v === "false") {
... ... @@ -238,8 +202,6 @@ class KTConfig {
238 202 return $this->setns($seck, $k, $v, true);
239 203 }
240 204  
241   - var $expanded = array();
242   - var $expanding = array();
243 205 function expand($val) {
244 206 if (strpos($val, '$') === false) {
245 207 return $val;
... ... @@ -258,8 +220,6 @@ class KTConfig {
258 220 }
259 221  
260 222 function get($var, $oDefault = null) {
261   -
262   -
263 223 if (array_key_exists($var, $this->flatns)) {
264 224 return $this->expand($this->flatns[$var]);
265 225 }
... ...