*** empty log message ***
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_install.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2003 Kasper Skaarhoj (kasper@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Used to setup localconf.php and verify the TYPO3 installation
29 * This script should reduce the number of questions on the mailing with more than 50%... :-)
30 *
31 * $Id$
32 *
33 * @author Kasper Skaarhoj <kasper@typo3.com>
34 */
35 /**
36 * [CLASS/FUNCTION INDEX of SCRIPT]
37 *
38 *
39 *
40 * 165: class t3lib_install
41 * 243: function t3lib_install()
42 * 320: function checkPassword($uKey)
43 * 380: function init()
44 * 540: function stepOutput()
45 * 791: function checkTheConfig()
46 * 822: function typo3conf_edit()
47 * 932: function phpinformation()
48 *
49 * SECTION: typo3temp/ manager
50 * 1033: function typo3TempManager()
51 * 1134: function getSelectorOptions($deleteType,$tt="")
52 *
53 * SECTION: CONFIGURATION FORM
54 * 1167: function generateConfigForm($type="")
55 * 1239: function getDefaultConfigArrayComments($string,$mainArray=array(),$commentArray=array())
56 *
57 * SECTION: CHECK CONFIGURATION FUNCTIONS
58 * 1292: function checkConfiguration()
59 * 1481: function check_mail($cmd="")
60 * 1504: function checkExtensions()
61 * 1567: function checkDirs()
62 * 1636: function checkImageMagick($paths)
63 * 1697: function _checkImageMagickGifCapability($file)
64 * 1739: function _checkImageMagick_getVersion($file)
65 * 1752: function checkDatabase()
66 * 1814: function setupGeneral($cmd="")
67 * 1979: function writeToLocalconf_control($lines="",$dontOutputContent=0)
68 * 2027: function outputExitBasedOnStep($content)
69 * 2042: function checkForBadString($string)
70 * 2057: function setValueInLocalconfFile(&$line_array, $variable, $value)
71 * 2104: function slashValueForSingleDashes($value)
72 * 2115: function setLabelValueArray($arr,$type)
73 * 2143: function getFormElement($labels,$values,$fieldName,$default,$msg="")
74 * 2163: function getDatabaseList()
75 * 2192: function setupGeneralCalculate()
76 * 2261: function getGDPartOfPhpinfo()
77 * 2280: function isTTF($phpinfo="")
78 *
79 * SECTION: ABOUT the isXXX functions.
80 * 2329: function isGD()
81 * 2340: function isGIF()
82 * 2352: function isJPG()
83 * 2363: function isPNG()
84 * 2375: function ImageTypes()
85 * 2386: function getGDSoftwareInfo()
86 * 2398: function generallyAboutConfiguration()
87 *
88 * SECTION: IMAGE processing
89 * 2458: function checkTheImageProcessing()
90 * 2937: function isExtensionEnabled($ext, $headCode, $short)
91 * 2953: function displayTwinImage ($imageFile, $IMcommands=array(), $note="")
92 * 3024: function getTwinImageMessage($message, $label_1="", $label_2="")
93 * 3040: function formatImCmds($arr)
94 * 3061: function imagemenu()
95 *
96 * SECTION: DATABASE analysing
97 * 3103: function checkTheDatabase()
98 * 3702: function isBackendAdminUser()
99 * 3714: function isStaticTemplates()
100 * 3727: function isBasicComplete($tLabel)
101 * 3763: function getListOfTables()
102 * 3783: function generateUpdateDatabaseForm($type, $arr_update, $arr_remove, $action_type)
103 * 3813: function getUpdateDbFormWrap($action_type, $content, $label="Write to database")
104 * 3829: function generateUpdateDatabaseForm_checkboxes($arr,$label,$checked=1,$iconDis=0,$currentValue=array(),$cVfullMsg=0)
105 * 3863: function preformUpdateQueries($arr,$keyArr)
106 * 3884: function displayFields($arr, $pre=0, $label="")
107 * 3909: function displayFieldComp($arr, $arr_db)
108 * 3951: function displaySuggestions($arr, $excludeList="")
109 * 3980: function getCreateTables($statements, $insertCountFlag=0)
110 * 4005: function getTableInsertStatements($statements, $table)
111 * 4031: function getStatementArray($sqlcode,$removeNonSQL=0,$query_regex="")
112 * 4067: function assembleFieldDefinition($row)
113 * 4094: function getFieldDefinitions_database($database)
114 * 4132: function getFieldDefinitions_sqlContent($sqlContent)
115 * 4172: function getDatabaseExtra($FDsrc, $FDcomp)
116 * 4210: function compareDatabaseAndTCA($FDsrc, $TCA, $onlyFields=0)
117 * 4268: function compareTCAandDatabase($TCA, $FDcomp)
118 * 4303: function getUpdateSuggestions($diffArr,$keyList="extra,diff")
119 * 4405: function suggestFieldDefinition($fieldInfo)
120 * 4483: function getItemArrayType($arr)
121 * 4513: function getItemBlobSize($len)
122 * 4524: function suggestTCAFieldDefinition($fieldName,$fieldInfo)
123 * 4667: function includeTCA()
124 *
125 * SECTION: GENERAL FUNCTIONS
126 * 4709: function linkIt($url,$link="")
127 * 4737: function printSection($head, $short_string, $long_string, $type)
128 * 4778: function fw($str,$size=1)
129 * 4791: function fwheader($str)
130 * 4802: function wrapInCells($label,$content)
131 * 4811: function printAll()
132 * 4830: function outputWrapper($content)
133 * 4883: function menu()
134 * 4905: function stepHeader()
135 * 4947: function note123()
136 * 4961: function endNotes()
137 * 4980: function convertByteSize($bytes)
138 * 4994: function securityRisk()
139 * 5012: function alterPasswordForm()
140 * 5028: function messageBasicFinished()
141 * 5050: function setScriptName($type)
142 * 5063: function formWidth($size=48,$textarea=0,$styleOverride="")
143 * 5084: function formWidthText($size=48,$styleOverride="",$wrap="")
144 *
145 * TOTAL FUNCTIONS: 89
146 * (This index is automatically created/updated by the extension "extdeveval")
147 *
148 */
149
150
151
152
153
154
155
156
157
158 /**
159 * Used to setup localconf.php and verify the TYPO3 installation
160 *
161 * @author Kasper Skaarhoj <kasper@typo3.com>
162 * @package TYPO3
163 * @subpackage t3lib
164 */
165 class t3lib_install {
166 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()
167 var $getGD_end_string = '</TABLE>'; // Used to identify the end of the GD section (found with getGD_start_string) in the output from phpinfo()
168 var $getTTF_string = 'with TTF library'; // Used to identify whether TTF-lib is included with GD
169 var $getTTF_string_alt = 'with freetype'; // Used to identify whether TTF-lib is included with GD
170 var $action = ""; // The url that calls this script
171 var $scriptSelf = "index.php"; // The url that calls this script
172 var $fontTag2='<font face="verdana,sans-serif" size=2 color=black>';
173 var $fontTag1='<font face="verdana,sans-serif" size=1 color=black>';
174 var $updateIdentity = "TYPO3 Install Tool";
175 var $headerStyle ='';
176 var $contentBeforeTable="";
177 var $setAllCheckBoxesByDefault=0;
178
179 var $allowFileEditOutsite_typo3conf_dir=0;
180
181 var $INSTALL =array(); // In constructor: is set to global GET/POST var TYPO3_INSTALL
182 var $messages = array(); // Used to set (error)messages from the executing functions like mail-sending, writing Localconf and such
183 var $checkIMlzw = 0; // If set, lzw capabilities of the available ImageMagick installs are check by actually writing a gif-file and comparing size
184 var $checkIM = 0; // If set, ImageMagick is checked.
185 var $localconf_addLinesOnly=0; // If this is set, modifications to localconf.php is done by adding new lines to the array only. If unset, existing values are recognized and changed.
186 var $localconf_editPointToken="INSTALL SCRIPT EDIT POINT TOKEN - all lines after this points may be changed by the install script!"; // If set and addLinesOnly is disabled, lines will be change only if they are after this token (on a single line!) in the file
187 var $allowUpdateLocalConf=0; // If set, this class will allow the user to update the localconf.php file. Is set true in the init.php file.
188 var $dumpImCommands=1; // If set, the image Magick commands are always outputted in the image processing checker
189 var $deletedPrefixKey="zzz_deleted_"; //
190 var $backPath="../";
191 var $mysqlVersion = "3.22"; // 3.22 or 3.23 If set to 3.23, then the expected format of the incoming sql-dump files are changed. 'DEFAULT' and 'NOT NULL' are reversed in order and 'DEFAULT' is lowercase. Also auto_incremented fields are without default definitions.
192 var $mode = ""; // If set to "123" then only most vital information is displayed.
193 var $step = 0; // If set to 1,2,3 or GO it signifies various functions.
194
195 // internal
196 var $passwordOK=0; // This is set, if the password check was ok. The function init() will exit if this is not set
197 var $silent=1; // If set, the check routines don't add to the message-array
198 var $messageFunc_nl2br=1;
199 var $setLocalconf=0; // Used to indicate that a value is change in the line-array of localconf and that it should be written.
200 var $sections=array(); // Used to gather the message information.
201 var $fatalError=0; // This is set if some error occured that will definitely prevent TYpo3 from running.
202 var $sendNoCacheHeaders=1;
203 var $config_array = array( // Flags are set in this array if the options are available and checked ok.
204 "gd"=>0,
205 "gd_gif"=>0,
206 "gd_png"=>0,
207 "gd_jpg"=>0,
208 "freetype" => 0,
209 "safemode" => 0,
210 "dir_typo3temp" => 0,
211 "dir_temp" => 0,
212 "im_versions" => array(),
213 "im" => 0,
214 "sql.safe_mode_user" => "",
215 "mysqlConnect" => 0,
216 "no_database" => 0
217 );
218 var $typo3temp_path="";
219
220 var $menuitems = array(
221 "config" => "Basic Configuration",
222 "database" => "Database Analyser",
223 "images" => "Image Processing",
224 "extConfig" => "All Configuration",
225 "typo3temp" => "typo3temp/",
226 "phpinfo" => "phpinfo()",
227 "typo3conf_edit" => "Edit files in typo3conf/",
228 "about" => "About"
229 );
230 var $cookie_name = "Typo3InstallTool";
231 var $JSmessage = '';
232
233
234
235
236
237
238 /**
239 * Constructor
240 *
241 * @return [type] ...
242 */
243 function t3lib_install() {
244 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.");
245 if (!t3lib_extMgm::isLoaded("install")) die("Install Tool is not loaded as an extension.<BR>You must add the key 'install' to the list of installed extensions in localconf.php, TYPO3_CONF_VARS[EXT][extList].");
246
247 if ($this->sendNoCacheHeaders) {
248 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
249 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
250 header("Expires: 0");
251 header("Cache-Control: no-cache, must-revalidate");
252 header("Pragma: no-cache");
253 }
254
255 // ****************************
256 // Initializing incoming vars.
257 // ****************************
258 $this->INSTALL = t3lib_div::GPvar("TYPO3_INSTALL");
259 $this->mode = t3lib_div::GPvar("mode");
260 $this->step = t3lib_div::GPvar("step");
261 if ($GLOBALS["HTTP_GET_VARS"]["TYPO3_INSTALL"]["type"]) $this->INSTALL["type"] = $GLOBALS["HTTP_GET_VARS"]["TYPO3_INSTALL"]["type"];
262
263 if ($this->step==3) {
264 $this->INSTALL["type"]="database";
265 }
266
267 if ($this->mode=="123") {
268 $tempItems = $this->menuitems;
269 unset($this->menuitems);
270 $this->menuitems["config"] = $tempItems["config"];
271 $this->menuitems["database"] = $tempItems["database"];
272 if (!$this->INSTALL["type"] || !isset($this->menuitems[$this->INSTALL["type"]])) $this->INSTALL["type"] = "config";
273 } else {
274 if (!$this->INSTALL["type"] || !isset($this->menuitems[$this->INSTALL["type"]])) $this->INSTALL["type"] = "about";
275 }
276
277 $this->action = $this->scriptSelf."?TYPO3_INSTALL[type]=".$this->INSTALL["type"].($this->mode?"&mode=".rawurlencode($this->mode):"").($this->step?"&step=".rawurlencode($this->step):"");
278 $this->typo3temp_path = PATH_site."typo3temp/";
279
280
281 // ****************
282 // Check password
283 // ****************
284 // Getting a unique session key, used to encode the session-access cookie later...
285 $uKey = $GLOBALS["HTTP_COOKIE_VARS"][$this->cookie_name."_key"];
286 if (!$uKey) {
287 $uKey = md5(uniqid(microtime()));
288 SetCookie($this->cookie_name."_key", $uKey, 0, "/"); // Cookie is set
289
290 $this->JSmessage='SECURITY:
291 Make sure to protect the Install Tool with another password than "joh316".
292 Better yet you can add a die() function call to typo3/install/index.php after usage.
293
294 IF THE INSTALL TOOL CRASHES...
295 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.
296 Workaround: Open the file typo3/t3lib/class.t3lib_install.php, go to line 2042, make the function isPNG() 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.
297 On behalf of PHP we regret this inconvenience.
298 ';
299
300 }
301 // Check if the password from TYPO3_CONF_VARS combined with uKey matches the sKey cookie. If not, ask for password.
302 $sKey = $GLOBALS["HTTP_COOKIE_VARS"][$this->cookie_name];
303
304 if (md5($GLOBALS["TYPO3_CONF_VARS"]["BE"]["installToolPassword"]."|".$uKey) == $sKey || $this->checkPassword($uKey)) {
305 $this->passwordOK=1;
306 }
307
308 if ($GLOBALS["CLIENT"]["SYSTEM"]=="unix" && $GLOBALS["CLIENT"]["BROWSER"]=="konqu") {
309 $this->fontTag2='<font face="verdana,sans-serif" size=4 color=black>';
310 $this->fontTag1='<font face="verdana,sans-serif" size=3 color=black>';
311 }
312 }
313
314 /**
315 * Returns true if submitted password is ok. Else displays a form in which to enter password.
316 *
317 * @param [type] $uKey: ...
318 * @return [type] ...
319 */
320 function checkPassword($uKey) {
321 $p = t3lib_div::GPvar("password");
322
323 if ($p && md5($p)==$GLOBALS["TYPO3_CONF_VARS"]["BE"]["installToolPassword"]) {
324 $sKey = md5($GLOBALS["TYPO3_CONF_VARS"]["BE"]["installToolPassword"]."|".$uKey);
325 SetCookie($this->cookie_name, $sKey, 0, "/");
326
327 // Sending warning email
328 $wEmail = $GLOBALS["TYPO3_CONF_VARS"]["BE"]["warning_email_addr"];
329 if ($wEmail) {
330 $subject="Install Tool Login at '".$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"]."'";
331 $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").")";
332 mail($wEmail,
333 $subject,
334 $email_body,
335 "From: TYPO3 Install Tool WARNING <>"
336 );
337 }
338 return true;
339 } else {
340 $this->messageFunc_nl2br=0;
341 $this->silent=0;
342 $content = '<form action="'.$this->action.'" method="POST">
343 <input type="password" name="password"><BR>
344 <input type="submit" value="Log in"><br>
345 <br>
346
347 '.$this->fw('The Install Tool Password is <i>not</i> the admin password of TYPO3.<BR>
348 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.'.
349 ($p?"<BR><BR>The password you just tried has this md5-value: <BR><BR>".md5($p):"")
350 ).'
351 </form>';
352
353 $this->message("Password", "Enter the Install Tool Password", $content,3);
354 echo $this->outputWrapper($this->printAll());
355 // Bad password, send warning:
356 if ($p) {
357 $wEmail = $GLOBALS["TYPO3_CONF_VARS"]["BE"]["warning_email_addr"];
358 if ($wEmail) {
359 $subject="Install Tool Login ATTEMPT at '".$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"]."'";
360 $email_body="There has been a Install Tool login attempt at TYPO3 site '".$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"]."' (".t3lib_div::getIndpEnv("HTTP_HOST").").
361 Password tried was '".$p."'
362 REMOTE_ADDR was '".t3lib_div::getIndpEnv("REMOTE_ADDR")."' (".t3lib_div::getIndpEnv("REMOTE_HOST").")";
363 mail($wEmail,
364 $subject,
365 $email_body,
366 "From: TYPO3 Install Tool WARNING <>"
367 );
368 }
369 }
370
371 return false;
372 }
373 }
374
375 /**
376 * Calling function that checks system, IM, GD, dirs, database and lets you alter localconf.php
377 *
378 * @return [type] ...
379 */
380 function init() {
381 if (!defined("PATH_typo3")) exit; // Must be called after inclusion of init.php (or from init.php)
382 if (!$this->passwordOK) exit;
383 // debug($GLOBALS["HTTP_COOKIE_VARS"]);
384
385 // Setting stuff...
386 $this->check_mail();
387 $this->setupGeneral();
388 $this->generateConfigForm();
389 if (count($this->messages)) debug($this->messages);
390
391 if ($this->step) {
392 echo $this->outputWrapper($this->stepOutput());
393 } else {
394 // Menu...
395 switch($this->INSTALL["type"]) {
396 case "images":
397 $this->checkIM=1;
398 $this->checkTheConfig();
399 $this->silent=0;
400 $this->checkTheImageProcessing();
401 break;
402 case "database":
403 $this->checkTheConfig();
404 $this->silent=0;
405 $this->checkTheDatabase();
406 break;
407 case "config":
408 $this->silent=0;
409 $this->checkIM=1;
410 $this->message("About configuration","How to configure TYPO3",$this->generallyAboutConfiguration());
411 $this->checkTheConfig();
412
413 $ext = "Write config to localconf.php";
414 if ($this->fatalError) {
415 if ($this->config_array["no_database"] || !$this->config_array["mysqlConnect"]) {
416 $this->message($ext, "Database not configured yet!", "
417 You need to specify database username, password and host as one of the first things.
418 Next you'll have to select a database to use with TYPO3.
419 Use the form below:
420 ",2);
421 } else {
422 $this->message($ext, "Fatal error encountered!", "
423 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!
424 You should also check all warnings that may appear.
425 ",2);
426 }
427 } elseif ($this->mode=="123") {
428 if (!$this->fatalError) {
429 $this->message($ext, "Basic configuration completed", '
430 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.
431
432 <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>
433 ',-1,1);
434 }
435 }
436 $this->message($ext, "Very Important: Changing Image Processing settings", "
437 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.
438 The problem is solved by <a href=\"".$this->setScriptName("typo3temp")."\">clearing the typo3temp/ folder</a>. Also make sure to clear the cache_pages table.
439 ",1,1);
440 $this->message($ext, "Update localconf.php", "
441 This form updates the localconf.php file with the suggested values you see below. The values are based on the analysis above.
442 You can change the values in case you have alternatives to the suggested defaults.
443 By this final step you will configure TYPO3 for immediate use provided that you have no fatal errors left above."
444 .$this->setupGeneral("get_form"),0,1);
445
446 echo $this->outputWrapper($this->printAll());
447 // debug($this->config_array);
448 break;
449 case "extConfig":
450 $this->silent=0;
451
452 $this->generateConfigForm("get_form");
453
454 $content = $this->printAll();
455 $content = '<form action="'.$this->action.'" method="POST">'.$content.'<input type="submit" value="Write to localconf.php"><BR><BR>
456 '.$this->fw("<strong>NOTICE: </strong>By clicking this button, localconf.php is updated with new values for the parameters listed above!<BR>").'
457 </form>';
458 echo $this->outputWrapper($content);
459 break;
460 case "typo3temp":
461 $this->checkTheConfig();
462 $this->silent=0;
463 $this->typo3TempManager();
464 break;
465 case "phpinfo":
466 $this->silent=0;
467 $this->phpinformation();
468 break;
469 case "typo3conf_edit":
470 $this->silent=0;
471 $this->typo3conf_edit();
472 break;
473 case "about":
474 default:
475 $this->silent=0;
476 $this->message("About", "Warning - very important!", $this->securityRisk().$this->alterPasswordForm(),2);
477
478 $this->message("About", "Using this script", "
479 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.
480 There are three primary steps for you to take:
481
482 <strong>1: Basic Configuration</strong>
483 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.
484 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.
485 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.
486
487 <strong>2: Database Analyser</strong>
488 In this step you can either install a new database or update the database from any previous TYPO3 version.
489 You can also get an overview of extra/missing fields/tables in the database compared to a raw sql-file.
490 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.
491
492 <strong>3: Image Processing</strong>
493 This step is a visual guide to verify your configuration of the image processing software.
494 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.
495
496 <strong>4: All Configuration</strong>
497 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.
498
499 <strong>5: typo3temp/</strong>
500 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.
501 ");
502
503 $this->message("About", "Why is this script stand-alone?", "
504 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.
505 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!
506 ");
507
508
509 $headCode="Header legend";
510 $this->message($headCode, "Just information", "
511 This is a simple message with some information about something.
512 ");
513 $this->message($headCode, "Check was successful", "
514 Indicates that something was checked and returned an expected result.
515 ",-1);
516 $this->message($headCode, "Notice!", "
517 Indicates that something is important to be aware of.
518 This does <em>not</em> indicate an error.
519 ",1);
520 $this->message($headCode, "Warning!", "
521 Indicates that something may very well cause trouble and you should definitely look into it before proceeding.
522 This indicates a <em>potential</em> error.
523 ",2);
524 $this->message($headCode, "Error!", "
525 Indicates that something is definitely wrong and that TYPO3 will most likely not perform as expected if this problem is not solved.
526 This indicates an actual error.
527 ",3);
528
529 echo $this->outputWrapper($this->printAll());
530 break;
531 }
532 }
533 }
534
535 /**
536 * Controls the step 1-2-3-go process
537 *
538 * @return [type] ...
539 */
540 function stepOutput() {
541 $this->checkTheConfig();
542 $error_missingConnect='<br>
543 '.$this->fontTag2.'<img src="../t3lib/gfx/icon_fatalerror.gif" width=18 height=16 class="absmiddle">
544 There is no connection to the database!<br>
545 (Username: <i>'.TYPO3_db_username.'</i>, Password: <i>'.TYPO3_db_password.'</i>, Host: <i>'.TYPO3_db_host.'</i>).<BR>
546 <br>
547 <strong>Go to Step 1</strong> and enter a proper username/password!</font>
548 <br>
549 <br>
550 ';
551 $error_missingDB='<br>
552 '.$this->fontTag2.'<img src="../t3lib/gfx/icon_fatalerror.gif" width=18 height=16 class="absmiddle">
553 There is no access to the database (<i>'.TYPO3_db.'</i>)!<br>
554 <br>
555 <strong>Go to Step 2</strong> and select an accessible database!</font>
556 <br>
557 <br>
558 ';
559
560 $whichTables=$this->getListOfTables();
561 $dbInfo='
562 <table border=0 cellpadding=1 cellspacing=0>
563 <tr>
564 <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>
565 </tr>
566 <tr>
567 <td valign="top" nowrap>'.$this->fontTag1.'Username:</font></td>
568 <td valign="top" nowrap><strong>'.$this->fontTag1.''.TYPO3_db_username.'</font></strong></td>
569 </tr>
570 <tr>
571 <td valign="top" nowrap>'.$this->fontTag1.'Password:</font></td>
572 <td valign="top" nowrap><strong>'.$this->fontTag1.''.TYPO3_db_password.'</font></strong></td>
573 </tr>
574 <tr>
575 <td valign="top" nowrap>'.$this->fontTag1.'Host:</font></td>
576 <td valign="top" nowrap><strong>'.$this->fontTag1.''.TYPO3_db_host.'</font></strong></td>
577 </tr>
578 <tr>
579 <td valign="top" nowrap>'.$this->fontTag1.'Database:</font></td>
580 <td valign="top" nowrap><strong>'.$this->fontTag1.''.TYPO3_db.'</font></strong></td>
581 </tr>
582 <tr>
583 <td valign="top" nowrap>'.$this->fontTag1.'# of tables:</font></td>
584 <td valign="top" nowrap><strong>'.$this->fontTag1.''.(count($whichTables)?'<font color=red>'.count($whichTables).'</font>':count($whichTables)).'</font></strong></td>
585 </tr>
586 </table>
587 ';
588 $error_emptyDB='<br>
589 '.$this->fontTag2.'<img src="../t3lib/gfx/icon_fatalerror.gif" width=18 height=16 class="absmiddle">
590 The database is still empty. There are no tables!<br>
591 <br>
592 <strong>Go to Step 3</strong> and import a database!</font>
593 <br>
594 <br>
595 ';
596
597 switch(strtolower($this->step)) {
598 case 1:
599 $msg='
600 <br>
601 <br>
602 <table border=0>
603 <form action="'.$this->action.'" method="POST">
604 <tr>
605 <td valign="top" nowrap><strong>
606 '.$this->fontTag2.'Username:</font></strong>
607 </td>
608 <td> &nbsp;
609 </td>
610 <td valign="top">
611 '.$this->fontTag2.'
612 <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_username]" value="'.TYPO3_db_username.'"></font><BR>
613 </td>
614 </tr>
615 <tr>
616 <td valign="top" nowrap><strong>
617 '.$this->fontTag2.'Password:</font></strong>
618 </td>
619 <td> &nbsp;
620 </td>
621 <td valign="top">
622 '.$this->fontTag2.'
623 <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_password]" value="'.TYPO3_db_password.'"></font><BR>
624 </td>
625 </tr>
626 <tr>
627 <td valign="top" nowrap><strong>
628 '.$this->fontTag2.'Host:</font></strong>
629 </td>
630 <td> &nbsp;
631 </td>
632 <td valign="top">
633 '.$this->fontTag2.'
634 <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_host]" value="'.(TYPO3_db_host?TYPO3_db_host:'localhost').'"></font><BR>
635 </td>
636 </tr>
637 <tr>
638 <td valign="top" nowrap><strong>
639 '.$this->fontTag1.'</font></strong>
640 </td>
641 <td> &nbsp;
642 </td>
643 <td valign="top">
644 '.$this->fontTag1.'<BR>
645 <input type="hidden" name="step" value="2">
646 <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>
647 </td>
648 </tr>
649 </form>
650 </table>
651 <br>
652 <br>
653 ';
654 break;
655 case 2:
656 if ($result = @mysql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
657 $dbArr = $this->getDatabaseList();
658 reset($dbArr);
659 $options="";
660 $options.='<option value="">[ SELECT DATABASE ]</option>';
661 $dbIncluded=0;
662 while(list(,$dbname)=each($dbArr)) {
663 $options.='<option value="'.htmlspecialchars($dbname).'"'.($dbname==TYPO3_db?' selected':'').'>'.htmlspecialchars($dbname).'</option>';
664 if ($dbname==TYPO3_db) $dbIncluded=1;
665 }
666 if (!$dbIncluded && TYPO3_db) {
667 $options.='<option value="'.htmlspecialchars(TYPO3_db).'" selected>'.htmlspecialchars(TYPO3_db).' (NO ACCESS!)</option>';
668 }
669 $select='<select name="TYPO3_INSTALL[localconf.php][typo_db]">'.$options.'</select>';
670 $msg='
671 <br>
672 <br>
673 <table border=0>
674 <form action="'.$this->action.'" method="POST">
675 <tr>
676 <td valign="top" nowrap><strong>
677 '.$this->fontTag2.'
678 You have two options:<br>
679 <br><br>
680
681 1: Select an existing <u>EMPTY</u> database:</font></strong>
682 </td>
683 </tr>
684 <tr>
685 <td valign="top">
686 '.$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>
687 </td>
688 </tr>
689 <tr>
690 <td valign="top" nowrap><br>
691 <br>
692 <strong>
693 '.$this->fontTag2.'2: Create new database (recommended):</font></strong>
694 </td>
695 </tr>
696 <tr>
697 <td valign="top">
698 '.$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>
699 </td>
700 </tr>
701 <tr>
702 <td valign="top"> <br>
703
704 '.$this->fontTag1.'<BR>
705 <input type="hidden" name="step" value="3">
706 <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>
707 </td>
708 </tr>
709 </form>
710 </table>
711 <br>
712 <br>
713 ';
714 } else {
715 $msg=$error_missingConnect;
716 }
717 break;
718 case 3:
719 if ($result = @mysql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
720 if (mysql_select_db(TYPO3_db)) {
721 $sFiles = t3lib_div::getFilesInDir(PATH_typo3conf,"sql",1,1);
722 reset($sFiles);
723 $opt='';
724 while(list(,$f)=each($sFiles)) {
725 $opt.='<option value="import|'.htmlspecialchars($f).'">'.htmlspecialchars(basename($f)).'</option>';
726 }
727
728
729 $content='
730 '.$this->fontTag2.'Database dumps in typo3conf/ directory:</font><BR>
731 <input type="hidden" name="TYPO3_INSTALL[database_import_all]" value=1>
732 <input type="hidden" name="step" value="">
733 <input type="hidden" name="goto_step" value="go">
734 <select name="TYPO3_INSTALL[database_type]">'.$opt.'</select><BR>';
735
736 $content = $this->getUpdateDbFormWrap("import", $content, "Import database");
737
738 $msg='
739 <br>
740 '.$dbInfo.'<br>
741 <br>
742 '.$content.'
743
744 ';
745
746 } else {
747 $msg=$error_missingDB;
748 }
749 } else {
750 $msg=$error_missingConnect;
751 }
752 break;
753 case "go":
754 if ($result = @mysql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
755 if (mysql_select_db(TYPO3_db)) {
756 if (count($whichTables)) {
757 $msg='
758 <br>
759 '.$this->fontTag2.'
760 '.nl2br($this->messageBasicFinished()).'
761 <br>
762 <hr>
763 <div align="center"><strong><img src="../t3lib/gfx/icon_warning.gif" hspace=5 width=18 height=16 class="absmiddle">IMPORTANT</strong></div><br>
764 <font size=1>'.nl2br($this->securityRisk()).'
765 <br>
766 <strong>Enter <a href="'.$this->scriptSelf.'">"Normal" mode for the Install Tool</a> to change this!</strong><br>
767
768 </font>
769 </font><BR>
770 ';
771 } else {
772 $msg=$error_emptyDB;
773 }
774 } else {
775 $msg=$error_missingDB;
776 }
777 } else {
778 $msg=$error_missingConnect;
779 }
780 break;
781 default:
782 break;
783 }
784 return $msg;
785 }
786
787 /**
788 * Calling the functions that checks the system
789 *
790 * @return [type] ...
791 */
792 function checkTheConfig() {
793 // Order important:
794 $this->checkDirs();
795 $this->checkConfiguration();
796 $this->checkExtensions();
797
798 if (TYPO3_OS=="WIN") {
799 $paths=array($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_path_lzw"], $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_path"], "c:\\php\\imagemagick\\", 'c:\\apache\\ImageMagick\\');
800 } else {
801 $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/");
802 }
803
804 asort($paths);
805 if (ini_get("safe_mode")) {
806 $paths=array(ini_get("safe_mode_exec_dir"),"/usr/local/php/bin/");
807 }
808 if ($this->INSTALL["checkIM"]["lzw"]) {
809 $this->checkIMlzw=1;
810 }
811 if ($this->INSTALL["checkIM"]["path"]) {
812 $paths[]=trim(stripslashes($this->INSTALL["checkIM"]["path"]));
813 }
814 if ($this->checkIM) $this->checkImageMagick($paths);
815 $this->checkDatabase();
816 }
817
818 /**
819 * [Describe function...]
820 *
821 * @return [type] ...
822 */
823 function typo3conf_edit() {
824 $EDIT_path = PATH_typo3conf; // default:
825 if ($this->allowFileEditOutsite_typo3conf_dir && $this->INSTALL["FILE"]["EDIT_path"]) {
826 if (t3lib_div::validPathStr($this->INSTALL["FILE"]["EDIT_path"]) && substr($this->INSTALL["FILE"]["EDIT_path"],-1)=="/") {
827 $tmp_path = PATH_site.$this->INSTALL["FILE"]["EDIT_path"];
828 if (is_dir($tmp_path)) {
829 $EDIT_path=$tmp_path;
830 } else {debug("'".$tmp_path."' was not dir");}
831 } else {
832 debug("BAD DIR_NAME (must be like t3lib/ or media/script/)");
833 }
834 }
835
836 $headCode = "Edit files in ".basename($EDIT_path)."/";
837 $this->contentBeforeTable="";
838
839 if ($this->INSTALL["SAVE_FILE"]) {
840 $save_to_file = $this->INSTALL["FILE"]["name"];
841 if (@is_file($save_to_file)) {
842 $save_to_file_md5 = md5($save_to_file);
843 if (isset($this->INSTALL["FILE"][$save_to_file_md5]) && t3lib_div::isFirstPartOfStr($save_to_file,$EDIT_path."") && substr($save_to_file,-1)!="~") {
844 $this->INSTALL["typo3conf_files"] = $save_to_file;
845 $save_fileContent = stripslashes($this->INSTALL["FILE"][$save_to_file_md5]);
846
847 if ($this->INSTALL["FILE"]["win_to_unix_br"]) {
848 $save_fileContent = str_replace(chr(13).chr(10),chr(10),$save_fileContent);
849 }
850 if ($this->INSTALL["FILE"]["backup"]) {
851 if (@is_file($save_to_file."~")) unlink($save_to_file."~");
852 rename($save_to_file,$save_to_file."~");
853 $this->contentBeforeTable.='Backup written to <strong>'.$save_to_file.'~</strong><BR>';
854 } else {
855 if (@is_file($save_to_file."~")) {
856 unlink($save_to_file."~");
857 $this->contentBeforeTable.='Backup REMOVED! (<strong>'.$save_to_file.'~</strong>)<BR>';
858 }
859 }
860
861 t3lib_div::writeFile($save_to_file,$save_fileContent);
862 $this->contentBeforeTable.='
863 File saved: <strong>'.$save_to_file.'</strong><BR>
864 MD5-sum: '.$this->INSTALL["FILE"]["prevMD5"].' (prev)<BR>
865 MD5-sum: '.md5($save_fileContent).' (new)<BR>
866 ';
867 }
868 }
869 }
870
871
872 // Filelist:
873 $typo3conf_files = t3lib_div::getFilesInDir($EDIT_path,"",1,1);
874 reset($typo3conf_files);
875 $lines=array();
876 $fileFound = 0;
877 while(list($k,$file)=each($typo3conf_files)) {
878 if ($this->INSTALL["typo3conf_files"] && !strcmp($this->INSTALL["typo3conf_files"],$file)) {
879 $wrap=array('<strong><font color=navy>','</font></strong>');
880 $fileFound = 1;
881 } else {$wrap=array();}
882 $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>';
883 }
884 $fileList='<table border=0 cellpadding=0 cellspacing=0>'.implode("",$lines).'</table>';
885 $fileList.="<BR>(".$EDIT_path.")";
886
887 if ($this->allowFileEditOutsite_typo3conf_dir) {
888 $fileList.='<BR><form action="'.$this->action.'" method="POST">
889 '.PATH_site.'<input type="text" name="TYPO3_INSTALL[FILE][EDIT_path]" value="'.$this->INSTALL["FILE"]["EDIT_path"].'"><input type="submit" name="" value="Set">
890 </form>';
891 }
892
893 if ($fileFound && @is_file($this->INSTALL["typo3conf_files"])) {
894 $this->headerStyle = '
895 <style type="text/css"><!--
896 SELECT {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
897 TEXTAREA {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
898 INPUT {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
899 //--></style>
900 ';
901
902 $fileContent = t3lib_div::getUrl($this->INSTALL["typo3conf_files"]);
903 $this->contentBeforeTable.= '<form action="'.$this->action.'" method="POST">
904 '.(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">
905 <BR>File: '.$this->INSTALL["typo3conf_files"].'
906 <BR>MD5-sum: '.md5($fileContent).'
907 <BR>
908
909 <input type="hidden" name="TYPO3_INSTALL[FILE][name]" value="'.$this->INSTALL["typo3conf_files"].'">
910 '.($this->allowFileEditOutsite_typo3conf_dir?'<input type="hidden" name="TYPO3_INSTALL[FILE][EDIT_path]" value="'.$this->INSTALL["FILE"]["EDIT_path"].'">':'').'
911 <input type="hidden" name="TYPO3_INSTALL[FILE][prevMD5]" value="'.md5($fileContent).'">
912 <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>
913 <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>
914 <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>
915 '.
916 '</form>';
917 }
918
919 if ($this->contentBeforeTable) {
920 $this->contentBeforeTable = $this->fw($this->contentBeforeTable);
921 }
922
923 $this->message($headCode,"Files in folder",$fileList);
924
925 echo $this->outputWrapper($this->printAll());
926 }
927
928 /**
929 * [Describe function...]
930 *
931 * @return [type] ...
932 */
933 function phpinformation() {
934 $headCode = "PHP information";
935
936 $sVar = t3lib_div::getIndpEnv("_ARRAY");
937 $sVar["CONST: PHP_OS"]=PHP_OS;
938 $sVar["CONST: TYPO3_OS"]=TYPO3_OS;
939 $sVar["CONST: PATH_thisScript"]=PATH_thisScript;
940 $sVar["CONST: php_sapi_name()"]=php_sapi_name();
941 $sVar["OTHER: TYPO3_VERSION"]=$GLOBALS["TYPO_VERSION"];
942 $sVar["OTHER: PHP_VERSION"]=phpversion();
943 $sVar["imagecreatefromgif()"]=function_exists("imagecreatefromgif");
944 $sVar["imagecreatefrompng()"]=function_exists("imagecreatefrompng");
945 $sVar["imagecreatefromjpeg()"]=function_exists("imagecreatefromjpeg");
946 $sVar["imagegif()"]=function_exists("imagegif");
947 $sVar["imagepng()"]=function_exists("imagepng");
948 $sVar["imagejpeg()"]=function_exists("imagejpeg");
949 $sVar["imagettftext()"]=function_exists("imagettftext");
950 $sVar["OTHER: IMAGE_TYPES"]=imagetypes();
951 $sVar["OTHER: memory_limit"]=get_cfg_var("memory_limit");
952
953 $gE_keys = explode(",","SERVER_PORT,SERVER_SOFTWARE,GATEWAY_INTERFACE,SCRIPT_NAME,PATH_TRANSLATED");
954 while(list(,$k)=each($gE_keys)) {
955 $sVar["SERVER: ".$k]=$GLOBALS["HTTP_SERVER_VARS"][$k];
956 }
957
958 $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");
959 while(list(,$k)=each($gE_keys)) {
960 $sVar["T3CV_GFX: ".$k]=$GLOBALS["TYPO3_CONF_VARS"]["GFX"][$k];
961 }
962
963 $debugInfo=array();
964 $debugInfo[]="### DEBUG SYSTEM INFORMATION - START ###";
965 reset($sVar);
966 while(list($kkk,$vvv)=each($sVar)) {
967 $debugInfo[]=str_pad(substr($kkk,0,20),20).": ".$vvv;
968 }
969 $debugInfo[]="### DEBUG SYSTEM INFORMATION - END ###";
970
971 $buf=$this->messageFunc_nl2br;
972 $this->messageFunc_nl2br=0;
973 $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>
974 <form action=""><textarea rows="10" '.$this->formWidthText(80,"","off").' wrap="OFF">'.t3lib_div::formatForTextarea(implode(chr(10),$debugInfo)).'</textarea></form>');
975 $this->messageFunc_nl2br=$buf;
976
977 $getEnvArray = array();
978 $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");
979 while(list(,$k)=each($gE_keys)) {
980 $getEnvArray[$k] = getenv($k);
981 }
982 $this->message($headCode,"t3lib_div::getIndpEnv()",t3lib_div::view_array(t3lib_div::getIndpEnv("_ARRAY")));
983 $this->message($headCode,"getenv()",t3lib_div::view_array($getEnvArray));
984 $this->message($headCode,"HTTP_ENV_VARS",t3lib_div::view_array($GLOBALS["HTTP_ENV_VARS"]));
985 $this->message($headCode,"HTTP_SERVER_VARS",t3lib_div::view_array($GLOBALS["HTTP_SERVER_VARS"]));
986 $this->message($headCode,"HTTP_COOKIE_VARS",t3lib_div::view_array($GLOBALS["HTTP_COOKIE_VARS"]));
987 $this->message($headCode,"HTTP_GET_VARS",t3lib_div::view_array($GLOBALS["HTTP_GET_VARS"]));
988
989 ob_start();
990 phpinfo();
991 $contents = explode("<body>",ob_get_contents());
992 ob_end_clean();
993 $contents = explode("</body>",$contents[1]);
994
995 $this->message($headCode,"phpinfo()",$contents[0]);
996
997
998
999 $this->headerStyle = '
1000 <style type="text/css"><!--
1001 a { text-decoration: none; }
1002 a:hover { text-decoration: underline; }
1003 h1 { font-family: verdana,arial, helvetica, sans-serif; font-size: 14pt; font-weight: bold;}
1004 h2 { font-family: verdana,arial, helvetica, sans-serif; font-size: 12pt; font-weight: bold;}
1005 body, td { font-family: verdana,arial, helvetica, sans-serif; font-size: 10pt; }
1006 th { font-family: verdana,arial, helvetica, sans-serif; font-size: 10pt; font-weight: bold; }
1007 //--></style>
1008 ';
1009
1010 echo $this->outputWrapper($this->printAll());
1011 }
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025 /*******************************
1026 *
1027 * typo3temp/ manager
1028 *
1029 *******************************/
1030
1031 /**
1032 * @return [type] ...
1033 */
1034 function typo3TempManager() {
1035 $headCode = "typo3temp/ directory";
1036 $this->message($headCode,"What is it?","
1037 TYPO3 uses this directory for temporary files, mainly processed and cached images.
1038 The filenames are very cryptic; They are unique representations of the file properties made by md5-hashing a serialized array with information.
1039 Anyway this directory may contain many thousand files and a lot of them may be of no use anymore.
1040
1041 With this test you can delete the files in this folder. When you do that, you should also clear the cache database tables afterwards.
1042 ");
1043
1044 if (!$this->config_array["dir_typo3temp"]) {
1045 $this->message("typo3temp/ directory","typo3temp/ not writeable!","
1046 You must make typo3temp/ write enabled before you can proceed with this test.
1047 ",2);
1048 echo $this->outputWrapper($this->printAll());
1049 return;
1050 }
1051
1052 // Run through files
1053 $fileCounter=0;
1054 $deleteCounter=0;
1055 $criteriaMatch=0;
1056 $tmap=array("day"=>1,"week"=>7,"month"=>30);
1057 $tt=$this->INSTALL["typo3temp_delete"];
1058 $action=$this->INSTALL["typo3temp_action"];
1059 $d = @dir($this->typo3temp_path);
1060 if (is_object($d)) {
1061 while($entry=$d->read()) {
1062 $theFile = $this->typo3temp_path.$entry;
1063 if (@is_file($theFile)) {
1064 $ok=0;
1065 $fileCounter++;
1066 if ($tt) {
1067 if (t3lib_div::testInt($tt)) {
1068 if (filesize($theFile) > $tt*1024) $ok=1;
1069 } else {
1070 if (fileatime($theFile) < time()-(intval($tmap[$tt])*60*60*24)) $ok=1;
1071 }
1072 } else {
1073 $ok=1;
1074 }
1075 if ($ok) {
1076 $hashPart=substr(basename($theFile),-14,10);
1077 if (!ereg("[^a-f0-9]",$hashPart)) { // This is a kind of check that the file being deleted has a 10 char hash in it
1078 if ($action && $deleteCounter<$action) {
1079 $deleteCounter++;
1080 unlink($theFile);
1081 } else {
1082 $criteriaMatch++;
1083 }
1084 }
1085 }
1086 }
1087 }
1088 $d->close();
1089 }
1090
1091
1092 $deleteType=array(
1093 "0" => "All",
1094 "day" => "Last access more than a day ago",
1095 "week" => "Last access more than a week ago",
1096 "month" => "Last access more than a month ago",
1097 "10" => "Filesize greater than 10 kb",
1098 "50" => "Filesize greater than 50 kb",
1099 "100" => "Filesize greater than 100 kb"
1100 );
1101 $actionType=array(
1102 "0" => "Don't delete, just display statistics",
1103 "100" => "Delete 100",
1104 "500" => "Delete 500",
1105 "1000" => "Delete 1000"
1106 );
1107 $content='<select name="TYPO3_INSTALL[typo3temp_delete]">'.$this->getSelectorOptions($deleteType,$tt).'</select>
1108 <br>
1109 Number of files at a time:
1110 <select name="TYPO3_INSTALL[typo3temp_action]">'.$this->getSelectorOptions($actionType).'</select>';
1111
1112 $form = '<form action="'.$this->action.'" method="POST">'.$content.'
1113
1114 <input type="submit" value="Execute">
1115 </form>
1116 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.';
1117
1118 $this->message($headCode,"Statestics","
1119 Number of temporary files: <strong>".($fileCounter-$deleteCounter)."</strong>
1120 Number matching '".htmlspecialchars($deleteType[$tt])."': <strong>".$criteriaMatch."</strong>
1121 Number deleted: <strong>".$deleteCounter."</strong>
1122 <BR>
1123 ".$form,1);
1124
1125 echo $this->outputWrapper($this->printAll());
1126 }
1127
1128 /**
1129 * [Describe function...]
1130 *
1131 * @param [type] $deleteType: ...
1132 * @param [type] $tt: ...
1133 * @return [type] ...
1134 */
1135 function getSelectorOptions($deleteType,$tt="") {
1136 $out="";
1137 if (is_array($deleteType)) {
1138 reset($deleteType);
1139 while(list($v,$l)=each($deleteType)) {
1140 $out.='<option value="'.htmlspecialchars($v).'"'.(!strcmp($v,$tt)?" selected":"").'>'.htmlspecialchars($l).'</option>';
1141 }
1142 }
1143 return $out;
1144 }
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158 /*******************************
1159 *
1160 * CONFIGURATION FORM
1161 *
1162 ********************************/
1163
1164 /**
1165 * @param [type] $type: ...
1166 * @return [type] ...
1167 */
1168 function generateConfigForm($type="") {
1169 switch($type) {
1170 case "get_form":
1171 $default_config_content = t3lib_div::getUrl(PATH_t3lib."config_default.php");
1172 $commentArr = $this->getDefaultConfigArrayComments($default_config_content);
1173 /*
1174 $localconf_content = t3lib_div::getUrl(PATH_typo3conf."localconf.php");
1175 $commentArr2 = $this->getConfigArrayComments($localconf_content);
1176 debug($commentArr2);
1177 */
1178 reset($GLOBALS["TYPO3_CONF_VARS"]);
1179 $this->messageFunc_nl2br=0;
1180 while(list($k,$va)=each($GLOBALS["TYPO3_CONF_VARS"])) {
1181 $ext="[".$k."]";
1182 $this->message($ext, '$TYPO3_CONF_VARS["'.$k.'"]',$commentArr[0][$k],1);
1183 while(list($vk,$value)=each($va)) {
1184 if (!is_array($value) && $this->checkForBadString($value)) {
1185 $k2="[".$vk."]";
1186 $description = trim($commentArr[1][$k][$vk]);
1187 $msg=$description."<BR><BR><em>".$ext.$k2." = ".htmlspecialchars(t3lib_div::fixed_lgd($value,60))."</em><BR>";
1188
1189 if (strstr($value,chr(10))) {
1190 // Never used at this point:
1191 $form='<textarea name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" cols=40 rows=5 wrap="off">'.htmlspecialchars($value).'</textarea>';
1192 } elseif (eregi("^boolean",$description)) {
1193 $form='<input type="hidden" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" value="0">';
1194 $form.='<input type="checkbox" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']"'.($value?" checked":"").' value="'.($value&&strcmp($value,"0")?htmlspecialchars($value):1).'">';
1195 } else {
1196 $form='<input type="text" size=40 name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" value="'.htmlspecialchars($value).'">';
1197 }
1198 $this->message($ext, $k2,$msg.$form);
1199 }
1200 }
1201 }
1202 break;
1203 default:
1204 if (is_array($this->INSTALL["extConfig"])) {
1205 reset($this->INSTALL["extConfig"]);
1206 $lines = $this->writeToLocalconf_control();
1207 while(list($k,$va)=each($this->INSTALL["extConfig"])) {
1208 if (is_array($GLOBALS["TYPO3_CONF_VARS"][$k])) {
1209 while(list($vk,$value)=each($va)) {
1210 if (isset($GLOBALS["TYPO3_CONF_VARS"][$k][$vk])) {
1211 $doit=1;
1212 if ($k=="BE" && $vk=="installToolPassword") {
1213 if ($value) {
1214 if (isset($GLOBALS["HTTP_POST_VARS"]["installToolPassword_check"]) && (!t3lib_div::GPvar("installToolPassword_check") || strcmp(t3lib_div::GPvar("installToolPassword_check"),$value))) {
1215 $doit=0;
1216 debug("ERROR: The two passwords did not match! The password was not changed.");
1217 }
1218 if (t3lib_div::GPvar("installToolPassword_md5")) $value =md5($value);
1219 } else $doit=0;
1220 }
1221 if ($doit && strcmp($GLOBALS["TYPO3_CONF_VARS"][$k][$vk],stripslashes($value))) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["'.$k.'"]["'.$vk.'"]', $value);
1222 }
1223 }
1224 }
1225 }
1226 $this->writeToLocalconf_control($lines);
1227 }
1228 break;
1229 }
1230 }
1231
1232 /**
1233 * [Describe function...]
1234 *
1235 * @param [type] $string: ...
1236 * @param [type] $mainArray: ...
1237 * @param [type] $commentArray: ...
1238 * @return [type] ...
1239 */
1240 function getDefaultConfigArrayComments($string,$mainArray=array(),$commentArray=array()) {
1241 $lines = explode(chr(10),$string);
1242 $in=0;
1243 $mainKey="";
1244 while(list(,$lc)=each($lines)) {
1245 $lc = trim($lc);
1246 if ($in) {
1247 if (!strcmp($lc,");")) {
1248 $in=0;
1249 } else {
1250 if (eregi('["\']([[:alnum:]_-]*)["\'][[:space:]]*=>(.*)',$lc,$reg)) {
1251 list(,$theComment)=explode("//",$reg[2],2);
1252 if (substr(strtolower(trim($reg[2])),0,5)=="array" && !strcmp($reg[1],strtoupper($reg[1]))) {
1253 $mainKey=trim($reg[1]);
1254 $mainArray[$mainKey]=trim($theComment);
1255 } elseif ($mainKey) {
1256 $commentArray[$mainKey][$reg[1]]=trim($theComment);
1257 }
1258 } else {
1259 //debug($lc,1);
1260 }
1261 }
1262 }
1263 if (!strcmp($lc,'$TYPO3_CONF_VARS = Array(')) {
1264 $in=1;
1265 }
1266 }
1267 return array($mainArray,$commentArray);
1268 }
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282 /*******************************
1283 *
1284 * CHECK CONFIGURATION FUNCTIONS
1285 *
1286 *******************************/
1287
1288 /**
1289 * Checking php.ini configuration and set appropriate messages and flags.
1290 *
1291 * @return [type] ...
1292 */
1293 function checkConfiguration() {
1294 $ext="php.ini configuration checked";
1295 $this->message($ext);
1296
1297 // *****************
1298 // Incoming values:
1299 // *****************
1300
1301 if (!get_cfg_var("track_vars")) {
1302 $this->message($ext, "Tracking Vars not set","
1303 <i>track_vars=".get_cfg_var("track_vars")."</i>
1304 Tracking vars are essential for almost any PHP-application.
1305 The fact that the value is not set may not impose a problem, because it's always set in version 4.03+ of PHP.
1306 ",1);
1307 } else $this->message($ext, "Tracking Vars enabled","",-1);
1308
1309 /*
1310 if (!get_cfg_var("allow_url_fopen")) {
1311 $this->message($ext, "fopen() not allowed to open URL's","
1312 <i>allow_url_fopen=".get_cfg_var("allow_url_fopen")."</i>
1313 allow_url_fopen should be enabled if you want TYPO3 to connect to the online TYPO3 Extension Repository.
1314 ",2);
1315 } else $this->message($ext, "fopen() allowed to open URL's","",-1);
1316 */
1317
1318 // Includepath
1319 $incPaths = t3lib_div::trimExplode(TYPO3_OS=="WIN"?";":":", ini_get("include_path"));
1320 if (!in_array(".",$incPaths)) {
1321 $this->message($ext, "Current dir (./) is not in include path!","
1322 <i>include_path=".ini_get("include_path")."</i>
1323 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.
1324 ",1);
1325 } else $this->message($ext, "Current dir in include path","",-1);
1326 if (!ini_get("register_globals")) {
1327 $this->message($ext, "Register globals disabled","
1328 <i>register_globals=".ini_get("register_globals")."</i>
1329 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.
1330 You should always use the function t3lib_div::GPvar(\"<i>[the_var_name_from_GET_or_POST]</i>\") to retrieve values passed to your script from outside.
1331 ",1);
1332 } else $this->message($ext, "Register globals enabled","You should always use the function t3lib_div::GPvar(\"<i>[the_var_name_from_GET_or_POST]</i>\") to retrieve values passed to your script from outside.",1);
1333 if (!ini_get("magic_quotes_gpc")) {
1334 $this->message($ext, "magic_quotes_gpc","
1335 <i>magic_quotes_gpc=".ini_get("magic_quotes_gpc")."</i>
1336 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.
1337 ",1);
1338 } else $this->message($ext, "magic_quotes_gpc","<i>magic_quotes_gpc=".ini_get("magic_quotes_gpc")."</i>",-1);
1339 if (ini_get("magic_quotes_runtime")) {
1340 $this->message($ext, "Magic Quotes Runtime is enabled","
1341 <i>magic_quotes_runtime=".ini_get("magic_quotes_runtime")."</i>
1342 TYPO3 is depending on this option NOT being enabled!
1343 ",3);
1344 } else $this->message($ext, "magic_quotes_runtime","<i>magic_quotes_runtime=".ini_get("magic_quotes_runtime")."</i>",-1);
1345 if (ini_get("gpc_order")!="GPC") {
1346 $this->message($ext, "GPC order non-standard","
1347 <i>gpc_order=".ini_get("gpc_order")."</i>
1348 The order of GET, POST and COOKIE vars are non-standard. The value should be \"GPC\".
1349 ",2);
1350 } else $this->message($ext, "GPC order","",-1);
1351
1352 // *****************
1353 // File uploads
1354 // *****************
1355 if (!ini_get("file_uploads")) {
1356 $this->message($ext, "File uploads not allowed","
1357 <i>file_uploads=".ini_get("file_uploads")."</i>
1358 TYPO3 uses the ability to upload files from the browser in various cases.
1359 As long as this flag is disabled, you'll not be able to upload files.
1360 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!
1361 However if you cannot enable fileupload for some reason alternatively you change the default form encoding value with \$TYPO3_CONF_VARS[SYS][form_enctype].
1362 ",3);
1363 } else $this->message($ext, "File uploads allowed","",-1);
1364 $upload_max_filesize = $this->convertByteSize(ini_get("upload_max_filesize"));
1365 if ($upload_max_filesize<10000*1024) {
1366 $this->message($ext, "Max Upload filesize too small?","
1367 <i>upload_max_filesize=".ini_get("upload_max_filesize")."</i>
1368 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]).
1369 Your current value is below this, so at this point, PHP sets the limits for uploaded filesizes and not TYPO3.
1370 <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.
1371 ",1);
1372 }
1373
1374 // *****************
1375 // Memory and functions
1376 // *****************
1377 $memory_limit_value = $this->convertByteSize(get_cfg_var("memory_limit"));
1378 if ($memory_limit_value<8*1024*1024) {
1379 $this->message($ext, "Memory Limit below default 8 MB","
1380 <i>memory_limit=".get_cfg_var("memory_limit")."</i>
1381 May impose problems if too low.
1382 ",1);
1383 } else $this->message($ext, "Memory Limit","<i>memory_limit=".get_cfg_var("memory_limit")."</i>",-1);
1384 if (ini_get("max_execution_time")<30) {
1385 $this->message($ext, "Max Execution Time below default 30 seconds","
1386 <i>max_execution_time=".ini_get("max_execution_time")."</i>
1387 May impose problems if too low.
1388 ",1);
1389 } else $this->message($ext, "Max Execution Time","<i>max_execution_time=".ini_get("max_execution_time")."</i>",-1);
1390 if (ini_get("disable_functions")) {
1391 $this->message($ext, "Functions disabled!","
1392 <i>disable_functions=".ini_get("disable_functions")."</i>
1393 The above list of functions are disabled. If TYPO3 use any of these there might be trouble.
1394 TYPO3 is designed to use the default set of PHP4.0.6+ functions plus the functions from GDLib.
1395 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.
1396 ",2);
1397 } else $this->message($ext, "Functions disabled: none","",-1);
1398 if (!ini_get("sendmail_path")) {
1399 $this->message($ext, "Sendmail path not defined!","
1400 <i>sendmail_path=".ini_get("sendmail_path")."</i>
1401 This may be critical to TYPO3's use of the mail() function. Please be sure that the mail() function in your php-installation works!
1402 ".$this->check_mail("get_form"),1);
1403 } else {
1404 list($prg) = explode(" ",ini_get("sendmail_path"));
1405 if (TYPO3_OS=='WIN') {
1406 $this->message($ext, "Sendmail program not searched for on Windows","",1);
1407 } else {
1408 if (!@is_executable($prg)) {
1409 $this->message($ext, "Sendmail program not found or not executable?","
1410 <i>sendmail_path=".ini_get("sendmail_path")."</i>
1411 This may be critical to TYPO3's use of the mail() function. Please be sure that the mail() function in your php-installation works!
1412 ".$this->check_mail("get_form"),1);
1413 } else {
1414 $this->message($ext, "Sendmail OK","
1415 <i>sendmail_path=".ini_get("sendmail_path")."</i>
1416 You may check the mail() function by entering your emailaddress here:
1417 ".$this->check_mail("get_form"),-1);
1418 }
1419 }
1420 }
1421
1422 // *****************
1423 // Safe mode related
1424 // *****************
1425 if (ini_get("safe_mode")) {
1426 $this->message($ext, "Safe mode turned on","
1427 <i>safe_mode=".ini_get("safe_mode")."</i>
1428 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.
1429 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/\".
1430 If you use safe_mode with TYPO3, you should disable use of external programs ([BE][disable_exec_function]=1).
1431 In safe mode you must ensure that all the php-scripts and upload folders are owned by the same user.
1432
1433 <i>safe_mode_exec_dir=".ini_get("safe_mode_exec_dir")."</i>
1434 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)
1435
1436
1437 <strong>Example of safe_mode settings:</strong>
1438 Set this in the php.ini file:
1439
1440 ; Safe Mode
1441 safe_mode = On
1442 safe_mode_exec_dir = /usr/bin/
1443
1444 ...and the ImageMagick '/usr/bin/convert' will be executable.
1445 The last slash is important (..../) and you can only specify one directory.
1446
1447 <strong>Notice: </strong>
1448 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.
1449 Paths to ImageMagick are defined in localconf.php and may be something else than /usr/bin/, but this is default for ImageMagick 5+
1450
1451
1452 ",2);
1453 if (ini_get("doc_root")) {
1454 $this->message($ext, "doc_root set","
1455 <i>doc_root=".ini_get("doc_root")."</i>
1456 PHP cannot execute scripts outside this directory. If that is a problem is please correct it.
1457 ",1);
1458 }
1459 $this->config_array["safemode"]=1;
1460 } else $this->message($ext, "safe_mode: off","",-1);
1461 if (ini_get("sql.safe_mode")) {
1462 $this->message($ext, "sql.safe_mode is enabled","
1463 <i>sql.safe_mode=".ini_get("sql.safe_mode")."</i>
1464 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")."
1465 The owner of the current file is: <strong>".get_current_user ()."</strong>
1466 ",1);
1467 $this->config_array["sql.safe_mode_user"] = get_current_user();
1468 } else $this->message($ext, "sql.safe_mode: off","",-1);
1469 if (ini_get("open_basedir")) {
1470 $this->message($ext, "open_basedir set","
1471 <i>open_basedir=".ini_get("open_basedir")."</i>
1472 This restricts TYPO3 to open and include files only in this path. Please make sure that this does not prevent TYPO3 from running.
1473 <strong>Notice (UNIX):</strong> Before checking a path according to open_basedir, PHP resolves all symbolic links.
1474 ",1);
1475 // ???? 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.
1476 } else $this->message($ext, "open_basedir: off","",-1);
1477
1478 }
1479
1480 /**
1481 * Check if php function mail() works
1482 *
1483 * @param string $cmd If "get_form" then a formfield for the mail-address is shown. If not, it's checked if "check_mail" was in the INSTALL array and if so a test mail is sent to the recipient given.
1484 * @return [type] ...
1485 */
1486 function check_mail($cmd="") {
1487 switch($cmd) {
1488 case "get_form":
1489 $out='
1490 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.
1491 <form action="'.$this->action.'" method="POST"><input type="text" name="TYPO3_INSTALL[check_mail]">
1492 <input type="submit" value="Send test mail"></form>';
1493 break;
1494 default:
1495 if (trim($this->INSTALL["check_mail"])) {
1496 mail(trim($this->INSTALL["check_mail"]), "TEST SUBJECT", "TEST CONTENT", "From: test@test.test");
1497 $this->messages[]= "MAIL WAS SENT TO: ".$this->INSTALL["check_mail"];
1498 }
1499 break;
1500 }
1501 return $out;
1502 }
1503
1504 /**
1505 * Checking php extensions, specifically GDLib and Freetype
1506 *
1507 * @return [type] ...
1508 */
1509 function checkExtensions() {
1510 $ext = "GDLib";
1511 $this->message($ext);
1512
1513 $software_info=1;
1514 if (extension_loaded("gd") && $this->isGD()) {
1515 $this->config_array["gd"]=1;
1516 $this->message($ext, "GDLib found","",-1);
1517 if ($this->isPNG()) {
1518 $this->config_array["gd_png"]=1;
1519 $this->message($ext, "PNG supported","",-1);
1520 }
1521 if ($this->isGIF()) {
1522 $this->config_array["gd_gif"]=1;
1523 $this->message($ext, "GIF supported","",-1);
1524 }
1525 if ($this->isJPG()) {
1526 $this->config_array["gd_jpg"]=1;
1527 $this->message($ext, "JPG supported (not used by TYPO3)","");
1528 }
1529 if (!$this->config_array["gd_gif"] && !$this->config_array["gd_png"]) {
1530 $this->message($ext, "PNG or GIF not supported", nl2br(trim("
1531 Your GDLib supports either GIF nor PNG. It must support either one of them.
1532 ")), 2);
1533 } else {
1534 $msg=array();
1535 if ($this->config_array["gd_gif"] && $this->config_array["gd_png"]) {
1536 $msg[0]="You can choose between generating GIF or PNG files, as your GDLib supports both.";
1537 }
1538 if ($this->config_array["gd_gif"]) {
1539 $msg[10]="You should know that generating GIF files are covered by a UNISYS patent. <a target=\"_blank\" href=\"http://www.boutell.com/gd/\">Read more for details.</a>";
1540 $msg[11]="In addition you should watch out for the generated size of the GIF-files because GDLib does 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 newer versions) you'll end up with GIF-filesizes all too big!
1541 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.";
1542 }
1543 if ($this->config_array["gd_png"]) {
1544 $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.";
1545 }
1546 $this->message($ext, "GIF / PNG issues", nl2br(trim(implode($msg,chr(10)))), 1);
1547 }
1548 if (!$this->isTTF()) {
1549 $this->message($ext, "FreeType is apparently not installed", "
1550 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'.
1551 ", 2);
1552 } else {
1553 $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);
1554 $this->config_array["freetype"]=1;
1555 }
1556 } else {
1557 $this->message($ext, "GDLib not found", "
1558 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.
1559 GDLib is also used in the TYPO3 Backend (TBE) to generate record icons and new module tabs.
1560 It's highly recommended to install this library. Remember to compile GD with FreeType which is also required.
1561 If you choose not to install GDLib, you can disable it in the configuration with [GFX][gdlib]=0;.
1562 ", 2);
1563 }
1564 $this->message($ext, "GDLib software information", nl2br(trim($this->getGDSoftwareInfo())));
1565 }
1566
1567 /**
1568 * Checking and testing that the required writable directories are writable.
1569 *
1570 * @return [type] ...
1571 */
1572 function checkDirs() {
1573 // Check typo3/temp/
1574 $ext="Directories";
1575 $this->message($ext);
1576
1577 $uniqueName = md5(uniqid(microtime()));
1578
1579 $checkWrite=array(
1580 "typo3temp/" => array("The folder is used by both the frontend (FE) and backend interface (TBE) for image manipulated files.",1,"dir_typo3temp"),
1581 # 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"),
1582 "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.",1),
1583 "typo3conf/ext/" => array("Location for local extensions. Must be writable if the Extension Manager is supposed to install extensions for this website.",0),
1584 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),
1585 "uploads/" => array("Location for uploaded files from RTE + in the subdirs for tables.",1),
1586 "uploads/pics/" => array("Typical location for uploaded files (images especially).",0),
1587 "uploads/media/" => array("Typical location for uploaded files (non-images especially).",0),
1588 "uploads/tf/" => array("Typical location for uploaded files (TS template resources).",0),
1589 "fileadmin/" => array("Location for local files such as templates, independent uploads etc.",0),
1590 "fileadmin/_temp_/" => array("Typical temporary location for default upload of files by administrators.",0),
1591 );
1592
1593 reset($checkWrite);
1594 while(list($relpath,$descr)=each($checkWrite)) {
1595 // Check typo3temp/
1596 $general_message = $descr[0];
1597 if (!@is_dir(PATH_site.$relpath)) {
1598 if ($descr[1]) { // required...
1599 $this->message($ext, $relpath." directory does not exist","
1600 <em>Full path: ".PATH_site.$relpath."</em>
1601 ".$general_message."
1602
1603 This error should not occur as ".$relpath." must always be accessible in the root of a TYPO3 website.
1604 ",3);
1605 } else {
1606 $this->message($ext, $relpath." directory does not exist","
1607 <em>Full path: ".PATH_site.$relpath."</em>
1608 ".$general_message."
1609
1610 This directory does not necessarily have to exist but if it does it must be writable.
1611 ",2);
1612 }
1613 } else {
1614 $file = PATH_site.$relpath.$uniqueName;
1615 @touch($file);
1616 if (@is_file($file)) {
1617 unlink($file);
1618 if ($descr[2]) { $this->config_array[$descr[2]]=1; }
1619 $this->message($ext, $relpath." writeable","",-1);
1620 } else {
1621 $this->message($ext, $relpath." directory not writeable","
1622 <em>Full path: ".$file."</em>
1623 ".$general_message."
1624
1625 Tried to write this file (with touch()) but didn't succeed.
1626 The directory ".$relpath." must be writable!
1627 ",3);
1628 }
1629 }
1630 }
1631 }
1632
1633 /**
1634 * Checking for existing ImageMagick installs.
1635 *
1636 * This tries to find available ImageMagick installations and tries to find the version numbers by executing "convert" without parameters. If the ->checkIMlzw is set, LZW capabilities of the IM installs are check also.
1637 *
1638 * @param [type] $paths: ...
1639 * @return [type] ...
1640 */
1641 function checkImageMagick($paths) {
1642 $ext="Check Image Magick";
1643 $this->message($ext);
1644
1645 $paths = array_unique($paths);
1646
1647 $programs = explode(",","convert,combine,composite,identify"); // Added composite (substitution for combine in newer versions?)
1648 $isExt = TYPO3_OS=="WIN" ? ".exe" : "";
1649 $this->config_array["im_combine_filename"]="combine";
1650 reset($paths);
1651 while(list($k,$v)=each($paths)) {
1652 reset($programs);
1653 while(list(,$filename)=each($programs)) {
1654 # if (@file_exists($v) && @is_file($v.$filename.$isExt)) { // file_exists was necessary on windows, because is_file issued a warning if the path was not correct.
1655 if($this->_checkImageMagick_getVersion($v.$filename.$isExt) > 0 ) {
1656 $index[$v][$filename]=$this->_checkImageMagick_getVersion($v.$filename.$isExt);
1657 }
1658 }
1659 if (count($index[$v])>=3) {$this->config_array["im"]=1;}
1660 if ($index[$v]["composite"] && !$index[$v]["combine"]) {
1661 $this->config_array["im_combine_filename"]="composite";
1662 }
1663 if (isset($index[$v]["convert"]) && $this->checkIMlzw) {
1664 $index[$v]["gif_capability"] = "".$this->_checkImageMagickGifCapability($v);
1665 }
1666 }
1667 $this->config_array["im_versions"]=$index;
1668 if (!$this->config_array["im"]) {
1669 $this->message($ext, "No ImageMagick install available","
1670 It seems that there is no adequate ImageMagick installation available at the checked locations (".implode($paths, ", ").")
1671 An 'adequate' installation for requires 'convert', 'combine'/'composite' and 'identify' to be available
1672 ",2);
1673 } else {
1674 $theCode="";
1675 reset($this->config_array["im_versions"]);
1676 while(list($p,$v)=each($this->config_array["im_versions"])) {
1677 $ka=array();
1678 reset($v);
1679 while(list($ka[])=each($v)){}
1680 $theCode.='<tr><td>'.$this->fw($p).'</td><td>'.$this->fw(implode($ka,"<BR>")).'</td><td>'.$this->fw(implode($v,"<BR>")).'</td></tr>';
1681 }
1682 $this->message($ext, "Available ImageMagick installations:",'<table border=1 cellpadding=2 cellspacing=2>'.$theCode.'</table>',-1);
1683 }
1684 $this->message($ext, "Search for ImageMagick:",'
1685 <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.
1686
1687 Check this path for ImageMagick installation:
1688 <input type="text" name="TYPO3_INSTALL[checkIM][path]" value="'.htmlspecialchars(stripslashes($this->INSTALL["checkIM"]["path"])).'">
1689 (Eg. "D:\wwwroot\im537\ImageMagick\" for windows or "/usr/bin/" for Unix)<br>
1690
1691 <input type="submit" value="Send">
1692 </form>
1693 ',0);
1694
1695 }
1696
1697 /**
1698 * Checking GIF-compression capabilities of ImageMagick install
1699 *
1700 * @param [type] $file: ...
1701 * @return [type] ...
1702 */
1703 function _checkImageMagickGifCapability($file) {
1704 if ($this->config_array["dir_typo3temp"]) { // && !$this->config_array["safemode"]
1705 $path = $this->typo3temp_path;
1706 $uniqueName = md5(uniqid(microtime()));
1707 $dest = $path.$uniqueName.".gif";
1708 $src = PATH_t3lib."gfx/typo3logo.gif";
1709 if (@is_file($src) && !strstr($src," ") && !strstr($dest," ")) {
1710 $cmd = $file.'convert '.$src.' '.$dest;
1711 exec($cmd);
1712 } else die("No t3lib/gfx/typo3logo.gif file!");
1713 $out="";
1714 if (@is_file($dest)) {
1715 $new_info = @getimagesize($dest);
1716 clearstatcache();
1717 $new_size = filesize($dest);
1718 $src_info = @getimagesize($src);
1719 clearstatcache();
1720 $src_size = @filesize($src);
1721
1722 if ($new_info[0]!=$src_info[0] || $new_info[1]!=$src_info[1] || !$new_size || !$src_size) {
1723 $out="error";
1724 } else {
1725 if ($new_size/$src_size > 4) { // NONE-LZW ratio was 5.5 in test
1726 $out="NONE";
1727 } elseif ($new_size/$src_size > 1.5) { // NONE-RLE ratio was not tested
1728 $out="RLE";
1729 } else {
1730 $out="LZW";
1731 }
1732 }
1733 unlink($dest);
1734 }
1735 return $out;
1736 }
1737 }
1738
1739 /**
1740 * Extracts the version number for imagemagick
1741 *
1742 * @param string $file This is the path to the convert-program to execute in order to find the version number
1743 * @return [type] ...
1744 */
1745 function _checkImageMagick_getVersion($file) {
1746 exec($file, $retVal);
1747 $string = $retVal[0];
1748 list(,$ver) = explode("ImageMagick", $string);
1749 list($ver) = explode(" ",trim($ver));
1750 return trim($ver);
1751 }
1752
1753 /**
1754 * Checks database username/password/host/database
1755 *
1756 * @return [type] ...
1757 */
1758 function checkDatabase() {
1759 $ext="Check database";
1760 $this->message($ext);
1761
1762 if (!extension_loaded("mysql")) {
1763 $this->message($ext, "MySQL not available","
1764 PHP does not feature MySQL support (which is pretty unusual).
1765 ",2);
1766 } else {
1767 $cInfo="
1768 Username: <strong>".TYPO3_db_username."</strong>
1769 Password: <strong>".TYPO3_db_password."</strong>
1770 Host: <strong>".TYPO3_db_host."</strong>
1771 ";
1772 if (!TYPO3_db_host || !TYPO3_db_username) {
1773 $this->message($ext, "Username, password or host not set","
1774 You may need to enter data for these values:
1775 ".trim($cInfo)."
1776
1777 Use the form below.
1778 ",2);
1779 }
1780 if ($result = @mysql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
1781 $this->message($ext, "Connected to MySQL successfully","
1782 ".trim($cInfo)."
1783 ",-1,1);
1784 $this->config_array["mysqlConnect"]=1;
1785 if (!TYPO3_db) {
1786 $this->message($ext, "No database selected","
1787 Currently you have no database selected.
1788 Please select one or create a new database.
1789 ",3);
1790 $this->config_array["no_database"]=1;
1791 } elseif (!mysql_select_db(TYPO3_db)) {
1792 $this->message($ext, "Database","
1793 '".TYPO3_db."' could not be selected as database!
1794 Please select another one or create a new database.
1795 ",3,1);
1796 $this->config_array["no_database"]=1;
1797 } else {
1798 $this->message($ext, "Database","
1799 <strong>".TYPO3_db."</strong> is selected as database.
1800 ",1,1);
1801 }
1802 } else {
1803 $this->message($ext, "Could not connect to MySQL!","
1804 Connecting to MySQL failed with these settings:
1805 ".trim($cInfo)."
1806
1807 Make sure you're using the correct set of data.".($this->config_array["sql.safe_mode_user"]? "
1808 <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"]."'":"")."
1809 ",3);
1810 }
1811 }
1812 }
1813
1814 /**
1815 * Prints form for updating localconf.php or updates localconf.php depending on $cmd
1816 *
1817 * @param string $cmd If "get_form" it outputs the form. Default is to write "localconf.php" based on input in ->INSTALL[localconf.php] array and flag ->setLocalconf
1818 * @return [type] ...
1819 */
1820 function setupGeneral($cmd="") {
1821 switch($cmd) {
1822 case "get_form":
1823 // Database:
1824 $out='
1825 <table border=0 cellpadding=0 cellspacing=0>
1826 <form action="'.$this->action.'" method="POST">';
1827
1828 $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>":""));
1829 $out.=$this->wrapInCells("Password:", '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_password]" value="'.htmlspecialchars(TYPO3_db_password).'">');
1830 $out.=$this->wrapInCells("Host:", '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_host]" value="'.htmlspecialchars(TYPO3_db_host).'">');
1831 if ($this->config_array["mysqlConnect"]) {
1832 $dbArr = $this->getDatabaseList();
1833 reset($dbArr);
1834 $options="";
1835 $dbIncluded=0;
1836 while(list(,$dbname)=each($dbArr)) {
1837 $options.='<option value="'.htmlspecialchars($dbname).'"'.($dbname==TYPO3_db?' selected':'').'>'.htmlspecialchars($dbname).'</option>';
1838 if ($dbname==TYPO3_db) $dbIncluded=1;
1839 }
1840 if (!$dbIncluded && TYPO3_db) {
1841 $options.='<option value="'.htmlspecialchars(TYPO3_db).'" selected>'.htmlspecialchars(TYPO3_db).' (NO ACCESS!)</option>';
1842 }
1843 $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="">';
1844 } else {
1845 $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).'">';
1846 }
1847 $out.=$this->wrapInCells("", "<BR>");
1848 $out.=$this->wrapInCells("Database:", $theCode);
1849 $out.=$this->wrapInCells("", "<BR>");
1850
1851 if ($this->mode!="123") {
1852 $out.=$this->wrapInCells("Site name:", '<input type="text" name="TYPO3_INSTALL[localconf.php][sitename]" value="'.htmlspecialchars($GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"]).'">');
1853 $out.=$this->wrapInCells("", "<BR>");
1854
1855 // Other
1856 $fA = $this->setupGeneralCalculate();
1857 // debug($fA);
1858 if (is_array($fA["disable_exec_function"])) {
1859 $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"]));
1860 }
1861 if (is_array($fA["gdlib"])) {
1862 $out.=$this->wrapInCells("[GFX][gdlib]=", $this->getFormElement($fA["gdlib"], $fA["gdlib"], 'TYPO3_INSTALL[localconf.php][gdlib]', $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib"]));
1863 if (is_array($fA["gdlib_png"]) && $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib"]) {
1864 $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"]));
1865 }
1866 }
1867 if (is_array($fA["im"])) {
1868 $out.=$this->wrapInCells("[GFX][im]=", $this->getFormElement($fA["im"], $fA["im"], 'TYPO3_INSTALL[localconf.php][im]', $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im"]));
1869 $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"]));
1870 if ($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im"]) {
1871 if (is_array($fA["im_path"])) {
1872 $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"]));
1873 }
1874 if (is_array($fA["im_path_lzw"])) {
1875 $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"]));
1876 }
1877 }
1878 }
1879 }
1880
1881
1882 $out.=$this->wrapInCells("", '<BR><input type="submit" value="Update localconf.php"><BR>
1883 <strong>NOTICE: </strong>By clicking this button, localconf.php is updated with new values for the parameters listed above!');
1884 $out.='
1885 </form>
1886 </table>';
1887 break;
1888 default:
1889 if (is_array($this->INSTALL["localconf.php"])) {
1890 $errorMessages=array();
1891 $lines = $this->writeToLocalconf_control();
1892
1893 // New database?
1894 #debug($this->INSTALL);
1895 if (trim($this->INSTALL["localconf.php"]["NEW_DATABASE_NAME"])) {
1896 $newdbname=trim($this->INSTALL["localconf.php"]["NEW_DATABASE_NAME"]);
1897 if (!ereg("[^[:alnum:]_]",$newdbname)) {
1898 if ($result = @mysql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
1899 # if (mysql_create_db($newdbname)) { // Disabled because of safe_mode restrictions or something like that...
1900 if (mysql_query('CREATE DATABASE '.$newdbname)) {
1901 $this->INSTALL["localconf.php"]["typo_db"]=$newdbname;
1902 $this->messages[]= "Database '".$newdbname."' created";
1903 } else $this->messages[]= $errorMessages[] = "Could not create database '".$newdbname."' (...not created)";
1904 } else $this->messages[]= $errorMessages[] = "Could not connect to database when creating database '".$newdbname."' (...not created)";
1905 } else $this->messages[]= $errorMessages[] = "The NEW database name '".$newdbname."' was not alphanumeric, a-zA-Z0-9_ (...not created)";
1906 }
1907 #debug($this->messages) ;
1908 // Parsing values
1909 reset($this->INSTALL["localconf.php"]);
1910 while(list($key,$value)=each($this->INSTALL["localconf.php"])) {
1911 switch((string)$key) {
1912 case "typo_db_username":
1913 if (!ereg("[^[:alnum:]_\.-]",$value) && strlen($value)<50) {
1914 if (strcmp(TYPO3_db_username,$value)) $this->setValueInLocalconfFile($lines, '$typo_db_username', $value);
1915 } else $this->messages[]= $errorMessages[] = "Username '".$value."' was not alphanumeric, a-zA-Z0-9_-., or longer than 50 chars (...not saved)";
1916 break;
1917 case "typo_db_password":
1918 if (!ereg("[^[:alnum:]_\.-]",$value) && strlen($value)<50) {
1919 if (strcmp(TYPO3_db_password,$value)) $this->setValueInLocalconfFile($lines, '$typo_db_password', $value);
1920 } else $this->messages[]= $errorMessages[] = "Password '".$value."' was not alphanumeric, a-zA-Z0-9_-., or longer than 50 chars (...not saved)";
1921 break;
1922 case "typo_db_host":
1923 if (!ereg("[^[:alnum:]_\.-]",$value) && strlen($value)<50) {
1924 if (strcmp(TYPO3_db_host,$value)) $this->setValueInLocalconfFile($lines, '$typo_db_host', $value);
1925 } else $this->messages[]= $errorMessages[] = "Host '".$value."' was not alphanumeric, a-zA-Z0-9_-., or longer than 50 chars (...not saved)";
1926 break;
1927 case "typo_db":
1928 if (!ereg("[^[:alnum:]_\.-]",$value) && strlen($value)<50) {
1929 if (strcmp(TYPO3_db,$value)) $this->setValueInLocalconfFile($lines, '$typo_db', $value);
1930 } else $this->messages[]= $errorMessages[] = "Database '".$value."' was not alphanumeric, a-zA-Z0-9_-., or longer than 50 chars (...not saved)";
1931 break;
1932 case "disable_exec_function":
1933 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["BE"]["disable_exec_function"],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["BE"]["disable_exec_function"]', $value?1:0);
1934 break;
1935 case "sitename":
1936 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["SYS"]["sitename"],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["SYS"]["sitename"]', $value);
1937 break;
1938 case "im_combine_filename":
1939 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_combine_filename"],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["im_combine_filename"]', $value);
1940 break;
1941 case "gdlib":
1942 case "gdlib_png":
1943 case "im":
1944 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"][$key],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["'.$key.'"]', $value?1:0);
1945 break;
1946 case "im_path":
1947 list($value,$version) = explode("|",$value);
1948 if (!ereg("[[:space:]]",$value,$reg) && strlen($value)<100) {
1949 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"][$key],$value)) {
1950 $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["'.$key.'"]', $value);
1951 }
1952 $value_ext = (doubleval($version)<5)?0:1;
1953 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"],$value_ext)) {
1954 $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["im_version_5"]', $value_ext);
1955 }
1956 } else $this->messages[]= $errorMessages[] = "Path '".$value."' contains spaces or is longer than 100 chars (...not saved)";
1957 break;
1958 case "im_path_lzw":
1959 list($value) = explode("|",$value);
1960 if (!ereg("[[:space:]]",$value) && strlen($value)<100) {
1961 if (strcmp($GLOBALS["TYPO3_CONF_VARS"]["GFX"][$key],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS["GFX"]["'.$key.'"]', $value);
1962 } else $this->messages[]= $errorMessages[] = "Path '".$value."' contains spaces or is longer than 100 chars (...not saved)";
1963 break;
1964 }
1965
1966
1967 }
1968
1969 if (count($errorMessages)) {
1970 echo "<H3>ERRORS</H3>";
1971 echo t3lib_div::view_array($errorMessages);
1972 echo 'Click the browsers "Back" button to reenter the values.';
1973 exit;
1974 }
1975 $this->writeToLocalconf_control($lines);
1976 }
1977 break;
1978 }
1979 return $out;
1980 }
1981
1982 /**
1983 * [Describe function...]
1984 *
1985 * @param [type] $lines: ...
1986 * @param [type] $dontOutputContent: ...
1987 * @return [type] ...
1988 */
1989 function writeToLocalconf_control($lines="",$dontOutputContent=0) {
1990 $this->writeToLocalconf_dat["file"] = PATH_typo3conf."localconf.php";
1991 if (!$this->allowUpdateLocalConf) {
1992 die("->allowUpdateLocalConf flag in the install object is not set and therefore 'localconf.php' cannot be altered.");
1993 }
1994 if (!@is_writeable($this->writeToLocalconf_dat["file"])) {
1995 die($this->writeToLocalconf_dat["file"]." is not writeable!");
1996 }
1997 if (!is_array($lines)) {
1998 // Getting configuration
1999 $lines = explode(chr(10),trim(t3lib_div::getUrl($this->writeToLocalconf_dat["file"])));
2000 $this->writeToLocalconf_dat["endLine"]=array_pop($lines);
2001
2002 $updatedLine=array_pop($lines);
2003 $this->writeToLocalconf_dat["updatedText"] = "// Updated by ".$this->updateIdentity." ";
2004 if (!strstr($updatedLine, $this->writeToLocalconf_dat["updatedText"])) {
2005 array_push($lines,$updatedLine);
2006 }
2007 return $lines;
2008 } else {
2009 // Setting configuration
2010 $updatedLine=$this->writeToLocalconf_dat["updatedText"].date("d-m-Y H:i:s");
2011 array_push($lines,$updatedLine);
2012 array_push($lines,$this->writeToLocalconf_dat["endLine"]);
2013 //debug($lines);
2014 if ($this->setLocalconf) {
2015 t3lib_div::writeFile($this->writeToLocalconf_dat["file"],implode($lines,chr(10)));
2016 if (!$dontOutputContent) {
2017 $this->messages[]= "Configuration written to typo3conf/localconf.php";
2018
2019 $content = $this->fw("<BR><BR>".implode($this->messages,"<HR>").'<BR><BR><a href="'.$this->action.'">Click to continue...</a>');
2020 $this->outputExitBasedOnStep($content);
2021 }
2022 } else {
2023 if (!$dontOutputContent) {
2024 $content = $this->fw('<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>');
2025 $this->outputExitBasedOnStep("<BR>".$content);
2026 }
2027 }
2028 }
2029 }
2030
2031 /**
2032 * [Describe function...]
2033 *
2034 * @param [type] $content: ...
2035 * @return [type] ...
2036 */
2037 function outputExitBasedOnStep($content) {
2038 if ($this->step) {
2039 Header("Location: ".t3lib_div::locationHeaderUrl($this->action));
2040 } else {
2041 echo $this->outputWrapper($content);
2042 }
2043 exit;
2044 }
2045
2046 /**
2047 * [Describe function...]
2048 *
2049 * @param [type] $string: ...
2050 * @return [type] ...
2051 */
2052 function checkForBadString($string) {
2053 // if (ereg("[".chr(10).chr(13)."\$\"\\]|//",$string)){
2054 if (ereg("[".chr(10).chr(13)."]",$string)){
2055 return 0;
2056 } else return 1;
2057 }
2058
2059 /**
2060 * This functions takes an array with lines from localconf.php, finds a variable and inserts the new value.
2061 *
2062 * @param array $lime_array the localconf.php file exploded into an array by linebreaks.
2063 * @param string $variable The variable name to find and substitute. This string must match the first part of a trimmed line in the line-array. Matching is done backwards so the last appearing line will be substituted.
2064 * @param string $value Is the value to be insert for the variable
2065 * @return [type] ...
2066 */
2067 function setValueInLocalconfFile(&$line_array, $variable, $value) {
2068 $value = stripslashes($value);
2069 if (!$this->checkForBadString($value)) return 0;
2070 $found=0;
2071 $commentKey = "## ";
2072 $inArray = in_array($commentKey.$this->localconf_editPointToken,$line_array);
2073 $tokenSet = ($this->localconf_editPointToken && !$inArray); // Flag is set if the token should be set but is not yet...
2074 $stopAtToken = ($this->localconf_editPointToken && $inArray);
2075
2076 $comment = ' Modified or inserted by '.$this->updateIdentity.'.';
2077 if (!$this->localconf_addLinesOnly && !$tokenSet) {
2078 $line_array = array_reverse($line_array);
2079 reset($line_array);
2080 while(list($k,$v)=each($line_array)) {
2081 $v2=trim($v);
2082 if ($stopAtToken && !strcmp($v2,$commentKey.$this->localconf_editPointToken)) break; // If stopAtToken and token found, break out of the loop..
2083 if (!strcmp(substr($v2,0,strlen($variable." ")),$variable." ")) {
2084 $mainparts = explode($variable,$v,2);
2085 if (count($mainparts)==2) { // should ALWAYS be....
2086 $subparts = explode("//",$mainparts[1],2);
2087 $line_array[$k] = $mainparts[0].$variable." = '".$this->slashValueForSingleDashes($value)."'; ".("//".$comment.str_replace($comment,"",$subparts[1]));
2088 $found=1;
2089 break;
2090 }
2091 }
2092 }
2093 $line_array = array_reverse($line_array);
2094 }
2095 if (!$found) {
2096 if ($tokenSet) {
2097 $line_array[] = $commentKey.$this->localconf_editPointToken;
2098 $line_array[] = "";
2099 }
2100 // $line_array[] = $variable.' = "'.addslashes($value).'"; // '.$comment;
2101 $line_array[] = $variable." = '".$this->slashValueForSingleDashes($value)."'; // ".$comment;
2102 }
2103 $this->messages[]= $variable." = '".htmlspecialchars($value)."'";
2104 $this->setLocalconf=1;
2105 // debug($line_array);
2106 }
2107
2108 /**
2109 * [Describe function...]
2110 *
2111 * @param [type] $value: ...
2112 * @return [type] ...
2113 */
2114 function slashValueForSingleDashes($value) {
2115 return str_replace("'","\'",str_replace('\\','\\\\',$value));
2116 }
2117
2118 /**
2119 * This appends something to value in the input array based on $type. Private.
2120 *
2121 * @param [type] $arr: ...
2122 * @param [type] $type: ...
2123 * @return [type] ...
2124 */
2125 function setLabelValueArray($arr,$type) {
2126 reset($arr);
2127 while(list($k,$v)=each($arr)) {
2128 switch($type) {
2129 case 0: // value, im
2130 $arr[$k].="|".$this->config_array["im_versions"][$v]["convert"];
2131 break;
2132 case 1: // labels, im
2133 $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"]:"").")" : "";
2134 break;
2135 case 2: // labels, gd
2136 $arr[$k].=" (".($v==1?"PNG":"GIF").")";
2137 break;
2138 }
2139 }
2140 return $arr;
2141 }
2142
2143 /**
2144 * Returns a form-element for the localconf.php update form
2145 *
2146 * @param [type] $labels: ...
2147 * @param [type] $values: ...
2148 * @param [type] $fieldName: ...
2149 * @param [type] $default: ...
2150 * @param [type] $msg: ...
2151 * @return [type] ...
2152 */
2153 function getFormElement($labels,$values,$fieldName,$default,$msg="") {
2154 $out.='<strong>'.htmlspecialchars(current($labels)).'</strong><BR>current value is '.htmlspecialchars($default).($msg?"<BR>".$msg:"");
2155 if (count($labels)>1) {
2156 reset($labels);
2157 while(list($k,$v)=each($labels)) {
2158 list($cleanV) =explode("|",$values[$k]);
2159 $options.='<option value="'.htmlspecialchars($values[$k]).'"'.(!strcmp($default,$cleanV)?" selected":"").'>'.htmlspecialchars($v).'</option>';
2160 }
2161 $out.='<BR><select name="'.$fieldName.'">'.$options.'</select>';
2162 } else {
2163 $out.='<input type="hidden" name="'.$fieldName.'" value="'.htmlspecialchars(current($values)).'">';
2164 }
2165 return $out."<BR>";
2166 }
2167
2168 /**
2169 * Returns the list of available databases (with access-check based on username/password)
2170 *
2171 * @return [type] ...
2172 */
2173 function getDatabaseList() {
2174 $dbArr=array();
2175 if ($result = @mysql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
2176 $db_list = mysql_list_dbs();
2177 while ($row = mysql_fetch_object($db_list)) {
2178 if (mysql_select_db($row->Database)) {
2179 $dbArr[]=$row->Database;
2180 }
2181 }
2182 }
2183 return $dbArr;
2184 }
2185
2186 /**
2187 * Calculates the suggested setup that should be written to localconf.php
2188 *
2189 * If safe_mode
2190 * - disable_exec_function = 1
2191 * - im = 0
2192 *
2193 * if PNG/GIF/GD
2194 * - disable gdlib if nothing
2195 * - select png/gif if only one of them is available, else PNG/GIF selector, defaulting to GIF
2196 * - (safe_mode is on)
2197 * - im_path (default to 4.2.9, preferable with LZW) im_ver5-flag is set based on im_path being 4.2.9 or 5+
2198 * - im_path_lzw (default to LZW version, pref. 4.2.9)
2199 *
2200 * @return [type] ...
2201 */
2202 function setupGeneralCalculate() {
2203 $formArray["disable_exec_function"]=array(0);
2204 $formArray["im_path"]=array("");
2205 $formArray["im_path_lzw"]=array("");
2206 $formArray["im_combine_filename"]=array("");
2207 $formArray["im"]=array(1);
2208 $formArray["gdlib"]=array(1);
2209 if ($this->config_array["gd"] && ($this->config_array["gd_gif"] || $this->config_array["gd_png"])) {
2210 if ($this->config_array["gd_gif"] && !$this->config_array["gd_png"]) {
2211 $formArray["gdlib_png"]=array(0);
2212 } elseif (!$this->config_array["gd_gif"] && $this->config_array["gd_png"]) {
2213 $formArray["gdlib_png"]=array(1);
2214 } else {
2215 $formArray["gdlib_png"]=array(0,1);
2216 }
2217 } else {
2218 $formArray["gdlib"]=array(0);
2219 }
2220 if ($this->config_array["safemode"]) {
2221 $formArray["disable_exec_function"]=array(1);
2222 }
2223 if ($this->config_array["im"]) {
2224 $formArray["im"]=array(1);
2225 $LZW_found=0;
2226 $found=0;
2227 reset($this->config_array["im_versions"]);
2228 $totalArr=array();
2229 while(list($path,$dat)=each($this->config_array["im_versions"])) {
2230 if (count($dat)>=3) {
2231 if (doubleval($dat["convert"])<5) {
2232 if ($dat["gif_capability"]=="LZW") {
2233 $formArray["im_path"]=array($path);
2234 $found=2;
2235 } elseif ($found<2) {
2236 $formArray["im_path"]=array($path);
2237 $found=1;
2238 }
2239 } elseif (!$found) {
2240 $formArray["im_path"]=array($path);
2241 $found=1;
2242 }
2243 }
2244 if ($dat["gif_capability"]=="LZW") {
2245 if (doubleval($dat["convert"])<5) {
2246 $formArray["im_path_lzw"]=array($path);
2247 $LZW_found=1;
2248 } elseif (!$LZW_found) {
2249 $formArray["im_path_lzw"]=array($path);
2250 $LZW_found=1;
2251 }
2252 } elseif ($dat["gif_capability"]=="RLE" && !$LZW_found) {
2253 $formArray["im_path_lzw"]=array($path);
2254 }
2255 $totalArr[]=$path;
2256 }
2257 $formArray["im_path"]=array_unique(array_merge($formArray["im_path"],$totalArr));
2258 $formArray["im_path_lzw"]=array_unique(array_merge($formArray["im_path_lzw"],$totalArr));
2259 $formArray["im_combine_filename"]=array($this->config_array["im_combine_filename"]);
2260 } else {
2261 $formArray["im"]=array(0);
2262 }
2263 return $formArray;
2264 }
2265
2266 /**
2267 * Returns the part of phpinfo() output that tells about GD library (HTML-code)
2268 *
2269 * @return [type] ...
2270 */
2271 function getGDPartOfPhpinfo() {
2272 ob_start();
2273 phpinfo();
2274 $contents = ob_get_contents();
2275 ob_end_clean();
2276 $start_string = $this->getGD_start_string;
2277 $end_string = $this->getGD_end_string;
2278 list(,$gdpart_tmp) = explode($start_string,$contents,2);
2279 list($gdpart) = explode($end_string,$start_string.$gdpart_tmp,2);
2280 $gdpart.=$end_string;
2281 return $gdpart;
2282 }
2283
2284 /**
2285 * Returns true if TTF lib is install according to phpinfo(). If $phpinfo supply as parameter that string is searched instead.
2286 *
2287 * @param [type] $phpinfo: ...
2288 * @return [type] ...
2289 */
2290 function isTTF($phpinfo="") {
2291 /* $phpinfo = $phpinfo?$phpinfo:$this->getGDPartOfPhpinfo();
2292 if (stristr($phpinfo, $this->getTTF_string)) return 1;
2293 if (stristr($phpinfo, $this->getTTF_string_alt)) return 1;
2294 */
2295
2296 if (!function_exists("imagettftext")) return 0; // Return right away if imageTTFtext does not exist.
2297
2298 // try, print truetype font:
2299 $im = @imagecreate (300, 50);
2300 $background_color = imagecolorallocate ($im, 255, 255, 55);
2301 $text_color = imagecolorallocate ($im, 233, 14, 91);
2302
2303 $test = @imagettftext($im, t3lib_div::freetypeDpiComp(20), 0, 10, 20, $text_color, PATH_t3lib."/fonts/verdana.ttf", "Testing Truetype support");
2304 if (t3lib_div::GPvar("testingTrueTypeSupport")) {
2305 if ($this->isGIF()) {
2306 header ("Content-type: image/gif");
2307 imagegif ($im);
2308 } else {
2309 header ("Content-type: image/png");
2310 imagepng ($im);
2311 }
2312 exit;
2313 }
2314 return is_array($test)?1:0;
2315 }
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327 /*****************************************
2328 *
2329 * ABOUT the isXXX functions.
2330 *
2331 * I had a very real experience that these checks DID NOT fail eg PNG support if it didn't exist!
2332 * 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.
2333 * And if THAT succeeds also, then we can be certain of the support!
2334 */
2335
2336 /**
2337 * @return [type] ...
2338 */
2339 function isGD() {
2340 if (function_exists("imagecreate")) {
2341 if (@imagecreate (50, 100)) return 1;
2342 }
2343 }
2344
2345 /**
2346 * [Describe function...]
2347 *
2348 * @return [type] ...
2349 */
2350 function isGIF() {
2351 if (function_exists("imagecreatefromgif") && function_exists("imagegif") && ($this->ImageTypes() & IMG_GIF)) { // If GIF-functions exists, also do a real test of them:
2352 $im = @imagecreatefromgif(t3lib_extMgm::extPath("install")."imgs/jesus.gif");
2353 return $im?1:0;
2354 }
2355 }
2356
2357 /**
2358 * [Describe function...]
2359 *
2360 * @return [type] ...
2361 */
2362 function isJPG() {
2363 if (function_exists("imagecreatefromjpeg") && function_exists("imagejpeg") && ($this->ImageTypes() & IMG_JPG)) {
2364 return 1;
2365 }
2366 }
2367
2368 /**
2369 * [Describe function...]
2370 *
2371 * @return [type] ...
2372 */
2373 function isPNG() {
2374 if (function_exists("imagecreatefrompng") && function_exists("imagepng") && ($this->ImageTypes() & IMG_PNG)) {
2375 $im = imagecreatefrompng(t3lib_extMgm::extPath("install")."imgs/jesus.png");
2376 return $im?1:0;
2377 }
2378 }
2379
2380 /**
2381 * [Describe function...]
2382 *
2383 * @return [type] ...
2384 */
2385 function ImageTypes() {
2386 if (phpversion()!="4.1.2") {
2387 return imagetypes();
2388 } else return IMG_GIF+IMG_JPG+IMG_PNG; // all...
2389 }
2390
2391 /**
2392 * Returns general information about GDlib
2393 *
2394 * @return [type] ...
2395 */
2396 function getGDSoftwareInfo() {
2397 return trim("
2398 You can get GDLib in the PNG version from ".$this->linkIt("http://www.boutell.com/gd/")." or you can get the patched GIF version from ".$this->linkIt("http://www.typo3.com/?software").".<BR>FreeType is for download at ".$this->linkIt("http://www.freetype.org/")."</a>.
2399 If you're using a Windows server, you'll be happy to know that all this is compiled into a PHP4-distribution for download at ".$this->linkIt("http://www.php4win.de/")."</a>.
2400 ");
2401 }
2402
2403 /**
2404 * Returns general information about configuration of TYPO3.
2405 *
2406 * @return [type] ...
2407 */
2408 function generallyAboutConfiguration() {
2409 $out='
2410 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.
2411 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.
2412 See this page for '.$this->linkIt("http://www.typo3.com/index.php/Server_software_and/1051/0/","more information about system requirements.").'
2413 ';
2414 return trim($out);
2415 }
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429 /**********************
2430 *
2431 * IMAGE processing
2432 *
2433 **********************/
2434
2435 /**
2436 * jesus.TIF: IBM/LZW
2437 * jesus.GIF: Save for web, 32 colors
2438 * jesus.JPG: Save for web, 30 quality
2439 * jesus.PNG: Save for web, PNG-24
2440 * jesus.tga 24 bit TGA file
2441 * jesus.pcx
2442 * jesus.bmp 24 bit BMP file
2443 * jesus_ps6.PDF: PDF w/layers and vector data
2444 * typo3logo.ai: Illustrator 8 file
2445 * pdf_from_imagemagick.PDF PDF-file made by Acrobat Distiller from InDesign PS-file
2446 *
2447 *
2448 * Imagemagick
2449 * - Read formats
2450 * - Write png, gif, jpg
2451 *
2452 * Problems may arise from the use of safe_mode (eg. png)
2453 * In safemode you will automatically execute the program convert in the safe_mode_exec_path no matter what other path you specify
2454 * check fileexist before anything...
2455 *
2456 * - compare gif size
2457 * - scaling (by stdgraphic)
2458 * - combining (by stdgraphic)
2459 *
2460 * GDlib:
2461 * - create from:....
2462 * - ttf text
2463 *
2464 * From TypoScript: (GD only, GD+IM, IM)
2465 *
2466 * @return [type] ...
2467 */
2468 function checkTheImageProcessing() {
2469 $this->message("Image Processing","What is it?","
2470 TYPO3 is known for its ability to process images on the server.
2471 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).
2472 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).
2473 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.
2474
2475 In order to do this, TYPO3 uses two sets of tools:
2476
2477 <B>ImageMagick:</B>
2478 For conversion of non-web formats to webformats, combining images with alpha-masks, performing image-effects like blurring and sharpening.
2479 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).
2480 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).
2481 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])
2482 ImageMagick homepage is at ".$this->linkIt("http://www.imagemagick.org/")."
2483
2484 <B>GDLib:</B>
2485 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.
2486 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.
2487 ".$this->getGDSoftwareInfo()."
2488
2489 You can disable all image processing options in TYPO3 ([GFX][image_processing]=0), but that would seriously disable TYPO3.
2490 ");
2491
2492 $this->message("Image Processing","Verifying the image processing capabilities of your server","
2493 This page performs image processing and displays the result. It's a thorough check that everything you've configured is working correctly.
2494 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.
2495
2496 The image to the right is the reference image (how it should be) and to the left the image made by your server.
2497 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.
2498
2499 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.
2500 ");
2501
2502 // debug($this->config_array);
2503 $im_path = $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_path"];
2504 $im_path_version = $this->config_array["im_versions"][$im_path]["convert"];
2505 $im_path_lzw = $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_path_lzw"];
2506 $im_path_lzw_version = $this->config_array["im_versions"][$im_path_lzw]["convert"];
2507 $msg = "
2508 ImageMagick enabled: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im"]."</strong>
2509 ImageMagick path: <strong>".$im_path."</strong> (".$im_path_version.")
2510 ImageMagick path/LZW: <strong>".$im_path_lzw."</strong> (".$im_path_lzw_version.")
2511 Version 5 flag: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"]."</strong>
2512
2513 GDLib enabled: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib"]."</strong>
2514 GDLib using PNG: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib_png"]."</strong>
2515 GDLib 2 enabled: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib_2"]."</strong>
2516 IM5 effects enabled: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_v5effects"]."</strong> (Blurring/Sharpening with IM 5+)
2517 Freetype DPI: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["TTFdpi"]."</strong> (Should be 96 for Freetype 2)
2518 Mask invert: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_imvMaskState"]."</strong> (Should be set for some IM versions approx. 5.4+)
2519
2520 File Formats: <strong>".$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["imagefile_ext"]."</strong>
2521 ";
2522 if (($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"]?true:false) != (doubleval($im_path_version)>=5)) {
2523 $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"].")";
2524 $etype=2;
2525 } else $etype=1;
2526
2527 $this->message("Image Processing","Current configuration",$msg,$etype);
2528
2529
2530
2531
2532 if (!$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["image_processing"]) {
2533 $this->message("Image Processing","Image Processing disabled!","
2534 Image Processing is disabled by the config flag <nobr>[GFX][image_processing]</nobr> set to false (zero)
2535 ",2);
2536 echo $this->outputWrapper($this->printAll());
2537 return;
2538 }
2539 if (!$this->config_array["dir_typo3temp"]) {
2540 $this->message("Image Processing","typo3temp/ not writeable!","
2541 You must make typo3temp/ write enabled before you can proceed with this test.
2542 ",2);
2543 echo $this->outputWrapper($this->printAll());
2544 return;
2545 }
2546
2547
2548
2549 $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>:
2550
2551 '.$this->imagemenu();
2552 $this->message("Image Processing","Testmenu",$msg,"");
2553
2554
2555 $this->messageFunc_nl2br=0;
2556 $parseStart = microtime();
2557 $imageProc = t3lib_div::makeInstance("t3lib_stdGraphic");
2558 $imageProc->init();
2559 $imageProc->tempPath=$this->typo3temp_path;
2560 $imageProc->dontCheckForExistingTempFile=1;
2561 // $imageProc->filenamePrefix="install_".($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_version_5"]?"v5":"");
2562 $imageProc->filenamePrefix="install_";
2563 $imageProc->dontCompress=1;
2564 $imageProc->alternativeOutputKey="TYPO3_INSTALL_SCRIPT";
2565 $imageProc->noFramePrepended=$GLOBALS["TYPO3_CONF_VARS"]["GFX"]["im_noFramePrepended"];
2566
2567 // Very temporary!!!
2568 $imageProc->dontUnlinkTempFiles=0;
2569
2570
2571 $imActive = ($this->config_array["im"] && $im_path);
2572 $gdActive = ($this->config_array["gd"] && $GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gdlib"]);
2573
2574 switch($this->INSTALL["images_type"]) {
2575 case "read":
2576 $refParseTime="5600"; // 4.2.9
2577 $refParseTime="3300"; // 5.2.3
2578 $headCode = "Reading and converting images";
2579 $this->message($headCode,"Supported file formats","
2580 This verifies that your ImageMagick installation is able to read the nine default file formats; JPG, GIF, PNG, TIF, BMP, PCX, TGA, PDF, AI.
2581 The tool 'identify' will be used to read the pixeldimensions of non-web formats.
2582 The tool 'convert' is used to read the image and write a temporary JPG-file
2583 ");
2584
2585 if ($imActive) {
2586 // Reading formats - writing JPG
2587
2588 $extArr = explode(",","jpg,gif,png,tif,bmp,pcx,tga");
2589 while(list(,$ext)=each($extArr)) {
2590 if ($this->isExtensionEnabled($ext, $headCode, "Read ".strtoupper($ext))) {
2591 $imageProc->IM_commands=array();
2592 $theFile = t3lib_extMgm::extPath("install")."imgs/jesus.".$ext;
2593 if (!@is_file($theFile)) die("Error: ".$theFile." was not a file");
2594
2595 $imageProc->imageMagickConvert_forceFileNameBody="read_".$ext;
2596 $fileInfo = $imageProc->imageMagickConvert($theFile,"jpg","","","","","",1);
2597 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
2598 $this->message($headCode,"Read ".strtoupper($ext),$result[0],$result[1]);
2599 }
2600 }
2601
2602 if ($this->isExtensionEnabled("pdf", $headCode, "Read PDF")) {
2603 $imageProc->IM_commands=array();
2604 $theFile = t3lib_extMgm::extPath("install")."imgs/pdf_from_imagemagick.pdf";
2605 if (!@is_file($theFile)) die("Error: ".$theFile." was not a file");
2606
2607 $imageProc->imageMagickConvert_forceFileNameBody="read_pdf";
2608 $fileInfo = $imageProc->imageMagickConvert($theFile,"jpg","170","","","","",1);
2609 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
2610 $this->message($headCode,"Read PDF",$result[0],$result[1]);
2611 }
2612 if ($this->isExtensionEnabled("ai", $headCode, "Read AI")) {
2613 $imageProc->IM_commands=array();
2614 $theFile = t3lib_extMgm::extPath("install")."imgs/typo3logotype.ai";
2615 if (!@is_file($theFile)) die("Error: ".$theFile." was not a file");
2616
2617 $imageProc->imageMagickConvert_forceFileNameBody="read_ai";
2618 $fileInfo = $imageProc->imageMagickConvert($theFile,"jpg","170","","","","",1);
2619 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
2620 $this->message($headCode,"Read AI",$result[0],$result[1]);
2621 }
2622 } else {
2623 $this->message($headCode,"Test skipped","
2624 Use of ImageMagick has been disabled in the configuration.
2625 Refer to section 'Basic Configuration' to change or review you configuration settings
2626 ",2);
2627 }
2628 break;
2629 case "write":
2630 $refParseTime="300";
2631
2632 // Writingformats - writing JPG
2633 $headCode = "Writing images";
2634 $this->message($headCode,"Writing GIF and PNG","
2635 This verifies that ImageMagick is able to write GIF and PNG files.
2636 The GIF-file is attempted compressed with LZW by the t3lib_div::gif_compress() function.
2637 ");
2638
2639 if ($imActive) {
2640 // Writing GIF
2641 $imageProc->IM_commands=array();
2642 $theFile = t3lib_extMgm::extPath("install")."imgs/jesus.gif";
2643 if (!@is_file($theFile)) die("Error: ".$theFile." was not a file");
2644
2645 $imageProc->imageMagickConvert_forceFileNameBody="write_gif";
2646 $fileInfo = $imageProc->imageMagickConvert($theFile,"gif","","","","","",1);
2647 if ($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gif_compress"]) {
2648 clearstatcache();
2649 $prevSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
2650 $returnCode = t3lib_div::gif_compress($fileInfo[3],"");
2651 clearstatcache();
2652 $curSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
2653 $note = array("Note on gif_compress() function:","The 'gif_compress' method used was '".$returnCode."'.<BR>Previous filesize: ".$prevSize.". Current filesize:".$curSize);
2654 } else $note=array("Note on gif_compress() function:","<em>Not used! Disabled by [GFX][gif_compress]</em>");
2655 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands, $note);
2656 $this->message($headCode,"Write GIF",$result[0],$result[1]);
2657
2658
2659 // Writing PNG
2660 $imageProc->IM_commands=array();
2661 $theFile = t3lib_extMgm::extPath("install")."imgs/jesus.gif";
2662
2663 $imageProc->imageMagickConvert_forceFileNameBody="write_png";
2664 $fileInfo = $imageProc->imageMagickConvert($theFile,"png","","","","","",1);
2665 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
2666 $this->message($headCode,"Write PNG",$result[0],$result[1]);
2667 } else {
2668 $this->message($headCode,"Test skipped","
2669 Use of ImageMagick has been disabled in the configuration.
2670 Refer to section 'Basic Configuration' to change or review you configuration settings
2671 ",2);
2672 }
2673 break;
2674 case "scaling":
2675 $refParseTime="650";
2676
2677 // Scaling
2678 $headCode = "Scaling images";
2679 $this->message($headCode,"Scaling transparent images","
2680 This shows how ImageMagick reacts when scaling transparent GIF and PNG files.
2681 ");
2682
2683 if ($imActive) {
2684 // Scaling transparent image
2685 $imageProc->IM_commands=array();
2686 $theFile = t3lib_extMgm::extPath("install")."imgs/jesus2_transp.gif";
2687 if (!@is_file($theFile)) die("Error: ".$theFile." was not a file");
2688
2689 $imageProc->imageMagickConvert_forceFileNameBody="scale_gif";
2690 $fileInfo = $imageProc->imageMagickConvert($theFile,"gif","150","","","","",1);
2691 if ($GLOBALS["TYPO3_CONF_VARS"]["GFX"]["gif_compress"]) {
2692 clearstatcache();
2693 $prevSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
2694 $returnCode = t3lib_div::gif_compress($fileInfo[3],"");
2695 clearstatcache();
2696 $curSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
2697 $note = array("Note on gif_compress() function:","The 'gif_compress' method used was '".$returnCode."'.<BR>Previous filesize: ".$prevSize.". Current filesize:".$curSize);
2698 } else $note=array("Note on gif_compress() function:","<em>Not used! Disabled by [GFX][gif_compress]</em>");
2699 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands,$note);
2700 $this->message($headCode,"GIF to GIF, 150 pixels wide",$result[0],$result[1]);
2701
2702 $imageProc->IM_commands=array();
2703 $theFile = t3lib_extMgm::extPath("install")."imgs/jesus2_transp.png";
2704 if (!@is_file($theFile)) die("Error: ".$theFile." was not a file");
2705
2706 $imageProc->imageMagickConvert_forceFileNameBody="scale_png";
2707 $fileInfo = $imageProc->imageMagickConvert($theFile,"png","150","","","","",1);
2708 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
2709 $this->message($headCode,"PNG to PNG, 150 pixels wide",$result[0],$result[1]);
2710
2711 $imageProc->IM_commands=array();
2712 $theFile = t3lib_extMgm::extPath("install")."imgs/jesus2_transp.gif";
2713 if (!@is_file($theFile)) die("Error: ".$theFile." was not a file");
2714 $imageProc->imageMagickConvert_forceFileNameBody="scale_jpg";
2715 $fileInfo = $imageProc->imageMagickConvert($theFile,"jpg","150","","","","",1);
2716 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
2717 $this->message($headCode,"GIF to JPG, 150 pixels wide",$result[0],$result[1]);
2718 } else {
2719 $this->message($headCode,"Test skipped","
2720 Use of ImageMagick has been disabled in the configuration.
2721 Refer to section 'Basic Configuration' to change or review you configuration settings
2722 ",2);
2723 }
2724 break;
2725 case "combining":
2726 $refParseTime="150"; // 4.2.9
2727 $refParseTime="250"; // 5.2.3
2728 // Combine
2729 $headCode = "Combining images";
2730 $this->message($headCode,"Combining images","
2731 This verifies that the ImageMagick tool, 'combine'/'composite', is able to combine two images through a grayscale mask.<BR>
2732 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)
2733 ");
2734
2735 if ($imActive) {
2736 $imageProc->IM_commands=array();
2737 $input = t3lib_extMgm::extPath("install")."imgs/greenback.gif";
2738 $overlay = t3lib_extMgm::extPath("install")."imgs/jesus.jpg";
2739 $mask = t3lib_extMgm::extPath("install")."imgs/blackwhite_mask.gif";
2740 if (!@is_file($input)) die("Error: ".$input." was not a file");
2741 if (!@is_file($overlay)) die("Error: ".$overlay." was not a file");
2742 if (!@is_file($mask)) die("Error: ".$mask." was not a file");
2743
2744 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5($imageProc->alternativeOutputKey."combine1").".jpg";
2745 $imageProc->combineExec($input,$overlay,$mask,$output);
2746 $fileInfo = $imageProc->getImageDimensions($output);
2747 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
2748 $this->message($headCode,"Combine using a GIF mask with only black and white",$result[0],$result[1]);
2749
2750 // Combine
2751 $imageProc->IM_commands=array();
2752 $input = t3lib_extMgm::extPath("install")."imgs/combine_back.jpg";
2753 $overlay = t3lib_extMgm::extPath("install")."imgs/jesus.jpg";
2754 $mask = t3lib_extMgm::extPath("install")."imgs/combine_mask.jpg";
2755 if (!@is_file($input)) die("Error: ".$input." was not a file");
2756 if (!@is_file($overlay)) die("Error: ".$overlay." was not a file");
2757 if (!@is_file($mask)) die("Error: ".$mask." was not a file");
2758 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5($imageProc->alternativeOutputKey."combine2").".jpg";
2759 $imageProc->combineExec($input,$overlay,$mask,$output);
2760 $fileInfo = $imageProc->getImageDimensions($output);
2761 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
2762 $this->message($headCode,"Combine using a JPG mask with graylevels",$result[0],$result[1]);
2763 } else {
2764 $this->message($headCode,"Test skipped","
2765 Use of ImageMagick has been disabled in the configuration.
2766 Refer to section 'Basic Configuration' to change or review you configuration settings
2767 ",2);
2768 }
2769 break;
2770 case "gdlib":
2771 $refParseTime="1800"; // GIF / 4.2.9 / LZW (5.2.3)
2772 $refParseTime="2700"; // PNG / 4.2.9 / LZW (5.2.3)
2773