]> git.donarmstrong.com Git - roundcube.git/blob - installer/test.php
Imported Upstream version 0.3
[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->db_error) {
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   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']))) {
255
256     $headers = array(
257       'From'    => trim($_POST['_from']),
258       'To'      => trim($_POST['_to']),
259       'Subject' => 'Test message from RoundCube',
260     );
261
262     $body = 'This is a test to confirm that RoundCube can send email.';
263     $smtp_response = array();
264     
265     // send mail using configured SMTP server
266     if ($RCI->getprop('smtp_server')) {
267       $CONFIG = $RCI->config;
268
269       if (!empty($_POST['_smtp_user'])) {
270         $CONFIG['smtp_user'] = $_POST['_smtp_user'];
271       }
272       if (!empty($_POST['_smtp_pass'])) {
273         $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
274       }
275
276       $mail_object  = new rcube_mail_mime();
277       $send_headers = $mail_object->headers($headers);
278
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();
286     }
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     }
298
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   }
309   
310   echo '</p>';
311 }
312
313 ?>
314
315 <table>
316 <tbody>
317   <tr>
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>
325 </tbody>
326 </table>
327
328 <p><input type="submit" name="sendmail" value="Send test mail" /></p>
329
330
331 <h3>Test IMAP configuration</h3>
332
333 <?php
334
335 $default_hosts = $RCI->get_hostlist();
336 if (!empty($default_hosts)) {
337   $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost'));
338   $host_field->add($default_hosts);
339 }
340 else {
341   $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost'));
342 }
343
344 $user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser'));
345 $pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass'));
346
347 ?>
348
349 <table>
350 <tbody>
351   <tr>
352     <td><label for="imaphost">Server</label></td>
353     <td><?php echo $host_field->show($_POST['_host']); ?></td>
354   </tr>
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>
400
401 </form>
402
403 <hr />
404
405 <p class="warning">
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>