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

class.tx_install.php

Go to the documentation of this file.
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 writeable!","
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 writeable or not
01665          //  0 = not required, if it exists the dir should be writeable
01666          //  1 = required, don't has to be writeable
01667          //  2 = required, has to be writeable
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." writeable","",-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 writeable","
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 writeable!","
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 ?>

Generated on Sun Oct 3 01:06:00 2004 for TYPO3core 3.7.0 dev by  doxygen 1.3.8-20040913