Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

install.php

Go to the documentation of this file.
00001 <?php
00009 /***************************************************************************
00010  This program is free software; you can redistribute it and/or
00011  modify it under the terms of the GNU General Public License
00012  as published by the Free Software Foundation; either version 2
00013  of the License, or (at your option) any later version.
00014 
00015  This program is distributed in the hope that it will be useful,
00016  but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  GNU General Public License for more details.
00019 
00020  You should have received a copy of the GNU General Public License
00021  along with this program; if not, write to the Free Software
00022  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00023  ***************************************************************************/
00024 
00025 if(isset($_POST['step']))     $intStep = $_POST['step'];
00026 elseif(isset($_GET['step']))  $intStep = $_GET['step'];
00027 else $intStep = 0;
00028 
00029 /* Steps
00030  * 0 - License Agreement
00031  * 1 - check if config is writeable, check some required phpvars and version and ask for mysql data
00032  * 2 - validate mysql data and ask for first user
00033  * 3 - check for valid first user entries, update config, write config, install db, create first user
00034  * 4 - (for security reasons) try delete install.html and install.php
00035  */
00036 if ( $intStep == 0 )
00037 {
00038     // try to create a Template object
00039     if ( !file_exists('./lib/template.php') || !file_exists('./templates/default/install.html') )
00040     {
00041         echo 'Template Klasse wurde nicht gefunden<br />'.
00042             'Vergewissere dich, dass alle Dateien korrekt hochgeladen wurden und alle Ordner richtig erstellt wurden.<br />'.
00043             'Falls du Hilfe ben&ouml;tigst, kommen in #wdstools im Andaloria Irc';
00044         die();
00045     }
00046     require_once ( './lib/template.php' );
00047     $oStyle = new Template ( './templates/default/' );
00048     $oStyle->addReplacements ( array ( 'TEMPLATES' => $oStyle->getPath(),
00049                                        'STYLE' => 'style.css' ) );
00050     $oStyle->setTemplate ( 'install.html' );
00051     echo trim ( $oStyle->get_area( 'Step0' ) );
00052     die();
00053 }
00054 //-----------------------------------------------------------------------------
00055 elseif ( $intStep == 1 )
00056 {
00057     // 1 - check if config is writeable, check some required phpvars and version and ask for mysql data
00058     $booError = false;
00059     $strRows  = '';
00060 
00061     require_once ( './lib/template.php' );
00062     $oStyle = new Template ( './templates/default/' );
00063     $oStyle->addReplacements ( array ( 'TEMPLATES' => $oStyle->getPath(),
00064                                        'STYLE' => 'style.css' ) );
00065     $oStyle->setTemplate ( 'install.html' );
00066 
00067 
00068     // check if config.php is available and in the right dir
00069     if ( !file_exists ( './conf/config.php' ) )
00070     {
00071         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00072                                            'TITLE' => 'Fehler',
00073                                            'DATA1' => 'Fehlende Datei: <b>./conf/config.php</b>',
00074                                            'DATA2' => '<small>Die Datei fehlt. Bitte kontrolliere, ob du alle Dateien und<br /> Ordner aus dem Archiv richtig entpackt und hochgeladen hast.</small>' ) );
00075         $strRows .= $oStyle->get_area('StepRow');
00076         $booError = true;
00077     }
00078     if ( !is_writable ( './conf/config.php' ) )
00079     {
00080         // config is not writeable, try to change this
00081         if ( !@chmod ( './conf/config.php', 0666 ) )
00082         {
00083             $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00084                                                'TITLE' => 'Fehler',
00085                                                'DATA1' => 'Fehlende Schreibrechte auf <b>./conf/config.php</b>',
00086                                                'DATA2' => '<small>PhpMap hat keine Schreibrechte auf diese Datei.<br />Bitte kontrolliere, ob die Rechte auf 666 gestellt wurden.</small>' ) );
00087             $strRows .= $oStyle->get_area('StepRow');
00088             $booError = true;
00089         };
00090     }
00091 
00092     // check required php version
00093     $strPhpVersion = phpversion();
00094     if ( version_compare ( $strPhpVersion, '4.1.2' ) < 0 )
00095     {
00096         // php is too old
00097         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00098                                            'TITLE' => 'Kritischer Fehler',
00099                                            'DATA1' => 'PHP Version zu alt',
00100                                            'DATA2' => '<small>Die PHP Version '.$strPhpVersion.' ist zu alt. Es wird mindestens 4.1.2 ben&ouml;tigt.</small>' ) );
00101         $strRows .= $oStyle->get_area('StepRow');
00102         $booError = true;
00103     }
00104 
00105     // check if mysql is installed
00106     if ( !extension_loaded ( 'mysql' ) )
00107     {
00108         // only mysql support atm
00109         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00110                                            'TITLE' => 'Kritischer Fehler',
00111                                            'DATA1' => 'MySQL fehlt',
00112                                            'DATA2' => '<small>Auf dem Server ist <a href="http://www.mysql.com" target="_blank">MySQL</a> nicht installiert.<br />Ohne MySQL funktioniert die PhpMap nicht.</small>' ) );
00113         $strRows .= $oStyle->get_area('StepRow');
00114         $booError = true;
00115     }
00116 
00117     // check if gd is installed
00118     if ( !extension_loaded ( 'gd' ) )
00119     {
00120         // only mysql support atm
00121         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #CCCC00;"',
00122                                            'TITLE' => 'Warnung',
00123                                            'DATA1' => 'Gd fehlt',
00124                                            'DATA2' => '<small>Auf dem Server ist <a href="http://www.boutell.com/gd/" target="_blank">Gd</a> nicht installiert.<br />Ohne Gd2 funktioniert die Kartenanzeige nicht.</small>' ) );
00125         $strRows .= $oStyle->get_area('StepRow');
00126     }
00127 
00128     // check file upload (for map data import)
00129     if ( ! (bool)ini_get('file_uploads') )
00130     {
00131         // file uploads disabled
00132         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #aaaa00;"',
00133                                            'TITLE' => 'Hinweis',
00134                                            'DATA1' => 'Fileupload ist abgeschaltet',
00135                                            'DATA2' => '<small>Fileupload wird f&uuml;r den Kartenupload als Quelltextdatei ben&ouml;tigt. Man kann den Quelltext allerdings auch direkt einf&uuml;gen, ohne das Dateiuploadinterface zu nutzen.</small>' ) );
00136         $strRows .= $oStyle->get_area('StepRow');
00137     }
00138 
00139     //-------------------------------------------------------------------------
00140 
00141     if ( $booError )
00142     {
00143         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #AA0000;"',
00144                                            'TITLE' => '<b>Achtung</b>',
00145                                            'DATA1' => 'Es sind Fehler aufgetreten.',
00146                                            'DATA2' => 'Obwohl Fehler aufgetreten sind, kannst du versuchen, die Installation fortzusetzen.<br />Es wird jedoch dringend geraten, sich um die Beseitigung der Fehler zu k&uuml;mmern.' ) );
00147         $strRows .= $oStyle->get_area('StepRow');
00148     }
00149 
00150     $oStyle->addReplacements ( array ( 'ROWS' => $strRows ) );
00151     // ask for mysql data
00152     echo trim ( $oStyle->get_area( 'Step1' ) );
00153     die();
00154 }
00155 //-----------------------------------------------------------------------------
00156 elseif ( $intStep == 2 )
00157 {
00158     // 2 - validate mysql data and ask for first user
00159 
00160     $strRows = '';
00161     $booError   = false;
00162     $booTableWarning = false;
00163 
00164     // template class was validated in step 0, if the user tricks us in faking the _GET Parameter, it's his own fault :)
00165     require_once ( './lib/template.php' );
00166     $oStyle = new Template ( './templates/default/' );
00167     $oStyle->addReplacements ( array ( 'TEMPLATES' => $oStyle->getPath(),
00168                                        'STYLE' => 'style.css' ) );
00169     $oStyle->setTemplate ( 'install.html' );
00170 
00171 
00172     // read mysql _POST data
00173     if ( !isset ( $_POST['sql_host'], $_POST['sql_db'], $_POST['sql_user'], $_POST['sql_pass'] ) )
00174     {
00175         // should not happen
00176         die('SQL Daten nicht &uuml;bergeben.');
00177     }
00178 
00179     $strHost = trim( $_POST['sql_host'] );
00180     $strDB   = trim( $_POST['sql_db'] );
00181     $strUser = trim( $_POST['sql_user'] );
00182     $strPass = trim( $_POST['sql_pass'] );
00183     $strPrefix  = trim( $_POST['sql_prefix'] );
00184 
00185     $aTableNames = array ( $strPrefix.'user', $strPrefix.'actionlog', $strPrefix.'guild', $strPrefix.'map', $strPrefix.'town', $strPrefix.'player' );
00186 
00187     $oStyle->addReplacements( array ( 'SQL_HOST' => $strHost,
00188                                       'SQL_DB' => $strDB,
00189                                       'SQL_USER' => $strUser,
00190                                       'SQL_PREFIX' => $strPrefix,
00191                                       'SQL_PASS' => $strPass ) );
00192 
00193     $sqlLink = @mysql_connect ( $strHost, $strUser, $strPass );
00194     $booMySQL = true;
00195     if ( $sqlLink === false )
00196     {
00197         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00198                                            'TITLE' => 'Kritischer Fehler',
00199                                            'DATA1' => 'MySQL Connect nicht m&ouml;glich.',
00200                                            'DATA2' => '<small>PhpMap konnte keine Verbindung zum MySQL Server aufbauen.<br />MySQL Fehlermeldung:<br /></small>'.mysql_error() ) );
00201         $strRows .= $oStyle->get_area('StepRow');
00202         $booError = true;
00203         $booMySQL = false;
00204     }
00205 
00206     if ( $booMySQL )
00207     {
00208         // only try to select the database and check tables, if connect was possible
00209 
00210         if ( !@mysql_select_db ( $strDB, $sqlLink ) )
00211         {
00212             $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00213                                                'TITLE' => 'Kritischer Fehler',
00214                                                'DATA1' => 'Datenbankfehler',
00215                                                'DATA2' => '<small>PhpMap konnte keine Verbindung zur Datenbank aufbauen.<br />MySQL Fehlermeldung:<br /></small>'.mysql_error() ) );
00216             $strRows .= $oStyle->get_area('StepRow');
00217             $booError = true;
00218         }
00219 
00220         // check if database is empty
00221         $sqlResult = @mysql_query('SHOW TABLES;');
00222         while ( $aRow = @mysql_fetch_array($sqlResult) )
00223         {
00224             if ( in_array ( $aRow[0], $aTableNames ) )
00225             {
00226                 $booTableWarning = true;
00227             }
00228         }
00229     }
00230     if ( $booTableWarning )
00231     {
00232         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00233                                            'TITLE' => 'Warnung',
00234                                            'DATA1' => 'Datenbank nicht leer',
00235                                            'DATA2' => '<small>Die gew&auml;hlte Datenbank ist nicht leer.<br />Es sind Tabellen vorhanden, die denselben Namen verwenden, wie Tabellen der PhpMap.<br />Eine Installation ist daher nicht m&ouml;glich</small>') );
00236         $strRows .= $oStyle->get_area('StepRow');
00237         $booError = true;
00238     }
00239 
00240     if ( $booError )
00241     {
00242         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #AA0000;"',
00243                                            'TITLE' => '<b>Achtung</b>',
00244                                            'DATA1' => 'Es sind Fehler aufgetreten.',
00245                                            'DATA2' => 'Obwohl Fehler aufgetreten sind, kannst du versuchen, die Installation fortzusetzen.<br />Es wird jedoch dringend geraten, sich um die Beseitigung der Fehler zu k&uuml;mmern.' ) );
00246         $strRows .= $oStyle->get_area('StepRow');
00247     }
00248 
00249     $oStyle->addReplacements ( array ( 'ROWS' => $strRows ) );
00250 
00251     // ask for first user
00252     echo trim ( $oStyle->get_area( 'Step2' ) );
00253     die();
00254 }
00255 //-----------------------------------------------------------------------------
00256 elseif ( $intStep == 3 )
00257 {
00258     // 3 - check for valid first user entries, update config, write config, install db, create first user
00259 
00260     $booError   = false;
00261     $booWarning = false;
00262     $strRows    = '';
00263 
00264     // template class was validated in step 0, if the user tricks us in faking the _GET Parameter, it's his own fault :)
00265     require_once ( './lib/template.php' );
00266     $oStyle = new Template ( './templates/default/' );
00267     $oStyle->addReplacements ( array ( 'TEMPLATES' => $oStyle->getPath(),
00268                                        'STYLE' => 'style.css' ) );
00269     $oStyle->setTemplate ( 'install.html' );
00270 
00271 
00272     // read mysql _POST data
00273     if ( !isset ( $_POST['user_name'], $_POST['user_pass'], $_POST['user_x'], $_POST['user_y'], $_POST['server'] ) )
00274     {
00275         // should not happen
00276         die('User Daten nicht &uuml;bergeben.');
00277     }
00278 
00279     $strName   = trim ( $_POST['user_name'] );
00280     $strPass   = trim ( $_POST['user_pass'] );
00281     $intX      = intval ( $_POST['user_x'] );
00282     $intY      = intval ( $_POST['user_y'] );
00283     $intServer = intval ( $_POST['server'] );
00284 
00285     if ( $strName == '' )
00286     {
00287         // @todo error handling
00288         die('Kein Username eingegeben.');
00289     }
00290 
00291     // read mysql _POST data
00292     if ( !isset ( $_POST['sql_host'], $_POST['sql_db'], $_POST['sql_user'], $_POST['sql_pass'], $_POST['sql_prefix'] ) )
00293     {
00294         // should not happen
00295         die('SQL Daten nicht &uuml;bergeben.');
00296     }
00297 
00298     $strSqlHost = trim( $_POST['sql_host'] );
00299     $strSqlDB   = trim( $_POST['sql_db'] );
00300     $strSqlUser = trim( $_POST['sql_user'] );
00301     $strSqlPass = trim( $_POST['sql_pass'] );
00302     $strPrefix  = trim( $_POST['sql_prefix'] );
00303 
00304     //-------------------------------------------------------------------------
00305     // update config
00306     $oStyle->addReplacements( array ( 'SERVER_ID' => $intServer,
00307                                       'SQL_HOST' => $strSqlHost,
00308                                       'SQL_DB' => $strSqlDB,
00309                                       'SQL_USER' => $strSqlUser,
00310                                       'SQL_PREFIX' => $strPrefix,
00311                                       'SQL_PASS' => $strSqlPass ) );
00312     $strConfig = trim( $oStyle->get_area('Config') );
00313 
00314     if ( ( $fp = @fopen('./conf/config.php', 'w' ) ) === false )
00315     {
00316         // should not happen, we checked if config.php is writeable in step 1
00317         die ( 'Konnte <i>./conf/config.php</i> nicht zum schreiben &ouml;ffnen.' );
00318     }
00319     if ( @fwrite ( $fp, $strConfig ) === false )
00320     {
00321         // should not happen, we checked if config.php is writeable in step 1
00322         die ( 'Konnte in <i>./conf/config.php</i> nicht schreiben.' );
00323     }
00324     fclose ( $fp );
00325 
00326     require_once( './conf/config.php' );
00327 
00328 
00329     //-------------------------------------------------------------------------
00330     // sql connect
00331     $sqlLink = @mysql_connect ( $strSqlHost, $strSqlUser, $strSqlPass );
00332     if ( $sqlLink === false )
00333     {
00334         // should not happen, we checked if mysql connect is possible step 2
00335         echo 'MySQL connect nicht möglich<br />'.mysql_error();
00336         die();
00337     }
00338 
00339     if ( !@mysql_select_db ( $strSqlDB, $sqlLink ) )
00340     {
00341         // should not happen, we checked if mysql connect is possible step 2
00342         echo 'Datenbank existiert nicht<br />'.mysql_error();
00343         die();
00344     }
00345 
00346     //-------------------------------------------------------------------------
00347     // create sql tables
00348     $aSqlQueries = explode ( ";\n", str_replace( "\r\n", "\n", $oStyle->get_area( 'Sql' ) ) );
00349     foreach( $aSqlQueries AS $strQuery )
00350     {
00351         $strQuery = trim( $strQuery );
00352         if( $strQuery == '' ) continue;
00353         mysql_query($strQuery);
00354     }
00355 
00356     //-------------------------------------------------------------------------
00357     // create groups
00358     $intServerId = 1;
00359     require_once ( './conf/adminconfig.php' );
00360     // first group: Admin -> all Rights
00361     $strAdmin = '';
00362     foreach ( $aAdminArrays AS $intKey => $strField )
00363     {
00364         $intTmp = 0;
00365         foreach ( $aAdmin[$intKey] AS $strRightName => $intBit )
00366         {
00367             if ( $strRightName == 'banned' || $strRightName == 'limit_view' ) continue;
00368             $intTmp |= $intBit;
00369         }
00370         $strAdmin .= ',' . $strField . "='$intTmp'";
00371     }
00372     mysql_query ( "INSERT INTO ".$strPrefix."usergroup SET usergroup_id='1', name='Admin', created_by='1', created=NOW(), last_update=NOW(), last_update_by='1'$strAdmin;");
00373     $aRightsList = array (
00374                             'User' => array ( 'export_static', 'export_update', 'import_map', 'import_town', 'import_guild', 'guild_list', 'search', 'fight', 'town_add', 'town_del', 'town_edit' ),
00375                             'Gast' => array ( 'search', 'fight', 'limit_view' ),
00376                             'Neuling' => array ( 'import_map', 'import_town', 'import_guild', 'guild_list', 'search', 'fight', 'town_add', 'limit_view' ),
00377                             'Banned' => array ( 'banned' )
00378                          );
00379     foreach ( $aRightsList AS $strGroupName => $aRights )
00380     {
00381         $strAdmin = '';
00382         foreach ( $aAdminArrays AS $intKey => $strField )
00383         {
00384             $intTmp = 0;
00385             foreach ( $aAdmin[$intKey] AS $strRightName => $intBit )
00386             {
00387                 if ( in_array ( $strRightName, $aRights ) )
00388                 {
00389                     $intTmp |= $intBit;
00390                 }
00391             }
00392             $strAdmin .= ',' . $strField . "='$intTmp'";
00393         }
00394         mysql_query ( "INSERT INTO ".$strPrefix."usergroup SET name='$strGroupName', created_by='1', created=NOW(), last_update=NOW(), last_update_by='1'$strAdmin;");
00395     }
00396 
00397 
00398 
00399     //-------------------------------------------------------------------------
00400     // create first user
00401     if ( !@mysql_query ( "INSERT INTO ".$strPrefix."user SET user_id='1', usergroup_id='1', name='$strName', pass=MD5('$strPass'), home_x='$intX', home_y='$intY', created_by='1', created=NOW();") )
00402     {
00403         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00404                                            'TITLE' => '<b>SQL Fehler</b>',
00405                                            'DATA1' => 'User konnte nicht erstellt werden.',
00406                                            'DATA2' => '<small>Der gew&uuml;nschte User "'.$strName.'" konnte nicht erstellt werden.<br />'
00407                                                      .'MySQL Meldung:<br /></small>'.mysql_error() ) );
00408         $strRows .= $oStyle->get_area('StepRow');
00409     }
00410     else
00411     {
00412         // user war successfully created, set cookie
00413         $strPass = md5($strPass);
00414         setcookie ($strCookiePrefix.'[login]', $strName, time()+365*24*60*60);
00415         setcookie ($strCookiePrefix.'[pass]',  $strPass, time()+365*24*60*60);
00416     }
00417 
00418     $oStyle->addReplacements ( array ( 'ROWS' => $strRows ) );
00419 
00420     // show finish
00421     echo trim ( $oStyle->get_area( 'Step3' ) );
00422     die();
00423 }
00424 //-----------------------------------------------------------------------------
00425 elseif ( $intStep == 4 )
00426 {
00427     // 4 - delete install.html and install.php
00428 
00429     $strRows = '';
00430 
00431     // template class was validated in step 0, if the user tricks us in faking the _GET Parameter, it's his own fault :)
00432     require_once ( './lib/template.php' );
00433     $oStyle = new Template ( './templates/default/' );
00434     $oStyle->addReplacements ( array ( 'TEMPLATES' => $oStyle->getPath(),
00435                                        'STYLE' => 'style.css' ) );
00436     $oStyle->setTemplate ( 'install.html' );
00437 
00438     $booError = false;
00439 
00440     if( !is_writable( './templates/default/install.html' ) )
00441     {
00442         // try to chmod the file
00443         @chmod ( './templates/default/install.html', 0666 );
00444     }
00445     if( !is_writable( './install.php' ) )
00446     {
00447         // try to chmod the file
00448         @chmod ( './install.php', 0666 );
00449     }
00450 
00451     if ( !@unlink('./templates/default/install.html') )
00452     {
00453         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00454                                            'TITLE' => 'Fehler',
00455                                            'DATA1' => 'Die Datei <i>/templates/default/install.html</i> konnte nicht gel&ouml;scht werden.',
00456                                            'DATA2' => '<small>Die Datei muss von Hand gel&ouml;scht werden, um PhpMap nutzen zu k&ouml;nnen</small>' ) );
00457         $strRows .= $oStyle->get_area('StepRow');
00458         $booError = true;
00459     }
00460     if ( !@unlink('./install.php') )
00461     {
00462         $oStyle->addReplacements ( array ( 'ROWSTYLE' => ' style="color: #000000; background-color: #FF0000;"',
00463                                            'TITLE' => 'Fehler',
00464                                            'DATA1' => 'Die Datei <i>install.php</i> konnte nicht gel&ouml;scht werden.',
00465                                            'DATA2' => '<small>Die Datei muss von Hand gel&ouml;scht werden, um PhpMap nutzen zu k&ouml;nnen</small>' ) );
00466         $strRows .= $oStyle->get_area('StepRow');
00467         $booError = true;
00468     }
00469 
00470     $oStyle->addReplacements ( array ( 'ROWS' => $strRows,
00471                                        'INSTALL_MSG' => (!$booError ? $oStyle->get_area('Step4Success') : '') ) );
00472 
00473     // show finish
00474     echo trim ( $oStyle->get_area( 'Step4' ) );
00475     die();
00476 }

Generated on Sun May 8 19:29:45 2005 for PhpMap by  doxygen 1.4.2