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