This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * Initialize some defaults needed for DokuWiki |
||
4 | */ |
||
5 | |||
6 | use dokuwiki\Extension\Event; |
||
7 | use dokuwiki\Extension\EventHandler; |
||
8 | |||
9 | /** |
||
10 | * timing Dokuwiki execution |
||
11 | * |
||
12 | * @param integer $start |
||
13 | * |
||
14 | * @return mixed |
||
15 | */ |
||
16 | function delta_time($start=0) { |
||
17 | return microtime(true)-((float)$start); |
||
18 | } |
||
19 | define('DOKU_START_TIME', delta_time()); |
||
20 | |||
21 | global $config_cascade; |
||
22 | $config_cascade = array(); |
||
23 | |||
24 | // if available load a preload config file |
||
25 | $preload = fullpath(dirname(__FILE__)).'/preload.php'; |
||
26 | if (file_exists($preload)) include($preload); |
||
27 | |||
28 | // define the include path |
||
29 | if(!defined('DOKU_INC')) define('DOKU_INC',fullpath(dirname(__FILE__).'/../').'/'); |
||
30 | |||
31 | // define Plugin dir |
||
32 | if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); |
||
33 | |||
34 | // define config path (packagers may want to change this to /etc/dokuwiki/) |
||
35 | if(!defined('DOKU_CONF')) define('DOKU_CONF',DOKU_INC.'conf/'); |
||
36 | |||
37 | // check for error reporting override or set error reporting to sane values |
||
38 | if (!defined('DOKU_E_LEVEL') && file_exists(DOKU_CONF.'report_e_all')) { |
||
39 | define('DOKU_E_LEVEL', E_ALL); |
||
40 | } |
||
41 | if (!defined('DOKU_E_LEVEL')) { |
||
42 | error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT); |
||
43 | } else { |
||
44 | error_reporting(DOKU_E_LEVEL); |
||
45 | } |
||
46 | |||
47 | // avoid caching issues #1594 |
||
48 | header('Vary: Cookie'); |
||
49 | |||
50 | // init memory caches |
||
51 | global $cache_revinfo; |
||
52 | $cache_revinfo = array(); |
||
53 | global $cache_wikifn; |
||
54 | $cache_wikifn = array(); |
||
55 | global $cache_cleanid; |
||
56 | $cache_cleanid = array(); |
||
57 | global $cache_authname; |
||
58 | $cache_authname = array(); |
||
59 | global $cache_metadata; |
||
60 | $cache_metadata = array(); |
||
61 | |||
62 | // always include 'inc/config_cascade.php' |
||
63 | // previously in preload.php set fields of $config_cascade will be merged with the defaults |
||
64 | include(DOKU_INC.'inc/config_cascade.php'); |
||
65 | |||
66 | //prepare config array() |
||
67 | global $conf; |
||
68 | $conf = array(); |
||
69 | |||
70 | // load the global config file(s) |
||
71 | foreach (array('default','local','protected') as $config_group) { |
||
72 | if (empty($config_cascade['main'][$config_group])) continue; |
||
73 | foreach ($config_cascade['main'][$config_group] as $config_file) { |
||
74 | if (file_exists($config_file)) { |
||
75 | include($config_file); |
||
76 | } |
||
77 | } |
||
78 | } |
||
79 | |||
80 | //prepare license array() |
||
81 | global $license; |
||
82 | $license = array(); |
||
83 | |||
84 | // load the license file(s) |
||
85 | foreach (array('default','local') as $config_group) { |
||
86 | if (empty($config_cascade['license'][$config_group])) continue; |
||
87 | foreach ($config_cascade['license'][$config_group] as $config_file) { |
||
88 | if(file_exists($config_file)){ |
||
89 | include($config_file); |
||
90 | } |
||
91 | } |
||
92 | } |
||
93 | |||
94 | // set timezone (as in pre 5.3.0 days) |
||
95 | date_default_timezone_set(@date_default_timezone_get()); |
||
96 | |||
97 | // define baseURL |
||
98 | if(!defined('DOKU_REL')) define('DOKU_REL',getBaseURL(false)); |
||
0 ignored issues
–
show
|
|||
99 | if(!defined('DOKU_URL')) define('DOKU_URL',getBaseURL(true)); |
||
0 ignored issues
–
show
true is of type boolean , but the function expects a null|string .
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
![]() |
|||
100 | if(!defined('DOKU_BASE')){ |
||
101 | if($conf['canonical']){ |
||
102 | define('DOKU_BASE',DOKU_URL); |
||
103 | }else{ |
||
104 | define('DOKU_BASE',DOKU_REL); |
||
105 | } |
||
106 | } |
||
107 | |||
108 | // define whitespace |
||
109 | if(!defined('NL')) define ('NL',"\n"); |
||
110 | if(!defined('DOKU_LF')) define ('DOKU_LF',"\n"); |
||
111 | if(!defined('DOKU_TAB')) define ('DOKU_TAB',"\t"); |
||
112 | |||
113 | // define cookie and session id, append server port when securecookie is configured FS#1664 |
||
114 | if (!defined('DOKU_COOKIE')) { |
||
115 | $serverPort = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : ''; |
||
116 | define('DOKU_COOKIE', 'DW' . md5(DOKU_REL . (($conf['securecookie']) ? $serverPort : ''))); |
||
117 | unset($serverPort); |
||
118 | } |
||
119 | |||
120 | // define main script |
||
121 | if(!defined('DOKU_SCRIPT')) define('DOKU_SCRIPT','doku.php'); |
||
122 | |||
123 | if(!defined('DOKU_TPL')) { |
||
124 | /** |
||
125 | * @deprecated 2012-10-13 replaced by more dynamic method |
||
126 | * @see tpl_basedir() |
||
127 | */ |
||
128 | define('DOKU_TPL', DOKU_BASE.'lib/tpl/'.$conf['template'].'/'); |
||
129 | } |
||
130 | |||
131 | if(!defined('DOKU_TPLINC')) { |
||
132 | /** |
||
133 | * @deprecated 2012-10-13 replaced by more dynamic method |
||
134 | * @see tpl_incdir() |
||
135 | */ |
||
136 | define('DOKU_TPLINC', DOKU_INC.'lib/tpl/'.$conf['template'].'/'); |
||
137 | } |
||
138 | |||
139 | // make session rewrites XHTML compliant |
||
140 | @ini_set('arg_separator.output', '&'); |
||
141 | |||
142 | // make sure global zlib does not interfere FS#1132 |
||
143 | @ini_set('zlib.output_compression', 'off'); |
||
144 | |||
145 | // increase PCRE backtrack limit |
||
146 | @ini_set('pcre.backtrack_limit', '20971520'); |
||
147 | |||
148 | // enable gzip compression if supported |
||
149 | $httpAcceptEncoding = isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : ''; |
||
150 | $conf['gzip_output'] &= (strpos($httpAcceptEncoding, 'gzip') !== false); |
||
151 | global $ACT; |
||
152 | if ($conf['gzip_output'] && |
||
153 | !defined('DOKU_DISABLE_GZIP_OUTPUT') && |
||
154 | function_exists('ob_gzhandler') && |
||
155 | // Disable compression when a (compressed) sitemap might be delivered |
||
156 | // See https://bugs.dokuwiki.org/index.php?do=details&task_id=2576 |
||
157 | $ACT != 'sitemap') { |
||
158 | ob_start('ob_gzhandler'); |
||
159 | } |
||
160 | |||
161 | // init session |
||
162 | if(!headers_sent() && !defined('NOSESSION')) { |
||
163 | if(!defined('DOKU_SESSION_NAME')) define ('DOKU_SESSION_NAME', "DokuWiki"); |
||
164 | if(!defined('DOKU_SESSION_LIFETIME')) define ('DOKU_SESSION_LIFETIME', 0); |
||
165 | if(!defined('DOKU_SESSION_PATH')) { |
||
166 | $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir']; |
||
167 | define ('DOKU_SESSION_PATH', $cookieDir); |
||
168 | } |
||
169 | if(!defined('DOKU_SESSION_DOMAIN')) define ('DOKU_SESSION_DOMAIN', ''); |
||
170 | |||
171 | // start the session |
||
172 | init_session(); |
||
173 | |||
174 | // load left over messages |
||
175 | if(isset($_SESSION[DOKU_COOKIE]['msg'])) { |
||
176 | $MSG = $_SESSION[DOKU_COOKIE]['msg']; |
||
177 | unset($_SESSION[DOKU_COOKIE]['msg']); |
||
178 | } |
||
179 | } |
||
180 | |||
181 | // don't let cookies ever interfere with request vars |
||
182 | $_REQUEST = array_merge($_GET,$_POST); |
||
183 | |||
184 | // we don't want a purge URL to be digged |
||
185 | if(isset($_REQUEST['purge']) && !empty($_SERVER['HTTP_REFERER'])) unset($_REQUEST['purge']); |
||
186 | |||
187 | // precalculate file creation modes |
||
188 | init_creationmodes(); |
||
189 | |||
190 | // make real paths and check them |
||
191 | init_paths(); |
||
192 | init_files(); |
||
193 | |||
194 | // setup plugin controller class (can be overwritten in preload.php) |
||
195 | global $plugin_controller_class, $plugin_controller; |
||
196 | if (empty($plugin_controller_class)) $plugin_controller_class = dokuwiki\Extension\PluginController::class; |
||
197 | |||
198 | // load libraries |
||
199 | require_once(DOKU_INC.'vendor/autoload.php'); |
||
200 | require_once(DOKU_INC.'inc/load.php'); |
||
201 | |||
202 | // from now on everything is an exception |
||
203 | \dokuwiki\ErrorHandler::register(); |
||
204 | |||
205 | // disable gzip if not available |
||
206 | define('DOKU_HAS_BZIP', function_exists('bzopen')); |
||
207 | define('DOKU_HAS_GZIP', function_exists('gzopen')); |
||
208 | if($conf['compression'] == 'bz2' && !DOKU_HAS_BZIP) { |
||
209 | $conf['compression'] = 'gz'; |
||
210 | } |
||
211 | if($conf['compression'] == 'gz' && !DOKU_HAS_GZIP) { |
||
212 | $conf['compression'] = 0; |
||
213 | } |
||
214 | |||
215 | // input handle class |
||
216 | global $INPUT; |
||
217 | $INPUT = new \dokuwiki\Input\Input(); |
||
218 | |||
219 | // initialize plugin controller |
||
220 | $plugin_controller = new $plugin_controller_class(); |
||
221 | |||
222 | // initialize the event handler |
||
223 | global $EVENT_HANDLER; |
||
224 | $EVENT_HANDLER = new EventHandler(); |
||
225 | |||
226 | $local = $conf['lang']; |
||
227 | Event::createAndTrigger('INIT_LANG_LOAD', $local, 'init_lang', true); |
||
228 | |||
229 | |||
230 | // setup authentication system |
||
231 | if (!defined('NOSESSION')) { |
||
232 | auth_setup(); |
||
233 | } |
||
234 | |||
235 | // setup mail system |
||
236 | mail_setup(); |
||
237 | |||
238 | /** |
||
239 | * Initializes the session |
||
240 | * |
||
241 | * Makes sure the passed session cookie is valid, invalid ones are ignored an a new session ID is issued |
||
242 | * |
||
243 | * @link http://stackoverflow.com/a/33024310/172068 |
||
244 | * @link http://php.net/manual/en/session.configuration.php#ini.session.sid-length |
||
245 | */ |
||
246 | function init_session() { |
||
247 | global $conf; |
||
248 | session_name(DOKU_SESSION_NAME); |
||
249 | session_set_cookie_params( |
||
250 | DOKU_SESSION_LIFETIME, |
||
251 | DOKU_SESSION_PATH, |
||
252 | DOKU_SESSION_DOMAIN, |
||
253 | ($conf['securecookie'] && is_ssl()), |
||
254 | true |
||
255 | ); |
||
256 | |||
257 | // make sure the session cookie contains a valid session ID |
||
258 | if(isset($_COOKIE[DOKU_SESSION_NAME]) && !preg_match('/^[-,a-zA-Z0-9]{22,256}$/', $_COOKIE[DOKU_SESSION_NAME])) { |
||
259 | unset($_COOKIE[DOKU_SESSION_NAME]); |
||
260 | } |
||
261 | |||
262 | session_start(); |
||
263 | } |
||
264 | |||
265 | |||
266 | /** |
||
267 | * Checks paths from config file |
||
268 | */ |
||
269 | function init_paths(){ |
||
270 | global $conf; |
||
271 | |||
272 | $paths = [ |
||
273 | 'datadir' => 'pages', |
||
274 | 'olddir' => 'attic', |
||
275 | 'mediadir' => 'media', |
||
276 | 'mediaolddir' => 'media_attic', |
||
277 | 'metadir' => 'meta', |
||
278 | 'mediametadir' => 'media_meta', |
||
279 | 'cachedir' => 'cache', |
||
280 | 'indexdir' => 'index', |
||
281 | 'lockdir' => 'locks', |
||
282 | 'tmpdir' => 'tmp', |
||
283 | 'logdir' => 'log', |
||
284 | ]; |
||
285 | |||
286 | foreach($paths as $c => $p) { |
||
287 | $path = empty($conf[$c]) ? $conf['savedir'].'/'.$p : $conf[$c]; |
||
288 | $conf[$c] = init_path($path); |
||
289 | if(empty($conf[$c])) |
||
290 | nice_die("The $c ('$p') at $path is not found, isn't accessible or writable. |
||
291 | You should check your config and permission settings. |
||
292 | Or maybe you want to <a href=\"install.php\">run the |
||
293 | installer</a>?"); |
||
294 | } |
||
295 | |||
296 | // path to old changelog only needed for upgrading |
||
297 | $conf['changelog_old'] = init_path( |
||
298 | (isset($conf['changelog'])) ? ($conf['changelog']) : ($conf['savedir'] . '/changes.log') |
||
299 | ); |
||
300 | if ($conf['changelog_old']=='') { unset($conf['changelog_old']); } |
||
301 | // hardcoded changelog because it is now a cache that lives in meta |
||
302 | $conf['changelog'] = $conf['metadir'].'/_dokuwiki.changes'; |
||
303 | $conf['media_changelog'] = $conf['metadir'].'/_media.changes'; |
||
304 | } |
||
305 | |||
306 | /** |
||
307 | * Load the language strings |
||
308 | * |
||
309 | * @param string $langCode language code, as passed by event handler |
||
310 | */ |
||
311 | function init_lang($langCode) { |
||
312 | //prepare language array |
||
313 | global $lang, $config_cascade; |
||
314 | $lang = array(); |
||
315 | |||
316 | //load the language files |
||
317 | require(DOKU_INC.'inc/lang/en/lang.php'); |
||
318 | foreach ($config_cascade['lang']['core'] as $config_file) { |
||
319 | if (file_exists($config_file . 'en/lang.php')) { |
||
320 | include($config_file . 'en/lang.php'); |
||
321 | } |
||
322 | } |
||
323 | |||
324 | if ($langCode && $langCode != 'en') { |
||
325 | if (file_exists(DOKU_INC."inc/lang/$langCode/lang.php")) { |
||
326 | require(DOKU_INC."inc/lang/$langCode/lang.php"); |
||
327 | } |
||
328 | foreach ($config_cascade['lang']['core'] as $config_file) { |
||
329 | if (file_exists($config_file . "$langCode/lang.php")) { |
||
330 | include($config_file . "$langCode/lang.php"); |
||
331 | } |
||
332 | } |
||
333 | } |
||
334 | } |
||
335 | |||
336 | /** |
||
337 | * Checks the existence of certain files and creates them if missing. |
||
338 | */ |
||
339 | function init_files(){ |
||
340 | global $conf; |
||
341 | |||
342 | $files = array($conf['indexdir'].'/page.idx'); |
||
343 | |||
344 | foreach($files as $file){ |
||
345 | if(!file_exists($file)){ |
||
346 | $fh = @fopen($file,'a'); |
||
347 | if($fh){ |
||
348 | fclose($fh); |
||
349 | if($conf['fperm']) chmod($file, $conf['fperm']); |
||
350 | }else{ |
||
351 | nice_die("$file is not writable. Check your permissions settings!"); |
||
352 | } |
||
353 | } |
||
354 | } |
||
355 | } |
||
356 | |||
357 | /** |
||
358 | * Returns absolute path |
||
359 | * |
||
360 | * This tries the given path first, then checks in DOKU_INC. |
||
361 | * Check for accessibility on directories as well. |
||
362 | * |
||
363 | * @author Andreas Gohr <[email protected]> |
||
364 | * |
||
365 | * @param string $path |
||
366 | * |
||
367 | * @return bool|string |
||
368 | */ |
||
369 | function init_path($path){ |
||
370 | // check existence |
||
371 | $p = fullpath($path); |
||
372 | if(!file_exists($p)){ |
||
373 | $p = fullpath(DOKU_INC.$path); |
||
374 | if(!file_exists($p)){ |
||
375 | return ''; |
||
376 | } |
||
377 | } |
||
378 | |||
379 | // check writability |
||
380 | if(!@is_writable($p)){ |
||
381 | return ''; |
||
382 | } |
||
383 | |||
384 | // check accessability (execute bit) for directories |
||
385 | if(@is_dir($p) && !file_exists("$p/.")){ |
||
386 | return ''; |
||
387 | } |
||
388 | |||
389 | return $p; |
||
390 | } |
||
391 | |||
392 | /** |
||
393 | * Sets the internal config values fperm and dperm which, when set, |
||
394 | * will be used to change the permission of a newly created dir or |
||
395 | * file with chmod. Considers the influence of the system's umask |
||
396 | * setting the values only if needed. |
||
397 | */ |
||
398 | function init_creationmodes(){ |
||
399 | global $conf; |
||
400 | |||
401 | // Legacy support for old umask/dmask scheme |
||
402 | unset($conf['dmask']); |
||
403 | unset($conf['fmask']); |
||
404 | unset($conf['umask']); |
||
405 | |||
406 | $conf['fperm'] = false; |
||
407 | $conf['dperm'] = false; |
||
408 | |||
409 | // get system umask, fallback to 0 if none available |
||
410 | $umask = @umask(); |
||
411 | if(!$umask) $umask = 0000; |
||
412 | |||
413 | // check what is set automatically by the system on file creation |
||
414 | // and set the fperm param if it's not what we want |
||
415 | $auto_fmode = $conf['fmode'] & ~$umask; |
||
416 | if($auto_fmode != $conf['fmode']) $conf['fperm'] = $conf['fmode']; |
||
417 | |||
418 | // check what is set automatically by the system on file creation |
||
419 | // and set the dperm param if it's not what we want |
||
420 | $auto_dmode = $conf['dmode'] & ~$umask; |
||
421 | if($auto_dmode != $conf['dmode']) $conf['dperm'] = $conf['dmode']; |
||
422 | } |
||
423 | |||
424 | /** |
||
425 | * Returns the full absolute URL to the directory where |
||
426 | * DokuWiki is installed in (includes a trailing slash) |
||
427 | * |
||
428 | * !! Can not access $_SERVER values through $INPUT |
||
429 | * !! here as this function is called before $INPUT is |
||
430 | * !! initialized. |
||
431 | * |
||
432 | * @author Andreas Gohr <[email protected]> |
||
433 | * |
||
434 | * @param null|string $abs |
||
435 | * |
||
436 | * @return string |
||
437 | */ |
||
438 | function getBaseURL($abs=null){ |
||
439 | global $conf; |
||
440 | //if canonical url enabled always return absolute |
||
441 | if(is_null($abs)) $abs = $conf['canonical']; |
||
442 | |||
443 | if(!empty($conf['basedir'])){ |
||
444 | $dir = $conf['basedir']; |
||
445 | }elseif(substr($_SERVER['SCRIPT_NAME'],-4) == '.php'){ |
||
446 | $dir = dirname($_SERVER['SCRIPT_NAME']); |
||
447 | }elseif(substr($_SERVER['PHP_SELF'],-4) == '.php'){ |
||
448 | $dir = dirname($_SERVER['PHP_SELF']); |
||
449 | }elseif($_SERVER['DOCUMENT_ROOT'] && $_SERVER['SCRIPT_FILENAME']){ |
||
450 | $dir = preg_replace ('/^'.preg_quote($_SERVER['DOCUMENT_ROOT'],'/').'/','', |
||
451 | $_SERVER['SCRIPT_FILENAME']); |
||
452 | $dir = dirname('/'.$dir); |
||
453 | }else{ |
||
454 | $dir = '.'; //probably wrong |
||
455 | } |
||
456 | |||
457 | $dir = str_replace('\\','/',$dir); // bugfix for weird WIN behaviour |
||
458 | $dir = preg_replace('#//+#','/',"/$dir/"); // ensure leading and trailing slashes |
||
459 | |||
460 | //handle script in lib/exe dir |
||
461 | $dir = preg_replace('!lib/exe/$!','',$dir); |
||
462 | |||
463 | //handle script in lib/plugins dir |
||
464 | $dir = preg_replace('!lib/plugins/.*$!','',$dir); |
||
465 | |||
466 | //finish here for relative URLs |
||
467 | if(!$abs) return $dir; |
||
468 | |||
469 | //use config if available, trim any slash from end of baseurl to avoid multiple consecutive slashes in the path |
||
470 | if(!empty($conf['baseurl'])) return rtrim($conf['baseurl'],'/').$dir; |
||
471 | |||
472 | //split hostheader into host and port |
||
473 | if(isset($_SERVER['HTTP_HOST'])){ |
||
474 | $parsed_host = parse_url('http://'.$_SERVER['HTTP_HOST']); |
||
475 | $host = isset($parsed_host['host']) ? $parsed_host['host'] : null; |
||
476 | $port = isset($parsed_host['port']) ? $parsed_host['port'] : null; |
||
477 | }elseif(isset($_SERVER['SERVER_NAME'])){ |
||
478 | $parsed_host = parse_url('http://'.$_SERVER['SERVER_NAME']); |
||
479 | $host = isset($parsed_host['host']) ? $parsed_host['host'] : null; |
||
480 | $port = isset($parsed_host['port']) ? $parsed_host['port'] : null; |
||
481 | }else{ |
||
482 | $host = php_uname('n'); |
||
483 | $port = ''; |
||
484 | } |
||
485 | |||
486 | if(is_null($port)){ |
||
487 | $port = ''; |
||
488 | } |
||
489 | |||
490 | if(!is_ssl()){ |
||
491 | $proto = 'http://'; |
||
492 | if ($port == '80') { |
||
493 | $port = ''; |
||
494 | } |
||
495 | }else{ |
||
496 | $proto = 'https://'; |
||
497 | if ($port == '443') { |
||
498 | $port = ''; |
||
499 | } |
||
500 | } |
||
501 | |||
502 | if($port !== '') $port = ':'.$port; |
||
503 | |||
504 | return $proto.$host.$port.$dir; |
||
505 | } |
||
506 | |||
507 | /** |
||
508 | * Check if accessed via HTTPS |
||
509 | * |
||
510 | * Apache leaves ,$_SERVER['HTTPS'] empty when not available, IIS sets it to 'off'. |
||
511 | * 'false' and 'disabled' are just guessing |
||
512 | * |
||
513 | * @returns bool true when SSL is active |
||
514 | */ |
||
515 | function is_ssl() { |
||
516 | // check if we are behind a reverse proxy |
||
517 | if(isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { |
||
518 | if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { |
||
519 | return true; |
||
520 | } else { |
||
521 | return false; |
||
522 | } |
||
523 | } |
||
524 | if(!isset($_SERVER['HTTPS']) || |
||
525 | preg_match('/^(|off|false|disabled)$/i', $_SERVER['HTTPS'])) { |
||
526 | return false; |
||
527 | } else { |
||
528 | return true; |
||
529 | } |
||
530 | } |
||
531 | |||
532 | /** |
||
533 | * checks it is windows OS |
||
534 | * @return bool |
||
535 | */ |
||
536 | function isWindows() { |
||
537 | return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? true : false; |
||
538 | } |
||
539 | |||
540 | /** |
||
541 | * print a nice message even if no styles are loaded yet. |
||
542 | * |
||
543 | * @param integer|string $msg |
||
544 | */ |
||
545 | function nice_die($msg){ |
||
546 | echo<<<EOT |
||
547 | <!DOCTYPE html> |
||
548 | <html> |
||
549 | <head><title>DokuWiki Setup Error</title></head> |
||
550 | <body style="font-family: Arial, sans-serif"> |
||
551 | <div style="width:60%; margin: auto; background-color: #fcc; |
||
552 | border: 1px solid #faa; padding: 0.5em 1em;"> |
||
553 | <h1 style="font-size: 120%">DokuWiki Setup Error</h1> |
||
554 | <p>$msg</p> |
||
555 | </div> |
||
556 | </body> |
||
557 | </html> |
||
558 | EOT; |
||
559 | if(defined('DOKU_UNITTEST')) { |
||
560 | throw new RuntimeException('nice_die: '.$msg); |
||
561 | } |
||
562 | exit(1); |
||
563 | } |
||
564 | |||
565 | /** |
||
566 | * A realpath() replacement |
||
567 | * |
||
568 | * This function behaves similar to PHP's realpath() but does not resolve |
||
569 | * symlinks or accesses upper directories |
||
570 | * |
||
571 | * @author Andreas Gohr <[email protected]> |
||
572 | * @author <richpageau at yahoo dot co dot uk> |
||
573 | * @link http://php.net/manual/en/function.realpath.php#75992 |
||
574 | * |
||
575 | * @param string $path |
||
576 | * @param bool $exists |
||
577 | * |
||
578 | * @return bool|string |
||
579 | */ |
||
580 | function fullpath($path,$exists=false){ |
||
581 | static $run = 0; |
||
582 | $root = ''; |
||
583 | $iswin = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' || !empty($GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS'])); |
||
584 | |||
585 | // find the (indestructable) root of the path - keeps windows stuff intact |
||
586 | if($path[0] == '/'){ |
||
587 | $root = '/'; |
||
588 | }elseif($iswin){ |
||
589 | // match drive letter and UNC paths |
||
590 | if(preg_match('!^([a-zA-z]:)(.*)!',$path,$match)){ |
||
591 | $root = $match[1].'/'; |
||
592 | $path = $match[2]; |
||
593 | }else if(preg_match('!^(\\\\\\\\[^\\\\/]+\\\\[^\\\\/]+[\\\\/])(.*)!',$path,$match)){ |
||
594 | $root = $match[1]; |
||
595 | $path = $match[2]; |
||
596 | } |
||
597 | } |
||
598 | $path = str_replace('\\','/',$path); |
||
599 | |||
600 | // if the given path wasn't absolute already, prepend the script path and retry |
||
601 | if(!$root){ |
||
602 | $base = dirname($_SERVER['SCRIPT_FILENAME']); |
||
603 | $path = $base.'/'.$path; |
||
604 | if($run == 0){ // avoid endless recursion when base isn't absolute for some reason |
||
605 | $run++; |
||
606 | return fullpath($path,$exists); |
||
607 | } |
||
608 | } |
||
609 | $run = 0; |
||
610 | |||
611 | // canonicalize |
||
612 | $path=explode('/', $path); |
||
613 | $newpath=array(); |
||
614 | foreach($path as $p) { |
||
615 | if ($p === '' || $p === '.') continue; |
||
616 | if ($p==='..') { |
||
617 | array_pop($newpath); |
||
618 | continue; |
||
619 | } |
||
620 | array_push($newpath, $p); |
||
621 | } |
||
622 | $finalpath = $root.implode('/', $newpath); |
||
623 | |||
624 | // check for existence when needed (except when unit testing) |
||
625 | if($exists && !defined('DOKU_UNITTEST') && !file_exists($finalpath)) { |
||
626 | return false; |
||
627 | } |
||
628 | return $finalpath; |
||
629 | } |
||
630 | |||
631 |
It seems like the type of the argument is not accepted by the function/method which you are calling.
In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.
We suggest to add an explicit type cast like in the following example: