thomascube
2010-04-20 23362230b59e89c63743c8d174f0fe11533e59b2
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>
T 91 <p>RoundCube may need to write/save files into these directories</p>
92 <?php
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
c5042d 122 <h3>Check configured database settings</h3>
T 123 <?php
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");
2491c6 169         $updatefile = INSTALL_PATH . 'SQL/' . $DB->db_provider . '.update.sql';
233622 170         echo '<p class="warning">Please manually execute the SQL statements from '.$updatefile.' on your database.<br/>';
T 171         echo 'See comments in the file and execute queries that are superscribed with the currently installed version number.</p>';
871ca9 172         $db_working = false;
T 173     }
c5042d 174     else {
T 175         $RCI->pass('DB Schema');
871ca9 176         echo '<br />';
c5042d 177     }
190e97 178 }
T 179
180 // more database tests
181 if ($db_working) {
182     // write test
50e5ee 183     $insert_id = md5(uniqid());
T 184     $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);
185
186     if ($db_write) {
190e97 187       $RCI->pass('DB Write');
50e5ee 188       $DB->query("DELETE FROM {$RCI->config['db_table_session']} WHERE sess_id=?", $insert_id);
190e97 189     }
T 190     else {
191       $RCI->fail('DB Write', $RCI->get_error());
192     }
871ca9 193     echo '<br />';
190e97 194     
T 195     // check timezone settings
c5042d 196     $tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db';
T 197     $tz_db = $DB->query($tz_db);
198     $tz_db = $DB->fetch_assoc($tz_db);
199     $tz_db = (int) $tz_db['tz_db'];
200     $tz_local = (int) time();
201     $tz_diff  = $tz_local - $tz_db;
202
203     // sometimes db and web servers are on separate hosts, so allow a 30 minutes delta
204     if (abs($tz_diff) > 1800) {
205         $RCI->fail('DB Time', "Database time differs {$td_ziff}s from PHP time");
190e97 206     }
T 207     else {
c5042d 208         $RCI->pass('DB Time');
T 209     }
210 }
211
212 ?>
213
ad43e6 214 <h3>Test SMTP settings</h3>
T 215
216 <p>
217 Server: <?php echo $RCI->getprop('smtp_server', 'PHP mail()'); ?><br />
218 Port: <?php echo $RCI->getprop('smtp_port'); ?><br />
fa7539 219
T 220 <?php
221
222 if ($RCI->getprop('smtp_server')) {
223   $user = $RCI->getprop('smtp_user', '(none)');
224   $pass = $RCI->getprop('smtp_pass', '(none)');
225   
226   if ($user == '%u') {
47124c 227     $user_field = new html_inputfield(array('name' => '_smtp_user'));
7635d2 228     $user = $user_field->show($_POST['_smtp_user']);
fa7539 229   }
T 230   if ($pass == '%p') {
47124c 231     $pass_field = new html_passwordfield(array('name' => '_smtp_pass'));
fa7539 232     $pass = $pass_field->show();
T 233   }
234   
235   echo "User: $user<br />";
236   echo "Password: $pass<br />";
237 }
27564f 238
47124c 239 $from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom'));
T 240 $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto'));
fa7539 241
T 242 ?>
ad43e6 243 </p>
T 244
245 <?php
246
247 if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to'])) {
248   
249   echo '<p>Trying to send email...<br />';
250   
251   if (preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_from'])) &&
252       preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) {
2c3d81 253
ad43e6 254     $headers = array(
7635d2 255       'From'    => trim($_POST['_from']),
T 256       'To'      => trim($_POST['_to']),
ad43e6 257       'Subject' => 'Test message from RoundCube',
T 258     );
259
260     $body = 'This is a test to confirm that RoundCube can send email.';
261     $smtp_response = array();
fa7539 262     
T 263     // send mail using configured SMTP server
264     if ($RCI->getprop('smtp_server')) {
265       $CONFIG = $RCI->config;
2c3d81 266
7635d2 267       if (!empty($_POST['_smtp_user'])) {
T 268         $CONFIG['smtp_user'] = $_POST['_smtp_user'];
269       }
270       if (!empty($_POST['_smtp_pass'])) {
271         $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
272       }
273
e987db 274       $mail_object  = new Mail_mime();
fa7539 275       $send_headers = $mail_object->headers($headers);
2c3d81 276
A 277       $SMTP = new rcube_smtp();
278       $SMTP->connect();
279
280       $status = $SMTP->send_mail($headers['From'], $headers['To'],
281           ($foo = $mail_object->txtHeaders($send_headers)), $body);
282
283       $smtp_response = $SMTP->get_response();
fa7539 284     }
T 285     else {    // use mail()
286       $header_str = 'From: ' . $headers['From'];
287       
288       if (ini_get('safe_mode'))
289         $status = mail($headers['To'], $headers['Subject'], $body, $header_str);
290       else
291         $status = mail($headers['To'], $headers['Subject'], $body, $header_str, '-f'.$headers['From']);
292       
293       if (!$status)
294         $smtp_response[] = 'Mail delivery with mail() failed. Check your error logs for details';
295     }
ad43e6 296
T 297     if ($status) {
298         $RCI->pass('SMTP send');
299     }
300     else {
301         $RCI->fail('SMTP send', join('; ', $smtp_response));
302     }
303   }
304   else {
305     $RCI->fail('SMTP send', 'Invalid sender or recipient');
306   }
97d659 307   
T 308   echo '</p>';
ad43e6 309 }
T 310
311 ?>
312
313 <table>
314 <tbody>
27564f 315   <tr>
T 316     <td><label for="sendmailfrom">Sender</label></td>
317     <td><?php echo $from_field->show($_POST['_from']); ?></td>
318   </tr>
319   <tr>
320     <td><label for="sendmailto">Recipient</label></td>
321     <td><?php echo $to_field->show($_POST['_to']); ?></td>
322   </tr>
ad43e6 323 </tbody>
T 324 </table>
325
326 <p><input type="submit" name="sendmail" value="Send test mail" /></p>
327
328
27564f 329 <h3>Test IMAP configuration</h3>
T 330
331 <?php
332
112c54 333 $default_hosts = $RCI->get_hostlist();
T 334 if (!empty($default_hosts)) {
47124c 335   $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost'));
112c54 336   $host_field->add($default_hosts);
T 337 }
338 else {
47124c 339   $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost'));
112c54 340 }
27564f 341
47124c 342 $user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser'));
T 343 $pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass'));
27564f 344
T 345 ?>
346
347 <table>
348 <tbody>
349   <tr>
350     <td><label for="imaphost">Server</label></td>
112c54 351     <td><?php echo $host_field->show($_POST['_host']); ?></td>
27564f 352   </tr>
T 353   <tr>
354     <td>Port</td>
355     <td><?php echo $RCI->getprop('default_port'); ?></td>
356   </tr>
357     <tr>
358       <td><label for="imapuser">Username</label></td>
359       <td><?php echo $user_field->show($_POST['_user']); ?></td>
360     </tr>
361     <tr>
362       <td><label for="imappass">Password</label></td>
363       <td><?php echo $pass_field->show(); ?></td>
364     </tr>
365 </tbody>
366 </table>
367
368 <?php
369
370 if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user'])) {
371   
372   echo '<p>Connecting to ' . Q($_POST['_host']) . '...<br />';
373   
374   $a_host = parse_url($_POST['_host']);
375   if ($a_host['host']) {
376     $imap_host = $a_host['host'];
377     $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
378     $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $CONFIG['default_port']);
379   }
380   else {
381     $imap_host = trim($_POST['_host']);
382     $imap_port = $RCI->getprop('default_port');
383   }
384   
385   $imap = new rcube_imap(null);
386   if ($imap->connect($imap_host, $_POST['_user'], $_POST['_pass'], $imap_port, $imap_ssl)) {
387     $RCI->pass('IMAP connect', 'SORT capability: ' . ($imap->get_capability('SORT') ? 'yes' : 'no'));
388     $imap->close();
389   }
390   else {
391     $RCI->fail('IMAP connect', $RCI->get_error());
392   }
393 }
394
395 ?>
396
397 <p><input type="submit" name="imaptest" value="Check login" /></p>
c5042d 398
354978 399 </form>
T 400
27564f 401 <hr />
T 402
354978 403 <p class="warning">
T 404
405 After completing the installation and the final tests please <b>remove</b> the whole
406 installer folder from the document root of the webserver.<br />
407 <br />
408
409 These files may expose sensitive configuration data like server passwords and encryption keys
410 to the public. Make sure you cannot access this installer from your browser.
411
412 </p>