|
1 <?php |
|
2 |
|
3 /* |
|
4 * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between |
|
5 * Version 1.1.1 |
|
6 * Copyright (C) 2006-2007 Dan Fuhry |
|
7 * Installation package |
|
8 * database_postgresql.php - Installer database info page, PostgreSQL |
|
9 * |
|
10 * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License |
|
11 * as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. |
|
12 * |
|
13 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied |
|
14 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. |
|
15 */ |
|
16 |
|
17 if ( !defined('IN_ENANO_INSTALL') ) |
|
18 die(); |
|
19 |
|
20 if ( isset($_POST['_cont']) ) |
|
21 { |
|
22 $allow_go = true; |
|
23 // Do we have everything? If so, continue with installation. |
|
24 foreach ( array('db_host', 'db_name', 'db_user', 'db_pass') as $field ) |
|
25 { |
|
26 if ( empty($_POST[$field]) ) |
|
27 { |
|
28 $allow_go = false; |
|
29 } |
|
30 } |
|
31 if ( $allow_go ) |
|
32 { |
|
33 require( ENANO_ROOT . '/install/includes/stages/database_post.php' ); |
|
34 return true; |
|
35 } |
|
36 } |
|
37 |
|
38 if ( isset($_POST['ajax_test']) ) |
|
39 { |
|
40 // Test the database connection |
|
41 $return = array( |
|
42 'can_install' => false, |
|
43 'host_good' => true, |
|
44 'creating_user' => false, |
|
45 'db_exist' => false, |
|
46 'creating_db' => false, |
|
47 'creating_db_grant' => false, |
|
48 'root_fail' => false, |
|
49 'version' => array( |
|
50 'version' => 'unknown', |
|
51 'good' => 'indeterminate' |
|
52 ), |
|
53 'last_error' => '' |
|
54 ); |
|
55 |
|
56 if ( !isset($_POST['info']) ) |
|
57 die(); |
|
58 |
|
59 $info = $_POST['info']; |
|
60 |
|
61 // From here on out will be JSON responses |
|
62 header('Content-type: application/json'); |
|
63 |
|
64 try |
|
65 { |
|
66 $info = @enano_json_decode($info); |
|
67 } |
|
68 catch ( Zend_Json_Exception $e ) |
|
69 { |
|
70 die(enano_json_encode(array( |
|
71 'mode' => 'error', |
|
72 'error' => 'Exception in JSON decoder' |
|
73 ))); |
|
74 } |
|
75 |
|
76 // Try to connect as the normal user |
|
77 // generate connection string |
|
78 $conn_string = "dbname = '" . addslashes($info['db_name']) . "' port = '5432' host = '" . addslashes($info['db_host']) . "' " . |
|
79 "user= '" . addslashes($info['db_user']) . "' password = '" . addslashes($info['db_pass']) . "'"; |
|
80 $test = @pg_connect($conn_string); |
|
81 if ( !$test ) |
|
82 { |
|
83 // Connection as normal user failed. PgSQL doesn't give us an error string so |
|
84 // just try to connect as root. If even that fails, exit with an error |
|
85 $return['creating_user'] = true; |
|
86 if ( !empty($info['db_root_user']) && !empty($info['db_root_pass']) ) |
|
87 { |
|
88 $conn_string_root = "dbname = '" . addslashes($info['db_name']) . "' port = '5432' host = '" . addslashes($info['db_host']) . "' " . |
|
89 "user= '" . addslashes($info['db_root_user']) . "' password = '" . addslashes($info['db_root_pass']) . "'"; |
|
90 // Attempt connection as root |
|
91 $test_root = @pg_connect($conn_string_root); |
|
92 if ( !$test_root ) |
|
93 { |
|
94 $return['root_fail'] = true; |
|
95 } |
|
96 else |
|
97 { |
|
98 $return['can_install'] = true; |
|
99 } |
|
100 } |
|
101 } |
|
102 else |
|
103 { |
|
104 $return['can_install'] = true; |
|
105 } |
|
106 |
|
107 $did_version_check = false; |
|
108 |
|
109 if ( isset($test) && @is_resource($test) ) |
|
110 { |
|
111 $server_info = @pg_version($test); |
|
112 if ( isset($server_info['server']) ) |
|
113 { |
|
114 $did_version_check = true; |
|
115 $return['version'] = array( |
|
116 'version' => $server_info['server'], |
|
117 'good' => ( version_compare($server_info['server'], '8.2.5', '>=') ) |
|
118 ); |
|
119 } |
|
120 @pg_close($test); |
|
121 } |
|
122 |
|
123 if ( isset($test_root) && @is_resource($test_root) ) |
|
124 { |
|
125 $server_info = @pg_version($test_root); |
|
126 if ( isset($server_info['server']) ) |
|
127 { |
|
128 $did_version_check = true; |
|
129 $return['version'] = array( |
|
130 'version' => $server_info['server'], |
|
131 'good' => ( version_compare($server_info['server'], '8.2.5', '>=') ) |
|
132 ); |
|
133 } |
|
134 @pg_close($test_root); |
|
135 } |
|
136 |
|
137 if ( !$did_version_check ) |
|
138 { |
|
139 $return['version'] = array( |
|
140 'version' => 'indeterminate', |
|
141 'good' => false |
|
142 ); |
|
143 } |
|
144 else |
|
145 { |
|
146 if ( !$return['version']['good'] ) |
|
147 { |
|
148 $return['can_install'] = false; |
|
149 } |
|
150 } |
|
151 |
|
152 echo enano_json_encode($return); |
|
153 |
|
154 exit(); |
|
155 } |
|
156 |
|
157 $ui->add_header('<script type="text/javascript" src="includes/js/formutils.js"></script>'); |
|
158 $ui->show_header(); |
|
159 |
|
160 ?> |
|
161 |
|
162 <script type="text/javascript"> |
|
163 |
|
164 var img_bad = '../images/bad.gif'; |
|
165 var img_good = '../images/good.gif'; |
|
166 var img_neu = '../images/unknown.gif'; |
|
167 |
|
168 var tested = false; |
|
169 |
|
170 function verify(field) |
|
171 { |
|
172 if ( tested && !field ) |
|
173 return true; |
|
174 tested = false; |
|
175 if ( document.getElementById('verify_error').className != '' ) |
|
176 { |
|
177 document.getElementById('verify_error').className = ''; |
|
178 document.getElementById('verify_error').innerHTML = ''; |
|
179 } |
|
180 var frm = document.forms.database_info; |
|
181 // List of fields |
|
182 var fields = { |
|
183 db_host: frm.db_host, |
|
184 db_name: frm.db_name, |
|
185 db_user: frm.db_user, |
|
186 db_pass: frm.db_pass, |
|
187 table_prefix: frm.table_prefix, |
|
188 db_root_user: frm.db_root_user, |
|
189 db_root_pass: frm.db_root_pass |
|
190 }; |
|
191 var passed = true; |
|
192 // Main validation |
|
193 if ( field == fields.db_host || !field ) |
|
194 { |
|
195 var matches = fields.db_host.value.match(/^([a-z0-9_-]+)((\.([a-z0-9_-]+))*)?$/); |
|
196 document.getElementById('s_db_host').src = ( matches ) ? img_neu : img_bad; |
|
197 if ( !matches ) |
|
198 passed = false; |
|
199 } |
|
200 if ( field == fields.db_name || !field ) |
|
201 { |
|
202 var matches = fields.db_name.value.match(/^[A-z0-9_-]+$/); |
|
203 document.getElementById('s_db_name').src = ( matches ) ? img_neu : img_bad; |
|
204 if ( !matches ) |
|
205 passed = false; |
|
206 } |
|
207 if ( field == fields.db_user || field == fields.db_pass || !field ) |
|
208 { |
|
209 var matches = fields.db_user.value.match(/^[A-z0-9_-]+$/); |
|
210 document.getElementById('s_db_auth').src = ( matches ) ? img_neu : img_bad; |
|
211 if ( !matches ) |
|
212 passed = false; |
|
213 } |
|
214 if ( field == fields.table_prefix || !field ) |
|
215 { |
|
216 var matches = fields.table_prefix.value.match(/^[a-z0-9_]*$/); |
|
217 document.getElementById('s_table_prefix').src = ( matches ) ? img_good : img_bad; |
|
218 if ( !matches ) |
|
219 passed = false; |
|
220 } |
|
221 if ( field == fields.db_root_user || field == fields.db_root_pass || !field ) |
|
222 { |
|
223 var matches = ( ( fields.db_root_user.value.match(/^[A-z0-9_-]+$/) && fields.db_root_pass.value.match(/^.+$/) ) || fields.db_root_user.value == '' ); |
|
224 document.getElementById('s_db_root').src = ( matches ) ? img_neu : img_bad; |
|
225 if ( !matches ) |
|
226 passed = false; |
|
227 } |
|
228 return passed; |
|
229 } |
|
230 |
|
231 function ajaxTestConnection() |
|
232 { |
|
233 if ( !verify() ) |
|
234 { |
|
235 document.body.scrollTop = 0; |
|
236 new Spry.Effect.Shake('enano-body', {duration: 750}).start(); |
|
237 document.getElementById('verify_error').className = 'error-box-mini'; |
|
238 document.getElementById('verify_error').innerHTML = $lang.get('meta_msg_err_verification'); |
|
239 return false; |
|
240 } |
|
241 install_set_ajax_loading(); |
|
242 |
|
243 var frm = document.forms.database_info; |
|
244 var connection_info = 'info=' + ajaxEscape(toJSONString({ |
|
245 db_host: frm.db_host.value, |
|
246 db_name: frm.db_name.value, |
|
247 db_user: frm.db_user.value, |
|
248 db_pass: frm.db_pass.value, |
|
249 db_root_user: frm.db_root_user.value, |
|
250 db_root_pass: frm.db_root_pass.value |
|
251 })); |
|
252 |
|
253 ajaxPost(scriptPath + '/install/install.php?stage=database', connection_info + '&driver=postgresql&ajax_test=on&language=' + enano_lang_code[ENANO_LANG_ID], function() |
|
254 { |
|
255 if ( ajax.readyState == 4 ) |
|
256 { |
|
257 setTimeout('install_unset_ajax_loading();', 750); |
|
258 // Process response |
|
259 var response = String(ajax.responseText + ''); |
|
260 if ( response.substr(0, 1) != '{' ) |
|
261 { |
|
262 alert('Received an invalid JSON response from the server.'); |
|
263 return false; |
|
264 } |
|
265 response = parseJSON(response); |
|
266 document.getElementById('e_db_host').innerHTML = ''; |
|
267 document.getElementById('e_db_name').innerHTML = ''; |
|
268 document.getElementById('e_db_auth').innerHTML = ''; |
|
269 document.getElementById('e_db_root').innerHTML = ''; |
|
270 if ( response.can_install ) |
|
271 { |
|
272 tested = true; |
|
273 var statuses = ['s_db_host', 's_db_name', 's_db_auth', 's_table_prefix', 's_db_root', 's_pgsql_version']; |
|
274 for ( var i in statuses ) |
|
275 { |
|
276 var img = document.getElementById(statuses[i]); |
|
277 if ( img ) |
|
278 img.src = img_good; |
|
279 } |
|
280 document.getElementById('e_pgsql_version').innerHTML = $lang.get('dbpgsql_msg_info_version_good'); |
|
281 document.getElementById('verify_error').className = 'info-box-mini'; |
|
282 document.getElementById('verify_error').innerHTML = $lang.get('dbpgsql_msg_test_success'); |
|
283 if ( response.creating_db ) |
|
284 { |
|
285 document.getElementById('e_db_name').innerHTML = $lang.get('dbpgsql_msg_warn_creating_db'); |
|
286 } |
|
287 if ( response.creating_user ) |
|
288 { |
|
289 document.getElementById('e_db_auth').innerHTML = $lang.get('dbpgsql_msg_warn_creating_user'); |
|
290 } |
|
291 } |
|
292 else |
|
293 { |
|
294 // Oh dear, oh dear, oh dear, oh dear, oh dear... |
|
295 if ( response.creating_db ) |
|
296 { |
|
297 document.getElementById('e_db_name').innerHTML = $lang.get('dbpgsql_msg_err_dbexist', { pg_error: response.last_error }); |
|
298 document.getElementById('s_db_name').src = img_bad; |
|
299 } |
|
300 if ( response.creating_user ) |
|
301 { |
|
302 document.getElementById('e_db_auth').innerHTML = $lang.get('dbpgsql_msg_err_auth', { pg_error: response.last_error }); |
|
303 document.getElementById('s_db_auth').src = img_bad; |
|
304 } |
|
305 if ( !response.host_good ) |
|
306 { |
|
307 document.getElementById('e_db_host').innerHTML = $lang.get('dbpgsql_msg_err_connect', { db_host: frm.db_host.value, pg_error: response.last_error }); |
|
308 document.getElementById('s_db_host').src = img_bad; |
|
309 } |
|
310 if ( !response.version.good ) |
|
311 { |
|
312 document.getElementById('e_pgsql_version').innerHTML = $lang.get('dbpgsql_msg_err_version', { pg_version: response.version.version }); |
|
313 document.getElementById('s_pgsql_version').src = img_bad; |
|
314 } |
|
315 } |
|
316 } |
|
317 }); |
|
318 } |
|
319 |
|
320 </script> |
|
321 |
|
322 <form action="install.php?stage=database" method="post" name="database_info"> |
|
323 <input type="hidden" name="language" value="<?php echo $lang_id; ?>" /> |
|
324 <input type="hidden" name="driver" value="postgresql" /> |
|
325 |
|
326 <table border="0" cellspacing="0" cellpadding="10" width="100%"> |
|
327 <tr> |
|
328 <td colspan="3" style="text-align: center"> |
|
329 <h3><?php echo $lang->get('dbpgsql_table_title'); ?></h3> |
|
330 </td> |
|
331 </tr> |
|
332 <tr> |
|
333 <td> |
|
334 <b><?php echo $lang->get('dbpgsql_field_hostname_title'); ?></b> |
|
335 <br /><?php echo $lang->get('dbpgsql_field_hostname_body'); ?> |
|
336 <br /><span style="color: #993300" id="e_db_host"></span> |
|
337 </td> |
|
338 <td> |
|
339 <input onkeyup="verify(this);" tabindex="1" name="db_host" size="30" type="text" /> |
|
340 </td> |
|
341 <td> |
|
342 <img id="s_db_host" alt="Good/bad icon" src="../images/bad.gif" /> |
|
343 </td> |
|
344 </tr> |
|
345 <tr> |
|
346 <td> |
|
347 <b><?php echo $lang->get('dbpgsql_field_dbname_title'); ?></b><br /> |
|
348 <?php echo $lang->get('dbpgsql_field_dbname_body'); ?><br /> |
|
349 <span style="color: #993300" id="e_db_name"></span> |
|
350 </td> |
|
351 <td> |
|
352 <input onkeyup="verify(this);" tabindex="2" name="db_name" size="30" type="text" /> |
|
353 </td> |
|
354 <td> |
|
355 <img id="s_db_name" alt="Good/bad icon" src="../images/bad.gif" /> |
|
356 </td> |
|
357 </tr> |
|
358 <tr> |
|
359 <td> |
|
360 <b><?php echo $lang->get('dbpgsql_field_dbauth_title'); ?></b><br /> |
|
361 <?php echo $lang->get('dbpgsql_field_dbauth_body'); ?><br /> |
|
362 <span style="color: #993300" id="e_db_auth"></span> |
|
363 </td> |
|
364 <td> |
|
365 <input onkeyup="verify(this);" tabindex="3" name="db_user" size="30" type="text" /><br /> |
|
366 <br /> |
|
367 <input name="db_pass" size="30" tabindex="4" type="password" /> |
|
368 </td> |
|
369 <td> |
|
370 <img id="s_db_auth" alt="Good/bad icon" src="../images/bad.gif" /> |
|
371 </td> |
|
372 </tr> |
|
373 <tr> |
|
374 <td colspan="3" style="text-align: center"> |
|
375 <h3><?php echo $lang->get('database_heading_optionalinfo'); ?></h3> |
|
376 </td> |
|
377 </tr> |
|
378 <tr> |
|
379 <td> |
|
380 <b><?php echo $lang->get('dbpgsql_field_tableprefix_title'); ?></b><br /> |
|
381 <?php echo $lang->get('dbpgsql_field_tableprefix_body'); ?> |
|
382 </td> |
|
383 <td> |
|
384 <input onkeyup="verify(this);" tabindex="5" name="table_prefix" size="30" type="text" /> |
|
385 </td> |
|
386 <td> |
|
387 <img id="s_table_prefix" alt="Good/bad icon" src="../images/good.gif" /> |
|
388 </td> |
|
389 </tr> |
|
390 <tr> |
|
391 <td> |
|
392 <b><?php echo $lang->get('dbpgsql_field_rootauth_title'); ?></b><br /> |
|
393 <?php echo $lang->get('dbpgsql_field_rootauth_body'); ?><br /> |
|
394 <span style="color: #993300" id="e_db_root"></span> |
|
395 </td> |
|
396 <td> |
|
397 <input onkeyup="verify(this);" tabindex="6" name="db_root_user" size="30" type="text" /><br /> |
|
398 <br /> |
|
399 <input onkeyup="verify(this);" tabindex="7" name="db_root_pass" size="30" type="password" /> |
|
400 </td> |
|
401 <td> |
|
402 <img id="s_db_root" alt="Good/bad icon" src="../images/good.gif" /> |
|
403 </td> |
|
404 </tr> |
|
405 <tr> |
|
406 <td> |
|
407 <b><?php echo $lang->get('dbpgsql_field_pgsqlversion_title'); ?></b> |
|
408 </td> |
|
409 <td id="e_pgsql_version"> |
|
410 <?php echo $lang->get('dbpgsql_field_pgsqlversion_blurb_willbechecked'); ?> |
|
411 </td> |
|
412 <td> |
|
413 <img id="s_pgsql_version" alt="Good/bad icon" src="../images/unknown.gif" /> |
|
414 </td> |
|
415 </tr> |
|
416 <tr> |
|
417 <td> |
|
418 <b><?php echo $lang->get('dbpgsql_field_droptables_title'); ?></b><br /> |
|
419 <?php echo $lang->get('dbpgsql_field_droptables_body'); ?> |
|
420 </td> |
|
421 <td colspan="2"> |
|
422 <input type="checkbox" tabindex="8" name="drop_tables" id="dtcheck" /> <label for="dtcheck"><?php echo $lang->get('dbpgsql_field_droptables_lbl'); ?></label> |
|
423 </td> |
|
424 </tr> |
|
425 <tr> |
|
426 <td colspan="3" style="text-align: center"> |
|
427 <input type="button" value="<?php echo $lang->get('dbpgsql_btn_testconnection'); ?>" onclick="ajaxTestConnection();" /> |
|
428 <div id="verify_error"></div> |
|
429 </td> |
|
430 </tr> |
|
431 |
|
432 </table> |
|
433 |
|
434 <table border="0"> |
|
435 <tr> |
|
436 <td> |
|
437 <input type="submit" tabindex="9" value="<?php echo $lang->get('meta_btn_continue'); ?>" onclick="return verify();" name="_cont" /> |
|
438 </td> |
|
439 <td> |
|
440 <p> |
|
441 <span style="font-weight: bold;"><?php echo $lang->get('meta_lbl_before_continue'); ?></span><br /> |
|
442 • <?php echo $lang->get('database_objective_test'); ?><br /> |
|
443 • <?php echo $lang->get('database_objective_uncrypt'); ?> |
|
444 </p> |
|
445 </td> |
|
446 </tr> |
|
447 </table> |
|
448 |
|
449 </form> |
|
450 |
|
451 <script type="text/javascript"> |
|
452 verify(); |
|
453 </script> |
|
454 |