Documentation TYPO3 par Ameos

class.tx_install.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2007 Kasper Skaarhoj (kasperYYYY@typo3.com)
00006 *  All rights reserved
00007 *
00008 *  This script is part of the TYPO3 project. The TYPO3 project is
00009 *  free software; you can redistribute it and/or modify
00010 *  it under the terms of the GNU General Public License as published by
00011 *  the Free Software Foundation; either version 2 of the License, or
00012 *  (at your option) any later version.
00013 *
00014 *  The GNU General Public License can be found at
00015 *  http://www.gnu.org/copyleft/gpl.html.
00016 *  A copy is found in the textfile GPL.txt and important notices to the license
00017 *  from the author is found in LICENSE.txt distributed with these scripts.
00018 *
00019 *
00020 *  This script is distributed in the hope that it will be useful,
00021 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00022 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023 *  GNU General Public License for more details.
00024 *
00025 *  This copyright notice MUST APPEAR in all copies of the script!
00026 ***************************************************************/
00151 require_once (PATH_t3lib.'class.t3lib_install.php');
00152 require_once (PATH_t3lib.'class.t3lib_stdgraphic.php');
00153 
00162 class tx_install extends t3lib_install {
00163         var $getGD_start_string='<h2 align="center"><a name="module_gd">gd</a></h2>';   // Used to identify the GD section in the output from phpinfo()
00164         var $getGD_end_string = '</table>';     // Used to identify the end of the GD section (found with getGD_start_string) in the output from phpinfo()
00165         var $getTTF_string = 'with TTF library';        // Used to identify whether TTF-lib is included with GD
00166         var $getTTF_string_alt = 'with freetype';       // Used to identify whether TTF-lib is included with GD
00167         var $action = '';               // The url that calls this script
00168         var $scriptSelf = 'index.php';          // The url that calls this script
00169         var $fontTag2='<span class="bodytext">';
00170         var $fontTag1='<span class="smalltext">';
00171         var $updateIdentity = 'TYPO3 Install Tool';
00172         var $headerStyle ='';
00173         var $contentBeforeTable='';
00174         var $setAllCheckBoxesByDefault=0;
00175 
00176         var $allowFileEditOutsite_typo3conf_dir=0;
00177 
00178         var $INSTALL =array();          // In constructor: is set to global GET/POST var TYPO3_INSTALL
00179         var $checkIMlzw = 0;            // If set, lzw capabilities of the available ImageMagick installs are check by actually writing a gif-file and comparing size
00180         var $checkIM = 0;                       // If set, ImageMagick is checked.
00181         var $dumpImCommands=1;                  // If set, the image Magick commands are always outputted in the image processing checker
00182         var $mode = ''; // If set to "123" then only most vital information is displayed.
00183         var $step = 0;  // If set to 1,2,3 or GO it signifies various functions.
00184 
00185         // internal
00186         var $passwordOK=0;                      // This is set, if the password check was ok. The function init() will exit if this is not set
00187         var $silent=1;                          // If set, the check routines don't add to the message-array
00188         var $messageFunc_nl2br=1;
00189         var $sections=array();          // Used to gather the message information.
00190         var $fatalError=0;                      // This is set if some error occured that will definitely prevent TYpo3 from running.
00191         var $sendNoCacheHeaders=1;
00192         var $config_array = array(      // Flags are set in this array if the options are available and checked ok.
00193                 'gd'=>0,
00194                 'gd_gif'=>0,
00195                 'gd_png'=>0,
00196                 'gd_jpg'=>0,
00197                 'freetype' => 0,
00198                 'safemode' => 0,
00199                 'dir_typo3temp' => 0,
00200                 'dir_temp' => 0,
00201                 'im_versions' => array(),
00202                 'im' => 0,
00203                 'sql.safe_mode_user' => '',
00204                 'mysqlConnect' => 0,
00205                 'no_database' => 0
00206         );
00207         var $typo3temp_path='';
00208 
00209         var $menuitems = array(
00210                 'config' => 'Basic Configuration',
00211                 'database' => 'Database Analyser',
00212                 'update' => 'Update Wizard',
00213                 'images' => 'Image Processing',
00214                 'extConfig' => 'All Configuration',
00215                 'typo3temp' => 'typo3temp/',
00216                 'cleanup' => 'Clean up database',
00217                 'phpinfo' => 'phpinfo()',
00218                 'typo3conf_edit' => 'Edit files in typo3conf/',
00219                 'about' => 'About'
00220         );
00221         var $cookie_name = 'Typo3InstallTool';
00222         var $JSmessage = '';
00223 
00224 
00225 
00226 
00227 
00228 
00234         function tx_install()   {
00235                 parent::t3lib_install();
00236 
00237                 if (!$GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'])  die("Install Tool deactivated.<br />You must enable it by setting a password in typo3conf/localconf.php. If you insert the line below, the password will be 'joh316':<br /><br />\$TYPO3_CONF_VARS['BE']['installToolPassword'] = 'bacb98acf97e0b6112b1d1b650b84971';");
00238 
00239                 if ($this->sendNoCacheHeaders)  {
00240                         header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
00241                         header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
00242                         header('Expires: 0');
00243                         header('Cache-Control: no-cache, must-revalidate');
00244                         header('Pragma: no-cache');
00245                 }
00246 
00247                         // ****************************
00248                         // Initializing incoming vars.
00249                         // ****************************
00250                 $this->INSTALL = t3lib_div::_GP('TYPO3_INSTALL');
00251                 $this->mode = t3lib_div::_GP('mode');
00252                 $this->step = t3lib_div::_GP('step');
00253                 $this->redirect_url = t3lib_div::_GP('redirect_url');
00254 
00255                 if ($_GET['TYPO3_INSTALL']['type'])     {
00256                         $this->INSTALL['type'] = $_GET['TYPO3_INSTALL']['type'];
00257                 }
00258 
00259                 if ($this->step==3)     {
00260                         $this->INSTALL['type']='database';
00261                 }
00262 
00263                 if ($this->mode=='123') {
00264                         $tempItems = $this->menuitems;
00265                         unset($this->menuitems);
00266                         $this->menuitems['config'] = $tempItems['config'];
00267                         $this->menuitems['database'] = $tempItems['database'];
00268                         if (!$this->INSTALL['type'] || !isset($this->menuitems[$this->INSTALL['type']]))        $this->INSTALL['type'] = 'config';
00269                 } else {
00270                         if (!$this->INSTALL['type'] || !isset($this->menuitems[$this->INSTALL['type']]))        $this->INSTALL['type'] = 'about';
00271                 }
00272 
00273                 $this->action = $this->scriptSelf.'?TYPO3_INSTALL[type]='.$this->INSTALL['type'].($this->mode?'&mode='.rawurlencode($this->mode):'').($this->step?'&step='.rawurlencode($this->step):'');
00274                 $this->typo3temp_path = PATH_site.'typo3temp/';
00275 
00276 
00277                         // ****************
00278                         // Check password
00279                         // ****************
00280                         // Getting a unique session key, used to encode the session-access cookie later...
00281                 $uKey = $_COOKIE[$this->cookie_name.'_key'];
00282                 if (!$uKey)     {
00283                         $uKey = md5(uniqid(microtime()));
00284                         SetCookie($this->cookie_name.'_key', $uKey, 0, '/');            // Cookie is set
00285 
00286                         $this->JSmessage='SECURITY:
00287 Make sure to protect the Install Tool with another password than "joh316".
00288 Better yet you can add a die() function call to typo3/install/index.php after usage.
00289 
00290 IF THE INSTALL TOOL CRASHES...
00291 The Install Tool is checking PHPs support for image formats. However certain versions of PHP (fx. 4.3.0 with bundled GD) will crash when trying to read the PNG test file. If this happens you will see a blank screen or error message.
00292 Workaround: Open the file typo3/sysext/install/mod/class.tx_install.php, go to the line where the function "isPNG()" is defined and make it return "0" hardcoded. PNG is not checked anymore and the rest of the Install Tool will work as expected. The same has been known with the other image formats as well. You can use a similar method to bypass the testing if that is also a problem.
00293 On behalf of PHP we regret this inconvenience.
00294 
00295 BTW: This Install Tool will only work if cookies are accepted by your web browser. If this dialog pops up over and over again you didn\'t enable cookies.
00296 ';
00297 
00298                 }
00299                         // Check if the password from TYPO3_CONF_VARS combined with uKey matches the sKey cookie. If not, ask for password.
00300                 $sKey = $_COOKIE[$this->cookie_name];
00301 
00302                 if (md5($GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'].'|'.$uKey) == $sKey || $this->checkPassword($uKey))    {
00303                         $this->passwordOK=1;
00304                         if($this->redirect_url) {
00305                                 header('Location: '.$this->redirect_url);
00306                         }
00307                 } else {
00308                         $this->loginForm();
00309                 }
00310         }
00311 
00318         function checkPassword($uKey)   {
00319                 $p = t3lib_div::_GP('password');
00320 
00321                 if ($p && md5($p)==$GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'])    {
00322                         $sKey = md5($GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'].'|'.$uKey);
00323                         SetCookie($this->cookie_name, $sKey, 0, '/');
00324 
00325                                 // Sending warning email
00326                         $wEmail = $GLOBALS['TYPO3_CONF_VARS']['BE']['warning_email_addr'];
00327                         if ($wEmail)    {
00328                                 $subject="Install Tool Login at '".$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']."'";
00329                                 $email_body="There has been a Install Tool login at TYPO3 site '".$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']."' (".t3lib_div::getIndpEnv('HTTP_HOST').") from remote address '".t3lib_div::getIndpEnv('REMOTE_ADDR')."' (".t3lib_div::getIndpEnv('REMOTE_HOST').')';
00330                                 mail($wEmail,
00331                                         $subject,
00332                                         $email_body,
00333                                         'From: TYPO3 Install Tool WARNING <>'
00334                                 );
00335                         }
00336                         return true;
00337                 } else {
00338                                 // Bad password, send warning:
00339                         if ($p) {
00340                                 $wEmail = $GLOBALS['TYPO3_CONF_VARS']['BE']['warning_email_addr'];
00341                                 if ($wEmail)    {
00342                                         $subject="Install Tool Login ATTEMPT at '".$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']."'";
00343                                         $email_body="There has been a Install Tool login attempt at TYPO3 site '".$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']."' (".t3lib_div::getIndpEnv('HTTP_HOST').").
00344 Password tried was '".$p."'
00345 REMOTE_ADDR was '".t3lib_div::getIndpEnv('REMOTE_ADDR')."' (".t3lib_div::getIndpEnv('REMOTE_HOST').')';
00346                                         mail($wEmail,
00347                                                 $subject,
00348                                                 $email_body,
00349                                                 'From: TYPO3 Install Tool WARNING <>'
00350                                         );
00351                                 }
00352                         }
00353                         return false;
00354                 }
00355         }
00356 
00362         function loginForm()    {
00363                 $p = t3lib_div::_GP('password');
00364                 $redirect_url = $this->redirect_url ? $this->redirect_url : $this->action;
00365 
00366                 $this->messageFunc_nl2br=0;
00367                 $this->silent=0;
00368 
00369                 $content = '<form action="index.php" method="post" name="passwordForm">
00370                         <input type="password" name="password"><br />
00371                         <input type="hidden" name="redirect_url" value="'.$redirect_url.'">
00372                         <input type="submit" value="Log in"><br />
00373                         <br />
00374 
00375                         '.$this->fw('The Install Tool Password is <i>not</i> the admin password of TYPO3.<br />
00376                                 If you don\'t know the current password, you can set a new one by setting the value of $TYPO3_CONF_VARS[\'BE\'][\'installToolPassword\'] in typo3conf/localconf.php to the md5() hash value of the password you desire.'.
00377                                 ($p ? '<br /><br />The password you just tried has this md5-value: <br /><br />'.md5($p) : '')
00378                                 ).'
00379                         </form>
00380                         <script type="text/javascript">
00381                         <!--
00382                                 document.passwordForm.password.focus();
00383                         //-->
00384                         </script>';
00385 
00386                 $this->message('Password', 'Enter the Install Tool Password', $content,3);
00387                 echo $this->outputWrapper($this->printAll());
00388         }
00389 
00396         function init() {
00397                 if (!defined('PATH_typo3'))     exit;           // Must be called after inclusion of init.php (or from init.php)
00398                 if (!$this->passwordOK) exit;
00399 //              debug($_COOKIE);
00400 
00401                         // Setting stuff...
00402                 $this->check_mail();
00403                 $this->setupGeneral();
00404                 $this->generateConfigForm();
00405                 if (count($this->messages))     t3lib_div::debug($this->messages);
00406 
00407                 if ($this->step)        {
00408                         echo $this->outputWrapper($this->stepOutput());
00409                 } else {
00410                                 // Menu...
00411                         switch($this->INSTALL['type'])  {
00412                                 case 'images':
00413                                         $this->checkIM=1;
00414                                         $this->checkTheConfig();
00415                                         $this->silent=0;
00416                                         $this->checkTheImageProcessing();
00417                                 break;
00418                                 case 'database':
00419                                         $this->checkTheConfig();
00420                                         $this->silent=0;
00421                                         $this->checkTheDatabase();
00422                                 break;
00423                                 case 'update':
00424                                         $this->checkDatabase();
00425                                         $this->silent=0;
00426                                         $this->updateWizard();
00427                                 break;
00428                                 case 'config':
00429                                         $this->silent=0;
00430                                         $this->checkIM=1;
00431                                         $this->message('About configuration','How to configure TYPO3',$this->generallyAboutConfiguration());
00432                                         $this->checkTheConfig();
00433 
00434                                         $ext = 'Write config to localconf.php';
00435                                         if ($this->fatalError)  {
00436                                                 if ($this->config_array['no_database'] || !$this->config_array['mysqlConnect']) {
00437                                                         $this->message($ext, 'Database not configured yet!', '
00438                                                                 You need to specify database username, password and host as one of the first things.
00439                                                                 Next you\'ll have to select a database to use with TYPO3.
00440                                                                 Use the form below:
00441                                                         ',2);
00442                                                 } else {
00443                                                         $this->message($ext, 'Fatal error encountered!', '
00444                                                                 Somewhere above a fatal configuration problem is encountered. Please make sure that you\'ve fixed this error before you submit the configuration. TYPO3 will not run if this problem is not fixed!
00445                                                                 You should also check all warnings that may appear.
00446                                                         ',2);
00447                                                 }
00448                                         } elseif ($this->mode=='123') {
00449                                                 if (!$this->fatalError) {
00450                                                         $this->message($ext, 'Basic configuration completed', '
00451                                                                 You have no fatal errors in your basic configuration. You may have warnings though. Please pay attention to them! However you may continue and install the database.
00452 
00453                                                                 <strong><span style="color:#f00;">Step 2:</span></strong> <a href="'.$this->scriptSelf.'?TYPO3_INSTALL[type]=database'.($this->mode?'&mode='.rawurlencode($this->mode):'').'">Click here to install the database.</a>
00454                                                         ',-1,1);
00455                                                 }
00456                                         }
00457                                         $this->message($ext, 'Very Important: Changing Image Processing settings', "
00458                                                 When you change the settings for Image Processing you <i>must</i> take into account that <u>old images</u> may still be in typo3temp/ folder and prevent new files from being generated! This is especially important to know, if you're trying to set up image processing for the very first time.
00459                                                 The problem is solved by <a href=\"".htmlspecialchars($this->setScriptName('typo3temp'))."\">clearing the typo3temp/ folder</a>. Also make sure to clear the cache_pages table.
00460                                                 ",1,1);
00461                                         $this->message($ext, 'Very Important: Changing Encryption Key setting', "
00462                                                 When you change the setting for the Encryption Key you <i>must</i> take into account that a change to this value might invalidate temporary information, URLs etc.
00463                                                 The problem is solved by <a href=\"".htmlspecialchars($this->setScriptName('typo3temp'))."\">clearing the typo3temp/ folder</a>. Also make sure to clear the cache_pages table.
00464                                                 ",1,1);
00465                                         $this->message($ext, 'Update localconf.php', "
00466                                                 This form updates the localconf.php file with the suggested values you see below. The values are based on the analysis above.
00467                                                 You can change the values in case you have alternatives to the suggested defaults.
00468                                                 By this final step you will configure TYPO3 for immediate use provided that you have no fatal errors left above."
00469                                                 .$this->setupGeneral('get_form'),0,1);
00470 
00471                                         echo $this->outputWrapper($this->printAll());
00472 
00473                                 break;
00474                                 case 'extConfig':
00475                                         $this->silent=0;
00476 
00477                                         $this->generateConfigForm('get_form');
00478 
00479                                         $content = $this->printAll();
00480                                         $content = '<form action="'.$this->action.'" method="post">'.$content.'<input type="submit" value="Write to localconf.php"><br /><br />
00481                                         '.$this->fw('<strong>NOTICE: </strong>By clicking this button, localconf.php is updated with new values for the parameters listed above!<br />').'
00482                                         </form>';
00483                                         echo $this->outputWrapper($content);
00484                                 break;
00485                                 case 'typo3temp':
00486                                         $this->checkTheConfig();
00487                                         $this->silent=0;
00488                                         $this->typo3TempManager();
00489                                 break;
00490                                 case 'cleanup':
00491                                         $this->checkTheConfig();
00492                                         $this->silent=0;
00493                                         $this->cleanupManager();
00494                                 break;
00495                                 case 'phpinfo':
00496                                         $this->silent=0;
00497                                         $this->phpinformation();
00498                                 break;
00499                                 case 'typo3conf_edit':
00500                                         $this->silent=0;
00501                                         $this->typo3conf_edit();
00502                                 break;
00503                                 case 'about':
00504                                 default:
00505                                         $this->silent=0;
00506                                         $this->message('About', 'Warning - very important!', $this->securityRisk().$this->alterPasswordForm(),2);
00507 
00508                                         $this->message('About', 'Using this script', "
00509                                         Installing TYPO3 has always been a hot topic on the mailing list and forums. Therefore we've developed this tool which will help you through configuration and testing.
00510                                         There are three primary steps for you to take:
00511 
00512                                         <strong>1: Basic Configuration</strong>
00513                                         In this step your PHP-configuration is checked. If there are any settings that will prevent TYPO3 from running correctly you'll get warnings and errors with a description of the problem.
00514                                         You'll have to enter a database username, password and hostname. Then you can choose to create a new database or select an existing one.
00515                                         Finally the image processing settings are entered and verified and you can choose to let the script update the configuration file, typo3conf/localconf.php with the suggested settings.
00516 
00517                                         <strong>2: Database Analyser</strong>
00518                                         In this step you can either install a new database or update the database from any previous TYPO3 version.
00519                                         You can also get an overview of extra/missing fields/tables in the database compared to a raw sql-file.
00520                                         The database is also verified agains your 'tables.php' configuration (\$TCA) and you can even see suggestions to entries in \$TCA or new fields in the database.
00521 
00522                                         <strong>3: Update Wizard</strong>
00523                                         Here you will find update methods taking care of changes to the TYPO3 core which are not backwards compatible.
00524                                         It is recommended to run this wizard after every update to make sure everything will still work flawlessly.
00525 
00526                                         <strong>4: Image Processing</strong>
00527                                         This step is a visual guide to verify your configuration of the image processing software.
00528                                         You'll be presented to a list of images that should all match in pairs. If some irregularity appears, you'll get a warning. Thus you're able to track an error before you'll discover it on your website.
00529 
00530                                         <strong>5: All Configuration</strong>
00531                                         This gives you access to any of the configuration options in the TYPO3_CONF_VARS array. Every option is also presented with a comment explaining what it does.
00532 
00533                                         <strong>6: typo3temp/</strong>
00534                                         Here you can manage the files in typo3temp/ folder in a simple manner. typo3temp/ contains temporary files, which may still be used by the website, but some may not. By searching for files with old access-dates, you can possibly manage to delete unused files rather than files still used. However if you delete a temporary file still in use, it's just regenerated as long as you make sure to clear the cache tables afterwards.
00535                                         ");
00536 
00537                                         $this->message('About', 'Why is this script stand-alone?', "
00538                                         You would think that this script should rather be a module in the backend and access-controlled to only admin-users from the database. But that's not how it works.
00539                                         The reason is, that this script must not be depending on the success of the configuration of TYPO3 and whether or not there is a working database behind. Therefore the script is invoked from the backend init.php file, which allows access if the constant 'TYPO3_enterInstallScript' has been defined and is not false. That is and should be the case <i>only</i> when calling the script 'typo3/install/index.php' - this script!
00540                                         ");
00541 
00542 
00543                                         $headCode='Header legend';
00544                                         $this->message($headCode, 'Just information', '
00545                                         This is a simple message with some information about something.
00546                                         ');
00547                                         $this->message($headCode, 'Check was successful', '
00548                                         Indicates that something was checked and returned an expected result.
00549                                         ',-1);
00550                                         $this->message($headCode, 'Notice!', '
00551                                         Indicates that something is important to be aware of.
00552                                         This does <em>not</em> indicate an error.
00553                                         ',1);
00554                                         $this->message($headCode, 'Warning!', '
00555                                         Indicates that something may very well cause trouble and you should definitely look into it before proceeding.
00556                                         This indicates a <em>potential</em> error.
00557                                         ',2);
00558                                         $this->message($headCode, 'Error!', '
00559                                         Indicates that something is definitely wrong and that TYPO3 will most likely not perform as expected if this problem is not solved.
00560                                         This indicates an actual error.
00561                                         ',3);
00562 
00563                                         echo $this->outputWrapper($this->printAll());
00564                                 break;
00565                         }
00566                 }
00567         }
00568 
00574         function stepOutput()   {
00575                 $this->checkTheConfig();
00576                 $error_missingConnect='<br />
00577                         '.$this->fontTag2.'<img src="'.$this->backPath.'gfx/icon_fatalerror.gif" width="18" height="16" class="absmiddle">
00578                         There is no connection to the database!<br />
00579                         (Username: <i>'.TYPO3_db_username.'</i>, Password: <i>'.TYPO3_db_password.'</i>, Host: <i>'.TYPO3_db_host.'</i>).<br />
00580                         <br />
00581                         <strong>Go to Step 1</strong> and enter a proper username/password!</span>
00582                         <br />
00583                         <br />
00584                 ';
00585                 $error_missingDB='<br />
00586                         '.$this->fontTag2.'<img src="'.$this->backPath.'gfx/icon_fatalerror.gif" width="18" height="16" class="absmiddle">
00587                         There is no access to the database (<i>'.TYPO3_db.'</i>)!<br />
00588                         <br />
00589                         <strong>Go to Step 2</strong> and select an accessible database!</span>
00590                         <br />
00591                         <br />
00592                 ';
00593 
00594                 $whichTables=$this->getListOfTables();
00595                 $dbInfo='
00596                                         <table border="0" cellpadding="1" cellspacing="0">
00597                                                 <tr>
00598                                                         <td valign="top" nowrap="nowrap" colspan="2" align="center">'.$this->fontTag2.'<strong><img src="'.$this->backPath.'gfx/icon_note.gif" hspace="5" width="18" height="16" class="absmiddle">Database summary:</strong></span></td>
00599                                                 </tr>
00600                                                 <tr>
00601                                                         <td valign="top" nowrap="nowrap">'.$this->fontTag1.'Username:</span></td>
00602                                                         <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.TYPO3_db_username.'</span></strong></td>
00603                                                 </tr>
00604                                                 <tr>
00605                                                         <td valign="top" nowrap="nowrap">'.$this->fontTag1.'Password:</span></td>
00606                                                         <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.TYPO3_db_password.'</span></strong></td>
00607                                                 </tr>
00608                                                 <tr>
00609                                                         <td valign="top" nowrap="nowrap">'.$this->fontTag1.'Host:</span></td>
00610                                                         <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.TYPO3_db_host.'</span></strong></td>
00611                                                 </tr>
00612                                                 <tr>
00613                                                         <td valign="top" nowrap="nowrap">'.$this->fontTag1.'Database:</span></td>
00614                                                         <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.TYPO3_db.'</span></strong></td>
00615                                                 </tr>
00616                                                 <tr>
00617                                                         <td valign="top" nowrap="nowrap">'.$this->fontTag1.'# of tables:</span></td>
00618                                                         <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.(count($whichTables)?'<span style="color:#f00;">'.count($whichTables).'</span>':count($whichTables)).'</span></strong></td>
00619                                                 </tr>
00620                                         </table>
00621                 ';
00622                 $error_emptyDB='<br />
00623                         '.$this->fontTag2.'<img src="'.$this->backPath.'gfx/icon_fatalerror.gif" width="18" height="16" class="absmiddle">
00624                         The database is still empty. There are no tables!<br />
00625                         <br />
00626                         <strong>Go to Step 3</strong> and import a database!</span>
00627                         <br />
00628                         <br />
00629                 ';
00630 
00631                 switch(strtolower($this->step)) {
00632                         case 1:
00633                                 $msg='
00634                                         <br />
00635                                         <br />
00636                                         <table border="0">
00637                                            <form action="'.$this->action.'" method="post">
00638                                                 <tr>
00639                                                         <td valign="top" nowrap="nowrap"><strong>
00640                                                            '.$this->fontTag2.'Username:</span></strong>
00641                                                         </td>
00642                                                         <td>    &nbsp;
00643                                                         </td>
00644                                                         <td valign="top">
00645                                                            '.$this->fontTag2.'
00646                                                            <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_username]" value="'.TYPO3_db_username.'"></span><br />
00647                                                         </td>
00648                                                 </tr>
00649                                                 <tr>
00650                                                         <td valign="top" nowrap="nowrap"><strong>
00651                                                            '.$this->fontTag2.'Password:</span></strong>
00652                                                         </td>
00653                                                         <td>    &nbsp;
00654                                                         </td>
00655                                                         <td valign="top">
00656                                                            '.$this->fontTag2.'
00657                                                            <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_password]" value="'.TYPO3_db_password.'"></span><br />
00658                                                         </td>
00659                                                 </tr>
00660                                                 <tr>
00661                                                         <td valign="top" nowrap="nowrap"><strong>
00662                                                            '.$this->fontTag2.'Host:</span></strong>
00663                                                         </td>
00664                                                         <td>    &nbsp;
00665                                                         </td>
00666                                                         <td valign="top">
00667                                                            '.$this->fontTag2.'
00668                                                            <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_host]" value="'.(TYPO3_db_host?TYPO3_db_host:'localhost').'"></span><br />
00669                                                         </td>
00670                                                 </tr>
00671                                                 <tr>
00672                                                         <td valign="top" nowrap="nowrap"><strong>
00673                                                            '.$this->fontTag1.'</span></strong>
00674                                                         </td>
00675                                                         <td>    &nbsp;
00676                                                         </td>
00677                                                         <td valign="top">
00678                                                            '.$this->fontTag1.'<br />
00679                                                            <input type="hidden" name="step" value="2">
00680                                                            <input type="hidden" name="TYPO3_INSTALL[localconf.php][encryptionKey]" value="'.md5(uniqid(rand(),true)).'">
00681                                                                  <input type="hidden" name="TYPO3_INSTALL[localconf.php][compat_version]" value="'.TYPO3_branch.'">
00682                                                            <input type="submit" value="Continue"><br /><br /><strong>NOTICE: </strong>By clicking this button, typo3conf/localconf.php is updated with new values for the parameters listed above!</span><br />
00683                                                         </td>
00684                                                 </tr>
00685                                            </form>
00686                                         </table>
00687                                         <br />
00688                                         <br />';
00689                         break;
00690                         case 2:
00691                                 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
00692                                         $dbArr = $this->getDatabaseList();
00693                                         reset($dbArr);
00694                                         $options='';
00695                                         $options.='<option value="">[ SELECT DATABASE ]</option>';
00696                                         $dbIncluded=0;
00697                                         while(list(,$dbname)=each($dbArr))      {
00698                                                 $options.='<option value="'.htmlspecialchars($dbname).'"'.($dbname==TYPO3_db?' selected="selected"':'').'>'.htmlspecialchars($dbname).'</option>';
00699                                                 if ($dbname==TYPO3_db)  $dbIncluded=1;
00700                                         }
00701                                         if (!$dbIncluded && TYPO3_db)   {
00702                                                 $options.='<option value="'.htmlspecialchars(TYPO3_db).'" selected="selected">'.htmlspecialchars(TYPO3_db).' (NO ACCESS!)</option>';
00703                                         }
00704                                         $select='<select name="TYPO3_INSTALL[localconf.php][typo_db]">'.$options.'</select>';
00705                                         $msg='
00706 <br />
00707 <br />
00708                                         <table border="0">
00709                                            <form action="'.$this->action.'" method="post">
00710                                                 <tr>
00711                                                         <td valign="top" nowrap="nowrap"><strong>
00712                                                            '.$this->fontTag2.'
00713                                                            You have two options:<br />
00714                                                            <br /><br />
00715 
00716                                                            1: Select an existing <u>EMPTY</u> database:</span></strong>
00717                                                         </td>
00718                                                 </tr>
00719                                                 <tr>
00720                                                         <td valign="top">
00721                                                            '.$this->fontTag1.'Any existing tables which are used by TYPO3 will be overwritten in Step 3. So make sure this database is empty:<br />'.$select.'</span><br />
00722                                                         </td>
00723                                                 </tr>
00724                                                 <tr>
00725                                                         <td valign="top" nowrap="nowrap"><br />
00726                                                         <br />
00727 <strong>
00728                                                            '.$this->fontTag2.'2: Create new database (recommended):</span></strong>
00729                                                         </td>
00730                                                 </tr>
00731                                                 <tr>
00732                                                         <td valign="top">
00733                                                            '.$this->fontTag1.'Enter the desired name of the database here:<br /><input type="text" name="TYPO3_INSTALL[localconf.php][NEW_DATABASE_NAME]" value=""></span><br />
00734                                                         </td>
00735                                                 </tr>
00736                                                 <tr>
00737                                                         <td valign="top">                  <br />
00738 
00739                                                            '.$this->fontTag1.'<br />
00740                                                            <input type="hidden" name="step" value="3">
00741                                                            <input type="submit" value="Continue"><br /><br /><strong>NOTICE: </strong>By clicking this button, typo3conf/localconf.php is updated with new values for the parameters listed above!</span><br />
00742                                                         </td>
00743                                                 </tr>
00744                                            </form>
00745                                         </table>
00746 <br />
00747 <br />
00748                                 ';
00749                                 } else {
00750                                         $msg=$error_missingConnect;
00751                                 }
00752                         break;
00753                         case 3:
00754                                 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
00755                                         if ($GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db))      {
00756                                                 $sFiles = t3lib_div::getFilesInDir(PATH_typo3conf,'sql',1,1);
00757 
00758                                                         // Check if default database scheme "database.sql" already exists, otherwise create it
00759                                                 if (!strstr(implode(',',$sFiles).',', '/database.sql,'))        {
00760                                                         array_unshift($sFiles,'Create default database tables');
00761                                                 }
00762 
00763                                                 $opt='';
00764                                                 foreach ($sFiles as $f) {
00765                                                         if ($f=='Create default database tables')       $key='CURRENT_TABLES+STATIC';
00766                                                         else $key=htmlspecialchars($f);
00767 
00768                                                         $opt.='<option value="import|'.$key.'">'.htmlspecialchars(basename($f)).'</option>';
00769                                                 }
00770 
00771 
00772                                                 $content='
00773                                                         '.$this->fontTag2.'Please select a database dump:</span><br />
00774                                                         <input type="hidden" name="TYPO3_INSTALL[database_import_all]" value=1>
00775                                                         <input type="hidden" name="step" value="">
00776                                                         <input type="hidden" name="goto_step" value="go">
00777                                                         <select name="TYPO3_INSTALL[database_type]">'.$opt.'</select><br />';
00778 
00779                                                 $content = $this->getUpdateDbFormWrap('import', $content, 'Import database');
00780 
00781                                                 $msg='
00782                                                 <br />
00783                                                 '.$dbInfo.'<br />
00784                                                 <br />
00785                                                 '.$content.'
00786 
00787                                                 ';
00788 
00789                                         } else {
00790                                                 $msg=$error_missingDB;
00791                                         }
00792                                 } else {
00793                                         $msg=$error_missingConnect;
00794                                 }
00795                         break;
00796                         case 'go':
00797                                 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
00798                                         if ($GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db))      {
00799                                                 if (count($whichTables))        {
00800                                                         $msg='
00801                                                         <br />
00802                                                         '.$this->fontTag2.'
00803                                                         '.nl2br($this->messageBasicFinished()).'
00804                                                         <br />
00805                                                         <hr />
00806                                                         <div align="center"><strong><img src="'.$this->backPath.'gfx/icon_warning.gif" hspace="5" width="18" height="16" class="absmiddle">IMPORTANT</strong></div><br />
00807                                                         <span class="smalltext">'.nl2br($this->securityRisk()).'
00808                                                         <br />
00809                                                         <strong>Enter <a href="'.$this->scriptSelf.'">"Normal" mode for the Install Tool</a> to change this!</strong><br />
00810 
00811                                                         </span>
00812                                                         </span><br />
00813                                                         ';
00814                                                 } else {
00815                                                         $msg=$error_emptyDB;
00816                                                 }
00817                                         } else {
00818                                                 $msg=$error_missingDB;
00819                                         }
00820                                 } else {
00821                                         $msg=$error_missingConnect;
00822                                 }
00823                         break;
00824                 }
00825                 return $msg;
00826         }
00827 
00833         function checkTheConfig()       {
00834                         // Order important:
00835                 $this->checkDirs();
00836                 $this->checkConfiguration();
00837                 $this->checkExtensions();
00838 
00839                 if (TYPO3_OS=='WIN')    {
00840                         $paths=array($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw'], $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path'], 'c:\\php\\imagemagick\\', 'c:\\apache\\ImageMagick\\');
00841                 } else {
00842                         $paths=array($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw'], $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path'], '/usr/local/bin/','/usr/bin/','/usr/X11R6/bin/');
00843                 }
00844 
00845                 asort($paths);
00846                 if (ini_get('safe_mode'))       {
00847                         $paths=array(ini_get('safe_mode_exec_dir'),'/usr/local/php/bin/');
00848                 }
00849                 if ($this->INSTALL['checkIM']['lzw'])   {
00850                         $this->checkIMlzw=1;
00851                 }
00852                 if ($this->INSTALL['checkIM']['path'])  {
00853                         $paths[]=trim($this->INSTALL['checkIM']['path']);
00854                 }
00855                 if ($this->checkIM)     $this->checkImageMagick($paths);
00856                 $this->checkDatabase();
00857         }
00858 
00864         function typo3conf_edit()       {
00865                 $EDIT_path = PATH_typo3conf;    // default:
00866                 if ($this->allowFileEditOutsite_typo3conf_dir && $this->INSTALL['FILE']['EDIT_path'])   {
00867                         if (t3lib_div::validPathStr($this->INSTALL['FILE']['EDIT_path']) && substr($this->INSTALL['FILE']['EDIT_path'],-1)=='/')        {
00868                                 $tmp_path = PATH_site.$this->INSTALL['FILE']['EDIT_path'];
00869                                 if (is_dir($tmp_path))  {
00870                                         $EDIT_path=$tmp_path;
00871                                 } else {debug("'".$tmp_path."' was not dir");}
00872                         } else {
00873                                 debug('BAD DIR_NAME (must be like t3lib/ or media/script/)');
00874                         }
00875                 }
00876 
00877                 $headCode = 'Edit files in '.basename($EDIT_path).'/';
00878                 $this->contentBeforeTable='';
00879 
00880                 if ($this->INSTALL['SAVE_FILE'])        {
00881                         $save_to_file = $this->INSTALL['FILE']['name'];
00882                         if (@is_file($save_to_file))    {
00883                                 $save_to_file_md5 = md5($save_to_file);
00884                                 if (isset($this->INSTALL['FILE'][$save_to_file_md5]) && t3lib_div::isFirstPartOfStr($save_to_file,$EDIT_path.'') && substr($save_to_file,-1)!='~' && !strstr($save_to_file,'_bak'))     {
00885                                         $this->INSTALL['typo3conf_files'] = $save_to_file;
00886                                         $save_fileContent = $this->INSTALL['FILE'][$save_to_file_md5];
00887 
00888                                         if ($this->INSTALL['FILE']['win_to_unix_br'])   {
00889                                                 $save_fileContent = str_replace(chr(13).chr(10),chr(10),$save_fileContent);
00890                                         }
00891 
00892                                         $backupFile = $this->getBackupFilename($save_to_file);
00893                                         if ($this->INSTALL['FILE']['backup'])   {
00894                                                 if (@is_file($backupFile))      { unlink($backupFile); }
00895                                                 rename($save_to_file,$backupFile);
00896                                                 $this->contentBeforeTable.='Backup written to <strong>'.$backupFile.'</strong><br />';
00897                                         }
00898 
00899                                         t3lib_div::writeFile($save_to_file,$save_fileContent);
00900                                         $this->contentBeforeTable.='
00901                                                 File saved: <strong>'.$save_to_file.'</strong><br />
00902                                                 MD5-sum: '.$this->INSTALL['FILE']['prevMD5'].' (prev)<br />
00903                                                 MD5-sum: '.md5($save_fileContent).' (new)<br />
00904                                         ';
00905                                 }
00906                         }
00907                 }
00908 
00909                         // Filelist:
00910                 $typo3conf_files = t3lib_div::getFilesInDir($EDIT_path,'',1,1);
00911                 reset($typo3conf_files);
00912                 $lines=array();
00913                 $fileFound = 0;
00914                 while(list($k,$file)=each($typo3conf_files))    {
00915                                 // Delete temp_CACHED files if option is set
00916                         if ( $this->INSTALL['delTempCached'] && preg_match('|/temp_CACHED_[a-z0-9_]+\.php|', $file))    {
00917                                 unlink($file);
00918                                 continue;
00919                         }
00920                         if ($this->INSTALL['typo3conf_files'] && !strcmp($this->INSTALL['typo3conf_files'],$file))      {
00921                                 $wrap=array('<strong><span style="color:navy;">','</span></strong>');
00922                                 $fileFound = 1;
00923                         } else {$wrap=array();}
00924                         $lines[]='<tr><td nowrap="nowrap"><a href="'.$this->action.'&TYPO3_INSTALL[typo3conf_files]='.rawurlencode($file).($this->allowFileEditOutsite_typo3conf_dir?'&TYPO3_INSTALL[FILE][EDIT_path]='.rawurlencode($this->INSTALL['FILE']['EDIT_path']):"").'">'.$this->fw($wrap[0].basename($file).$wrap[1].'&nbsp;&nbsp;&nbsp;').'</a></td><td>'.$this->fw(t3lib_div::formatSize(filesize($file))).'</td></tr>';
00925                 }
00926                 $fileList='<table border="0" cellpadding="0" cellspacing="0">'.implode('',$lines).'</table>';
00927                 $fileList.='<br />('.$EDIT_path.')';
00928 
00929                 if ($this->allowFileEditOutsite_typo3conf_dir)  {
00930                         $fileList.='<br /><form action="'.$this->action.'" method="post">
00931                         '.PATH_site.'<input type="text" name="TYPO3_INSTALL[FILE][EDIT_path]" value="'.$this->INSTALL['FILE']['EDIT_path'].'"><input type="submit" name="" value="Set">
00932                         </form>';
00933                 }
00934 
00935                         // create link for deleting temp_CACHED files
00936                 $fileList .= '<br /><br /><a href="'.$this->action.'&TYPO3_INSTALL[delTempCached]=1">Delete temp_CACHED* files</a>';
00937 
00938                 if ($fileFound && @is_file($this->INSTALL['typo3conf_files']))  {
00939                         $this->headerStyle = '
00940                         <style type="text/css"><!--
00941                                 SELECT {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00942                                 TEXTAREA  {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00943                                 INPUT {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00944                         //--></style>
00945                         ';
00946 
00947                         $backupFile = $this->getBackupFilename($this->INSTALL['typo3conf_files']);
00948                         $fileContent = t3lib_div::getUrl($this->INSTALL['typo3conf_files']);
00949                         $this->contentBeforeTable.= '<form action="'.$this->action.'" method="post">'.(substr($this->INSTALL['typo3conf_files'],-1)!='~' && !strstr($this->INSTALL['typo3conf_files'],'_bak') ? '
00950                                 <input type="submit" name="TYPO3_INSTALL[SAVE_FILE]" value="Save file">&nbsp;' : '').'
00951                                 <input type="submit" name="_close" value="Close">
00952                                 <br />File: '.$this->INSTALL['typo3conf_files'].'
00953                                 <br />MD5-sum: '.md5($fileContent).'
00954                                 <br />
00955 
00956                                 <input type="hidden" name="TYPO3_INSTALL[FILE][name]" value="'.$this->INSTALL['typo3conf_files'].'">
00957                                 '.($this->allowFileEditOutsite_typo3conf_dir?'<input type="hidden" name="TYPO3_INSTALL[FILE][EDIT_path]" value="'.$this->INSTALL['FILE']['EDIT_path'].'">':'').'
00958                                 <input type="hidden" name="TYPO3_INSTALL[FILE][prevMD5]" value="'.md5($fileContent).'">
00959                                 <textarea rows="30" name="TYPO3_INSTALL[FILE]['.md5($this->INSTALL['typo3conf_files']).']" wrap="off"'.$this->formWidthText(48,'width:98%;height:80%','off').' class="fixed-font enable-tab">'.t3lib_div::formatForTextarea($fileContent).'</textarea><br />
00960                                 <input type="checkbox" name="TYPO3_INSTALL[FILE][win_to_unix_br]" id="win_to_unix_br" value="1"'.(TYPO3_OS=='WIN'?'':' checked="checked"').'> <label for="win_to_unix_br">Convert Windows linebreaks (13-10) to Unix (10)</label><br />
00961                                 <input type="checkbox" name="TYPO3_INSTALL[FILE][backup]" id="backup" value="1"'.(@is_file($backupFile) ? ' checked="checked"' : '').'> <label for="backup">Make backup copy (rename to '.basename($backupFile).')</label><br />
00962                                 '.
00963                         '</form>';
00964                 }
00965 
00966                 if ($this->contentBeforeTable)  {
00967                         $this->contentBeforeTable = $this->fw($this->contentBeforeTable);
00968                 }
00969 
00970                 $this->message($headCode,'Files in folder',$fileList);
00971 
00972                 echo $this->outputWrapper($this->printAll());
00973         }
00974 
00980         function phpinformation()       {
00981                 $headCode = 'PHP information';
00982 
00983                 $sVar = t3lib_div::getIndpEnv('_ARRAY');
00984                 $sVar['CONST: PHP_OS']=PHP_OS;
00985                 $sVar['CONST: TYPO3_OS']=TYPO3_OS;
00986                 $sVar['CONST: PATH_thisScript']=PATH_thisScript;
00987                 $sVar['CONST: php_sapi_name()']=php_sapi_name();
00988                 $sVar['OTHER: TYPO3_VERSION']=TYPO3_version;
00989                 $sVar['OTHER: PHP_VERSION']=phpversion();
00990                 $sVar['imagecreatefromgif()']=function_exists('imagecreatefromgif');
00991                 $sVar['imagecreatefrompng()']=function_exists('imagecreatefrompng');
00992                 $sVar['imagecreatefromjpeg()']=function_exists('imagecreatefromjpeg');
00993                 $sVar['imagegif()']=function_exists('imagegif');
00994                 $sVar['imagepng()']=function_exists('imagepng');
00995                 $sVar['imagejpeg()']=function_exists('imagejpeg');
00996                 $sVar['imagettftext()']=function_exists('imagettftext');
00997                 $sVar['OTHER: IMAGE_TYPES']=function_exists('imagetypes') ? imagetypes() : 0;
00998                 $sVar['OTHER: memory_limit']=ini_get('memory_limit');
00999 
01000                 $gE_keys = explode(',','SERVER_PORT,SERVER_SOFTWARE,GATEWAY_INTERFACE,SCRIPT_NAME,PATH_TRANSLATED');
01001                 while(list(,$k)=each($gE_keys)) {
01002                         $sVar['SERVER: '.$k]=$_SERVER[$k];
01003                 }
01004 
01005                 $gE_keys = explode(',','image_processing,gdlib,gdlib_png,gdlib_2,im,im_path,im_path_lzw,im_version_5,im_negate_mask,im_imvMaskState,im_combine_filename');
01006                 while(list(,$k)=each($gE_keys)) {
01007                         $sVar['T3CV_GFX: '.$k]=$GLOBALS['TYPO3_CONF_VARS']['GFX'][$k];
01008                 }
01009 
01010                 $debugInfo=array();
01011                 $debugInfo[]='### DEBUG SYSTEM INFORMATION - START ###';
01012                 reset($sVar);
01013                 while(list($kkk,$vvv)=each($sVar))      {
01014                         $debugInfo[]=str_pad(substr($kkk,0,20),20).': '.$vvv;
01015                 }
01016                 $debugInfo[]='### DEBUG SYSTEM INFORMATION - END ###';
01017 
01018                 $buf=$this->messageFunc_nl2br;
01019                 $this->messageFunc_nl2br=0;
01020                 $this->message($headCode,'DEBUG information','Please copy/paste the information from this text field into an email or bug-report as "Debug System Information" whenever you wish to get support or report problems. This information helps others to check if your system has some obvious misconfiguration and you\'ll get your help faster!<br />
01021                 <form action=""><textarea rows="10" '.$this->formWidthText(80,'','off').' wrap="off" class="fixed-font">'.t3lib_div::formatForTextarea(implode(chr(10),$debugInfo)).'</textarea></form>');
01022                 $this->messageFunc_nl2br=$buf;
01023 
01024                 $getEnvArray = array();
01025                 $gE_keys = explode(',','QUERY_STRING,HTTP_ACCEPT,HTTP_ACCEPT_ENCODING,HTTP_ACCEPT_LANGUAGE,HTTP_CONNECTION,HTTP_COOKIE,HTTP_HOST,HTTP_USER_AGENT,REMOTE_ADDR,REMOTE_HOST,REMOTE_PORT,SERVER_ADDR,SERVER_ADMIN,SERVER_NAME,SERVER_PORT,SERVER_SIGNATURE,SERVER_SOFTWARE,GATEWAY_INTERFACE,SERVER_PROTOCOL,REQUEST_METHOD,SCRIPT_NAME,PATH_TRANSLATED,HTTP_REFERER,PATH_INFO');
01026                 while(list(,$k)=each($gE_keys)) {
01027                         $getEnvArray[$k] = getenv($k);
01028                 }
01029                 $this->message($headCode,'t3lib_div::getIndpEnv()',t3lib_div::view_array(t3lib_div::getIndpEnv('_ARRAY')));
01030                 $this->message($headCode,'getenv()',t3lib_div::view_array($getEnvArray));
01031                 $this->message($headCode,'_ENV',t3lib_div::view_array($_ENV));
01032                 $this->message($headCode,'_SERVER',t3lib_div::view_array($_SERVER));
01033                 $this->message($headCode,'_COOKIE',t3lib_div::view_array($_COOKIE));
01034                 $this->message($headCode,'_GET',t3lib_div::view_array($_GET));
01035 
01036                 ob_start();
01037                 phpinfo();
01038                 $contents = explode('<body>',ob_get_contents());
01039                 ob_end_clean();
01040                 $contents = explode('</body>',$contents[1]);
01041 
01042                 $this->message($headCode,'phpinfo()',$contents[0]);
01043 
01044 
01045 
01046 $this->headerStyle = '
01047 <style type="text/css"><!--
01048 a { text-decoration: none; }
01049 a:hover { text-decoration: underline; }
01050 h1 { font-family: verdana,arial, helvetica, sans-serif; font-size: 14pt; font-weight: bold;}
01051 h2 { font-family: verdana,arial, helvetica, sans-serif; font-size: 12pt; font-weight: bold;}
01052 body, td { font-family: verdana,arial, helvetica, sans-serif; font-size: 10pt; }
01053 th { font-family: verdana,arial, helvetica, sans-serif; font-size: 10pt; font-weight: bold; }
01054 //--></style>
01055 ';
01056 
01057                 echo $this->outputWrapper($this->printAll());
01058         }
01059 
01060 
01061 
01062 
01063 
01064 
01065 
01066 
01067 
01068 
01069 
01070 
01071 
01072         /*******************************
01073          *
01074          * typo3temp/ manager
01075          *
01076          *******************************/
01077 
01083         function typo3TempManager()     {
01084                 $headCode = 'typo3temp/ directory';
01085                 $this->message($headCode,'What is it?','
01086                 TYPO3 uses this directory for temporary files, mainly processed and cached images.
01087                 The filenames are very cryptic; They are unique representations of the file properties made by md5-hashing a serialized array with information.
01088                 Anyway this directory may contain many thousand files and a lot of them may be of no use anymore.
01089 
01090                 With this test you can delete the files in this folder. When you do that, you should also clear the cache database tables afterwards.
01091                 ');
01092 
01093                 if (!$this->config_array['dir_typo3temp'])      {
01094                         $this->message('typo3temp/ directory','typo3temp/ not writable!',"
01095                                 You must make typo3temp/ write enabled before you can proceed with this test.
01096                         ",2);
01097                         echo $this->outputWrapper($this->printAll());
01098                         return;
01099                 }
01100 
01101                         // Run through files
01102                 $fileCounter = 0;
01103                 $deleteCounter = 0;
01104                 $criteriaMatch = 0;
01105                 $tmap=array('day'=>1, 'week'=>7, 'month'=>30);
01106                 $tt = $this->INSTALL['typo3temp_delete'];
01107                 $subdir = $this->INSTALL['typo3temp_subdir'];
01108                 if (strlen($subdir) && !ereg('^[[:alnum:]_]+/$',$subdir))       die('subdir "'.$subdir.'" was not allowed!');
01109                 $action = $this->INSTALL['typo3temp_action'];
01110                 $d = @dir($this->typo3temp_path.$subdir);
01111                 if (is_object($d))      {
01112                         while($entry=$d->read()) {
01113                                 $theFile = $this->typo3temp_path.$subdir.$entry;
01114                                 if (@is_file($theFile)) {
01115                                         $ok = 0;
01116                                         $fileCounter++;
01117                                         if ($tt)        {
01118                                                 if (t3lib_div::testInt($tt))    {
01119                                                         if (filesize($theFile) > $tt*1024)      $ok=1;
01120                                                 } else {
01121                                                         if (fileatime($theFile) < time()-(intval($tmap[$tt])*60*60*24)) $ok=1;
01122                                                 }
01123                                         } else {
01124                                                 $ok = 1;
01125                                         }
01126                                         if ($ok)        {
01127                                                 $hashPart=substr(basename($theFile),-14,10);
01128                                                 if (!ereg('[^a-f0-9]',$hashPart) || substr($theFile,-6)==='.cache' || substr($theFile,-4)==='.tbl' || substr(basename($theFile),0,8)==='install_')      {               // This is a kind of check that the file being deleted has a 10 char hash in it
01129                                                         if ($action && $deleteCounter<$action)  {
01130                                                                 $deleteCounter++;
01131                                                                 unlink($theFile);
01132                                                         } else {
01133                                                                 $criteriaMatch++;
01134                                                         }
01135                                                 }
01136                                         }
01137                                 }
01138                         }
01139                         $d->close();
01140                 }
01141 
01142                         // Find sub-dirs:
01143                 $subdirRegistry = array(''=>'');
01144                 $d = @dir($this->typo3temp_path);
01145                 if (is_object($d))      {
01146                         while($entry=$d->read()) {
01147                                 $theFile = $entry;
01148                                 if (@is_dir($this->typo3temp_path.$theFile) && $theFile!='..' && $theFile!='.') {
01149                                         $subdirRegistry[$theFile.'/'] = $theFile.'/ (Files: '.count(t3lib_div::getFilesInDir($this->typo3temp_path.$theFile)).')';
01150                                 }
01151                         }
01152                 }
01153 
01154                 $deleteType=array(
01155                         '0' => 'All',
01156                         'day' => 'Last access more than a day ago',
01157                         'week' => 'Last access more than a week ago',
01158                         'month' => 'Last access more than a month ago',
01159                         '10' => 'Filesize greater than 10KB',
01160                         '50' => 'Filesize greater than 50KB',
01161                         '100' => 'Filesize greater than 100KB'
01162                 );
01163 
01164                 $actionType=array(
01165                         '0' => "Don't delete, just display statistics",
01166                         '100' => 'Delete 100',
01167                         '500' => 'Delete 500',
01168                         '1000' => 'Delete 1000'
01169                 );
01170 
01171                 $content='<select name="TYPO3_INSTALL[typo3temp_delete]">'.$this->getSelectorOptions($deleteType,$tt).'</select>
01172                 <br />
01173 Number of files at a time:
01174                 <select name="TYPO3_INSTALL[typo3temp_action]">'.$this->getSelectorOptions($actionType).'</select>
01175 
01176 From sub-directory:
01177                 <select name="TYPO3_INSTALL[typo3temp_subdir]">'.$this->getSelectorOptions($subdirRegistry, $this->INSTALL['typo3temp_subdir']).'</select>
01178                 ';
01179 
01180                 $form = '<form action="'.$this->action.'" method="post">'.$content.'
01181 
01182                 <input type="submit" value="Execute">
01183                 </form>
01184                 This tool will delete files only if the last 10 characters before the extension (3 chars+\'.\') are hexadecimal valid ciphers, which are lowercase a-f and 0-9.';
01185 
01186                 $this->message($headCode,'Statistics','
01187                 Number of temporary files: <strong>'.($fileCounter-$deleteCounter)."</strong>
01188                 Number matching '".htmlspecialchars($deleteType[$tt])."': <strong>".$criteriaMatch.'</strong>
01189                 Number deleted: <strong>'.$deleteCounter.'</strong>
01190                 <br />
01191                 '.$form,1);
01192 
01193                 echo $this->outputWrapper($this->printAll());
01194         }
01195 
01203         function getSelectorOptions($deleteType,$tt='') {
01204                 $out='';
01205                 if (is_array($deleteType))      {
01206                         reset($deleteType);
01207                         while(list($v,$l)=each($deleteType))    {
01208                                 $out.='<option value="'.htmlspecialchars($v).'"'.(!strcmp($v,$tt)?' selected="selected"':'').'>'.htmlspecialchars($l).'</option>';
01209                         }
01210                 }
01211                 return $out;
01212         }
01213 
01214 
01215 
01216 
01217 
01218 
01219 
01220 
01221 
01222         /*******************************
01223          *
01224          * cleanup manager
01225          *
01226          *******************************/
01227 
01235         function cleanupManager()       {
01236                 $headCode = 'Clean up database';
01237                 $this->message($headCode,'What is it?','
01238                 This function will become a general clean up manager for various tables used by TYPO3. By now you can only empty the cache which is used for storing image sizes of all pictures used in TYPO3.
01239 
01240                 <strong>Clear cached image sizes</strong>
01241                 Clears the cache used for memorizing sizes of all images used in your website. This information is cached in order to gain performance and will be stored each time a new image is being displayed in the frontend.
01242 
01243                 You should <em>Clear All Cache</em> in the backend after clearing this cache.
01244                 ');
01245 
01246                 $tables = $this->getListOfTables();
01247                 $action = $this->INSTALL['cleanup_type'];
01248 
01249                 if (($action == 'cache_imagesizes' || $action == 'all') && isset ($tables['cache_imagesizes'])) {
01250                         $GLOBALS['TYPO3_DB']->exec_DELETEquery ('cache_imagesizes','');
01251                 }
01252 
01253                 $cleanupType = array (
01254                         'all' => 'Clean up everything',
01255                 );
01256 
01257                         // Get cache_imagesizes info
01258                 if (isset ($tables['cache_imagesizes'])) {
01259                         $cleanupType['cache_imagesizes'] = 'Clear cached image sizes only';
01260                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('COUNT(*) AS icount', 'cache_imagesizes', '');
01261                         $resArr = $GLOBALS['TYPO3_DB']->sql_fetch_assoc ($res);
01262                         $cachedImageSizesCounter = intval ($resArr['icount']);
01263                 } else {
01264                         $this->message($headCode,'Table cache_imagesizes does not exist!',"
01265                                 The table cache_imagesizes was not found. Please check your database settings in Basic Configuration and compare your table definition with the Database Analyzer.
01266                         ",2);
01267                         $cachedImageSizesCounter = 'unknown';
01268                 }
01269 
01270                 $content = '<select name="TYPO3_INSTALL[cleanup_type]">'.$this->getSelectorOptions($cleanupType).'</select> ';
01271                 $form = '<form action="'.$this->action.'" method="post">'.$content.'<input type="submit" value="Execute"></form>';
01272                 $this->message($headCode,'Statistics','
01273                         Number cached image sizes: <strong>'.$cachedImageSizesCounter.'</strong><br />
01274                 '.$form,1);
01275 
01276                 echo $this->outputWrapper($this->printAll());
01277         }
01278 
01279 
01280 
01281 
01282 
01283 
01284 
01285 
01286 
01287 
01288 
01289 
01290 
01291         /*******************************
01292          *
01293          * CONFIGURATION FORM
01294          *
01295          ********************************/
01296 
01303         function generateConfigForm($type='')   {
01304                 $default_config_content = t3lib_div::getUrl(PATH_t3lib.'config_default.php');
01305                 $commentArr = $this->getDefaultConfigArrayComments($default_config_content);
01306 
01307                 switch($type)   {
01308                         case 'get_form':
01309                                 reset($GLOBALS['TYPO3_CONF_VARS']);
01310                                 $this->messageFunc_nl2br=0;
01311                                 while(list($k,$va)=each($GLOBALS['TYPO3_CONF_VARS']))   {
01312                                         $ext='['.$k.']';
01313                                         $this->message($ext, '$TYPO3_CONF_VARS[\''.$k.'\']',$commentArr[0][$k],1);
01314 
01315                                         while(list($vk,$value)=each($va))       {
01316                                                 $description = trim($commentArr[1][$k][$vk]);
01317                                                 $isTextarea = preg_match('/^string \(textarea\)/i',$description) ? TRUE : FALSE;
01318 
01319                                                 if (!is_array($value) && ($this->checkForBadString($value) || $isTextarea))     {
01320                                                         $k2 = '['.$vk.']';
01321                                                         $msg = htmlspecialchars($description).'<br /><br /><em>'.$ext.$k2.' = '.htmlspecialchars(t3lib_div::fixed_lgd($value,60)).'</em><br />';
01322 
01323                                                         if ($isTextarea)        {
01324                                                                 $form = '<textarea name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" cols="60" rows="5" wrap="off">'.htmlspecialchars($value).'</textarea>';
01325                                                         } elseif (preg_match('/^boolean/i',$description)) {
01326                                                                 $form = '<input type="hidden" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" value="0">';
01327                                                                 $form.= '<input type="checkbox" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']"'.($value?' checked="checked"':'').' value="'.($value&&strcmp($value,'0')?htmlspecialchars($value):1).'">';
01328                                                         } else {
01329                                                                 $form = '<input type="text" size="40" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" value="'.htmlspecialchars($value).'">';
01330                                                         }
01331                                                         $this->message($ext, $k2,$msg.$form);
01332                                                 }
01333                                         }
01334                                 }
01335                         break;
01336                         default:
01337                                 if (is_array($this->INSTALL['extConfig']))              {
01338                                         reset($this->INSTALL['extConfig']);
01339                                         $lines = $this->writeToLocalconf_control();
01340                                         while(list($k,$va)=each($this->INSTALL['extConfig']))   {
01341                                                 if (is_array($GLOBALS['TYPO3_CONF_VARS'][$k]))  {
01342                                                         while(list($vk,$value)=each($va))       {
01343                                                                 if (isset($GLOBALS['TYPO3_CONF_VARS'][$k][$vk]))        {
01344                                                                         $doit=1;
01345                                                                         if ($k=='BE' && $vk=='installToolPassword')     {
01346                                                                                 if ($value)     {
01347                                                                                         if (isset($_POST['installToolPassword_check']) && (!t3lib_div::_GP('installToolPassword_check') || strcmp(t3lib_div::_GP('installToolPassword_check'),$value))) {
01348                                                                                                 $doit=0;
01349                                                                                                 t3lib_div::debug('ERROR: The two passwords did not match! The password was not changed.');
01350                                                                                         }
01351                                                                                         if (t3lib_div::_GP('installToolPassword_md5'))  $value =md5($value);
01352                                                                                 } else $doit=0;
01353                                                                         }
01354 
01355                                                                         $description = trim($commentArr[1][$k][$vk]);
01356                                                                         if (preg_match('/^string \(textarea\)/i', $description))        {
01357                                                                                 $value = str_replace(chr(13),'',$value);        // Force Unix linebreaks in textareas
01358                                                                                 $value = str_replace(chr(10),"'.chr(10).'",$value);     // Preserve linebreaks
01359                                                                         }
01360 
01361                                                                         if ($doit && strcmp($GLOBALS['TYPO3_CONF_VARS'][$k][$vk],$value))       $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\''.$k.'\'][\''.$vk.'\']', $value);
01362                                                                 }
01363                                                         }
01364                                                 }
01365                                         }
01366                                         $this->writeToLocalconf_control($lines);
01367                                 }
01368                         break;
01369                 }
01370         }
01371 
01380         function getDefaultConfigArrayComments($string,$mainArray=array(),$commentArray=array())        {
01381                 $lines = explode(chr(10),$string);
01382                 $in=0;
01383                 $mainKey='';
01384                 while(list(,$lc)=each($lines))  {
01385                         $lc = trim($lc);
01386                         if ($in) {
01387                                 if (!strcmp($lc,');'))  {
01388                                         $in=0;
01389                                 } else {
01390                                         if (preg_match('/["\']([[:alnum:]_-]*)["\'][[:space:]]*=>(.*)/i',$lc,$reg))     {
01391                                                 preg_match('/,[\t\s]*\/\/(.*)/i',$reg[2],$creg);
01392                                                 $theComment = trim($creg[1]);
01393                                                 if (substr(strtolower(trim($reg[2])),0,5)=='array' && !strcmp($reg[1],strtoupper($reg[1])))     {
01394                                                         $mainKey=trim($reg[1]);
01395                                                         $mainArray[$mainKey]=$theComment;
01396                                                 } elseif ($mainKey) {
01397                                                         $commentArray[$mainKey][$reg[1]]=$theComment;
01398                                                 }
01399                                         }
01400                                 }
01401                         }
01402                         if (!strcmp($lc,'$TYPO3_CONF_VARS = Array('))   {
01403                                 $in=1;
01404                         }
01405                 }
01406                 return array($mainArray,$commentArray);
01407         }
01408 
01409 
01410 
01411 
01412 
01413 
01414 
01415 
01416 
01417 
01418 
01419 
01420 
01421         /*******************************
01422          *
01423          * CHECK CONFIGURATION FUNCTIONS
01424          *
01425          *******************************/
01426 
01432         function checkConfiguration()   {
01433                 $ext='php.ini configuration checked';
01434                 $this->message($ext);
01435 
01436                         // *****************
01437                         // Incoming values:
01438                         // *****************
01439 
01440                         // Includepath
01441                 $incPaths = t3lib_div::trimExplode(TYPO3_OS=='WIN'?';':':', ini_get('include_path'));
01442                 if (!in_array('.',$incPaths))   {
01443                         $this->message($ext, 'Current directory (./) is not in include path!',"
01444                                 <i>include_path=".ini_get('include_path')."</i>
01445                                 Normally the current path, '.', is included in the include_path of PHP. Although TYPO3 does not rely on this, it is an unusual setting that may introduce problems for some extensions.
01446                         ",1);
01447                 } else $this->message($ext, 'Current directory in include path',"",-1);
01448 
01449                         // *****************
01450                         // File uploads
01451                         // *****************
01452                 if (!ini_get('file_uploads'))   {
01453                         $this->message($ext, 'File uploads not allowed',"
01454                                 <i>file_uploads=".ini_get('file_uploads')."</i>
01455                                 TYPO3 uses the ability to upload files from the browser in various cases.
01456                                 As long as this flag is disabled, you'll not be able to upload files.
01457                                 But it doesn't end here, because not only are files not accepted by the server - ALL content in the forms are discarded and therefore nothing at all will be editable if you don't set this flag!
01458                                 However if you cannot enable fileupload for some reason alternatively you change the default form encoding value with \$TYPO3_CONF_VARS[SYS][form_enctype].
01459                         ",3);
01460                 } else $this->message($ext, 'File uploads allowed',"",-1);
01461 
01462                 $upload_max_filesize = $this->convertByteSize(ini_get('upload_max_filesize'));
01463                 $post_max_size = $this->convertByteSize(ini_get('post_max_size'));
01464                 if ($upload_max_filesize<1024*1024*10)  {
01465                         $this->message($ext, 'Maximum upload filesize too small?',"
01466                                 <i>upload_max_filesize=".ini_get('upload_max_filesize')."</i>
01467                                 By default TYPO3 supports uploading, copying and moving files of sizes up to 10MB (You can alter the TYPO3 defaults by the config option TYPO3_CONF_VARS[BE][maxFileSize]).
01468                                 Your current value is below this, so at this point, PHP sets the limits for uploaded filesizes and not TYPO3.
01469                                 <strong>Notice:</strong> The limits for filesizes attached to database records are set in the tables.php configuration files (\$TCA) for each group/file field. You may override these values in localconf.php or by page TSconfig settings.
01470                         ",1);
01471                 }
01472                 if ($upload_max_filesize > $post_max_size)      {
01473                         $this->message($ext, 'Maximum size for POST requests is smaller than max. upload filesize','
01474                                 <i>upload_max_filesize='.ini_get('upload_max_filesize').', post_max_size='.ini_get('post_max_size').'</i>
01475                                 You have defined a maximum size for file uploads which exceeds the allowed size for POST requests. Therefore the file uploads can not be larger than '.ini_get('post_max_size').'
01476                         ',1);
01477                 }
01478 
01479                         // *****************
01480                         // Memory and functions
01481                         // *****************
01482                 $memory_limit_value = $this->convertByteSize(ini_get('memory_limit'));
01483                 if ($memory_limit_value && $memory_limit_value < 16*1024*1024)  {
01484                         $this->message($ext, 'Memory limit below 16 MB',"
01485                                 <i>memory_limit=".ini_get('memory_limit')."</i>
01486                                 Your system is configured to enforce a memory limit of PHP scripts lower than 16 MB. The Extension Manager needs to include more PHP-classes than will fit into this memory space. There is nothing else to do than raise the limit. To be safe, ask the system administrator of the webserver to raise the limit to over 25 MB.
01487                         ",3);
01488                 } elseif(!$memory_limit_value) {
01489                         $this->message($ext, 'Memory limit',"<i>No memory limit in effect.</i>",-1);
01490                 } else $this->message($ext, 'Memory limit',"<i>memory_limit=".ini_get('memory_limit')."</i>",-1);
01491                 if (ini_get('max_execution_time')<30)   {
01492                         $this->message($ext, 'Maximum execution time below 30 seconds',"
01493                                 <i>max_execution_time=".ini_get('max_execution_time')."</i>
01494                                 May impose problems if too low.
01495                         ",1);
01496                 } else $this->message($ext, 'Maximum execution time',"<i>max_execution_time=".ini_get('max_execution_time')."</i>",-1);
01497                 if (ini_get('disable_functions'))       {
01498                         $this->message($ext, 'Functions disabled!',"
01499                                 <i>disable_functions=".ini_get('disable_functions')."</i>
01500                                 The above list of functions are disabled. If TYPO3 use any of these there might be trouble.
01501                                 TYPO3 is designed to use the default set of PHP4.3.0+ functions plus the functions of GDLib.
01502                                 Possibly these functions are disabled due to security risks and most likely the list would include a function like <i>exec()</i> which is use by TYPO3 to access ImageMagick.
01503                         ",2);
01504                 } else $this->message($ext, 'Functions disabled: none',"",-1);
01505                 if (!ini_get('sendmail_path'))  {
01506                         $this->message($ext, 'Sendmail path not defined!',"
01507                                 <i>sendmail_path=".ini_get('sendmail_path')."</i>
01508                                 This may be critical to TYPO3's use of the mail() function. Please be sure that the mail() function in your php-installation works!
01509                         ".$this->check_mail('get_form'),1);
01510                 } else {
01511                         list($prg) = explode(' ',ini_get('sendmail_path'));
01512                         if (TYPO3_OS=='WIN')    {
01513                                 $this->message($ext, 'Sendmail program not searched for on Windows',"",1);
01514                         } else {
01515                                 if (!@is_executable($prg))      {
01516                                         $this->message($ext, 'Sendmail program not found or not executable?',"
01517                                                 <i>sendmail_path=".ini_get('sendmail_path')."</i>
01518                                                 This may be critical to TYPO3's use of the mail() function. Please be sure that the mail() function in your php-installation works!
01519                                         ".$this->check_mail('get_form'),1);
01520                                 } else {
01521                                         $this->message($ext, 'Sendmail OK',"
01522                                                 <i>sendmail_path=".ini_get('sendmail_path').'</i>
01523                                                 You may check the mail() function by entering your email address here:
01524                                         '.$this->check_mail('get_form'),-1);
01525                                 }
01526                         }
01527                 }
01528 
01529                         // *****************
01530                         // Safe mode related
01531                         // *****************
01532                 if (ini_get('safe_mode'))       {
01533                         $this->message($ext, 'Safe mode turned on',"
01534                                 <i>safe_mode=".ini_get('safe_mode')."</i>
01535                                 In safe_mode PHP is restricted in several ways. This is a good thing because it adds protection to your (and others) scripts. But it may also introduce problems. In TYPO3 this <em>may be</em> a problem in two areas: File administration and execution of external programs, in particular ImageMagick.
01536                                 If you just ignore this warning, you'll most likely find, that TYPO3 seems to work except from the image-generation. The problem in that case is that the external ImageMagick programs are not allowed to be executed from the regular paths like \"/usr/bin/\" or \"/usr/X11R6/bin/\".
01537                                 If you use safe_mode with TYPO3, you should disable use of external programs ([BE][disable_exec_function]=1).
01538                                 In safe mode you must ensure that all the php-scripts and upload folders are owned by the same user.
01539 
01540                                         <i>safe_mode_exec_dir=".ini_get('safe_mode_exec_dir')."</i>
01541                                         If the ImageMagick utilities are located in this directory, everything is fine. Below on this page, you can see if ImageMagick is found here. If not, ask you ISP to put the three ImageMagick programs, 'convert', 'combine'/'composite' and 'identify' there (eg. with symlinks if Unix server)
01542 
01543 
01544                                         <strong>Example of safe_mode settings:</strong>
01545                                         Set this in the php.ini file:
01546 
01547                                         ; Safe Mode
01548                                         safe_mode               =       On
01549                                         safe_mode_exec_dir      = /usr/bin/
01550 
01551                                         ...and the ImageMagick '/usr/bin/convert' will be executable.
01552                                         The last slash is important (..../) and you can only specify one directory.
01553 
01554                                         <strong>Notice: </strong>
01555                                         ImageMagick 4.2.9 is recommended and the binaries are normally installed by RPM in /usr/X11R6/bin or by compiling in /usr/local/bin. Please look in the \"Inside TYPO3\" pdf-document for extensive information about ImageMagick issues.
01556                                         Paths to ImageMagick are defined in localconf.php and may be something else than /usr/bin/, but this is default for ImageMagick 5+
01557 
01558 
01559                         ",2);
01560                         if (ini_get('doc_root'))        {
01561                                 $this->message($ext, 'doc_root set',"
01562                                         <i>doc_root=".ini_get('doc_root')."</i>
01563                                         PHP cannot execute scripts outside this directory. If that is a problem is please correct it.
01564                                 ",1);
01565                         }
01566                         $this->config_array['safemode']=1;
01567                 } else $this->message($ext, 'safe_mode: off',"",-1);
01568                 if (ini_get('sql.safe_mode'))   {
01569                         $this->message($ext, 'sql.safe_mode is enabled',"
01570                                 <i>sql.safe_mode=".ini_get('sql.safe_mode').'</i>
01571                                 This means that you can only connect to the database with a username corresponding to the user of the webserver process or fileowner. Consult your ISP for information about this. Also see '.$this->linkIt('http://www.wrox.com/Consumer/Store/Books/2963/29632002.htm').'
01572                                 The owner of the current file is: <strong>'.get_current_user ()."</strong>
01573                         ",1);
01574                         $this->config_array['sql.safe_mode_user'] = get_current_user();
01575                 } else $this->message($ext, 'sql.safe_mode: off',"",-1);
01576                 if (ini_get('open_basedir'))    {
01577                         $this->message($ext, 'open_basedir set',"
01578                                 <i>open_basedir=".ini_get('open_basedir')."</i>
01579                                 This restricts TYPO3 to open and include files only in this path. Please make sure that this does not prevent TYPO3 from running.
01580                                 <strong>Notice (UNIX):</strong> Before checking a path according to open_basedir, PHP resolves all symbolic links.
01581                         ",1);
01582 //      ????                    If this option was set falsely you probably didn't see this page in the first place, but this option <strong>may spoil this configuration test</strong> when checking for such as ImageMagick executables.
01583                 } else $this->message($ext, 'open_basedir: off',"",-1);
01584 
01585         }
01586 
01593         function check_mail($cmd='')    {
01594                 switch($cmd)    {
01595                         case 'get_form':
01596                                 $out='
01597                                 You can check the mail() function by entering your email address here and press the button. You should then receive a testmail from test@test.test.<br /> Since almost all mails in TYPO3 are sent using the t3lib_htmlmail class, sending with this class can be tested by checking the box <strong>Test t3lib_htmlmail</strong> below. The return-path of the mail is set to null@'.t3lib_div::getIndpEnv('HTTP_HOST').'. Some mail servers won\'t send the mail if the host of the return-path is not resolved correctly.
01598                                 <form action="'.$this->action.'" method="post"><input type="text" name="TYPO3_INSTALL[check_mail]"><br /><input type="checkbox" name="TYPO3_INSTALL[use_htmlmail]" id="use_htmlmail" ><label for="use_htmlmail">Test t3lib_htmlmail.</label>
01599                                         <input type="submit" value="Send test mail"></form>';
01600                         break;
01601                         default:
01602                                 if (trim($this->INSTALL['check_mail'])) {
01603                                         $subject = 'TEST SUBJECT';
01604                                         $email = trim($this->INSTALL['check_mail']);
01605 
01606                                         if($this->INSTALL['use_htmlmail'])      {
01607                                                 require_once (PATH_t3lib.'class.t3lib_htmlmail.php');
01608                                                 $emailObj = t3lib_div::makeInstance('t3lib_htmlmail');
01609                                                 $emailObj->start();
01610                                                 $emailObj->subject = $subject;
01611                                                 $emailObj->from_email = 'test@test.test';
01612                                                 $emailObj->from_name = 'TYPO3 Install Tool';
01613                                                 $emailObj->returnPath = 'null@'.t3lib_div::getIndpEnv('HTTP_HOST');
01614                                                 $emailObj->addPlain('TEST CONTENT');
01615                                                 $emailObj->setHTML($emailObj->encodeMsg('<html><body>HTML TEST CONTENT</body></html>'));
01616                                                 $emailObj->send($email);
01617                                         } else {
01618                                                 t3lib_div::plainMailEncoded($email,$subject,'TEST CONTENT','From: test@test.test');
01619                                         }
01620                                         $this->messages[]= 'MAIL WAS SENT TO: '.$email;
01621                                 }
01622                         break;
01623                 }
01624                 return $out;
01625         }
01626 
01632         function checkExtensions()      {
01633                 $ext = 'GDLib';
01634                 $this->message($ext);
01635 
01636                 $software_info=1;
01637                 if (extension_loaded('gd') && $this->isGD())    {
01638                         $this->config_array['gd']=1;
01639                         $this->message($ext, 'GDLib found',"",-1);
01640                         if ($this->isPNG()) {
01641                                 $this->config_array['gd_png']=1;
01642                                 $this->message($ext, 'PNG supported',"",-1);
01643                         }
01644                         if ($this->isGIF()) {
01645                                 $this->config_array['gd_gif']=1;
01646                                 $this->message($ext, 'GIF supported',"",-1);
01647                         }
01648                         if ($this->isJPG()) {
01649                                 $this->config_array['gd_jpg']=1;
01650                                 $this->message($ext, 'JPG supported (not used by TYPO3)','');
01651                         }
01652                         if (!$this->config_array['gd_gif'] && !$this->config_array['gd_png'])   {
01653                                 $this->message($ext, 'PNG or GIF not supported', nl2br(trim('
01654                                         Your GDLib supports either GIF nor PNG. It must support either one of them.
01655                                 ')), 2);
01656                         } else {
01657                                 $msg=array();
01658                                 if ($this->config_array['gd_gif'] && $this->config_array['gd_png'])             {
01659                                         $msg[0]='You can choose between generating GIF or PNG files, as your GDLib supports both.';
01660                                 }
01661                                 if ($this->config_array['gd_gif'])              {
01662                                         $msg[10]="You should watch out for the generated size of the GIF-files because some versions of the GD library do not compress them with LZW, but RLE and ImageMagick is subsequently used to compress with LZW. But in the case of ImageMagick failing this task (eg. not being compiled with LZW which is the case with some versions) you'll end up with GIF-filesizes all too big!
01663                                         This install tool tests what kinds of GIF compression are available in the ImageMagick installations by a physical test. You can also check it manually by opening a TYPO3 generated gif-file with Photoshop and save it in a new file. If the file sizes of the original and the new file are almost the same, you're having LZW compression and everything is fine.";
01664                                 }
01665                                 if ($this->config_array['gd_png'])              {
01666                                         $msg[20]='TYPO3 prefers the use of GIF-files and most likely your visitors on your website does too as not all browsers support PNG yet.';
01667                                 }
01668                                 $this->message($ext, 'GIF / PNG issues', nl2br(trim(implode($msg,chr(10)))), 1);
01669                         }
01670                         if (!$this->isTTF())    {
01671                                 $this->message($ext, 'FreeType is apparently not installed', "
01672                                         It looks like the FreeType library is not compiled into GDLib. This is required when TYPO3 uses GDLib and you'll most likely get errors like 'ImageTTFBBox is not a function' or 'ImageTTFText is not a function'.
01673                                 ", 2);
01674                         } else {
01675                                 $this->message($ext, 'FreeType quick-test ('.($this->isGIF()?'as GIF':'as PNG').')', '<img src="'.htmlspecialchars(t3lib_div::getIndpEnv('REQUEST_URI').'&testingTrueTypeSupport=1').'" alt=""><br />(If the text is exceeding the image borders you are using Freetype 2 and need to set TYPO3_CONF_VARS[GFX][TTFdpi]=96.<br />If there is no image at all Freetype is most likely NOT available and you can just as well disable GDlib for TYPO3...)', -1);
01676                                 $this->config_array['freetype']=1;
01677                         }
01678                 } else {
01679                         $this->message($ext, 'GDLib not found', "
01680                                 GDLib is required if you want to use the GIFBUILDER object in TypoScript. GIFBUILDER is in charge of all advanced image generation in TypoScript, including graphical menuitems.
01681                                 GDLib is also used in the TYPO3 Backend (TBE) to generate record icons and new module tabs.
01682                                 It's highly recommended to install this library. Remember to compile GD with FreeType which is also required.
01683                                 If you choose not to install GDLib, you can disable it in the configuration with [GFX][gdlib]=0;.
01684                         ", 2);
01685                 }
01686                 $this->message($ext, 'GDLib software information', nl2br(trim($this->getGDSoftwareInfo())));
01687         }
01688 
01694         function checkDirs()    {
01695                 // Check typo3/temp/
01696                 $ext='Directories';
01697                 $this->message($ext);
01698 
01699                 $uniqueName = md5(uniqid(microtime()));
01700 
01701                         // The requirement level (the integer value, ie. the second value of the value array) has the following meanings:
01702                         // -1 = not required, but if it exists may be writable or not
01703                         //  0 = not required, if it exists the dir should be writable
01704                         //  1 = required, don't has to be writable
01705                         //  2 = required, has to be writable
01706 
01707                 $checkWrite=array(
01708                         'typo3temp/' => array('This folder is used by both the frontend (FE) and backend (BE) interface for all kind of temporary and cached files.',2,'dir_typo3temp'),
01709                         'typo3temp/pics/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01710                         'typo3temp/temp/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01711                         'typo3temp/llxml/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01712                         'typo3temp/cs/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01713                         'typo3temp/GB/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01714                         'typo3conf/' => array('This directory contains the local configuration files of your website. TYPO3 must be able to write to these configuration files during setup and when the Extension Manager (EM) installs extensions.',2),
01715                         'typo3conf/ext/' => array('Location for local extensions. Must be writable if the Extension Manager is supposed to install extensions for this website.',0),
01716                         'typo3conf/l10n/' => array('Location for translations. Must be writable if the Extension Manager is supposed to install translations for extensions.',0),
01717                         TYPO3_mainDir.'ext/' => array('Location for global extensions. Must be writable if the Extension Manager is supposed to install extensions globally in the source.',-1),
01718                         'uploads/' => array('Location for uploaded files from RTE, in the subdirectories for uploaded files of content elements.',2),
01719                         'uploads/pics/' => array('Typical location for uploaded files (images especially).',0),
01720                         'uploads/media/' => array('Typical location for uploaded files (non-images especially).',0),
01721                         'uploads/tf/' => array('Typical location for uploaded files (TS template resources).',0),
01722                         'fileadmin/' => array('Location for local files such as templates, independent uploads etc.',-1),
01723                         'fileadmin/_temp_/' => array('Typical temporary location for default upload of files by administrators.',0),
01724                 );
01725 
01726                 foreach ($checkWrite as $relpath => $descr)     {
01727 
01728                                 // Check typo3temp/
01729                         $general_message = $descr[0];
01730 
01731                         if (!@is_dir(PATH_site.$relpath))       {       // If the directory is missing, try to create it
01732                                 t3lib_div::mkdir(PATH_site.$relpath);
01733                         }
01734 
01735                         if (!@is_dir(PATH_site.$relpath))       {
01736                                 if ($descr[1])  {       // required...
01737                                         $this->message($ext, $relpath.' directory does not exist and could not be created','
01738                                         <em>Full path: '.PATH_site.$relpath.'</em>
01739                                         '.$general_message.'
01740 
01741                                         This error should not occur as '.$relpath.' must always be accessible in the root of a TYPO3 website.
01742                                         ',3);
01743                                 } else {
01744                                         if ($descr[1] == 0)     {
01745                                                 $msg = 'This directory does not necessarily have to exist but if it does it must be writable.';
01746                                         } else {
01747                                                 $msg = 'This directory does not necessarily have to exist and if it does it can be writable or not.';
01748                                         }
01749                                         $this->message($ext, $relpath.' directory does not exist','
01750                                         <em>Full path: '.PATH_site.$relpath.'</em>
01751                                         '.$general_message.'
01752 
01753                                         '.$msg.'
01754                                         ',2);
01755                                 }
01756                         } else {
01757                                 $file = PATH_site.$relpath.$uniqueName;
01758                                 @touch($file);
01759                                 if (@is_file($file))    {
01760                                         unlink($file);
01761                                         if ($descr[2])  { $this->config_array[$descr[2]]=1; }
01762                                         $this->message($ext, $relpath.' writable','',-1);
01763                                 } else {
01764                                         $severity = ($descr[1]==2 || $descr[1]==0) ? 3 : 2;
01765                                         if ($descr[1] == 0 || $descr[1] == 2) {
01766                                                 $msg = 'The directory '.$relpath.' must be writable!';
01767                                         } elseif ($descr[1] == -1 || $descr[1] == 1) {
01768                                                 $msg = 'The directory '.$relpath.' does not neccesarily have to be writable.';
01769                                         }
01770                                         $this->message($ext, $relpath.' directory not writable','
01771                                         <em>Full path: '.$file.'</em>
01772                                         '.$general_message.'
01773 
01774                                         Tried to write this file (with touch()) but didn\'t succeed.
01775                                         '.$msg.'
01776                                         ',$severity);
01777                                 }
01778                         }
01779                 }
01780         }
01781 
01790         function checkImageMagick($paths)       {
01791                 $ext='Check Image Magick';
01792                 $this->message($ext);
01793 
01794                 $paths = array_unique($paths);
01795 
01796                 $programs = explode(',','gm,convert,combine,composite,identify');
01797                 $isExt = TYPO3_OS=="WIN" ? ".exe" : "";
01798                 $this->config_array['im_combine_filename']='combine';
01799                 reset($paths);
01800                 while(list($k,$v)=each($paths)) {
01801                         reset($programs);
01802                         if (!ereg('[\\\/]$',$v)) $v.='/';
01803                         while(list(,$filename)=each($programs)) {
01804                                 if (ini_get('open_basedir') || (@file_exists($v)&&@is_file($v.$filename.$isExt))) {
01805                                         $version = $this->_checkImageMagick_getVersion($filename,$v);
01806                                         if($version > 0)        {
01807                                                 if($filename=='gm')     {       // Assume GraphicsMagick
01808                                                         $index[$v]['gm']=$version;
01809                                                         continue;       // No need to check for "identify" etc.
01810                                                 } else  {       // Assume ImageMagick
01811                                                         $index[$v][$filename]=$version;
01812                                                 }
01813                                         }
01814                                 }
01815                         }
01816                         if (count($index[$v])>=3 || $index[$v]['gm'])   { $this->config_array['im']=1; }
01817 
01818                         if ($index[$v]['gm'] || (!$index[$v]['composite'] && $index[$v]['combine'])) {
01819                                 $this->config_array['im_combine_filename']='combine';
01820                         } elseif ($index[$v]['composite'] && !$index[$v]['combine'])  {
01821                                 $this->config_array['im_combine_filename']='composite';
01822                         }
01823 
01824                         if (isset($index[$v]['convert']) && $this->checkIMlzw)  {
01825                                 $index[$v]['gif_capability'] = ''.$this->_checkImageMagickGifCapability($v);
01826                         }
01827                 }
01828                 $this->config_array['im_versions']=$index;
01829                 if (!$this->config_array['im']) {
01830                         $this->message($ext, 'No ImageMagick installation available',"
01831                         It seems that there is no adequate ImageMagick installation available at the checked locations (".implode($paths, ', ').")
01832                         An 'adequate' installation for requires 'convert', 'combine'/'composite' and 'identify' to be available
01833                         ",2);
01834                 } else {
01835                         $theCode='';
01836                         reset($this->config_array['im_versions']);
01837                         while(list($p,$v)=each($this->config_array['im_versions']))     {
01838                                 $ka=array();
01839                                 reset($v);
01840                                 while(list($ka[])=each($v)){}
01841                                 $theCode.='<tr><td>'.$this->fw($p).'</td><td>'.$this->fw(implode($ka,'<br />')).'</td><td>'.$this->fw(implode($v,'<br />')).'</td></tr>';
01842                         }
01843                         $this->message($ext, 'Available ImageMagick/GraphicsMagick installations:','<table border="1" cellpadding="2" cellspacing="2">'.$theCode.'</table>',-1);
01844                 }
01845                 $this->message($ext, 'Search for ImageMagick:','
01846                         <form action="'.$this->action.'" method="post">
01847                                 <input type="checkbox" name="TYPO3_INSTALL[checkIM][lzw]" id="checkImLzw" value="1"'.($this->INSTALL['checkIM']['lzw']?' checked="checked"':'').'> <label for="checkImLzw">Check LZW capabilities.</label>
01848 
01849                                 Check this path for ImageMagick installation:
01850                                 <input type="text" name="TYPO3_INSTALL[checkIM][path]" value="'.htmlspecialchars($this->INSTALL['checkIM']['path']).'">
01851                                 (Eg. "D:\wwwroot\im537\ImageMagick\" for Windows or "/usr/bin/" for Unix)<br />
01852 
01853                                 <input type="submit" value="Send">
01854                         </form>
01855                 ',0);
01856 
01857         }
01858 
01865         function _checkImageMagickGifCapability($path)  {
01866                 if ($this->config_array['dir_typo3temp'])       {               //  && !$this->config_array['safemode']
01867                         $tempPath = $this->typo3temp_path;
01868                         $uniqueName = md5(uniqid(microtime()));
01869                         $dest = $tempPath.$uniqueName.'.gif';
01870                         $src = $this->backPath.'gfx/typo3logo.gif';
01871                         if (@is_file($src) && !strstr($src,' ') && !strstr($dest,' '))  {
01872                                 $cmd = t3lib_div::imageMagickCommand('convert', $src.' '.$dest, $path);
01873                                 exec($cmd);
01874                         } else die('No typo3/gfx/typo3logo.gif file!');
01875                         $out='';
01876                         if (@is_file($dest))    {
01877                                 $new_info = @getimagesize($dest);
01878                                 clearstatcache();
01879                                 $new_size = filesize($dest);
01880                                 $src_info = @getimagesize($src);
01881                                 clearstatcache();
01882                                 $src_size = @filesize($src);
01883 
01884                                 if ($new_info[0]!=$src_info[0] || $new_info[1]!=$src_info[1] || !$new_size || !$src_size)       {
01885                                         $out='error';
01886                                 } else {
01887                                         if ($new_size/$src_size > 4) {  // NONE-LZW ratio was 5.5 in test
01888                                                 $out='NONE';
01889                                         } elseif ($new_size/$src_size > 1.5) {  // NONE-RLE ratio was not tested
01890                                                 $out='RLE';
01891                                         } else {
01892                                                 $out='LZW';
01893                                         }
01894                                 }
01895                                 unlink($dest);
01896                         }
01897                         return $out;
01898                 }
01899         }
01900 
01908         function _checkImageMagick_getVersion($file, $path)     {
01909                         // Temporarily override some settings
01910                 $im_version = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'];
01911                 $combine_filename = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename'];
01912 
01913                 if ($file=='gm')        {
01914                         $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'] = 'gm';
01915                         $file = 'identify';             // Work-around, preventing execution of "gm gm"
01916                         $parameters = '-version';       // Work-around - GM doesn't like to be executed without any arguments
01917                 } else {
01918                         $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'] = 'im5';
01919 
01920                         if($file=='combine' || $file=='composite')      {       // Override the combine_filename setting
01921                                 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename'] = $file;
01922                         }
01923                 }
01924 
01925                 $cmd = t3lib_div::imageMagickCommand($file, $parameters, $path);
01926                 $retVal = false;
01927                 exec($cmd, $retVal);
01928                 $string = $retVal[0];
01929                 list(,$ver) = explode('Magick', $string);
01930                 list($ver) = explode(' ',trim($ver));
01931 
01932                         // Restore the values
01933                 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'] = $im_version;
01934                 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename'] = $combine_filename;
01935                 return trim($ver);
01936         }
01937 
01943         function checkDatabase()                {
01944                 $ext='Check database';
01945                 $this->message($ext);
01946 
01947                 if (!extension_loaded('mysql') && !t3lib_extMgm::isLoaded('dbal'))      {
01948                         $this->message($ext, 'MySQL not available',"
01949                                 PHP does not feature MySQL support (which is pretty unusual).
01950                         ",2);
01951                 } else {
01952                         $cInfo='
01953                                 Username: <strong>'.TYPO3_db_username.'</strong>
01954                                 Password: <strong>'.TYPO3_db_password.'</strong>
01955                                 Host: <strong>'.TYPO3_db_host.'</strong>
01956                         ';
01957                         if (!TYPO3_db_host || !TYPO3_db_username)       {
01958                                 $this->message($ext, 'Username, password or host not set',"
01959                                         You may need to enter data for these values:
01960                                         ".trim($cInfo)."
01961 
01962                                         Use the form below.
01963                                 ",2);
01964                         }
01965                         if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
01966                                 $this->message($ext, 'Connected to SQL database successfully',"
01967                                 ".trim($cInfo)."
01968                                 ",-1,1);
01969                                 $this->config_array['mysqlConnect']=1;
01970                                 if (!TYPO3_db)  {
01971                                         $this->message($ext, 'No database selected',"
01972                                                 Currently you have no database selected.
01973                                                 Please select one or create a new database.
01974                                         ",3);
01975                                         $this->config_array['no_database']=1;
01976                                 } elseif (!$GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db))  {
01977                                         $this->message($ext, 'Database',"
01978                                                 '".TYPO3_db."' could not be selected as database!
01979                                                 Please select another one or create a new database.
01980                                         ",3,1);
01981                                         $this->config_array['no_database']=1;
01982                                 } else  {
01983                                         $this->message($ext, 'Database',"
01984                                                 <strong>".TYPO3_db."</strong> is selected as database.
01985                                         ",1,1);
01986                                 }
01987                         } else {
01988                                 $this->message($ext, 'Could not connect to SQL database!',"
01989                                 Connecting to SQL database failed with these settings:
01990                                 ".trim($cInfo)."
01991 
01992                                 Make sure you're using the correct set of data.".($this->config_array['sql.safe_mode_user']? "
01993                                 <strong>Notice:</strong> <em>sql.safe_mode</em> is turned on, so apparently your username to the database is the same as the scriptowner, which is '".$this->config_array['sql.safe_mode_user']."'":"")."
01994                                 ",3);
01995                         }
01996                 }
01997         }
01998 
02005         function setupGeneral($cmd='')  {
02006                 switch($cmd)    {
02007                         case 'get_form':
02008                                         // Database:
02009                                 $out='
02010                                 <form name="setupGeneral" action="'.$this->action.'" method="post">
02011                                 <table border="0" cellpadding="0" cellspacing="0">';
02012 
02013                                 $out.=$this->wrapInCells('Username:', '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_username]" value="'.htmlspecialchars(TYPO3_db_username?TYPO3_db_username:($this->config_array['sql.safe_mode_user']?$this->config_array['sql.safe_mode_user']:"")).'">'.($this->config_array['sql.safe_mode_user']?"<br />sql.safe_mode_user: <strong>".$this->config_array['sql.safe_mode_user']."</strong>":""));
02014                                 $out.=$this->wrapInCells('Password:', '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_password]" value="'.htmlspecialchars(TYPO3_db_password).'">');
02015                                 $out.=$this->wrapInCells('Host:', '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_host]" value="'.htmlspecialchars(TYPO3_db_host).'">');
02016                                 if ($this->config_array['mysqlConnect'])        {
02017                                         $dbArr = $this->getDatabaseList();
02018                                         reset($dbArr);
02019                                         $options='';
02020                                         $dbIncluded=0;
02021                                         while(list(,$dbname)=each($dbArr))      {
02022                                                 $options.='<option value="'.htmlspecialchars($dbname).'"'.($dbname==TYPO3_db?' selected="selected"':'').'>'.htmlspecialchars($dbname).'</option>';
02023                                                 if ($dbname==TYPO3_db)  $dbIncluded=1;
02024                                         }
02025                                         if (!$dbIncluded && TYPO3_db)   {
02026                                                 $options.='<option value="'.htmlspecialchars(TYPO3_db).'" selected="selected">'.htmlspecialchars(TYPO3_db).' (NO ACCESS!)</option>';
02027                                         }
02028                                         $theCode='<select name="TYPO3_INSTALL[localconf.php][typo_db]">'.$options.'</select><br />Create database? (Enter name):<br /><input type="text" name="TYPO3_INSTALL[localconf.php][NEW_DATABASE_NAME]" value="">';
02029                                 } else {
02030                                         $theCode='<strong>'.htmlspecialchars(TYPO3_db).'</strong><br />(Can only select database if username/password/host is correctly set first)<input type="hidden" name="TYPO3_INSTALL[localconf.php][typo_db]" value="'.htmlspecialchars(TYPO3_db).'">';
02031                                 }
02032                                 $out.=$this->wrapInCells('', '<br />');
02033                                 $out.=$this->wrapInCells('Database:', $theCode);
02034                                 $out.=$this->wrapInCells('', '<br />');
02035 
02036                                 if ($this->mode!='123') {
02037                                         $out.=$this->wrapInCells('Site name:', '<input type="text" name="TYPO3_INSTALL[localconf.php][sitename]" value="'.htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']).'">');
02038                                         $out.=$this->wrapInCells('', '<br />');
02039                                         $out.='<script type="text/javascript" src="../md5.js"></script><script type="text/javascript">function generateEncryptionKey(key) {time=new Date(); key=MD5(time.getMilliseconds().toString());while(key.length<66){key=key+MD5(key)};return key;}</script>';
02040                                         $out.=$this->wrapInCells('Encryption key:', '<a name="set_encryptionKey"></a><input type="text" name="TYPO3_INSTALL[localconf.php][encryptionKey]" value="'.htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']).'"><br /><input type="button" onclick="document.forms[\'setupGeneral\'].elements[\'TYPO3_INSTALL[localconf.php][encryptionKey]\'].value=generateEncryptionKey(document.forms[\'setupGeneral\'].elements[\'TYPO3_INSTALL[localconf.php][encryptionKey]\'].value);" value="Generate random key">');
02041                                         $out.=$this->wrapInCells('', '<br />');
02042 
02043                                                 // Other
02044                                         $fA = $this->setupGeneralCalculate();
02045 
02046                                         if (is_array($fA['disable_exec_function']))     {
02047                                                 $out.=$this->wrapInCells('[BE][disable_exec_function]=', $this->getFormElement($fA['disable_exec_function'], $fA['disable_exec_function'], 'TYPO3_INSTALL[localconf.php][disable_exec_function]', $GLOBALS['TYPO3_CONF_VARS']['BE']['disable_exec_function']));
02048                                         }
02049                                         if (is_array($fA['gdlib']))     {
02050                                                 $out.=$this->wrapInCells('[GFX][gdlib]=', $this->getFormElement($fA['gdlib'], $fA['gdlib'], 'TYPO3_INSTALL[localconf.php][gdlib]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']));
02051                                                 if (is_array($fA['gdlib_png']) && $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib'])  {
02052                                                         $out.=$this->wrapInCells('[GFX][gdlib_png]=', $this->getFormElement($this->setLabelValueArray($fA['gdlib_png'],2), $fA['gdlib_png'], 'TYPO3_INSTALL[localconf.php][gdlib_png]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png']));
02053                                                 }
02054                                         }
02055                                         if (is_array($fA['im']))        {
02056                                                 $out.=$this->wrapInCells('[GFX][im]=', $this->getFormElement($fA['im'], $fA['im'], 'TYPO3_INSTALL[localconf.php][im]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['im']));
02057                                                 $out.=$this->wrapInCells('[GFX][im_combine_filename]=', $this->getFormElement($fA['im_combine_filename'], ($fA['im_combine_filename']?$fA['im_combine_filename']:"combine"), 'TYPO3_INSTALL[localconf.php][im_combine_filename]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename']));
02058                                                 $out.=$this->wrapInCells('[GFX][im_version_5]=', $this->getFormElement($fA['im_version_5'], ($fA['im_version_5']?$fA['im_version_5']:''), 'TYPO3_INSTALL[localconf.php][im_version_5]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']));
02059                                                 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im'])   {
02060                                                         if (is_array($fA['im_path']))   {
02061                                                                 $out.=$this->wrapInCells('[GFX][im_path]=', $this->getFormElement($this->setLabelValueArray($fA['im_path'],1), $this->setLabelValueArray($fA['im_path'],0), 'TYPO3_INSTALL[localconf.php][im_path]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path']));
02062                                                         }
02063                                                         if (is_array($fA['im_path_lzw']))       {
02064                                                                 $out.=$this->wrapInCells('[GFX][im_path_lzw]=', $this->getFormElement($this->setLabelValueArray($fA['im_path_lzw'],1), $this->setLabelValueArray($fA['im_path_lzw'],0), 'TYPO3_INSTALL[localconf.php][im_path_lzw]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw']));
02065                                                         }
02066                                                 }
02067                                         }
02068                                         $out.=$this->wrapInCells('[GFX][TTFdpi]=', '<input type="text" name="TYPO3_INSTALL[localconf.php][TTFdpi]" value="'.htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['GFX']['TTFdpi']).'">');
02069                                 }
02070 
02071 
02072                                 $out.=$this->wrapInCells('', '<br /><input type="submit" value="Update localconf.php"><br />
02073                                 <strong>NOTICE: </strong>By clicking this button, localconf.php is updated with new values for the parameters listed above!');
02074                                 $out.='
02075                                 </table>
02076                                 </form>';
02077                         break;
02078                         default:
02079                                 if (is_array($this->INSTALL['localconf.php']))          {
02080                                         $errorMessages=array();
02081                                         $lines = $this->writeToLocalconf_control();
02082 
02083                                                 // New database?
02084 #debug($this->INSTALL);
02085                                         if (trim($this->INSTALL['localconf.php']['NEW_DATABASE_NAME'])) {
02086                                                 $newdbname=trim($this->INSTALL['localconf.php']['NEW_DATABASE_NAME']);
02087                                                 if (!ereg('[^[:alnum:]_-]',$newdbname)) {
02088                                                         if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
02089                                                                 if ($GLOBALS['TYPO3_DB']->admin_query('CREATE DATABASE '.$newdbname)) {
02090                                                                         $this->INSTALL['localconf.php']['typo_db'] = $newdbname;
02091                                                                         $this->messages[]= "Database '".$newdbname."' created";
02092                                                                 } else $this->messages[]= $errorMessages[] = "Could not create database '".$newdbname."' (...not created)";
02093                                                         } else $this->messages[]= $errorMessages[] = "Could not connect to database when creating database '".$newdbname."' (...not created)";
02094                                                 } else $this->messages[]= $errorMessages[] = "The NEW database name '".$newdbname."' was not alphanumeric, a-zA-Z0-9_- (...not created)";
02095                                         }
02096 #debug($this->messages)         ;
02097                                                 // Parsing values
02098                                         reset($this->INSTALL['localconf.php']);
02099                                         while(list($key,$value)=each($this->INSTALL['localconf.php']))          {
02100                                                 switch((string)$key)    {
02101                                                         case 'typo_db_username':
02102                                                                 if (strlen($value)<50)  {
02103                                                                         if (strcmp(TYPO3_db_username,$value))           $this->setValueInLocalconfFile($lines, '$typo_db_username', trim($value));
02104                                                                 } else $this->messages[]= $errorMessages[] = "Username '".$value."' was longer than 50 chars (...not saved)";
02105                                                         break;
02106                                                         case 'typo_db_password':
02107                                                                 if (strlen($value)<50)  {
02108                                                                         if (strcmp(TYPO3_db_password,$value))           $this->setValueInLocalconfFile($lines, '$typo_db_password',  trim($value));
02109                                                                 } else $this->messages[]= $errorMessages[] = "Password '".$value."' was longer than 50 chars (...not saved)";
02110                                                         break;
02111                                                         case 'typo_db_host':
02112                                                                 if (!ereg("[^[:alnum:]_\.:-]",$value) && strlen($value)<50)     {
02113                                                                         if (strcmp(TYPO3_db_host,$value))               $this->setValueInLocalconfFile($lines, '$typo_db_host', $value);
02114                                                                 } else $this->messages[]= $errorMessages[] = "Host '".$value."' was not alphanumeric, a-zA-Z0-9_-:., or longer than 50 chars (...not saved)";
02115                                                         break;
02116                                                         case 'typo_db':
02117                                                                 if (strlen($value)<50)  {
02118                                                                         if (strcmp(TYPO3_db,$value))            $this->setValueInLocalconfFile($lines, '$typo_db',  trim($value));
02119                                                                 } else $this->messages[]= $errorMessages[] = "Database name '".$value."' was longer than 50 chars (...not saved)";
02120                                                         break;
02121                                                         case 'disable_exec_function':
02122                                                                 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['BE']['disable_exec_function'],$value))  $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'BE\'][\'disable_exec_function\']', $value?1:0);
02123                                                         break;
02124                                                         case 'sitename':
02125                                                                 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'],$value))      $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'SYS\'][\'sitename\']', $value);
02126                                                         break;
02127                                                         case 'encryptionKey':
02128                                                                 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'SYS\'][\'encryptionKey\']', $value);
02129                                                         break;
02130                                                         case 'compat_version':
02131                                                                 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['SYS']['compat_version'],$value))        $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'SYS\'][\'compat_version\']', $value);
02132                                                         break;
02133                                                         case 'im_combine_filename':
02134                                                                 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename'],$value))   $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\'][\'im_combine_filename\']', $value);
02135                                                         break;
02136                                                         case 'gdlib':
02137                                                         case 'gdlib_png':
02138                                                         case 'im':
02139                                                                 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX'][$key],$value))    $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\']["'.$key.'"]', $value?1:0);
02140                                                         break;
02141                                                         case 'im_path':
02142                                                                 list($value,$version) = explode('|',$value);
02143                                                                 if (!ereg('[[:space:]]',$value,$reg) && strlen($value)<100)     {
02144                                                                         if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX'][$key],$value))    {
02145                                                                                 $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\']["'.$key.'"]', $value);
02146                                                                         }
02147                                                                         if(doubleval($version)>0 && doubleval($version)<4)      {       // Assume GraphicsMagick
02148                                                                                 $value_ext = 'gm';
02149                                                                         } elseif(doubleval($version)<5) {       // Assume ImageMagick 4.x
02150                                                                                 $value_ext = '';
02151                                                                         } else  {       // Assume ImageMagick 5+
02152                                                                                 $value_ext = 'im5';
02153                                                                         }
02154                                                                         if (strcmp(strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']),$value_ext))  {
02155                                                                                 $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\'][\'im_version_5\']', $value_ext);
02156                                                                         }
02157         //                                                              if (strcmp(strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']),$value))      $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS['GFX']['im_version_5']', $value);
02158                                                                 } else $this->messages[]= $errorMessages[] = "Path '".$value."' contains spaces or is longer than 100 chars (...not saved)";
02159                                                         break;
02160                                                         case 'im_path_lzw':
02161                                                                 list($value) = explode('|',$value);
02162                                                                 if (!ereg('[[:space:]]',$value) && strlen($value)<100)  {
02163                                                                         if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX'][$key],$value))    $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\']["'.$key.'"]', $value);
02164                                                                 } else $this->messages[]= $errorMessages[] = "Path '".$value."' contains spaces or is longer than 100 chars (...not saved)";
02165                                                         break;
02166                                                         case 'TTFdpi':
02167                                                                 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX']['TTFdpi'],$value))        $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\'][\'TTFdpi\']', $value);
02168                                                         break;
02169                                                 }
02170 
02171 
02172                                         }
02173 
02174                                         if (count($errorMessages))      {
02175                                                 echo '<h3>ERRORS</h3>';
02176                                                 echo t3lib_div::view_array($errorMessages);
02177                                                 echo 'Click the browsers "Back" button to reenter the values.';
02178                                                 exit;
02179                                         }
02180                                         $this->writeToLocalconf_control($lines);
02181                                 }
02182                         break;
02183                 }
02184                 return $out;
02185         }
02186 
02195         function writeToLocalconf_control($lines='', $showOutput=TRUE)  {
02196                 $returnVal = parent::writeToLocalconf_control($lines);
02197 
02198                 if ($showOutput)        {
02199                         switch($returnVal)      {
02200                                 case 'continue':
02201                                         $content = '<br /><br />'.implode($this->messages,'<hr />').'<br /><br /><a href="'.$this->action.'">Click to continue...</a>';
02202                                         $this->outputExitBasedOnStep($content);
02203                                 break;
02204                                 case 'nochange':
02205                                         $content = '<strong>Writing to \'localconf.php\':</strong><br /><br />No values were changed, so nothing is updated!<br /><br /><a href="'.$this->action.'">Click to continue...</a>';
02206                                         $this->outputExitBasedOnStep('<br />'.$content);
02207                                 break;
02208                         }
02209                 }
02210                 return $returnVal;
02211         }
02212 
02219         function outputExitBasedOnStep($content)        {
02220                 if ($this->step)        {
02221                         Header('Location: '.t3lib_div::locationHeaderUrl($this->action));
02222                 } else {
02223                         echo $this->outputWrapper($content);
02224                 }
02225                 exit;
02226         }
02227 
02235         function setLabelValueArray($arr,$type) {
02236                 reset($arr);
02237                 while(list($k,$v)=each($arr))   {
02238                         if($this->config_array['im_versions'][$v]['gm'])        {
02239                                 $program = 'gm';
02240                         } else  {
02241                                 $program = 'convert';
02242                         }
02243 
02244                         switch($type)   {
02245                                 case 0: // value, im
02246                                         $arr[$k].='|'.$this->config_array['im_versions'][$v][$program];
02247                                 break;
02248                                 case 1: // labels, im
02249                                         if($this->config_array['im_versions'][$v][$program])    {
02250                                                 $arr[$k].= ' ('.$this->config_array['im_versions'][$v][$program];
02251                                                 $arr[$k].= ($this->config_array['im_versions'][$v]['gif_capability'] ? ', '.$this->config_array['im_versions'][$v]['gif_capability'] : '');
02252                                                 $arr[$k].= ')';
02253                                         } else  {
02254                                                 $arr[$k].= '';
02255                                         }
02256                                 break;
02257                                 case 2: // labels, gd
02258                                         $arr[$k].=' ('.($v==1?'PNG':'GIF').')';
02259                                 break;
02260                         }
02261                 }
02262                 return $arr;
02263         }
02264 
02275         function getFormElement($labels,$values,$fieldName,$default,$msg='')    {
02276                 $out.='<strong>'.htmlspecialchars(current($labels)).'</strong><br />current value is '.htmlspecialchars($default).($msg?'<br />'.$msg:'');
02277                 if (count($labels)>1)           {
02278                         reset($labels);
02279                         while(list($k,$v)=each($labels))        {
02280                                 list($cleanV) =explode('|',$values[$k]);
02281                                 $options.='<option value="'.htmlspecialchars($values[$k]).'"'.(!strcmp($default,$cleanV)?' selected="selected"':'').'>'.htmlspecialchars($v).'</option>';
02282                         }
02283                         $out.='<br /><select name="'.$fieldName.'">'.$options.'</select>';
02284                 } else {
02285                         $out.='<input type="hidden" name="'.$fieldName.'" value="'.htmlspecialchars(current($values)).'">';
02286                 }
02287                 return $out.'<br />';
02288         }
02289 
02295         function getDatabaseList()      {
02296                 $dbArr=array();
02297                 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
02298                         $dbArr = $GLOBALS['TYPO3_DB']->admin_get_dbs();
02299                 }
02300                 return $dbArr;
02301         }
02302 
02319         function setupGeneralCalculate()        {
02320                 $formArray['disable_exec_function']=array(0);
02321                 $formArray['im_path']=array('');
02322                 $formArray['im_path_lzw']=array('');
02323                 $formArray['im_combine_filename']=array('');
02324                 $formArray['im_version_5']=array('');
02325                 $formArray['im']=array(1);
02326                 $formArray['gdlib']=array(1);
02327                 if ($this->config_array['gd'] && ($this->config_array['gd_gif'] || $this->config_array['gd_png']))      {
02328                         if ($this->config_array['gd_gif'] && !$this->config_array['gd_png'])    {
02329                                 $formArray['gdlib_png']=array(0);
02330                         } elseif (!$this->config_array['gd_gif'] && $this->config_array['gd_png'])      {
02331                                 $formArray['gdlib_png']=array(1);
02332                         } else {
02333                                 $formArray['gdlib_png']=array(0,1);
02334                         }
02335                 } else {
02336                         $formArray['gdlib']=array(0);
02337                 }
02338                 if ($this->config_array['safemode'])    {
02339                         $formArray['disable_exec_function']=array(1);
02340                 }
02341                 if ($this->config_array['im'])  {
02342                         $formArray['im']=array(1);
02343                         $LZW_found=0;
02344                         $found=0;
02345                         reset($this->config_array['im_versions']);
02346                         $totalArr=array();
02347                         while(list($path,$dat)=each($this->config_array['im_versions']))        {
02348                                 if (count($dat)>=3)     {
02349                                         if (doubleval($dat['convert'])<5)       {
02350                                                 $formArray['im_version_5']=array(0);
02351                                                 if ($dat['gif_capability']=='LZW')      {
02352                                                         $formArray['im_path']=array($path);
02353                                                         $found=2;
02354                                                 } elseif ($found<2)     {
02355                                                         $formArray['im_path']=array($path);
02356                                                         $found=1;
02357                                                 }
02358                                         } elseif (!$found)      {
02359                                                 $formArray['im_version_5']=array('im5');
02360                                                 $formArray['im_path']=array($path);
02361                                                 $found=1;
02362                                         }
02363                                 } elseif ($dat['gm'])   {
02364                                         $formArray['im_version_5']=array('gm');
02365                                         if ($dat['gif_capability']=='LZW')      {
02366                                                 $formArray['im_path']=array($path);
02367                                                 $found=2;
02368                                         } elseif ($found<2)     {
02369                                                 $formArray['im_path']=array($path);
02370                                                 $found=1;
02371                                         }
02372                                 }
02373                                 if ($dat['gif_capability']=='LZW')      {
02374                                         if (doubleval($dat['convert'])<5 || !$LZW_found)        {
02375                                                 $formArray['im_path_lzw']=array($path);
02376                                                 $LZW_found=1;
02377                                         }
02378                                 } elseif ($dat['gif_capability']=="RLE" && !$LZW_found) {
02379                                         $formArray['im_path_lzw']=array($path);
02380                                 }
02381                                 $totalArr[]=$path;
02382                         }
02383                         $formArray['im_path']=array_unique(array_merge($formArray['im_path'],$totalArr));
02384                         $formArray['im_path_lzw']=array_unique(array_merge($formArray['im_path_lzw'],$totalArr));
02385                         $formArray['im_combine_filename']=array($this->config_array['im_combine_filename']);
02386                 } else {
02387                         $formArray['im']=array(0);
02388                 }
02389                 return $formArray;
02390         }
02391 
02397         function getGDPartOfPhpinfo()   {
02398                 ob_start();
02399                 phpinfo();
02400                 $contents = ob_get_contents();
02401                 ob_end_clean();
02402                 $start_string = $this->getGD_start_string;
02403                 $end_string = $this->getGD_end_string;
02404                 list(,$gdpart_tmp) = explode($start_string,$contents,2);
02405                 list($gdpart) = explode($end_string,$start_string.$gdpart_tmp,2);
02406                 $gdpart.=$end_string;
02407                 return $gdpart;
02408         }
02409 
02416         function isTTF($phpinfo='')     {
02417 /*              $phpinfo = $phpinfo?$phpinfo:$this->getGDPartOfPhpinfo();
02418                 if (stristr($phpinfo, $this->getTTF_string))    return 1;
02419                 if (stristr($phpinfo, $this->getTTF_string_alt))        return 1;
02420                 */
02421 
02422                 if (!function_exists('imagettftext'))   return 0;       // Return right away if imageTTFtext does not exist.
02423 
02424                         // try, print truetype font:
02425                 $im = @imagecreate (300, 50);
02426                 $background_color = imagecolorallocate ($im, 255, 255, 55);
02427                 $text_color = imagecolorallocate ($im, 233, 14, 91);
02428 
02429                 $test = @imagettftext($im, t3lib_div::freetypeDpiComp(20), 0, 10, 20, $text_color, PATH_t3lib."/fonts/vera.ttf", 'Testing Truetype support');
02430                 if (t3lib_div::_GP('testingTrueTypeSupport'))   {
02431                         if ($this->isGIF())     {
02432                                 header ('Content-type: image/gif');
02433                                 imagegif ($im);
02434                         } else {
02435                                 header ('Content-type: image/png');
02436                                 imagepng ($im);
02437                         }
02438                         exit;
02439                 }
02440                 return is_array($test)?1:0;
02441         }
02442 
02443 
02444 
02445 
02446 
02447 
02448 
02449 
02450 
02451 
02452 
02453         /*****************************************
02454          *
02455          * ABOUT the isXXX functions.
02456          *
02457          * I had a very real experience that these checks DID NOT fail eg PNG support if it didn't exist!
02458          * So first (1) we check if the functions are there. If they ARE we are going to make further investigations (2) by creating an actual image.
02459          * And if THAT succeeds also, then we can be certain of the support!
02460          */
02461 
02465         function isGD() {
02466                 if (function_exists('imagecreate'))     {
02467                         if (@imagecreate (50, 100))     return 1;
02468                 }
02469         }
02470 
02476         function isGIF()        {
02477                 if (function_exists('imagecreatefromgif') && function_exists('imagegif') && ($this->ImageTypes() & IMG_GIF))    {       // If GIF-functions exists, also do a real test of them:
02478                         $im = @imagecreatefromgif(t3lib_extMgm::extPath('install').'imgs/jesus.gif');
02479                         return $im?1:0;
02480                 }
02481         }
02482 
02488         function isJPG()        {
02489                 if (function_exists('imagecreatefromjpeg') && function_exists('imagejpeg') && ($this->ImageTypes() & IMG_JPG))  {
02490                         return 1;
02491                 }
02492         }
02493 
02499         function isPNG()        {
02500                 if (function_exists('imagecreatefrompng') && function_exists('imagepng') && ($this->ImageTypes() & IMG_PNG))    {
02501                         $im = imagecreatefrompng(t3lib_extMgm::extPath('install').'imgs/jesus.png');
02502                         return $im?1:0;
02503                 }
02504         }
02505 
02511         function ImageTypes()   {
02512                 return imagetypes();
02513         }
02514 
02520         function getGDSoftwareInfo()    {
02521                 return trim('
02522                 You can get GDLib in the PNG version from '.$this->linkIt('http://www.boutell.com/gd/').'.<br />FreeType is for download at '.$this->linkIt('http://www.freetype.org/').'.
02523                 Generally, software for TYPO3 is found at '.$this->linkIt('http://typo3.sunsite.dk/software/').' and packages listed at '.$this->linkIt('http://typo3.org/1274.0.html').'.
02524                 ');
02525         }
02526 
02532         function generallyAboutConfiguration()  {
02533                 $out='
02534                 Local configuration is done by overriding default values in the included file, typo3conf/localconf.php. In this file you enter the database information along with values in the global array TYPO3_CONF_VARS.
02535                 The options in the TYPO3_CONF_VARS array and how to use it for your own purposes is discussed in the base configuration file, t3lib/config_default.php. This file sets up the default values and subsequently includes the localconf.php file in which you can then override values.
02536                 See this page for '.$this->linkIt('http://typo3.org/1275.0.html','more information about system requirements.').'
02537                 ';
02538                 return trim($out);
02539         }
02540 
02541 
02542 
02543 
02544 
02545 
02546 
02547 
02548 
02549 
02550 
02551 
02552 
02553         /**********************
02554          *
02555          * IMAGE processing
02556          *
02557          **********************/
02558 
02592         function checkTheImageProcessing()      {
02593                 $this->message('Image Processing','What is it?',"
02594                 TYPO3 is known for its ability to process images on the server.
02595                 In the backend interface (TBE) thumbnails are automatically generated (by ImageMagick in thumbs.php) as well as icons, menu items and pane tabs (by GDLib).
02596                 In the TypoScript enabled frontend all kinds of graphical elements are processed. Typically images are scaled down to fit the pages (by ImageMagick) and menu items, graphical headers and such are generated automatically (by GDLib + ImageMagick).
02597                 In addition TYPO3 is able to handle many file formats (thanks to ImageMagick), for example TIF, BMP, PCX, TGA, AI and PDF in addition to the standard web formats; JPG, GIF, PNG.
02598 
02599                 In order to do this, TYPO3 uses two sets of tools:
02600 
02601                 <strong>ImageMagick:</strong>
02602                 For conversion of non-web formats to webformats, combining images with alpha-masks, performing image-effects like blurring and sharpening.
02603                 ImageMagick is a collection of external programs on the server called by the exec() function in PHP. TYPO3 uses three of these, namely 'convert' (converting fileformats, scaling, effects), 'combine'/'composite' (combining images with masks) and 'identify' (returns image information).
02604                 Because ImageMagick are external programs, two requirements must be met: 1) The programs must be installed on the server and working and 2) if safe_mode is enabled, the programs must be located in the folder defined by the php.ini setting, <em>safe_mode_exec_dir</em> (else they are not executed).
02605                 ImageMagick is available for both Windows and Unix. The current version is 5+, but TYPO3 enthusiasts prefer an old version 4.2.9 because that version has three main advantages: It's faster in some operations, the blur-function works, the sharpen-function works. Anyway you do it, you must tell TYPO3 by configuration whether you're using version 5+ or 4.2.9. (flag: [GFX][im_version_5])
02606                 ImageMagick homepage is at ".$this->linkIt('http://www.imagemagick.org/')."
02607 
02608                 <strong>GDLib:</strong>
02609                 For drawing boxes and rendering text on images with truetype fonts. Also used for icons, menuitems and generally the TypoScript GIFBUILDER object is based on GDlib, but extensively utilizing ImageMagick to process intermediate results.
02610                 GDLib is accessed through internal functions in PHP, so in this case, you have no safe_mode problems, but you'll need a version of PHP with GDLib compiled in. Also in order to use TrueType fonts with GDLib you'll need FreeType compiled in as well.
02611                 ".$this->getGDSoftwareInfo().'
02612 
02613                 You can disable all image processing options in TYPO3 ([GFX][image_processing]=0), but that would seriously disable TYPO3.
02614                 ');
02615 
02616                 $this->message('Image Processing','Verifying the image processing capabilities of your server',"
02617                 This page performs image processing and displays the result. It's a thorough check that everything you've configured is working correctly.
02618                 It's quite simple to verify your installation; Just look down the page, the images in pairs should look like each other. If some images are not alike, something is wrong. You may also notice warnings and errors if this tool found signs of any problems.
02619 
02620                 The image to the right is the reference image (how it should be) and to the left the image made by your server.
02621                 The reference images are made with the classic ImageMagick install based on the 4.2.9 RPM and 5.2.3 RPM. If the version 5 flag is set, the reference images are made by the 5.2.3 RPM.
02622 
02623                 This test will work only if your ImageMagick/GDLib configuration allows it to. The typo3temp/ folder must be writable for all the temporary image files. They are all prefixed 'install_' so they are easy to recognize and delete afterwards.
02624                 ");
02625 
02626                 $im_path = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path'];
02627                 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']=='gm')   {
02628                         $im_path_version = $this->config_array['im_versions'][$im_path]['gm'];
02629                 } else {
02630                         $im_path_version = $this->config_array['im_versions'][$im_path]['convert'];
02631                 }
02632                 $im_path_lzw = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw'];
02633                 $im_path_lzw_version = $this->config_array['im_versions'][$im_path_lzw]['convert'];
02634                 $msg = '
02635                 ImageMagick enabled: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im'].'</strong>
02636                 ImageMagick path: <strong>'.$im_path.'</strong> ('.$im_path_version.')
02637                 ImageMagick path/LZW: <strong>'.$im_path_lzw.'</strong>  ('.$im_path_lzw_version.')
02638                 Version 5/GraphicsMagick flag: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'].'</strong>
02639 
02640                 GDLib enabled: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib'].'</strong>
02641                 GDLib using PNG: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png'].'</strong>
02642                 GDLib 2 enabled: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_2'].'</strong>
02643                 IM5 effects enabled: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_v5effects'].'</strong> (Blurring/Sharpening with IM 5+)
02644                 Freetype DPI: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['TTFdpi'].'</strong> (Should be 96 for Freetype 2)
02645                 Mask invert: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_imvMaskState'].'</strong> (Should be set for some IM versions approx. 5.4+)
02646 
02647                 File Formats: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'].'</strong>
02648                 ';
02649 
02650                         // Various checks to detect IM/GM version mismatches
02651                 $mismatch=false;
02652                 switch (strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'])) {
02653                         case 'gm':
02654                                 if (doubleval($im_path_version)>=2)     $mismatch=true;
02655                         break;
02656                         case 'im4':
02657                                 if (doubleval($im_path_version)>=5)     $mismatch=true;
02658                         break;
02659                         default:
02660                                 if (($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']?true:false) != (doubleval($im_path_version)>=5))        $mismatch=true;
02661                         break;
02662                 }
02663 
02664                 if ($mismatch)  {
02665                         $msg.= 'Warning: Mismatch between the version of ImageMagick'.
02666                                         ' ('.$im_path_version.') and the configuration of '.
02667                                         '[GFX][im_version_5] ('.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'].')';
02668                         $etype=2;
02669                 } else $etype=1;
02670 
02671                 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']=='gm')   {
02672                         $msg = str_replace('ImageMagick','GraphicsMagick',$msg);
02673                 }
02674 
02675                 $this->message('Image Processing','Current configuration',$msg,$etype);
02676 
02677 
02678 
02679 
02680                 if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['image_processing'])    {
02681                         $this->message('Image Processing','Image Processing disabled!',"
02682                                 Image Processing is disabled by the config flag <nobr>[GFX][image_processing]</nobr> set to false (zero)
02683                         ",2);
02684                         echo $this->outputWrapper($this->printAll());
02685                         return;
02686                 }
02687                 if (!$this->config_array['dir_typo3temp'])      {
02688                         $this->message('Image Processing','typo3temp/ not writable!',"
02689                                 You must make typo3temp/ write enabled before you can proceed with this test.
02690                         ",2);
02691                         echo $this->outputWrapper($this->printAll());
02692                         return;
02693                 }
02694 
02695 
02696 
02697                 $msg='<a name="testmenu"></a>Click each of these links in turn to test a topic. <strong>Please be aware that each test may take several seconds!</strong>:
02698 
02699                 '.$this->imagemenu();
02700                 $this->message('Image Processing','Testmenu',$msg,'');
02701 
02702 
02703                 $this->messageFunc_nl2br=0;
02704                 $parseStart = microtime();
02705                 $imageProc = t3lib_div::makeInstance('t3lib_stdGraphic');
02706                 $imageProc->init();
02707                 $imageProc->tempPath = $this->typo3temp_path;
02708                 $imageProc->dontCheckForExistingTempFile=1;
02709 //              $imageProc->filenamePrefix='install_'.($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']?"v5":"");
02710                 $imageProc->filenamePrefix='install_';
02711                 $imageProc->dontCompress=1;
02712                 $imageProc->alternativeOutputKey='TYPO3_INSTALL_SCRIPT';
02713                 $imageProc->noFramePrepended=$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_noFramePrepended'];
02714 
02715                 // Very temporary!!!
02716                 $imageProc->dontUnlinkTempFiles=0;
02717 
02718 
02719                 $imActive = ($this->config_array['im'] && $im_path);
02720                 $gdActive = ($this->config_array['gd'] && $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']);
02721 
02722                 switch($this->INSTALL['images_type'])   {
02723                         case 'read':
02724                                 $refParseTime='5600';   // 4.2.9
02725                                 $refParseTime='3300';   // 5.2.3
02726                                 $headCode = 'Reading and converting images';
02727                                 $this->message($headCode,'Supported file formats',"
02728                                 This verifies that your ImageMagick installation is able to read the nine default file formats; JPG, GIF, PNG, TIF, BMP, PCX, TGA, PDF, AI.
02729                                 The tool 'identify' will be used to read the pixeldimensions of non-web formats.
02730                                 The tool 'convert' is used to read the image and write a temporary JPG-file
02731                                 ");
02732 
02733                                 if ($imActive)  {
02734                                                 // Reading formats - writing JPG
02735 
02736                                         $extArr = explode(',','jpg,gif,png,tif,bmp,pcx,tga');
02737                                         while(list(,$ext)=each($extArr))        {
02738                                                 if ($this->isExtensionEnabled($ext, $headCode, "Read ".strtoupper($ext)))       {
02739                                                         $imageProc->IM_commands=array();
02740                                                         $theFile = t3lib_extMgm::extPath('install').'imgs/jesus.'.$ext;
02741                                                         if (!@is_file($theFile))        die('Error: '.$theFile.' was not a file');
02742 
02743                                                         $imageProc->imageMagickConvert_forceFileNameBody='read_'.$ext;
02744                                                         $fileInfo = $imageProc->imageMagickConvert($theFile,'jpg',"",'',"",'',"",1);
02745                                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02746                                                         $this->message($headCode,"Read ".strtoupper($ext),$result[0],$result[1]);
02747                                                 }
02748                                         }
02749 
02750                                         if ($this->isExtensionEnabled('pdf', $headCode, 'Read PDF'))    {
02751                                                 $imageProc->IM_commands=array();
02752                                                 $theFile = t3lib_extMgm::extPath('install').'imgs/pdf_from_imagemagick.pdf';
02753                                                 if (!@is_file($theFile))        die('Error: '.$theFile.' was not a file');
02754 
02755                                                 $imageProc->imageMagickConvert_forceFileNameBody='read_pdf';
02756                                                 $fileInfo = $imageProc->imageMagickConvert($theFile,'jpg',"170",'',"",'',"",1);
02757                                                 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02758                                                 $this->message($headCode,'Read PDF',$result[0],$result[1]);
02759                                         }
02760                                         if ($this->isExtensionEnabled('ai', $headCode, 'Read AI'))      {
02761                                                 $imageProc->IM_commands=array();
02762                                                 $theFile = t3lib_extMgm::extPath('install').'imgs/typo3logotype.ai';
02763                                                 if (!@is_file($theFile))        die('Error: '.$theFile.' was not a file');
02764 
02765                                                 $imageProc->imageMagickConvert_forceFileNameBody='read_ai';
02766                                                 $fileInfo = $imageProc->imageMagickConvert($theFile,'jpg',"170",'',"",'',"",1);
02767                                                 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02768                                                 $this->message($headCode,'Read AI',$result[0],$result[1]);
02769                                         }
02770                                 } else {
02771                                         $this->message($headCode,'Test skipped',"
02772                                         Use of ImageMagick has been disabled in the configuration.
02773                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02774                                         ",2);
02775                                 }
02776                         break;
02777                         case 'write':
02778                                 $refParseTime='300';
02779 
02780                                         // Writingformats - writing JPG
02781                                 $headCode = 'Writing images';
02782                                 $this->message($headCode,'Writing GIF and PNG','
02783                                 This verifies that ImageMagick is able to write GIF and PNG files.
02784                                 The GIF-file is attempted compressed with LZW by the t3lib_div::gif_compress() function.
02785                                 ');
02786 
02787                                 if ($imActive)  {
02788                                                 // Writing GIF
02789                                         $imageProc->IM_commands=array();
02790                                         $theFile = t3lib_extMgm::extPath('install').'imgs/jesus.gif';
02791                                         if (!@is_file($theFile))        die('Error: '.$theFile.' was not a file');
02792 
02793                                         $imageProc->imageMagickConvert_forceFileNameBody='write_gif';
02794                                         $fileInfo = $imageProc->imageMagickConvert($theFile,'gif',"",'',"",'',"",1);
02795                                         if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gif_compress']) {
02796                                                 clearstatcache();
02797                                                 $prevSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02798                                                 $returnCode = t3lib_div::gif_compress($fileInfo[3],'');
02799                                                 clearstatcache();
02800                                                 $curSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02801                                                 $note = array('Note on gif_compress() function:',"The 'gif_compress' method used was '".$returnCode."'.<br />Previous filesize: ".$prevSize.'. Current filesize:'.$curSize);
02802                                         } else  $note=array('Note on gif_compress() function:','<em>Not used! Disabled by [GFX][gif_compress]</em>');
02803                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands, $note);
02804                                         $this->message($headCode,'Write GIF',$result[0],$result[1]);
02805 
02806 
02807                                                 // Writing PNG
02808                                         $imageProc->IM_commands=array();
02809                                         $theFile = t3lib_extMgm::extPath('install').'imgs/jesus.gif';
02810 
02811                                         $imageProc->imageMagickConvert_forceFileNameBody='write_png';
02812                                         $fileInfo = $imageProc->imageMagickConvert($theFile,'png',"",'',"",'',"",1);
02813                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02814                                         $this->message($headCode,'Write PNG',$result[0],$result[1]);
02815                                 } else {
02816                                         $this->message($headCode,'Test skipped',"
02817                                         Use of ImageMagick has been disabled in the configuration.
02818                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02819                                         ",2);
02820                                 }
02821                         break;
02822                         case 'scaling':
02823                                 $refParseTime='650';
02824 
02825                                         // Scaling
02826                                 $headCode = 'Scaling images';
02827                                 $this->message($headCode,'Scaling transparent images','
02828                                 This shows how ImageMagick reacts when scaling transparent GIF and PNG files.
02829                                 ');
02830 
02831                                 if ($imActive)  {
02832                                                 // Scaling transparent image
02833                                         $imageProc->IM_commands=array();
02834                                         $theFile = t3lib_extMgm::extPath('install').'imgs/jesus2_transp.gif';
02835                                         if (!@is_file($theFile))        die('Error: '.$theFile.' was not a file');
02836 
02837                                         $imageProc->imageMagickConvert_forceFileNameBody='scale_gif';
02838                                         $fileInfo = $imageProc->imageMagickConvert($theFile,'gif',"150",'',"",'',"",1);
02839                                         if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gif_compress']) {
02840                                                 clearstatcache();
02841                                                 $prevSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02842                                                 $returnCode = t3lib_div::gif_compress($fileInfo[3],'');
02843                                                 clearstatcache();
02844                                                 $curSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02845                                                 $note = array('Note on gif_compress() function:',"The 'gif_compress' method used was '".$returnCode."'.<br />Previous filesize: ".$prevSize.'. Current filesize:'.$curSize);
02846                                         } else $note=array('Note on gif_compress() function:','<em>Not used! Disabled by [GFX][gif_compress]</em>');
02847                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands,$note);
02848                                         $this->message($headCode,'GIF to GIF, 150 pixels wide',$result[0],$result[1]);
02849 
02850                                         $imageProc->IM_commands=array();
02851                                         $theFile = t3lib_extMgm::extPath('install').'imgs/jesus2_transp.png';
02852                                         if (!@is_file($theFile))        die('Error: '.$theFile.' was not a file');
02853 
02854                                         $imageProc->imageMagickConvert_forceFileNameBody='scale_png';
02855                                         $fileInfo = $imageProc->imageMagickConvert($theFile,'png',"150",'',"",'',"",1);
02856                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02857                                         $this->message($headCode,'PNG to PNG, 150 pixels wide',$result[0],$result[1]);
02858 
02859                                         $imageProc->IM_commands=array();
02860                                         $theFile = t3lib_extMgm::extPath('install').'imgs/jesus2_transp.gif';
02861                                         if (!@is_file($theFile))        die('Error: '.$theFile.' was not a file');
02862                                         $imageProc->imageMagickConvert_forceFileNameBody='scale_jpg';
02863                                         $fileInfo = $imageProc->imageMagickConvert($theFile,'jpg',"150",'',"",'',"",1);
02864                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02865                                         $this->message($headCode,'GIF to JPG, 150 pixels wide',$result[0],$result[1]);
02866                                 } else {
02867                                         $this->message($headCode,'Test skipped',"
02868                                         Use of ImageMagick has been disabled in the configuration.
02869                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02870                                         ",2);
02871                                 }
02872                         break;
02873                         case 'combining':
02874                                 $refParseTime='150';    // 4.2.9
02875                                 $refParseTime='250';    // 5.2.3
02876                                                                         // Combine
02877                                 $headCode = 'Combining images';
02878                                 $this->message($headCode,'Combining images',"
02879                                 This verifies that the ImageMagick tool, 'combine'/'composite', is able to combine two images through a grayscale mask.<br />
02880                                 If the masking seems to work but inverted, that just means you'll have to make sure the invert flag is set (some combination of im_negate_mask/im_imvMaskState)
02881                                 ");
02882 
02883                                 if ($imActive)  {
02884                                         $imageProc->IM_commands=array();
02885                                         $input = t3lib_extMgm::extPath('install').'imgs/greenback.gif';
02886                                         $overlay = t3lib_extMgm::extPath('install').'imgs/jesus.jpg';
02887                                         $mask = t3lib_extMgm::extPath('install').'imgs/blackwhite_mask.gif';
02888                                                 if (!@is_file($input))  die('Error: '.$input.' was not a file');
02889                                                 if (!@is_file($overlay))        die('Error: '.$overlay.' was not a file');
02890                                                 if (!@is_file($mask))   die('Error: '.$mask.' was not a file');
02891 
02892                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5($imageProc->alternativeOutputKey.'combine1').'.jpg';
02893                                         $imageProc->combineExec($input,$overlay,$mask,$output, true);
02894                                         $fileInfo = $imageProc->getImageDimensions($output);
02895                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02896                                         $this->message($headCode,'Combine using a GIF mask with only black and white',$result[0],$result[1]);
02897 
02898                                         // Combine
02899                                         $imageProc->IM_commands=array();
02900                                         $input = t3lib_extMgm::extPath('install').'imgs/combine_back.jpg';
02901                                         $overlay = t3lib_extMgm::extPath('install').'imgs/jesus.jpg';
02902                                         $mask = t3lib_extMgm::extPath('install').'imgs/combine_mask.jpg';
02903                                                 if (!@is_file($input))  die('Error: '.$input.' was not a file');
02904                                                 if (!@is_file($overlay))        die('Error: '.$overlay.' was not a file');
02905                                                 if (!@is_file($mask))   die('Error: '.$mask.' was not a file');
02906 
02907                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5($imageProc->alternativeOutputKey.'combine2').'.jpg';
02908                                         $imageProc->combineExec($input,$overlay,$mask,$output, true);
02909                                         $fileInfo = $imageProc->getImageDimensions($output);
02910                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02911                                         $this->message($headCode,'Combine using a JPG mask with graylevels',$result[0],$result[1]);
02912                                 } else {
02913                                         $this->message($headCode,'Test skipped',"
02914                                         Use of ImageMagick has been disabled in the configuration.
02915                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02916                                         ",2);
02917                                 }
02918                         break;
02919                         case 'gdlib':
02920                                 $refParseTime='1800';   // GIF / 4.2.9 / LZW (5.2.3)
02921                                 $refParseTime='2700';   // PNG / 4.2.9 / LZW (5.2.3)
02922                                 $refParseTime='1600';   // GIF / 5.2.3 / LZW (5.2.3)
02923                                         // GDLibrary
02924                                 $headCode = 'GDLib';
02925                                 $this->message($headCode,'Testing GDLib','
02926                                 This verifies that the GDLib installation works properly.
02927                                 ');
02928 
02929 
02930                                 if ($gdActive)  {
02931                                         // GD with box
02932                                         $imageProc->IM_commands=array();
02933                                         $im = $imageProc->imageCreate(170,136);
02934                                         $Bcolor = ImageColorAllocate ($im, 0, 0, 0);
02935                                         ImageFilledRectangle($im, 0, 0, 170, 136, $Bcolor);
02936                                         $workArea=array(0,0,170,136);
02937                                         $conf=array(
02938                                                 'dimensions' => '10,50,150,36',
02939                                                 'color' => 'olive'
02940                                         );
02941                                         $imageProc->makeBox($im,$conf,$workArea);
02942                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDbox').'.'.$imageProc->gifExtension;
02943                                         $imageProc->ImageWrite($im,$output);
02944                                         $fileInfo = $imageProc->getImageDimensions($output);
02945                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02946                                         $this->message($headCode,'Create simple image',$result[0],$result[1]);
02947 
02948 
02949                                         // GD from image with box
02950                                         $imageProc->IM_commands=array();
02951                                         $input = t3lib_extMgm::extPath('install').'imgs/jesus.'.$imageProc->gifExtension;
02952                                                 if (!@is_file($input))  die('Error: '.$input.' was not a file');
02953                                         $im = $imageProc->imageCreateFromFile($input);
02954                                         $workArea=array(0,0,170,136);
02955                                         $conf=array();
02956                                         $conf['dimensions']='10,50,150,36';
02957                                         $conf['color']='olive';
02958                                         $imageProc->makeBox($im,$conf,$workArea);
02959                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDfromImage+box').'.'.$imageProc->gifExtension;
02960                                         $imageProc->ImageWrite($im,$output);
02961                                         $fileInfo = $imageProc->getImageDimensions($output);
02962                                         $GDWithBox_filesize = @filesize($output);
02963                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02964                                         $this->message($headCode,'Create image from file',$result[0],$result[1]);
02965 
02966 
02967                                         // GD with text
02968                                         $imageProc->IM_commands=array();
02969                                         $im = $imageProc->imageCreate(170,136);
02970                                         $Bcolor = ImageColorAllocate ($im, 128,128,150);
02971                                         ImageFilledRectangle($im, 0, 0, 170, 136, $Bcolor);
02972                                         $workArea=array(0,0,170,136);
02973                                         $conf=array(
02974                                                 'iterations' => 1,
02975                                                 'angle' => 0,
02976                                                 'antiAlias' => 1,
02977                                                 'text' => 'HELLO WORLD',
02978                                                 'fontColor' => '#003366',
02979                                                 'fontSize' => 18,
02980                                                 'fontFile' => $this->backPath.'../t3lib/fonts/vera.ttf',
02981                                                 'offset' => '17,40'
02982                                         );
02983                                         $conf['BBOX'] = $imageProc->calcBBox($conf);
02984                                         $imageProc->makeText($im,$conf,$workArea);
02985 
02986                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDwithText').'.'.$imageProc->gifExtension;
02987                                         $imageProc->ImageWrite($im,$output);
02988                                         $fileInfo = $imageProc->getImageDimensions($output);
02989                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02990                                         $this->message($headCode,'Render text with TrueType font',$result[0],$result[1]);
02991 
02992                                         if ($imActive)  {
02993                                                         // extension: GD with text, niceText
02994                                                 $conf['offset'] = '17,65';
02995                                                 $conf['niceText'] = 1;
02996                                                 $imageProc->makeText($im,$conf,$workArea);
02997 
02998                                                 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDwithText-niceText').'.'.$imageProc->gifExtension;
02999                                                 $imageProc->ImageWrite($im,$output);
03000                                                 $fileInfo = $imageProc->getImageDimensions($output);
03001                                                 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands, array("Note on 'niceText':","'niceText' is a concept that tries to improve the antialiasing of the rendered type by actually rendering the textstring in double size on a black/white mask, downscaling the mask and masking the text onto the image through this mask. This involves ImageMagick 'combine'/'composite' and 'convert'."));
03002                                                 $this->message($headCode,"Render text with TrueType font using 'niceText' option",
03003                                                         "(If the image has another background color than the image above (eg. dark background color with light text) then you will have to set TYPO3_CONF_VARS[GFX][im_imvMaskState]=1)<br /><br />".
03004                                                         $result[0],$result[1]);
03005                                         } else {
03006                                                 $this->message($headCode,"Render text with TrueType font using 'niceText' option","
03007                                                 <strong>Test is skipped!</strong><br /><br />
03008 
03009                                                 Use of ImageMagick has been disabled in the configuration. ImageMagick is needed to generate text with the niceText option.
03010                                                 Refer to section 'Basic Configuration' to change or review you configuration settings
03011                                                 ",2);
03012                                         }
03013 
03014                                         if ($imActive)  {
03015                                                         // extension: GD with text, niceText AND shadow
03016                                                 $conf['offset'] = '17,90';
03017                                                 $conf['niceText'] = 1;
03018                                                 $conf['shadow.'] = array(
03019                                                         'offset'=>'2,2',
03020                                                         'blur' => $imageProc->V5_EFFECTS?"20":"90",
03021                                                         'opacity' => '50',
03022                                                         'color' => 'black'
03023                                                 );
03024                                                 $imageProc->makeShadow($im,$conf['shadow.'],$workArea,$conf);
03025                                                 $imageProc->makeText($im,$conf,$workArea);
03026 
03027                                                 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDwithText-niceText-shadow').'.'.$imageProc->gifExtension;
03028                                                 $imageProc->ImageWrite($im,$output);
03029                                                 $fileInfo = $imageProc->getImageDimensions($output);
03030                                                 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands, array('Note on drop shadows:','Drop shadows are done my using ImageMagick to blur a mask through which the drop shadow is generated. The blurring of the mask only works in ImageMagick 4.2.9 and <i>not</i> ImageMagick 5 - which is why you may see a hard and not soft shadow.'));
03031                                                 $this->message($headCode,"Render 'niceText' with a shadow under",
03032                                                         "(This test makes sense only if the above test had a correct output. But if so, you may not see a soft dropshadow from the third text string as you should. In that case you are most likely using ImageMagick 5 and should set the flag TYPO3_CONF_VARS[GFX][im_v5effects]. However this may cost server performance!<br />Finally if you see no drop shadow at all or if the shadow is still not soft, then check if you are using GDlib2 and if so set TYPO3_CONF_VARS[GFX][gdlib_2]=1)<br /><br />".
03033                                                         $result[0],$result[1]);
03034                                         } else {
03035                                                 $this->message($headCode,"Render 'niceText' with a shadow under","
03036                                                 <strong>Test is skipped!</strong><br /><br />
03037 
03038                                                 Use of ImageMagick has been disabled in the configuration. ImageMagick is needed to generate shadows.
03039                                                 Refer to section 'Basic Configuration' to change or review you configuration settings
03040                                                 ",2);
03041                                         }
03042 
03043                                         if ($imageProc->gifExtension=='gif')    {
03044                                                 $buffer=20;
03045                                                 $assess = "This assessment is based on the filesize from 'Create image from file' test, which were ".$GDWithBox_filesize.' bytes';
03046                                                 $goodNews = "If the image was LZW compressed you would expect to have a size of less than 9000 bytes. If you open the image with Photoshop and saves it from Photoshop, you'll a filesize like that.<br />The good news is (hopefully) that your [GFX][im_path_lzw] path is correctly set so the gif_compress() function will take care of the compression for you!";
03047                                                 if ($GDWithBox_filesize<8784+$buffer)   {
03048                                                         $msg="<strong>Your GDLib appears to have LZW compression!</strong><br />
03049                                                                 This assessment is based on the filesize from 'Create image from file' test, which were ".$GDWithBox_filesize." bytes.<br />
03050                                                                 This is a real advantage for you because you don't need to use ImageMagick for LZW compressing. In order to make sure that GDLib is used, <strong>please set the config option [GFX][im_path_lzw] to an empty string!</strong><br />
03051                                                                 When you disable the use of ImageMagick for LZW compressing, you'll see that the gif_compress() function has a return code of 'GD' (for GDLib) instead of 'IM' (for ImageMagick)
03052                                                                 ";
03053                                                 } elseif ($GDWithBox_filesize>19000)    {
03054                                                         $msg='<strong>Your GDLib appears to have no compression at all!</strong><br />
03055                                                                 '.$assess.'<br />'.$goodNews;
03056                                                 } else {
03057                                                         $msg='Your GDLib appears to have RLE compression<br />
03058                                                                 '.$assess.'<br />'.$goodNews;
03059                                                 }
03060                                                 $this->message($headCode,'GIF compressing in GDLib',"
03061                                                 ".$msg."
03062                                                 ",1);
03063                                         }
03064 
03065                                 } else {
03066                                         $this->message($headCode,'Test skipped',"
03067                                         Use of GDLib has been disabled in the configuration.
03068                                         Refer to section 'Basic Configuration' to change or review you configuration settings
03069                                         ",2);
03070                                 }
03071                         break;
03072                 }
03073 
03074                 if ($this->INSTALL['images_type'])      {
03075                         // End info
03076                         if ($this->fatalError)  {
03077                                 $this->message('Info','Errors',"
03078                                 It seems that you had some fatal errors in this test. Please make sure that your ImageMagick and GDLib settings are correct.
03079                                 Refer to the 'Basic Configuration' section for more information and debugging of your settings.
03080                                 ");
03081                         }
03082 
03083                         $parseStop = microtime();
03084                         $parseMS = t3lib_div::convertMicrotime($parseStop)-t3lib_div::convertMicrotime($parseStart);
03085                         $this->message('Info','Parsetime',$parseMS.' ms');
03086                 }
03087                 echo $this->outputWrapper($this->printAll());
03088         }
03089 
03098         function isExtensionEnabled($ext, $headCode, $short)    {
03099                 if (!t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'],$ext))       {
03100                         $this->message($headCode,$short,'Skipped - extension not in the list of allowed extensions ([GFX][imagefile_ext]).',1);
03101                 } else {
03102                         return 1;
03103                 }
03104         }
03105 
03114         function displayTwinImage ($imageFile, $IMcommands=array(), $note='')   {
03115                 $ex_rows='';
03116                 $errorLevels=array(-1);
03117                 if ($imageFile) {
03118                         $verifyFile = t3lib_extMgm::extPath('install').'verify_imgs/'.basename($imageFile);
03119 #debug(array($imageFile,$this->backPath.'../'.substr($imageFile,strlen(PATH_site))),1);
03120                         $destImg = @getImageSize($imageFile);
03121                         $destImgCode ='<img src="'.$this->backPath.'../'.substr($imageFile,strlen(PATH_site)).'" '.$destImg[3].'>';
03122                         $verifyImg = @getImageSize($verifyFile);
03123                         $verifyImgCode = '<img src="'.$this->backPath.t3lib_extMgm::extRelPath('install').'verify_imgs/'.basename($verifyFile).'" '.$verifyImg[3].'>';
03124                         if (!$verifyImg)        {
03125                                 $gifVersion=1;
03126                                 $verifyFile_alt = substr($verifyFile,0,-3).'gif';
03127                                 $verifyImg = @getImageSize($verifyFile_alt);
03128                                 if ($verifyImg) {
03129 // FIXME what is that? old code? t3lib/install/verify_imgs/ do not exist
03130                                         $verifyImgCode = '<img src="'.$this->backPath.'t3lib/install/verify_imgs/'.basename($verifyFile_alt).'" '.$verifyImg[3].'>';
03131                                         $verifyImgCode= '<table border="0" cellpadding="4" cellspacing="0" bgcolor="red"><tr><td align="center">'.$verifyImgCode.'<br />'.$this->fw('<strong>NO REFERENCE FOUND!</strong><br /><br />GIF version looks like this.').'</td></tr></table>';
03132                                 } else {
03133                                         $verifyImgCode= '<table border="0" cellpadding="4" cellspacing="0" bgcolor="red"><tr><td align="center">'.$this->fw('<strong>NO REFERENCE FOUND!</strong><br /><br />'.basename($verifyFile)).'</td></tr></table>';
03134                                 }
03135                         }
03136 
03137                         clearstatcache();
03138                         $destImg['filesize'] = @filesize($imageFile);
03139                         clearstatcache();
03140                         $verifyImg['filesize'] = @filesize($verifyFile);
03141 
03142                         $ex_rows.='<tr>';
03143                         $ex_rows.='<td>'.$destImgCode.'</td>';
03144                         $ex_rows.='<td><img src="clear.gif" width="30" height="1"></td>';
03145                         $ex_rows.='<td>'.$verifyImgCode.'</td>';
03146                         $ex_rows.='</tr>';
03147 
03148                         $ex_rows.=$this->getTwinImageMessage('', 'Your server:', 'Reference:');
03149                         $ex_rows.=$this->getTwinImageMessage('', t3lib_div::formatSize($destImg['filesize']).', '.$destImg[0].'x'.$destImg[1].' pixels', t3lib_div::formatSize($verifyImg['filesize']).', '.$verifyImg[0].'x'.$verifyImg[1].' pixels');
03150 
03151                         if (($destImg['filesize']!=$verifyImg['filesize']) && (intval($destImg['filesize']) && ($destImg['filesize']-$verifyImg['filesize']) > 2048))   {       // Display a warning if the generated image is more than 2KB larger than its reference...
03152                                 $ex_rows.=$this->getTwinImageMessage('File size is very different from reference', $destImg['filesize'], $verifyImg['filesize']);
03153                                 $errorLevels[]=2;
03154                         }
03155                         if ($destImg[0]!=$verifyImg[0] || $destImg[1]!=$verifyImg[1])   {
03156                                 $ex_rows.=$this->getTwinImageMessage('Pixel dimension are not equal!');
03157                                 $errorLevels[]=2;
03158                         }
03159                         if ($note)      {
03160                                 $ex_rows.=$this->getTwinImageMessage($note[0],$note[1]);
03161                         }
03162                         if ($this->dumpImCommands && count($IMcommands))        {
03163                                 $ex_rows.=$this->getTwinImageMessage('ImageMagick commands executed:',$this->formatImCmds($IMcommands));
03164                         }
03165                 } else {
03166                         $ex_rows.=$this->getTwinImageMessage('There was no result from the ImageMagick operation', "Below there's a dump of the ImageMagick commands executed:<br />".$this->formatImCmds($IMcommands));
03167                         $errorLevels[]=3;
03168                 }
03169                 $out='<table border="0" cellpadding="0" cellspacing="0" align="center" width="300">'.$ex_rows.'</table>';
03170 
03171                 return array($out,max($errorLevels));
03172         }
03173 
03182         function getTwinImageMessage($message, $label_1="", $label_2='')        {
03183                 if ($message)   $out.='<tr><td colspan="3"><strong>'.$this->fw($message).'</strong></td></tr>';
03184                 if ($label_1 && !$label_2)      {
03185                         $out.='<tr><td colspan="3">'.$this->fw($label_1).'</td></tr>';
03186                 } elseif ($label_1 || $label_2) {
03187                         $out.='<tr><td>'.$this->fw($label_1).'</td><td></td><td>'.$this->fw($label_2).'</td></tr>';
03188                 }
03189                 return $out;
03190         }
03191 
03198         function formatImCmds($arr)     {
03199                 $out=array();
03200                 if (is_array($arr))     {
03201                         reset($arr);
03202                         while(list($k,$v)=each($arr))   {
03203                                 $out[]=$v[1];
03204                                 if ($v[2])      $out[]='   RETURNED: '.$v[2];
03205                         }
03206                 }
03207                 if (count($out))        {
03208                         $col = t3lib_div::intInRange(count($out),2,10);
03209                         $outputStr = '<textarea cols=40 rows='.$col.' wrap="off" class="fixed-font">'.htmlspecialchars(implode($out,chr(10))).'</textarea>';
03210                         return '<form action="">'.$outputStr.'</form>';
03211                 };
03212         }
03213 
03219         function imagemenu()    {
03220                 $menuitems = array(
03221                         'read' => 'Reading image formats',
03222                         'write' => 'Writing GIF and PNG',
03223                         'scaling' => 'Scaling images',
03224                         'combining' => 'Combining images',
03225                         'gdlib' => 'GD library functions'
03226                 );
03227                 reset($menuitems);
03228                 $c=0;
03229                 $out=array();
03230                 while(list($k,$v)=each($menuitems))     {
03231                         $bgcolor = ($this->INSTALL['images_type']==$k ? ' bgcolor="#ABBBB4"' : ' bgcolor="#F4F0E8"');
03232                         $c++;
03233                         $out[]='<tr><td'.$bgcolor.'><a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[images_type]='.$k.'#testmenu').'">'.$this->fw($c.': '.$v).'</a></td></tr>';
03234                 }
03235 
03236                 $code = '<table border="0" cellpadding="0" cellspacing="1">'.implode($out,'').'</table>';
03237                 $code = '<table border="0" cellpadding="0" cellspacing="0" bgcolor="#ABBBB4"><tr><td>'.$code.'</td></tr></table>';
03238                 return '<div align="center">'.$code.'</div>';
03239         }
03240 
03241 
03242 
03243 
03244 
03245 
03246 
03247 
03248 
03249 
03250 
03251 
03252         /**********************
03253          *
03254          * DATABASE analysing
03255          *
03256          **********************/
03257 
03261         function checkTheDatabase()     {
03262                 if (!$this->config_array['mysqlConnect'])       {
03263                         $this->message('Database Analyser','Your database connection failed',"
03264                                 Please go to the 'Basic Configuration' section and correct this problem first.
03265                         ",2);
03266                         echo $this->outputWrapper($this->printAll());
03267                         return;
03268                 }
03269                 if ($this->config_array['no_database']) {
03270                         $this->message('Database Analyser','No database selected',"
03271                                 Please go to the 'Basic Configuration' section and correct this problem first.
03272                         ",2);
03273                         echo $this->outputWrapper($this->printAll());
03274                         return;
03275                 }
03276 
03277                         // Getting current tables
03278                 $whichTables=$this->getListOfTables();
03279 
03280 
03281                         // Getting number of static_template records
03282                 if ($whichTables['static_template'])    {
03283                         $res_static = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'static_template', '');
03284                         list($static_template_count) = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_static);
03285                 }
03286                 $static_template_count=intval($static_template_count);
03287 
03288                 $headCode ='Database Analyser';
03289                 $this->message($headCode,'What is it?',"
03290                         In this section you can get an overview of your currently selected database compared to sql-files. You can also import sql-data directly into the database or upgrade tables from earlier versions of TYPO3.
03291                 ",0);
03292 
03293                 $cInfo='
03294                         Username: <strong>'.TYPO3_db_username.'</strong>
03295                         Password: <strong>'.TYPO3_db_password.'</strong>
03296                         Host: <strong>'.TYPO3_db_host.'</strong>
03297                 ';
03298                 $this->message($headCode, 'Connected to SQL database successfully',"
03299                 ".trim($cInfo)."
03300                 ",-1,1);
03301                 $this->message($headCode, 'Database',"
03302                         <strong>".TYPO3_db.'</strong> is selected as database.
03303                         Has <strong>'.count($whichTables)."</strong> tables.
03304                 ",-1,1);
03305 
03306 
03307                         // Menu
03308                 $this->messageFunc_nl2br = 0;
03309 
03310                 $sql_files = array_merge(
03311                         t3lib_div::getFilesInDir(PATH_typo3conf,'sql',1,1),
03312                         array()
03313                 );
03314 
03315                 $action_type = $this->INSTALL['database_type'];
03316                 $actionParts = explode('|',$action_type);
03317                 if (count($actionParts)<2)      {
03318                         $action_type='';
03319                 }
03320 
03321                 $out='';
03322                 $out.='<tr>
03323                                 <td nowrap="nowrap"><strong>'.$this->fw('Update required tables').'</strong></td>
03324                                 <td'.($action_type=='cmpFile|CURRENT_TABLES'?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=cmpFile|CURRENT_TABLES#bottom').'"><strong>COMPARE</strong></a>').'</td>
03325                                 <td>'.$this->fw('&nbsp;').'</td>
03326                                 <td>'.$this->fw('&nbsp;').'</td>
03327                         </tr>';
03328 
03329                 $out.='<tr>
03330                                 <td nowrap="nowrap"><strong>'.$this->fw('Dump static data').'</strong></td>
03331                                 <td>'.$this->fw('&nbsp;').'</td>
03332                                 <td nowrap="nowrap"'.($action_type=='import|CURRENT_STATIC'?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=import|CURRENT_STATIC#bottom').'"><strong>IMPORT</strong></a>').'</td>
03333                                 <td>'.$this->fw('&nbsp;').'</td>
03334                         </tr>';
03335 
03336                 $out.='<tr>
03337                                 <td colspan="4">&nbsp;</td>
03338                         </tr>';
03339 
03340 
03341                 reset($sql_files);
03342                 $directJump='';
03343                 while(list($k,$file)=each($sql_files))  {
03344                         if ($this->mode=="123" && !count($whichTables) && strstr($file,'_testsite'))    {
03345                                 $directJump = $this->action.'&TYPO3_INSTALL[database_type]=import|'.rawurlencode($file);
03346                         }
03347                         $lf=t3lib_div::testInt($k);
03348                         $fShortName = substr($file,strlen(PATH_site));
03349 
03350                         $spec1 = $spec2 = '';
03351 
03352                         $out.='<tr>
03353                                 <td nowrap="nowrap">'.$this->fw($fShortName.' ('.t3lib_div::formatSize(filesize($file)).')').'</td>
03354                                 <td'.($action_type=='cmpFile|'.$file?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=cmpFile|'.rawurlencode($file).'#bottom').'"><strong>COMPARE</strong></a>').'</td>
03355                                 <td nowrap="nowrap"'.($action_type=='import|'.$file?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=import|'.rawurlencode($file).'#bottom').'"><strong>IMPORT'.$spec1.$spec2.'</strong></a>').'</td>
03356                                 <td nowrap="nowrap"'.($action_type=='view|'.$file?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=view|'.rawurlencode($file).'#bottom').'"><strong>VIEW'.$spec1.$spec2.'</strong></a>').'</td>
03357                         </tr>';
03358                 }
03359                         // TCA
03360                 $out.='<tr>
03361                         <td></td>
03362                         <td colspan="3"'.($action_type=="cmpTCA|"?' bgcolor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=cmpTCA|#bottom').'">Compare with $TCA</a>').'</strong></td>
03363                 </tr>';
03364                 $out.='<tr>
03365                         <td></td>
03366                         <td colspan="3"'.($action_type=="adminUser|"?' bgcolor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=adminUser|#bottom').'">Create "admin" user</a>').'</strong></td>
03367                 </tr>';
03368                 $out.='<tr>
03369                         <td></td>
03370                         <td colspan="3"'.($action_type=="UC|"?' bgcolor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=UC|#bottom').'">Reset user preferences</a>').'</strong></td>
03371                 </tr>';
03372                 $out.='<tr>
03373                         <td></td>
03374                         <td colspan="3"'.($action_type=="cache|"?' bgcolor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=cache|#bottom').'">Clear tables</a>').'</strong></td>
03375                 </tr>';
03376 
03377                 $theForm='<table border="0" cellpadding="2" cellspacing="2">'.$out.'</table>';
03378                 $theForm.='<a name="bottom"></a>';
03379 
03380                 if ($directJump)        {
03381                         if (!$action_type)      {
03382                                 $this->message($headCode, 'Menu','
03383                                 <script language="javascript" type="text/javascript">
03384                                 window.location.href = "'.$directJump.'";
03385                                 </script>',0,1);
03386                         }
03387                 } else {
03388                         $this->message($headCode, 'Menu',"
03389                         From this menu you can select which of the available SQL files you want to either compare or import/merge with the existing database.<br /><br />
03390                         <strong>COMPARE:</strong> Compares the tables and fields of the current database and the selected file. It also offers to 'update' the difference found.<br />
03391                         <strong>IMPORT:</strong> Imports the SQL-dump file into the current database. You can either dump the raw file or choose which tables to import. In any case, you'll see a new screen where you must confirm the operation.<br />
03392                         <strong>VIEW:</strong> Shows the content of the SQL-file, limiting characters on a single line to a reader-friendly amount.<br /><br />
03393                         The SQL-files are selected from typo3conf/ (here you can put your own) and t3lib/stddb/ (TYPO3 distribution). The SQL-files should be made by the <em>mysqldump</em> tool or at least be formatted like that tool would do.
03394         <br />
03395                         <br />
03396                         ".$theForm."
03397                         ",0,1);
03398                 }
03399 
03400 
03401                 if ($action_type)       {
03402                         switch($actionParts[0]) {
03403                                 case 'cmpFile':
03404                                         $tblFileContent='';
03405                                         if (!strcmp($actionParts[1],'CURRENT_TABLES')) {
03406                                                 $tblFileContent = t3lib_div::getUrl(PATH_t3lib.'stddb/tables.sql');
03407 
03408                                                 reset($GLOBALS['TYPO3_LOADED_EXT']);
03409                                                 while(list(,$loadedExtConf)=each($GLOBALS['TYPO3_LOADED_EXT'])) {
03410                                                         if (is_array($loadedExtConf) && $loadedExtConf['ext_tables.sql'])       {
03411                                                                 $tblFileContent.= chr(10).chr(10).chr(10).chr(10).t3lib_div::getUrl($loadedExtConf['ext_tables.sql']);
03412                                                         }
03413                                                 }
03414                                         } elseif (@is_file($actionParts[1]))    {
03415                                                 $tblFileContent = t3lib_div::getUrl($actionParts[1]);
03416                                         }
03417                                         if ($tblFileContent)    {
03418                                                 $fileContent = implode(
03419                                                         $this->getStatementArray($tblFileContent,1,'^CREATE TABLE '),
03420                                                         chr(10)
03421                                                 );
03422                                                 $FDfile = $this->getFieldDefinitions_sqlContent($fileContent);
03423                                                 if (!count($FDfile))    {
03424                                                         die ("Error: There were no 'CREATE TABLE' definitions in the provided file");
03425                                                 }
03426 
03427                                                         // Updating database...
03428                                                 if (is_array($this->INSTALL['database_update']))        {
03429                                                         $FDdb = $this->getFieldDefinitions_database();
03430                                                         $diff = $this->getDatabaseExtra($FDfile, $FDdb);
03431                                                         $update_statements = $this->getUpdateSuggestions($diff);
03432                                                         $diff = $this->getDatabaseExtra($FDdb, $FDfile);
03433                                                         $remove_statements = $this->getUpdateSuggestions($diff,'remove');
03434 
03435                                                         $this->performUpdateQueries($update_statements['add'],$this->INSTALL['database_update']);
03436                                                         $this->performUpdateQueries($update_statements['change'],$this->INSTALL['database_update']);
03437                                                         $this->performUpdateQueries($remove_statements['change'],$this->INSTALL['database_update']);
03438                                                         $this->performUpdateQueries($remove_statements['drop'],$this->INSTALL['database_update']);
03439 
03440                                                         $this->performUpdateQueries($update_statements['create_table'],$this->INSTALL['database_update']);
03441                                                         $this->performUpdateQueries($remove_statements['change_table'],$this->INSTALL['database_update']);
03442                                                         $this->performUpdateQueries($remove_statements['drop_table'],$this->INSTALL['database_update']);
03443                                                 }
03444 
03445                                                         // Init again / first time depending...
03446                                                 $FDdb = $this->getFieldDefinitions_database();
03447 
03448                                                 $diff = $this->getDatabaseExtra($FDfile, $FDdb);
03449                                                 $update_statements = $this->getUpdateSuggestions($diff);
03450 
03451                                                 $diff = $this->getDatabaseExtra($FDdb, $FDfile);
03452                                                 $remove_statements = $this->getUpdateSuggestions($diff,'remove');
03453 
03454                                                 $tLabel = 'Update database tables and fields';
03455 
03456                                                 if ($remove_statements || $update_statements)   {
03457                                                         $formContent = $this->generateUpdateDatabaseForm('get_form',$update_statements,$remove_statements,$action_type);
03458                                                         $this->message($tLabel,'Table and field definitions should be updated',"
03459                                                         There seems to be a number of differencies between the database and the selected SQL-file.
03460                                                         Please select which statements you want to execute in order to update your database:<br /><br />
03461                                                         ".$formContent."
03462                                                         ",2);
03463                                                 } else {
03464                                                         $formContent = $this->generateUpdateDatabaseForm('get_form',$update_statements,$remove_statements,$action_type);
03465                                                         $this->message($tLabel,'Table and field definitions are OK.',"
03466                                                         The tables and fields in the current database corresponds perfectly to the database in the selected SQL-file.
03467                                                         ",-1);
03468                                                 }
03469                                         }
03470                                 break;
03471                                 case 'cmpTCA':
03472                                         $this->includeTCA();
03473                                         $FDdb = $this->getFieldDefinitions_database();
03474 
03475                                                 // Displaying configured fields which are not in the database
03476                                         $tLabel='Tables and fields in $TCA, but not in database';
03477                                         $cmpTCA_DB = $this->compareTCAandDatabase($GLOBALS['TCA'],$FDdb);
03478                                         if (!count($cmpTCA_DB['extra']))        {
03479                                                 $this->message($tLabel,'Table and field definitions OK','
03480                                                 All fields and tables configured in $TCA appeared to exist in the database as well
03481                                                 ',-1);
03482                                         } else {
03483                                                 $this->message($tLabel,'Invalid table and field definitions in $TCA!','
03484                                                 There are some tables and/or fields configured in the \$TCA array which does not exist in the database!
03485                                                 This will most likely cause you trouble with the TYPO3 backend interface!
03486                                                 ',3);
03487                                                 while(list($tableName, $conf)=each($cmpTCA_DB['extra']))        {
03488                                                         $this->message($tLabel, $tableName,$this->displayFields($conf['fields'],0,'Suggested database field:'),2);
03489                                                 }
03490                                         }
03491 
03492                                                 // Displaying tables that are not setup in
03493                                         $cmpDB_TCA = $this->compareDatabaseAndTCA($FDdb,$GLOBALS['TCA']);
03494                                         $excludeTables='be_sessions,fe_session_data,fe_sessions';
03495                                         if (TYPO3_OS=='WIN')    {$excludeTables = strtolower($excludeTables);}
03496                                         $excludeFields = array(
03497                                                 'be_users' => 'uc,lastlogin,usergroup_cached_list',
03498                                                 'fe_users' => 'uc,lastlogin,fe_cruser_id',
03499                                                 'pages' => 'SYS_LASTCHANGED',
03500                                                 'sys_dmail' => 'mailContent',
03501                                                 'tt_board' => 'doublePostCheck',
03502                                                 'tt_guest' => 'doublePostCheck',
03503                                                 'tt_products' => 'ordered'
03504                                         );
03505                                         $tCount=0;
03506                                         $fCount=0;
03507                                         $tLabel="Tables from database, but not in \$TCA";
03508                                         $fLabel="Fields from database, but not in \$TCA";
03509                                         $this->message($tLabel);
03510                                         if (is_array($cmpDB_TCA['extra']))      {
03511                                                 while(list($tableName, $conf)=each($cmpDB_TCA['extra']))        {
03512                                                         if (!t3lib_div::inList($excludeTables,$tableName)
03513                                                                         && substr($tableName,0,4)!="sys_"
03514                                                                         && substr($tableName,-3)!="_mm"
03515                                                                         && substr($tableName,0,6)!="index_"
03516                                                                         && substr($tableName,0,6)!='cache_')    {
03517                                                                 if ($conf['whole_table'])       {
03518                                                                         $this->message($tLabel, $tableName,$this->displayFields($conf['fields']),1);
03519                                                                         $tCount++;
03520                                                                 } else {
03521                                                                         list($theContent, $fC)  = $this->displaySuggestions($conf['fields'],$excludeFields[$tableName]);
03522                                                                         $fCount+=$fC;
03523                                                                         if ($fC)        $this->message($fLabel, $tableName,$theContent,1);
03524                                                                 }
03525                                                         }
03526                                                 }
03527                                         }
03528                                         if (!$tCount)   {
03529                                                 $this->message($tLabel,'Correct number of tables in the database',"
03530                                                 There are no extra tables in the database compared to the configured tables in the \$TCA array.
03531                                                 ",-1);
03532                                         } else {
03533                                                 $this->message($tLabel,'Extra tables in the database',"
03534                                                 There are some tables in the database which are not configured in the \$TCA array.
03535                                                 You should probably not worry about this, but please make sure that you know what these tables are about and why they are not configured in \$TCA.
03536                                                 ",2);
03537                                         }
03538 
03539                                         if (!$fCount)   {
03540                                                 $this->message($fLabel,'Correct number of fields in the database',"
03541                                                 There are no additional fields in the database tables compared to the configured fields in the \$TCA array.
03542                                                 ",-1);
03543                                         } else {
03544                                                 $this->message($fLabel,'Extra fields in the database',"
03545                                                 There are some additional fields the database tables which are not configured in the \$TCA array.
03546                                                 You should probably not worry about this, but please make sure that you know what these fields are about and why they are not configured in \$TCA.
03547                                                 ",2);
03548                                         }
03549 
03550                                                 // Displaying actual and suggested field database defitions
03551                                         if (is_array($cmpTCA_DB['matching']))   {
03552                                                 $tLabel="Comparison between database and \$TCA";
03553 
03554                                                 $this->message($tLabel,'Actual and suggested field definitions',"
03555                                                 This table shows you the suggested field definitions which are calculated based on the configuration in \$TCA.
03556                                                 If the suggested value differs from the actual current database value, you should not panic, but simply check if the datatype of that field is sufficient compared to the data, you want TYPO3 to put there.
03557                                                 ",0);
03558                                                 while(list($tableName, $conf)=each($cmpTCA_DB['matching']))     {
03559                                                         $this->message($tLabel, $tableName,$this->displayFieldComp($conf['fields'], $FDdb[$tableName]['fields']),1);
03560                                                 }
03561                                         }
03562                                 break;
03563                                 case 'import':
03564                                         $mode123Imported=0;
03565                                         $tblFileContent='';
03566                                         if (preg_match('/^CURRENT_/', $actionParts[1])) {
03567                                                 if (!strcmp($actionParts[1],'CURRENT_TABLES') || !strcmp($actionParts[1],'CURRENT_TABLES+STATIC'))      {
03568                                                         $tblFileContent = t3lib_div::getUrl(PATH_t3lib.'stddb/tables.sql');
03569 
03570                                                         reset($GLOBALS['TYPO3_LOADED_EXT']);
03571                                                         while(list(,$loadedExtConf)=each($GLOBALS['TYPO3_LOADED_EXT'])) {
03572                                                                 if (is_array($loadedExtConf) && $loadedExtConf['ext_tables.sql'])       {
03573                                                                         $tblFileContent.= chr(10).chr(10).chr(10).chr(10).t3lib_div::getUrl($loadedExtConf['ext_tables.sql']);
03574                                                                 }
03575                                                         }
03576                                                 }
03577                                                 if (!strcmp($actionParts[1],'CURRENT_STATIC') || !strcmp($actionParts[1],'CURRENT_TABLES+STATIC'))      {
03578                                                         reset($GLOBALS['TYPO3_LOADED_EXT']);
03579                                                         while(list(,$loadedExtConf)=each($GLOBALS['TYPO3_LOADED_EXT'])) {
03580                                                                 if (is_array($loadedExtConf) && $loadedExtConf['ext_tables_static+adt.sql'])    {
03581                                                                         $tblFileContent.= chr(10).chr(10).chr(10).chr(10).t3lib_div::getUrl($loadedExtConf['ext_tables_static+adt.sql']);
03582                                                                 }
03583                                                         }
03584                                                 }
03585                                         } elseif (@is_file($actionParts[1]))    {
03586                                                 $tblFileContent = t3lib_div::getUrl($actionParts[1]);
03587                                         }
03588 
03589                                         if ($tblFileContent)    {
03590                                                 $tLabel='Import SQL dump';
03591                                                         // Getting statement array from
03592                                                 $statements = $this->getStatementArray($tblFileContent,1);
03593                                                 list($statements_table, $insertCount) = $this->getCreateTables($statements,1);
03594 
03595                                                         // Updating database...
03596                                                 if ($this->INSTALL['database_import_all'])      {
03597                                                         $r=0;
03598                                                         foreach ($statements as $k=>$v) {
03599                                                                 $res = $GLOBALS['TYPO3_DB']->admin_query($v);
03600                                                                 $r++;
03601                                                         }
03602 
03603                                                                 // Make a database comparison because some tables that are defined twice have not been created at this point. This applies to the "pages.*" fields defined in sysext/cms/ext_tables.sql for example.
03604                                                         $fileContent = implode(
03605                                                                 $this->getStatementArray($tblFileContent,1,'^CREATE TABLE '),
03606                                                                 chr(10)
03607                                                         );
03608                                                         $FDfile = $this->getFieldDefinitions_sqlContent($fileContent);
03609                                                         $FDdb = $this->getFieldDefinitions_database();
03610                                                         $diff = $this->getDatabaseExtra($FDfile, $FDdb);
03611                                                         $update_statements = $this->getUpdateSuggestions($diff);
03612                                                         if (is_array($update_statements['add']))        {
03613                                                                 foreach ($update_statements['add'] as $statement)       {
03614                                                                         $res = $GLOBALS['TYPO3_DB']->admin_query($statement);
03615                                                                 }
03616                                                         }
03617 
03618                                                         if ($this->mode=='123') {
03619                                                                         // Create default be_user admin/password
03620                                                                 $username = 'admin';
03621                                                                 $pass = 'password';
03622 
03623                                                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'be_users', 'username='.$GLOBALS['TYPO3_DB']->fullQuoteStr($username, 'be_users'));
03624                                                                 if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res))  {
03625                                                                         $insertFields = array(
03626                                                                                 'username' => $username,
03627                                                                                 'password' => md5($pass),
03628                                                                                 'admin' => 1,
03629                                                                                 'uc' => '',
03630                                                                                 'fileoper_perms' => 7,
03631                                                                                 'tstamp' => time(),
03632                                                                                 'crdate' => time()
03633                                                                         );
03634 
03635                                                                         $GLOBALS['TYPO3_DB']->exec_INSERTquery('be_users', $insertFields);
03636                                                                 }
03637                                                         }
03638 
03639                                                         $this->message($tLabel,'Imported ALL',"
03640                                                                 Queries: ".$r."
03641                                                         ",1,1);
03642                                                         if (t3lib_div::_GP('goto_step'))        {
03643                                                                 $this->action.='&step='.t3lib_div::_GP('goto_step');
03644                                                                 Header('Location: '.t3lib_div::locationHeaderUrl($this->action));
03645                                                                 exit;
03646                                                         }
03647                                                 } elseif (is_array($this->INSTALL['database_import']))  {
03648                                                                 // Traverse the tables
03649                                                         reset($this->INSTALL['database_import']);
03650                                                         while(list($table,$md5str)=each($this->INSTALL['database_import']))     {
03651                                                                 if ($md5str==md5($statements_table[$table]))    {
03652                                                                         $res = $GLOBALS['TYPO3_DB']->admin_query('DROP TABLE IF EXISTS '.$table);
03653                                                                         $res = $GLOBALS['TYPO3_DB']->admin_query($statements_table[$table]);
03654 
03655                                                                         if ($insertCount[$table])       {
03656                                                                                 $statements_insert = $this->getTableInsertStatements($statements, $table);
03657                                                                                 reset($statements_insert);
03658                                                                                 while(list($k,$v)=each($statements_insert))     {
03659                                                                                         $res = $GLOBALS['TYPO3_DB']->admin_query($v);
03660                                                                                 }
03661                                                                         }
03662 
03663                                                                         $this->message($tLabel,"Imported '".$table."'","
03664                                                                                 Rows: ".$insertCount[$table]."
03665                                                                         ",1,1);
03666                                                                 }
03667                                                         }
03668                                                 }
03669 
03670                                                 $mode123Imported=$this->isBasicComplete($tLabel);
03671 
03672                                                 if (!$mode123Imported)  {
03673                                                                 // Re-Getting current tables - may have been changed during import
03674                                                         $whichTables=$this->getListOfTables();
03675 
03676                                                         if (count($statements_table))   {
03677                                                                 reset($statements_table);
03678                                                                 $out='';
03679                                                                 while(list($table,$definition)=each($statements_table)) {
03680                                                                         $exist=isset($whichTables[$table]);
03681                                                                         $out.='<tr>
03682                                                                                 <td><input type="checkbox" name="TYPO3_INSTALL[database_import]['.$table.']" id="database_import_'.$table.'" value="'.md5($definition).'"></td>
03683                                                                                 <td><label for="database_import_'.$table.'"><strong>'.$this->fw($table).'</strong></label></td>
03684                                                                                 <td><img src="clear.gif" width="10" height="1"></td>
03685                                                                                 <td nowrap="nowrap">'.$this->fw($insertCount[$table]?"Rows: ".$insertCount[$table]:"").'</td>
03686                                                                                 <td><img src="clear.gif" width="10" height="1"></td>
03687                                                                                 <td nowrap="nowrap">'.($exist?'<img src="'.$this->backPath.'gfx/icon_warning.gif" width="18" height="16" align="top" alt="">'.$this->fw('Table exists!'):'').'</td>
03688                                                                                 </tr>';
03689                                                                 }
03690 
03691                                                                 $content ='';
03692                                                                 if ($this->mode!='123') {
03693                                                                         $content.='<table border="0" cellpadding="0" cellspacing="0">'.$out.'</table>
03694                                                                         <hr />
03695                                                                         ';
03696                                                                 }
03697                                                                 $content.='<input type="checkbox" name="TYPO3_INSTALL[database_import_all]" id="database_import_all" value="1"'.($this->mode=="123"||t3lib_div::_GP('presetWholeTable')?' checked="checked"':'').'> <label for="database_import_all">'.$this->fw("Import the whole file '".basename($actionParts[1])."' directly (ignores selections above)").'</label><br />
03698 
03699                                                                 ';
03700                                                                 $form = $this->getUpdateDbFormWrap($action_type, $content);
03701                                                                 $this->message($tLabel,'Select tables to import',"
03702                                                                 This is an overview of the CREATE TABLE definitions in the SQL file.
03703                                                                 Select which tables you want to dump to the database.
03704                                                                 Any table you choose dump to the database is dropped from the database first, so you'll lose all data in existing tables.
03705                                                                 ".$form,1,1);
03706                                                         } else {
03707                                                                 $this->message($tLabel,'No tables',"
03708                                                                 There seems to be no CREATE TABLE definitions in the SQL file.
03709                                                                 This tool is intelligently creating one table at a time and not just dumping the whole content of the file uncritically. That's why there must be defined tables in the SQL file.
03710                                                                 ",3,1);
03711                                                         }
03712                                                 }
03713                                         }
03714                                 break;
03715                                 case 'view':
03716                                         if (@is_file($actionParts[1]))  {
03717                                                 $tLabel='Import SQL dump';
03718                                                         // Getting statement array from
03719                                                 $sqlContent = t3lib_div::getUrl($actionParts[1]);
03720                                                 $statements = $this->getStatementArray($sqlContent,1);
03721                                                 $maxL=1000;
03722                                                 $strLen = strlen($sqlContent);
03723                                                 $maxlen = 200+($maxL-t3lib_div::intInRange(($strLen-20000)/100,0,$maxL));
03724                                                 if (count($statements)) {
03725                                                         reset($statements);
03726                                                         $out='';
03727                                                         while(list(,$statement)=each($statements))      {
03728                                                                 $out.=nl2br(htmlspecialchars(t3lib_div::fixed_lgd($statement,$maxlen)).chr(10).chr(10));
03729                                                         }
03730                                                 }
03731                                                 $this->message($tLabel,'Content of '.basename($actionParts[1]),$out,1);
03732                                         }
03733                                 break;
03734                                 case 'adminUser':       // Create admin user
03735                                         if ($whichTables['be_users'])   {
03736                                                 if (is_array($this->INSTALL['database_adminUser']))     {
03737                                                         $username = ereg_replace('[^[:alnum:]_-]','',trim($this->INSTALL['database_adminUser']['username']));
03738                                                         $username = str_replace(' ','_',$username);
03739                                                         $pass = trim($this->INSTALL['database_adminUser']['password']);
03740                                                         if ($username && $pass) {
03741                                                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'be_users', 'username='.$GLOBALS['TYPO3_DB']->fullQuoteStr($username, 'be_users'));
03742                                                                 if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res))  {
03743 
03744                                                                         $insertFields = array(
03745                                                                                 'username' => $username,
03746                                                                                 'password' => md5($pass),
03747                                                                                 'admin' => 1,
03748                                                                                 'uc' => '',
03749                                                                                 'fileoper_perms' => 7,
03750                                                                                 'tstamp' => time(),
03751                                                                                 'crdate' => time()
03752                                                                         );
03753 
03754                                                                         $GLOBALS['TYPO3_DB']->exec_INSERTquery('be_users', $insertFields);
03755 
03756                                                                         $this->isBasicComplete($headCode);
03757 
03758                                                                         $this->message($headCode,'User created','
03759                                                                         Username: <strong>'.htmlspecialchars($username).'</strong><br />
03760                                                                         Password: <strong>'.htmlspecialchars($pass).'</strong><br />'
03761                                                                         ,1,1);
03762                                                                 } else {
03763                                                                         $this->message($headCode,'Username not unique!','
03764                                                                         The username, <strong>'.htmlspecialchars($username).'</strong>, was not unique.',2,1);
03765                                                                 }
03766                                                         }
03767                                                 }
03768                                                 $content = '
03769                                                 <input type="text" name="TYPO3_INSTALL[database_adminUser][username]"> username - unique, no space, lowercase<br />
03770                                                 <input type="text" name="TYPO3_INSTALL[database_adminUser][password]"> password
03771                                                 ';
03772                                                 $form = $this->getUpdateDbFormWrap($action_type, $content);
03773                                                 $this->message($headCode,'Create admin user',"
03774                                                 Enter username and password for a new admin user.<br />
03775                                                 You should use this function only if there are no admin users in the database, for instance if this is a blank database.<br />
03776                                                 After you've created the user, log in and add the rest of the user information, like email and real name.<br />
03777                                                 <br />
03778                                                 ".$form."
03779                                                 ",0,1);
03780                                         } else {
03781                                                 $this->message($headCode,'Required table not in database',"
03782                                                 'be_users' must be a table in the database!
03783                                                 ",3,1);
03784                                         }
03785                                 break;
03786                                 case 'UC':      // clear uc
03787                                         if ($whichTables['be_users'])   {
03788                                                 if (!strcmp($this->INSTALL['database_UC'],1))   {
03789                                                         $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_users', '', array('uc' => ''));
03790                                                         $this->message($headCode,'Clearing be_users.uc','Done.',1);
03791                                                 }
03792                                                 $content = '
03793                                                 <input type="checkbox" name="TYPO3_INSTALL[database_UC]" id="database_UC" value="1" checked="checked"> <label for="database_UC">Clear be_users preferences ("uc" field)</label>
03794                                                 ';
03795                                                 $form = $this->getUpdateDbFormWrap($action_type, $content);
03796                                                 $this->message($headCode,'Clear user preferences',"
03797                                                 If you press this button all backend users from the tables be_users will have their user preferences cleared (field 'uc' set to an empty string).<br />
03798                                                 This may come in handy in rare cases where that configuration may be corrupt.<br />
03799                                                 Clearing this will clear all user settings from the 'Setup' module.<br />
03800                                                 <br />
03801                                                 ".$form);
03802                                         } else {
03803                                                 $this->message($headCode,'Required table not in database',"
03804                                                 'be_users' must be a table in the database!
03805                                                 ",3);
03806                                         }
03807                                 break;
03808                                 case 'cache':
03809                                         $tableListArr = explode(',','cache_pages,cache_pagesection,cache_hash,cache_imagesizes,--div--,sys_log,sys_history,--div--,be_sessions,fe_sessions,fe_session_data'.
03810                                                 (t3lib_extMgm::isLoaded('indexed_search') ? ',--div--,index_words,index_rel,index_phash,index_grlist,index_section,index_fulltext' : '').
03811                                                 (t3lib_extMgm::isLoaded('tt_products') ? ',--div--,sys_products_orders,sys_products_orders_mm_tt_products' : '').
03812                                                 (t3lib_extMgm::isLoaded('direct_mail') ? ',--div--,sys_dmail_maillog' : '').
03813                                                 (t3lib_extMgm::isLoaded('sys_stat') ? ',--div--,sys_stat' : '')
03814                                         );
03815 
03816                                         if (is_array($this->INSTALL['database_clearcache']))    {
03817                                                 $qList=array();
03818                                                 reset($tableListArr);
03819                                                 while(list(,$table)=each($tableListArr))        {
03820                                                         if ($table!='--div--')  {
03821                                                                 $table_c = TYPO3_OS=='WIN' ? strtolower($table) : $table;
03822                                                                 if ($this->INSTALL['database_clearcache'][$table] && $whichTables[$table_c])    {
03823                                                                         $GLOBALS['TYPO3_DB']->exec_DELETEquery($table, '');
03824                                                                         $qList[] = $table;
03825                                                                 }
03826                                                         }
03827                                                 }
03828                                                 if (count($qList))      {
03829                                                         $this->message($headCode,'Clearing cache','
03830                                                         The following tables were emptied:<br /><br />
03831                                                         '.implode($qList,'<br />')
03832                                                         ,1);
03833                                                 }
03834                                         }
03835                                                 // Count entries and make checkboxes
03836                                         $labelArr = array(
03837                                                 'cache_pages' => 'Pages',
03838                                                 'cache_pagesection' => 'TS template related information',
03839                                                 'cache_hash' => 'Multipurpose md5-hash cache',
03840                                                 'cache_imagesizes' => 'Cached image sizes',
03841                                                 'sys_log' => 'Backend action logging',
03842                                                 'sys_stat' => 'Page hit statistics',
03843                                                 'sys_history' => 'Addendum to the sys_log which tracks ALL changes to content through TCE. May become huge by time. Is used for rollback (undo) and the WorkFlow engine.',
03844                                                 'be_sessions' => 'Backend User sessions',
03845                                                 'fe_sessions' => 'Frontend User sessions',
03846                                                 'fe_session_data' => 'Frontend User sessions data',
03847                                                 'sys_dmail_maillog' => 'Direct Mail log',
03848                                                 'sys_products_orders' => 'tt_product orders',
03849                                                 'sys_products_orders_mm_tt_products' => 'relations between tt_products and sys_products_orders'
03850                                         );
03851 
03852                                         $checkBoxes=array();
03853                                         $countEntries=array();
03854                                         reset($tableListArr);
03855                                         while(list(,$table)=each($tableListArr))        {
03856                                                 if ($table!='--div--')  {
03857                                                         $table_c = TYPO3_OS=='WIN' ? strtolower($table) : $table;
03858                                                         if ($whichTables[$table_c])     {
03859                                                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, '');
03860                                                                 list($countEntries[$table]) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
03861                                                                         // Checkboxes:
03862                                                                 $checkBoxes[]= '<input type="checkbox" name="TYPO3_INSTALL[database_clearcache]['.$table.']" id="TYPO3_INSTALL[database_clearcache]['.$table.']" value="1"'.($this->INSTALL['database_clearcache'][$table]||$_GET['PRESET']['database_clearcache'][$table]?' checked="checked"':'').'> <label for="TYPO3_INSTALL[database_clearcache]['.$table.']"><strong>'.$table.'</strong> ('.$countEntries[$table].' rows) - '.$labelArr[$table].'</label>';
03863                                                         }
03864                                                 } else {
03865                                                                 $checkBoxes[]=  '<hr />';
03866                                                 }
03867                                         }
03868 
03869                                         $content = implode('<br />',$checkBoxes).'<br /><br />';
03870 
03871                                         $form = $this->getUpdateDbFormWrap($action_type, $content);
03872                                         $this->message($headCode,'Clear out selected tables','
03873                                         Pressing this button will delete all records from the selected tables.<br />
03874                                         <br />
03875                                         '.$form.'
03876                                         ');
03877                                 break;
03878                         }
03879                 }
03880 
03881                 echo $this->outputWrapper($this->printAll());
03882         }
03883 
03889         function updateWizard() {
03890                 global $TYPO3_CONF_VARS;
03891 
03892                         // clear cache files
03893                 t3lib_extMgm::removeCacheFiles();
03894 
03895                         // generate new cache files and include them
03896                 $GLOBALS['TYPO3_CONF_VARS']['EXT']['extCache'] = 1;
03897                 $TYPO3_LOADED_EXT = t3lib_extMgm::typo3_loadExtensions();
03898                 if ($TYPO3_LOADED_EXT['_CACHEFILE'])    {
03899                         require(PATH_typo3conf.$TYPO3_LOADED_EXT['_CACHEFILE'].'_ext_localconf.php');
03900                 }
03901 
03902                         // call wizard
03903                 $action = ($this->INSTALL['database_type']?$this->INSTALL['database_type']:'checkForUpdate');
03904                 $this->updateWizard_parts($action);
03905                 echo $this->outputWrapper($this->printAll());
03906         }
03907 
03914         function updateWizard_parts($action)    {
03915                 $content = '';
03916                 switch ($action)        {
03917                         case 'checkForUpdate':  // first step - check for updates available
03918                                 $title = 'Step 1 - Introduction';
03919                                 $updateWizardBoxes = '';
03920                                 if (!$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'])        {
03921                                         $content = '<strong>No updates registered!</strong>';
03922                                         break;
03923                                 }
03924 
03925                                         // step through list of updates, and check if update is needed and if yes, output an explanation
03926                                 foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] as $identifier => $className)       {
03927                                         $tmpObj = $this->getUpgradeObjInstance($className, $identifier);
03928                                         if (method_exists($tmpObj,'checkForUpdate'))    {
03929                                                 $explanation = '';
03930                                                 if ($tmpObj->checkForUpdate($explanation))      {
03931                                                         $updateWizardBoxes.= '
03932                                                                 <div style="border: 1px solid; padding: 10px; margin: 10px; padding-top: 0px; width: 400px;">
03933                                                                         <h3>'.$identifier.'</h3>
03934                                                                         <p>'.str_replace(chr(10),'<br />',$explanation).'</p>
03935                                                                         <input type="submit" name="TYPO3_INSTALL[update]['.$identifier.']" id="TYPO3_INSTALL[update]['.$identifier.']" value="Next" />
03936                                                                 </div>';
03937                                                 }
03938                                         }
03939                                 }
03940 
03941                                 if ($updateWizardBoxes) {
03942                                         $updateWizardBoxes = '<table><tr><td>'.$updateWizardBoxes.'</td></tr></table>';
03943                                         $content = '
03944                                                 <form action="'.$this->action.'#bottom" method="post">
03945                                                         <input type="hidden" name="TYPO3_INSTALL[database_type]" value="'.htmlspecialchars('getUserInput').'">
03946                                                         '.$updateWizardBoxes.'</form>';
03947                                 } else {
03948                                         $content = '<strong>No updates to perform!</strong>';
03949                                 }
03950                         break;
03951                         case 'getUserInput':    // second step - get user input and ask for final confirmation
03952                                 $title = 'Step 2 - Configuration of updates';
03953                                 $formContent = '<p style="width:400px;"><strong>The following updates will be performed:</strong></p>';
03954                                 if (!$this->INSTALL['update'])  {
03955                                         $content = '<strong>No updates selected!</strong>';
03956                                         break;
03957                                 }
03958                                         // update methods might need to get custom data
03959                                 foreach ($this->INSTALL['update'] as $identifier => $tmp)       {
03960                                         $className = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$identifier];
03961 
03962                                         $tmpObj = $this->getUpgradeObjInstance($className, $identifier);
03963 
03964                                         $formContent .= '<p><strong>'.$identifier.'</strong><input type="hidden" name="TYPO3_INSTALL[update][extList][]" value="'.$identifier.'" /><br />';
03965                                         if (method_exists($tmpObj,'getUserInput'))      {
03966                                                 $formContent .= $tmpObj->getUserInput('TYPO3_INSTALL[update]['.$identifier.']');
03967                                         }
03968                                         $formContent.= '</p>';
03969                                 }
03970                                 $formContent.= '<input type="checkbox" name="TYPO3_INSTALL[update][showDatabaseQueries]" id="TYPO3_INSTALL[update][showDatabaseQueries]" value="1" /> <label for="TYPO3_INSTALL[update][showDatabaseQueries]">Show database queries performed</label><br />';
03971                                 $content = $this->getUpdateDbFormWrap('performUpdate', $formContent,'Perform updates!');
03972                         break;
03973                         case 'performUpdate':   // third step - perform update
03974                                 $title = 'Step 3 - Perform updates';
03975                                 if (!$this->INSTALL['update']['extList'])       { break; }
03976 
03977                                 $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = TRUE;
03978                                 foreach ($this->INSTALL['update']['extList'] as $identifier)    {
03979                                         $className = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$identifier];
03980 
03981                                         $tmpObj = &$this->getUpgradeObjInstance($className, $identifier);
03982 
03983                                         $content = '<p style="width: 400px;"><strong>'.$identifier.'</strong></p>';
03984                                                 // check user input if testing method is available
03985                                         if (method_exists($tmpObj,'checkUserInput'))    {
03986                                                 $customOutput = '';
03987                                                 if (!$tmpObj->checkUserInput($customOutput))    {
03988                                                         $content.= ($customOutput?$customOutput:'Something went wrong').'<br /><br />';
03989                                                         $content.= '<a href="javascript:history.back()">Go back to update configuration</a>';
03990                                                         break;
03991                                                 }
03992                                         }
03993 
03994                                         if (method_exists($tmpObj,'performUpdate'))     {
03995                                                 $customOutput = '';
03996                                                 $dbQueries = array();
03997                                                 if ($tmpObj->performUpdate($dbQueries, $customOutput))  {
03998                                                         $content .= '<strong>Update successful!</strong>';
03999                                                 } else {
04000                                                         $content.= '<strong>Update FAILED!</strong>';
04001                                                 }
04002                                                 if ($this->INSTALL['update']['showDatabaseQueries'])    {
04003                                                         $content .= '<br />' . implode('<br />',$dbQueries);
04004                                                 }
04005                                                 if (strlen($customOutput))      {
04006                                                         $content.= '<br />' . $customOutput;
04007                                                 }
04008                                         } else {
04009                                                 $content .= '<strong>No update method available!</strong>';
04010                                         }
04011                                 }
04012                                 $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = FALSE;
04013                         break;
04014                 }
04015                 $this->message('Update Wizard',$title,$content);
04016         }
04017 
04025         function getUpgradeObjInstance($className, $identifier) {
04026                 $tmpObj = &t3lib_div::getUserObj($className);
04027                 $tmpObj->versionNumber = t3lib_div::int_from_ver(TYPO3_version);
04028                 $tmpObj->pObj = $this;
04029                 $tmpObj->userInput = $this->INSTALL['update'][$identifier];
04030                 return $tmpObj;
04031         }
04032 
04038         function isBackendAdminUser()   {
04039                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'be_users', 'admin=1');
04040                 $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
04041                 return current($row);
04042         }
04043 
04049         function isStaticTemplates()    {
04050                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'static_template', '');
04051                 $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
04052                 return current($row);
04053         }
04054 
04061         function isBasicComplete($tLabel)       {
04062                 if ($this->mode=='123') {
04063                         $tables = $this->getListOfTables();
04064 
04065                         if (count($tables))     {
04066                                 $beuser = $this->isBackendAdminUser();
04067                                 $static = $this->isStaticTemplates();
04068                         }
04069                         if (count($tables) && $beuser && $static)       {
04070                                 $mode123Imported=1;
04071                                 $this->message($tLabel,'Basic Installation Completed',nl2br($this->messageBasicFinished()),-1,1);
04072                                 $this->message($tLabel,'Security Risk!',nl2br($this->securityRisk().$this->alterPasswordForm()),2,1);
04073                         } else {
04074                                 $this->message($tLabel,'Still missing something?',nl2br('
04075                                 You may be missing one of these points before your TYPO3 installation is complete:
04076 
04077                                 '.(count($tables)?'':'- You haven\'t imported any tables yet.
04078                                 ')
04079                                 .($static?'':'- You haven\'t imported the static_template table.
04080                                 ')
04081                                 .($beuser?'':'- You haven\'t created an admin-user yet.
04082                                 ')
04083                                 .'
04084 
04085                                 You you\'re about to import a database with a complete site in it, these three points should be met.
04086                                 '),-1,1);
04087                         }
04088                 }
04089                 return $mode123Imported;
04090         }
04091 
04101         function generateUpdateDatabaseForm($type, $arr_update, $arr_remove, $action_type)      {
04102                 $content = '';
04103                 switch($type)   {
04104                         case 'get_form':
04105                                 $content='';
04106                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update['add'],'Add fields');
04107                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update['change'],'Changing fields',(t3lib_extMgm::isLoaded('dbal')?0:1),0,$arr_update['change_currentValue']);
04108                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove['change'],'Remove unused fields (rename with prefix)',$this->setAllCheckBoxesByDefault,1);
04109                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove['drop'],'Drop fields (really!)',$this->setAllCheckBoxesByDefault);
04110 
04111                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update['create_table'],'Add tables');
04112                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove['change_table'],'Removing tables (rename with prefix)',$this->setAllCheckBoxesByDefault,1,$arr_remove['tables_count'],1);
04113                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove['drop_table'],'Drop tables (really!)',$this->setAllCheckBoxesByDefault,0,$arr_remove['tables_count'],1);
04114 
04115                                 $content = $this->getUpdateDbFormWrap($action_type, $content);
04116                         break;
04117                         default:
04118 
04119                         break;
04120                 }
04121                 return $content;
04122         }
04123 
04132         function getUpdateDbFormWrap($action_type, $content, $label='Write to database')        {
04133                 $form = '<form action="'.$this->action.'#bottom" method="post"><input type="hidden" name="TYPO3_INSTALL[database_type]" value="'.htmlspecialchars($action_type).'">'.$content.'<br /><input type="submit" value="'.$label.'">';
04134                 return $form;
04135         }
04136 
04145         function displayFields($arr, $pre=0, $label='') {
04146                 $out='';
04147                 $out.='<tr><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Field name:').'</strong></td><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw($label?$label:'Info:').'</strong></td></tr>';
04148                 if (is_array($arr))     {
04149                         reset($arr);
04150                         while(list($fieldname, $fieldContent)=each($arr))       {
04151                                 if ($pre)       {
04152                                         $fieldContent = '<pre>'.trim($fieldContent).'</pre>';
04153                                 } else {
04154                                         $fieldContent = $this->fw($fieldContent);
04155                                 }
04156                                 $out.='<tr><td bgcolor="#ABBBB4">'.$this->fw($fieldname).'</td><td bgcolor="#ABBBB4">'.$fieldContent.'</td></tr>';
04157                         }
04158                 }
04159                 $out= '<table border="0" cellpadding="0" cellspacing="0">'.$out.'</table>';
04160                 return $out;
04161         }
04162 
04170         function displayFieldComp($arr, $arr_db)        {
04171                 $out='';
04172                 $out.='<tr><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Field name:').'</strong></td>
04173                         <td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw("Suggested value from \$TCA:").'</strong></td>
04174                         <td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Actual value from database:').'</strong></td>
04175                         </tr>';
04176                 if (is_array($arr))     {
04177                         reset($arr);
04178                         while(list($fieldname, $fieldContent)=each($arr))       {
04179                                         // This tries to equalize the types tinyint and int
04180                                 $str1 = $fieldContent;
04181                                 $str2 = trim($arr_db[$fieldname]);
04182                                 $str1 = str_replace('tinyint(3)','tinyint(4)',$str1);
04183                                 $str2 = str_replace('tinyint(3)','tinyint(4)',$str2);
04184                                 $str1 = str_replace('int(10)','int(11)',$str1);
04185                                 $str2 = str_replace('int(10)','int(11)',$str2);
04186                                         // Compare:
04187                                 if (strcmp($str1,$str2))        {
04188                                         $bgcolor=' bgcolor="#ABBBB4"';
04189                                 } else {
04190                                         $bgcolor=' bgcolor="#D9D5C9"';
04191                                 }
04192                                 $fieldContent = $this->fw($fieldContent);
04193                                 $fieldContent_db = $this->fw($arr_db[$fieldname]);
04194                                 $out.='<tr>
04195                                         <td bgcolor="#D9D5C9">'.$this->fw($fieldname).'</td>
04196                                         <td'.$bgcolor.'>'.$fieldContent.'</td>
04197                                         <td'.$bgcolor.'>'.$fieldContent_db.'</td>
04198                                         </tr>';
04199                         }
04200                 }
04201                 $out= '<table border="0" cellpadding="2" cellspacing="2">'.$out.'</table>';
04202                 return $out;
04203         }
04204 
04212         function displaySuggestions($arr, $excludeList='')      {
04213                 $out='';
04214                 $out.='<tr><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Field name:').'</strong></td><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Info / Suggestion for the field:').'</strong></td></tr>';
04215                 $fC=0;
04216                 if (is_array($arr))     {
04217                         reset($arr);
04218                         while(list($fieldname, $fieldContent)=each($arr))       {
04219                                 if (!t3lib_div::inList($excludeList,$fieldname) && substr($fieldname,0,strlen($this->deletedPrefixKey))!=$this->deletedPrefixKey && substr($fieldname,-1)!='.') {
04220                                         $fieldContent = $this->fw($fieldContent);
04221                                         if ($arr[$fieldname.'.'])       {
04222                                                 $fieldContent.= '<hr />';
04223                                                 $fieldContent.= '<pre>'.trim($arr[$fieldname.'.']).'</pre>';
04224                                         }
04225                                         $out.='<tr><td bgcolor="#ABBBB4">'.$this->fw($fieldname).'</td><td bgcolor="#ABBBB4">'.$fieldContent.'</td></tr>';
04226                                         $fC++;
04227                                 }
04228                         }
04229                 }
04230                 $out= '<table border="0" cellpadding="2" cellspacing="2">'.$out.'</table>';
04231                 return array($out,$fC);
04232         }
04233 
04242         function compareDatabaseAndTCA($FDsrc, $TCA, $onlyFields=0)     {
04243                 $extraArr=array();
04244                 if (is_array($FDsrc))   {
04245                         reset($FDsrc);
04246                         while(list($table,$info)=each($FDsrc))  {
04247                                 if (!isset($TCA[$table]))       {
04248                                         if (!$onlyFields)       {
04249                                                 $extraArr[$table]=$info;                // If the table was not in the FDcomp-array, the result array is loaded with that table.
04250                                                 $extraArr[$table]['whole_table']=1;
04251                                                 unset($extraArr[$table]['keys']);
04252                                         }
04253                                 } else {
04254                                         $theKey='fields';
04255                                         $excludeListArr=array();
04256                                         if (is_array($TCA[$table]['ctrl']['enablecolumns']))    $excludeListArr[]=$TCA[$table]['ctrl']['enablecolumns'];
04257                                         $excludeListArr[]=$TCA[$table]['ctrl']['tstamp'];
04258                                         $excludeListArr[]=$TCA[$table]['ctrl']['sortby'];
04259                                         $excludeListArr[]=$TCA[$table]['ctrl']['delete'];
04260                                         $excludeListArr[]=$TCA[$table]['ctrl']['cruser_id'];
04261                                         $excludeListArr[]=$TCA[$table]['ctrl']['crdate'];
04262                                         $excludeListArr[]='uid';
04263                                         $excludeListArr[]='pid';
04264                                         if ($table=='pages')    {
04265                                                 $excludeListArr[]='perms_userid';
04266                                                 $excludeListArr[]='perms_groupid';
04267                                                 $excludeListArr[]='perms_user';
04268                                                 $excludeListArr[]='perms_group';
04269                                                 $excludeListArr[]='perms_everybody';
04270                                         }
04271                                         if ($table=='sys_dmail')        {
04272                                                 $excludeListArr[]='scheduled';
04273                                                 $excludeListArr[]='scheduled_begin';
04274                                                 $excludeListArr[]='scheduled_end';
04275                                                 $excludeListArr[]='query_info';
04276                                         }
04277 
04278                                         if (is_array($info[$theKey]))   {
04279                                                 reset($info[$theKey]);
04280                                                 while(list($fieldN,$fieldC)=each($info[$theKey]))       {
04281                                                         if (!isset($TCA[$table]['columns'][$fieldN]) && !in_array($fieldN,$excludeListArr))     {
04282                                                                 $extraArr[$table][$theKey][$fieldN] = $info['fields'][$fieldN];
04283                                                                 $extraArr[$table][$theKey][$fieldN.'.']=$this->suggestTCAFieldDefinition($fieldN,$fieldC);
04284                                                         }
04285                                                 }
04286                                         }
04287                                 }
04288                         }
04289                 }
04290                 return array('extra'=>$extraArr);
04291         }
04292 
04300         function compareTCAandDatabase($TCA, $FDcomp)   {
04301                 $extraArr=array();
04302                 $matchingArr=array();
04303                 if (is_array($TCA))     {
04304                         reset($TCA);
04305                         while(list($table)=each($TCA))  {
04306                                 $info=$TCA[$table];
04307                                 if (!isset($FDcomp[$table]))    {
04308 //                                      $extraArr[$table]=$info;                // If the table was not in the FDcomp-array, the result array is loaded with that table.
04309                                         $extraArr[$table]['whole_table']=1;
04310                                 } else {
04311                                         reset($info['columns']);
04312                                         while(list($fieldN,$fieldC)=each($info['columns']))     {
04313                                                 $fieldDef = $this->suggestFieldDefinition($fieldC);
04314                                                 if (!is_array($fieldDef))       {
04315                                                         if (!isset($FDcomp[$table]['fields'][$fieldN])) {
04316                                                                 $extraArr[$table]['fields'][$fieldN]=$fieldDef;
04317                                                         } else {
04318                                                                 $matchingArr[$table]['fields'][$fieldN]=$fieldDef;
04319                                                         }
04320                                                 }
04321                                         }
04322                                 }
04323                         }
04324                 }
04325                 return array('extra'=>$extraArr, 'matching'=>$matchingArr);
04326         }
04327 
04334         function suggestFieldDefinition($fieldInfo)     {
04335                 $out='';
04336                 switch($fieldInfo['config']['type'])    {
04337                         case 'input':
04338                                 if (ereg('date|time|int|year',$fieldInfo['config']['eval']))    {
04339                                         $out = "int(11) NOT NULL default '0'";
04340                                 } else {
04341                                         $max = intval($fieldInfo['config']['max']);
04342                                         if ($max>0 && $max<200) {
04343                                                 $out = 'varchar('.$max.") NOT NULL default ''";
04344                                         } else {
04345                                                 $out = 'tinytext NOT NULL';
04346                                         }
04347                                 }
04348                         break;
04349                         case 'text':
04350                                 $out = 'text NOT NULL';
04351                         break;
04352                         case 'check':
04353                                 if (is_array($fieldInfo['config']['items']) && count($fieldInfo['config']['items'])>8)  {
04354                                         $out = "int(11) NOT NULL default '0'";
04355                                 } else {
04356                                         $out = "tinyint(3) NOT NULL default '0'";
04357                                 }
04358                         break;
04359                         case 'radio':
04360                                 if (is_array($fieldInfo['config']['items']))    {
04361                                         $out = $this->getItemArrayType($fieldInfo['config']['items']);
04362                                 } else {
04363                                         $out = 'ERROR: Radiobox did not have items!';
04364                                 }
04365                         break;
04366                         case 'group':
04367                                 if ($fieldInfo['config']['internal_type']=='db')        {
04368                                         $max = t3lib_div::intInRange($fieldInfo['config']['maxitems'],1,10000);
04369                                         if (count(explode(',',$fieldInfo['config']['allowed']))>1)      {
04370                                                 $len = $max*(10+1+5+1);         // Tablenames are 10, "_" 1, uid's 5, comma 1
04371                                                 $out=$this->getItemBlobSize($len);
04372                                         } elseif ($max<=1) {
04373                                                 $out = "int(11) NOT NULL default '0'";
04374                                         } else {
04375                                                 $len = $max*(5+1);              // uid's 5, comma 1
04376                                                 $out=$this->getItemBlobSize($len);
04377                                         }
04378                                 }
04379                                 if ($fieldInfo['config']['internal_type']=='file')      {
04380                                         $max = t3lib_div::intInRange($fieldInfo['config']['maxitems'],1,10000);
04381                                         $len = $max*(30+1);             // Filenames is 30+ chars....
04382                                         $out=$this->getItemBlobSize($len);
04383                                 }
04384                         break;
04385                         case 'select':
04386                                 $max = t3lib_div::intInRange($fieldInfo['config']['maxitems'],1,10000);
04387                                 if ($max<=1)    {
04388                                         if ($fieldInfo['config']['foreign_table'])      {
04389                                                 $out = "int(11) NOT NULL default '0'";
04390                                         } else {
04391                                                 $out = $this->getItemArrayType($fieldInfo['config']['items']);
04392                                         }
04393                                 } else {
04394                                                 // five chars (special=10) + comma:
04395                                         $len = $max*(($fieldInfo['config']['special']?10:5)+1);
04396                                         $out=$this->getItemBlobSize($len);
04397                                 }
04398                         break;
04399                         default:
04400                         break;
04401                 }
04402                 return $out?$out:$fieldInfo;
04403         }
04404 
04411         function getItemArrayType($arr) {
04412                 if (is_array($arr))     {
04413                         reset($arr);
04414                         $type[]=0;
04415                         $intSize[]=0;
04416                         while(list(,$item)=each($arr))  {
04417                                 if (!t3lib_div::testInt($item[1]) && $item[1]!='--div--')       {
04418                                         $type[]=strlen($item[1]);
04419                                 } else {
04420                                         $intSize[]=$item[1];
04421                                 }
04422                         }
04423                         $us = min($intSize)>=0 ? ' unsigned' : '';
04424                         if (max($type)>0)       {
04425                                 $out = 'varchar('.max($type).") NOT NULL default ''";
04426                         } else {
04427                                 $out = "int(11) NOT NULL default '0'";
04428                         }
04429                 }
04430                 return $out;
04431         }
04432 
04439         function getItemBlobSize($len)  {
04440                 return ($len>255 ? 'tiny' : '').'blob NOT NULL';
04441         }
04442 
04450         function suggestTCAFieldDefinition($fieldName,$fieldInfo)       {
04451                 list($type,$len) = split(' |\(|\)',$fieldInfo,3);
04452                 switch($type)   {
04453                         case 'int':
04454 $out="
04455 '".$fieldName."' => array (
04456         'label' => '".strtoupper($fieldName).":',
04457         'exclude' => 0,
04458         'config' => array (
04459                 'type' => 'input',
04460                 'size' => '8',
04461                 'max' => '20',
04462                 'eval' => 'date',
04463                 'default' => '0',
04464                 'checkbox' => '0'
04465         )
04466 ),
04467 
04468 ----- OR -----
04469 
04470 '".$fieldName."' => array (
04471         'label' => '".strtoupper($fieldName).":',
04472         'exclude' => 0,
04473         'config' => array (
04474                 'type' => 'select',
04475                 'items' => array (
04476                         array('[nothing]', 0),
04477                         array('Extra choice! Only negative values here.', -1),
04478                         array('__Divider:__', '--div--')
04479                 ),
04480                 'foreign_table' => '[some_table_name]'
04481         )
04482 ),";
04483                         break;
04484                         case 'varchar':
04485                                 if ($len>10)    {
04486                                         $out="
04487 '".$fieldName."' => array (
04488         'label' => '".strtoupper($fieldName).":',
04489         'exclude' => 0,
04490         'config' => array (
04491                 'type' => 'input',
04492                 'size' => '8',
04493                 'max' => '".$len."',
04494                 'eval' => 'trim',
04495                 'default' => ''
04496         )
04497 ),";
04498                                 } else {
04499                                         $out="
04500 '".$fieldName."' => array (
04501         'label' => '".strtoupper($fieldName).":',
04502         'exclude' => 0,
04503         'config' => array (
04504                 'type' => 'select',
04505                 'items' => array (
04506                         array('Item number 1', 'key1'),
04507                         array('Item number 2', 'key2'),
04508                         array('-----', '--div--'),
04509                         array('Item number 3', 'key3')
04510                 ),
04511                 'default' => '1'
04512         )
04513 ),";
04514                                 }
04515                         break;
04516                         case 'tinyint':
04517                                         $out="
04518 '".$fieldName."' => array (
04519         'label' => '".strtoupper($fieldName).":',
04520         'exclude' => 0,
04521         'config' => array (
04522                 'type' => 'select',
04523                 'items' => array (
04524                         array('Item number 1', '1'),
04525                         array('Item number 2', '2'),
04526                         array('-----', '--div--'),
04527                         array('Item number 3', '3')
04528                 ),
04529                 'default' => '1'
04530         )
04531 ),
04532 
04533 ----- OR -----
04534 
04535 '".$fieldName."' => array (
04536         'label' => '".strtoupper($fieldName).":',
04537         'exclude' => 0,
04538         'config' => array (
04539                 'type' => 'check',
04540                 'default' => '1'
04541         )
04542 ),";
04543                         break;
04544                         case 'tinytext':
04545 $out="
04546 '".$fieldName."' => array (
04547         'label' => '".strtoupper($fieldName).":',
04548         'exclude' => 0,
04549         'config' => array (
04550                 'type' => 'input',
04551                 'size' => '40',
04552                 'max' => '255',
04553                 'eval' => '',
04554                 'default' => ''
04555         )
04556 ),";
04557                         break;
04558                         case 'text':
04559                         case 'mediumtext':
04560 $out="
04561 '".$fieldName."' => array (
04562         'label' => '".strtoupper($fieldName).":',
04563         'config' => array (
04564                 'type' => 'text',
04565                 'cols' => '48',
04566                 'rows' => '5'
04567         )
04568 ),";
04569                         break;
04570                         default:
04571                                 $out="
04572 '".$fieldName."' => array (
04573         'label' => '".strtoupper($fieldName).":',
04574         'exclude' => 0,
04575         'config' => array (
04576                 'type' => 'input',
04577                 'size' => '30',
04578                 'max' => '',
04579                 'eval' => '',
04580                 'default' => ''
04581         )
04582 ),";
04583                         break;
04584                 }
04585                 return $out?$out:$fieldInfo;
04586         }
04587 
04593         function includeTCA()   {
04594                 global $TCA;
04595 
04596                 include (TYPO3_tables_script ? PATH_typo3conf.TYPO3_tables_script : PATH_t3lib.'stddb/tables.php');
04597 
04598                         // Extension additions
04599                 if ($GLOBALS['TYPO3_LOADED_EXT']['_CACHEFILE']) {
04600                         include(PATH_typo3conf.$GLOBALS['TYPO3_LOADED_EXT']['_CACHEFILE'].'_ext_tables.php');
04601                 } else {
04602                         include(PATH_t3lib.'stddb/load_ext_tables.php');
04603                 }
04604 
04605                 if (TYPO3_extTableDef_script)   {
04606                         include (PATH_typo3conf.TYPO3_extTableDef_script);
04607                 }
04608 
04609                 reset($TCA);
04610                 while(list($table)=each($TCA))  {
04611                         t3lib_div::loadTCA($table);
04612                 }
04613         }
04614 
04615 
04616 
04617 
04618 
04619 
04620 
04621 
04622         /**********************
04623          *
04624          * GENERAL FUNCTIONS
04625          *
04626          **********************/
04627 
04635         function linkIt($url,$link='')  {
04636                 return '<a href="'.$url.'" target="_blank">'.($link?$link:$url).'</a>';
04637         }
04638 
04649         function message($head, $short_string='', $long_string='', $type=0, $force=0)   {
04650                 if (!$force && $this->mode=='123' && $type<2)   { return; }     // Return directly if mode-123 is enabled.
04651 
04652                 if ($type==3)   { $this->fatalError=1; }
04653                 if ($this->messageFunc_nl2br && !preg_match('/<\/table>/', $long_string))       {
04654                         $long_string = nl2br(trim($long_string));
04655                 } else {
04656                         $long_string = trim($long_string);
04657                 }
04658                 if (!$this->silent)     $this->printSection($head, $short_string, $long_string, $type);
04659         }
04660 
04670         function printSection($head, $short_string, $long_string, $type)        {
04671                 $icon='';
04672 
04673                 $bgCol =' bgcolor="#D9D5C9"';   // The default color
04674                 switch($type)   {
04675                         case '3':
04676                                 $bgCol =' bgcolor="red"';
04677                                 $icon = 'gfx/icon_fatalerror.gif';
04678                         break;
04679                         case '2':
04680                                 $bgCol =' bgcolor="#9BA1A8"';
04681                                 $icon = 'gfx/icon_warning.gif';
04682                         break;
04683                         case '1':
04684                                 // $bgCol =' bgcolor="#ABBBB4"';
04685                                 $icon = 'gfx/icon_note.gif';
04686                         break;
04687                         case '-1':
04688                                 // $bgCol =' bgcolor="yellow"';
04689                                 $icon = 'gfx/icon_ok.gif';
04690                         break;
04691                         default:
04692                                 $bgCol =' bgcolor="#D3D9DC"';
04693                         break;
04694                 }
04695                 if (!trim($short_string))       {
04696                         $this->sections[$head][]='';
04697                 } else {
04698                         $this->sections[$head][]='
04699                         <tr><td'.$bgCol.' nowrap="nowrap">'.($icon?'<img src="'.$this->backPath.$icon.'" width="18" height="16" align="top" alt="">':'').'<strong>'.$this->fw($short_string).'</strong></td></tr>'.(trim($long_string)?'
04700                         <tr><td>'.$this->fw($long_string).'<br /><br /></td></tr>' : '');
04701                 }
04702         }
04703 
04711         function fw($str,$size=1)       {
04712 
04713                 if (preg_match('/^<table/', $str) && preg_match('/<\/table>$/', $str)) {
04714                         // no wrap
04715                 } else {
04716                         if($size==1) {
04717                                 $size = 'class="smalltext"';
04718                         } elseif ($size==2) {
04719                                 $size = 'class="bodytext"';
04720                         } else {
04721                                 $size = 'size="size'.$size.'text"';
04722                         }
04723                         $str = '<span '.$size.'>'.$str.'</span>';
04724                 }
04725                 return $str;
04726         }
04727 
04734         function fwheader($str) {
04735                 return '<div align="center"><strong>'.$this->fw($str,3).'</strong></div>';
04736         }
04737 
04745         function wrapInCells($label,$content)   {
04746                 return '<tr><td valign="top" nowrap="nowrap"><strong>'.$this->fw($label).'</strong></td><td>&nbsp;</td><td valign="top">'.$this->fw($content).'<br /></td></tr>';
04747         }
04748 
04754         function printAll()     {
04755                 reset($this->sections);
04756                 $out='';
04757                 while(list($header,$valArray)=each($this->sections))    {
04758                         $out.='
04759                         <tr><td>&nbsp;</td></tr>
04760                         <tr><td><div align="center"><strong>'.$this->fw($header.':',2).'</strong></div></td></tr>
04761                         ';
04762                         $out.=implode($valArray,chr(10));
04763                 }
04764                 return '<table border="0" cellpadding="2" cellspacing="2">'.$out.'</table>';
04765         }
04766 
04773         function outputWrapper($content)        {
04774                 $out='
04775 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
04776    "http://www.w3.org/TR/html4/loose.dtd">
04777 <html>
04778         <head>
04779 
04780 <style type="text/css">
04781 body, p, td, a, span, input, .bodytext {
04782         font-family:verdana,sans-serif;
04783         font-size:1em;
04784         color:#000;
04785         text-align: left;
04786 }
04787 .smalltext {
04788         font-size:0.9em;
04789 }
04790 .size3text {
04791         font-size:1.2em;
04792 }
04793 .size4text {
04794         font-size:1.5em;
04795 }
04796 a {color: #600; text-decoration: none;}
04797 a:active {text-decoration: none;}
04798 a:hover {color: #006; text-decoration:underline:}
04799 </style>
04800 '.$this->headerStyle.'
04801 
04802                 <title>TYPO3 Install Tool</title>
04803                 '.($this->JSmessage?'
04804 <script language="javascript" type="text/javascript">alert(unescape(\''.rawurlencode($this->JSmessage).'\'));</script>
04805 
04806                 ':'').'
04807         </head>
04808         <body bgcolor="white" alink="maroon" link="maroon" vlink="maroon">'.$this->contentBeforeTable.'
04809                 <div align="center">
04810                 <table border="0" cellspacing="0" cellpadding="0" width="333" bgcolor="white">
04811                 <tr>
04812                         <td style="text-align:center;"><img src="'.$this->backPath.'gfx/typo3logo.gif" width="123" height="34" vspace="10" hspace="50" alt="TYPO3"></td>
04813                 </tr>
04814                 <tr>
04815                         <td bgcolor="black">
04816                                 <table width="100%" border="0" cellspacing="1" cellpadding="10">
04817                                         <tr>
04818                                                 <td bgcolor="#F4F0E8">
04819                                                 <div align="center"><span class="size4text"><strong>TYPO3 '.TYPO3_branch.' Install Tool</strong></span></div>
04820                                                 <div align="center"><span style="color:navy;"><strong>Site: '.$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'].'</strong></span></div>
04821                                                 '.($this->passwordOK ? '<div align="center"><span style="color:navy;"><strong>Version: '.TYPO3_version.'</strong></span></div>':'').'<br />
04822 
04823 '.($this->step?$this->stepHeader():$this->menu()).$content.'<hr />'.$this->note123().$this->endNotes().'
04824                                                 </td>
04825                                         </tr>
04826                                 </table>
04827                         </td>
04828                 </tr>
04829                 </table>
04830                 </div>
04831         </body>
04832 </html>';
04833                 return $out;
04834         }
04835 
04841         function menu() {
04842                 if (!$this->passwordOK) return;
04843 
04844                 reset($this->menuitems);
04845                 $c=0;
04846                 $out=array();
04847                 while(list($k,$v)=each($this->menuitems))       {
04848                         $bgcolor = ($this->INSTALL['type']==$k ? ' bgcolor="#ABBBB4"' : ' bgcolor="#F4F0E8"');
04849                         $c++;
04850                         $out[]='<tr><td'.$bgcolor.'><a href="'.htmlspecialchars($this->scriptSelf.'?TYPO3_INSTALL[type]='.$k.($this->mode?'&mode='.rawurlencode($this->mode):'')).'">'.$this->fw($c.': '.$v).'</a></td></tr>';
04851                 }
04852 
04853                 $code = '<table border="0" cellpadding="0" cellspacing="1">'.implode($out,chr(10)).'</table>';
04854                 $code = '<table border="0" cellpadding="0" cellspacing="0" bgcolor="#ABBBB4"><tr><td>'.$code.'</td></tr></table>';
04855                 return '<div align="center">'.$code.'</div>';
04856         }
04857 
04863         function stepHeader()   {
04864                 $msg1='Type in your database parameters here:';
04865                 $msg2='Database';
04866                 $msg3='Import the database sql-file';
04867                 $msg4='You\'re done!';
04868                 $out='<img src="'.$this->backPath.'gfx/123_'.$this->step.'.png" width="402" height="73" border="0" alt="" usemap="#id123_print_Map">
04869 <map name="id123_print_Map">
04870 <area title="'.$msg4.'" shape="poly" alt="" coords="299,35, 303,19, 313,9, 335,5, 366,6, 379,11, 388,21, 392,35, 390,47, 381,58, 376,64, 359,67, 320,66, 307,60, 302,51, 300,44" href="'.htmlspecialchars($this->scriptSelf.'?mode='.$this->mode.'&step=go').'">
04871 <area title="'.$msg3.'" shape="circle" alt="" coords="234,36,32" href="'.htmlspecialchars($this->scriptSelf.'?mode='.$this->mode.'&step=3').'">
04872 <area title="'.$msg2.'" shape="circle" alt="" coords="136,37,30" href="'.htmlspecialchars($this->scriptSelf.'?mode='.$this->mode.'&step=2').'">
04873 <area title="'.$msg1.'" shape="circle" alt="" coords="40,36,29" href="'.htmlspecialchars($this->scriptSelf.'?mode='.$this->mode.'&step=1').'">
04874 </map>
04875 
04876 
04877                 <br />';
04878                 $msg='';
04879                 switch(strtolower($this->step)) {
04880                         case 1:
04881                                 $msg=$msg1;
04882                         break;
04883                         case 2:
04884                                 $msg=$msg2;
04885                         break;
04886                         case 3:
04887                                 $msg=$msg3;
04888                         break;
04889                         case 'go':
04890                                 $msg=$msg4;
04891                         break;
04892                         default:
04893                         break;
04894                 }
04895                 $out.='<br /><div align="center"><strong>'.$this->fw($msg,2).'</strong></div>';
04896 
04897                 return $out;
04898         }
04899 
04905         function note123()      {
04906                 if ($this->mode=='123') {
04907                         $c='<table border="0" cellpadding="0" cellspacing="0" width="100%">
04908                                 <tr><td bgcolor="#D9D5C9" nowrap="nowrap"><img src="'.$this->backPath.'gfx/icon_note.gif" width="18" height="16" align="top" alt=""><strong>'.$this->fontTag1.'NOTICE: Install Tool is running in \'123\' mode. <a href="'.$this->scriptSelf.'">Click here to disable.</a></span></strong></td></tr>
04909                         </table>';
04910                         return $c;
04911                 }
04912         }
04913 
04919         function endNotes()     {
04920                 if ($this->mode!='123' && $this->passwordOK)    {
04921                         $c.='OS detected: <strong>'.(TYPO3_OS=='WIN'?'WIN':'UNIX').'</strong><br />';
04922                         $c.='UNIX/CGI detected: <strong>'.(php_sapi_name()=='cgi' ? 'YES' : 'NO').'</strong><br />';
04923                         $c.='PATH_thisScript: <strong>'.PATH_thisScript.'</strong><br />';
04924                         $c.='<br />';
04925                         $c.='<a href="../index.php" target="install_backend">Backend admin in new window.</a><br />';
04926                         $c.='<a href="../../index.php" target="install_frontend">Frontend website in new window.</a><br />';
04927 
04928                         return $this->fw($c);
04929                 }
04930         }
04931 
04938         function convertByteSize($bytes)        {
04939                 if (stristr($bytes,'m'))        {
04940                         $bytes=doubleval($bytes)*1024*1024;
04941                 } elseif (stristr($bytes,'k'))  {
04942                         $bytes=doubleval($bytes)*1024;
04943                 }
04944                 return $bytes;
04945         }
04946 
04952         function securityRisk() {
04953                 $c='This script is a <strong>great danger to the security of TYPO3</strong> if you don\'t secure it somehow.
04954                         We suggest one of the following:
04955 
04956                         - change the password as defined by the md5-hash in TYPO3_CONF_VARS[BE][installToolPassword].
04957                         - delete the folder \'typo3/install/\' with this script in or just insert an \'exit;\' line in the script-file there.
04958                         - password protect the \'typo3/install/\' folder, eg. with a .htaccess file
04959 
04960                         The TYPO3_CONF_VARS[BE][installToolPassword] is always active, but choosing one of the other options will improve security and is recommended highly.
04961                 ';
04962                 return $c;
04963         }
04964 
04970         function alterPasswordForm()    {
04971                         $content = '<form action="'.$this->scriptSelf.'?TYPO3_INSTALL[type]=extConfig" method="post">
04972                         Enter new password:
04973                         <input type="password" name="TYPO3_INSTALL[extConfig][BE][installToolPassword]" /><br />Enter again:
04974                         <input type="password" name="installToolPassword_check" />
04975                         <input type="hidden" name="installToolPassword_md5" value="1" />
04976                         <input type="submit" value="Set new password" /><br />
04977                         </form>';
04978                         return $content;
04979         }
04980 
04986         function messageBasicFinished() {
04987                 $msg ='
04988                                 Apparently you have completed the basic setup of the TYPO3 database.
04989                                 Now you can choose between these options:
04990 
04991                                 - <a href="../../index.php"><strong>Go to the frontend pages</strong></a>
04992 
04993                                 - <a href="../index.php"><strong>Go to the backend login</strong></a>
04994                                  (username may be: <i>admin</i>, password may be: <i>password</i>.)
04995 
04996                                 - <a href="'.$this->scriptSelf.'"><strong>Continue to configure TYPO3</strong></a> (Recommended).
04997                                  This will let you analyse and verify that everything in your PHP installation is alright. Also if you want to configure TYPO3 to use all the cool features, you <em>must</em> dig into the this!
04998                                 ';
04999                 return $msg;
05000         }
05001 
05008         function setScriptName($type)   {
05009                 $value = $this->scriptSelf.'?TYPO3_INSTALL[type]='.$type.($this->mode?'&mode='.rawurlencode($this->mode):'').($this->step?'&step='.rawurlencode($this->step):'');
05010                 return $value;
05011         }
05012 
05021         function formWidth($size=48,$textarea=0,$styleOverride='') {
05022                         // Input or text-field attribute (size or cols)
05023                 $wAttrib = $textarea?'cols':'size';
05024                 if (!$GLOBALS['CLIENT']['FORMSTYLE'])   {       // If not setting the width by style-attribute
05025                         $size = ceil($size*1);
05026                         $retVal = ' '.$wAttrib.'="'.$size.'"';
05027                 } else {        // Setting width by style-attribute. "cols" MUST be avoided with NN6+
05028                         $pixels = ceil($size*10);
05029                         $retVal = $styleOverride ? ' style="'.$styleOverride.'"' : ' style="width:'.$pixels.'px;"';
05030                 }
05031                 return $retVal;
05032         }
05033 
05042         function formWidthText($size=48,$styleOverride='',$wrap='') {
05043                 $wTags = $this->formWidth($size,1,$styleOverride);
05044                         // Netscape 6+ seems to have this ODD problem where there WILL ALWAYS be wrapping with the cols-attribute set and NEVER without the col-attribute...
05045                 if (strtolower(trim($wrap))!='off' && $GLOBALS['CLIENT']['BROWSER']=='net' && $GLOBALS['CLIENT']['VERSION']>=5) {
05046                         $wTags.=' cols="'.$size.'"';
05047                 }
05048                 return $wTags;
05049         }
05050 
05058         function getBackupFilename($filename)   {
05059                 if (preg_match('/\.php$/', $filename))  {
05060                         $backupFile = str_replace('.php', '_bak.php', $filename);
05061                 } else {
05062                         $backupFile = $filename.'~';
05063                 }
05064 
05065                 return $backupFile;
05066         }
05067 }
05068 
05069 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/install/mod/class.tx_install.php'])    {
05070         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/install/mod/class.tx_install.php']);
05071 }
05072 ?>


Généré par L'expert TYPO3 avec  doxygen 1.4.6