install/includes/stages/database_postgresql.php
changeset 348 87e08a6e4fec
child 404 fb4f9e6f378f
equal deleted inserted replaced
347:299a90e28abc 348:87e08a6e4fec
       
     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         &bull; <?php echo $lang->get('database_objective_test'); ?><br />
       
   443         &bull; <?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