Mercurial > hg > rc1
comparison installer/test.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1e000243b222 |
---|---|
1 <?php | |
2 | |
3 if (!class_exists('rcmail_install', false) || !is_object($RCI)) { | |
4 die("Not allowed! Please open installer/index.php instead."); | |
5 } | |
6 | |
7 ?> | |
8 <form action="index.php?_step=3" method="post"> | |
9 | |
10 <h3>Check config file</h3> | |
11 <?php | |
12 | |
13 if ($read_config = is_readable(RCUBE_CONFIG_DIR . 'defaults.inc.php')) { | |
14 $config = $RCI->load_config_file(RCUBE_CONFIG_DIR . 'defaults.inc.php'); | |
15 if (!empty($config)) { | |
16 $RCI->pass('defaults.inc.php'); | |
17 } | |
18 else { | |
19 $RCI->fail('defaults.inc.php', 'Syntax error'); | |
20 } | |
21 } | |
22 else { | |
23 $RCI->fail('defaults.inc.php', 'Unable to read default config file?'); | |
24 } | |
25 echo '<br />'; | |
26 | |
27 if ($read_config = is_readable(RCUBE_CONFIG_DIR . 'config.inc.php')) { | |
28 $config = $RCI->load_config_file(RCUBE_CONFIG_DIR . 'config.inc.php'); | |
29 if (!empty($config)) { | |
30 $RCI->pass('config.inc.php'); | |
31 } | |
32 else { | |
33 $RCI->fail('config.inc.php', 'Syntax error'); | |
34 } | |
35 } | |
36 else { | |
37 $RCI->fail('config.inc.php', 'Unable to read file. Did you create the config file?'); | |
38 } | |
39 echo '<br />'; | |
40 | |
41 | |
42 if ($RCI->configured && ($messages = $RCI->check_config())) { | |
43 if (is_array($messages['replaced'])) { | |
44 echo '<h3 class="warning">Replaced config options</h3>'; | |
45 echo '<p class="hint">The following config options have been replaced or renamed. '; | |
46 echo 'Please update them accordingly in your config files.</p>'; | |
47 | |
48 echo '<ul class="configwarings">'; | |
49 foreach ($messages['replaced'] as $msg) { | |
50 echo html::tag('li', null, html::span('propname', $msg['prop']) . | |
51 ' was replaced by ' . html::span('propname', $msg['replacement'])); | |
52 } | |
53 echo '</ul>'; | |
54 } | |
55 | |
56 if (is_array($messages['obsolete'])) { | |
57 echo '<h3>Obsolete config options</h3>'; | |
58 echo '<p class="hint">You still have some obsolete or inexistent properties set. This isn\'t a problem but should be noticed.</p>'; | |
59 | |
60 echo '<ul class="configwarings">'; | |
61 foreach ($messages['obsolete'] as $msg) { | |
62 echo html::tag('li', null, html::span('propname', $msg['prop']) . ($msg['name'] ? ': ' . $msg['name'] : '')); | |
63 } | |
64 echo '</ul>'; | |
65 } | |
66 | |
67 echo '<p class="suggestion">OK, lazy people can download the updated config file here: '; | |
68 echo html::a(array('href' => './?_mergeconfig=1'), 'config.inc.php') . ' '; | |
69 echo "</p>"; | |
70 | |
71 if (is_array($messages['dependencies'])) { | |
72 echo '<h3 class="warning">Dependency check failed</h3>'; | |
73 echo '<p class="hint">Some of your configuration settings require other options to be configured or additional PHP modules to be installed</p>'; | |
74 | |
75 echo '<ul class="configwarings">'; | |
76 foreach ($messages['dependencies'] as $msg) { | |
77 echo html::tag('li', null, html::span('propname', $msg['prop']) . ': ' . $msg['explain']); | |
78 } | |
79 echo '</ul>'; | |
80 } | |
81 } | |
82 | |
83 ?> | |
84 | |
85 <h3>Check if directories are writable</h3> | |
86 <p>Roundcube may need to write/save files into these directories</p> | |
87 <?php | |
88 | |
89 $dirs[] = $RCI->config['temp_dir'] ? $RCI->config['temp_dir'] : 'temp'; | |
90 if ($RCI->config['log_driver'] != 'syslog') | |
91 $dirs[] = $RCI->config['log_dir'] ? $RCI->config['log_dir'] : 'logs'; | |
92 | |
93 foreach ($dirs as $dir) { | |
94 $dirpath = rcube_utils::is_absolute_path($dir) ? $dir : INSTALL_PATH . $dir; | |
95 if (is_writable(realpath($dirpath))) { | |
96 $RCI->pass($dir); | |
97 $pass = true; | |
98 } | |
99 else { | |
100 $RCI->fail($dir, 'not writeable for the webserver'); | |
101 } | |
102 echo '<br />'; | |
103 } | |
104 | |
105 if (!$pass) { | |
106 echo '<p class="hint">Use <tt>chmod</tt> or <tt>chown</tt> to grant write privileges to the webserver</p>'; | |
107 } | |
108 | |
109 ?> | |
110 | |
111 <h3>Check DB config</h3> | |
112 <?php | |
113 | |
114 $db_working = false; | |
115 if ($RCI->configured) { | |
116 if (!empty($RCI->config['db_dsnw'])) { | |
117 $DB = rcube_db::factory($RCI->config['db_dsnw'], '', false); | |
118 $DB->set_debug((bool)$RCI->config['sql_debug']); | |
119 $DB->db_connect('w'); | |
120 | |
121 if (!($db_error_msg = $DB->is_error())) { | |
122 $RCI->pass('DSN (write)'); | |
123 echo '<br />'; | |
124 $db_working = true; | |
125 } | |
126 else { | |
127 $RCI->fail('DSN (write)', $db_error_msg); | |
128 echo '<p class="hint">Make sure that the configured database exists and that the user has write privileges<br />'; | |
129 echo 'DSN: ' . $RCI->config['db_dsnw'] . '</p>'; | |
130 } | |
131 } | |
132 else { | |
133 $RCI->fail('DSN (write)', 'not set'); | |
134 } | |
135 } | |
136 else { | |
137 $RCI->fail('DSN (write)', 'Could not read config file'); | |
138 } | |
139 | |
140 // initialize db with schema found in /SQL/* | |
141 if ($db_working && $_POST['initdb']) { | |
142 if (!($success = $RCI->init_db($DB))) { | |
143 $db_working = false; | |
144 echo '<p class="warning">Please try to inizialize the database manually as described in the INSTALL guide. | |
145 Make sure that the configured database extists and that the user as write privileges</p>'; | |
146 } | |
147 } | |
148 | |
149 else if ($db_working && $_POST['updatedb']) { | |
150 if (!($success = $RCI->update_db($_POST['version']))) { | |
151 echo '<p class="warning">Database schema update failed.</p>'; | |
152 } | |
153 } | |
154 | |
155 // test database | |
156 if ($db_working) { | |
157 $db_read = $DB->query("SELECT count(*) FROM " . $DB->quote_identifier($RCI->config['db_prefix'] . 'users')); | |
158 if ($DB->is_error()) { | |
159 $RCI->fail('DB Schema', "Database not initialized"); | |
160 echo '<p><input type="submit" name="initdb" value="Initialize database" /></p>'; | |
161 $db_working = false; | |
162 } | |
163 else if ($err = $RCI->db_schema_check($DB, $update = !empty($_POST['updatedb']))) { | |
164 $RCI->fail('DB Schema', "Database schema differs"); | |
165 echo '<ul style="margin:0"><li>' . join("</li>\n<li>", $err) . "</li></ul>"; | |
166 $select = $RCI->versions_select(array('name' => 'version')); | |
167 $select->add('0.9 or newer', ''); | |
168 echo '<p class="suggestion">You should run the update queries to get the schema fixed.<br/><br/>Version to update from: ' . $select->show() . ' <input type="submit" name="updatedb" value="Update" /></p>'; | |
169 $db_working = false; | |
170 } | |
171 else { | |
172 $RCI->pass('DB Schema'); | |
173 echo '<br />'; | |
174 } | |
175 } | |
176 | |
177 // more database tests | |
178 if ($db_working) { | |
179 // write test | |
180 $insert_id = md5(uniqid()); | |
181 $db_write = $DB->query("INSERT INTO " . $DB->quote_identifier($RCI->config['db_prefix'] . 'session') | |
182 . " (`sess_id`, `changed`, `ip`, `vars`) VALUES (?, ".$DB->now().", '127.0.0.1', 'foo')", $insert_id); | |
183 | |
184 if ($db_write) { | |
185 $RCI->pass('DB Write'); | |
186 $DB->query("DELETE FROM " . $DB->quote_identifier($RCI->config['db_prefix'] . 'session') | |
187 . " WHERE `sess_id` = ?", $insert_id); | |
188 } | |
189 else { | |
190 $RCI->fail('DB Write', $RCI->get_error()); | |
191 } | |
192 echo '<br />'; | |
193 | |
194 // check timezone settings | |
195 $tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db'; | |
196 $tz_db = $DB->query($tz_db); | |
197 $tz_db = $DB->fetch_assoc($tz_db); | |
198 $tz_db = (int) $tz_db['tz_db']; | |
199 $tz_local = (int) time(); | |
200 $tz_diff = $tz_local - $tz_db; | |
201 | |
202 // sometimes db and web servers are on separate hosts, so allow a 30 minutes delta | |
203 if (abs($tz_diff) > 1800) { | |
204 $RCI->fail('DB Time', "Database time differs {$td_ziff}s from PHP time"); | |
205 } | |
206 else { | |
207 $RCI->pass('DB Time'); | |
208 } | |
209 } | |
210 | |
211 ?> | |
212 | |
213 <h3>Test filetype detection</h3> | |
214 | |
215 <?php | |
216 | |
217 if ($errors = $RCI->check_mime_detection()) { | |
218 $RCI->fail('Fileinfo/mime_content_type configuration'); | |
219 if (!empty($RCI->config['mime_magic'])) { | |
220 echo '<p class="hint">Try setting the <tt>mime_magic</tt> config option to <tt>null</tt>.</p>'; | |
221 } | |
222 else { | |
223 echo '<p class="hint">Check the <a href="http://www.php.net/manual/en/function.finfo-open.php">Fileinfo functions</a> of your PHP installation.<br/>'; | |
224 echo 'The path to the magic.mime file can be set using the <tt>mime_magic</tt> config option in Roundcube.</p>'; | |
225 } | |
226 } | |
227 else { | |
228 $RCI->pass('Fileinfo/mime_content_type configuration'); | |
229 echo "<br/>"; | |
230 } | |
231 | |
232 | |
233 if ($errors = $RCI->check_mime_extensions()) { | |
234 $RCI->fail('Mimetype to file extension mapping'); | |
235 echo '<p class="hint">Please set a valid path to your webserver\'s mime.types file to the <tt>mime_types</tt> config option.<br/>'; | |
236 echo 'If you can\'t find such a file, download it from <a href="http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types">svn.apache.org</a>.</p>'; | |
237 } | |
238 else { | |
239 $RCI->pass('Mimetype to file extension mapping'); | |
240 echo "<br/>"; | |
241 } | |
242 | |
243 ?> | |
244 | |
245 | |
246 <h3>Test SMTP config</h3> | |
247 | |
248 <p> | |
249 Server: <?php echo rcube_utils::parse_host($RCI->getprop('smtp_server', 'localhost')); ?><br /> | |
250 Port: <?php echo $RCI->getprop('smtp_port'); ?><br /> | |
251 | |
252 <?php | |
253 | |
254 if ($RCI->getprop('smtp_server')) { | |
255 $user = $RCI->getprop('smtp_user', '(none)'); | |
256 $pass = $RCI->getprop('smtp_pass', '(none)'); | |
257 | |
258 if ($user == '%u') { | |
259 $user_field = new html_inputfield(array('name' => '_smtp_user')); | |
260 $user = $user_field->show($_POST['_smtp_user']); | |
261 } | |
262 if ($pass == '%p') { | |
263 $pass_field = new html_passwordfield(array('name' => '_smtp_pass')); | |
264 $pass = $pass_field->show(); | |
265 } | |
266 | |
267 echo "User: $user<br />"; | |
268 echo "Password: $pass<br />"; | |
269 } | |
270 | |
271 $from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom')); | |
272 $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto')); | |
273 | |
274 ?> | |
275 </p> | |
276 | |
277 <?php | |
278 | |
279 if (isset($_POST['sendmail'])) { | |
280 | |
281 echo '<p>Trying to send email...<br />'; | |
282 | |
283 $from = idn_to_ascii(trim($_POST['_from'])); | |
284 $to = idn_to_ascii(trim($_POST['_to'])); | |
285 | |
286 if (preg_match('/^' . $RCI->email_pattern . '$/i', $from) && | |
287 preg_match('/^' . $RCI->email_pattern . '$/i', $to) | |
288 ) { | |
289 $headers = array( | |
290 'From' => $from, | |
291 'To' => $to, | |
292 'Subject' => 'Test message from Roundcube', | |
293 ); | |
294 | |
295 $body = 'This is a test to confirm that Roundcube can send email.'; | |
296 | |
297 // send mail using configured SMTP server | |
298 $CONFIG = $RCI->config; | |
299 | |
300 if (!empty($_POST['_smtp_user'])) { | |
301 $CONFIG['smtp_user'] = $_POST['_smtp_user']; | |
302 } | |
303 if (!empty($_POST['_smtp_pass'])) { | |
304 $CONFIG['smtp_pass'] = $_POST['_smtp_pass']; | |
305 } | |
306 | |
307 $mail_object = new Mail_mime(); | |
308 $send_headers = $mail_object->headers($headers); | |
309 $head = $mail_object->txtHeaders($send_headers); | |
310 | |
311 $SMTP = new rcube_smtp(); | |
312 $SMTP->connect(rcube_utils::parse_host($RCI->getprop('smtp_server')), | |
313 $RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']); | |
314 | |
315 $status = $SMTP->send_mail($headers['From'], $headers['To'], $head, $body); | |
316 $smtp_response = $SMTP->get_response(); | |
317 | |
318 if ($status) { | |
319 $RCI->pass('SMTP send'); | |
320 } | |
321 else { | |
322 $RCI->fail('SMTP send', join('; ', $smtp_response)); | |
323 } | |
324 } | |
325 else { | |
326 $RCI->fail('SMTP send', 'Invalid sender or recipient'); | |
327 } | |
328 | |
329 echo '</p>'; | |
330 } | |
331 | |
332 ?> | |
333 | |
334 <table> | |
335 <tbody> | |
336 <tr> | |
337 <td><label for="sendmailfrom">Sender</label></td> | |
338 <td><?php echo $from_field->show($_POST['_from']); ?></td> | |
339 </tr> | |
340 <tr> | |
341 <td><label for="sendmailto">Recipient</label></td> | |
342 <td><?php echo $to_field->show($_POST['_to']); ?></td> | |
343 </tr> | |
344 </tbody> | |
345 </table> | |
346 | |
347 <p><input type="submit" name="sendmail" value="Send test mail" /></p> | |
348 | |
349 | |
350 <h3>Test IMAP config</h3> | |
351 | |
352 <?php | |
353 | |
354 $default_hosts = $RCI->get_hostlist(); | |
355 if (!empty($default_hosts)) { | |
356 $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost')); | |
357 $host_field->add($default_hosts); | |
358 } | |
359 else { | |
360 $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost')); | |
361 } | |
362 | |
363 $user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser')); | |
364 $pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass')); | |
365 | |
366 ?> | |
367 | |
368 <table> | |
369 <tbody> | |
370 <tr> | |
371 <td><label for="imaphost">Server</label></td> | |
372 <td><?php echo $host_field->show($_POST['_host']); ?></td> | |
373 </tr> | |
374 <tr> | |
375 <td>Port</td> | |
376 <td><?php echo $RCI->getprop('default_port'); ?></td> | |
377 </tr> | |
378 <tr> | |
379 <td><label for="imapuser">Username</label></td> | |
380 <td><?php echo $user_field->show($_POST['_user']); ?></td> | |
381 </tr> | |
382 <tr> | |
383 <td><label for="imappass">Password</label></td> | |
384 <td><?php echo $pass_field->show(); ?></td> | |
385 </tr> | |
386 </tbody> | |
387 </table> | |
388 | |
389 <?php | |
390 | |
391 if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user'])) { | |
392 | |
393 echo '<p>Connecting to ' . rcube::Q($_POST['_host']) . '...<br />'; | |
394 | |
395 $imap_host = trim($_POST['_host']); | |
396 $imap_port = $RCI->getprop('default_port'); | |
397 $a_host = parse_url($imap_host); | |
398 | |
399 if ($a_host['host']) { | |
400 $imap_host = $a_host['host']; | |
401 $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null; | |
402 if (isset($a_host['port'])) | |
403 $imap_port = $a_host['port']; | |
404 else if ($imap_ssl && $imap_ssl != 'tls' && (!$imap_port || $imap_port == 143)) | |
405 $imap_port = 993; | |
406 } | |
407 | |
408 $imap_host = idn_to_ascii($imap_host); | |
409 $imap_user = idn_to_ascii($_POST['_user']); | |
410 | |
411 $imap = new rcube_imap(null); | |
412 $imap->set_options(array( | |
413 'auth_type' => $RCI->getprop('imap_auth_type'), | |
414 'debug' => $RCI->getprop('imap_debug'), | |
415 'socket_options' => $RCI->getprop('imap_conn_options'), | |
416 )); | |
417 | |
418 if ($imap->connect($imap_host, $imap_user, $_POST['_pass'], $imap_port, $imap_ssl)) { | |
419 $RCI->pass('IMAP connect', 'SORT capability: ' . ($imap->get_capability('SORT') ? 'yes' : 'no')); | |
420 $imap->close(); | |
421 } | |
422 else { | |
423 $RCI->fail('IMAP connect', $RCI->get_error()); | |
424 } | |
425 } | |
426 | |
427 ?> | |
428 | |
429 <p><input type="submit" name="imaptest" value="Check login" /></p> | |
430 | |
431 </form> | |
432 | |
433 <hr /> | |
434 | |
435 <p class="warning"> | |
436 | |
437 After completing the installation and the final tests please <b>remove</b> the whole | |
438 installer folder from the document root of the webserver or make sure that | |
439 <tt>enable_installer</tt> option in <tt>config.inc.php</tt> is disabled.<br /> | |
440 <br /> | |
441 | |
442 These files may expose sensitive configuration data like server passwords and encryption keys | |
443 to the public. Make sure you cannot access this installer from your browser. | |
444 | |
445 </p> |