alecpl
2010-10-09 29983c16711b7eb6828afab8ca87a09eec9f6fe3
commit | author | age
c5042d 1 <form action="index.php?_step=3" method="post">
T 2
3 <h3>Check config files</h3>
354978 4 <?php
T 5
bba657 6 $read_main = is_readable(RCMAIL_CONFIG_DIR.'/main.inc.php');
T 7 $read_db = is_readable(RCMAIL_CONFIG_DIR.'/db.inc.php');
c5042d 8
T 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 }
354978 29
e10712 30 if ($RCI->configured && ($messages = $RCI->check_config())) {
T 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>";
871ca9 72   
T 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   
e10712 86 }
T 87
354978 88 ?>
c5042d 89
308f41 90 <h3>Check if directories are writable</h3>
e019f2 91 <p>Roundcube may need to write/save files into these directories</p>
308f41 92 <?php
T 93
94 if ($RCI->configured) {
95     $pass = false;
b77d0d 96
8ee776 97     $dirs[] = $RCI->config['temp_dir'] ? $RCI->config['temp_dir'] : 'temp';
b77d0d 98     if($RCI->config['log_driver'] != 'syslog')
8ee776 99       $dirs[] = $RCI->config['log_dir'] ? $RCI->config['log_dir'] : 'logs';
b77d0d 100
A 101     foreach ($dirs as $dir) {
8ee776 102         $dirpath = $dir[0] == '/' ? $dir : INSTALL_PATH . $dir;
308f41 103         if (is_writable(realpath($dirpath))) {
T 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
256361 122 <h3>Check DB config</h3>
c5042d 123 <?php
T 124
125 $db_working = false;
308f41 126 if ($RCI->configured) {
9e8e5f 127     if (!empty($RCI->config['db_dsnw'])) {
c5042d 128
9e8e5f 129         $DB = new rcube_mdb2($RCI->config['db_dsnw'], '', false);
c5042d 130         $DB->db_connect('w');
T 131         if (!($db_error_msg = $DB->is_error())) {
132             $RCI->pass('DSN (write)');
190e97 133             echo '<br />';
c5042d 134             $db_working = true;
T 135         }
136         else {
190e97 137             $RCI->fail('DSN (write)', $db_error_msg);
34eab0 138             echo '<p class="hint">Make sure that the configured database exists and that the user has write privileges<br />';
190e97 139             echo 'DSN: ' . $RCI->config['db_dsnw'] . '</p>';
c5042d 140         }
T 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']) {
190e97 152     if (!($success = $RCI->init_db($DB))) {
c5042d 153         $db_working = false;
190e97 154         echo '<p class="warning">Please try to inizialize the database manually as described in the INSTALL guide.
T 155           Make sure that the configured database extists and that the user as write privileges</p>';
c5042d 156     }
T 157 }
158
190e97 159 // test database
c5042d 160 if ($db_working) {
190e97 161     $db_read = $DB->query("SELECT count(*) FROM {$RCI->config['db_table_users']}");
ce16bb 162     if ($DB->db_error) {
c5042d 163         $RCI->fail('DB Schema', "Database not initialized");
T 164         echo '<p><input type="submit" name="initdb" value="Initialize database" /></p>';
871ca9 165         $db_working = false;
c5042d 166     }
2491c6 167     else if ($RCI->db_schema_check($DB, $update = !empty($_POST['updatedb']))) {
871ca9 168         $RCI->fail('DB Schema', "Database schema differs");
27a96a 169         $db_map = array('pgsql' => 'postgres', 'mysqli' => 'mysql', 'sqlsrv' => 'mssql');
A 170         $updatefile = INSTALL_PATH . 'SQL/' . (isset($db_map[$DB->db_provider]) ? $db_map[$DB->db_provider] : $DB->db_provider) . '.update.sql';
233622 171         echo '<p class="warning">Please manually execute the SQL statements from '.$updatefile.' on your database.<br/>';
T 172         echo 'See comments in the file and execute queries that are superscribed with the currently installed version number.</p>';
871ca9 173         $db_working = false;
T 174     }
c5042d 175     else {
T 176         $RCI->pass('DB Schema');
871ca9 177         echo '<br />';
c5042d 178     }
190e97 179 }
T 180
181 // more database tests
182 if ($db_working) {
183     // write test
50e5ee 184     $insert_id = md5(uniqid());
T 185     $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);
186
187     if ($db_write) {
190e97 188       $RCI->pass('DB Write');
50e5ee 189       $DB->query("DELETE FROM {$RCI->config['db_table_session']} WHERE sess_id=?", $insert_id);
190e97 190     }
T 191     else {
192       $RCI->fail('DB Write', $RCI->get_error());
193     }
871ca9 194     echo '<br />';
190e97 195     
T 196     // check timezone settings
c5042d 197     $tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db';
T 198     $tz_db = $DB->query($tz_db);
199     $tz_db = $DB->fetch_assoc($tz_db);
200     $tz_db = (int) $tz_db['tz_db'];
201     $tz_local = (int) time();
202     $tz_diff  = $tz_local - $tz_db;
203
204     // sometimes db and web servers are on separate hosts, so allow a 30 minutes delta
205     if (abs($tz_diff) > 1800) {
206         $RCI->fail('DB Time', "Database time differs {$td_ziff}s from PHP time");
190e97 207     }
T 208     else {
c5042d 209         $RCI->pass('DB Time');
T 210     }
211 }
212
213 ?>
214
256361 215 <h3>Test SMTP config</h3>
ad43e6 216
T 217 <p>
058eb6 218 Server: <?php echo rcube_parse_host($RCI->getprop('smtp_server', 'PHP mail()')); ?><br />
ad43e6 219 Port: <?php echo $RCI->getprop('smtp_port'); ?><br />
fa7539 220
T 221 <?php
222
223 if ($RCI->getprop('smtp_server')) {
224   $user = $RCI->getprop('smtp_user', '(none)');
225   $pass = $RCI->getprop('smtp_pass', '(none)');
226   
227   if ($user == '%u') {
47124c 228     $user_field = new html_inputfield(array('name' => '_smtp_user'));
7635d2 229     $user = $user_field->show($_POST['_smtp_user']);
fa7539 230   }
T 231   if ($pass == '%p') {
47124c 232     $pass_field = new html_passwordfield(array('name' => '_smtp_pass'));
fa7539 233     $pass = $pass_field->show();
T 234   }
235   
236   echo "User: $user<br />";
237   echo "Password: $pass<br />";
238 }
27564f 239
47124c 240 $from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom'));
T 241 $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto'));
fa7539 242
T 243 ?>
ad43e6 244 </p>
T 245
246 <?php
247
256361 248 if (isset($_POST['sendmail'])) {
A 249
ad43e6 250   echo '<p>Trying to send email...<br />';
256361 251
e99991 252   $from = idn_to_ascii(trim($_POST['_from']));
A 253   $to   = idn_to_ascii(trim($_POST['_to']));
2c3d81 254
e99991 255   if (preg_match('/^' . $RCI->email_pattern . '$/i', $from) &&
A 256       preg_match('/^' . $RCI->email_pattern . '$/i', $to)
257   ) {
ad43e6 258     $headers = array(
e99991 259       'From'    => $from,
A 260       'To'      => $to,
e019f2 261       'Subject' => 'Test message from Roundcube',
ad43e6 262     );
T 263
e019f2 264     $body = 'This is a test to confirm that Roundcube can send email.';
ad43e6 265     $smtp_response = array();
e99991 266
fa7539 267     // send mail using configured SMTP server
T 268     if ($RCI->getprop('smtp_server')) {
269       $CONFIG = $RCI->config;
2c3d81 270
7635d2 271       if (!empty($_POST['_smtp_user'])) {
T 272         $CONFIG['smtp_user'] = $_POST['_smtp_user'];
273       }
274       if (!empty($_POST['_smtp_pass'])) {
275         $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
276       }
277
e987db 278       $mail_object  = new Mail_mime();
fa7539 279       $send_headers = $mail_object->headers($headers);
2c3d81 280
A 281       $SMTP = new rcube_smtp();
d1dd13 282       $SMTP->connect(rcube_parse_host($RCI->getprop('smtp_server')),
A 283         $RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']);
2c3d81 284
A 285       $status = $SMTP->send_mail($headers['From'], $headers['To'],
286           ($foo = $mail_object->txtHeaders($send_headers)), $body);
287
288       $smtp_response = $SMTP->get_response();
fa7539 289     }
T 290     else {    // use mail()
291       $header_str = 'From: ' . $headers['From'];
292       
293       if (ini_get('safe_mode'))
294         $status = mail($headers['To'], $headers['Subject'], $body, $header_str);
295       else
296         $status = mail($headers['To'], $headers['Subject'], $body, $header_str, '-f'.$headers['From']);
297       
298       if (!$status)
299         $smtp_response[] = 'Mail delivery with mail() failed. Check your error logs for details';
300     }
ad43e6 301
T 302     if ($status) {
303         $RCI->pass('SMTP send');
304     }
305     else {
306         $RCI->fail('SMTP send', join('; ', $smtp_response));
307     }
308   }
309   else {
310     $RCI->fail('SMTP send', 'Invalid sender or recipient');
311   }
97d659 312   
T 313   echo '</p>';
ad43e6 314 }
T 315
316 ?>
317
318 <table>
319 <tbody>
27564f 320   <tr>
T 321     <td><label for="sendmailfrom">Sender</label></td>
322     <td><?php echo $from_field->show($_POST['_from']); ?></td>
323   </tr>
324   <tr>
325     <td><label for="sendmailto">Recipient</label></td>
326     <td><?php echo $to_field->show($_POST['_to']); ?></td>
327   </tr>
ad43e6 328 </tbody>
T 329 </table>
330
331 <p><input type="submit" name="sendmail" value="Send test mail" /></p>
332
333
256361 334 <h3>Test IMAP config</h3>
27564f 335
T 336 <?php
337
112c54 338 $default_hosts = $RCI->get_hostlist();
T 339 if (!empty($default_hosts)) {
47124c 340   $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost'));
112c54 341   $host_field->add($default_hosts);
T 342 }
343 else {
47124c 344   $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost'));
112c54 345 }
27564f 346
47124c 347 $user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser'));
T 348 $pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass'));
27564f 349
T 350 ?>
351
352 <table>
353 <tbody>
354   <tr>
355     <td><label for="imaphost">Server</label></td>
112c54 356     <td><?php echo $host_field->show($_POST['_host']); ?></td>
27564f 357   </tr>
T 358   <tr>
359     <td>Port</td>
360     <td><?php echo $RCI->getprop('default_port'); ?></td>
361   </tr>
362     <tr>
363       <td><label for="imapuser">Username</label></td>
364       <td><?php echo $user_field->show($_POST['_user']); ?></td>
365     </tr>
366     <tr>
367       <td><label for="imappass">Password</label></td>
368       <td><?php echo $pass_field->show(); ?></td>
369     </tr>
370 </tbody>
371 </table>
372
373 <?php
374
375 if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user'])) {
376   
377   echo '<p>Connecting to ' . Q($_POST['_host']) . '...<br />';
378   
379   $a_host = parse_url($_POST['_host']);
380   if ($a_host['host']) {
381     $imap_host = $a_host['host'];
382     $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
383     $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $CONFIG['default_port']);
384   }
385   else {
386     $imap_host = trim($_POST['_host']);
387     $imap_port = $RCI->getprop('default_port');
388   }
e99991 389
A 390   $imap_host = idn_to_ascii($imap_host);
391   $imap_user = idn_to_ascii($_POST['_user']);
392
27564f 393   $imap = new rcube_imap(null);
e99991 394   if ($imap->connect($imap_host, $imap_user, $_POST['_pass'], $imap_port, $imap_ssl)) {
27564f 395     $RCI->pass('IMAP connect', 'SORT capability: ' . ($imap->get_capability('SORT') ? 'yes' : 'no'));
T 396     $imap->close();
397   }
398   else {
399     $RCI->fail('IMAP connect', $RCI->get_error());
400   }
401 }
402
403 ?>
404
405 <p><input type="submit" name="imaptest" value="Check login" /></p>
c5042d 406
354978 407 </form>
T 408
27564f 409 <hr />
T 410
354978 411 <p class="warning">
T 412
413 After completing the installation and the final tests please <b>remove</b> the whole
8062c0 414 installer folder from the document root of the webserver or make sure that
A 415 enable_installer option in main.inc.php is disabled.<br />
354978 416 <br />
T 417
418 These files may expose sensitive configuration data like server passwords and encryption keys
419 to the public. Make sure you cannot access this installer from your browser.
420
421 </p>