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