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