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