$msg
588
1 DOKU_SESSION_LIFETIME ,
261 'путь' => DOKU_SESSION_PATH ,
262 'домен' => DOKU_SESSION_DOMAIN ,
263 'secure' => ($ conf [ 'securecookie' ] && is_ssl ()),
264 'httponly' => правда ,
265 'samesite' => 'Лакс' ,
266 ]);
267
268 // убедитесь, что cookie-файл сеанса содержит действительный идентификатор сеанса
269 если ( isset ($ _COOKIE [ ИМЯ_СЕАНСА_ДОКУ ]) && ! preg_match ( '/^[-,a-zA-Z0-9]{22,256}$/' , $ _COOKIE [ ИМЯ_СЕАНСА_ДОКУ ])) {
270 не установлено ($ _COOKIE [ DOKU_SESSION_NAME ]);
271 }
272
273 session_start ();
274}
275
276
277/**
278* Проверяет пути из файла конфигурации
279*/
280функция init_paths ()
281{
282 глобальная $ conf ;
283
284 $ пути = [
285 'datadir' => 'страницы' ,
286 'olddir' => 'чердак' ,
287 'mediadir' => 'медиа' ,
288 'mediaolddir' => 'media_attic' ,
289 'metadir' => 'мета' ,
290 'mediametadir' => 'media_meta' ,
291 'cachedir' => 'кэш' ,
292 'indexdir' => 'index' ,
293 'lockdir' => 'замки' ,
294 'tmpdir' => 'tmp' ,
295 'logdir' => 'журнал' ,
296 ];
297
298 foreach ($ пути как $ c => $ p ) {
299 $ path = empty ($ conf [$ c ]) ? $ conf [ 'savedir' ] . '/' . $ p : $ conf [$ c ];
300 $ conf [$ c ] = init_path ($ path );
301 если ( пусто ($ conf [$ c ])) {
302 $ path = полный_путь ($ path );
303 nice_die ( " $ c (' $ p ') по адресу $ path не найден, недоступен или недоступен для записи.
304 Вам следует проверить конфигурацию и настройки разрешений.
305 Или, может быть, вы хотите запустить
306 установщик?" );
307 }
308 }
309
310 // путь к старому списку изменений нужен только для обновления
311 $ conf [ 'changelog_old' ] = init_path (
312 $ conf [ 'changelog' ] ?? $ conf [ 'savedir' ] . '/changes.log'
313 );
314 если ($ conf [ 'changelog_old' ] == '' ) {
315 сброшено ($ conf [ 'changelog_old' ]);
316 }
317 // жестко запрограммирован журнал изменений, поскольку теперь это кэш, который находится в метаданных
318 $ conf [ 'changelog' ] = $ conf [ 'metadir' ] . '/_dokuwiki.changes' ;
319 $ conf [ 'media_changelog' ] = $ conf [ 'metadir' ] . '/_media.changes' ;
320}
321
322/**
323* Загрузить языковые строки
324*
325* @param string $ langCode код языка, переданный обработчиком событий
326*/
327функция init_lang ($ langCode )
328{
329 //подготовить языковой массив
330 глобальный $ lang , $ config_cascade ;
331 $ lang = [];
332
333 //загрузить языковые файлы
334 требуется ( DOKU_INC . ' inc / lang / en / lang.php ' );
335 foreach ($ config_cascade [ 'lang' ][ 'core' ] как $ config_file ) {
336 если ( file_exists ($ config_file . ' en / lang.php ' )) {
337 include ( $ config_file.'en / lang.php ' ) ;
338 }
339 }
340
341 if ($ langCode && $ langCode != 'en' ) {
342 if ( file_exists ( DOKU_INC . " inc / lang / $ langCode / lang.php " ) {
343 требуется ( DOKU_INC . " inc / lang / $ langCode / lang.php " );
344 }
345 foreach ($ config_cascade [ 'lang' ][ 'core' ] как $ config_file ) {
346 если ( file_exists ($ config_file . " $ langCode / lang.php " )) {
347 include ($ config_file . " $ langCode / lang.php " );
348 }
349 }
350 }
351}
352
353/**
354* Проверяет наличие определенных файлов и создает их, если они отсутствуют.
355*/
356функция init_files ()
357{
358 глобальная $ conf ;
359
360 $ files = [$ conf [ 'indexdir' ] . '/page.idx' ];
361
362 foreach ($ файлы как $ файл ) {
363 если (! file_exists ($ file )) {
364 $ fh = @ fopen ($ file , 'a' );
365 если ($ фх ) {
366 fclose ($ fh );
367 если ($ conf [ 'fperm' ]) chmod ($ file , $ conf [ 'fperm' ]);
368 } еще {
369 nice_die ( " $ file недоступен для записи. Проверьте настройки прав доступа!" );
370 }
371 }
372 }
373}
374
375/**
376* Возвращает абсолютный путь
377*
378* Сначала проверяется указанный путь, затем DOKU_INC.
379* Проверьте также доступность каталогов.
380*
381* @автор Андреас Гор
382*
383* @param string $ path
384*
385* @return bool | строка
386*/
387функция init_path ($ path )
388{
389 // проверка существования
390 $ p = полный путь ($ path );
391 если (! file_exists ($ p )) {
392 $ p = полный_путь ( DOKU_INC . $ path );
393 если (! file_exists ($ p )) {
394 возвращаться '' ;
395 }
396 }
397
398 // проверка возможности записи
399 если (!@ is_writable ($ p )) {
400 возвращаться '' ;
401 }
402
403 // проверка доступности (бит выполнения) для каталогов
404 если (@is_dir ( $ p ) &&! file_exists ( " $ p /." )) {
405 возвращаться '' ;
406 }
407
408 вернуть $ p ;
409}
410
411/**
412* Устанавливает внутренние значения конфигурации fperm и dperm, которые, если установлены,
413* будет использоваться для изменения разрешения вновь созданного каталога или
414* файл с chmod. Учитывает влияние umask системы
415* установка значений только при необходимости.
416*/
417функция init_creationmodes ()
418{
419 глобальная $ conf ;
420
421 // Устаревшая поддержка старой схемы umask / dmask
422 сброшено ($ conf [ 'dmask' ]);
423 сброшено ($ conf [ 'fmask' ]);
424 не установлено ($ conf [ 'umask' ]);
425
426 $ conf [ 'fperm' ] = false ;
427 $ conf [ 'dperm' ] = false ;
428
429 // получить системную маску umask, вернуться к 0, если она недоступна
430 $ umask = @ umask ();
431 если (!$ umask ) $ umask = 0000 ;
432
433 // проверка того, что автоматически устанавливается системой при создании файла
434 // и устанавливаем параметр fperm, если это не то, что нам нужно
435 $ auto_fmode = 0666 & ~$ umask ;
436 если ($ auto_fmode != $ conf [ 'fmode' ]) $ conf [ 'fperm' ] = $ conf [ 'fmode' ];
437
438 // проверка того, что автоматически устанавливается системой при создании каталога
439 // и устанавливаем параметр dperm, если это не то, что нам нужно.
440 $ auto_dmode = 0777 & ~$ umask ;
441 если ($ auto_dmode != $ conf [ 'dmode' ]) $ conf [ 'dperm' ] = $ conf [ 'dmode' ];
442}
443
444/**
445* Возвращает полный абсолютный URL-адрес каталога, где
446* DokuWiki установлен в (включая завершающий слеш)
447*
448* !! Невозможно получить доступ к значениям $_SERVER через $INPUT
449* !! здесь, поскольку эта функция вызывается до $INPUT
450* !! инициализировано.
451*
452* @автор Андреас Гор
453*
454* @param null | bool $ abs Вернуть абсолютный URL? (по умолчанию null — $conf['canonical'])
455*
456* @возвращаемая строка
457*/
458функция getBaseURL ($ abs = null )
459{
460 глобальная $ conf ;
461
462 $ abs ??= $ conf [ 'канонический' ];
463
464 if (! пусто ($ conf [ 'basedir' ])) {
465 $ dir = $ conf [ 'basedir' ];
466 } elseif ( substr ($ _SERVER [ 'SCRIPT_NAME' ], -4 ) == '.php' ) {
467 $ dir = dirname ($ _SERVER [ 'SCRIPT_NAME' ]);
468 } elseif ( substr ($ _SERVER [ 'PHP_SELF' ], -4 ) == '.php' ) {
469 $ dir = имя_каталога ($ _SERVER [ 'PHP_SELF' ]);
470 } elseif ($ _SERVER [ 'DOCUMENT_ROOT' ] && $ _SERVER [ 'SCRIPT_FILENAME' ]) {
471 $ dir = preg_replace (
472 '/^' . preg_quote ($ _SERVER [ 'DOCUMENT_ROOT' ], '/' ) . '/' ,
473 '' ,
474 $ _SERVER [ 'имя_файла_сценария' ]
475 );
476 $ dir = имя_каталога ( '/' . $ dir );
477 } еще {
478 $ dir = '' ; //возможно, это неверно, но мы предполагаем, что он в корне
479 }
480
481 $ dir = str_replace ( ' \\ ' , '/' , $ dir ); // исправление странного поведения WIN
482 $ dir = preg_replace ( '#//+#' , '/' , "/ $ dir /" ); // гарантируем начальные и конечные слеши
483
484 //обработка скрипта в каталоге lib / exe
485 $ dir = preg_replace ( '! lib / exe /$!' , '' , $ dir );
486
487 //обработка скрипта в каталоге lib / plugins
488 $ dir = preg_replace ( '! lib / plugins /.*$!' , '' , $ dir );
489
490 //завершить здесь для относительных URL-адресов
491 если (!$ abs ) вернуть $ dir ;
492
493 //используйте конфигурацию, если она доступна, обрежьте все слеши в конце baseurl, чтобы избежать нескольких последовательных слешей в пути
494 если (! пусто ($ conf [ 'baseurl' ])) вернуть rtrim ($ conf [ 'baseurl' ], '/' ) . $ dir ;
495
496 //разделить заголовок хоста на хост и порт
497 если ( isset ($ _SERVER [ 'HTTP_HOST' ])) {
498 если (
499 (! пусто ($ conf [ 'trustedproxy' ])) && isset ($ _SERVER [ 'HTTP_X_FORWARDED_HOST' ])
500 && preg_match ( '/' . $ conf [ 'trustedproxy' ]. '/' , $ _SERVER [ 'REMOTE_ADDR' ])
501 ) {
502 $ cur_host = $ _SERVER [ 'HTTP_X_FORWARDED_HOST' ];
503 } еще {
504 $ cur_host = $ _SERVER [ 'HTTP_HOST' ];
505 }
506 $ parsed_host = parse_url ( ' http://' . $cur_host);
507 $host = $parsed_host[' хост '] ?? ' ';
508 $port = $parsed_host[' порт '] ?? ' ';
509 } elseif (isset($_SERVER[' ИМЯ_СЕРВЕРА '])) {
510 $parsed_host = parse_url(' http : //' . $_SERVER['SERVER_NAME']);
511 $ host = $ parsed_host [ 'host' ] ?? '' ;
512 $ port = $ parsed_host [ 'port' ] ?? '' ;
513 } еще {
514 $ host = php_uname ( 'n' );
515 $ порт = '' ;
516 }
517
518 если (! is_ssl ()) {
519 $ proto = ' http://';
520 если ($port == ' 80 ') {
521 $порт = ' ';
522 }
523 } еще {
524 $proto = ' https : //';
525 если ($ порт == '443' ) {
526 $ порт = '' ;
527 }
528 }
529
530 если ($ порт !== '' ) $ порт = ':' . $ порт ;
531
532 return $ proto .$ host .$ port .$ dir ;
533}
534
535/**
536* Проверьте, доступен ли сайт через HTTPS
537*
538* Apache оставляет ,$_SERVER['HTTPS'] пустым, когда он недоступен, IIS устанавливает его в значение «выкл.».
539* «ложь» и «отключено» — это всего лишь предположения
540*
541* @returns bool true, когда SSL активен
542*/
543функция is_ssl ()
544{
545 глобальная $ conf ;
546
547 // проверяем, находимся ли мы за обратным прокси-сервером
548 если (
549 (! пусто ($ conf [ 'trustedproxy' ])) && isset ($ _SERVER [ 'HTTP_X_FORWARDED_PROTO' ])
550 && preg_match ( '/' . $ conf [ 'trustedproxy' ]. '/' , $ _SERVER [ 'REMOTE_ADDR' ])
551 && ($ _SERVER [ 'HTTP_X_FORWARDED_PROTO' ] == 'https' )
552 ) {
553 вернуть истину ;
554 }
555
556 если ( preg_match ( '/^(|выкл|ложь|отключено)$/i' , $ _SERVER [ 'HTTPS' ] ?? 'выкл' )) {
557 вернуть ложь ;
558 }
559
560 вернуть истину ;
561}
562
563/**
564* проверяет, что это ОС Windows
565* @return bool
566*/
567функция isWindows ()
568{
569 return strtoupper ( substr ( PHP_OS , 0 , 3 )) === 'WIN' ;
570}
571
572/**
573* вывести приятное сообщение, даже если ни один стили еще не загружен.
574*
575* @param целое число | строка $ сообщение
576*/
577функция nice_die ($ msg )
578{
579 эхо <<< EOT
580
581
582Ошибка установки DokuWiki
583
584
586 Ошибка установки DokuWiki
587 $ сообщение
588
589тело>
590
591СРВ ;
592 если ( определено ( 'DOKU_UNITTEST' )) {
593 throw new RuntimeException ( 'nice_die: ' . $ msg );
594 }
595 выход ( 1 );
596}
597
598/**
599* Замена realpath()
600*
601* Эта функция ведет себя аналогично функции realpath() в PHP, но не разрешает
602* символические ссылки или доступ к верхним каталогам
603*
604* @автор Андреас Гор
605* @author
606* @ссылка http://php.net/manual/en/function.realpath.php#75992
607*
608* @param string $ path
609* @param bool $ существует
610*
611* @return bool | строка
612*/
613функция полный_путь ($ путь , $ существует = ложь )
614{
615 статический $ run = 0 ;
616 $ корень = '' ;
617 $ iswin = ( isWindows () || ! пусто ($ GLOBALS [ 'DOKU_UNITTEST_ASSUME_WINDOWS' ]));
618
619 // найти (неразрушаемый) корень пути - сохраняет содержимое Windows нетронутым
620 если ($ путь [ 0 ] == '/' ) {
621 $ корень = '/' ;
622 } elseif ($ iswin ) {
623 // сопоставить букву диска и пути UNC
624 если ( preg_match ( '!^([a-zA-z]:)(.*)!' , $ path , $ match )) {
625 $ root = $ match [ 1 ] . '/' ;
626 $ путь = $ совпадение [ 2 ];
627 } elseif ( preg_match ( '!^( \\ \\ \\ \\ [^ \\ \\ /]+ \\ \\ [^ \\ \\ /]+[ \\ \\ /])(.*)!' , $ path , $ match )) {
628 $ корень = $ матч [ 1 ];
629 $ путь = $ совпадение [ 2 ];
630 }
631 }
632 $ path = str_replace ( ' \\ ' , '/' , $ path );
633
634 // если указанный путь еще не был абсолютным, добавьте путь к скрипту и повторите попытку
635 если (!$ корень ) {
636 $ base = dirname ($ _SERVER [ 'SCRIPT_FILENAME' ]);
637 $ path = $ base . '/' .$ path ;
638 if ($ run == 0 ) { // избегаем бесконечной рекурсии, когда база по какой-то причине не является абсолютной
639 $ запустить ++;
640 вернуть полный путь ($ path , $ existences );
641 }
642 }
643 $ запуск = 0 ;
644
645 // канонизировать
646 $ path = взорвать ( '/' , $ path );
647 $ новый_путь = [];
648 foreach ($ path как $ p ) {
649 если ($ p === '' || $ p === '.' ) продолжить ;
650 если ($ p === '..' ) {
651 array_pop ($ newpath );
652 продолжать ;
653 }
654 $ newpath [] = $ p ;
655 }
656 $ окончательный путь = $ корень . implode ( '/' , $ newpath );
657
658 // проверка существования при необходимости (кроме случаев модульного тестирования)
659 если ($ существует && ! определено ( 'DOKU_UNITTEST' ) && ! file_exists ($ finalpath )) {
660 вернуть ложь ;
661 }
662 вернуть $ finalpath ;
663}
664