[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / install / etape_chmod.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) {
14 return;
15 }
16
17 if (defined('_TEST_DIRS')) {
18 return;
19 }
20 define('_TEST_DIRS', '1');
21
22 include_spip('inc/minipres');
23 utiliser_langue_visiteur();
24
25 //
26 // Tente d'ecrire
27 //
28 // http://code.spip.net/@test_ecrire
29 function test_ecrire($my_dir) {
30 static $chmod = 0;
31
32 $ok = false;
33 $script = @file_exists('spip_loader.php') ? 'spip_loader.php' : $_SERVER['PHP_SELF'];
34 $self = basename($script);
35 $uid = @fileowner('.');
36 $uid2 = @fileowner($self);
37 $gid = @filegroup('.');
38 $gid2 = @filegroup($self);
39 $perms = @fileperms($self);
40
41 // Comparer l'appartenance d'un fichier cree par PHP
42 // avec celle du script et du repertoire courant
43 if (!$chmod) {
44 @rmdir('test');
45 spip_unlink('test'); // effacer au cas ou
46 @touch('test');
47 if ($uid > 0 && $uid == $uid2 && @fileowner('test') == $uid) {
48 $chmod = 0700;
49 } else {
50 if ($gid > 0 && $gid == $gid2 && @filegroup('test') == $gid) {
51 $chmod = 0770;
52 } else {
53 $chmod = 0777;
54 }
55 }
56 // Appliquer de plus les droits d'acces du script
57 if ($perms > 0) {
58 $perms = ($perms & 0777) | (($perms & 0444) >> 2);
59 $chmod |= $perms;
60 }
61 spip_unlink('test');
62 }
63 $ok = is_dir($my_dir) && is_writable($my_dir);
64
65 return $ok ? $chmod : false;
66 }
67
68 //
69 // tester les droits en ecriture sur les repertoires
70 // rajouter celui passe dans l'url ou celui du source (a l'installation)
71 //
72
73 // http://code.spip.net/@install_etape_chmod_dist
74 function install_etape_chmod_dist() {
75
76 $test_dir = _request('test_dir');
77 $chmod = 0;
78
79 if ($test_dir) {
80 if (substr($test_dir, -1) !== '/') {
81 $test_dir .= '/';
82 }
83 if (!in_array($test_dir, $GLOBALS['test_dirs'])) {
84 $GLOBALS['test_dirs'][] = _DIR_RACINE . $test_dir;
85 }
86 } else {
87 if (!_FILE_CONNECT) {
88 $GLOBALS['test_dirs'][] = _DIR_CONNECT;
89 $GLOBALS['test_dirs'][] = _DIR_CHMOD;
90 }
91 }
92
93 $bad_dirs = array();
94 $absent_dirs = array();
95
96 while (list(, $my_dir) = each($GLOBALS['test_dirs'])) {
97 $test = test_ecrire($my_dir);
98 if (!$test) {
99 $m = preg_replace(',^' . _DIR_RACINE . ',', '', $my_dir);
100 if (@file_exists($my_dir)) {
101 $bad_dirs['<li>' . $m . '</li>'] = 1;
102 } else {
103 $absent_dirs['<li>' . $m . '</li>'] = 1;
104 }
105 } else {
106 $chmod = max($chmod, $test);
107 }
108 }
109
110 if ($bad_dirs or $absent_dirs) {
111 if (!_FILE_CONNECT) {
112 $titre = _T('dirs_preliminaire');
113 $continuer = ' ' . _T('dirs_commencer') . '.';
114 } else {
115 $titre = _T('dirs_probleme_droits');
116 }
117
118
119 $res = "<div align='right'>" . menu_langues('var_lang_ecrire') . "</div>\n";
120
121 if ($bad_dirs) {
122 $res .=
123 _T(
124 'dirs_repertoires_suivants',
125 array('bad_dirs' => join("\n", array_keys($bad_dirs)))
126 ) .
127 '<b>' . _T('login_recharger') . '</b>.';
128 }
129
130 if ($absent_dirs) {
131 $res .=
132 _T(
133 'dirs_repertoires_absents',
134 array('bad_dirs' => join("\n", array_keys($absent_dirs)))
135 ) .
136 '<b>' . _T('login_recharger') . '</b>.';
137 }
138 $res = '<p>' . $continuer . $res . aider('install0', true) . '</p>';
139
140 $t = _T('login_recharger');
141 $t = (!$test_dir ? '' :
142 "<input type='hidden' name='test_dir' value='" . spip_htmlspecialchars($test_dir, ENT_QUOTES) . "' />")
143 . "<input type='hidden' name='etape' value='chmod' />"
144 . "<div style='text-align: right'><input type='submit' value='" . attribut_html($t) . "' /></div>";
145
146 echo minipres($titre, $res . generer_form_ecrire('install', $t));
147 } else {
148 $deja = (_FILE_CONNECT and analyse_fichier_connection(_FILE_CONNECT));
149 if (!$deja) {
150 redirige_url_ecrire('install', 'etape=1&chmod=' . $chmod);
151 } else {
152 redirige_url_ecrire();
153 }
154 }
155 }