alecpl
2010-09-25 e019f2d0f2dc2fbfa345ab5d7ae85e67bfdd76b8
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
ad43e6 252   if (preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_from'])) &&
T 253       preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) {
2c3d81 254
ad43e6 255     $headers = array(
7635d2 256       'From'    => trim($_POST['_from']),
T 257       'To'      => trim($_POST['_to']),
e019f2 258       'Subject' => 'Test message from Roundcube',
ad43e6 259     );
T 260
e019f2 261     $body = 'This is a test to confirm that Roundcube can send email.';
ad43e6 262     $smtp_response = array();
fa7539 263     
T 264     // send mail using configured SMTP server
265     if ($RCI->getprop('smtp_server')) {
266       $CONFIG = $RCI->config;
2c3d81 267
7635d2 268       if (!empty($_POST['_smtp_user'])) {
T 269         $CONFIG['smtp_user'] = $_POST['_smtp_user'];
270       }
271       if (!empty($_POST['_smtp_pass'])) {
272         $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
273       }
274
e987db 275       $mail_object  = new Mail_mime();
fa7539 276       $send_headers = $mail_object->headers($headers);
2c3d81 277
A 278       $SMTP = new rcube_smtp();
d1dd13 279       $SMTP->connect(rcube_parse_host($RCI->getprop('smtp_server')),
A 280         $RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']);
2c3d81 281
A 282       $status = $SMTP->send_mail($headers['From'], $headers['To'],
283           ($foo = $mail_object->txtHeaders($send_headers)), $body);
284
285       $smtp_response = $SMTP->get_response();
fa7539 286     }
T 287     else {    // use mail()
288       $header_str = 'From: ' . $headers['From'];
289       
290       if (ini_get('safe_mode'))
291         $status = mail($headers['To'], $headers['Subject'], $body, $header_str);
292       else
293         $status = mail($headers['To'], $headers['Subject'], $body, $header_str, '-f'.$headers['From']);
294       
295       if (!$status)
296         $smtp_response[] = 'Mail delivery with mail() failed. Check your error logs for details';
297     }
ad43e6 298
T 299     if ($status) {
300         $RCI->pass('SMTP send');
301     }
302     else {
303         $RCI->fail('SMTP send', join('; ', $smtp_response));
304     }
305   }
306   else {
307     $RCI->fail('SMTP send', 'Invalid sender or recipient');
308   }
97d659 309   
T 310   echo '</p>';
ad43e6 311 }
T 312
313 ?>
314
315 <table>
316 <tbody>
27564f 317   <tr>
T 318     <td><label for="sendmailfrom">Sender</label></td>
319     <td><?php echo $from_field->show($_POST['_from']); ?></td>
320   </tr>
321   <tr>
322     <td><label for="sendmailto">Recipient</label></td>
323     <td><?php echo $to_field->show($_POST['_to']); ?></td>
324   </tr>
ad43e6 325 </tbody>
T 326 </table>
327
328 <p><input type="submit" name="sendmail" value="Send test mail" /></p>
329
330
256361 331 <h3>Test IMAP config</h3>
27564f 332
T 333 <?php
334
112c54 335 $default_hosts = $RCI->get_hostlist();
T 336 if (!empty($default_hosts)) {
47124c 337   $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost'));
112c54 338   $host_field->add($default_hosts);
T 339 }
340 else {
47124c 341   $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost'));
112c54 342 }
27564f 343
47124c 344 $user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser'));
T 345 $pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass'));
27564f 346
T 347 ?>
348
349 <table>
350 <tbody>
351   <tr>
352     <td><label for="imaphost">Server</label></td>
112c54 353     <td><?php echo $host_field->show($_POST['_host']); ?></td>
27564f 354   </tr>
T 355   <tr>
356     <td>Port</td>
357     <td><?php echo $RCI->getprop('default_port'); ?></td>
358   </tr>
359     <tr>
360       <td><label for="imapuser">Username</label></td>
361       <td><?php echo $user_field->show($_POST['_user']); ?></td>
362     </tr>
363     <tr>
364       <td><label for="imappass">Password</label></td>
365       <td><?php echo $pass_field->show(); ?></td>
366     </tr>
367 </tbody>
368 </table>
369
370 <?php
371
372 if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user'])) {
373   
374   echo '<p>Connecting to ' . Q($_POST['_host']) . '...<br />';
375   
376   $a_host = parse_url($_POST['_host']);
377   if ($a_host['host']) {
378     $imap_host = $a_host['host'];
379     $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
380     $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $CONFIG['default_port']);
381   }
382   else {
383     $imap_host = trim($_POST['_host']);
384     $imap_port = $RCI->getprop('default_port');
385   }
386   
387   $imap = new rcube_imap(null);
388   if ($imap->connect($imap_host, $_POST['_user'], $_POST['_pass'], $imap_port, $imap_ssl)) {
389     $RCI->pass('IMAP connect', 'SORT capability: ' . ($imap->get_capability('SORT') ? 'yes' : 'no'));
390     $imap->close();
391   }
392   else {
393     $RCI->fail('IMAP connect', $RCI->get_error());
394   }
395 }
396
397 ?>
398
399 <p><input type="submit" name="imaptest" value="Check login" /></p>
c5042d 400
354978 401 </form>
T 402
27564f 403 <hr />
T 404
354978 405 <p class="warning">
T 406
407 After completing the installation and the final tests please <b>remove</b> the whole
8062c0 408 installer folder from the document root of the webserver or make sure that
A 409 enable_installer option in main.inc.php is disabled.<br />
354978 410 <br />
T 411
412 These files may expose sensitive configuration data like server passwords and encryption keys
413 to the public. Make sure you cannot access this installer from your browser.
414
415 </p>