]> git.donarmstrong.com Git - roundcube.git/blob - installer/test.php
Imported Upstream version 0.2~stable
[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'];
98     if($RCI->config['log_driver'] != 'syslog')
99       $dirs[] = $RCI->config['log_dir'];
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 configured database settings</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 // test database
160 if ($db_working) {
161     $db_read = $DB->query("SELECT count(*) FROM {$RCI->config['db_table_users']}");
162     if (!$db_read) {
163         $RCI->fail('DB Schema', "Database not initialized");
164         echo '<p><input type="submit" name="initdb" value="Initialize database" /></p>';
165         $db_working = false;
166     }
167   /*
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   */
176     else {
177         $RCI->pass('DB Schema');
178         echo '<br />';
179     }
180 }
181
182 // more database tests
183 if ($db_working) {
184     // write test
185     $insert_id = md5(uniqid());
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) {
189       $RCI->pass('DB Write');
190       $DB->query("DELETE FROM {$RCI->config['db_table_session']} WHERE sess_id=?", $insert_id);
191     }
192     else {
193       $RCI->fail('DB Write', $RCI->get_error());
194     }
195     echo '<br />';
196     
197     // check timezone settings
198     $tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db';
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");
208     }
209     else {
210         $RCI->pass('DB Time');
211     }
212 }
213
214 ?>
215
216 <h3>Test SMTP settings</h3>
217
218 <p>
219 Server: <?php echo $RCI->getprop('smtp_server', 'PHP mail()'); ?><br />
220 Port: <?php echo $RCI->getprop('smtp_port'); ?><br />
221
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') {
229     $user_field = new html_inputfield(array('name' => '_smtp_user'));
230     $user = $user_field->show($_POST['_smtp_user']);
231   }
232   if ($pass == '%p') {
233     $pass_field = new html_passwordfield(array('name' => '_smtp_pass'));
234     $pass = $pass_field->show();
235   }
236   
237   echo "User: $user<br />";
238   echo "Password: $pass<br />";
239 }
240
241 $from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom'));
242 $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto'));
243
244 ?>
245 </p>
246
247 <?php
248
249 if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to'])) {
250   
251   require_once 'rcube_smtp.inc';
252   
253   echo '<p>Trying to send email...<br />';
254   
255   if (preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_from'])) &&
256       preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) {
257   
258     $headers = array(
259       'From'    => trim($_POST['_from']),
260       'To'      => trim($_POST['_to']),
261       'Subject' => 'Test message from RoundCube',
262     );
263
264     $body = 'This is a test to confirm that RoundCube can send email.';
265     $smtp_response = array();
266     
267     // send mail using configured SMTP server
268     if ($RCI->getprop('smtp_server')) {
269       $CONFIG = $RCI->config;
270       
271       if (!empty($_POST['_smtp_user'])) {
272         $CONFIG['smtp_user'] = $_POST['_smtp_user'];
273       }
274       if (!empty($_POST['_smtp_pass'])) {
275         $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
276       }
277
278       $mail_object  = new rcube_mail_mime();
279       $send_headers = $mail_object->headers($headers);
280       
281       $status = smtp_mail($headers['From'], $headers['To'],
282           ($foo = $mail_object->txtHeaders($send_headers)),
283           $body, $smtp_response);
284     }
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     }
296
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   }
307   
308   echo '</p>';
309 }
310
311 ?>
312
313 <table>
314 <tbody>
315   <tr>
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>
323 </tbody>
324 </table>
325
326 <p><input type="submit" name="sendmail" value="Send test mail" /></p>
327
328
329 <h3>Test IMAP configuration</h3>
330
331 <?php
332
333 $default_hosts = $RCI->get_hostlist();
334 if (!empty($default_hosts)) {
335   $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost'));
336   $host_field->add($default_hosts);
337 }
338 else {
339   $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost'));
340 }
341
342 $user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser'));
343 $pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass'));
344
345 ?>
346
347 <table>
348 <tbody>
349   <tr>
350     <td><label for="imaphost">Server</label></td>
351     <td><?php echo $host_field->show($_POST['_host']); ?></td>
352   </tr>
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>
398
399 </form>
400
401 <hr />
402
403 <p class="warning">
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>