Documentation TYPO3 par Ameos

class.tx_install.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2004 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 ***************************************************************/
00145 require_once (PATH_t3lib.'class.t3lib_install.php');
00146 require_once (PATH_t3lib.'class.t3lib_stdgraphic.php');
00147 
00156 class tx_install extends t3lib_install {
00157         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()
00158         var $getGD_end_string = '</TABLE>';     // Used to identify the end of the GD section (found with getGD_start_string) in the output from phpinfo()
00159         var $getTTF_string = 'with TTF library';        // Used to identify whether TTF-lib is included with GD
00160         var $getTTF_string_alt = 'with freetype';       // Used to identify whether TTF-lib is included with GD
00161         var $action = "";               // The url that calls this script
00162         var $scriptSelf = "index.php";          // The url that calls this script
00163         var $fontTag2='<font face="verdana,sans-serif" size=2 color=black>';
00164         var $fontTag1='<font face="verdana,sans-serif" size=1 color=black>';
00165         var $updateIdentity = "TYPO3 Install Tool";
00166         var $headerStyle ='';
00167         var $contentBeforeTable="";
00168         var $setAllCheckBoxesByDefault=0;
00169 
00170         var $allowFileEditOutsite_typo3conf_dir=0;
00171 
00172         var $INSTALL =array();          // In constructor: is set to global GET/POST var TYPO3_INSTALL
00173         var $checkIMlzw = 0;            // If set, lzw capabilities of the available ImageMagick installs are check by actually writing a gif-file and comparing size
00174         var $checkIM = 0;                       // If set, ImageMagick is checked.
00175         var $dumpImCommands=1;                  // If set, the image Magick commands are always outputted in the image processing checker
00176         var $mode = ""; // If set to "123" then only most vital information is displayed.
00177         var $step = 0;  // If set to 1,2,3 or GO it signifies various functions.
00178 
00179         // internal
00180         var $passwordOK=0;                      // This is set, if the password check was ok. The function init() will exit if this is not set
00181         var $silent=1;                          // If set, the check routines don't add to the message-array
00182         var $messageFunc_nl2br=1;
00183         var $sections=array();          // Used to gather the message information.
00184         var $fatalError=0;                      // This is set if some error occured that will definitely prevent TYpo3 from running.
00185         var $sendNoCacheHeaders=1;
00186         var $config_array = array(      // Flags are set in this array if the options are available and checked ok.
00187                 "gd"=>0,
00188                 "gd_gif"=>0,
00189                 "gd_png"=>0,
00190                 "gd_jpg"=>0,
00191                 "freetype" => 0,
00192                 "safemode" => 0,
00193                 "dir_typo3temp" => 0,
00194                 "dir_temp" => 0,
00195                 "im_versions" => array(),
00196                 "im" => 0,
00197                 "sql.safe_mode_user" => "",
00198                 "mysqlConnect" => 0,
00199                 "no_database" => 0
00200         );
00201         var $typo3temp_path="";
00202 
00203         var $menuitems = array(
00204                 "config" => "Basic Configuration",
00205                 "database" => "Database Analyser",
00206                 "images" => "Image Processing",
00207                 "extConfig" => "All Configuration",
00208                 "typo3temp" => "typo3temp/",
00209                 "cleanup" => "Clean up database",
00210                 "phpinfo" => "phpinfo()",
00211                 "typo3conf_edit" => "Edit files in typo3conf/",
00212                 "about" => "About"
00213         );
00214         var $cookie_name = "Typo3InstallTool";
00215         var $JSmessage = '';
00216 
00217 
00218 
00219 
00220 
00221 
00227         function tx_install()   {
00228                 parent::t3lib_install();
00229 
00230                 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\";<BR><BR>See the document 'installing_upgrading_32b1.pdf' for more info.");
00231 
00232                 if ($this->sendNoCacheHeaders)  {
00233                         header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
00234                         header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
00235                         header("Expires: 0");
00236                         header("Cache-Control: no-cache, must-revalidate");
00237                         header("Pragma: no-cache");
00238                 }
00239 
00240                         // ****************************
00241                         // Initializing incoming vars.
00242                         // ****************************
00243                 $this->INSTALL = t3lib_div::_GP("TYPO3_INSTALL");
00244                 $this->mode = t3lib_div::_GP("mode");
00245                 $this->step = t3lib_div::_GP("step");
00246                 if ($_GET["TYPO3_INSTALL"]["type"])     $this->INSTALL["type"] = $_GET["TYPO3_INSTALL"]["type"];
00247 
00248                 if ($this->step==3)     {
00249                         $this->INSTALL["type"]="database";
00250                 }
00251 
00252                 if ($this->mode=="123") {
00253                         $tempItems = $this->menuitems;
00254                         unset($this->menuitems);
00255                         $this->menuitems["config"] = $tempItems["config"];
00256                         $this->menuitems["database"] = $tempItems["database"];
00257                         if (!$this->INSTALL["type"] || !isset($this->menuitems[$this->INSTALL["type"]]))        $this->INSTALL["type"] = "config";
00258                 } else {
00259                         if (!$this->INSTALL["type"] || !isset($this->menuitems[$this->INSTALL["type"]]))        $this->INSTALL["type"] = "about";
00260                 }
00261 
00262                 $this->action = $this->scriptSelf."?TYPO3_INSTALL[type]=".$this->INSTALL["type"].($this->mode?"&mode=".rawurlencode($this->mode):"").($this->step?"&step=".rawurlencode($this->step):"");
00263                 $this->typo3temp_path = PATH_site."typo3temp/";
00264 
00265 
00266                         // ****************
00267                         // Check password
00268                         // ****************
00269                         // Getting a unique session key, used to encode the session-access cookie later...
00270                 $uKey = $_COOKIE[$this->cookie_name."_key"];
00271                 if (!$uKey)     {
00272                         $uKey = md5(uniqid(microtime()));
00273                         SetCookie($this->cookie_name."_key", $uKey, 0, "/");            // Cookie is set
00274 
00275                         $this->JSmessage='SECURITY:
00276 Make sure to protect the Install Tool with another password than "joh316".
00277 Better yet you can add a die() function call to typo3/install/index.php after usage.
00278 
00279 IF THE INSTALL TOOL CRASHES...
00280 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.
00281 Workaround: Open the file typo3/t3lib/class.t3lib_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.
00282 On behalf of PHP we regret this inconvenience.
00283 
00284 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.
00285 ';
00286 
00287                 }
00288                         // Check if the password from TYPO3_CONF_VARS combined with uKey matches the sKey cookie. If not, ask for password.
00289                 $sKey = $_COOKIE[$this->cookie_name];
00290 
00291                 if (md5($GLOBALS["TYPO3_CONF_VARS"]["BE"]["installToolPassword"]."|".$uKey) == $sKey || $this->checkPassword($uKey))    {
00292                         $this->passwordOK=1;
00293                 }
00294 
00295                 if ($GLOBALS["CLIENT"]["SYSTEM"]=="unix" && $GLOBALS["CLIENT"]["BROWSER"]=="konqu")     {
00296                         $this->fontTag2='<font face="verdana,sans-serif" size=4 color=black>';
00297                         $this->fontTag1='<font face="verdana,sans-serif" size=3 color=black>';
00298                 }
00299         }
00300 
00307         function checkPassword($uKey)   {
00308                 $p = t3lib_div::_GP("password");
00309 
00310                 if ($p && md5($p)==$GLOBALS["TYPO3_CONF_VARS"]["BE"]["installToolPassword"])    {
00311                         $sKey = md5($GLOBALS["TYPO3_CONF_VARS"]["BE"]["installToolPassword"]."|".$uKey);
00312                         SetCookie($this->cookie_name, $sKey, 0, "/");
00313 
00314                                 // Sending warning email
00315                         $wEmail = $GLOBALS["TYPO3_CONF_VARS"]["BE"]["warning_email_addr"];
00316                         if ($wEmail)    {
00317                                 $subject="Install Tool Login at '".$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"]."'";
00318                                 $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").")";
00319                                 mail($wEmail,
00320                                         $subject,
00321                                         $email_body,
00322                                         "From: TYPO3 Install Tool WARNING <>"
00323                                 );
00324                         }
00325                         return true;
00326                 } else {
00327                         $this->messageFunc_nl2br=0;
00328                         $this->silent=0;
00329                         $content = '<form action="'.$this->action.'" method="POST">
00330                         <input type="password" name="password"><BR>
00331                         <input type="submit" value="Log in"><br>
00332                         <br>
00333 
00334                         '.$this->fw('The Install Tool Password is <i>not</i> the admin password of TYPO3.<BR>
00335                                 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.'.
00336                                 ($p?"<BR><BR>The password you just tried has this md5-value: <BR><BR>".md5($p):"")
00337                                 ).'
00338                         </form>';
00339 
00340                         $this->message("Password", "Enter the Install Tool Password", $content,3);
00341                         echo $this->outputWrapper($this->printAll());
00342                                 // Bad password, send warning:
00343                         if ($p) {
00344                                 $wEmail = $GLOBALS["TYPO3_CONF_VARS"]["BE"]["warning_email_addr"];
00345                                 if ($wEmail)    {
00346                                         $subject="Install Tool Login ATTEMPT at '".$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"]."'";
00347                                         $email_body="There has been a Install Tool login attempt at TYPO3 site '".$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"]."' (".t3lib_div::getIndpEnv("HTTP_HOST").").
00348 Password tried was '".$p."'
00349 REMOTE_ADDR was '".t3lib_div::getIndpEnv("REMOTE_ADDR")."' (".t3lib_div::getIndpEnv("REMOTE_HOST").")";
00350                                         mail($wEmail,
00351                                                 $subject,
00352                                                 $email_body,
00353                                                 "From: TYPO3 Install Tool WARNING <>"
00354                                         );
00355                                 }
00356                         }
00357 
00358                         return false;
00359                 }
00360         }
00361 
00368         function init() {
00369                 if (!defined("PATH_typo3"))     exit;           // Must be called after inclusion of init.php (or from init.php)
00370                 if (!$this->passwordOK) exit;
00371 //              debug($_COOKIE);
00372 
00373                         // Setting stuff...
00374                 $this->check_mail();
00375                 $this->setupGeneral();
00376                 $this->generateConfigForm();
00377                 if (count($this->messages))     debug($this->messages);
00378 
00379                 if ($this->step)        {
00380                         echo $this->outputWrapper($this->stepOutput());
00381                 } else {
00382                                 // Menu...
00383                         switch($this->INSTALL["type"])  {
00384                                 case "images":
00385                                         $this->checkIM=1;
00386                                         $this->checkTheConfig();
00387                                         $this->silent=0;
00388                                         $this->checkTheImageProcessing();
00389                                 break;
00390                                 case "database":
00391                                         $this->checkTheConfig();
00392                                         $this->silent=0;
00393                                         $this->checkTheDatabase();
00394                                 break;
00395                                 case "config":
00396                                         $this->silent=0;
00397                                         $this->checkIM=1;
00398                                         $this->message("About configuration","How to configure TYPO3",$this->generallyAboutConfiguration());
00399                                         $this->checkTheConfig();
00400 
00401                                         $ext = "Write config to localconf.php";
00402                                         if ($this->fatalError)  {
00403                                                 if ($this->config_array["no_database"] || !$this->config_array["mysqlConnect"]) {
00404                                                         $this->message($ext, "Database not configured yet!", "
00405                                                                 You need to specify database username, password and host as one of the first things.
00406                                                                 Next you'll have to select a database to use with TYPO3.
00407                                                                 Use the form below:
00408                                                         ",2);
00409                                                 } else {
00410                                                         $this->message($ext, "Fatal error encountered!", "
00411                                                                 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!
00412                                                                 You should also check all warnings that may appear.
00413                                                         ",2);
00414                                                 }
00415                                         } elseif ($this->mode=="123") {
00416                                                 if (!$this->fatalError) {
00417                                                         $this->message($ext, "Basic configuration completed", '
00418                                                                 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.
00419 
00420                                                                 <B><font color=red>Step 2:</font></B> <a href="'.$this->scriptSelf.'?TYPO3_INSTALL[type]=database'.($this->mode?"&mode=".rawurlencode($this->mode):"").'">Click here to install the database.</a>
00421                                                         ',-1,1);
00422                                                 }
00423                                         }
00424                                         $this->message($ext, "Very Important: Changing Image Processing settings", "
00425                                                 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.
00426                                                 The problem is solved by <a href=\"".$this->setScriptName("typo3temp")."\">clearing the typo3temp/ folder</a>. Also make sure to clear the cache_pages table.
00427                                                 ",1,1);
00428                                         $this->message($ext, "Update localconf.php", "
00429                                                 This form updates the localconf.php file with the suggested values you see below. The values are based on the analysis above.
00430                                                 You can change the values in case you have alternatives to the suggested defaults.
00431                                                 By this final step you will configure TYPO3 for immediate use provided that you have no fatal errors left above."
00432                                                 .$this->setupGeneral("get_form"),0,1);
00433 
00434                                         echo $this->outputWrapper($this->printAll());
00435                         //              debug($this->config_array);
00436                                 break;
00437                                 case "extConfig":
00438                                         $this->silent=0;
00439 
00440                                         $this->generateConfigForm("get_form");
00441 
00442                                         $content = $this->printAll();
00443                                         $content = '<form action="'.$this->action.'" method="POST">'.$content.'<input type="submit" value="Write to localconf.php"><BR><BR>
00444                                         '.$this->fw("<strong>NOTICE: </strong>By clicking this button, localconf.php is updated with new values for the parameters listed above!<BR>").'
00445                                         </form>';
00446                                         echo $this->outputWrapper($content);
00447                                 break;
00448                                 case "typo3temp":
00449                                         $this->checkTheConfig();
00450                                         $this->silent=0;
00451                                         $this->typo3TempManager();
00452                                 break;
00453                                 case "cleanup":
00454                                         $this->checkTheConfig();
00455                                         $this->silent=0;
00456                                         $this->cleanupManager();
00457                                 break;
00458                                 case "phpinfo":
00459                                         $this->silent=0;
00460                                         $this->phpinformation();
00461                                 break;
00462                                 case "typo3conf_edit":
00463                                         $this->silent=0;
00464                                         $this->typo3conf_edit();
00465                                 break;
00466                                 case "about":
00467                                 default:
00468                                         $this->silent=0;
00469                                         $this->message("About", "Warning - very important!", $this->securityRisk().$this->alterPasswordForm(),2);
00470 
00471                                         $this->message("About", "Using this script", "
00472                                         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.
00473                                         There are three primary steps for you to take:
00474 
00475                                         <strong>1: Basic Configuration</strong>
00476                                         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.
00477                                         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.
00478                                         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.
00479 
00480                                         <strong>2: Database Analyser</strong>
00481                                         In this step you can either install a new database or update the database from any previous TYPO3 version.
00482                                         You can also get an overview of extra/missing fields/tables in the database compared to a raw sql-file.
00483                                         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.
00484 
00485                                         <strong>3: Image Processing</strong>
00486                                         This step is a visual guide to verify your configuration of the image processing software.
00487                                         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.
00488 
00489                                         <strong>4: All Configuration</strong>
00490                                         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.
00491 
00492                                         <strong>5: typo3temp/</strong>
00493                                         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.
00494                                         ");
00495 
00496                                         $this->message("About", "Why is this script stand-alone?", "
00497                                         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.
00498                                         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!
00499                                         ");
00500 
00501 
00502                                         $headCode="Header legend";
00503                                         $this->message($headCode, "Just information", "
00504                                         This is a simple message with some information about something.
00505                                         ");
00506                                         $this->message($headCode, "Check was successful", "
00507                                         Indicates that something was checked and returned an expected result.
00508                                         ",-1);
00509                                         $this->message($headCode, "Notice!", "
00510                                         Indicates that something is important to be aware of.
00511                                         This does <em>not</em> indicate an error.
00512                                         ",1);
00513                                         $this->message($headCode, "Warning!", "
00514                                         Indicates that something may very well cause trouble and you should definitely look into it before proceeding.
00515                                         This indicates a <em>potential</em> error.
00516                                         ",2);
00517                                         $this->message($headCode, "Error!", "
00518                                         Indicates that something is definitely wrong and that TYPO3 will most likely not perform as expected if this problem is not solved.
00519                                         This indicates an actual error.
00520                                         ",3);
00521 
00522                                         echo $this->outputWrapper($this->printAll());
00523                                 break;
00524                         }
00525                 }
00526         }
00527 
00533         function stepOutput()   {
00534                 $this->checkTheConfig();
00535                 $error_missingConnect='<br>
00536                         '.$this->fontTag2.'<img src="../t3lib/gfx/icon_fatalerror.gif" width=18 height=16 class="absmiddle">
00537                         There is no connection to the database!<br>
00538                         (Username: <i>'.TYPO3_db_username.'</i>, Password: <i>'.TYPO3_db_password.'</i>, Host: <i>'.TYPO3_db_host.'</i>).<BR>
00539                         <br>
00540                         <strong>Go to Step 1</strong> and enter a proper username/password!</font>
00541                         <br>
00542                         <br>
00543                 ';
00544                 $error_missingDB='<br>
00545                         '.$this->fontTag2.'<img src="../t3lib/gfx/icon_fatalerror.gif" width=18 height=16 class="absmiddle">
00546                         There is no access to the database (<i>'.TYPO3_db.'</i>)!<br>
00547                         <br>
00548                         <strong>Go to Step 2</strong> and select an accessible database!</font>
00549                         <br>
00550                         <br>
00551                 ';
00552 
00553                 $whichTables=$this->getListOfTables();
00554                 $dbInfo='
00555                                         <table border=0 cellpadding=1 cellspacing=0>
00556                                                 <tr>
00557                                                         <td valign="top" nowrap colspan=2 align=center>'.$this->fontTag2.'<strong><img src="../t3lib/gfx/icon_note.gif" hspace=5 width=18 height=16 class="absmiddle">Database summary:</strong></font></td>
00558                                                 </tr>
00559                                                 <tr>
00560                                                         <td valign="top" nowrap>'.$this->fontTag1.'Username:</font></td>
00561                                                         <td valign="top" nowrap><strong>'.$this->fontTag1.''.TYPO3_db_username.'</font></strong></td>
00562                                                 </tr>
00563                                                 <tr>
00564                                                         <td valign="top" nowrap>'.$this->fontTag1.'Password:</font></td>
00565                                                         <td valign="top" nowrap><strong>'.$this->fontTag1.''.TYPO3_db_password.'</font></strong></td>
00566                                                 </tr>
00567                                                 <tr>
00568                                                         <td valign="top" nowrap>'.$this->fontTag1.'Host:</font></td>
00569                                                         <td valign="top" nowrap><strong>'.$this->fontTag1.''.TYPO3_db_host.'</font></strong></td>
00570                                                 </tr>
00571                                                 <tr>
00572                                                         <td valign="top" nowrap>'.$this->fontTag1.'Database:</font></td>
00573                                                         <td valign="top" nowrap><strong>'.$this->fontTag1.''.TYPO3_db.'</font></strong></td>
00574                                                 </tr>
00575                                                 <tr>
00576                                                         <td valign="top" nowrap>'.$this->fontTag1.'# of tables:</font></td>
00577                                                         <td valign="top" nowrap><strong>'.$this->fontTag1.''.(count($whichTables)?'<font color=red>'.count($whichTables).'</font>':count($whichTables)).'</font></strong></td>
00578                                                 </tr>
00579                                         </table>
00580                 ';
00581                 $error_emptyDB='<br>
00582                         '.$this->fontTag2.'<img src="../t3lib/gfx/icon_fatalerror.gif" width=18 height=16 class="absmiddle">
00583                         The database is still empty. There are no tables!<br>
00584                         <br>
00585                         <strong>Go to Step 3</strong> and import a database!</font>
00586                         <br>
00587                         <br>
00588                 ';
00589 
00590                 switch(strtolower($this->step)) {
00591                         case 1:
00592                                 $msg='
00593 <br>
00594 <br>
00595                                         <table border=0>
00596                                            <form action="'.$this->action.'" method="POST">
00597                                                 <tr>
00598                                                         <td valign="top" nowrap><strong>
00599                                                            '.$this->fontTag2.'Username:</font></strong>
00600                                                         </td>
00601                                                         <td>    &nbsp;
00602                                                         </td>
00603                                                         <td valign="top">
00604                                                            '.$this->fontTag2.'
00605                                                            <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_username]" value="'.TYPO3_db_username.'"></font><BR>
00606                                                         </td>
00607                                                 </tr>
00608                                                 <tr>
00609                                                         <td valign="top" nowrap><strong>
00610                                                            '.$this->fontTag2.'Password:</font></strong>
00611                                                         </td>
00612                                                         <td>    &nbsp;
00613                                                         </td>
00614                                                         <td valign="top">
00615                                                            '.$this->fontTag2.'
00616                                                            <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_password]" value="'.TYPO3_db_password.'"></font><BR>
00617                                                         </td>
00618                                                 </tr>
00619                                                 <tr>
00620                                                         <td valign="top" nowrap><strong>
00621                                                            '.$this->fontTag2.'Host:</font></strong>
00622                                                         </td>
00623                                                         <td>    &nbsp;
00624                                                         </td>
00625                                                         <td valign="top">
00626                                                            '.$this->fontTag2.'
00627                                                            <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_host]" value="'.(TYPO3_db_host?TYPO3_db_host:'localhost').'"></font><BR>
00628                                                         </td>
00629                                                 </tr>
00630                                                 <tr>
00631                                                         <td valign="top" nowrap><strong>
00632                                                            '.$this->fontTag1.'</font></strong>
00633                                                         </td>
00634                                                         <td>    &nbsp;
00635                                                         </td>
00636                                                         <td valign="top">
00637                                                            '.$this->fontTag1.'<BR>
00638                                                            <input type="hidden" name="step" value="2">
00639                                                            <input type="submit" value="Update localconf.php"><BR><br /><strong>NOTICE: </strong>By clicking this button, typo3conf/localconf.php is updated with new values for the parameters listed above!</font><BR>
00640                                                         </td>
00641                                                 </tr>
00642                                            </form>
00643                                         </table>
00644 <br>
00645 <br>
00646                                 ';
00647                         break;
00648                         case 2:
00649                                 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
00650                                         $dbArr = $this->getDatabaseList();
00651                                         reset($dbArr);
00652                                         $options="";
00653                                         $options.='<option value="">[ SELECT DATABASE ]</option>';
00654                                         $dbIncluded=0;
00655                                         while(list(,$dbname)=each($dbArr))      {
00656                                                 $options.='<option value="'.htmlspecialchars($dbname).'"'.($dbname==TYPO3_db?' selected':'').'>'.htmlspecialchars($dbname).'</option>';
00657                                                 if ($dbname==TYPO3_db)  $dbIncluded=1;
00658                                         }
00659                                         if (!$dbIncluded && TYPO3_db)   {
00660                                                 $options.='<option value="'.htmlspecialchars(TYPO3_db).'" selected>'.htmlspecialchars(TYPO3_db).' (NO ACCESS!)</option>';
00661                                         }
00662                                         $select='<select name="TYPO3_INSTALL[localconf.php][typo_db]">'.$options.'</select>';
00663                                         $msg='
00664 <br>
00665 <br>
00666                                         <table border=0>
00667                                            <form action="'.$this->action.'" method="POST">
00668                                                 <tr>
00669                                                         <td valign="top" nowrap><strong>
00670                                                            '.$this->fontTag2.'
00671                                                            You have two options:<br>
00672                                                            <br><br>
00673 
00674                                                            1: Select an existing <u>EMPTY</u> database:</font></strong>
00675                                                         </td>
00676                                                 </tr>
00677                                                 <tr>
00678                                                         <td valign="top">
00679                                                            '.$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.'</font><BR>
00680                                                         </td>
00681                                                 </tr>
00682                                                 <tr>
00683                                                         <td valign="top" nowrap><br>
00684                                                         <br>
00685 <strong>
00686                                                            '.$this->fontTag2.'2: Create new database (recommended):</font></strong>
00687                                                         </td>
00688                                                 </tr>
00689                                                 <tr>
00690                                                         <td valign="top">
00691                                                            '.$this->fontTag1.'Enter the desired name of the database here:<BR><input type="text" name="TYPO3_INSTALL[localconf.php][NEW_DATABASE_NAME]" value=""></font><BR>
00692                                                         </td>
00693                                                 </tr>
00694                                                 <tr>
00695                                                         <td valign="top">                  <br>
00696 
00697                                                            '.$this->fontTag1.'<BR>
00698                                                            <input type="hidden" name="step" value="3">
00699                                                            <input type="submit" value="Update localconf.php"><BR><br /><strong>NOTICE: </strong>By clicking this button, typo3conf/localconf.php is updated with new values for the parameters listed above!</font><BR>
00700                                                         </td>
00701                                                 </tr>
00702                                            </form>
00703                                         </table>
00704 <br>
00705 <br>
00706                                 ';
00707                                 } else {
00708                                         $msg=$error_missingConnect;
00709                                 }
00710                         break;
00711                         case 3:
00712                                 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
00713                                         if ($GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db))      {
00714                                                 $sFiles = t3lib_div::getFilesInDir(PATH_typo3conf,"sql",1,1);
00715                                                 reset($sFiles);
00716                                                 $opt='';
00717                                                 while(list(,$f)=each($sFiles))  {
00718                                                         $opt.='<option value="import|'.htmlspecialchars($f).'">'.htmlspecialchars(basename($f)).'</option>';
00719                                                 }
00720 
00721 
00722                                                 $content='
00723                                                         '.$this->fontTag2.'Database dumps in typo3conf/ directory:</font><BR>
00724                                                         <input type="hidden" name="TYPO3_INSTALL[database_import_all]" value=1>
00725                                                    <input type="hidden" name="step" value="">
00726                                                    <input type="hidden" name="goto_step" value="go">
00727                                                         <select name="TYPO3_INSTALL[database_type]">'.$opt.'</select><BR>';
00728 
00729                                                 $content = $this->getUpdateDbFormWrap("import", $content, "Import database");
00730 
00731                                                 $msg='
00732                                                 <br>
00733                                                 '.$dbInfo.'<br>
00734                                                 <br>
00735                                                 '.$content.'
00736 
00737                                                 ';
00738 
00739                                         } else {
00740                                                 $msg=$error_missingDB;
00741                                         }
00742                                 } else {
00743                                         $msg=$error_missingConnect;
00744                                 }
00745                         break;
00746                         case "go":
00747                                 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
00748                                         if ($GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db))      {
00749                                                 if (count($whichTables))        {
00750                                                         $msg='
00751                                                         <br>
00752                                                         '.$this->fontTag2.'
00753                                                         '.nl2br($this->messageBasicFinished()).'
00754                                                         <br>
00755                                                         <hr>
00756                                                         <div align="center"><strong><img src="../t3lib/gfx/icon_warning.gif" hspace=5 width=18 height=16 class="absmiddle">IMPORTANT</strong></div><br>
00757                                                         <font size=1>'.nl2br($this->securityRisk()).'
00758                                                         <br>
00759                                                         <strong>Enter <a href="'.$this->scriptSelf.'">"Normal" mode for the Install Tool</a> to change this!</strong><br>
00760 
00761                                                         </font>
00762                                                         </font><BR>
00763                                                         ';
00764                                                 } else {
00765                                                         $msg=$error_emptyDB;
00766                                                 }
00767                                         } else {
00768                                                 $msg=$error_missingDB;
00769                                         }
00770                                 } else {
00771                                         $msg=$error_missingConnect;
00772                                 }
00773                         break;
00774                         default:
00775                         break;
00776                 }
00777                 return $msg;
00778         }
00779 
00785         function checkTheConfig()       {
00786                         // Order important:
00787                 $this->checkDirs();
00788                 $this->checkConfiguration();
00789                 $this->checkExtensions();
00790 
00791                 if (TYPO3_OS=="WIN")    {
00792                         $paths=array($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_path_lzw"], $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_path"], "c:\\php\\imagemagick\\", 'c:\\apache\\ImageMagick\\');
00793                 } else {
00794                         $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/");
00795                 }
00796 
00797                 asort($paths);
00798                 if (ini_get("safe_mode"))       {
00799                         $paths=array(ini_get("safe_mode_exec_dir"),"/usr/local/php/bin/");
00800                 }
00801                 if ($this->INSTALL["checkIM"]["lzw"])   {
00802                         $this->checkIMlzw=1;
00803                 }
00804                 if ($this->INSTALL["checkIM"]["path"])  {
00805                         $paths[]=trim($this->INSTALL["checkIM"]["path"]);
00806                 }
00807                 if ($this->checkIM)     $this->checkImageMagick($paths);
00808                 $this->checkDatabase();
00809         }
00810 
00816         function typo3conf_edit()       {
00817                 $EDIT_path = PATH_typo3conf;    // default:
00818                 if ($this->allowFileEditOutsite_typo3conf_dir && $this->INSTALL["FILE"]["EDIT_path"])   {
00819                         if (t3lib_div::validPathStr($this->INSTALL["FILE"]["EDIT_path"]) && substr($this->INSTALL["FILE"]["EDIT_path"],-1)=="/")        {
00820                                 $tmp_path = PATH_site.$this->INSTALL["FILE"]["EDIT_path"];
00821                                 if (is_dir($tmp_path))  {
00822                                         $EDIT_path=$tmp_path;
00823                                 } else {debug("'".$tmp_path."' was not dir");}
00824                         } else {
00825                                 debug("BAD DIR_NAME (must be like t3lib/ or media/script/)");
00826                         }
00827                 }
00828 
00829                 $headCode = "Edit files in ".basename($EDIT_path)."/";
00830                 $this->contentBeforeTable="";
00831 
00832                 if ($this->INSTALL["SAVE_FILE"])        {
00833                         $save_to_file = $this->INSTALL["FILE"]["name"];
00834                         if (@is_file($save_to_file))    {
00835                                 $save_to_file_md5 = md5($save_to_file);
00836                                 if (isset($this->INSTALL["FILE"][$save_to_file_md5]) && t3lib_div::isFirstPartOfStr($save_to_file,$EDIT_path."") && substr($save_to_file,-1)!="~")      {
00837                                         $this->INSTALL["typo3conf_files"] = $save_to_file;
00838                                         $save_fileContent = $this->INSTALL["FILE"][$save_to_file_md5];
00839 
00840                                         if ($this->INSTALL["FILE"]["win_to_unix_br"])   {
00841                                                 $save_fileContent = str_replace(chr(13).chr(10),chr(10),$save_fileContent);
00842                                         }
00843                                         if ($this->INSTALL["FILE"]["backup"])   {
00844                                                 if (@is_file($save_to_file."~"))        unlink($save_to_file."~");
00845                                                 rename($save_to_file,$save_to_file."~");
00846                                                 $this->contentBeforeTable.='Backup written to <strong>'.$save_to_file.'~</strong><BR>';
00847                                         } else {
00848                                                 if (@is_file($save_to_file."~"))        {
00849                                                         unlink($save_to_file."~");
00850                                                         $this->contentBeforeTable.='Backup REMOVED! (<strong>'.$save_to_file.'~</strong>)<BR>';
00851                                                 }
00852                                         }
00853 
00854                                         t3lib_div::writeFile($save_to_file,$save_fileContent);
00855                                         $this->contentBeforeTable.='
00856                                                 File saved: <strong>'.$save_to_file.'</strong><BR>
00857                                                 MD5-sum: '.$this->INSTALL["FILE"]["prevMD5"].' (prev)<BR>
00858                                                 MD5-sum: '.md5($save_fileContent).' (new)<BR>
00859                                         ';
00860                                 }
00861                         }
00862                 }
00863 
00864 
00865                         // Filelist:
00866                 $typo3conf_files = t3lib_div::getFilesInDir($EDIT_path,"",1,1);
00867                 reset($typo3conf_files);
00868                 $lines=array();
00869                 $fileFound = 0;
00870                 while(list($k,$file)=each($typo3conf_files))    {
00871                         if ($this->INSTALL["typo3conf_files"] && !strcmp($this->INSTALL["typo3conf_files"],$file))      {
00872                                 $wrap=array('<strong><font color=navy>','</font></strong>');
00873                                 $fileFound = 1;
00874                         } else {$wrap=array();}
00875                         $lines[]='<tr><td 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>';
00876                 }
00877                 $fileList='<table border=0 cellpadding=0 cellspacing=0>'.implode("",$lines).'</table>';
00878                 $fileList.="<BR>(".$EDIT_path.")";
00879 
00880                 if ($this->allowFileEditOutsite_typo3conf_dir)  {
00881                         $fileList.='<BR><form action="'.$this->action.'" method="POST">
00882                         '.PATH_site.'<input type="text" name="TYPO3_INSTALL[FILE][EDIT_path]" value="'.$this->INSTALL["FILE"]["EDIT_path"].'"><input type="submit" name="" value="Set">
00883                         </form>';
00884                 }
00885 
00886                 if ($fileFound && @is_file($this->INSTALL["typo3conf_files"]))  {
00887                         $this->headerStyle = '
00888                         <style type="text/css"><!--
00889                                 SELECT {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00890                                 TEXTAREA  {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00891                                 INPUT {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00892                         //--></style>
00893                         ';
00894 
00895                         $fileContent = t3lib_div::getUrl($this->INSTALL["typo3conf_files"]);
00896                         $this->contentBeforeTable.= '<form action="'.$this->action.'" method="POST">
00897                                 '.(substr($this->INSTALL["typo3conf_files"],-1)!="~"?'<input type="submit" name="TYPO3_INSTALL[SAVE_FILE]" value="Save file">&nbsp;':'').'<input type="submit" name="_close" value="Close">
00898                                 <BR>File: '.$this->INSTALL["typo3conf_files"].'
00899                                 <BR>MD5-sum: '.md5($fileContent).'
00900                                 <BR>
00901 
00902                                 <input type="hidden" name="TYPO3_INSTALL[FILE][name]" value="'.$this->INSTALL["typo3conf_files"].'">
00903                                 '.($this->allowFileEditOutsite_typo3conf_dir?'<input type="hidden" name="TYPO3_INSTALL[FILE][EDIT_path]" value="'.$this->INSTALL["FILE"]["EDIT_path"].'">':'').'
00904                                 <input type="hidden" name="TYPO3_INSTALL[FILE][prevMD5]" value="'.md5($fileContent).'">
00905                                 <textarea rows="30" name="TYPO3_INSTALL[FILE]['.md5($this->INSTALL["typo3conf_files"]).']" wrap="off"'.$this->formWidthText(48,"width:98%;height:80%","off").'>'.t3lib_div::formatForTextarea($fileContent).'</textarea><BR>
00906                                 <input type="checkbox" name="TYPO3_INSTALL[FILE][win_to_unix_br]" value="1"'.(TYPO3_OS=="WIN"?"":" CHECKED").'> Convert windows linebreaks (13-10) to unix (10)<BR>
00907                                 <input type="checkbox" name="TYPO3_INSTALL[FILE][backup]" value="1"'.(@is_file($this->INSTALL["typo3conf_files"]."~") ? " CHECKED":"").'> Make backup copy (else remove any backup copy, prepended by "~")<BR>
00908                                 '.
00909                         '</form>';
00910                 }
00911 
00912                 if ($this->contentBeforeTable)  {
00913                         $this->contentBeforeTable = $this->fw($this->contentBeforeTable);
00914                 }
00915 
00916                 $this->message($headCode,"Files in folder",$fileList);
00917 
00918                 echo $this->outputWrapper($this->printAll());
00919         }
00920 
00926         function phpinformation()       {
00927                 $headCode = "PHP information";
00928 
00929                 $sVar = t3lib_div::getIndpEnv("_ARRAY");
00930                 $sVar["CONST: PHP_OS"]=PHP_OS;
00931                 $sVar["CONST: TYPO3_OS"]=TYPO3_OS;
00932                 $sVar["CONST: PATH_thisScript"]=PATH_thisScript;
00933                 $sVar["CONST: php_sapi_name()"]=php_sapi_name();
00934                 $sVar["OTHER: TYPO3_VERSION"]=$GLOBALS["TYPO_VERSION"];
00935                 $sVar["OTHER: PHP_VERSION"]=phpversion();
00936                 $sVar["imagecreatefromgif()"]=function_exists("imagecreatefromgif");
00937                 $sVar["imagecreatefrompng()"]=function_exists("imagecreatefrompng");
00938                 $sVar["imagecreatefromjpeg()"]=function_exists("imagecreatefromjpeg");
00939                 $sVar["imagegif()"]=function_exists("imagegif");
00940                 $sVar["imagepng()"]=function_exists("imagepng");
00941                 $sVar["imagejpeg()"]=function_exists("imagejpeg");
00942                 $sVar["imagettftext()"]=function_exists("imagettftext");
00943                 $sVar["OTHER: IMAGE_TYPES"]=imagetypes();
00944                 $sVar["OTHER: memory_limit"]=ini_get("memory_limit");
00945 
00946                 $gE_keys = explode(",","SERVER_PORT,SERVER_SOFTWARE,GATEWAY_INTERFACE,SCRIPT_NAME,PATH_TRANSLATED");
00947                 while(list(,$k)=each($gE_keys)) {
00948                         $sVar["SERVER: ".$k]=$_SERVER[$k];
00949                 }
00950 
00951                 $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");
00952                 while(list(,$k)=each($gE_keys)) {
00953                         $sVar["T3CV_GFX: ".$k]=$GLOBALS["TYPO3_CONF_VARS"]["GFX"][$k];
00954                 }
00955 
00956                 $debugInfo=array();
00957                 $debugInfo[]="### DEBUG SYSTEM INFORMATION - START ###";
00958                 reset($sVar);
00959                 while(list($kkk,$vvv)=each($sVar))      {
00960                         $debugInfo[]=str_pad(substr($kkk,0,20),20).": ".$vvv;
00961                 }
00962                 $debugInfo[]="### DEBUG SYSTEM INFORMATION - END ###";
00963 
00964                 $buf=$this->messageFunc_nl2br;
00965                 $this->messageFunc_nl2br=0;
00966                 $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>
00967                 <form action=""><textarea rows="10" '.$this->formWidthText(80,"","off").' wrap="OFF">'.t3lib_div::formatForTextarea(implode(chr(10),$debugInfo)).'</textarea></form>');
00968                 $this->messageFunc_nl2br=$buf;
00969 
00970                 $getEnvArray = array();
00971                 $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");
00972                 while(list(,$k)=each($gE_keys)) {
00973                         $getEnvArray[$k] = getenv($k);
00974                 }
00975                 $this->message($headCode,"t3lib_div::getIndpEnv()",t3lib_div::view_array(t3lib_div::getIndpEnv("_ARRAY")));
00976                 $this->message($headCode,"getenv()",t3lib_div::view_array($getEnvArray));
00977                 $this->message($headCode,"_ENV",t3lib_div::view_array($_ENV));
00978                 $this->message($headCode,"_SERVER",t3lib_div::view_array($_SERVER));
00979                 $this->message($headCode,"_COOKIE",t3lib_div::view_array($_COOKIE));
00980                 $this->message($headCode,"_GET",t3lib_div::view_array($_GET));
00981 
00982                 ob_start();
00983                 phpinfo();
00984                 $contents = explode("<body>",ob_get_contents());
00985                 ob_end_clean();
00986                 $contents = explode("</body>",$contents[1]);
00987 
00988                 $this->message($headCode,"phpinfo()",$contents[0]);
00989 
00990 
00991 
00992 $this->headerStyle = '
00993 <style type="text/css"><!--
00994 a { text-decoration: none; }
00995 a:hover { text-decoration: underline; }
00996 h1 { font-family: verdana,arial, helvetica, sans-serif; font-size: 14pt; font-weight: bold;}
00997 h2 { font-family: verdana,arial, helvetica, sans-serif; font-size: 12pt; font-weight: bold;}
00998 body, td { font-family: verdana,arial, helvetica, sans-serif; font-size: 10pt; }
00999 th { font-family: verdana,arial, helvetica, sans-serif; font-size: 10pt; font-weight: bold; }
01000 //--></style>
01001 ';
01002 
01003                 echo $this->outputWrapper($this->printAll());
01004         }
01005 
01006 
01007 
01008 
01009 
01010 
01011 
01012 
01013 
01014 
01015 
01016 
01017 
01018         /*******************************
01019          *
01020          * typo3temp/ manager
01021          *
01022          *******************************/
01023 
01029         function typo3TempManager()     {
01030                 $headCode = "typo3temp/ directory";
01031                 $this->message($headCode,"What is it?","
01032                 TYPO3 uses this directory for temporary files, mainly processed and cached images.
01033                 The filenames are very cryptic; They are unique representations of the file properties made by md5-hashing a serialized array with information.
01034                 Anyway this directory may contain many thousand files and a lot of them may be of no use anymore.
01035 
01036                 With this test you can delete the files in this folder. When you do that, you should also clear the cache database tables afterwards.
01037                 ");
01038 
01039                 if (!$this->config_array["dir_typo3temp"])      {
01040                         $this->message("typo3temp/ directory","typo3temp/ not writable!","
01041                                 You must make typo3temp/ write enabled before you can proceed with this test.
01042                         ",2);
01043                         echo $this->outputWrapper($this->printAll());
01044                         return;
01045                 }
01046 
01047                         // Run through files
01048                 $fileCounter = 0;
01049                 $deleteCounter = 0;
01050                 $criteriaMatch = 0;
01051                 $tmap=array("day"=>1, "week"=>7, "month"=>30);
01052                 $tt = $this->INSTALL["typo3temp_delete"];
01053                 $subdir = $this->INSTALL["typo3temp_subdir"];
01054                 if (strlen($subdir) && !ereg('^[[:alnum:]_]+/$',$subdir))       die('subdir "'.$subdir.'" was not allowed!');
01055                 $action = $this->INSTALL["typo3temp_action"];
01056                 $d = @dir($this->typo3temp_path.$subdir);
01057                 if (is_object($d))      {
01058                         while($entry=$d->read()) {
01059                                 $theFile = $this->typo3temp_path.$subdir.$entry;
01060                                 if (@is_file($theFile)) {
01061                                         $ok = 0;
01062                                         $fileCounter++;
01063                                         if ($tt)        {
01064                                                 if (t3lib_div::testInt($tt))    {
01065                                                         if (filesize($theFile) > $tt*1024)      $ok=1;
01066                                                 } else {
01067                                                         if (fileatime($theFile) < time()-(intval($tmap[$tt])*60*60*24)) $ok=1;
01068                                                 }
01069                                         } else {
01070                                                 $ok = 1;
01071                                         }
01072                                         if ($ok)        {
01073                                                 $hashPart=substr(basename($theFile),-14,10);
01074                                                 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
01075                                                         if ($action && $deleteCounter<$action)  {
01076                                                                 $deleteCounter++;
01077                                                                 unlink($theFile);
01078                                                         } else {
01079                                                                 $criteriaMatch++;
01080                                                         }
01081                                                 }
01082                                         }
01083                                 }
01084                         }
01085                         $d->close();
01086                 }
01087 
01088                         // Find sub-dirs:
01089                 $subdirRegistry = array(''=>'');
01090                 $d = @dir($this->typo3temp_path);
01091                 if (is_object($d))      {
01092                         while($entry=$d->read()) {
01093                                 $theFile = $entry;
01094                                 if (@is_dir($this->typo3temp_path.$theFile) && $theFile!='..' && $theFile!='.') {
01095                                         $subdirRegistry[$theFile.'/'] = $theFile.'/ (Files: '.count(t3lib_div::getFilesInDir($this->typo3temp_path.$theFile)).')';
01096                                 }
01097                         }
01098                 }
01099 
01100                 $deleteType=array(
01101                         "0" => "All",
01102                         "day" => "Last access more than a day ago",
01103                         "week" => "Last access more than a week ago",
01104                         "month" => "Last access more than a month ago",
01105                         "10" => "Filesize greater than 10 kb",
01106                         "50" => "Filesize greater than 50 kb",
01107                         "100" => "Filesize greater than 100 kb"
01108                 );
01109 
01110                 $actionType=array(
01111                         "0" => "Don't delete, just display statistics",
01112                         "100" => "Delete 100",
01113                         "500" => "Delete 500",
01114                         "1000" => "Delete 1000"
01115                 );
01116 
01117                 $content='<select name="TYPO3_INSTALL[typo3temp_delete]">'.$this->getSelectorOptions($deleteType,$tt).'</select>
01118                 <br>
01119 Number of files at a time:
01120                 <select name="TYPO3_INSTALL[typo3temp_action]">'.$this->getSelectorOptions($actionType).'</select>
01121 
01122 From sub-directory:
01123                 <select name="TYPO3_INSTALL[typo3temp_subdir]">'.$this->getSelectorOptions($subdirRegistry, $this->INSTALL["typo3temp_subdir"]).'</select>
01124                 ';
01125 
01126                 $form = '<form action="'.$this->action.'" method="POST">'.$content.'
01127 
01128                 <input type="submit" value="Execute">
01129                 </form>
01130                 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.';
01131 
01132                 $this->message($headCode,"Statistics","
01133                 Number of temporary files: <strong>".($fileCounter-$deleteCounter)."</strong>
01134                 Number matching '".htmlspecialchars($deleteType[$tt])."': <strong>".$criteriaMatch."</strong>
01135                 Number deleted: <strong>".$deleteCounter."</strong>
01136                 <BR>
01137                 ".$form,1);
01138 
01139                 echo $this->outputWrapper($this->printAll());
01140         }
01141 
01149         function getSelectorOptions($deleteType,$tt="") {
01150                 $out="";
01151                 if (is_array($deleteType))      {
01152                         reset($deleteType);
01153                         while(list($v,$l)=each($deleteType))    {
01154                                 $out.='<option value="'.htmlspecialchars($v).'"'.(!strcmp($v,$tt)?" selected":"").'>'.htmlspecialchars($l).'</option>';
01155                         }
01156                 }
01157                 return $out;
01158         }
01159 
01160 
01161 
01162 
01163 
01164 
01165 
01166 
01167 
01168         /*******************************
01169          *
01170          * cleanup manager
01171          *
01172          *******************************/
01173 
01181         function cleanupManager()       {
01182                 $headCode = "Clean up database";
01183                 $this->message($headCode,"What is it?","
01184                 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.
01185 
01186                 <strong>Clear cached image sizes</strong>
01187                 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.
01188 
01189                 You should <em>Clear All Cache</em> in the backend after clearing this cache.
01190                 ");
01191 
01192                 $tables = $this->getListOfTables();
01193                 $action = $this->INSTALL['cleanup_type'];
01194 
01195                 if (($action == 'cache_imagesizes' || $action == 'all') && isset ($tables['cache_imagesizes'])) {
01196                         $GLOBALS['TYPO3_DB']->exec_DELETEquery ('cache_imagesizes','1');
01197                 }
01198 
01199                 $cleanupType = array (
01200                         "all" => "Clean up everything",
01201                 );
01202 
01203                         // Get cache_imagesizes info
01204                 if (isset ($tables['cache_imagesizes'])) {
01205                         $cleanupType["cache_imagesizes"] = "Clear cached image sizes only";
01206                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'cache_imagesizes', '');
01207                         $resArr = $GLOBALS['TYPO3_DB']->sql_fetch_assoc ($res);
01208                         $cachedImageSizesCounter = intval ($resArr['count(*)']);
01209                 } else {
01210                         $this->message($headCode,"Table cache_imagesizes does not exist!","
01211                                 The table cache_imagesizes was not found. Please check your database settings in Basic Configuration and compare your table definition with the Database Analyzer.
01212                         ",2);
01213                         $cachedImageSizesCounter = 'unknown';
01214                 }
01215 
01216                 $content = '<select name="TYPO3_INSTALL[cleanup_type]">'.$this->getSelectorOptions($cleanupType,$tt).'</select> ';
01217                 $form = '<form action="'.$this->action.'" method="POST">'.$content.'<input type="submit" value="Execute"></form>';
01218                 $this->message($headCode,"Statistics","
01219                         Number cached image sizes: <strong>".$cachedImageSizesCounter."</strong><br>
01220                 ".$form,1);
01221 
01222                 echo $this->outputWrapper($this->printAll());
01223         }
01224 
01225 
01226 
01227 
01228 
01229 
01230 
01231 
01232 
01233 
01234 
01235 
01236 
01237         /*******************************
01238          *
01239          * CONFIGURATION FORM
01240          *
01241          ********************************/
01242 
01249         function generateConfigForm($type="")   {
01250                 switch($type)   {
01251                         case "get_form":
01252                                 $default_config_content = t3lib_div::getUrl(PATH_t3lib."config_default.php");
01253                                 $commentArr = $this->getDefaultConfigArrayComments($default_config_content);
01254 /*
01255                                 $localconf_content = t3lib_div::getUrl(PATH_typo3conf."localconf.php");
01256                                 $commentArr2 = $this->getConfigArrayComments($localconf_content);
01257                                 debug($commentArr2);
01258 */
01259                                 reset($GLOBALS["TYPO3_CONF_VARS"]);
01260                                 $this->messageFunc_nl2br=0;
01261                                 while(list($k,$va)=each($GLOBALS["TYPO3_CONF_VARS"]))   {
01262                                         $ext="[".$k."]";
01263                                         $this->message($ext, '$TYPO3_CONF_VARS["'.$k.'"]',$commentArr[0][$k],1);
01264                                         while(list($vk,$value)=each($va))       {
01265                                                 if (!is_array($value) && $this->checkForBadString($value))      {
01266                                                         $k2="[".$vk."]";
01267                                                         $description = trim($commentArr[1][$k][$vk]);
01268                                                         $msg=$description."<BR><BR><em>".$ext.$k2." = ".htmlspecialchars(t3lib_div::fixed_lgd($value,60))."</em><BR>";
01269 
01270                                                         if (strstr($value,chr(10)))     {
01271                                                                                 // Never used at this point:
01272                                                                 $form='<textarea name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" cols=40 rows=5 wrap="off">'.htmlspecialchars($value).'</textarea>';
01273                                                         } elseif (eregi("^boolean",$description)) {
01274                                                                 $form='<input type="hidden" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" value="0">';
01275                                                                 $form.='<input type="checkbox" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']"'.($value?" checked":"").' value="'.($value&&strcmp($value,"0")?htmlspecialchars($value):1).'">';
01276                                                         } else {
01277                                                                 $form='<input type="text" size=40 name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" value="'.htmlspecialchars($value).'">';
01278                                                         }
01279                                                         $this->message($ext, $k2,$msg.$form);
01280                                                 }
01281                                         }
01282                                 }
01283                         break;
01284                         default:
01285                                 if (is_array($this->INSTALL["extConfig"]))              {
01286                                         reset($this->INSTALL["extConfig"]);
01287                                         $lines = $this->writeToLocalconf_control();
01288                                         while(list($k,$va)=each($this->INSTALL["extConfig"]))   {
01289                                                 if (is_array($GLOBALS["TYPO3_CONF_VARS"][$k]))  {
01290                                                         while(list($vk,$value)=each($va))       {
01291                                                                 if (isset($GLOBALS["TYPO3_CONF_VARS"][$k][$vk]))        {
01292                                                                         $doit=1;
01293                                                                         if ($k=="BE" && $vk=="installToolPassword")     {
01294                                                                                 if ($value)     {
01295                                                                                         if (isset($_POST["installToolPassword_check"]) && (!t3lib_div::_GP("installToolPassword_check") || strcmp(t3lib_div::_GP("installToolPassword_check"),$value))) {
01296                                                                                                 $doit=0;
01297                                                                                                 debug("ERROR: The two passwords did not match! The password was not changed.");
01298                                                                                         }
01299                                                                                         if (t3lib_div::_GP("installToolPassword_md5"))  $value =md5($value);
01300                                                                                 } else $doit=0;
01301                                                                         }
01302                                                                         if ($doit && strcmp($GLOBALS["TYPO3_CONF_VARS"][$k][$vk],$value))       $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["'.$k.'"]["'.$vk.'"]', $value);
01303                                                                 }
01304                                                         }
01305                                                 }
01306                                         }
01307                                         $this->writeToLocalconf_control($lines);
01308                                 }
01309                         break;
01310                 }
01311         }
01312 
01321         function getDefaultConfigArrayComments($string,$mainArray=array(),$commentArray=array())        {
01322                 $lines = explode(chr(10),$string);
01323                 $in=0;
01324                 $mainKey="";
01325                 while(list(,$lc)=each($lines))  {
01326                         $lc = trim($lc);
01327                         if ($in) {
01328                                 if (!strcmp($lc,");"))  {
01329                                         $in=0;
01330                                 } else {
01331                                         if (eregi('["\']([[:alnum:]_-]*)["\'][[:space:]]*=>(.*)',$lc,$reg))     {
01332                                                 list(,$theComment)=explode("//",$reg[2],2);
01333                                                 if (substr(strtolower(trim($reg[2])),0,5)=="array" && !strcmp($reg[1],strtoupper($reg[1])))     {
01334                                                         $mainKey=trim($reg[1]);
01335                                                         $mainArray[$mainKey]=trim($theComment);
01336                                                 } elseif ($mainKey) {
01337                                                         $commentArray[$mainKey][$reg[1]]=trim($theComment);
01338                                                 }
01339                                         } else {
01340                                                 //debug($lc,1);
01341                                         }
01342                                 }
01343                         }
01344                         if (!strcmp($lc,'$TYPO3_CONF_VARS = Array('))   {
01345                                 $in=1;
01346                         }
01347                 }
01348                 return array($mainArray,$commentArray);
01349         }
01350 
01351 
01352 
01353 
01354 
01355 
01356 
01357 
01358 
01359 
01360 
01361 
01362 
01363         /*******************************
01364          *
01365          * CHECK CONFIGURATION FUNCTIONS
01366          *
01367          *******************************/
01368 
01374         function checkConfiguration()   {
01375                 $ext="php.ini configuration checked";
01376                 $this->message($ext);
01377 
01378                         // *****************
01379                         // Incoming values:
01380                         // *****************
01381 /*
01382                 if (!ini_get("track_vars"))     {
01383                         $this->message($ext, "Tracking Vars not set","
01384                                 <i>track_vars=".ini_get("track_vars")."</i>
01385                                 Tracking vars are essential for almost any PHP-application.
01386                                 The fact that the value is not set may not impose a problem, because it's always set in version 4.03+ of PHP.
01387                         ",1);
01388                 } else $this->message($ext, "Tracking Vars enabled","",-1);
01389 */
01390 /*
01391                 if (!ini_get("allow_url_fopen"))        {
01392                         $this->message($ext, "fopen() not allowed to open URL's","
01393                                 <i>allow_url_fopen=".ini_get("allow_url_fopen")."</i>
01394                                 allow_url_fopen should be enabled if you want TYPO3 to connect to the online TYPO3 Extension Repository.
01395                         ",2);
01396                 } else $this->message($ext, "fopen() allowed to open URL's","",-1);
01397 */
01398 
01399                         // Includepath
01400                 $incPaths = t3lib_div::trimExplode(TYPO3_OS=="WIN"?";":":", ini_get("include_path"));
01401                 if (!in_array(".",$incPaths))   {
01402                         $this->message($ext, "Current dir (./) is not in include path!","
01403                                 <i>include_path=".ini_get("include_path")."</i>
01404                                 Normally the current path, '.', is included in the include_path of PHP. Although TYPO3 is made to work around this it is an unusual setting that may introduce problems.
01405                         ",1);
01406                 } else $this->message($ext, "Current dir in include path","",-1);
01407 
01408 /*
01409                 if (!ini_get("register_globals"))       {
01410                         $this->message($ext, "Register globals disabled","
01411                                 <i>register_globals=".ini_get("register_globals")."</i>
01412                                 Incoming values by GET or POST method are not registered as globals. TYPO3 is designed to cope with that - actually we encourage that setting - but you should be aware if your included PHP-scripts (or TypoScript configurations) are compatible with this setting.
01413                                 You should always use the function t3lib_div::_GP(\"<i>[the_var_name_from_GET_or_POST]</i>\") to retrieve values passed to your script from outside.
01414                         ",1);
01415                 } else $this->message($ext, "Register globals enabled","You should always use the function t3lib_div::_GP(\"<i>[the_var_name_from_GET_or_POST]</i>\") to retrieve values passed to your script from outside.",1);
01416                 if (!ini_get("magic_quotes_gpc"))       {
01417                         $this->message($ext, "magic_quotes_gpc","
01418                                 <i>magic_quotes_gpc=".ini_get("magic_quotes_gpc")."</i>
01419                                 Incoming \" and ' chars in values by GET or POST method are currently <i>not</i> escaped. TYPO3 is designed to cope with that but it may be on the expense of a minor performance loss, because all incoming values are addslashes()'ed.
01420                         ",1);
01421                 } else $this->message($ext, "magic_quotes_gpc","<i>magic_quotes_gpc=".ini_get("magic_quotes_gpc")."</i>",-1);
01422                 if (ini_get("magic_quotes_runtime"))    {
01423                         $this->message($ext, "Magic Quotes Runtime is enabled","
01424                                 <i>magic_quotes_runtime=".ini_get("magic_quotes_runtime")."</i>
01425                                 TYPO3 is depending on this option NOT being enabled!
01426                         ",3);
01427                 } else $this->message($ext, "magic_quotes_runtime","<i>magic_quotes_runtime=".ini_get("magic_quotes_runtime")."</i>",-1);
01428                 if (ini_get("gpc_order")!="GPC")        {
01429                         $this->message($ext, "GPC order non-standard","
01430                                 <i>gpc_order=".ini_get("gpc_order")."</i>
01431                                 The order of GET, POST and COOKIE vars are non-standard. The value should be \"GPC\".
01432                         ",2);
01433                 } else $this->message($ext, "GPC order","",-1);
01434 */
01435                         // *****************
01436                         // File uploads
01437                         // *****************
01438                 if (!ini_get("file_uploads"))   {
01439                         $this->message($ext, "File uploads not allowed","
01440                                 <i>file_uploads=".ini_get("file_uploads")."</i>
01441                                 TYPO3 uses the ability to upload files from the browser in various cases.
01442                                 As long as this flag is disabled, you'll not be able to upload files.
01443                                 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!
01444                                 However if you cannot enable fileupload for some reason alternatively you change the default form encoding value with \$TYPO3_CONF_VARS[SYS][form_enctype].
01445                         ",3);
01446                 } else $this->message($ext, "File uploads allowed","",-1);
01447                 $upload_max_filesize = $this->convertByteSize(ini_get("upload_max_filesize"));
01448                 if ($upload_max_filesize<10000*1024)    {
01449                         $this->message($ext, "Max Upload filesize too small?","
01450                                 <i>upload_max_filesize=".ini_get("upload_max_filesize")."</i>
01451                                 By default TYPO3 supports uploading, copying and moving files of sizes up to 10000 kb (10 MB) (You can alter the TYPO3 defaults by the config option TYPO3_CONF_VARS[BE][maxFileSize]).
01452                                 Your current value is below this, so at this point, PHP sets the limits for uploaded filesizes and not TYPO3.
01453                                 <strong>Notice:</strong> The limits for filesizes attached to database records are set in the tables.php configuration file (\$TCA) for each group/file field.
01454                         ",1);
01455                 }
01456 
01457                         // *****************
01458                         // Memory and functions
01459                         // *****************
01460                 $memory_limit_value = $this->convertByteSize(ini_get("memory_limit"));
01461                 if ($memory_limit_value&&$memory_limit_value<16*1024*1024)      {
01462                         $this->message($ext, "Memory Limit below 16 MB","
01463                                 <i>memory_limit=".ini_get("memory_limit")."</i>
01464                                 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.
01465                         ",3);
01466                 } elseif(!$memory_limit_value) {
01467                         $this->message($ext, "Memory Limit","<i>No Memory Limit in effect.</i>",-1);
01468                 } else $this->message($ext, "Memory Limit","<i>memory_limit=".ini_get("memory_limit")."</i>",-1);
01469                 if (ini_get("max_execution_time")<30)   {
01470                         $this->message($ext, "Max Execution Time below default 30 seconds","
01471                                 <i>max_execution_time=".ini_get("max_execution_time")."</i>
01472                                 May impose problems if too low.
01473                         ",1);
01474                 } else $this->message($ext, "Max Execution Time","<i>max_execution_time=".ini_get("max_execution_time")."</i>",-1);
01475                 if (ini_get("disable_functions"))       {
01476                         $this->message($ext, "Functions disabled!","
01477                                 <i>disable_functions=".ini_get("disable_functions")."</i>
01478                                 The above list of functions are disabled. If TYPO3 use any of these there might be trouble.
01479                                 TYPO3 is designed to use the default set of PHP4.0.6+ functions plus the functions from GDLib.
01480                                 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.
01481                         ",2);
01482                 } else $this->message($ext, "Functions disabled: none","",-1);
01483                 if (!ini_get("sendmail_path"))  {
01484                         $this->message($ext, "Sendmail path not defined!","
01485                                 <i>sendmail_path=".ini_get("sendmail_path")."</i>
01486                                 This may be critical to TYPO3's use of the mail() function. Please be sure that the mail() function in your php-installation works!
01487                         ".$this->check_mail("get_form"),1);
01488                 } else {
01489                         list($prg) = explode(" ",ini_get("sendmail_path"));
01490                         if (TYPO3_OS=='WIN')    {
01491                                 $this->message($ext, "Sendmail program not searched for on Windows","",1);
01492                         } else {
01493                                 if (!@is_executable($prg))      {
01494                                         $this->message($ext, "Sendmail program not found or not executable?","
01495                                                 <i>sendmail_path=".ini_get("sendmail_path")."</i>
01496                                                 This may be critical to TYPO3's use of the mail() function. Please be sure that the mail() function in your php-installation works!
01497                                         ".$this->check_mail("get_form"),1);
01498                                 } else {
01499                                         $this->message($ext, "Sendmail OK","
01500                                                 <i>sendmail_path=".ini_get("sendmail_path")."</i>
01501                                                 You may check the mail() function by entering your emailaddress here:
01502                                         ".$this->check_mail("get_form"),-1);
01503                                 }
01504                         }
01505                 }
01506 
01507                         // *****************
01508                         // Safe mode related
01509                         // *****************
01510                 if (ini_get("safe_mode"))       {
01511                         $this->message($ext, "Safe mode turned on","
01512                                 <i>safe_mode=".ini_get("safe_mode")."</i>
01513                                 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.
01514                                 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/\".
01515                                 If you use safe_mode with TYPO3, you should disable use of external programs ([BE][disable_exec_function]=1).
01516                                 In safe mode you must ensure that all the php-scripts and upload folders are owned by the same user.
01517 
01518                                         <i>safe_mode_exec_dir=".ini_get("safe_mode_exec_dir")."</i>
01519                                         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)
01520 
01521 
01522                                         <strong>Example of safe_mode settings:</strong>
01523                                         Set this in the php.ini file:
01524 
01525                                         ; Safe Mode
01526                                         safe_mode               =       On
01527                                         safe_mode_exec_dir      = /usr/bin/
01528 
01529                                         ...and the ImageMagick '/usr/bin/convert' will be executable.
01530                                         The last slash is important (..../) and you can only specify one directory.
01531 
01532                                         <strong>Notice: </strong>
01533                                         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.
01534                                         Paths to ImageMagick are defined in localconf.php and may be something else than /usr/bin/, but this is default for ImageMagick 5+
01535 
01536 
01537                         ",2);
01538                         if (ini_get("doc_root"))        {
01539                                 $this->message($ext, "doc_root set","
01540                                         <i>doc_root=".ini_get("doc_root")."</i>
01541                                         PHP cannot execute scripts outside this directory. If that is a problem is please correct it.
01542                                 ",1);
01543                         }
01544                         $this->config_array["safemode"]=1;
01545                 } else $this->message($ext, "safe_mode: off","",-1);
01546                 if (ini_get("sql.safe_mode"))   {
01547                         $this->message($ext, "sql.safe_mode is enabled","
01548                                 <i>sql.safe_mode=".ini_get("sql.safe_mode")."</i>
01549                                 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")."
01550                                 The owner of the current file is: <strong>".get_current_user ()."</strong>
01551                         ",1);
01552                         $this->config_array["sql.safe_mode_user"] = get_current_user();
01553                 } else $this->message($ext, "sql.safe_mode: off","",-1);
01554                 if (ini_get("open_basedir"))    {
01555                         $this->message($ext, "open_basedir set","
01556                                 <i>open_basedir=".ini_get("open_basedir")."</i>
01557                                 This restricts TYPO3 to open and include files only in this path. Please make sure that this does not prevent TYPO3 from running.
01558                                 <strong>Notice (UNIX):</strong> Before checking a path according to open_basedir, PHP resolves all symbolic links.
01559                         ",1);
01560 //      ????                    If this option was set falsely you probably didn't see this page in the first place, but this option <B>may spoil this configuration test</B> when checking for such as ImageMagick executables.
01561                 } else $this->message($ext, "open_basedir: off","",-1);
01562 
01563         }
01564 
01571         function check_mail($cmd="")    {
01572                 switch($cmd)    {
01573                         case "get_form":
01574                                 $out='
01575                                 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.
01576                                 <form action="'.$this->action.'" method="POST"><input type="text" name="TYPO3_INSTALL[check_mail]">
01577                                         <input type="submit" value="Send test mail"></form>';
01578                         break;
01579                         default:
01580                                 if (trim($this->INSTALL["check_mail"])) {
01581                                         mail(trim($this->INSTALL["check_mail"]), "TEST SUBJECT", "TEST CONTENT", "From: test@test.test");
01582                                         $this->messages[]= "MAIL WAS SENT TO: ".$this->INSTALL["check_mail"];
01583                                 }
01584                         break;
01585                 }
01586                 return $out;
01587         }
01588 
01594         function checkExtensions()      {
01595                 $ext = "GDLib";
01596                 $this->message($ext);
01597 
01598                 $software_info=1;
01599                 if (extension_loaded("gd") && $this->isGD())    {
01600                         $this->config_array["gd"]=1;
01601                         $this->message($ext, "GDLib found","",-1);
01602                         if ($this->isPNG()) {
01603                                 $this->config_array["gd_png"]=1;
01604                                 $this->message($ext, "PNG supported","",-1);
01605                         }
01606                         if ($this->isGIF()) {
01607                                 $this->config_array["gd_gif"]=1;
01608                                 $this->message($ext, "GIF supported","",-1);
01609                         }
01610                         if ($this->isJPG()) {
01611                                 $this->config_array["gd_jpg"]=1;
01612                                 $this->message($ext, "JPG supported (not used by TYPO3)","");
01613                         }
01614                         if (!$this->config_array["gd_gif"] && !$this->config_array["gd_png"])   {
01615                                 $this->message($ext, "PNG or GIF not supported", nl2br(trim("
01616                                         Your GDLib supports either GIF nor PNG. It must support either one of them.
01617                                 ")), 2);
01618                         } else {
01619                                 $msg=array();
01620                                 if ($this->config_array["gd_gif"] && $this->config_array["gd_png"])             {
01621                                         $msg[0]="You can choose between generating GIF or PNG files, as your GDLib supports both.";
01622                                 }
01623                                 if ($this->config_array["gd_gif"])              {
01624                                         $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!
01625                                         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.";
01626                                 }
01627                                 if ($this->config_array["gd_png"])              {
01628                                         $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.";
01629                                 }
01630                                 $this->message($ext, "GIF / PNG issues", nl2br(trim(implode($msg,chr(10)))), 1);
01631                         }
01632                         if (!$this->isTTF())    {
01633                                 $this->message($ext, "FreeType is apparently not installed", "
01634                                         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'.
01635                                 ", 2);
01636                         } else {
01637                                 $this->message($ext, "FreeType Quick-test (".($this->isGIF()?"as GIF":"as PNG").")", '<img src="'.t3lib_div::getIndpEnv("REQUEST_URI").'&testingTrueTypeSupport=1"><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);
01638                                 $this->config_array["freetype"]=1;
01639                         }
01640                 } else {
01641                         $this->message($ext, "GDLib not found", "
01642                                 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.
01643                                 GDLib is also used in the TYPO3 Backend (TBE) to generate record icons and new module tabs.
01644                                 It's highly recommended to install this library. Remember to compile GD with FreeType which is also required.
01645                                 If you choose not to install GDLib, you can disable it in the configuration with [GFX][gdlib]=0;.
01646                         ", 2);
01647                 }
01648                 $this->message($ext, "GDLib software information", nl2br(trim($this->getGDSoftwareInfo())));
01649         }
01650 
01656         function checkDirs()    {
01657                 // Check typo3/temp/
01658                 $ext="Directories";
01659                 $this->message($ext);
01660 
01661                 $uniqueName = md5(uniqid(microtime()));
01662 
01663                         // The requirement level (the integer value, ie. the second value of the value array) has the following meanings:
01664                         // -1 = not required, but if it exists may be writable or not
01665                         //  0 = not required, if it exists the dir should be writable
01666                         //  1 = required, don't has to be writable
01667                         //  2 = required, has to be writable
01668 
01669                 $checkWrite=array(
01670                         "typo3temp/" => array("The folder is used by both the frontend (FE) and backend interface (TBE) for image manipulated files.",2,"dir_typo3temp"),
01671 #                       TYPO3_mainDir."temp/" => array("The folder is used by the backend interface only (TBE) for icons, pane tabs and click-menu items. The directory is usually not empty in the distribution, but you should be able to clear it out and TYPO3 should generate new files automatically.",1,"dir_temp"),
01672                         "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),
01673                         "typo3conf/ext/" => array("Location for local extensions. Must be writable if the Extension Manager is supposed to install extensions for this website.",0),
01674                         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),
01675                         "uploads/" => array("Location for uploaded files from RTE + in the subdirs for tables.",2),
01676                         "uploads/pics/" => array("Typical location for uploaded files (images especially).",0),
01677                         "uploads/media/" => array("Typical location for uploaded files (non-images especially).",0),
01678                         "uploads/tf/" => array("Typical location for uploaded files (TS template resources).",0),
01679                         "fileadmin/" => array("Location for local files such as templates, independent uploads etc.",-1),
01680                         "fileadmin/_temp_/" => array("Typical temporary location for default upload of files by administrators.",0),
01681                 );
01682 
01683                 reset($checkWrite);
01684                 while(list($relpath,$descr)=each($checkWrite))  {
01685                         // Check typo3temp/
01686                         $general_message = $descr[0];
01687                         if (!@is_dir(PATH_site.$relpath))       {
01688                                 if ($descr[1])  {       // required...
01689                                         $this->message($ext, $relpath." directory does not exist","
01690                                         <em>Full path: ".PATH_site.$relpath."</em>
01691                                         ".$general_message."
01692 
01693                                         This error should not occur as ".$relpath." must always be accessible in the root of a TYPO3 website.
01694                                         ",3);
01695                                 } else {
01696                                         if ($descr[1] == 0) {
01697                                                 $msg = 'This directory does not necessarily have to exist but if it does it must be writable.';
01698                                         } else {
01699                                                 $msg = 'This directory does not necessarily have to exist and if it does it can be writable or not.';
01700                                         }
01701                                         $this->message($ext, $relpath." directory does not exist","
01702                                         <em>Full path: ".PATH_site.$relpath."</em>
01703                                         ".$general_message."
01704 
01705                                         ".$msg."
01706                                         ",2);
01707                                 }
01708                         } else {
01709                                 $file = PATH_site.$relpath.$uniqueName;
01710                                 @touch($file);
01711                                 if (@is_file($file))    {
01712                                         unlink($file);
01713                                         if ($descr[2])  { $this->config_array[$descr[2]]=1; }
01714                                         $this->message($ext, $relpath." writable","",-1);
01715                                 } else {
01716                                         $severity = ($descr[1]==2 || $descr[1]==0) ? 3 : 2;
01717                                         if ($descr[1] == 0 || $descr[1] == 2) {
01718                                                 $msg = "The directory ".$relpath." must be writable!";
01719                                         } elseif ($descr[1] == -1 || $descr[1] == 1) {
01720                                                 $msg = "The directory ".$relpath." does not neccesarily have to be writable.";
01721                                         }
01722                                         $this->message($ext, $relpath." directory not writable","
01723                                         <em>Full path: ".$file."</em>
01724                                         ".$general_message."
01725 
01726                                         Tried to write this file (with touch()) but didn't succeed.
01727                                         ".$msg."
01728                                         ",$severity);
01729                                 }
01730                         }
01731                 }
01732         }
01733 
01742         function checkImageMagick($paths)       {
01743                 $ext="Check Image Magick";
01744                 $this->message($ext);
01745 
01746                 $paths = array_unique($paths);
01747 
01748                 $programs = explode(",","convert,combine,composite,identify");  // Added composite (substitution for combine in newer versions?)
01749                 $isExt = TYPO3_OS=="WIN" ? ".exe" : "";
01750                 $this->config_array["im_combine_filename"]="combine";
01751                 reset($paths);
01752                 while(list($k,$v)=each($paths)) {
01753                         reset($programs);
01754                         if (!ereg('[\\\/]$',$v)) $v.='/';
01755                         while(list(,$filename)=each($programs)) {
01756                                 if (ini_get("open_basedir")||(@file_exists($v)&& @is_file($v.$filename.$isExt))) {
01757                                         if($this->_checkImageMagick_getVersion($v.$filename.$isExt) > 0 ) {
01758                                                 $index[$v][$filename]=$this->_checkImageMagick_getVersion($v.$filename.$isExt);
01759                                         }
01760                                 }
01761                         }
01762                         if (count($index[$v])>=3)       {$this->config_array["im"]=1;}
01763 
01764                         if ($index[$v]["composite"] && !$index[$v]["combine"])  {
01765                                 $this->config_array["im_combine_filename"]="composite";
01766                         } elseif (!$index[$v]["composite"] && $index[$v]["combine"]) {
01767                                 $this->config_array["im_combine_filename"]="combine";
01768                         }
01769 
01770                         if (isset($index[$v]["convert"]) && $this->checkIMlzw)  {
01771                                 $index[$v]["gif_capability"] = "".$this->_checkImageMagickGifCapability($v);
01772                         }
01773                 }
01774                 $this->config_array["im_versions"]=$index;
01775                 if (!$this->config_array["im"]) {
01776                         $this->message($ext, "No ImageMagick install available","
01777                         It seems that there is no adequate ImageMagick installation available at the checked locations (".implode($paths, ", ").")
01778                         An 'adequate' installation for requires 'convert', 'combine'/'composite' and 'identify' to be available
01779                         ",2);
01780                 } else {
01781                         $theCode="";
01782                         reset($this->config_array["im_versions"]);
01783                         while(list($p,$v)=each($this->config_array["im_versions"]))     {
01784                                 $ka=array();
01785                                 reset($v);
01786                                 while(list($ka[])=each($v)){}
01787                                 $theCode.='<tr><td>'.$this->fw($p).'</td><td>'.$this->fw(implode($ka,"<BR>")).'</td><td>'.$this->fw(implode($v,"<BR>")).'</td></tr>';
01788                         }
01789                         $this->message($ext, "Available ImageMagick installations:",'<table border=1 cellpadding=2 cellspacing=2>'.$theCode.'</table>',-1);
01790                 }
01791                 $this->message($ext, "Search for ImageMagick:",'
01792                         <form action="'.$this->action.'" method="POST">'.$content.'<input type="checkbox" name="TYPO3_INSTALL[checkIM][lzw]" value="1"'.($this->INSTALL["checkIM"]["lzw"]?" checked":"").'> Check LZW capabilities.
01793 
01794                                 Check this path for ImageMagick installation:
01795                                 <input type="text" name="TYPO3_INSTALL[checkIM][path]" value="'.htmlspecialchars($this->INSTALL["checkIM"]["path"]).'">
01796                                 (Eg. "D:\wwwroot\im537\ImageMagick\" for windows or "/usr/bin/" for Unix)<br>
01797 
01798                                 <input type="submit" value="Send">
01799                         </form>
01800                 ',0);
01801 
01802         }
01803 
01810         function _checkImageMagickGifCapability($file)  {
01811                 if ($this->config_array["dir_typo3temp"])       {               //  && !$this->config_array["safemode"]
01812                         $path = $this->typo3temp_path;
01813                         $uniqueName = md5(uniqid(microtime()));
01814                         $dest = $path.$uniqueName.".gif";
01815                         $src = PATH_t3lib."gfx/typo3logo.gif";
01816                         if (@is_file($src) && !strstr($src," ") && !strstr($dest," "))  {
01817                                 $cmd = $file.'convert '.$src.' '.$dest;
01818                                 exec($cmd);
01819                         } else die("No t3lib/gfx/typo3logo.gif file!");
01820                         $out="";
01821                         if (@is_file($dest))    {
01822                                 $new_info = @getimagesize($dest);
01823                                 clearstatcache();
01824                                 $new_size = filesize($dest);
01825                                 $src_info = @getimagesize($src);
01826                                 clearstatcache();
01827                                 $src_size = @filesize($src);
01828 
01829                                 if ($new_info[0]!=$src_info[0] || $new_info[1]!=$src_info[1] || !$new_size || !$src_size)       {
01830                                         $out="error";
01831                                 } else {
01832                                         if ($new_size/$src_size > 4) {  // NONE-LZW ratio was 5.5 in test
01833                                                 $out="NONE";
01834                                         } elseif ($new_size/$src_size > 1.5) {  // NONE-RLE ratio was not tested
01835                                                 $out="RLE";
01836                                         } else {
01837                                                 $out="LZW";
01838                                         }
01839                                 }
01840                                 unlink($dest);
01841                         }
01842                         return $out;
01843                 }
01844         }
01845 
01852         function _checkImageMagick_getVersion($file)    {
01853                 exec($file, $retVal);
01854                 $string = $retVal[0];
01855                 list(,$ver) = explode("ImageMagick", $string);
01856                 list($ver) = explode(" ",trim($ver));
01857                 return trim($ver);
01858         }
01859 
01865         function checkDatabase()                {
01866                 $ext="Check database";
01867                 $this->message($ext);
01868 
01869                 if (!extension_loaded("mysql")) {
01870                         $this->message($ext, "MySQL not available","
01871                                 PHP does not feature MySQL support (which is pretty unusual).
01872                         ",2);
01873                 } else {
01874                         $cInfo="
01875                                 Username: <strong>".TYPO3_db_username."</strong>
01876                                 Password: <strong>".TYPO3_db_password."</strong>
01877                                 Host: <strong>".TYPO3_db_host."</strong>
01878                         ";
01879                         if (!TYPO3_db_host || !TYPO3_db_username)       {
01880                                 $this->message($ext, "Username, password or host not set","
01881                                         You may need to enter data for these values:
01882                                         ".trim($cInfo)."
01883 
01884                                         Use the form below.
01885                                 ",2);
01886                         }
01887                         if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
01888                                 $this->message($ext, "Connected to SQL database successfully","
01889                                 ".trim($cInfo)."
01890                                 ",-1,1);
01891                                 $this->config_array["mysqlConnect"]=1;
01892                                 if (!TYPO3_db)  {
01893                                         $this->message($ext, "No database selected","
01894                                                 Currently you have no database selected.
01895                                                 Please select one or create a new database.
01896                                         ",3);
01897                                         $this->config_array["no_database"]=1;
01898                                 } elseif (!$GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db))  {
01899                                         $this->message($ext, "Database","
01900                                                 '".TYPO3_db."' could not be selected as database!
01901                                                 Please select another one or create a new database.
01902                                         ",3,1);
01903                                         $this->config_array["no_database"]=1;
01904                                 } else  {
01905                                         $this->message($ext, "Database","
01906                                                 <strong>".TYPO3_db."</strong> is selected as database.
01907                                         ",1,1);
01908                                 }
01909                         } else {
01910                                 $this->message($ext, "Could not connect to SQL database!","
01911                                 Connecting to SQL database failed with these settings:
01912                                 ".trim($cInfo)."
01913 
01914                                 Make sure you're using the correct set of data.".($this->config_array["sql.safe_mode_user"]? "
01915                                 <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"]."'":"")."
01916                                 ",3);
01917                         }
01918                 }
01919         }
01920 
01927         function setupGeneral($cmd="")  {
01928                 switch($cmd)    {
01929                         case "get_form":
01930                                         // Database:
01931                                 $out='
01932                                 <table border=0 cellpadding=0 cellspacing=0>
01933                                 <form action="'.$this->action.'" method="POST">';
01934 
01935                                 $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>":""));
01936                                 $out.=$this->wrapInCells("Password:", '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_password]" value="'.htmlspecialchars(TYPO3_db_password).'">');
01937                                 $out.=$this->wrapInCells("Host:", '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_host]" value="'.htmlspecialchars(TYPO3_db_host).'">');
01938                                 if ($this->config_array["mysqlConnect"])        {
01939                                         $dbArr = $this->getDatabaseList();
01940                                         reset($dbArr);
01941                                         $options="";
01942                                         $dbIncluded=0;
01943                                         while(list(,$dbname)=each($dbArr))      {
01944                                                 $options.='<option value="'.htmlspecialchars($dbname).'"'.($dbname==TYPO3_db?' selected':'').'>'.htmlspecialchars($dbname).'</option>';
01945                                                 if ($dbname==TYPO3_db)  $dbIncluded=1;
01946                                         }
01947                                         if (!$dbIncluded && TYPO3_db)   {
01948                                                 $options.='<option value="'.htmlspecialchars(TYPO3_db).'" selected>'.htmlspecialchars(TYPO3_db).' (NO ACCESS!)</option>';
01949                                         }
01950                                         $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="">';
01951                                 } else {
01952                                         $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).'">';
01953                                 }
01954                                 $out.=$this->wrapInCells("", "<BR>");
01955                                 $out.=$this->wrapInCells("Database:", $theCode);
01956                                 $out.=$this->wrapInCells("", "<BR>");
01957 
01958                                 if ($this->mode!="123") {
01959                                         $out.=$this->wrapInCells("Site name:", '<input type="text" name="TYPO3_INSTALL[localconf.php][sitename]" value="'.htmlspecialchars($GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"]).'">');
01960                                         $out.=$this->wrapInCells("", "<BR>");
01961 
01962                                                 // Other
01963                                         $fA = $this->setupGeneralCalculate();
01964         //                              debug($fA);
01965                                         if (is_array($fA["disable_exec_function"]))     {
01966                                                 $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"]));
01967                                         }
01968                                         if (is_array($fA["gdlib"]))     {
01969                                                 $out.=$this->wrapInCells("[GFX][gdlib]=", $this->getFormElement($fA["gdlib"], $fA["gdlib"], 'TYPO3_INSTALL[localconf.php][gdlib]', $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib"]));
01970                                                 if (is_array($fA["gdlib_png"]) && $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib"])  {
01971                                                         $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"]));
01972                                                 }
01973                                         }
01974                                         if (is_array($fA["im"]))        {
01975                                                 $out.=$this->wrapInCells("[GFX][im]=", $this->getFormElement($fA["im"], $fA["im"], 'TYPO3_INSTALL[localconf.php][im]', $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im"]));
01976                                                 $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"]));
01977                                                 if ($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im"])   {
01978                                                         if (is_array($fA["im_path"]))   {
01979                                                                 $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"]));
01980                                                         }
01981                                                         if (is_array($fA["im_path_lzw"]))       {
01982                                                                 $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"]));
01983                                                         }
01984                                                 }
01985                                         }
01986                                 }
01987 
01988 
01989                                 $out.=$this->wrapInCells("", '<BR><input type="submit" value="Update localconf.php"><BR>
01990                                 <strong>NOTICE: </strong>By clicking this button, localconf.php is updated with new values for the parameters listed above!');
01991                                 $out.='
01992                                 </form>
01993                                 </table>';
01994                         break;
01995                         default:
01996                                 if (is_array($this->INSTALL["localconf.php"]))          {
01997                                         $errorMessages=array();
01998                                         $lines = $this->writeToLocalconf_control();
01999 
02000                                                 // New database?
02001 #debug($this->INSTALL);
02002                                         if (trim($this->INSTALL["localconf.php"]["NEW_DATABASE_NAME"])) {
02003                                                 $newdbname=trim($this->INSTALL["localconf.php"]["NEW_DATABASE_NAME"]);
02004                                                 if (!ereg("[^[:alnum:]_-]",$newdbname)) {
02005                                                         if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
02006                                                                 if ($GLOBALS['TYPO3_DB']->admin_query('CREATE DATABASE '.$newdbname)) {
02007                                                                         $this->INSTALL["localconf.php"]["typo_db"] = $newdbname;
02008                                                                         $this->messages[]= "Database '".$newdbname."' created";
02009                                                                 } else $this->messages[]= $errorMessages[] = "Could not create database '".$newdbname."' (...not created)";
02010                                                         } else $this->messages[]= $errorMessages[] = "Could not connect to database when creating database '".$newdbname."' (...not created)";
02011                                                 } else $this->messages[]= $errorMessages[] = "The NEW database name '".$newdbname."' was not alphanumeric, a-zA-Z0-9_- (...not created)";
02012                                         }
02013 #debug($this->messages)         ;
02014                                                 // Parsing values
02015                                         reset($this->INSTALL["localconf.php"]);
02016                                         while(list($key,$value)=each($this->INSTALL["localconf.php"]))          {
02017                                                 switch((string)$key)    {
02018                                                         case "typo_db_username":
02019                                                                 if (strlen($value)<50)  {
02020                                                                         if (strcmp(TYPO3_db_username,$value))           $this->setValueInLocalconfFile($lines, '$typo_db_username', trim($value));
02021                                                                 } else $this->messages[]= $errorMessages[] = "Username '".$value."' was longer than 50 chars (...not saved)";
02022                                                         break;
02023                                                         case "typo_db_password":
02024                                                                 if (strlen($value)<50)  {
02025                                                                         if (strcmp(TYPO3_db_password,$value))           $this->setValueInLocalconfFile($lines, '$typo_db_password',  trim($value));
02026                                                                 } else $this->messages[]= $errorMessages[] = "Password '".$value."' was longer than 50 chars (...not saved)";
02027                                                         break;
02028                                                         case "typo_db_host":
02029                                                                 if (!ereg("[^[:alnum:]_\.-]",$value) && strlen($value)<50)      {
02030                                                                         if (strcmp(TYPO3_db_host,$value))               $this->setValueInLocalconfFile($lines, '$typo_db_host', $value);
02031                                                                 } else $this->messages[]= $errorMessages[] = "Host '".$value."' was not alphanumeric, a-zA-Z0-9_-., or longer than 50 chars (...not saved)";
02032                                                         break;
02033                                                         case "typo_db":
02034                                                                 if (strlen($value)<50)  {
02035                                                                         if (strcmp(TYPO3_db,$value))            $this->setValueInLocalconfFile($lines, '$typo_db',  trim($value));
02036                                                                 } else $this->messages[]= $errorMessages[] = "Database name '".$value."' was longer than 50 chars (...not saved)";
02037                                                         break;
02038                                                         case "disable_exec_function":
02039                                                                 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["BE"]["disable_exec_function"],$value))  $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["BE"]["disable_exec_function"]', $value?1:0);
02040                                                         break;
02041                                                         case "sitename":
02042                                                                 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"],$value))      $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["SYS"]["sitename"]', $value);
02043                                                         break;
02044                                                         case "im_combine_filename":
02045                                                                 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_combine_filename"],$value))   $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["im_combine_filename"]', $value);
02046                                                         break;
02047                                                         case "gdlib":
02048                                                         case "gdlib_png":
02049                                                         case "im":
02050                                                                 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"][$key],$value))    $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["'.$key.'"]', $value?1:0);
02051                                                         break;
02052                                                         case "im_path":
02053                                                                 list($value,$version) = explode("|",$value);
02054                                                                 if (!ereg("[[:space:]]",$value,$reg) && strlen($value)<100)     {
02055                                                                         if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"][$key],$value))    {
02056                                                                                 $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["'.$key.'"]', $value);
02057                                                                         }
02058                                                                         $value_ext = (doubleval($version)<5)?0:1;
02059                                                                         if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"],$value_ext))      {
02060                                                                                 $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["im_version_5"]', $value_ext);
02061                                                                         }
02062                                                                 } else $this->messages[]= $errorMessages[] = "Path '".$value."' contains spaces or is longer than 100 chars (...not saved)";
02063                                                         break;
02064                                                         case "im_path_lzw":
02065                                                                 list($value) = explode("|",$value);
02066                                                                 if (!ereg("[[:space:]]",$value) && strlen($value)<100)  {
02067                                                                         if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"][$key],$value))    $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["'.$key.'"]', $value);
02068                                                                 } else $this->messages[]= $errorMessages[] = "Path '".$value."' contains spaces or is longer than 100 chars (...not saved)";
02069                                                         break;
02070                                                 }
02071 
02072 
02073                                         }
02074 
02075                                         if (count($errorMessages))      {
02076                                                 echo "<H3>ERRORS</H3>";
02077                                                 echo t3lib_div::view_array($errorMessages);
02078                                                 echo 'Click the browsers "Back" button to reenter the values.';
02079                                                 exit;
02080                                         }
02081                                         $this->writeToLocalconf_control($lines);
02082                                 }
02083                         break;
02084                 }
02085                 return $out;
02086         }
02087 
02094         function writeToLocalconf_control($lines="")    {
02095                 $returnVal = parent::writeToLocalconf_control($lines);
02096 
02097                 switch($returnVal)      {
02098                         case 'continue':
02099                                 $content = "<BR><BR>".implode($this->messages,"<HR>").'<BR><BR><a href="'.$this->action.'">Click to continue...</a>';
02100                                 $this->outputExitBasedOnStep($content);
02101                         break;
02102                         case 'nochange':
02103                                 $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>';
02104                                 $this->outputExitBasedOnStep("<BR>".$content);
02105                         break;
02106                 }
02107 
02108                 return $returnVal;
02109         }
02110 
02117         function outputExitBasedOnStep($content)        {
02118                 if ($this->step)        {
02119                         Header("Location: ".t3lib_div::locationHeaderUrl($this->action));
02120                 } else {
02121                         echo $this->outputWrapper($content);
02122                 }
02123                 exit;
02124         }
02125 
02133         function setLabelValueArray($arr,$type) {
02134                 reset($arr);
02135                 while(list($k,$v)=each($arr))   {
02136                         switch($type)   {
02137                                 case 0: // value, im
02138                                         $arr[$k].="|".$this->config_array["im_versions"][$v]["convert"];
02139                                 break;
02140                                 case 1: // labels, im
02141                                         $arr[$k].=$this->config_array["im_versions"][$v]["convert"] ? " (".$this->config_array["im_versions"][$v]["convert"].($this->config_array["im_versions"][$v]["gif_capability"]?", ".$this->config_array["im_versions"][$v]["gif_capability"]:"").")" : "";
02142                                 break;
02143                                 case 2: // labels, gd
02144                                         $arr[$k].=" (".($v==1?"PNG":"GIF").")";
02145                                 break;
02146                         }
02147                 }
02148                 return $arr;
02149         }
02150 
02161         function getFormElement($labels,$values,$fieldName,$default,$msg="")    {
02162                 $out.='<strong>'.htmlspecialchars(current($labels)).'</strong><BR>current value is '.htmlspecialchars($default).($msg?"<BR>".$msg:"");
02163                 if (count($labels)>1)           {
02164                         reset($labels);
02165                         while(list($k,$v)=each($labels))        {
02166                                 list($cleanV) =explode("|",$values[$k]);
02167                                 $options.='<option value="'.htmlspecialchars($values[$k]).'"'.(!strcmp($default,$cleanV)?" selected":"").'>'.htmlspecialchars($v).'</option>';
02168                         }
02169                         $out.='<BR><select name="'.$fieldName.'">'.$options.'</select>';
02170                 } else {
02171                         $out.='<input type="hidden" name="'.$fieldName.'" value="'.htmlspecialchars(current($values)).'">';
02172                 }
02173                 return $out."<BR>";
02174         }
02175 
02181         function getDatabaseList()      {
02182                 $dbArr=array();
02183                 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password))  {
02184                         $dbArr = $GLOBALS['TYPO3_DB']->admin_get_dbs();
02185                 }
02186                 return $dbArr;
02187         }
02188 
02205         function setupGeneralCalculate()        {
02206                 $formArray["disable_exec_function"]=array(0);
02207                 $formArray["im_path"]=array("");
02208                 $formArray["im_path_lzw"]=array("");
02209                 $formArray["im_combine_filename"]=array("");
02210                 $formArray["im"]=array(1);
02211                 $formArray["gdlib"]=array(1);
02212                 if ($this->config_array["gd"] && ($this->config_array["gd_gif"] || $this->config_array["gd_png"]))      {
02213                         if ($this->config_array["gd_gif"] && !$this->config_array["gd_png"])    {
02214                                 $formArray["gdlib_png"]=array(0);
02215                         } elseif (!$this->config_array["gd_gif"] && $this->config_array["gd_png"])      {
02216                                 $formArray["gdlib_png"]=array(1);
02217                         } else {
02218                                 $formArray["gdlib_png"]=array(0,1);
02219                         }
02220                 } else {
02221                         $formArray["gdlib"]=array(0);
02222                 }
02223                 if ($this->config_array["safemode"])    {
02224                         $formArray["disable_exec_function"]=array(1);
02225                 }
02226                 if ($this->config_array["im"])  {
02227                         $formArray["im"]=array(1);
02228                         $LZW_found=0;
02229                         $found=0;
02230                         reset($this->config_array["im_versions"]);
02231                         $totalArr=array();
02232                         while(list($path,$dat)=each($this->config_array["im_versions"]))        {
02233                                 if (count($dat)>=3)     {
02234                                         if (doubleval($dat["convert"])<5)       {
02235                                                 if ($dat["gif_capability"]=="LZW")      {
02236                                                         $formArray["im_path"]=array($path);
02237                                                         $found=2;
02238                                                 } elseif ($found<2)     {
02239                                                         $formArray["im_path"]=array($path);
02240                                                         $found=1;
02241                                                 }
02242                                         } elseif (!$found)      {
02243                                                 $formArray["im_path"]=array($path);
02244                                                 $found=1;
02245                                         }
02246                                 }
02247                                 if ($dat["gif_capability"]=="LZW")      {
02248                                         if (doubleval($dat["convert"])<5)       {
02249                                                 $formArray["im_path_lzw"]=array($path);
02250                                                 $LZW_found=1;
02251                                         } elseif (!$LZW_found) {
02252                                                 $formArray["im_path_lzw"]=array($path);
02253                                                 $LZW_found=1;
02254                                         }
02255                                 } elseif ($dat["gif_capability"]=="RLE" && !$LZW_found) {
02256                                         $formArray["im_path_lzw"]=array($path);
02257                                 }
02258                                 $totalArr[]=$path;
02259                         }
02260                         $formArray["im_path"]=array_unique(array_merge($formArray["im_path"],$totalArr));
02261                         $formArray["im_path_lzw"]=array_unique(array_merge($formArray["im_path_lzw"],$totalArr));
02262                         $formArray["im_combine_filename"]=array($this->config_array["im_combine_filename"]);
02263                 } else {
02264                         $formArray["im"]=array(0);
02265                 }
02266                 return $formArray;
02267         }
02268 
02274         function getGDPartOfPhpinfo()   {
02275                 ob_start();
02276                 phpinfo();
02277                 $contents = ob_get_contents();
02278                 ob_end_clean();
02279                 $start_string = $this->getGD_start_string;
02280                 $end_string = $this->getGD_end_string;
02281                 list(,$gdpart_tmp) = explode($start_string,$contents,2);
02282                 list($gdpart) = explode($end_string,$start_string.$gdpart_tmp,2);
02283                 $gdpart.=$end_string;
02284                 return $gdpart;
02285         }
02286 
02293         function isTTF($phpinfo="")     {
02294 /*              $phpinfo = $phpinfo?$phpinfo:$this->getGDPartOfPhpinfo();
02295                 if (stristr($phpinfo, $this->getTTF_string))    return 1;
02296                 if (stristr($phpinfo, $this->getTTF_string_alt))        return 1;
02297                 */
02298 
02299                 if (!function_exists("imagettftext"))   return 0;       // Return right away if imageTTFtext does not exist.
02300 
02301                         // try, print truetype font:
02302                 $im = @imagecreate (300, 50);
02303                 $background_color = imagecolorallocate ($im, 255, 255, 55);
02304                 $text_color = imagecolorallocate ($im, 233, 14, 91);
02305 
02306                 $test = @imagettftext($im, t3lib_div::freetypeDpiComp(20), 0, 10, 20, $text_color, PATH_t3lib."/fonts/verdana.ttf", "Testing Truetype support");
02307                 if (t3lib_div::_GP("testingTrueTypeSupport"))   {
02308                         if ($this->isGIF())     {
02309                                 header ("Content-type: image/gif");
02310                                 imagegif ($im);
02311                         } else {
02312                                 header ("Content-type: image/png");
02313                                 imagepng ($im);
02314                         }
02315                         exit;
02316                 }
02317                 return is_array($test)?1:0;
02318         }
02319 
02320 
02321 
02322 
02323 
02324 
02325 
02326 
02327 
02328 
02329 
02330         /*****************************************
02331          *
02332          * ABOUT the isXXX functions.
02333          *
02334          * I had a very real experience that these checks DID NOT fail eg PNG support if it didn't exist!
02335          * 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.
02336          * And if THAT succeeds also, then we can be certain of the support!
02337          */
02338 
02342         function isGD() {
02343                 if (function_exists("imagecreate"))     {
02344                         if (@imagecreate (50, 100))     return 1;
02345                 }
02346         }
02347 
02353         function isGIF()        {
02354                 if (function_exists("imagecreatefromgif") && function_exists("imagegif") && ($this->ImageTypes() & IMG_GIF))    {       // If GIF-functions exists, also do a real test of them:
02355                         $im = @imagecreatefromgif(t3lib_extMgm::extPath("install")."imgs/jesus.gif");
02356                         return $im?1:0;
02357                 }
02358         }
02359 
02365         function isJPG()        {
02366                 if (function_exists("imagecreatefromjpeg") && function_exists("imagejpeg") && ($this->ImageTypes() & IMG_JPG))  {
02367                         return 1;
02368                 }
02369         }
02370 
02376         function isPNG()        {
02377                 if (function_exists("imagecreatefrompng") && function_exists("imagepng") && ($this->ImageTypes() & IMG_PNG))    {
02378                         $im = imagecreatefrompng(t3lib_extMgm::extPath("install")."imgs/jesus.png");
02379                         return $im?1:0;
02380                 }
02381         }
02382 
02388         function ImageTypes()   {
02389                 if (phpversion()!="4.1.2")      {
02390                         return imagetypes();
02391                 } else return IMG_GIF+IMG_JPG+IMG_PNG; // all...
02392         }
02393 
02399         function getGDSoftwareInfo()    {
02400                 return trim("
02401                 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/")."</a>.
02402                 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").".
02403                 ");
02404         }
02405 
02411         function generallyAboutConfiguration()  {
02412                 $out='
02413                 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.
02414                 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.
02415                 See this page for '.$this->linkIt("http://typo3.org/1275.0.html","more information about system requirements.").'
02416                 ';
02417                 return trim($out);
02418         }
02419 
02420 
02421 
02422 
02423 
02424 
02425 
02426 
02427 
02428 
02429 
02430 
02431 
02432         /**********************
02433          *
02434          * IMAGE processing
02435          *
02436          **********************/
02437 
02471         function checkTheImageProcessing()      {
02472                 $this->message("Image Processing","What is it?","
02473                 TYPO3 is known for its ability to process images on the server.
02474                 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).
02475                 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).
02476                 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.
02477 
02478                 In order to do this, TYPO3 uses two sets of tools:
02479 
02480                 <B>ImageMagick:</B>
02481                 For conversion of non-web formats to webformats, combining images with alpha-masks, performing image-effects like blurring and sharpening.
02482                 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).
02483                 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).
02484                 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])
02485                 ImageMagick homepage is at ".$this->linkIt("http://www.imagemagick.org/")."
02486 
02487                 <B>GDLib:</B>
02488                 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.
02489                 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.
02490                 ".$this->getGDSoftwareInfo()."
02491 
02492                 You can disable all image processing options in TYPO3 ([GFX][image_processing]=0), but that would seriously disable TYPO3.
02493                 ");
02494 
02495                 $this->message("Image Processing","Verifying the image processing capabilities of your server","
02496                 This page performs image processing and displays the result. It's a thorough check that everything you've configured is working correctly.
02497                 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.
02498 
02499                 The image to the right is the reference image (how it should be) and to the left the image made by your server.
02500                 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.
02501 
02502                 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.
02503                 ");
02504 
02505 //              debug($this->config_array);
02506                 $im_path = $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_path"];
02507                 $im_path_version = $this->config_array["im_versions"][$im_path]["convert"];
02508                 $im_path_lzw = $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_path_lzw"];
02509                 $im_path_lzw_version = $this->config_array["im_versions"][$im_path_lzw]["convert"];
02510                 $msg = "
02511                 ImageMagick enabled: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im"]."</strong>
02512                 ImageMagick path: <strong>".$im_path."</strong> (".$im_path_version.")
02513                 ImageMagick path/LZW: <strong>".$im_path_lzw."</strong>  (".$im_path_lzw_version.")
02514                 Version 5 flag: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"]."</strong>
02515 
02516                 GDLib enabled: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib"]."</strong>
02517                 GDLib using PNG: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib_png"]."</strong>
02518                 GDLib 2 enabled: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib_2"]."</strong>
02519                 IM5 effects enabled: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_v5effects"]."</strong> (Blurring/Sharpening with IM 5+)
02520                 Freetype DPI: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["TTFdpi"]."</strong> (Should be 96 for Freetype 2)
02521                 Mask invert: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_imvMaskState"]."</strong> (Should be set for some IM versions approx. 5.4+)
02522 
02523                 File Formats: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["imagefile_ext"]."</strong>
02524                 ";
02525                 if (($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"]?true:false) != (doubleval($im_path_version)>=5))        {
02526                         $msg.="Warning: Mismatch between the version of ImageMagick (".$im_path_version.") and the configuration of [GFX][im_version_5] (".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"].")";
02527                         $etype=2;
02528                 } else $etype=1;
02529 
02530                 $this->message("Image Processing","Current configuration",$msg,$etype);
02531 
02532 
02533 
02534 
02535                 if (!$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["image_processing"])    {
02536                         $this->message("Image Processing","Image Processing disabled!","
02537                                 Image Processing is disabled by the config flag <nobr>[GFX][image_processing]</nobr> set to false (zero)
02538                         ",2);
02539                         echo $this->outputWrapper($this->printAll());
02540                         return;
02541                 }
02542                 if (!$this->config_array["dir_typo3temp"])      {
02543                         $this->message("Image Processing","typo3temp/ not writable!","
02544                                 You must make typo3temp/ write enabled before you can proceed with this test.
02545                         ",2);
02546                         echo $this->outputWrapper($this->printAll());
02547                         return;
02548                 }
02549 
02550 
02551 
02552                 $msg='<a name="testmenu"></a>Click each of these links in turn to test a topic. <B>Please be aware that each test may take several seconds!</B>:
02553 
02554                 '.$this->imagemenu();
02555                 $this->message("Image Processing","Testmenu",$msg,"");
02556 
02557 
02558                 $this->messageFunc_nl2br=0;
02559                 $parseStart = microtime();
02560                 $imageProc = t3lib_div::makeInstance("t3lib_stdGraphic");
02561                 $imageProc->init();
02562                 $imageProc->tempPath = $this->typo3temp_path;
02563                 $imageProc->dontCheckForExistingTempFile=1;
02564 //              $imageProc->filenamePrefix="install_".($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"]?"v5":"");
02565                 $imageProc->filenamePrefix="install_";
02566                 $imageProc->dontCompress=1;
02567                 $imageProc->alternativeOutputKey="TYPO3_INSTALL_SCRIPT";
02568                 $imageProc->noFramePrepended=$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_noFramePrepended"];
02569 
02570                 // Very temporary!!!
02571                 $imageProc->dontUnlinkTempFiles=0;
02572 
02573 
02574                 $imActive = ($this->config_array["im"] && $im_path);
02575                 $gdActive = ($this->config_array["gd"] && $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib"]);
02576 
02577                 switch($this->INSTALL["images_type"])   {
02578                         case "read":
02579                                 $refParseTime="5600";   // 4.2.9
02580                                 $refParseTime="3300";   // 5.2.3
02581                                 $headCode = "Reading and converting images";
02582                                 $this->message($headCode,"Supported file formats","
02583                                 This verifies that your ImageMagick installation is able to read the nine default file formats; JPG, GIF, PNG, TIF, BMP, PCX, TGA, PDF, AI.
02584                                 The tool 'identify' will be used to read the pixeldimensions of non-web formats.
02585                                 The tool 'convert' is used to read the image and write a temporary JPG-file
02586                                 ");
02587 
02588                                 if ($imActive)  {
02589                                                 // Reading formats - writing JPG
02590 
02591                                         $extArr = explode(",","jpg,gif,png,tif,bmp,pcx,tga");
02592                                         while(list(,$ext)=each($extArr))        {
02593                                                 if ($this->isExtensionEnabled($ext, $headCode, "Read ".strtoupper($ext)))       {
02594                                                         $imageProc->IM_commands=array();
02595                                                         $theFile = t3lib_extMgm::extPath("install")."imgs/jesus.".$ext;
02596                                                         if (!@is_file($theFile))        die("Error: ".$theFile." was not a file");
02597 
02598                                                         $imageProc->imageMagickConvert_forceFileNameBody="read_".$ext;
02599                                                         $fileInfo = $imageProc->imageMagickConvert($theFile,"jpg","","","","","",1);
02600                                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02601                                                         $this->message($headCode,"Read ".strtoupper($ext),$result[0],$result[1]);
02602                                                 }
02603                                         }
02604 
02605                                         if ($this->isExtensionEnabled("pdf", $headCode, "Read PDF"))    {
02606                                                 $imageProc->IM_commands=array();
02607                                                 $theFile = t3lib_extMgm::extPath("install")."imgs/pdf_from_imagemagick.pdf";
02608                                                 if (!@is_file($theFile))        die("Error: ".$theFile." was not a file");
02609 
02610                                                 $imageProc->imageMagickConvert_forceFileNameBody="read_pdf";
02611                                                 $fileInfo = $imageProc->imageMagickConvert($theFile,"jpg","170","","","","",1);
02612                                                 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02613                                                 $this->message($headCode,"Read PDF",$result[0],$result[1]);
02614                                         }
02615                                         if ($this->isExtensionEnabled("ai", $headCode, "Read AI"))      {
02616                                                 $imageProc->IM_commands=array();
02617                                                 $theFile = t3lib_extMgm::extPath("install")."imgs/typo3logotype.ai";
02618                                                 if (!@is_file($theFile))        die("Error: ".$theFile." was not a file");
02619 
02620                                                 $imageProc->imageMagickConvert_forceFileNameBody="read_ai";
02621                                                 $fileInfo = $imageProc->imageMagickConvert($theFile,"jpg","170","","","","",1);
02622                                                 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02623                                                 $this->message($headCode,"Read AI",$result[0],$result[1]);
02624                                         }
02625                                 } else {
02626                                         $this->message($headCode,"Test skipped","
02627                                         Use of ImageMagick has been disabled in the configuration.
02628                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02629                                         ",2);
02630                                 }
02631                         break;
02632                         case "write":
02633                                 $refParseTime="300";
02634 
02635                                         // Writingformats - writing JPG
02636                                 $headCode = "Writing images";
02637                                 $this->message($headCode,"Writing GIF and PNG","
02638                                 This verifies that ImageMagick is able to write GIF and PNG files.
02639                                 The GIF-file is attempted compressed with LZW by the t3lib_div::gif_compress() function.
02640                                 ");
02641 
02642                                 if ($imActive)  {
02643                                                 // Writing GIF
02644                                         $imageProc->IM_commands=array();
02645                                         $theFile = t3lib_extMgm::extPath("install")."imgs/jesus.gif";
02646                                         if (!@is_file($theFile))        die("Error: ".$theFile." was not a file");
02647 
02648                                         $imageProc->imageMagickConvert_forceFileNameBody="write_gif";
02649                                         $fileInfo = $imageProc->imageMagickConvert($theFile,"gif","","","","","",1);
02650                                         if ($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gif_compress"]) {
02651                                                 clearstatcache();
02652                                                 $prevSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02653                                                 $returnCode = t3lib_div::gif_compress($fileInfo[3],"");
02654                                                 clearstatcache();
02655                                                 $curSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02656                                                 $note = array("Note on gif_compress() function:","The 'gif_compress' method used was '".$returnCode."'.<BR>Previous filesize: ".$prevSize.". Current filesize:".$curSize);
02657                                         } else  $note=array("Note on gif_compress() function:","<em>Not used! Disabled by [GFX][gif_compress]</em>");
02658                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands, $note);
02659                                         $this->message($headCode,"Write GIF",$result[0],$result[1]);
02660 
02661 
02662                                                 // Writing PNG
02663                                         $imageProc->IM_commands=array();
02664                                         $theFile = t3lib_extMgm::extPath("install")."imgs/jesus.gif";
02665 
02666                                         $imageProc->imageMagickConvert_forceFileNameBody="write_png";
02667                                         $fileInfo = $imageProc->imageMagickConvert($theFile,"png","","","","","",1);
02668                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02669                                         $this->message($headCode,"Write PNG",$result[0],$result[1]);
02670                                 } else {
02671                                         $this->message($headCode,"Test skipped","
02672                                         Use of ImageMagick has been disabled in the configuration.
02673                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02674                                         ",2);
02675                                 }
02676                         break;
02677                         case "scaling":
02678                                 $refParseTime="650";
02679 
02680                                         // Scaling
02681                                 $headCode = "Scaling images";
02682                                 $this->message($headCode,"Scaling transparent images","
02683                                 This shows how ImageMagick reacts when scaling transparent GIF and PNG files.
02684                                 ");
02685 
02686                                 if ($imActive)  {
02687                                                 // Scaling transparent image
02688                                         $imageProc->IM_commands=array();
02689                                         $theFile = t3lib_extMgm::extPath("install")."imgs/jesus2_transp.gif";
02690                                         if (!@is_file($theFile))        die("Error: ".$theFile." was not a file");
02691 
02692                                         $imageProc->imageMagickConvert_forceFileNameBody="scale_gif";
02693                                         $fileInfo = $imageProc->imageMagickConvert($theFile,"gif","150","","","","",1);
02694                                         if ($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gif_compress"]) {
02695                                                 clearstatcache();
02696                                                 $prevSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02697                                                 $returnCode = t3lib_div::gif_compress($fileInfo[3],"");
02698                                                 clearstatcache();
02699                                                 $curSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02700                                                 $note = array("Note on gif_compress() function:","The 'gif_compress' method used was '".$returnCode."'.<BR>Previous filesize: ".$prevSize.". Current filesize:".$curSize);
02701                                         } else $note=array("Note on gif_compress() function:","<em>Not used! Disabled by [GFX][gif_compress]</em>");
02702                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands,$note);
02703                                         $this->message($headCode,"GIF to GIF, 150 pixels wide",$result[0],$result[1]);
02704 
02705                                         $imageProc->IM_commands=array();
02706                                         $theFile = t3lib_extMgm::extPath("install")."imgs/jesus2_transp.png";
02707                                         if (!@is_file($theFile))        die("Error: ".$theFile." was not a file");
02708 
02709                                         $imageProc->imageMagickConvert_forceFileNameBody="scale_png";
02710                                         $fileInfo = $imageProc->imageMagickConvert($theFile,"png","150","","","","",1);
02711                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02712                                         $this->message($headCode,"PNG to PNG, 150 pixels wide",$result[0],$result[1]);
02713 
02714                                         $imageProc->IM_commands=array();
02715                                         $theFile = t3lib_extMgm::extPath("install")."imgs/jesus2_transp.gif";
02716                                         if (!@is_file($theFile))        die("Error: ".$theFile." was not a file");
02717                                         $imageProc->imageMagickConvert_forceFileNameBody="scale_jpg";
02718                                         $fileInfo = $imageProc->imageMagickConvert($theFile,"jpg","150","","","","",1);
02719                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02720                                         $this->message($headCode,"GIF to JPG, 150 pixels wide",$result[0],$result[1]);
02721                                 } else {
02722                                         $this->message($headCode,"Test skipped","
02723                                         Use of ImageMagick has been disabled in the configuration.
02724                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02725                                         ",2);
02726                                 }
02727                         break;
02728                         case "combining":
02729                                 $refParseTime="150";    // 4.2.9
02730                                 $refParseTime="250";    // 5.2.3
02731                                                                         // Combine
02732                                 $headCode = "Combining images";
02733                                 $this->message($headCode,"Combining images","
02734                                 This verifies that the ImageMagick tool, 'combine'/'composite', is able to combine two images through a grayscale mask.<BR>
02735                                 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)
02736                                 ");
02737 
02738                                 if ($imActive)  {
02739                                         $imageProc->IM_commands=array();
02740                                         $input = t3lib_extMgm::extPath("install")."imgs/greenback.gif";
02741                                         $overlay = t3lib_extMgm::extPath("install")."imgs/jesus.jpg";
02742                                         $mask = t3lib_extMgm::extPath("install")."imgs/blackwhite_mask.gif";
02743                                                 if (!@is_file($input))  die("Error: ".$input." was not a file");
02744                                                 if (!@is_file($overlay))        die("Error: ".$overlay." was not a file");
02745                                                 if (!@is_file($mask))   die("Error: ".$mask." was not a file");
02746 
02747                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5($imageProc->alternativeOutputKey."combine1").".jpg";
02748                                         $imageProc->combineExec($input,$overlay,$mask,$output);
02749                                         $fileInfo = $imageProc->getImageDimensions($output);
02750                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02751                                         $this->message($headCode,"Combine using a GIF mask with only black and white",$result[0],$result[1]);
02752 
02753                                         // Combine
02754                                         $imageProc->IM_commands=array();
02755                                         $input = t3lib_extMgm::extPath("install")."imgs/combine_back.jpg";
02756                                         $overlay = t3lib_extMgm::extPath("install")."imgs/jesus.jpg";
02757                                         $mask = t3lib_extMgm::extPath("install")."imgs/combine_mask.jpg";
02758                                                 if (!@is_file($input))  die("Error: ".$input." was not a file");
02759                                                 if (!@is_file($overlay))        die("Error: ".$overlay." was not a file");
02760                                                 if (!@is_file($mask))   die("Error: ".$mask." was not a file");
02761                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5($imageProc->alternativeOutputKey."combine2").".jpg";
02762                                         $imageProc->combineExec($input,$overlay,$mask,$output);
02763                                         $fileInfo = $imageProc->getImageDimensions($output);
02764                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02765                                         $this->message($headCode,"Combine using a JPG mask with graylevels",$result[0],$result[1]);
02766                                 } else {
02767                                         $this->message($headCode,"Test skipped","
02768                                         Use of ImageMagick has been disabled in the configuration.
02769                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02770                                         ",2);
02771                                 }
02772                         break;
02773                         case "gdlib":
02774                                 $refParseTime="1800";   // GIF / 4.2.9 / LZW (5.2.3)
02775                                 $refParseTime="2700";   // PNG / 4.2.9 / LZW (5.2.3)
02776                                 $refParseTime="1600";   // GIF / 5.2.3 / LZW (5.2.3)
02777                                         // GDLibrary
02778                                 $headCode = "GDLib";
02779                                 $this->message($headCode,"Testing GDLib","
02780                                 This verifies that the GDLib installation works properly.
02781                                 ");
02782 
02783 
02784                                 if ($gdActive)  {
02785                                         // GD with box
02786                                         $imageProc->IM_commands=array();
02787                                         $im = imageCreate(170,136);
02788                                         ImageColorAllocate ($im, 0, 0, 0);
02789                                         $workArea=array(0,0,170,136);
02790                                         $conf=array(
02791                                                 "dimensions" => "10,50,150,36",
02792                                                 "color" => "olive"
02793                                         );
02794                                         $imageProc->makeBox($im,$conf,$workArea);
02795                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5("GDbox").".".$imageProc->gifExtension;
02796                                         $imageProc->ImageGif ($im,$output);
02797                                         $fileInfo = $imageProc->getImageDimensions($output);
02798                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02799                                         $this->message($headCode,"Create simple image",$result[0],$result[1]);
02800 
02801 
02802                                         // GD from image with box
02803                                         $imageProc->IM_commands=array();
02804                                         $input = t3lib_extMgm::extPath("install")."imgs/jesus.".$imageProc->gifExtension;
02805                                                 if (!@is_file($input))  die("Error: ".$input." was not a file");
02806                                         $im = $imageProc->imageCreateFromGif($input);
02807                                         $workArea=array(0,0,170,136);
02808                                         $conf=array();
02809                                         $conf["dimensions"]="10,50,150,36";
02810                                         $conf["color"]="olive";
02811                                         $imageProc->makeBox($im,$conf,$workArea);
02812                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5("GDfromImage+box").".".$imageProc->gifExtension;
02813                                         $imageProc->ImageGif ($im,$output);
02814                                         $fileInfo = $imageProc->getImageDimensions($output);
02815                                         $GDWithBox_filesize = @filesize($output);
02816                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02817                                         $this->message($headCode,"Create image from file",$result[0],$result[1]);
02818 
02819 
02820                                         // GD with text
02821                                         $imageProc->IM_commands=array();
02822                                         $im = imageCreate(170,136);
02823                                         ImageColorAllocate ($im, 128,128,150);
02824                                         $workArea=array(0,0,170,136);
02825                                         $conf=array(
02826                                                 "iterations" => 1,
02827                                                 "angle" => 0,
02828                                                 "antiAlias" => 1,
02829                                                 "text" => "HELLO WORLD",
02830                                                 "fontColor" => "#003366",
02831                                                 "fontSize" => 18,
02832                                                 "fontFile" => $this->backPath."t3lib/fonts/verdana.ttf",
02833                                                 "offset" => "17,40"
02834                                         );
02835                                         $conf["BBOX"] = $imageProc->calcBBox($conf);
02836                                         $imageProc->makeText($im,$conf,$workArea);
02837 
02838                                         $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5("GDwithText").".".$imageProc->gifExtension;
02839                                         $imageProc->ImageGif ($im,$output);
02840                                         $fileInfo = $imageProc->getImageDimensions($output);
02841                                         $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02842                                         $this->message($headCode,"Render text with TrueType font",$result[0],$result[1]);
02843 
02844                                         if ($imActive)  {
02845                                                         // extension: GD with text, niceText
02846                                                 $conf["offset"] = "17,65";
02847                                                 $conf["niceText"] = 1;
02848                                                 $imageProc->makeText($im,$conf,$workArea);
02849 
02850                                                 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5("GDwithText-niceText").".".$imageProc->gifExtension;
02851                                                 $imageProc->ImageGif ($im,$output);
02852                                                 $fileInfo = $imageProc->getImageDimensions($output);
02853                                                 $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'."));
02854                                                 $this->message($headCode,"Render text with TrueType font using 'niceText' option",
02855                                                         "(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>".
02856                                                         $result[0],$result[1]);
02857                                         } else {
02858                                                 $this->message($headCode,"Render text with TrueType font using 'niceText' option","
02859                                                 <strong>Test is skipped!</strong><BR><BR>
02860 
02861                                                 Use of ImageMagick has been disabled in the configuration. ImageMagick is needed to generate text with the niceText option.
02862                                                 Refer to section 'Basic Configuration' to change or review you configuration settings
02863                                                 ",2);
02864                                         }
02865 
02866                                         if ($imActive)  {
02867                                                         // extension: GD with text, niceText AND shadow
02868                                                 $conf["offset"] = "17,90";
02869                                                 $conf["niceText"] = 1;
02870                                                 $conf["shadow."] = array(
02871                                                         "offset"=>"2,2",
02872                                                         "blur" => $imageProc->V5_EFFECTS?"20":"90",
02873                                                         "opacity" => "50",
02874                                                         "color" => "black"
02875                                                 );
02876                                                 $imageProc->makeShadow($im,$conf["shadow."],$workArea,$conf);
02877                                                 $imageProc->makeText($im,$conf,$workArea);
02878 
02879                                                 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5("GDwithText-niceText-shadow").".".$imageProc->gifExtension;
02880                                                 $imageProc->ImageGif ($im,$output);
02881                                                 $fileInfo = $imageProc->getImageDimensions($output);
02882                                                 $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."));
02883                                                 $this->message($headCode,"Render 'niceText' with a shadow under",
02884                                                         "(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>".
02885                                                         $result[0],$result[1]);
02886                                         } else {
02887                                                 $this->message($headCode,"Render 'niceText' with a shadow under","
02888                                                 <strong>Test is skipped!</strong><BR><BR>
02889 
02890                                                 Use of ImageMagick has been disabled in the configuration. ImageMagick is needed to generate shadows.
02891                                                 Refer to section 'Basic Configuration' to change or review you configuration settings
02892                                                 ",2);
02893                                         }
02894 
02895                                         if ($imageProc->gifExtension=="gif")    {
02896                                                 $buffer=20;
02897                                                 $assess = "This assessment is based on the filesize from 'Create image from file' test, which were ".$GDWithBox_filesize." bytes";
02898                                                 $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!";
02899                                                 if ($GDWithBox_filesize<8784+$buffer)   {
02900                                                         $msg="<strong>Your GDLib appears to have LZW compression!</strong><BR>
02901                                                                 This assessment is based on the filesize from 'Create image from file' test, which were ".$GDWithBox_filesize." bytes.<BR>
02902                                                                 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>
02903                                                                 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)
02904                                                                 ";
02905                                                 } elseif ($GDWithBox_filesize>19000)    {
02906                                                         $msg="<strong>Your GDLib appears to have no compression at all!</strong><BR>
02907                                                                 ".$assess."<br>".$goodNews;
02908                                                 } else {
02909                                                         $msg="Your GDLib appears to have RLE compression<BR>
02910                                                                 ".$assess."<br>".$goodNews;
02911                                                 }
02912                                                 $this->message($headCode,"GIF compressing in GDLib","
02913                                                 ".$msg."
02914                                                 ",1);
02915                                         }
02916 
02917                                 } else {
02918                                         $this->message($headCode,"Test skipped","
02919                                         Use of GDLib has been disabled in the configuration.
02920                                         Refer to section 'Basic Configuration' to change or review you configuration settings
02921                                         ",2);
02922                                 }
02923                         break;
02924                 }
02925 
02926                 if ($this->INSTALL["images_type"])      {
02927                         // End info
02928                         if ($this->fatalError)  {
02929                                 $this->message("Info","Errors","
02930                                 It seems that you had some fatal errors in this test. Please make sure that your ImageMagick and GDLib settings are correct.
02931                                 Refer to the 'Basic Configuration' section for more information and debugging of your settings.
02932                                 ");
02933                         }
02934 
02935                         $parseStop = microtime();
02936                         $parseMS = t3lib_div::convertMicrotime($parseStop)-t3lib_div::convertMicrotime($parseStart);
02937                         $this->message("Info","Parsetime",$parseMS." ms");
02938                 }
02939                 echo $this->outputWrapper($this->printAll());
02940         }
02941 
02950         function isExtensionEnabled($ext, $headCode, $short)    {
02951                 if (!t3lib_div::inList($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["imagefile_ext"],$ext))       {
02952                         $this->message($headCode,$short,"Skipped - extension not in the list of allowed extensions ([GFX][imagefile_ext]).",1);
02953                 } else {
02954                         return 1;
02955                 }
02956         }
02957 
02966         function displayTwinImage ($imageFile, $IMcommands=array(), $note="")   {
02967                 $ex_rows="";
02968                 $errorLevels=array(-1);
02969                 if ($imageFile) {
02970                         $verifyFile = t3lib_extMgm::extPath("install")."verify_imgs/".basename($imageFile);
02971 #debug(array($imageFile,$this->backPath.'../'.substr($imageFile,strlen(PATH_site))),1);
02972                         $destImg = @getImageSize($imageFile);
02973                         $destImgCode ='<img src="'.$this->backPath.'../'.substr($imageFile,strlen(PATH_site)).'" '.$destImg[3].'>';
02974                         $verifyImg = @getImageSize($verifyFile);
02975                         $verifyImgCode = '<img src="'.$this->backPath.t3lib_extMgm::extRelPath("install").'verify_imgs/'.basename($verifyFile).'" '.$verifyImg[3].'>';
02976                         if (!$verifyImg)        {
02977                                 $gifVersion=1;
02978                                 $verifyFile_alt = substr($verifyFile,0,-3)."gif";
02979                                 $verifyImg = @getImageSize($verifyFile_alt);
02980                                 if ($verifyImg) {
02981                                         $verifyImgCode = '<img src="'.$this->backPath.'t3lib/install/verify_imgs/'.basename($verifyFile_alt).'" '.$verifyImg[3].'>';
02982                                         $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>';
02983                                 } else {
02984                                         $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>';
02985                                 }
02986                         }
02987 
02988                         clearstatcache();
02989                         $destImg["filesize"] = @filesize($imageFile);
02990                         clearstatcache();
02991                         $verifyImg["filesize"] = @filesize($verifyFile);
02992 
02993                         $ex_rows.='<tr>';
02994                         $ex_rows.='<td>'.$destImgCode.'</td>';
02995                         $ex_rows.='<td><img src=clear.gif width=30 height=1></td>';
02996                         $ex_rows.='<td>'.$verifyImgCode.'</td>';
02997                         $ex_rows.='</tr>';
02998 
02999                         $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");
03000 
03001                         if ($destImg["filesize"]!=$verifyImg["filesize"])       {
03002                                 if (intval($destImg["filesize"]) && abs(($verifyImg["filesize"]/$destImg["filesize"])-1) < 0.05)        {
03003 //                                      debug(abs(($verifyImg["filesize"]/$destImg["filesize"])-1));
03004                                         $ex_rows.=$this->getTwinImageMessage("File size is a bit different from reference", $destImg["filesize"], $verifyImg["filesize"]);
03005                                         $errorLevels[]=1;
03006                                 } else {
03007                                         $ex_rows.=$this->getTwinImageMessage("File size is very different from reference", $destImg["filesize"], $verifyImg["filesize"]);
03008                                         $errorLevels[]=2;
03009                                 }
03010                         }
03011                         if ($destImg[0]!=$verifyImg[0] || $destImg[1]!=$verifyImg[1])   {
03012                                 $ex_rows.=$this->getTwinImageMessage("Pixel dimension are not equal!");
03013                                 $errorLevels[]=2;
03014                         }
03015                         if ($note)      {
03016                                 $ex_rows.=$this->getTwinImageMessage($note[0],$note[1]);
03017                         }
03018                         if ($this->dumpImCommands && count($IMcommands))        {
03019                                 $ex_rows.=$this->getTwinImageMessage("ImageMagick commands executed:",$this->formatImCmds($IMcommands));
03020                         }
03021                 } else {
03022                         $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));
03023                         $errorLevels[]=3;
03024                 }
03025                 $out='<table border=0 cellpadding=0 cellspacing=0 align=center width=300>'.$ex_rows.'</table>';
03026 
03027                 return array($out,max($errorLevels));
03028         }
03029 
03038         function getTwinImageMessage($message, $label_1="", $label_2="")        {
03039                 if ($message)   $out.='<tr><td colspan=3><strong>'.$this->fw($message).'</strong></td></tr>';
03040                 if ($label_1 && !$label_2)      {
03041                         $out.='<tr><td colspan=3>'.$this->fw($label_1).'</td></tr>';
03042                 } elseif ($label_1 || $label_2) {
03043                         $out.='<tr><td>'.$this->fw($label_1).'</td><td></td><td>'.$this->fw($label_2).'</td></tr>';
03044                 }
03045                 return $out;
03046         }
03047 
03054         function formatImCmds($arr)     {
03055                 $out=array();
03056                 if (is_array($arr))     {
03057                         reset($arr);
03058                         while(list($k,$v)=each($arr))   {
03059                                 $out[]=$v[1];
03060                                 if ($v[2])      $out[]="   RETURNED: ".$v[2];
03061                         }
03062                 }
03063                 if (count($out))        {
03064                         $col = t3lib_div::intInRange(count($out),2,10);
03065                         $outputStr = '<textarea cols=40 rows='.$col.' wrap="off">'.htmlspecialchars(implode($out,chr(10))).'</textarea>';
03066                         return '<form action="">'.$outputStr.'</form>';
03067                 };
03068         }
03069 
03075         function imagemenu()    {
03076                 $menuitems = array(
03077                         "read" => "Reading image formats",
03078                         "write" => "Writing GIF and PNG",
03079                         "scaling" => "Scaling images",
03080                         "combining" => "Combining images",
03081                         "gdlib" => "GD library functions"
03082                 );
03083                 reset($menuitems);
03084                 $c=0;
03085                 $out=array();
03086                 while(list($k,$v)=each($menuitems))     {
03087                         $bgColor = ($this->INSTALL["images_type"]==$k ? ' bgColor="#ABBBB4"' : ' bgColor="#F4F0E8"');
03088                         $c++;
03089                         $out[]='<tr><td'.$bgColor.'><a href="'.$this->action.'&TYPO3_INSTALL[images_type]='.$k.'#testmenu">'.$this->fw($c.': '.$v).'</a></td></tr>';
03090                 }
03091 
03092                 $code = '<table border=0 cellpadding=0 cellspacing=1>'.implode($out,"").'</table>';
03093                 $code = '<table border=0 cellpadding=0 cellspacing=0 bgColor="#ABBBB4"><tr><td>'.$code.'</td></tr></table>';
03094                 return '<div align="center">'.$code.'</div>';
03095         }
03096 
03097 
03098 
03099 
03100 
03101 
03102 
03103 
03104 
03105 
03106 
03107 
03108         /**********************
03109          *
03110          * DATABASE analysing
03111          *
03112          **********************/
03113 
03117         function checkTheDatabase()     {
03118                 if (!$this->config_array["mysqlConnect"])       {
03119                         $this->message("Database Analyser","Your database connection failed","
03120                                 Please go to the 'Basic Configuration' section and correct this problem first.
03121                         ",2);
03122                         echo $this->outputWrapper($this->printAll());
03123                         return;
03124                 }
03125                 if ($this->config_array["no_database"]) {
03126                         $this->message("Database Analyser","No database selected","
03127                                 Please go to the 'Basic Configuration' section and correct this problem first.
03128                         ",2);
03129                         echo $this->outputWrapper($this->printAll());
03130                         return;
03131                 }
03132 
03133                         // Getting current tables
03134                 $whichTables=$this->getListOfTables();
03135 
03136 
03137                         // Getting number of static_template records
03138                 if ($whichTables["static_template"])    {
03139                         $res_static = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'static_template', '');
03140                         list($static_template_count) = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_static);
03141                 }
03142                 $static_template_count=intval($static_template_count);
03143 
03144                 $headCode ="Database Analyser";
03145                 $this->message($headCode,"What is it?","
03146                         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.
03147                 ",0);
03148 
03149                 $cInfo="
03150                         Username: <strong>".TYPO3_db_username."</strong>
03151                         Password: <strong>".TYPO3_db_password."</strong>
03152                         Host: <strong>".TYPO3_db_host."</strong>
03153                 ";
03154                 $this->message($headCode, "Connected to SQL database successfully","
03155                 ".trim($cInfo)."
03156                 ",-1,1);
03157                 $this->message($headCode, "Database","
03158                         <strong>".TYPO3_db."</strong> is selected as database.
03159                         Has <strong>".count($whichTables)."</strong> tables.
03160                 ",-1,1);
03161 
03162 
03163                 // Menu
03164 
03165                 $this->messageFunc_nl2br = 0;
03166 
03167                 $sql_files = array_merge(
03168                         t3lib_div::getFilesInDir(PATH_typo3conf,"sql",1,1),
03169 #                       t3lib_div::getFilesInDir(PATH_t3lib."stddb/","sql",1,1),
03170                         array()
03171                 );
03172 
03173                 $action_type = $this->INSTALL["database_type"];
03174                 $actionParts = explode("|",$action_type);
03175                 if (count($actionParts)<2)      {
03176                         $action_type="";
03177                 }
03178 
03179                 $out='';
03180 
03181 
03182                         $out.='<tr>
03183                                 <td nowrap><strong>'.$this->fw('Update required tables').'</strong></td>
03184                                 <td'.($action_type=="cmpFile|CURRENT_TABLES"?' bgColor="#D9D5C9"':'').'>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=cmpFile|CURRENT_TABLES#bottom"><strong>COMPARE</strong></a>').'</td>
03185                                 <td>'.$this->fw('&nbsp;').'</td>
03186                                 <td>'.$this->fw('&nbsp;').'</td>
03187                         </tr>';
03188 
03189                         $out.='<tr>
03190                                 <td nowrap><strong>'.$this->fw('Dump static data').'</strong></td>
03191                                 <td>'.$this->fw('&nbsp;').'</td>
03192                                 <td nowrap'.($action_type=="import|CURRENT_STATIC"?' bgColor="#D9D5C9"':'').'>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=import|CURRENT_STATIC#bottom"><strong>IMPORT</strong></a>').'</td>
03193                                 <td>'.$this->fw('&nbsp;').'</td>
03194                         </tr>';
03195 
03196                         $out.='<tr>
03197                                 <td colspan=4>&nbsp;</td>
03198                         </tr>';
03199 
03200 
03201 
03202 
03203                 reset($sql_files);
03204                 $directJump="";
03205                 while(list($k,$file)=each($sql_files))  {
03206                         if ($this->mode=="123" && !count($whichTables) && strstr($file,"_testsite"))    {
03207                                 $directJump = $this->action.'&TYPO3_INSTALL[database_type]=import|'.rawurlencode($file);
03208                         }
03209                         $lf=t3lib_div::testInt($k);
03210                         $fShortName = substr($file,strlen(PATH_site));
03211 /*                      $spec1 = (!count($whichTables) && $fShortName==TYPO3_mainDir."t3lib/install/tables_".str_replace(".","",$GLOBALS["TYPO_VERSION"]).".sql" ? " <font color=#000066>(1)</font>" : "");
03212                         $spec2 = (count($whichTables) && !$static_template_count && $fShortName==TYPO3_mainDir."t3lib/install/static_template_".str_replace(".","",$GLOBALS["TYPO_VERSION"])."+adt.sql" ? " <font color=#000066>(2)</font>" : "");
03213                         */
03214                         $out.='<tr>
03215                                 <td nowrap>'.$this->fw($fShortName." (".t3lib_div::formatSize(filesize($file)).")").'</td>
03216                                 <td'.($action_type=="cmpFile|".$file?' bgColor="#D9D5C9"':'').'>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=cmpFile|'.rawurlencode($file).'#bottom"><strong>COMPARE</strong></a>').'</td>
03217                                 <td nowrap'.($action_type=="import|".$file?' bgColor="#D9D5C9"':'').'>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=import|'.rawurlencode($file).'#bottom"><strong>IMPORT'.$spec1.$spec2.'</strong></a>').'</td>
03218                                 <td nowrap'.($action_type=="view|".$file?' bgColor="#D9D5C9"':'').'>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=view|'.rawurlencode($file).'#bottom"><strong>VIEW'.$spec1.$spec2.'</strong></a>').'</td>
03219                         </tr>';
03220                 }
03221                         // TCA
03222                 $out.='<tr>
03223                         <td></td>
03224                         <td colspan=3'.($action_type=="cmpTCA|"?' bgColor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=cmpTCA|#bottom">Compare with $TCA</a>').'</strong></td>
03225                 </tr>';
03226                 $out.='<tr>
03227                         <td></td>
03228                         <td colspan=3'.($action_type=="adminUser|"?' bgColor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=adminUser|#bottom">Create "admin" user</a>').'</strong></td>
03229                 </tr>';
03230                 $out.='<tr>
03231                         <td></td>
03232                         <td colspan=3'.($action_type=="UC|"?' bgColor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=UC|#bottom">Reset user preferences</a>').'</strong></td>
03233                 </tr>';
03234                 $out.='<tr>
03235                         <td></td>
03236                         <td colspan=3'.($action_type=="cache|"?' bgColor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.$this->action.'&TYPO3_INSTALL[database_type]=cache|#bottom">Clear tables</a>').'</strong></td>
03237                 </tr>';
03238 
03239                 $theForm='<table border=0 cellpadding=2 cellspacing=2>'.$out.'</table>';
03240                 $theForm.='<a name="bottom"></a>';
03241 
03242                 if ($directJump)        {
03243                         if (!$action_type)      {
03244                                 $this->message($headCode, "Menu",'
03245                                 <script language="javascript" type="text/javascript">
03246                                 document.location = "'.$directJump.'";
03247                                 </script>',0,1);
03248                         }
03249                 } else {
03250                         $this->message($headCode, "Menu","
03251                         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>
03252                         <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>
03253                         <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>
03254                         <strong>VIEW:</strong> Shows the content of the SQL-file, limiting characters on a single line to a reader-friendly amount.<BR><BR>
03255                         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.
03256         <br>
03257                         <BR>
03258                         ".$theForm."
03259                         ",0,1);
03260                 }
03261 
03262 
03263         // Install user
03264         // clear uc
03265                 if ($action_type)       {
03266                         switch($actionParts[0]) {
03267                                 case "cmpFile":
03268                                         $tblFileContent="";
03269                                         if (!strcmp($actionParts[1],"CURRENT_TABLES")) {
03270                                                 $tblFileContent = t3lib_div::getUrl(PATH_t3lib."stddb/tables.sql");
03271 
03272                                                 reset($GLOBALS["TYPO3_LOADED_EXT"]);
03273                                                 while(list(,$loadedExtConf)=each($GLOBALS["TYPO3_LOADED_EXT"])) {
03274                                                         if (is_array($loadedExtConf) && $loadedExtConf["ext_tables.sql"])       {
03275                                                                 $tblFileContent.= chr(10).chr(10).chr(10).chr(10).t3lib_div::getUrl($loadedExtConf["ext_tables.sql"]);
03276                                                         }
03277                                                 }
03278 #debug(array($tblFileContent));
03279                                         } elseif (@is_file($actionParts[1]))    {
03280                                                 $tblFileContent = t3lib_div::getUrl($actionParts[1]);
03281                                         }
03282                                         if ($tblFileContent)    {
03283                                                 $fileContent = implode(
03284                                                         $this->getStatementArray($tblFileContent,1,"^CREATE TABLE "),
03285                                                         chr(10)
03286                                                 );
03287                                                 $FDfile = $this->getFieldDefinitions_sqlContent($fileContent);
03288                                                 if (!count($FDfile))    {
03289                                                         die ("Error: There were no 'CREATE TABLE' definitions in the provided file");
03290                                                 }
03291 
03292                                                         // Updating database...
03293                                                 if (is_array($this->INSTALL["database_update"]))        {
03294                                                         $FDdb = $this->getFieldDefinitions_database();
03295                                                         $diff = $this->getDatabaseExtra($FDfile, $FDdb);
03296                                                         $update_statements = $this->getUpdateSuggestions($diff);
03297                                                         $diff = $this->getDatabaseExtra($FDdb, $FDfile);
03298                                                         $remove_statements = $this->getUpdateSuggestions($diff,"remove");
03299 
03300                                                         $this->performUpdateQueries($update_statements["add"],$this->INSTALL["database_update"]);
03301                                                         $this->performUpdateQueries($update_statements["change"],$this->INSTALL["database_update"]);
03302                                                         $this->performUpdateQueries($remove_statements["change"],$this->INSTALL["database_update"]);
03303                                                         $this->performUpdateQueries($remove_statements["drop"],$this->INSTALL["database_update"]);
03304 
03305                                                         $this->performUpdateQueries($update_statements["create_table"],$this->INSTALL["database_update"]);
03306                                                         $this->performUpdateQueries($remove_statements["change_table"],$this->INSTALL["database_update"]);
03307                                                         $this->performUpdateQueries($remove_statements["drop_table"],$this->INSTALL["database_update"]);
03308                                                 }
03309 
03310                                                         // Init again / first time depending...
03311                                                 $FDdb = $this->getFieldDefinitions_database();
03312                                                 $diff = $this->getDatabaseExtra($FDfile, $FDdb);
03313                                                 $update_statements = $this->getUpdateSuggestions($diff);
03314                                                 $diff = $this->getDatabaseExtra($FDdb, $FDfile);
03315                                                 $remove_statements = $this->getUpdateSuggestions($diff,"remove");
03316                                                 $tLabel = "Update database tables and fields";
03317 
03318                                                 if ($remove_statements || $update_statements)   {
03319                                                         $formContent = $this->generateUpdateDatabaseForm("get_form",$update_statements,$remove_statements,$action_type);
03320                                                         $this->message($tLabel,"Table and field definitions should be updated","
03321                                                         There seems to be a number of differencies between the database and the selected SQL-file.
03322                                                         Please select which statements you want to execute in order to update your database:<BR><BR>
03323                                                         ".$formContent."
03324                                                         ",2);
03325                                                 } else {
03326                                                         $formContent = $this->generateUpdateDatabaseForm("get_form",$update_statements,$remove_statements,$action_type);
03327                                                         $this->message($tLabel,"Table and field definitions are OK.","
03328                                                         The tables and fields in the current database corresponds perfectly to the database in the selected SQL-file.
03329                                                         ",-1);
03330                                                 }
03331                                         }
03332                                 break;
03333                                 case "cmpTCA":
03334                                         $this->includeTCA();
03335                                         $this->mysqlVersion = "3.23";   // Set this previously to calling the function below in order to make the rendering right for the comparison.
03336                                         $FDdb = $this->getFieldDefinitions_database();
03337 
03338                                                 // Displaying configured fields which are not in the database
03339                                         $tLabel="Tables and fields in \$TCA, but not in database";
03340                                         $cmpTCA_DB = $this->compareTCAandDatabase($GLOBALS["TCA"],$FDdb);
03341                                         if (!count($cmpTCA_DB["extra"]))        {
03342                                                 $this->message($tLabel,"Table and field definitions OK","
03343                                                 All fields and tables configured in $TCA appeared to exist in the database as well
03344                                                 ",-1);
03345                                         } else {
03346                                                 $this->message($tLabel,"Invalid table and field definitions in \$TCA!","
03347                                                 There are some tables and/or fields configured in the \$TCA array which does not exist in the database!
03348                                                 This will most likely cause you trouble with the TYPO3 backend interface!
03349                                                 ",3);
03350                                                 while(list($tableName, $conf)=each($cmpTCA_DB["extra"]))        {
03351                                                         $this->message($tLabel, $tableName,$this->displayFields($conf["fields"],0,"Suggested database field:"),2);
03352                                                 }
03353                                         }
03354 
03355                                                 // Displaying tables that are not setup in
03356                                         $cmpDB_TCA = $this->compareDatabaseAndTCA($FDdb,$GLOBALS["TCA"]);
03357                                         $excludeTables="be_sessions,fe_session_data,fe_sessions";
03358                                         if (TYPO3_OS=="WIN")    {$excludeTables = strtolower($excludeTables);}
03359                                         $excludeFields = array(
03360                                                 "be_users" => "uc,lastlogin,usergroup_cached_list",
03361                                                 "fe_users" => "uc,lastlogin,fe_cruser_id",
03362                                                 "pages" => "SYS_LASTCHANGED",
03363                                                 "sys_dmail" => "mailContent",
03364                                                 "tt_board" => "doublePostCheck",
03365                                                 "tt_guest" => "doublePostCheck",
03366                                                 "tt_products" => "ordered"
03367                                         );
03368                                         $tCount=0;
03369                                         $fCount=0;
03370                                         $tLabel="Tables from database, but not in \$TCA";
03371                                         $fLabel="Fields from database, but not in \$TCA";
03372                                         $this->message($tLabel);
03373                                         if (is_array($cmpDB_TCA['extra']))      {
03374                                                 while(list($tableName, $conf)=each($cmpDB_TCA['extra']))        {
03375                                                         if (!t3lib_div::inList($excludeTables,$tableName)
03376                                                                         && substr($tableName,0,4)!="sys_"
03377                                                                         && substr($tableName,-3)!="_mm"
03378                                                                         && substr($tableName,0,6)!="index_"
03379                                                                         && substr($tableName,0,6)!="cache_")    {
03380                                                                 if ($conf["whole_table"])       {
03381                                                                         $this->message($tLabel, $tableName,$this->displayFields($conf["fields"]),1);
03382                                                                         $tCount++;
03383                                                                 } else {
03384                                                                         list($theContent, $fC)  = $this->displaySuggestions($conf["fields"],$excludeFields[$tableName]);
03385                                                                         $fCount+=$fC;
03386                                                                         if ($fC)        $this->message($fLabel, $tableName,$theContent,1);
03387                                                                 }
03388                                                         }
03389                                                 }
03390                                         }
03391                                         if (!$tCount)   {
03392                                                 $this->message($tLabel,"Correct number of tables in the database","
03393                                                 There are no extra tables in the database compared to the configured tables in the \$TCA array.
03394                                                 ",-1);
03395                                         } else {
03396                                                 $this->message($tLabel,"Extra tables in the database","
03397                                                 There are some tables in the database which are not configured in the \$TCA array.
03398                                                 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.
03399                                                 ",2);
03400                                         }
03401 
03402                                         if (!$fCount)   {
03403                                                 $this->message($fLabel,"Correct number of fields in the database","
03404                                                 There are no additional fields in the database tables compared to the configured fields in the \$TCA array.
03405                                                 ",-1);
03406                                         } else {
03407                                                 $this->message($fLabel,"Extra fields in the database","
03408                                                 There are some additional fields the database tables which are not configured in the \$TCA array.
03409                                                 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.
03410                                                 ",2);
03411                                         }
03412 
03413                                                 // Displaying actual and suggested field database defitions
03414                                         if (is_array($cmpTCA_DB["matching"]))   {
03415                                                 $tLabel="Comparison between database and \$TCA";
03416 
03417                                                 $this->message($tLabel,"Actual and suggested field definitions","
03418                                                 This table shows you the suggested field definitions which are calculated based on the configuration in \$TCA.
03419                                                 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.
03420                                                 ",0);
03421                                                 while(list($tableName, $conf)=each($cmpTCA_DB["matching"]))     {
03422                                                         $this->message($tLabel, $tableName,$this->displayFieldComp($conf["fields"], $FDdb[$tableName]["fields"]),1);
03423                                                 }
03424                                         }
03425                                 break;
03426                                 case "import":
03427                                         $mode123Imported=0;
03428                                         $tblFileContent="";
03429                                         if (!strcmp($actionParts[1],"CURRENT_STATIC")) {
03430                                                 reset($GLOBALS["TYPO3_LOADED_EXT"]);
03431                                                 while(list(,$loadedExtConf)=each($GLOBALS["TYPO3_LOADED_EXT"])) {
03432                                                         if (is_array($loadedExtConf) && $loadedExtConf["ext_tables_static+adt.sql"])    {
03433                                                                 $tblFileContent.= chr(10).chr(10).chr(10).chr(10).t3lib_div::getUrl($loadedExtConf["ext_tables_static+adt.sql"]);
03434                                                         }
03435                                                 }
03436                                         } elseif (@is_file($actionParts[1]))    {
03437                                                 $tblFileContent = t3lib_div::getUrl($actionParts[1]);
03438                                         }
03439                                         if ($tblFileContent)    {
03440                                                 $tLabel="Import SQL dump";
03441                                                         // Getting statement array from
03442                                                 $statements = $this->getStatementArray($tblFileContent,1);
03443                                                 list($statements_table, $insertCount) = $this->getCreateTables($statements,1);
03444 
03445                                                         // Updating database...
03446                                                 if ($this->INSTALL["database_import_all"])      {
03447                                                         reset($statements);
03448                                                         $r=0;
03449                                                         while(list($k,$v)=each($statements))    {
03450                                                                 $res = $GLOBALS['TYPO3_DB']->admin_query($v);
03451                                                                 $r++;
03452                                                         }
03453                                                         $this->message($tLabel,"Imported ALL","
03454                                                                 Queries: ".$r."
03455                                                         ",1,1);
03456                                                         if (t3lib_div::_GP("goto_step"))        {
03457                                                                 $this->action.="&step=".t3lib_div::_GP("goto_step");
03458                                                                 Header("Location: ".t3lib_div::locationHeaderUrl($this->action));
03459                                                                 exit;
03460                                                         }
03461                                                 } elseif (is_array($this->INSTALL["database_import"]))  {
03462                                                                 // Traverse the tables
03463                                                         reset($this->INSTALL["database_import"]);
03464                                                         while(list($table,$md5str)=each($this->INSTALL["database_import"]))     {
03465                                                                 if ($md5str==md5($statements_table[$table]))    {
03466                                                                         $res = $GLOBALS['TYPO3_DB']->admin_query("DROP TABLE IF EXISTS ".$table);
03467                                                                         $res = $GLOBALS['TYPO3_DB']->admin_query($statements_table[$table]);
03468 
03469                                                                         if ($insertCount[$table])       {
03470                                                                                 $statements_insert = $this->getTableInsertStatements($statements, $table);
03471                                                                                 reset($statements_insert);
03472                                                                                 while(list($k,$v)=each($statements_insert))     {
03473                                                                                         $res = $GLOBALS['TYPO3_DB']->admin_query($v);
03474                                                                                 }
03475                                                                         }
03476 
03477                                                                         $this->message($tLabel,"Imported '".$table."'","
03478                                                                                 Rows: ".$insertCount[$table]."
03479                                                                         ",1,1);
03480                                                                 }
03481                                                         }
03482                                                 }
03483 
03484                                                 $mode123Imported=$this->isBasicComplete($tLabel);
03485 
03486                                                 if (!$mode123Imported)  {
03487                                                                 // Re-Getting current tables - may have been changed during import
03488                                                         $whichTables=$this->getListOfTables();
03489 
03490                                                         if (count($statements_table))   {
03491                                                                 reset($statements_table);
03492                                                                 $out='';
03493                                                                 while(list($table,$definition)=each($statements_table)) {
03494                                                                         $exist=isset($whichTables[$table]);
03495                                                                         $out.='<tr>
03496                                                                                 <td><input type="checkbox" name="TYPO3_INSTALL[database_import]['.$table.']" value="'.md5($definition).'"></td>
03497                                                                                 <td><strong>'.$this->fw($table).'</strong></td>
03498                                                                                 <td><img src=clear.gif width=10 height=1></td>
03499                                                                                 <td nowrap>'.$this->fw($insertCount[$table]?"Rows: ".$insertCount[$table]:"").'</td>
03500                                                                                 <td><img src=clear.gif width=10 height=1></td>
03501                                                                                 <td nowrap>'.($exist?'<img src="'.$this->backPath.'t3lib/gfx/icon_warning.gif" width=18 height=16 align=top>'.$this->fw("Table exists!"):'').'</td>
03502                                                                                 </tr>';
03503                                                                 }
03504 
03505                                                                 $content ='';
03506                                                                 if ($this->mode!="123") {
03507                                                                         $content.='<table border=0 cellpadding=0 cellspacing=0>'.$out.'</table>
03508                                                                         <HR>
03509                                                                         ';
03510                                                                 }
03511                                                                 $content.='<input type="checkbox" name="TYPO3_INSTALL[database_import_all]" value="1"'.($this->mode=="123"||t3lib_div::_GP("presetWholeTable")?" checked":"").'>'.$this->fw("Import the whole file '".basename($actionParts[1])."' directly (ignores selections above):").'<BR>
03512 
03513                                                                 ';
03514                                                                 $form = $this->getUpdateDbFormWrap($action_type, $content);
03515                                                                 $this->message($tLabel,"Select tables to import","
03516                                                                 This is an overview of the CREATE TABLE definitions in the SQL file.
03517                                                                 Select which tables you want to dump to the database.
03518                                                                 Any table you choose dump to the database is dropped from the database first, so you'll loose all data in existing tables.
03519                                                                 ".$form,1,1);
03520                                                         } else {
03521                                                                 $this->message($tLabel,"No tables","
03522                                                                 There seems to be no CREATE TABLE definitions in the SQL file.
03523                                                                 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.
03524                                                                 ",3,1);
03525                                                         }
03526                                                 }
03527                                         }
03528                                 break;
03529                                 case "view":
03530                                         if (@is_file($actionParts[1]))  {
03531                                                 $tLabel="Import SQL dump";
03532                                                         // Getting statement array from
03533                                                 $sqlContent = t3lib_div::getUrl($actionParts[1]);
03534                                                 $statements = $this->getStatementArray($sqlContent,1);
03535                                                 $maxL=1000;
03536                                                 $strLen = strlen($sqlContent);
03537                                                 $maxlen = 200+($maxL-t3lib_div::intInRange(($strLen-20000)/100,0,$maxL));
03538 //                                              debug($maxlen);
03539                                                 if (count($statements)) {
03540                                                         reset($statements);
03541                                                         $out='';
03542                                                         while(list(,$statement)=each($statements))      {
03543                                                                 $out.=nl2br(htmlspecialchars(t3lib_div::fixed_lgd($statement,$maxlen)).chr(10).chr(10));
03544                                                         }
03545                                                 }
03546                                                 $this->message($tLabel,"Content of ".basename($actionParts[1]),$out,1);
03547                                         }
03548                                 break;
03549                                 case "adminUser":
03550                                         if ($whichTables["be_users"])   {
03551                                                 if (is_array($this->INSTALL["database_adminUser"]))     {
03552                                                         $username = ereg_replace("[^[:alnum:]_-]","",trim($this->INSTALL["database_adminUser"]["username"]));
03553                                                         $username = str_replace(" ","_",$username);
03554                                                         $pass = trim($this->INSTALL["database_adminUser"]["password"]);
03555                                                         if ($username && $pass) {
03556                                                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'be_users', 'username="'.$GLOBALS['TYPO3_DB']->quoteStr($username, 'be_users').'"');
03557                                                                 if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res))  {
03558 
03559                                                                         $insertFields = array(
03560                                                                                 'username' => $username,
03561                                                                                 'password' => md5($pass),
03562                                                                                 'admin' => 1,
03563                                                                                 'uc' => '',
03564                                                                                 'fileoper_perms' => 7,
03565                                                                                 'tstamp' => time(),
03566                                                                                 'crdate' => time()
03567                                                                         );
03568 
03569                                                                         $GLOBALS['TYPO3_DB']->exec_INSERTquery('be_users', $insertFields);
03570 
03571                                                                         $this->isBasicComplete($headCode);
03572 
03573                                                                         $this->message($headCode,"User created",'
03574                                                                         Username: <strong>'.htmlspecialchars($username).'</strong><BR>
03575                                                                         Password: <strong>'.htmlspecialchars($pass).'</strong><BR>'
03576                                                                         ,1,1);
03577                                                                 } else {
03578                                                                         $this->message($headCode,"Username not unique!",'
03579                                                                         The username, <strong>'.htmlspecialchars($username).'</strong>, was not unique.',2,1);
03580                                                                 }
03581                                                         }
03582                                                 }
03583                                                 $content = '
03584                                                 <input type="text" name="TYPO3_INSTALL[database_adminUser][username]"> username - unique, no space, lowercase<BR>
03585                                                 <input type="text" name="TYPO3_INSTALL[database_adminUser][password]"> password
03586                                                 ';
03587                                                 $form = $this->getUpdateDbFormWrap($action_type, $content);
03588                                                 $this->message($headCode,"Create admin user","
03589                                                 Enter username and password for a new admin user.<BR>
03590                                                 You should use this function only if there are no admin users in the database, for instance if this is a blank database.<BR>
03591                                                 After you've created the user, log in and add the rest of the user information, like email and real name.<BR>
03592                                                 <BR>
03593                                                 ".$form."
03594                                                 ",0,1);
03595                                         } else {
03596                                                 $this->message($headCode,"Required table not in database","
03597                                                 'be_users' must be a table in the database!
03598                                                 ",3,1);
03599                                         }
03600                                 break;
03601                                 case "UC":
03602                                         if ($whichTables["be_users"])   {
03603                                                 if (!strcmp($this->INSTALL["database_UC"],1))   {
03604                                                         $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_users', '', array('uc' => ''));
03605                                                         $this->message($headCode,"Clearing be_users.uc",'Done.',1);
03606                                                 }
03607                                                 $content = '
03608                                                 <input type="checkbox" name="TYPO3_INSTALL[database_UC]" value=1 checked> Clear be_users preferences ("uc" field)
03609                                                 ';
03610                                                 $form = $this->getUpdateDbFormWrap($action_type, $content);
03611                                                 $this->message($headCode,"Clear user preferences","
03612                                                 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>
03613                                                 This may come in handy in rare cases where that configuration may be corrupt.<BR>
03614                                                 Clearing this will clear all user settings from the 'Setup' module.<BR>
03615                                                 <BR>
03616                                                 ".$form);
03617                                         } else {
03618                                                 $this->message($headCode,"Required table not in database","
03619                                                 'be_users' must be a table in the database!
03620                                                 ",3);
03621                                         }
03622                                 break;
03623                                 case "cache":
03624                                         $tableListArr = explode(",","cache_pages,cache_pagesection,cache_hash,--div--,sys_log,sys_history,--div--,be_sessions,fe_sessions,fe_session_data".
03625                                                 (t3lib_extMgm::isLoaded("indexed_search") ? ",--div--,index_words,index_rel,index_phash,index_grlist,index_section,index_fulltext" : "").
03626                                                 (t3lib_extMgm::isLoaded("tt_products") ? ",--div--,sys_products_orders,sys_products_orders_mm_tt_products" : "").
03627                                                 (t3lib_extMgm::isLoaded("direct_mail") ? ",--div--,sys_dmail_maillog" : "").
03628                                                 (t3lib_extMgm::isLoaded("sys_stat") ? ",--div--,sys_stat" : "")
03629                                         );
03630 
03631                                         if (is_array($this->INSTALL["database_clearcache"]))    {
03632                                                 $qList=array();
03633                                                 reset($tableListArr);
03634                                                 while(list(,$table)=each($tableListArr))        {
03635                                                         if ($table!="--div--")  {
03636                                                                 $table_c = TYPO3_OS=="WIN" ? strtolower($table) : $table;
03637                                                                 if ($this->INSTALL["database_clearcache"][$table] && $whichTables[$table_c])    {
03638                                                                         $GLOBALS['TYPO3_DB']->exec_DELETEquery($table, '');
03639                                                                         $qList[] = $table;
03640                                                                 }
03641                                                         }
03642                                                 }
03643                                                 if (count($qList))      {
03644                                                         $this->message($headCode,"Clearing cache",'
03645                                                         The following tables were emptied:<BR><BR>
03646                                                         '.implode($qList,"<BR>")
03647                                                         ,1);
03648                                                 }
03649                                         }
03650                                                 // Count entries and make checkboxes
03651                                         $labelArr = array(
03652                                                 "cache_pages" => "Pages",
03653                                                 "cache_pagesection" => "TS template related information",
03654                                                 "cache_hash" => "Multipurpose md5-hash cache",
03655                                                 "sys_log" => "Backend action logging",
03656                                                 "sys_stat" => "Page hit statistics",
03657                                                 "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.",
03658                                                 "be_sessions" => "Backend User sessions",
03659                                                 "fe_sessions" => "Frontend User sessions",
03660                                                 "fe_session_data" => "Frontend User sessions data",
03661                                                 "sys_dmail_maillog" => "Direct Mail log",
03662                                                 "sys_products_orders" => "tt_product orders",
03663                                                 "sys_products_orders_mm_tt_products" => "relations between tt_products and sys_products_orders"
03664                                         );
03665 
03666                                         $checkBoxes=array();
03667                                         $countEntries=array();
03668                                         reset($tableListArr);
03669                                         while(list(,$table)=each($tableListArr))        {
03670                                                 if ($table!="--div--")  {
03671                                                         $table_c = TYPO3_OS=="WIN" ? strtolower($table) : $table;
03672                                                         if ($whichTables[$table_c])     {
03673                                                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, '');
03674                                                                 list($countEntries[$table]) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
03675                                                                         // Checkboxes:
03676                                                                 $checkBoxes[]= '<input type="checkbox" name="TYPO3_INSTALL[database_clearcache]['.$table.']" value="1"'.($this->INSTALL["database_clearcache"][$table]||$_GET["PRESET"]["database_clearcache"][$table]?" checked":"").'> <strong>'.$table.'</strong> ('.$countEntries[$table].' rows) - '.$labelArr[$table];
03677                                                         }
03678                                                 } else {
03679                                                                 $checkBoxes[]=  '<HR>';
03680                                                 }
03681                                         }
03682 
03683                                         $content = implode("<BR>",$checkBoxes)."<BR><BR>";
03684 
03685                                         $form = $this->getUpdateDbFormWrap($action_type, $content);
03686                                         $this->message($headCode,"Clear out selected tables",'
03687                                         Pressing this button will delete all records from the selected tables.<BR>
03688                                         <BR>
03689                                         '.$form.'
03690                                         ');
03691                                 break;
03692                         }
03693                 }
03694 
03695                 echo $this->outputWrapper($this->printAll());
03696         }
03697 
03703         function isBackendAdminUser() {
03704                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'be_users', 'admin');
03705                 $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
03706                 return current($row);
03707         }
03708 
03714         function isStaticTemplates()    {
03715                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'static_template', '');
03716                 $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
03717                 return current($row);
03718         }
03719 
03726         function isBasicComplete($tLabel)       {
03727                 if ($this->mode=="123") {
03728                         $tables = $this->getListOfTables();
03729 
03730                         if (count($tables))     {
03731                                 $beuser = $this->isBackendAdminUser();
03732                                 $static = $this->isStaticTemplates();
03733                         }
03734                         if (count($tables) && $beuser && $static)       {
03735                                 $mode123Imported=1;
03736                                 $this->message($tLabel,"Basic Installation Completed",nl2br($this->messageBasicFinished()),-1,1);
03737                                 $this->message($tLabel,"Security Risk!",nl2br($this->securityRisk().$this->alterPasswordForm()),2,1);
03738                         } else {
03739                                 $this->message($tLabel,"Still missing something?",nl2br("
03740                                 You may be missing one of these points before your TYPO3 installation is complete:
03741 
03742                                 ".(count($tables)?"":"- You haven't imported any tables yet.
03743                                 ")
03744                                 .($static?"":"- You haven't imported the static_template table.
03745                                 ")
03746                                 .($beuser?"":"- You haven't created an admin-user yet.
03747                                 ")
03748                                 ."
03749 
03750                                 You you're about to import a database with a complete site in it, these three points should be met.
03751                                 "),-1,1);
03752                         }
03753                 }
03754                 return $mode123Imported;
03755         }
03756 
03766         function generateUpdateDatabaseForm($type, $arr_update, $arr_remove, $action_type)      {
03767                 switch($type)   {
03768                         case "get_form":
03769                                 $content="";
03770                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update["add"],"Add fields");
03771                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update["change"],"Changing fields",1,0,$arr_update["change_currentValue"]);
03772                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove["change"],"Remove unused fields (rename with prefix)",$this->setAllCheckBoxesByDefault,1);
03773                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove["drop"],"Drop fields (really!)",$this->setAllCheckBoxesByDefault);
03774 
03775                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update["create_table"],"Add tables");
03776                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove["change_table"],"Removing tables (rename with prefix)",$this->setAllCheckBoxesByDefault,1,$arr_remove["tables_count"],1);
03777                                 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove["drop_table"],"Drop tables (really!)",$this->setAllCheckBoxesByDefault,0,$arr_remove["tables_count"],1);
03778 
03779                                 $form = $this->getUpdateDbFormWrap($action_type, $content);
03780                                 return $form;
03781                         break;
03782                         default:
03783 
03784                         break;
03785                 }
03786         }
03787 
03796         function getUpdateDbFormWrap($action_type, $content, $label="Write to database")        {
03797                 $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.'">';
03798                 return $form;
03799         }
03800 
03809         function displayFields($arr, $pre=0, $label="") {
03810                 $out="";
03811                 $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>';
03812                 if (is_array($arr))     {
03813                         reset($arr);
03814                         while(list($fieldname, $fieldContent)=each($arr))       {
03815                                 if ($pre)       {
03816                                         $fieldContent = '<pre>'.trim($fieldContent).'</pre>';
03817                                 } else {
03818                                         $fieldContent = $this->fw($fieldContent);
03819                                 }
03820                                 $out.='<tr><td bgcolor="#ABBBB4">'.$this->fw($fieldname).'</td><td bgcolor="#ABBBB4">'.$fieldContent.'</td></tr>';
03821                         }
03822                 }
03823                 $out= '<table border=0 cellpadding=0 cellspacing=0>'.$out.'</table>';
03824                 return $out;
03825         }
03826 
03834         function displayFieldComp($arr, $arr_db)        {
03835                 $out="";
03836                 $out.='<tr><td bgcolor="#9BA1A8" align=center><strong>'.$this->fw("Field name:").'</strong></td>
03837                         <td bgcolor="#9BA1A8" align=center><strong>'.$this->fw("Suggested value from \$TCA:").'</strong></td>
03838                         <td bgcolor="#9BA1A8" align=center><strong>'.$this->fw("Actual value from database:").'</strong></td>
03839                         </tr>';
03840                 if (is_array($arr))     {
03841                         reset($arr);
03842                         while(list($fieldname, $fieldContent)=each($arr))       {
03843                                         // This tries to equalize the types tinyint and int
03844                                 $str1 = $fieldContent;
03845                                 $str2 = trim($arr_db[$fieldname]);
03846                                 $str1 = str_replace("tinyint(3)","tinyint(4)",$str1);
03847                                 $str2 = str_replace("tinyint(3)","tinyint(4)",$str2);
03848                                 $str1 = str_replace("int(10)","int(11)",$str1);
03849                                 $str2 = str_replace("int(10)","int(11)",$str2);
03850                                         // Compare:
03851                                 if (strcmp($str1,$str2))        {
03852                                         $bgColor=' bgcolor="#ABBBB4"';
03853                                 } else {
03854                                         $bgColor=' bgcolor="#D9D5C9"';
03855                                 }
03856                                 $fieldContent = $this->fw($fieldContent);
03857                                 $fieldContent_db = $this->fw($arr_db[$fieldname]);
03858                                 $out.='<tr>
03859                                         <td bgcolor="#D9D5C9">'.$this->fw($fieldname).'</td>
03860                                         <td'.$bgColor.'>'.$fieldContent.'</td>
03861                                         <td'.$bgColor.'>'.$fieldContent_db.'</td>
03862                                         </tr>';
03863                         }
03864                 }
03865                 $out= '<table border=0 cellpadding=2 cellspacing=2>'.$out.'</table>';
03866                 return $out;
03867         }
03868 
03876         function displaySuggestions($arr, $excludeList="")      {
03877                 $out="";
03878                 $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>';
03879                 $fC=0;
03880                 if (is_array($arr))     {
03881                         reset($arr);
03882                         while(list($fieldname, $fieldContent)=each($arr))       {
03883                                 if (!t3lib_div::inList($excludeList,$fieldname) && substr($fieldname,0,strlen($this->deletedPrefixKey))!=$this->deletedPrefixKey && substr($fieldname,-1)!=".") {
03884                                         $fieldContent = $this->fw($fieldContent);
03885                                         if ($arr[$fieldname."."])       {
03886                                                 $fieldContent.= '<HR>';
03887                                                 $fieldContent.= '<pre>'.trim($arr[$fieldname."."]).'</pre>';
03888                                         }
03889                                         $out.='<tr><td bgcolor="#ABBBB4">'.$this->fw($fieldname).'</td><td bgcolor="#ABBBB4">'.$fieldContent.'</td></tr>';
03890                                         $fC++;
03891                                 }
03892                         }
03893                 }
03894                 $out= '<table border=0 cellpadding=2 cellspacing=2>'.$out.'</table>';
03895                 return array($out,$fC);
03896         }
03897 
03906         function compareDatabaseAndTCA($FDsrc, $TCA, $onlyFields=0)     {
03907                 $extraArr=array();
03908                 if (is_array($FDsrc))   {
03909                         reset($FDsrc);
03910                         while(list($table,$info)=each($FDsrc))  {
03911                                 if (!isset($TCA[$table]))       {
03912                                         if (!$onlyFields)       {
03913                                                 $extraArr[$table]=$info;                // If the table was not in the FDcomp-array, the result array is loaded with that table.
03914                                                 $extraArr[$table]["whole_table"]=1;
03915                                                 unset($extraArr[$table]["keys"]);
03916                                         }
03917                                 } else {
03918                                         $theKey="fields";
03919                                         $excludeListArr=array();
03920                                         if (is_array($TCA[$table]["ctrl"]["enablecolumns"]))    $excludeListArr[]=$TCA[$table]["ctrl"]["enablecolumns"];
03921                                         $excludeListArr[]=$TCA[$table]["ctrl"]["tstamp"];
03922                                         $excludeListArr[]=$TCA[$table]["ctrl"]["sortby"];
03923                                         $excludeListArr[]=$TCA[$table]["ctrl"]["delete"];
03924                                         $excludeListArr[]=$TCA[$table]["ctrl"]["cruser_id"];
03925                                         $excludeListArr[]=$TCA[$table]["ctrl"]["crdate"];
03926                                         $excludeListArr[]="uid";
03927                                         $excludeListArr[]="pid";
03928                                         if ($table=="pages")    {
03929                                                 $excludeListArr[]="perms_userid";
03930                                                 $excludeListArr[]="perms_groupid";
03931                                                 $excludeListArr[]="perms_user";
03932                                                 $excludeListArr[]="perms_group";
03933                                                 $excludeListArr[]="perms_everybody";
03934                                         }
03935                                         if ($table=="sys_dmail")        {
03936                                                 $excludeListArr[]="scheduled";
03937                                                 $excludeListArr[]="scheduled_begin";
03938                                                 $excludeListArr[]="scheduled_end";
03939                                                 $excludeListArr[]="query_info";
03940                                         }
03941 
03942                                         if (is_array($info[$theKey]))   {
03943                                                 reset($info[$theKey]);
03944                                                 while(list($fieldN,$fieldC)=each($info[$theKey]))       {
03945                                                         if (!isset($TCA[$table]["columns"][$fieldN]) && !in_array($fieldN,$excludeListArr))     {
03946                                                                 $extraArr[$table][$theKey][$fieldN] = $info["fields"][$fieldN];
03947                                                                 $extraArr[$table][$theKey][$fieldN."."]=$this->suggestTCAFieldDefinition($fieldN,$fieldC);
03948                                                         }
03949                                                 }
03950                                         }
03951                                 }
03952                         }
03953                 }
03954                 return array("extra"=>$extraArr);
03955         }
03956 
03964         function compareTCAandDatabase($TCA, $FDcomp)   {
03965                 $extraArr=array();
03966                 $matchingArr=array();
03967                 if (is_array($TCA))     {
03968                         reset($TCA);
03969                         while(list($table)=each($TCA))  {
03970                                 $info=$TCA[$table];
03971                                 if (!isset($FDcomp[$table]))    {
03972 //                                      $extraArr[$table]=$info;                // If the table was not in the FDcomp-array, the result array is loaded with that table.
03973                                         $extraArr[$table]["whole_table"]=1;
03974                                 } else {
03975                                         reset($info["columns"]);
03976                                         while(list($fieldN,$fieldC)=each($info["columns"]))     {
03977                                                 $fieldDef = $this->suggestFieldDefinition($fieldC);
03978                                                 if (!is_array($fieldDef))       {
03979                                                         if (!isset($FDcomp[$table]["fields"][$fieldN])) {
03980                                                                 $extraArr[$table]["fields"][$fieldN]=$fieldDef;
03981                                                         } else {
03982                                                                 $matchingArr[$table]["fields"][$fieldN]=$fieldDef;
03983                                                         }
03984                                                 }
03985                                         }
03986                                 }
03987                         }
03988                 }
03989                 return array("extra"=>$extraArr, "matching"=>$matchingArr);
03990         }
03991 
03998         function suggestFieldDefinition($fieldInfo)     {
03999                 $out="";
04000                 switch($fieldInfo["config"]["type"])    {
04001                         case "input":
04002                                 if (ereg("date|time|int|year",$fieldInfo["config"]["eval"]))    {
04003                                         $us=ereg("date|time",$fieldInfo["config"]["eval"]) ? " unsigned" : "";
04004                                         $out = "int(11)".$us." NOT NULL default '0'";
04005                                 } else {
04006                                         $max = intval($fieldInfo["config"]["max"]);
04007                                         if ($max>0 && $max<200) {
04008                                                 $out = "varchar(".$max.") NOT NULL default ''";
04009                                         } else {
04010                                                 $out = "tinytext NOT NULL";
04011                                         }
04012                                 }
04013                         break;
04014                         case "text":
04015                                 $out = "text NOT NULL";
04016                         break;
04017                         case "check":
04018                                 if (is_array($fieldInfo["config"]["items"]) && count($fieldInfo["config"]["items"])>8)  {
04019                                         $out = "int(11) unsigned NOT NULL default '0'";
04020                                 } else {
04021                                         $out = "tinyint(3) unsigned NOT NULL default '0'";
04022                                 }
04023                         break;
04024                         case "radio":
04025                                 if (is_array($fieldInfo["config"]["items"]))    {
04026                                         $out = $this->getItemArrayType($fieldInfo["config"]["items"]);
04027                                 } else {
04028                                         $out = "ERROR: Radiobox did not have items!";
04029                                 }
04030                         break;
04031                         case "group":
04032                                 if ($fieldInfo["config"]["internal_type"]=="db")        {
04033                                         $max = t3lib_div::intInRange($fieldInfo["config"]["maxitems"],1,10000);
04034                                         if (count(explode(",",$fieldInfo["config"]["allowed"]))>1)      {
04035                                                 $len = $max*(10+1+5+1);         // Tablenames are 10, "_" 1, uid's 5, comma 1
04036                                                 $out=$this->getItemBlobSize($len);
04037                                         } elseif ($max<=1) {
04038                                                 $out = "int(11) unsigned NOT NULL default '0'";
04039                                         } else {
04040                                                 $len = $max*(5+1);              // uid's 5, comma 1
04041                                                 $out=$this->getItemBlobSize($len);
04042                                         }
04043                                 }
04044                                 if ($fieldInfo["config"]["internal_type"]=="file")      {
04045                                         $max = t3lib_div::intInRange($fieldInfo["config"]["maxitems"],1,10000);
04046                                         $len = $max*(30+1);             // Filenames is 30+ chars....
04047                                         $out=$this->getItemBlobSize($len);
04048                                 }
04049                         break;
04050                         case "select":
04051                                 $max = t3lib_div::intInRange($fieldInfo["config"]["maxitems"],1,10000);
04052                                 if ($max<=1)    {
04053                                         if ($fieldInfo["config"]["foreign_table"])      {
04054                                                 $out = "int(11) unsigned NOT NULL default '0'";
04055                                         } else {
04056                                                 $out = $this->getItemArrayType($fieldInfo["config"]["items"]);
04057                                         }
04058                                 } else {
04059                                                 // five chars (special=10) + comma:
04060                                         $len = $max*(($fieldInfo["config"]["special"]?10:5)+1);
04061                                         $out=$this->getItemBlobSize($len);
04062                                 }
04063                         break;
04064                         default:
04065                         break;
04066                 }
04067                 return $out?$out:$fieldInfo;
04068         }
04069 
04076         function getItemArrayType($arr) {
04077                 if (is_array($arr))     {
04078                         reset($arr);
04079                         $type[]=0;
04080                         $intSize[]=0;
04081                         while(list(,$item)=each($arr))  {
04082                                 if (!t3lib_div::testInt($item[1]) && $item[1]!="--div--")       {
04083                                         $type[]=strlen($item[1]);
04084                                 } else {
04085                                         $intSize[]=$item[1];
04086                                 }
04087                         }
04088                         $us = min($intSize)>=0 ? " unsigned" : "";
04089                         if (max($type)>0)       {
04090                                 $out = "varchar(".max($type).") NOT NULL default ''";
04091                         } elseif (max($intSize)>(!$us?127:255)) {
04092                                 $out = "int(11)".$us." NOT NULL default '0'";
04093                         } else {
04094                                 $out = "tinyint(3)".$us." NOT NULL default '0'";
04095                         }
04096                 }
04097                 return $out;
04098         }
04099 
04106         function getItemBlobSize($len)  {
04107                 return ($len>255 ? "tiny" : "")."blob NOT NULL";
04108         }
04109 
04117         function suggestTCAFieldDefinition($fieldName,$fieldInfo)       {
04118                 list($type,$len) = split(" |\(|\)",$fieldInfo,3);
04119                 switch($type)   {
04120                         case "int":
04121 $out='
04122 "'.$fieldName.'" => Array (
04123         "label" => "'.strtoupper($fieldName).':",
04124         "exclude" => 0,
04125         "config" => Array (
04126                 "type" => "input",
04127                 "size" => "8",
04128                 "max" => "20",
04129                 "eval" => "date",
04130                 "default" => "0",
04131                 "checkbox" => "0"
04132         )
04133 ),
04134 
04135 ----- OR -----
04136 
04137 "'.$fieldName.'" => Array (
04138         "label" => "'.strtoupper($fieldName).':",
04139         "exclude" => 0,
04140         "config" => Array (
04141                 "type" => "select",
04142                 "items" => Array (
04143                         Array("[nothing]", 0),
04144                         Array("Extra choice! Only negative values here.", -1),
04145                         Array("__Divider:__", "--div--")
04146                 ),
04147                 "foreign_table" => "[some_table_name]"
04148         )
04149 ),';
04150                         break;
04151                         case "varchar":
04152                                 if ($len>10)    {
04153                                         $out='
04154 "'.$fieldName.'" => Array (
04155         "label" => "'.strtoupper($fieldName).':",
04156         "exclude" => 0,
04157         "config" => Array (
04158                 "type" => "input",
04159                 "size" => "8",
04160                 "max" => "'.$len.'",
04161                 "eval" => "trim",
04162                 "default" => ""
04163         )
04164 ),';
04165                                 } else {
04166                                         $out='
04167 "'.$fieldName.'" => Array (
04168         "label" => "'.strtoupper($fieldName).':",
04169         "exclude" => 0,
04170         "config" => Array (
04171                 "type" => "select",
04172                 "items" => Array (
04173                         Array("Item number 1", "key1"),
04174                         Array("Item number 2", "key2"),
04175                         Array("-----", "--div--"),
04176                         Array("Item number 3", "key3")
04177                 ),
04178                 "default" => "1"
04179         )
04180 ),';
04181                                 }
04182                         break;
04183                         case "tinyint":
04184                                         $out='
04185 "'.$fieldName.'" => Array (
04186         "label" => "'.strtoupper($fieldName).':",
04187         "exclude" => 0,
04188         "config" => Array (
04189                 "type" => "select",
04190                 "items" => Array (
04191                         Array("Item number 1", "1"),
04192                         Array("Item number 2", "2"),
04193                         Array("-----", "--div--"),
04194                         Array("Item number 3", "3")
04195                 ),
04196                 "default" => "1"
04197         )
04198 ),
04199 
04200 ----- OR -----
04201 
04202 "'.$fieldName.'" => Array (
04203         "label" => "'.strtoupper($fieldName).':",
04204         "exclude" => 0,
04205         "config" => Array (
04206                 "type" => "check",
04207                 "default" => "1"
04208         )
04209 ),';
04210                         break;
04211                         case "tinytext":
04212 $out='
04213 "'.$fieldName.'" => Array (
04214         "label" => "'.strtoupper($fieldName).':",
04215         "exclude" => 0,
04216         "config" => Array (
04217                 "type" => "input",
04218                 "size" => "40",
04219                 "max" => "255",
04220                 "eval" => "",
04221                 "default" => ""
04222         )
04223 ),';
04224                         break;
04225                         case "text":
04226                         case "mediumtext":
04227 $out='
04228 "'.$fieldName.'" => Array (
04229         "label" => "'.strtoupper($fieldName).':",
04230         "config" => Array (
04231                 "type" => "text",
04232                 "cols" => "48",
04233                 "rows" => "5"
04234         )
04235 ),';
04236                         break;
04237                         default:
04238                                 $out='
04239 "'.$fieldName.'" => Array (
04240         "label" => "'.strtoupper($fieldName).':",
04241         "exclude" => 0,
04242         "config" => Array (
04243                 "type" => "input",
04244                 "size" => "30",
04245                 "max" => "",
04246                 "eval" => "",
04247                 "default" => ""
04248         )
04249 ),';
04250                         break;
04251                 }
04252                 return $out?$out:$fieldInfo;
04253         }
04254 
04260         function includeTCA()   {
04261                 global $TCA;
04262 
04263                 include (TYPO3_tables_script ? PATH_typo3conf.TYPO3_tables_script : PATH_t3lib."stddb/tables.php");
04264 
04265                         // Extension additions
04266                 if ($GLOBALS["TYPO3_LOADED_EXT"]["_CACHEFILE"]) {
04267                         include(PATH_typo3conf.$GLOBALS["TYPO3_LOADED_EXT"]["_CACHEFILE"]."_ext_tables.php");
04268                 } else {
04269                         include(PATH_t3lib."stddb/load_ext_tables.php");
04270                 }
04271 
04272                 if (TYPO3_extTableDef_script)   {
04273                         include (PATH_typo3conf.TYPO3_extTableDef_script);
04274                 }
04275 
04276                 reset($TCA);
04277                 while(list($table)=each($TCA))  {
04278                         t3lib_div::loadTCA($table);
04279                 }
04280         }
04281 
04282 
04283 
04284 
04285 
04286 
04287 
04288 
04289         /**********************
04290          *
04291          * GENERAL FUNCTIONS
04292          *
04293          **********************/
04294 
04302         function linkIt($url,$link="")  {
04303                 return '<a href="'.$url.'" target="_blank">'.($link?$link:$url).'</a>';
04304         }
04305 
04309         function message($head, $short_string="", $long_string="", $type=0, $force=0)   {               // type: -1=OK sign, 0=message, 1=notification, 2=warning , 3=error
04310                 if (!$force && $this->mode=="123" && $type<2)   {return;}       // Return directly if mode-123 is enabled.
04311 
04312                 if ($type==3)   {$this->fatalError=1;}
04313                 if ($this->messageFunc_nl2br)   {
04314                         $long_string = nl2br(trim($long_string));
04315                 } else {
04316                         $long_string = trim($long_string);
04317                 }
04318                 if (!$this->silent)     $this->printSection($head, $short_string, $long_string, $type);
04319         }
04320 
04330         function printSection($head, $short_string, $long_string, $type)        {
04331                 $icon="";
04332 
04333                 $bgCol =' bgcolor=#D9D5C9';
04334                 switch($type)   {
04335                         case "3":
04336                                 $bgCol =' bgcolor=red';
04337                                 $icon = 't3lib/gfx/icon_fatalerror.gif';
04338                         break;
04339                         case "2":
04340 //                              $bgCol =' bgcolor=#9BA1A8';
04341                                 $icon = 't3lib/gfx/icon_warning.gif';
04342                         break;
04343                         case "1":
04344 //                              $bgCol =' bgcolor=#ABBBB4';
04345                                 $icon = 't3lib/gfx/icon_note.gif';
04346                         break;
04347                         case "-1":
04348 //                              $bgCol =' bgcolor=yellow';
04349                                 $icon = 't3lib/gfx/icon_ok.gif';
04350                         break;
04351                         default:
04352                                 $bgCol =' bgcolor='.t3lib_div::modifyHTMLcolor("#ABBBB4",+40,+30,+40);
04353                         break;
04354                 }
04355                 if (!trim($short_string))       {
04356                         $this->sections[$head][]="";
04357                 } else {
04358                         $this->sections[$head][]='
04359                         <tr><td'.$bgCol.' nowrap>'.($icon?'<img src="'.$this->backPath.$icon.'" width=18 height=16 align=top>':'').'<strong>'.$this->fw($short_string).'</strong></td></tr>'.(trim($long_string)?'
04360                         <tr><td>'.$this->fw($long_string).'<BR><BR></td></tr>' : '');
04361                 }
04362         }
04363 
04371         function fw($str,$size=1)       {
04372                 if ($GLOBALS["CLIENT"]["SYSTEM"]=="unix" && $GLOBALS["CLIENT"]["BROWSER"]=="konqu")     {
04373                         return '<font face="sans-serif" size='.($size+2).' color=black>'.$str.'</font>';
04374                 }
04375                 return '<font face="verdana,sans-serif" size='.$size.' color=black>'.$str.'</font>';
04376         }
04377 
04384         function fwheader($str) {
04385                 return '<div align=center><strong>'.$this->fw($str,3).'</strong></div>';
04386         }
04387 
04395         function wrapInCells($label,$content)   {
04396                 return '<tr><td valign=top nowrap><strong>'.$this->fw($label).'</strong></td><td>&nbsp;</td><td valign=top>'.$this->fw($content).'<BR></td></tr>';
04397         }
04398 
04404         function printAll()     {
04405                 reset($this->sections);
04406                 $out="";
04407                 while(list($header,$valArray)=each($this->sections))    {
04408                         $out.='
04409                         <tr><td>&nbsp;</td></tr>
04410                         <tr><td><strong><div align="center">'.$this->fw($header.":",2).'</div></strong></td></tr>
04411                         ';
04412                         $out.=implode($valArray,chr(10));
04413                 }
04414                 return '<table border=0 cellpadding=2 cellspacing=2>'.$out.'</table>';
04415         }
04416 
04423         function outputWrapper($content)        {
04424                 $out='
04425 <html>
04426 
04427 
04428 <STYLE TYPE="text/css">
04429 <!--
04430 A:link {text-decoration: none}
04431 A:visited {text-decoration: none}
04432 A:active {text-decoration: none}
04433 A:hover {color: #000066}
04434 -->
04435 </STYLE>
04436 '.$this->headerStyle.'
04437         <head>
04438                 <title>TYPO3 Install Tool</title>
04439                 '.($this->JSmessage?'
04440 <script language="javascript" type="text/javascript">alert(unescape(\''.rawurlencode($this->JSmessage).'\'));</script>
04441 
04442                 ':'').'
04443         </head>
04444         <body bgcolor="white" alink="maroon" link="maroon" vlink="maroon">'.$this->contentBeforeTable.'
04445                 <div align="center">
04446                 <table border=0 cellspacing=0 cellpadding=0 width=333 bgcolor="white">
04447                 <tr>
04448                         <td><img src="'.$this->backPath.'t3lib/gfx/typo3logo.gif" width=333 height=43 vspace=10 hspace=50></td>
04449                 </tr>
04450                 <tr>
04451                         <td bgcolor="black">
04452                                 <table width="100%" border=0 cellspacing=1 cellpadding=10>
04453                                         <tr>
04454                                                 <td bgcolor=#F4F0E8>
04455                                                 <font face="verdana,sans-serif" size=4 color=black><strong><div align="center">TYPO3 '.$GLOBALS["TYPO_VERSION"].' Install Tool</div></strong></font>
04456                                                 <font face="verdana,sans-serif" size=2 color=navy><strong><div align="center">Site: '.$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"].'</div></strong></font><br>
04457 
04458 '.($this->step?$this->stepHeader():$this->menu()).$content.'<HR>'.$this->note123().$this->endNotes().'
04459                                                 </td>
04460                                         </tr>
04461                                 </table>
04462                         </td>
04463                 </tr>
04464                 </table>
04465                 </div>
04466         </body>
04467 </html>';
04468                 return $out;
04469         }
04470 
04476         function menu() {
04477                 if (!$this->passwordOK) return;
04478 
04479                 reset($this->menuitems);
04480                 $c=0;
04481                 $out=array();
04482                 while(list($k,$v)=each($this->menuitems))       {
04483                         $bgColor = ($this->INSTALL["type"]==$k ? ' bgColor="#ABBBB4"' : ' bgColor="#F4F0E8"');
04484                         $c++;
04485                         $out[]='<tr><td'.$bgColor.'><a href="'.$this->scriptSelf.'?TYPO3_INSTALL[type]='.$k.($this->mode?"&mode=".rawurlencode($this->mode):"").'">'.$this->fw($c.': '.$v).'</a></td></tr>';
04486                 }
04487 
04488                 $code = '<table border=0 cellpadding=0 cellspacing=1>'.implode($out,chr(10)).'</table>';
04489                 $code = '<table border=0 cellpadding=0 cellspacing=0 bgColor="#ABBBB4"><tr><td>'.$code.'</td></tr></table>';
04490                 return '<div align="center">'.$code.'</div>';
04491         }
04492 
04498         function stepHeader()   {
04499                 $msg1='Type in your database parameters here:';
04500                 $msg2='Database';
04501                 $msg3='Import the database sql-file';
04502                 $msg4='You\'re done!';
04503                 $out='<img src="../t3lib/gfx/123_'.$this->step.'.png" width="402" height="73" border="0" alt="" usemap="#id123_print_Map">
04504 <MAP NAME="id123_print_Map">
04505 <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="'.$this->scriptSelf.'?mode='.$this->mode.'&step=go">
04506 <AREA title="'.$msg3.'" SHAPE="circle" ALT="" COORDS="234,36,32" HREF="'.$this->scriptSelf.'?mode='.$this->mode.'&step=3">
04507 <AREA title="'.$msg2.'" SHAPE="circle" ALT="" COORDS="136,37,30" HREF="'.$this->scriptSelf.'?mode='.$this->mode.'&step=2">
04508 <AREA title="'.$msg1.'" SHAPE="circle" ALT="" COORDS="40,36,29" HREF="'.$this->scriptSelf.'?mode='.$this->mode.'&step=1">
04509 </MAP>
04510 
04511 
04512                 <BR>';
04513                 $msg="";
04514                 switch(strtolower($this->step)) {
04515                         case 1:
04516                                 $msg=$msg1;
04517                         break;
04518                         case 2:
04519                                 $msg=$msg2;
04520                         break;
04521                         case 3:
04522                                 $msg=$msg3;
04523                         break;
04524                         case "go":
04525                                 $msg=$msg4;
04526                         break;
04527                         default:
04528                         break;
04529                 }
04530                 $out.='<BR><div align="center"><strong>'.$this->fw($msg,2).'</strong></div>';
04531 
04532                 return $out;
04533         }
04534 
04540         function note123()      {
04541                 if ($this->mode=="123") {
04542                         $c='<table border=0 cellpadding=0 cellspacing=0 width=100%>
04543                                 <tr><td bgcolor=#D9D5C9 nowrap><img src="../t3lib/gfx/icon_note.gif" width=18 height=16 align=top><strong>'.$this->fontTag1.'NOTICE: Install Tool is running in \'123\' mode. <a href="'.$this->scriptSelf.'">Click here to disable.</a></font></strong></td></tr>
04544                         </table>';
04545                         return $c;
04546                 }
04547         }
04548 
04554         function endNotes()     {
04555                 if ($this->mode!="123" && $this->passwordOK)    {
04556                         $c.="OS detected: <strong>".(TYPO3_OS=="WIN"?"WIN":"UNIX")."</strong><BR>";
04557                         $c.="UNIX/CGI detected: <strong>".(php_sapi_name()=="cgi" ? "YES" : "NO")."</strong><BR>";
04558                         $c.="PATH_thisScript: <strong>".PATH_thisScript."</strong><BR>";
04559                         $c.="<BR>";
04560                         $c.="<a href='../index.php' target='install_backend'>Backend admin in new window.</a><BR>";
04561                         $c.="<a href='../../index.php' target='install_frontend'>Frontend website in new window.</a><BR>";
04562 
04563                         return $this->fw($c);
04564                 }
04565         }
04566 
04573         function convertByteSize($bytes)        {
04574                 if (stristr($bytes,"m"))        {
04575                         $bytes=doubleval($bytes)*1024*1024;
04576                 } elseif (stristr($bytes,"k"))  {
04577                         $bytes=doubleval($bytes)*1024;
04578                 }
04579                 return $bytes;
04580         }
04581 
04587         function securityRisk() {
04588                 $c="This script is a <strong>great danger to the security of TYPO3</strong> if you don't secure it somehow.
04589                         We suggest one of the following:
04590 
04591                         - change the password as defined by the md5-hash in TYPO3_CONF_VARS[BE][installToolPassword].
04592                         - delete the folder 'typo3/install/' with this script in or just insert an 'exit;' line in the script-file there.
04593                         - password protect the 'typo3/install/' folder, eg. with a .htaccess file
04594 
04595                         The TYPO3_CONF_VARS[BE][installToolPassword] is always active, but choosing one of the other options will improve security and is recommended highly.
04596                 ";
04597                 return $c;
04598         }
04599 
04605         function alterPasswordForm()    {
04606                         $content = '<form action="'.$this->scriptSelf.'?TYPO3_INSTALL[type]=extConfig" method="POST">
04607                         Enter new password:
04608                         <input type="password" name="TYPO3_INSTALL[extConfig][BE][installToolPassword]"><BR>Enter again:
04609                         <input type="password" name="installToolPassword_check">
04610                         <input type="hidden" name="installToolPassword_md5" value=1>
04611                         <input type="submit" value="Set new password"><br>
04612                         </form>';
04613                         return $content;
04614         }
04615 
04621         function messageBasicFinished() {
04622                 $msg ="
04623                                 Apparently you have completed the basic setup of the TYPO3 database.
04624                                 Now you can choose between these options:
04625 
04626                                 - <a href='../../index.php'><strong>Go to the frontend pages</strong></a>
04627 
04628                                 - <a href='../index.php?u=admin&p=password'><strong>Go to the backend login</strong></a>
04629                                  (username may be: <i>admin</i>, password may be: <i>password</i>.)
04630 
04631                                 - <a href='".$this->scriptSelf."'><strong>Continue to configure TYPO3</strong></a> (Recommended).
04632                                  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!
04633                                 ";
04634                 return $msg;
04635         }
04636 
04643         function setScriptName($type)   {
04644                 $value = $this->scriptSelf."?TYPO3_INSTALL[type]=".$type.($this->mode?"&mode=".rawurlencode($this->mode):"").($this->step?"&step=".rawurlencode($this->step):"");
04645                 return $value;
04646         }
04647 
04656         function formWidth($size=48,$textarea=0,$styleOverride="") {
04657                         // Input or text-field attribute (size or cols)
04658                 $wAttrib = $textarea?"cols":"size";
04659                 if (!$GLOBALS["CLIENT"]["FORMSTYLE"])   {       // If not setting the width by style-attribute
04660                         $size = ceil($size*1);
04661                         $retVal = ' '.$wAttrib.'="'.$size.'"';
04662                 } else {        // Setting width by style-attribute. "cols" MUST be avoided with NN6+
04663                         $pixels = ceil($size*10);
04664                         $retVal = $styleOverride ? ' style="'.$styleOverride.'"' : ' style="width:'.$pixels.'px;"';
04665                 }
04666                 return $retVal;
04667         }
04668 
04677         function formWidthText($size=48,$styleOverride="",$wrap="") {
04678                 $wTags = $this->formWidth($size,1,$styleOverride);
04679                         // 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...
04680                 if (strtolower(trim($wrap))!="off" && $GLOBALS["CLIENT"]["BROWSER"]=="net" && $GLOBALS["CLIENT"]["VERSION"]>=5) {
04681                         $wTags.=' cols="'.$size.'"';
04682                 }
04683                 return $wTags;
04684         }
04685 }
04686 
04687 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/install/mod/class.tx_install.php'])    {
04688         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/install/mod/class.tx_install.php']);
04689 }
04690 ?>


Généré par Les spécialistes TYPO3 avec  doxygen 1.4.6