alecpl
2010-03-12 b9d751df60a8f0126848a976b6c045a790ee36eb
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     }
871ca9 167   /*
T 168     else if (!$RCI->db_schema_check($update = !empty($_POST['updatedb']))) {
169         $RCI->fail('DB Schema', "Database schema differs");
170         
171         echo $update ? '<p class="warning">Failed to update the database schema! Please manually execute the SQL statements from the SQL/*.update.sql file on your database</p>' :
172           '<p><input type="submit" name="updatedb" value="Update schema now" /></p>';
173         $db_working = false;
174     }
175   */
c5042d 176     else {
T 177         $RCI->pass('DB Schema');
871ca9 178         echo '<br />';
c5042d 179     }
190e97 180 }
T 181
182 // more database tests
183 if ($db_working) {
184     // write test
50e5ee 185     $insert_id = md5(uniqid());
T 186     $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);
187
188     if ($db_write) {
190e97 189       $RCI->pass('DB Write');
50e5ee 190       $DB->query("DELETE FROM {$RCI->config['db_table_session']} WHERE sess_id=?", $insert_id);
190e97 191     }
T 192     else {
193       $RCI->fail('DB Write', $RCI->get_error());
194     }
871ca9 195     echo '<br />';
190e97 196     
T 197     // check timezone settings
c5042d 198     $tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db';
T 199     $tz_db = $DB->query($tz_db);
200     $tz_db = $DB->fetch_assoc($tz_db);
201     $tz_db = (int) $tz_db['tz_db'];
202     $tz_local = (int) time();
203     $tz_diff  = $tz_local - $tz_db;
204
205     // sometimes db and web servers are on separate hosts, so allow a 30 minutes delta
206     if (abs($tz_diff) > 1800) {
207         $RCI->fail('DB Time', "Database time differs {$td_ziff}s from PHP time");
190e97 208     }
T 209     else {
c5042d 210         $RCI->pass('DB Time');
T 211     }
212 }
213
214 ?>
215
ad43e6 216 <h3>Test SMTP settings</h3>
T 217
218 <p>
219 Server: <?php echo $RCI->getprop('smtp_server', 'PHP mail()'); ?><br />
220 Port: <?php echo $RCI->getprop('smtp_port'); ?><br />
fa7539 221
T 222 <?php
223
224 if ($RCI->getprop('smtp_server')) {
225   $user = $RCI->getprop('smtp_user', '(none)');
226   $pass = $RCI->getprop('smtp_pass', '(none)');
227   
228   if ($user == '%u') {
47124c 229     $user_field = new html_inputfield(array('name' => '_smtp_user'));
7635d2 230     $user = $user_field->show($_POST['_smtp_user']);
fa7539 231   }
T 232   if ($pass == '%p') {
47124c 233     $pass_field = new html_passwordfield(array('name' => '_smtp_pass'));
fa7539 234     $pass = $pass_field->show();
T 235   }
236   
237   echo "User: $user<br />";
238   echo "Password: $pass<br />";
239 }
27564f 240
47124c 241 $from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom'));
T 242 $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto'));
fa7539 243
T 244 ?>
ad43e6 245 </p>
T 246
247 <?php
248
249 if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to'])) {
250   
251   echo '<p>Trying to send email...<br />';
252   
253   if (preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_from'])) &&
254       preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) {
2c3d81 255
ad43e6 256     $headers = array(
7635d2 257       'From'    => trim($_POST['_from']),
T 258       'To'      => trim($_POST['_to']),
ad43e6 259       'Subject' => 'Test message from RoundCube',
T 260     );
261
262     $body = 'This is a test to confirm that RoundCube can send email.';
263     $smtp_response = array();
fa7539 264     
T 265     // send mail using configured SMTP server
266     if ($RCI->getprop('smtp_server')) {
267       $CONFIG = $RCI->config;
2c3d81 268
7635d2 269       if (!empty($_POST['_smtp_user'])) {
T 270         $CONFIG['smtp_user'] = $_POST['_smtp_user'];
271       }
272       if (!empty($_POST['_smtp_pass'])) {
273         $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
274       }
275
47124c 276       $mail_object  = new rcube_mail_mime();
fa7539 277       $send_headers = $mail_object->headers($headers);
2c3d81 278
A 279       $SMTP = new rcube_smtp();
280       $SMTP->connect();
281
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
27564f 331 <h3>Test IMAP configuration</h3>
T 332
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
408 installer folder from the document root of the webserver.<br />
409 <br />
410
411 These files may expose sensitive configuration data like server passwords and encryption keys
412 to the public. Make sure you cannot access this installer from your browser.
413
414 </p>