00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00151 require_once (PATH_t3lib.'class.t3lib_install.php');
00152 require_once (PATH_t3lib.'class.t3lib_stdgraphic.php');
00153
00162 class tx_install extends t3lib_install {
00163 var $getGD_start_string='<h2 align="center"><a name="module_gd">gd</a></h2>';
00164 var $getGD_end_string = '</table>';
00165 var $getTTF_string = 'with TTF library';
00166 var $getTTF_string_alt = 'with freetype';
00167 var $action = '';
00168 var $scriptSelf = 'index.php';
00169 var $fontTag2='<span class="bodytext">';
00170 var $fontTag1='<span class="smalltext">';
00171 var $updateIdentity = 'TYPO3 Install Tool';
00172 var $headerStyle ='';
00173 var $contentBeforeTable='';
00174 var $setAllCheckBoxesByDefault=0;
00175
00176 var $allowFileEditOutsite_typo3conf_dir=0;
00177
00178 var $INSTALL =array();
00179 var $checkIMlzw = 0;
00180 var $checkIM = 0;
00181 var $dumpImCommands=1;
00182 var $mode = '';
00183 var $step = 0;
00184
00185
00186 var $passwordOK=0;
00187 var $silent=1;
00188 var $messageFunc_nl2br=1;
00189 var $sections=array();
00190 var $fatalError=0;
00191 var $sendNoCacheHeaders=1;
00192 var $config_array = array(
00193 'gd'=>0,
00194 'gd_gif'=>0,
00195 'gd_png'=>0,
00196 'gd_jpg'=>0,
00197 'freetype' => 0,
00198 'safemode' => 0,
00199 'dir_typo3temp' => 0,
00200 'dir_temp' => 0,
00201 'im_versions' => array(),
00202 'im' => 0,
00203 'sql.safe_mode_user' => '',
00204 'mysqlConnect' => 0,
00205 'no_database' => 0
00206 );
00207 var $typo3temp_path='';
00208
00209 var $menuitems = array(
00210 'config' => 'Basic Configuration',
00211 'database' => 'Database Analyser',
00212 'update' => 'Update Wizard',
00213 'images' => 'Image Processing',
00214 'extConfig' => 'All Configuration',
00215 'typo3temp' => 'typo3temp/',
00216 'cleanup' => 'Clean up database',
00217 'phpinfo' => 'phpinfo()',
00218 'typo3conf_edit' => 'Edit files in typo3conf/',
00219 'about' => 'About'
00220 );
00221 var $cookie_name = 'Typo3InstallTool';
00222 var $JSmessage = '';
00223
00224
00225
00226
00227
00228
00234 function tx_install() {
00235 parent::t3lib_install();
00236
00237 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';");
00238
00239 if ($this->sendNoCacheHeaders) {
00240 header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
00241 header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
00242 header('Expires: 0');
00243 header('Cache-Control: no-cache, must-revalidate');
00244 header('Pragma: no-cache');
00245 }
00246
00247
00248
00249
00250 $this->INSTALL = t3lib_div::_GP('TYPO3_INSTALL');
00251 $this->mode = t3lib_div::_GP('mode');
00252 $this->step = t3lib_div::_GP('step');
00253 $this->redirect_url = t3lib_div::_GP('redirect_url');
00254
00255 if ($_GET['TYPO3_INSTALL']['type']) {
00256 $this->INSTALL['type'] = $_GET['TYPO3_INSTALL']['type'];
00257 }
00258
00259 if ($this->step==3) {
00260 $this->INSTALL['type']='database';
00261 }
00262
00263 if ($this->mode=='123') {
00264 $tempItems = $this->menuitems;
00265 unset($this->menuitems);
00266 $this->menuitems['config'] = $tempItems['config'];
00267 $this->menuitems['database'] = $tempItems['database'];
00268 if (!$this->INSTALL['type'] || !isset($this->menuitems[$this->INSTALL['type']])) $this->INSTALL['type'] = 'config';
00269 } else {
00270 if (!$this->INSTALL['type'] || !isset($this->menuitems[$this->INSTALL['type']])) $this->INSTALL['type'] = 'about';
00271 }
00272
00273 $this->action = $this->scriptSelf.'?TYPO3_INSTALL[type]='.$this->INSTALL['type'].($this->mode?'&mode='.rawurlencode($this->mode):'').($this->step?'&step='.rawurlencode($this->step):'');
00274 $this->typo3temp_path = PATH_site.'typo3temp/';
00275
00276
00277
00278
00279
00280
00281 $uKey = $_COOKIE[$this->cookie_name.'_key'];
00282 if (!$uKey) {
00283 $uKey = md5(uniqid(microtime()));
00284 SetCookie($this->cookie_name.'_key', $uKey, 0, '/');
00285
00286 $this->JSmessage='SECURITY:
00287 Make sure to protect the Install Tool with another password than "joh316".
00288 Better yet you can add a die() function call to typo3/install/index.php after usage.
00289
00290 IF THE INSTALL TOOL CRASHES...
00291 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.
00292 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.
00293 On behalf of PHP we regret this inconvenience.
00294
00295 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.
00296 ';
00297
00298 }
00299
00300 $sKey = $_COOKIE[$this->cookie_name];
00301
00302 if (md5($GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'].'|'.$uKey) == $sKey || $this->checkPassword($uKey)) {
00303 $this->passwordOK=1;
00304 if($this->redirect_url) {
00305 header('Location: '.$this->redirect_url);
00306 }
00307 } else {
00308 $this->loginForm();
00309 }
00310 }
00311
00318 function checkPassword($uKey) {
00319 $p = t3lib_div::_GP('password');
00320
00321 if ($p && md5($p)==$GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword']) {
00322 $sKey = md5($GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'].'|'.$uKey);
00323 SetCookie($this->cookie_name, $sKey, 0, '/');
00324
00325
00326 $wEmail = $GLOBALS['TYPO3_CONF_VARS']['BE']['warning_email_addr'];
00327 if ($wEmail) {
00328 $subject="Install Tool Login at '".$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']."'";
00329 $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').')';
00330 mail($wEmail,
00331 $subject,
00332 $email_body,
00333 'From: TYPO3 Install Tool WARNING <>'
00334 );
00335 }
00336 return true;
00337 } else {
00338
00339 if ($p) {
00340 $wEmail = $GLOBALS['TYPO3_CONF_VARS']['BE']['warning_email_addr'];
00341 if ($wEmail) {
00342 $subject="Install Tool Login ATTEMPT at '".$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']."'";
00343 $email_body="There has been a Install Tool login attempt at TYPO3 site '".$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']."' (".t3lib_div::getIndpEnv('HTTP_HOST').").
00344 Password tried was '".$p."'
00345 REMOTE_ADDR was '".t3lib_div::getIndpEnv('REMOTE_ADDR')."' (".t3lib_div::getIndpEnv('REMOTE_HOST').')';
00346 mail($wEmail,
00347 $subject,
00348 $email_body,
00349 'From: TYPO3 Install Tool WARNING <>'
00350 );
00351 }
00352 }
00353 return false;
00354 }
00355 }
00356
00362 function loginForm() {
00363 $p = t3lib_div::_GP('password');
00364 $redirect_url = $this->redirect_url ? $this->redirect_url : $this->action;
00365
00366 $this->messageFunc_nl2br=0;
00367 $this->silent=0;
00368
00369 $content = '<form action="index.php" method="post" name="passwordForm">
00370 <input type="password" name="password"><br />
00371 <input type="hidden" name="redirect_url" value="'.$redirect_url.'">
00372 <input type="submit" value="Log in"><br />
00373 <br />
00374
00375 '.$this->fw('The Install Tool Password is <i>not</i> the admin password of TYPO3.<br />
00376 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.'.
00377 ($p ? '<br /><br />The password you just tried has this md5-value: <br /><br />'.md5($p) : '')
00378 ).'
00379 </form>
00380 <script type="text/javascript">
00381 <!--
00382 document.passwordForm.password.focus();
00383
00384 </script>';
00385
00386 $this->message('Password', 'Enter the Install Tool Password', $content,3);
00387 echo $this->outputWrapper($this->printAll());
00388 }
00389
00396 function init() {
00397 if (!defined('PATH_typo3')) exit;
00398 if (!$this->passwordOK) exit;
00399
00400
00401
00402 $this->check_mail();
00403 $this->setupGeneral();
00404 $this->generateConfigForm();
00405 if (count($this->messages)) t3lib_div::debug($this->messages);
00406
00407 if ($this->step) {
00408 echo $this->outputWrapper($this->stepOutput());
00409 } else {
00410
00411 switch($this->INSTALL['type']) {
00412 case 'images':
00413 $this->checkIM=1;
00414 $this->checkTheConfig();
00415 $this->silent=0;
00416 $this->checkTheImageProcessing();
00417 break;
00418 case 'database':
00419 $this->checkTheConfig();
00420 $this->silent=0;
00421 $this->checkTheDatabase();
00422 break;
00423 case 'update':
00424 $this->checkDatabase();
00425 $this->silent=0;
00426 $this->updateWizard();
00427 break;
00428 case 'config':
00429 $this->silent=0;
00430 $this->checkIM=1;
00431 $this->message('About configuration','How to configure TYPO3',$this->generallyAboutConfiguration());
00432 $this->checkTheConfig();
00433
00434 $ext = 'Write config to localconf.php';
00435 if ($this->fatalError) {
00436 if ($this->config_array['no_database'] || !$this->config_array['mysqlConnect']) {
00437 $this->message($ext, 'Database not configured yet!', '
00438 You need to specify database username, password and host as one of the first things.
00439 Next you\'ll have to select a database to use with TYPO3.
00440 Use the form below:
00441 ',2);
00442 } else {
00443 $this->message($ext, 'Fatal error encountered!', '
00444 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!
00445 You should also check all warnings that may appear.
00446 ',2);
00447 }
00448 } elseif ($this->mode=='123') {
00449 if (!$this->fatalError) {
00450 $this->message($ext, 'Basic configuration completed', '
00451 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.
00452
00453 <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>
00454 ',-1,1);
00455 }
00456 }
00457 $this->message($ext, 'Very Important: Changing Image Processing settings', "
00458 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.
00459 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.
00460 ",1,1);
00461 $this->message($ext, 'Very Important: Changing Encryption Key setting', "
00462 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.
00463 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.
00464 ",1,1);
00465 $this->message($ext, 'Update localconf.php', "
00466 This form updates the localconf.php file with the suggested values you see below. The values are based on the analysis above.
00467 You can change the values in case you have alternatives to the suggested defaults.
00468 By this final step you will configure TYPO3 for immediate use provided that you have no fatal errors left above."
00469 .$this->setupGeneral('get_form'),0,1);
00470
00471 echo $this->outputWrapper($this->printAll());
00472
00473 break;
00474 case 'extConfig':
00475 $this->silent=0;
00476
00477 $this->generateConfigForm('get_form');
00478
00479 $content = $this->printAll();
00480 $content = '<form action="'.$this->action.'" method="post">'.$content.'<input type="submit" value="Write to localconf.php"><br /><br />
00481 '.$this->fw('<strong>NOTICE: </strong>By clicking this button, localconf.php is updated with new values for the parameters listed above!<br />').'
00482 </form>';
00483 echo $this->outputWrapper($content);
00484 break;
00485 case 'typo3temp':
00486 $this->checkTheConfig();
00487 $this->silent=0;
00488 $this->typo3TempManager();
00489 break;
00490 case 'cleanup':
00491 $this->checkTheConfig();
00492 $this->silent=0;
00493 $this->cleanupManager();
00494 break;
00495 case 'phpinfo':
00496 $this->silent=0;
00497 $this->phpinformation();
00498 break;
00499 case 'typo3conf_edit':
00500 $this->silent=0;
00501 $this->typo3conf_edit();
00502 break;
00503 case 'about':
00504 default:
00505 $this->silent=0;
00506 $this->message('About', 'Warning - very important!', $this->securityRisk().$this->alterPasswordForm(),2);
00507
00508 $this->message('About', 'Using this script', "
00509 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.
00510 There are three primary steps for you to take:
00511
00512 <strong>1: Basic Configuration</strong>
00513 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.
00514 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.
00515 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.
00516
00517 <strong>2: Database Analyser</strong>
00518 In this step you can either install a new database or update the database from any previous TYPO3 version.
00519 You can also get an overview of extra/missing fields/tables in the database compared to a raw sql-file.
00520 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.
00521
00522 <strong>3: Update Wizard</strong>
00523 Here you will find update methods taking care of changes to the TYPO3 core which are not backwards compatible.
00524 It is recommended to run this wizard after every update to make sure everything will still work flawlessly.
00525
00526 <strong>4: Image Processing</strong>
00527 This step is a visual guide to verify your configuration of the image processing software.
00528 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.
00529
00530 <strong>5: All Configuration</strong>
00531 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.
00532
00533 <strong>6: typo3temp/</strong>
00534 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.
00535 ");
00536
00537 $this->message('About', 'Why is this script stand-alone?', "
00538 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.
00539 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!
00540 ");
00541
00542
00543 $headCode='Header legend';
00544 $this->message($headCode, 'Just information', '
00545 This is a simple message with some information about something.
00546 ');
00547 $this->message($headCode, 'Check was successful', '
00548 Indicates that something was checked and returned an expected result.
00549 ',-1);
00550 $this->message($headCode, 'Notice!', '
00551 Indicates that something is important to be aware of.
00552 This does <em>not</em> indicate an error.
00553 ',1);
00554 $this->message($headCode, 'Warning!', '
00555 Indicates that something may very well cause trouble and you should definitely look into it before proceeding.
00556 This indicates a <em>potential</em> error.
00557 ',2);
00558 $this->message($headCode, 'Error!', '
00559 Indicates that something is definitely wrong and that TYPO3 will most likely not perform as expected if this problem is not solved.
00560 This indicates an actual error.
00561 ',3);
00562
00563 echo $this->outputWrapper($this->printAll());
00564 break;
00565 }
00566 }
00567 }
00568
00574 function stepOutput() {
00575 $this->checkTheConfig();
00576 $error_missingConnect='<br />
00577 '.$this->fontTag2.'<img src="'.$this->backPath.'gfx/icon_fatalerror.gif" width="18" height="16" class="absmiddle">
00578 There is no connection to the database!<br />
00579 (Username: <i>'.TYPO3_db_username.'</i>, Password: <i>'.TYPO3_db_password.'</i>, Host: <i>'.TYPO3_db_host.'</i>).<br />
00580 <br />
00581 <strong>Go to Step 1</strong> and enter a proper username/password!</span>
00582 <br />
00583 <br />
00584 ';
00585 $error_missingDB='<br />
00586 '.$this->fontTag2.'<img src="'.$this->backPath.'gfx/icon_fatalerror.gif" width="18" height="16" class="absmiddle">
00587 There is no access to the database (<i>'.TYPO3_db.'</i>)!<br />
00588 <br />
00589 <strong>Go to Step 2</strong> and select an accessible database!</span>
00590 <br />
00591 <br />
00592 ';
00593
00594 $whichTables=$this->getListOfTables();
00595 $dbInfo='
00596 <table border="0" cellpadding="1" cellspacing="0">
00597 <tr>
00598 <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>
00599 </tr>
00600 <tr>
00601 <td valign="top" nowrap="nowrap">'.$this->fontTag1.'Username:</span></td>
00602 <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.TYPO3_db_username.'</span></strong></td>
00603 </tr>
00604 <tr>
00605 <td valign="top" nowrap="nowrap">'.$this->fontTag1.'Password:</span></td>
00606 <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.TYPO3_db_password.'</span></strong></td>
00607 </tr>
00608 <tr>
00609 <td valign="top" nowrap="nowrap">'.$this->fontTag1.'Host:</span></td>
00610 <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.TYPO3_db_host.'</span></strong></td>
00611 </tr>
00612 <tr>
00613 <td valign="top" nowrap="nowrap">'.$this->fontTag1.'Database:</span></td>
00614 <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.TYPO3_db.'</span></strong></td>
00615 </tr>
00616 <tr>
00617 <td valign="top" nowrap="nowrap">'.$this->fontTag1.'# of tables:</span></td>
00618 <td valign="top" nowrap="nowrap"><strong>'.$this->fontTag1.''.(count($whichTables)?'<span style="color:#f00;">'.count($whichTables).'</span>':count($whichTables)).'</span></strong></td>
00619 </tr>
00620 </table>
00621 ';
00622 $error_emptyDB='<br />
00623 '.$this->fontTag2.'<img src="'.$this->backPath.'gfx/icon_fatalerror.gif" width="18" height="16" class="absmiddle">
00624 The database is still empty. There are no tables!<br />
00625 <br />
00626 <strong>Go to Step 3</strong> and import a database!</span>
00627 <br />
00628 <br />
00629 ';
00630
00631 switch(strtolower($this->step)) {
00632 case 1:
00633 $msg='
00634 <br />
00635 <br />
00636 <table border="0">
00637 <form action="'.$this->action.'" method="post">
00638 <tr>
00639 <td valign="top" nowrap="nowrap"><strong>
00640 '.$this->fontTag2.'Username:</span></strong>
00641 </td>
00642 <td>
00643 </td>
00644 <td valign="top">
00645 '.$this->fontTag2.'
00646 <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_username]" value="'.TYPO3_db_username.'"></span><br />
00647 </td>
00648 </tr>
00649 <tr>
00650 <td valign="top" nowrap="nowrap"><strong>
00651 '.$this->fontTag2.'Password:</span></strong>
00652 </td>
00653 <td>
00654 </td>
00655 <td valign="top">
00656 '.$this->fontTag2.'
00657 <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_password]" value="'.TYPO3_db_password.'"></span><br />
00658 </td>
00659 </tr>
00660 <tr>
00661 <td valign="top" nowrap="nowrap"><strong>
00662 '.$this->fontTag2.'Host:</span></strong>
00663 </td>
00664 <td>
00665 </td>
00666 <td valign="top">
00667 '.$this->fontTag2.'
00668 <input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_host]" value="'.(TYPO3_db_host?TYPO3_db_host:'localhost').'"></span><br />
00669 </td>
00670 </tr>
00671 <tr>
00672 <td valign="top" nowrap="nowrap"><strong>
00673 '.$this->fontTag1.'</span></strong>
00674 </td>
00675 <td>
00676 </td>
00677 <td valign="top">
00678 '.$this->fontTag1.'<br />
00679 <input type="hidden" name="step" value="2">
00680 <input type="hidden" name="TYPO3_INSTALL[localconf.php][encryptionKey]" value="'.md5(uniqid(rand(),true)).'">
00681 <input type="hidden" name="TYPO3_INSTALL[localconf.php][compat_version]" value="'.TYPO3_version.'">
00682 <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 />
00683 </td>
00684 </tr>
00685 </form>
00686 </table>
00687 <br />
00688 <br />
00689 ';
00690 break;
00691 case 2:
00692 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
00693 $dbArr = $this->getDatabaseList();
00694 reset($dbArr);
00695 $options='';
00696 $options.='<option value="">[ SELECT DATABASE ]</option>';
00697 $dbIncluded=0;
00698 while(list(,$dbname)=each($dbArr)) {
00699 $options.='<option value="'.htmlspecialchars($dbname).'"'.($dbname==TYPO3_db?' selected="selected"':'').'>'.htmlspecialchars($dbname).'</option>';
00700 if ($dbname==TYPO3_db) $dbIncluded=1;
00701 }
00702 if (!$dbIncluded && TYPO3_db) {
00703 $options.='<option value="'.htmlspecialchars(TYPO3_db).'" selected="selected">'.htmlspecialchars(TYPO3_db).' (NO ACCESS!)</option>';
00704 }
00705 $select='<select name="TYPO3_INSTALL[localconf.php][typo_db]">'.$options.'</select>';
00706 $msg='
00707 <br />
00708 <br />
00709 <table border="0">
00710 <form action="'.$this->action.'" method="post">
00711 <tr>
00712 <td valign="top" nowrap="nowrap"><strong>
00713 '.$this->fontTag2.'
00714 You have two options:<br />
00715 <br /><br />
00716
00717 1: Select an existing <u>EMPTY</u> database:</span></strong>
00718 </td>
00719 </tr>
00720 <tr>
00721 <td valign="top">
00722 '.$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 />
00723 </td>
00724 </tr>
00725 <tr>
00726 <td valign="top" nowrap="nowrap"><br />
00727 <br />
00728 <strong>
00729 '.$this->fontTag2.'2: Create new database (recommended):</span></strong>
00730 </td>
00731 </tr>
00732 <tr>
00733 <td valign="top">
00734 '.$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 />
00735 </td>
00736 </tr>
00737 <tr>
00738 <td valign="top"> <br />
00739
00740 '.$this->fontTag1.'<br />
00741 <input type="hidden" name="step" value="3">
00742 <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 />
00743 </td>
00744 </tr>
00745 </form>
00746 </table>
00747 <br />
00748 <br />
00749 ';
00750 } else {
00751 $msg=$error_missingConnect;
00752 }
00753 break;
00754 case 3:
00755 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
00756 if ($GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db)) {
00757 $sFiles = t3lib_div::getFilesInDir(PATH_typo3conf,'sql',1,1);
00758
00759
00760 if (!strstr(implode(',',$sFiles).',', '/database.sql,')) {
00761 array_unshift($sFiles,'Create default database tables');
00762 }
00763
00764 $opt='';
00765 foreach ($sFiles as $f) {
00766 if ($f=='Create default database tables') $key='CURRENT_TABLES+STATIC';
00767 else $key=htmlspecialchars($f);
00768
00769 $opt.='<option value="import|'.$key.'">'.htmlspecialchars(basename($f)).'</option>';
00770 }
00771
00772
00773 $content='
00774 '.$this->fontTag2.'Please select a database dump:</span><br />
00775 <input type="hidden" name="TYPO3_INSTALL[database_import_all]" value=1>
00776 <input type="hidden" name="step" value="">
00777 <input type="hidden" name="goto_step" value="go">
00778 <select name="TYPO3_INSTALL[database_type]">'.$opt.'</select><br />';
00779
00780 $content = $this->getUpdateDbFormWrap('import', $content, 'Import database');
00781
00782 $msg='
00783 <br />
00784 '.$dbInfo.'<br />
00785 <br />
00786 '.$content.'
00787
00788 ';
00789
00790 } else {
00791 $msg=$error_missingDB;
00792 }
00793 } else {
00794 $msg=$error_missingConnect;
00795 }
00796 break;
00797 case 'go':
00798 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
00799 if ($GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db)) {
00800 if (count($whichTables)) {
00801 $msg='
00802 <br />
00803 '.$this->fontTag2.'
00804 '.nl2br($this->messageBasicFinished()).'
00805 <br />
00806 <hr />
00807 <div align="center"><strong><img src="'.$this->backPath.'gfx/icon_warning.gif" hspace="5" width="18" height="16" class="absmiddle">IMPORTANT</strong></div><br />
00808 <span class="smalltext">'.nl2br($this->securityRisk()).'
00809 <br />
00810 <strong>Enter <a href="'.$this->scriptSelf.'">"Normal" mode for the Install Tool</a> to change this!</strong><br />
00811
00812 </span>
00813 </span><br />
00814 ';
00815 } else {
00816 $msg=$error_emptyDB;
00817 }
00818 } else {
00819 $msg=$error_missingDB;
00820 }
00821 } else {
00822 $msg=$error_missingConnect;
00823 }
00824 break;
00825 default:
00826 break;
00827 }
00828 return $msg;
00829 }
00830
00836 function checkTheConfig() {
00837
00838 $this->checkDirs();
00839 $this->checkConfiguration();
00840 $this->checkExtensions();
00841
00842 if (TYPO3_OS=='WIN') {
00843 $paths=array($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw'], $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path'], 'c:\\php\\imagemagick\\', 'c:\\apache\\ImageMagick\\');
00844 } else {
00845 $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/');
00846 }
00847
00848 asort($paths);
00849 if (ini_get('safe_mode')) {
00850 $paths=array(ini_get('safe_mode_exec_dir'),'/usr/local/php/bin/');
00851 }
00852 if ($this->INSTALL['checkIM']['lzw']) {
00853 $this->checkIMlzw=1;
00854 }
00855 if ($this->INSTALL['checkIM']['path']) {
00856 $paths[]=trim($this->INSTALL['checkIM']['path']);
00857 }
00858 if ($this->checkIM) $this->checkImageMagick($paths);
00859 $this->checkDatabase();
00860 }
00861
00867 function typo3conf_edit() {
00868 $EDIT_path = PATH_typo3conf;
00869 if ($this->allowFileEditOutsite_typo3conf_dir && $this->INSTALL['FILE']['EDIT_path']) {
00870 if (t3lib_div::validPathStr($this->INSTALL['FILE']['EDIT_path']) && substr($this->INSTALL['FILE']['EDIT_path'],-1)=='/') {
00871 $tmp_path = PATH_site.$this->INSTALL['FILE']['EDIT_path'];
00872 if (is_dir($tmp_path)) {
00873 $EDIT_path=$tmp_path;
00874 } else {debug("'".$tmp_path."' was not dir");}
00875 } else {
00876 debug('BAD DIR_NAME (must be like t3lib/ or media/script/)');
00877 }
00878 }
00879
00880 $headCode = 'Edit files in '.basename($EDIT_path).'/';
00881 $this->contentBeforeTable='';
00882
00883 if ($this->INSTALL['SAVE_FILE']) {
00884 $save_to_file = $this->INSTALL['FILE']['name'];
00885 if (@is_file($save_to_file)) {
00886 $save_to_file_md5 = md5($save_to_file);
00887 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')) {
00888 $this->INSTALL['typo3conf_files'] = $save_to_file;
00889 $save_fileContent = $this->INSTALL['FILE'][$save_to_file_md5];
00890
00891 if ($this->INSTALL['FILE']['win_to_unix_br']) {
00892 $save_fileContent = str_replace(chr(13).chr(10),chr(10),$save_fileContent);
00893 }
00894
00895 $backupFile = $this->getBackupFilename($save_to_file);
00896 if ($this->INSTALL['FILE']['backup']) {
00897 if (@is_file($backupFile)) { unlink($backupFile); }
00898 rename($save_to_file,$backupFile);
00899 $this->contentBeforeTable.='Backup written to <strong>'.$backupFile.'</strong><br />';
00900 }
00901
00902 t3lib_div::writeFile($save_to_file,$save_fileContent);
00903 $this->contentBeforeTable.='
00904 File saved: <strong>'.$save_to_file.'</strong><br />
00905 MD5-sum: '.$this->INSTALL['FILE']['prevMD5'].' (prev)<br />
00906 MD5-sum: '.md5($save_fileContent).' (new)<br />
00907 ';
00908 }
00909 }
00910 }
00911
00912
00913
00914 $typo3conf_files = t3lib_div::getFilesInDir($EDIT_path,'',1,1);
00915 reset($typo3conf_files);
00916 $lines=array();
00917 $fileFound = 0;
00918 while(list($k,$file)=each($typo3conf_files)) {
00919 if ($this->INSTALL['typo3conf_files'] && !strcmp($this->INSTALL['typo3conf_files'],$file)) {
00920 $wrap=array('<strong><span style="color:navy;">','</span></strong>');
00921 $fileFound = 1;
00922 } else {$wrap=array();}
00923 $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].' ').'</a></td><td>'.$this->fw(t3lib_div::formatSize(filesize($file))).'</td></tr>';
00924 }
00925 $fileList='<table border="0" cellpadding="0" cellspacing="0">'.implode('',$lines).'</table>';
00926 $fileList.='<br />('.$EDIT_path.')';
00927
00928 if ($this->allowFileEditOutsite_typo3conf_dir) {
00929 $fileList.='<br /><form action="'.$this->action.'" method="post">
00930 '.PATH_site.'<input type="text" name="TYPO3_INSTALL[FILE][EDIT_path]" value="'.$this->INSTALL['FILE']['EDIT_path'].'"><input type="submit" name="" value="Set">
00931 </form>';
00932 }
00933
00934 if ($fileFound && @is_file($this->INSTALL['typo3conf_files'])) {
00935 $this->headerStyle = '
00936 <style type="text/css"><!--
00937 SELECT {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00938 TEXTAREA {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00939 INPUT {font-family: Verdana,Arial,Helvetica,Sans-serif; font-size: 10px;}
00940
00941 ';
00942
00943 $backupFile = $this->getBackupFilename($this->INSTALL['typo3conf_files']);
00944 $fileContent = t3lib_div::getUrl($this->INSTALL['typo3conf_files']);
00945 $this->contentBeforeTable.= '<form action="'.$this->action.'" method="post">'.(substr($this->INSTALL['typo3conf_files'],-1)!='~' && !strstr($this->INSTALL['typo3conf_files'],'_bak') ? '
00946 <input type="submit" name="TYPO3_INSTALL[SAVE_FILE]" value="Save file"> ' : '').'
00947 <input type="submit" name="_close" value="Close">
00948 <br />File: '.$this->INSTALL['typo3conf_files'].'
00949 <br />MD5-sum: '.md5($fileContent).'
00950 <br />
00951
00952 <input type="hidden" name="TYPO3_INSTALL[FILE][name]" value="'.$this->INSTALL['typo3conf_files'].'">
00953 '.($this->allowFileEditOutsite_typo3conf_dir?'<input type="hidden" name="TYPO3_INSTALL[FILE][EDIT_path]" value="'.$this->INSTALL['FILE']['EDIT_path'].'">':'').'
00954 <input type="hidden" name="TYPO3_INSTALL[FILE][prevMD5]" value="'.md5($fileContent).'">
00955 <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 />
00956 <input type="checkbox" name="TYPO3_INSTALL[FILE][win_to_unix_br]" value="1"'.(TYPO3_OS=='WIN'?'':' checked="checked"').'> Convert Windows linebreaks (13-10) to Unix (10)<br />
00957 <input type="checkbox" name="TYPO3_INSTALL[FILE][backup]" value="1"'.(@is_file($backupFile) ? ' checked="checked"' : '').'> Make backup copy (rename to '.basename($backupFile).')<br />
00958 '.
00959 '</form>';
00960 }
00961
00962 if ($this->contentBeforeTable) {
00963 $this->contentBeforeTable = $this->fw($this->contentBeforeTable);
00964 }
00965
00966 $this->message($headCode,'Files in folder',$fileList);
00967
00968 echo $this->outputWrapper($this->printAll());
00969 }
00970
00976 function phpinformation() {
00977 $headCode = 'PHP information';
00978
00979 $sVar = t3lib_div::getIndpEnv('_ARRAY');
00980 $sVar['CONST: PHP_OS']=PHP_OS;
00981 $sVar['CONST: TYPO3_OS']=TYPO3_OS;
00982 $sVar['CONST: PATH_thisScript']=PATH_thisScript;
00983 $sVar['CONST: php_sapi_name()']=php_sapi_name();
00984 $sVar['OTHER: TYPO3_VERSION']=$GLOBALS['TYPO_VERSION'];
00985 $sVar['OTHER: PHP_VERSION']=phpversion();
00986 $sVar['imagecreatefromgif()']=function_exists('imagecreatefromgif');
00987 $sVar['imagecreatefrompng()']=function_exists('imagecreatefrompng');
00988 $sVar['imagecreatefromjpeg()']=function_exists('imagecreatefromjpeg');
00989 $sVar['imagegif()']=function_exists('imagegif');
00990 $sVar['imagepng()']=function_exists('imagepng');
00991 $sVar['imagejpeg()']=function_exists('imagejpeg');
00992 $sVar['imagettftext()']=function_exists('imagettftext');
00993 $sVar['OTHER: IMAGE_TYPES']=function_exists('imagetypes') ? imagetypes() : 0;
00994 $sVar['OTHER: memory_limit']=ini_get('memory_limit');
00995
00996 $gE_keys = explode(',','SERVER_PORT,SERVER_SOFTWARE,GATEWAY_INTERFACE,SCRIPT_NAME,PATH_TRANSLATED');
00997 while(list(,$k)=each($gE_keys)) {
00998 $sVar['SERVER: '.$k]=$_SERVER[$k];
00999 }
01000
01001 $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');
01002 while(list(,$k)=each($gE_keys)) {
01003 $sVar['T3CV_GFX: '.$k]=$GLOBALS['TYPO3_CONF_VARS']['GFX'][$k];
01004 }
01005
01006 $debugInfo=array();
01007 $debugInfo[]='### DEBUG SYSTEM INFORMATION - START ###';
01008 reset($sVar);
01009 while(list($kkk,$vvv)=each($sVar)) {
01010 $debugInfo[]=str_pad(substr($kkk,0,20),20).': '.$vvv;
01011 }
01012 $debugInfo[]='### DEBUG SYSTEM INFORMATION - END ###';
01013
01014 $buf=$this->messageFunc_nl2br;
01015 $this->messageFunc_nl2br=0;
01016 $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 />
01017 <form action=""><textarea rows="10" '.$this->formWidthText(80,'','off').' wrap="off" class="fixed-font">'.t3lib_div::formatForTextarea(implode(chr(10),$debugInfo)).'</textarea></form>');
01018 $this->messageFunc_nl2br=$buf;
01019
01020 $getEnvArray = array();
01021 $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');
01022 while(list(,$k)=each($gE_keys)) {
01023 $getEnvArray[$k] = getenv($k);
01024 }
01025 $this->message($headCode,'t3lib_div::getIndpEnv()',t3lib_div::view_array(t3lib_div::getIndpEnv('_ARRAY')));
01026 $this->message($headCode,'getenv()',t3lib_div::view_array($getEnvArray));
01027 $this->message($headCode,'_ENV',t3lib_div::view_array($_ENV));
01028 $this->message($headCode,'_SERVER',t3lib_div::view_array($_SERVER));
01029 $this->message($headCode,'_COOKIE',t3lib_div::view_array($_COOKIE));
01030 $this->message($headCode,'_GET',t3lib_div::view_array($_GET));
01031
01032 ob_start();
01033 phpinfo();
01034 $contents = explode('<body>',ob_get_contents());
01035 ob_end_clean();
01036 $contents = explode('</body>',$contents[1]);
01037
01038 $this->message($headCode,'phpinfo()',$contents[0]);
01039
01040
01041
01042 $this->headerStyle = '
01043 <style type="text/css"><!--
01044 a { text-decoration: none; }
01045 a:hover { text-decoration: underline; }
01046 h1 { font-family: verdana,arial, helvetica, sans-serif; font-size: 14pt; font-weight: bold;}
01047 h2 { font-family: verdana,arial, helvetica, sans-serif; font-size: 12pt; font-weight: bold;}
01048 body, td { font-family: verdana,arial, helvetica, sans-serif; font-size: 10pt; }
01049 th { font-family: verdana,arial, helvetica, sans-serif; font-size: 10pt; font-weight: bold; }
01050
01051 ';
01052
01053 echo $this->outputWrapper($this->printAll());
01054 }
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01079 function typo3TempManager() {
01080 $headCode = 'typo3temp/ directory';
01081 $this->message($headCode,'What is it?','
01082 TYPO3 uses this directory for temporary files, mainly processed and cached images.
01083 The filenames are very cryptic; They are unique representations of the file properties made by md5-hashing a serialized array with information.
01084 Anyway this directory may contain many thousand files and a lot of them may be of no use anymore.
01085
01086 With this test you can delete the files in this folder. When you do that, you should also clear the cache database tables afterwards.
01087 ');
01088
01089 if (!$this->config_array['dir_typo3temp']) {
01090 $this->message('typo3temp/ directory','typo3temp/ not writable!',"
01091 You must make typo3temp/ write enabled before you can proceed with this test.
01092 ",2);
01093 echo $this->outputWrapper($this->printAll());
01094 return;
01095 }
01096
01097
01098 $fileCounter = 0;
01099 $deleteCounter = 0;
01100 $criteriaMatch = 0;
01101 $tmap=array('day'=>1, 'week'=>7, 'month'=>30);
01102 $tt = $this->INSTALL['typo3temp_delete'];
01103 $subdir = $this->INSTALL['typo3temp_subdir'];
01104 if (strlen($subdir) && !ereg('^[[:alnum:]_]+/$',$subdir)) die('subdir "'.$subdir.'" was not allowed!');
01105 $action = $this->INSTALL['typo3temp_action'];
01106 $d = @dir($this->typo3temp_path.$subdir);
01107 if (is_object($d)) {
01108 while($entry=$d->read()) {
01109 $theFile = $this->typo3temp_path.$subdir.$entry;
01110 if (@is_file($theFile)) {
01111 $ok = 0;
01112 $fileCounter++;
01113 if ($tt) {
01114 if (t3lib_div::testInt($tt)) {
01115 if (filesize($theFile) > $tt*1024) $ok=1;
01116 } else {
01117 if (fileatime($theFile) < time()-(intval($tmap[$tt])*60*60*24)) $ok=1;
01118 }
01119 } else {
01120 $ok = 1;
01121 }
01122 if ($ok) {
01123 $hashPart=substr(basename($theFile),-14,10);
01124 if (!ereg('[^a-f0-9]',$hashPart) || substr($theFile,-6)==='.cache' || substr($theFile,-4)==='.tbl' || substr(basename($theFile),0,8)==='install_') {
01125 if ($action && $deleteCounter<$action) {
01126 $deleteCounter++;
01127 unlink($theFile);
01128 } else {
01129 $criteriaMatch++;
01130 }
01131 }
01132 }
01133 }
01134 }
01135 $d->close();
01136 }
01137
01138
01139 $subdirRegistry = array(''=>'');
01140 $d = @dir($this->typo3temp_path);
01141 if (is_object($d)) {
01142 while($entry=$d->read()) {
01143 $theFile = $entry;
01144 if (@is_dir($this->typo3temp_path.$theFile) && $theFile!='..' && $theFile!='.') {
01145 $subdirRegistry[$theFile.'/'] = $theFile.'/ (Files: '.count(t3lib_div::getFilesInDir($this->typo3temp_path.$theFile)).')';
01146 }
01147 }
01148 }
01149
01150 $deleteType=array(
01151 '0' => 'All',
01152 'day' => 'Last access more than a day ago',
01153 'week' => 'Last access more than a week ago',
01154 'month' => 'Last access more than a month ago',
01155 '10' => 'Filesize greater than 10 kb',
01156 '50' => 'Filesize greater than 50 kb',
01157 '100' => 'Filesize greater than 100 kb'
01158 );
01159
01160 $actionType=array(
01161 '0' => "Don't delete, just display statistics",
01162 '100' => 'Delete 100',
01163 '500' => 'Delete 500',
01164 '1000' => 'Delete 1000'
01165 );
01166
01167 $content='<select name="TYPO3_INSTALL[typo3temp_delete]">'.$this->getSelectorOptions($deleteType,$tt).'</select>
01168 <br />
01169 Number of files at a time:
01170 <select name="TYPO3_INSTALL[typo3temp_action]">'.$this->getSelectorOptions($actionType).'</select>
01171
01172 From sub-directory:
01173 <select name="TYPO3_INSTALL[typo3temp_subdir]">'.$this->getSelectorOptions($subdirRegistry, $this->INSTALL['typo3temp_subdir']).'</select>
01174 ';
01175
01176 $form = '<form action="'.$this->action.'" method="post">'.$content.'
01177
01178 <input type="submit" value="Execute">
01179 </form>
01180 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.';
01181
01182 $this->message($headCode,'Statistics','
01183 Number of temporary files: <strong>'.($fileCounter-$deleteCounter)."</strong>
01184 Number matching '".htmlspecialchars($deleteType[$tt])."': <strong>".$criteriaMatch.'</strong>
01185 Number deleted: <strong>'.$deleteCounter.'</strong>
01186 <br />
01187 '.$form,1);
01188
01189 echo $this->outputWrapper($this->printAll());
01190 }
01191
01199 function getSelectorOptions($deleteType,$tt='') {
01200 $out='';
01201 if (is_array($deleteType)) {
01202 reset($deleteType);
01203 while(list($v,$l)=each($deleteType)) {
01204 $out.='<option value="'.htmlspecialchars($v).'"'.(!strcmp($v,$tt)?' selected="selected"':'').'>'.htmlspecialchars($l).'</option>';
01205 }
01206 }
01207 return $out;
01208 }
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01231 function cleanupManager() {
01232 $headCode = 'Clean up database';
01233 $this->message($headCode,'What is it?','
01234 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.
01235
01236 <strong>Clear cached image sizes</strong>
01237 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.
01238
01239 You should <em>Clear All Cache</em> in the backend after clearing this cache.
01240 ');
01241
01242 $tables = $this->getListOfTables();
01243 $action = $this->INSTALL['cleanup_type'];
01244
01245 if (($action == 'cache_imagesizes' || $action == 'all') && isset ($tables['cache_imagesizes'])) {
01246 $GLOBALS['TYPO3_DB']->exec_DELETEquery ('cache_imagesizes','');
01247 }
01248
01249 $cleanupType = array (
01250 'all' => 'Clean up everything',
01251 );
01252
01253
01254 if (isset ($tables['cache_imagesizes'])) {
01255 $cleanupType['cache_imagesizes'] = 'Clear cached image sizes only';
01256 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('COUNT(*) AS icount', 'cache_imagesizes', '');
01257 $resArr = $GLOBALS['TYPO3_DB']->sql_fetch_assoc ($res);
01258 $cachedImageSizesCounter = intval ($resArr['icount']);
01259 } else {
01260 $this->message($headCode,'Table cache_imagesizes does not exist!',"
01261 The table cache_imagesizes was not found. Please check your database settings in Basic Configuration and compare your table definition with the Database Analyzer.
01262 ",2);
01263 $cachedImageSizesCounter = 'unknown';
01264 }
01265
01266 $content = '<select name="TYPO3_INSTALL[cleanup_type]">'.$this->getSelectorOptions($cleanupType).'</select> ';
01267 $form = '<form action="'.$this->action.'" method="post">'.$content.'<input type="submit" value="Execute"></form>';
01268 $this->message($headCode,'Statistics','
01269 Number cached image sizes: <strong>'.$cachedImageSizesCounter.'</strong><br />
01270 '.$form,1);
01271
01272 echo $this->outputWrapper($this->printAll());
01273 }
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01299 function generateConfigForm($type='') {
01300 $default_config_content = t3lib_div::getUrl(PATH_t3lib.'config_default.php');
01301 $commentArr = $this->getDefaultConfigArrayComments($default_config_content);
01302
01303 switch($type) {
01304 case 'get_form':
01305 reset($GLOBALS['TYPO3_CONF_VARS']);
01306 $this->messageFunc_nl2br=0;
01307 while(list($k,$va)=each($GLOBALS['TYPO3_CONF_VARS'])) {
01308 $ext='['.$k.']';
01309 $this->message($ext, '$TYPO3_CONF_VARS[\''.$k.'\']',$commentArr[0][$k],1);
01310
01311 while(list($vk,$value)=each($va)) {
01312 $description = trim($commentArr[1][$k][$vk]);
01313 $isTextarea = preg_match('/^string \(textarea\)/i',$description) ? TRUE : FALSE;
01314
01315 if (!is_array($value) && ($this->checkForBadString($value) || $isTextarea)) {
01316 $k2='['.$vk.']';
01317 $msg=$description.'<br /><br /><em>'.$ext.$k2.' = '.htmlspecialchars(t3lib_div::fixed_lgd($value,60)).'</em><br />';
01318
01319 if ($isTextarea) {
01320 $form='<textarea name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" cols="60" rows="5" wrap="off">'.htmlspecialchars($value).'</textarea>';
01321 } elseif (preg_match('/^boolean/i',$description)) {
01322 $form='<input type="hidden" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" value="0">';
01323 $form.='<input type="checkbox" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']"'.($value?' checked="checked"':'').' value="'.($value&&strcmp($value,'0')?htmlspecialchars($value):1).'">';
01324 } else {
01325 $form='<input type="text" size="40" name="TYPO3_INSTALL[extConfig]['.$k.']['.$vk.']" value="'.htmlspecialchars($value).'">';
01326 }
01327 $this->message($ext, $k2,$msg.$form);
01328 }
01329 }
01330 }
01331 break;
01332 default:
01333 if (is_array($this->INSTALL['extConfig'])) {
01334 reset($this->INSTALL['extConfig']);
01335 $lines = $this->writeToLocalconf_control();
01336 while(list($k,$va)=each($this->INSTALL['extConfig'])) {
01337 if (is_array($GLOBALS['TYPO3_CONF_VARS'][$k])) {
01338 while(list($vk,$value)=each($va)) {
01339 if (isset($GLOBALS['TYPO3_CONF_VARS'][$k][$vk])) {
01340 $doit=1;
01341 if ($k=='BE' && $vk=='installToolPassword') {
01342 if ($value) {
01343 if (isset($_POST['installToolPassword_check']) && (!t3lib_div::_GP('installToolPassword_check') || strcmp(t3lib_div::_GP('installToolPassword_check'),$value))) {
01344 $doit=0;
01345 t3lib_div::debug('ERROR: The two passwords did not match! The password was not changed.');
01346 }
01347 if (t3lib_div::_GP('installToolPassword_md5')) $value =md5($value);
01348 } else $doit=0;
01349 }
01350
01351 $description = trim($commentArr[1][$k][$vk]);
01352 if (preg_match('/^string \(textarea\)/i', $description)) {
01353 $value = str_replace(chr(13),'',$value);
01354 $value = str_replace(chr(10),"'.chr(10).'",$value);
01355 }
01356
01357 if ($doit && strcmp($GLOBALS['TYPO3_CONF_VARS'][$k][$vk],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\''.$k.'\'][\''.$vk.'\']', $value);
01358 }
01359 }
01360 }
01361 }
01362 $this->writeToLocalconf_control($lines);
01363 }
01364 break;
01365 }
01366 }
01367
01376 function getDefaultConfigArrayComments($string,$mainArray=array(),$commentArray=array()) {
01377 $lines = explode(chr(10),$string);
01378 $in=0;
01379 $mainKey='';
01380 while(list(,$lc)=each($lines)) {
01381 $lc = trim($lc);
01382 if ($in) {
01383 if (!strcmp($lc,');')) {
01384 $in=0;
01385 } else {
01386 if (preg_match('/["\']([[:alnum:]_-]*)["\'][[:space:]]*=>(.*)/i',$lc,$reg)) {
01387 preg_match('/,[\t\s]*\/\/(.*)/i',$reg[2],$creg);
01388 $theComment = trim($creg[1]);
01389 if (substr(strtolower(trim($reg[2])),0,5)=='array' && !strcmp($reg[1],strtoupper($reg[1]))) {
01390 $mainKey=trim($reg[1]);
01391 $mainArray[$mainKey]=$theComment;
01392 } elseif ($mainKey) {
01393 $commentArray[$mainKey][$reg[1]]=$theComment;
01394 }
01395 }
01396 }
01397 }
01398 if (!strcmp($lc,'$TYPO3_CONF_VARS = Array(')) {
01399 $in=1;
01400 }
01401 }
01402 return array($mainArray,$commentArray);
01403 }
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01428 function checkConfiguration() {
01429 $ext='php.ini configuration checked';
01430 $this->message($ext);
01431
01432
01433
01434
01435
01436
01437 $incPaths = t3lib_div::trimExplode(TYPO3_OS=='WIN'?';':':', ini_get('include_path'));
01438 if (!in_array('.',$incPaths)) {
01439 $this->message($ext, 'Current dir (./) is not in include path!',"
01440 <i>include_path=".ini_get('include_path')."</i>
01441 Normally the current path, '.', is included in the include_path of PHP. Although TYPO3 is made to work around this it is an unusual setting that may introduce problems.
01442 ",1);
01443 } else $this->message($ext, 'Current dir in include path',"",-1);
01444
01445
01446
01447
01448 if (!ini_get('file_uploads')) {
01449 $this->message($ext, 'File uploads not allowed',"
01450 <i>file_uploads=".ini_get('file_uploads')."</i>
01451 TYPO3 uses the ability to upload files from the browser in various cases.
01452 As long as this flag is disabled, you'll not be able to upload files.
01453 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!
01454 However if you cannot enable fileupload for some reason alternatively you change the default form encoding value with \$TYPO3_CONF_VARS[SYS][form_enctype].
01455 ",3);
01456 } else $this->message($ext, 'File uploads allowed',"",-1);
01457 $upload_max_filesize = $this->convertByteSize(ini_get('upload_max_filesize'));
01458 if ($upload_max_filesize<10000*1024) {
01459 $this->message($ext, 'Max Upload filesize too small?',"
01460 <i>upload_max_filesize=".ini_get('upload_max_filesize')."</i>
01461 By default TYPO3 supports uploading, copying and moving files of sizes up to 10000 kb (10 MB) (You can alter the TYPO3 defaults by the config option TYPO3_CONF_VARS[BE][maxFileSize]).
01462 Your current value is below this, so at this point, PHP sets the limits for uploaded filesizes and not TYPO3.
01463 <strong>Notice:</strong> The limits for filesizes attached to database records are set in the tables.php configuration file (\$TCA) for each group/file field.
01464 ",1);
01465 }
01466
01467
01468
01469
01470 $memory_limit_value = $this->convertByteSize(ini_get('memory_limit'));
01471 if ($memory_limit_value && $memory_limit_value < 16*1024*1024) {
01472 $this->message($ext, 'Memory Limit below 16 MB',"
01473 <i>memory_limit=".ini_get('memory_limit')."</i>
01474 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.
01475 ",3);
01476 } elseif(!$memory_limit_value) {
01477 $this->message($ext, 'Memory Limit',"<i>No Memory Limit in effect.</i>",-1);
01478 } else $this->message($ext, 'Memory Limit',"<i>memory_limit=".ini_get('memory_limit')."</i>",-1);
01479 if (ini_get('max_execution_time')<30) {
01480 $this->message($ext, 'Max Execution Time below default 30 seconds',"
01481 <i>max_execution_time=".ini_get('max_execution_time')."</i>
01482 May impose problems if too low.
01483 ",1);
01484 } else $this->message($ext, 'Max Execution Time',"<i>max_execution_time=".ini_get('max_execution_time')."</i>",-1);
01485 if (ini_get('disable_functions')) {
01486 $this->message($ext, 'Functions disabled!',"
01487 <i>disable_functions=".ini_get('disable_functions')."</i>
01488 The above list of functions are disabled. If TYPO3 use any of these there might be trouble.
01489 TYPO3 is designed to use the default set of PHP4.0.6+ functions plus the functions from GDLib.
01490 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.
01491 ",2);
01492 } else $this->message($ext, 'Functions disabled: none',"",-1);
01493 if (!ini_get('sendmail_path')) {
01494 $this->message($ext, 'Sendmail path not defined!',"
01495 <i>sendmail_path=".ini_get('sendmail_path')."</i>
01496 This may be critical to TYPO3's use of the mail() function. Please be sure that the mail() function in your php-installation works!
01497 ".$this->check_mail('get_form'),1);
01498 } else {
01499 list($prg) = explode(' ',ini_get('sendmail_path'));
01500 if (TYPO3_OS=='WIN') {
01501 $this->message($ext, 'Sendmail program not searched for on Windows',"",1);
01502 } else {
01503 if (!@is_executable($prg)) {
01504 $this->message($ext, 'Sendmail program not found or not executable?',"
01505 <i>sendmail_path=".ini_get('sendmail_path')."</i>
01506 This may be critical to TYPO3's use of the mail() function. Please be sure that the mail() function in your php-installation works!
01507 ".$this->check_mail('get_form'),1);
01508 } else {
01509 $this->message($ext, 'Sendmail OK',"
01510 <i>sendmail_path=".ini_get('sendmail_path').'</i>
01511 You may check the mail() function by entering your emailaddress here:
01512 '.$this->check_mail('get_form'),-1);
01513 }
01514 }
01515 }
01516
01517
01518
01519
01520 if (ini_get('safe_mode')) {
01521 $this->message($ext, 'Safe mode turned on',"
01522 <i>safe_mode=".ini_get('safe_mode')."</i>
01523 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.
01524 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/\".
01525 If you use safe_mode with TYPO3, you should disable use of external programs ([BE][disable_exec_function]=1).
01526 In safe mode you must ensure that all the php-scripts and upload folders are owned by the same user.
01527
01528 <i>safe_mode_exec_dir=".ini_get('safe_mode_exec_dir')."</i>
01529 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)
01530
01531
01532 <strong>Example of safe_mode settings:</strong>
01533 Set this in the php.ini file:
01534
01535 ; Safe Mode
01536 safe_mode = On
01537 safe_mode_exec_dir = /usr/bin/
01538
01539 ...and the ImageMagick '/usr/bin/convert' will be executable.
01540 The last slash is important (..../) and you can only specify one directory.
01541
01542 <strong>Notice: </strong>
01543 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.
01544 Paths to ImageMagick are defined in localconf.php and may be something else than /usr/bin/, but this is default for ImageMagick 5+
01545
01546
01547 ",2);
01548 if (ini_get('doc_root')) {
01549 $this->message($ext, 'doc_root set',"
01550 <i>doc_root=".ini_get('doc_root')."</i>
01551 PHP cannot execute scripts outside this directory. If that is a problem is please correct it.
01552 ",1);
01553 }
01554 $this->config_array['safemode']=1;
01555 } else $this->message($ext, 'safe_mode: off',"",-1);
01556 if (ini_get('sql.safe_mode')) {
01557 $this->message($ext, 'sql.safe_mode is enabled',"
01558 <i>sql.safe_mode=".ini_get('sql.safe_mode').'</i>
01559 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:
01560 The owner of the current file is: <strong>'.get_current_user ()."</strong>
01561 ",1);
01562 $this->config_array['sql.safe_mode_user'] = get_current_user();
01563 } else $this->message($ext, 'sql.safe_mode: off',"",-1);
01564 if (ini_get('open_basedir')) {
01565 $this->message($ext, 'open_basedir set',"
01566 <i>open_basedir=".ini_get('open_basedir')."</i>
01567 This restricts TYPO3 to open and include files only in this path. Please make sure that this does not prevent TYPO3 from running.
01568 <strong>Notice (UNIX):</strong> Before checking a path according to open_basedir, PHP resolves all symbolic links.
01569 ",1);
01570
01571 } else $this->message($ext, 'open_basedir: off',"",-1);
01572
01573 }
01574
01581 function check_mail($cmd='') {
01582 switch($cmd) {
01583 case 'get_form':
01584 $out='
01585 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.
01586 <form action="'.$this->action.'" method="post"><input type="text" name="TYPO3_INSTALL[check_mail]"><br /><input type="checkbox" name="TYPO3_INSTALL[use_htmlmail]" >Test t3lib_htmlmail.
01587 <input type="submit" value="Send test mail"></form>';
01588 break;
01589 default:
01590 if (trim($this->INSTALL['check_mail'])) {
01591 $subject = 'TEST SUBJECT';
01592 $email = trim($this->INSTALL['check_mail']);
01593
01594 if($this->INSTALL['use_htmlmail']) {
01595 require_once (PATH_t3lib.'class.t3lib_htmlmail.php');
01596 $emailObj = t3lib_div::makeInstance('t3lib_htmlmail');
01597 $emailObj->start();
01598 $emailObj->subject = $subject;
01599 $emailObj->from_email = 'test@test.test';
01600 $emailObj->from_name = 'TYPO3 Install Tool';
01601 $emailObj->returnPath = 'null@'.t3lib_div::getIndpEnv('HTTP_HOST');
01602 $emailObj->addPlain('TEST CONTENT');
01603 $emailObj->setHTML($emailObj->encodeMsg('<html><body>HTML TEST CONTENT</body></html>'));
01604 $emailObj->send($email);
01605 } else {
01606 t3lib_div::plainMailEncoded($email,$subject,'TEST CONTENT','From: test@test.test');
01607 }
01608 $this->messages[]= 'MAIL WAS SENT TO: '.$email;
01609 }
01610 break;
01611 }
01612 return $out;
01613 }
01614
01620 function checkExtensions() {
01621 $ext = 'GDLib';
01622 $this->message($ext);
01623
01624 $software_info=1;
01625 if (extension_loaded('gd') && $this->isGD()) {
01626 $this->config_array['gd']=1;
01627 $this->message($ext, 'GDLib found',"",-1);
01628 if ($this->isPNG()) {
01629 $this->config_array['gd_png']=1;
01630 $this->message($ext, 'PNG supported',"",-1);
01631 }
01632 if ($this->isGIF()) {
01633 $this->config_array['gd_gif']=1;
01634 $this->message($ext, 'GIF supported',"",-1);
01635 }
01636 if ($this->isJPG()) {
01637 $this->config_array['gd_jpg']=1;
01638 $this->message($ext, 'JPG supported (not used by TYPO3)','');
01639 }
01640 if (!$this->config_array['gd_gif'] && !$this->config_array['gd_png']) {
01641 $this->message($ext, 'PNG or GIF not supported', nl2br(trim('
01642 Your GDLib supports either GIF nor PNG. It must support either one of them.
01643 ')), 2);
01644 } else {
01645 $msg=array();
01646 if ($this->config_array['gd_gif'] && $this->config_array['gd_png']) {
01647 $msg[0]='You can choose between generating GIF or PNG files, as your GDLib supports both.';
01648 }
01649 if ($this->config_array['gd_gif']) {
01650 $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!
01651 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.";
01652 }
01653 if ($this->config_array['gd_png']) {
01654 $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.';
01655 }
01656 $this->message($ext, 'GIF / PNG issues', nl2br(trim(implode($msg,chr(10)))), 1);
01657 }
01658 if (!$this->isTTF()) {
01659 $this->message($ext, 'FreeType is apparently not installed', "
01660 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'.
01661 ", 2);
01662 } else {
01663 $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);
01664 $this->config_array['freetype']=1;
01665 }
01666 } else {
01667 $this->message($ext, 'GDLib not found', "
01668 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.
01669 GDLib is also used in the TYPO3 Backend (TBE) to generate record icons and new module tabs.
01670 It's highly recommended to install this library. Remember to compile GD with FreeType which is also required.
01671 If you choose not to install GDLib, you can disable it in the configuration with [GFX][gdlib]=0;.
01672 ", 2);
01673 }
01674 $this->message($ext, 'GDLib software information', nl2br(trim($this->getGDSoftwareInfo())));
01675 }
01676
01682 function checkDirs() {
01683
01684 $ext='Directories';
01685 $this->message($ext);
01686
01687 $uniqueName = md5(uniqid(microtime()));
01688
01689
01690
01691
01692
01693
01694
01695 $checkWrite=array(
01696 'typo3temp/' => array('This folder is used by both the frontend (FE) and backend (BE) interface for image manipulated files.',2,'dir_typo3temp'),
01697 'typo3temp/pics/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01698 'typo3temp/temp/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01699 'typo3temp/llxml/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01700 'typo3temp/cs/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01701 'typo3temp/GB/' => array('This folder is part of the typo3temp/ section. It needs to be writable, too.',2,'dir_typo3temp'),
01702 '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),
01703 'typo3conf/ext/' => array('Location for local extensions. Must be writable if the Extension Manager is supposed to install extensions for this website.',0),
01704 'typo3conf/l10n/' => array('Location for translations. Must be writable if the Extension Manager is supposed to install translations for extensions.',0),
01705 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),
01706 'uploads/' => array('Location for uploaded files from RTE + in the subdirs for tables.',2),
01707 'uploads/pics/' => array('Typical location for uploaded files (images especially).',0),
01708 'uploads/media/' => array('Typical location for uploaded files (non-images especially).',0),
01709 'uploads/tf/' => array('Typical location for uploaded files (TS template resources).',0),
01710 'fileadmin/' => array('Location for local files such as templates, independent uploads etc.',-1),
01711 'fileadmin/_temp_/' => array('Typical temporary location for default upload of files by administrators.',0),
01712 );
01713
01714 foreach ($checkWrite as $relpath => $descr) {
01715
01716 $general_message = $descr[0];
01717 if (!@is_dir(PATH_site.$relpath)) {
01718 if ($descr[1]) {
01719 $this->message($ext, $relpath.' directory does not exist','
01720 <em>Full path: '.PATH_site.$relpath.'</em>
01721 '.$general_message.'
01722
01723 This error should not occur as '.$relpath.' must always be accessible in the root of a TYPO3 website.
01724 ',3);
01725 } else {
01726 if ($descr[1] == 0) {
01727 $msg = 'This directory does not necessarily have to exist but if it does it must be writable.';
01728 } else {
01729 $msg = 'This directory does not necessarily have to exist and if it does it can be writable or not.';
01730 }
01731 $this->message($ext, $relpath.' directory does not exist','
01732 <em>Full path: '.PATH_site.$relpath.'</em>
01733 '.$general_message.'
01734
01735 '.$msg.'
01736 ',2);
01737 }
01738 } else {
01739 $file = PATH_site.$relpath.$uniqueName;
01740 @touch($file);
01741 if (@is_file($file)) {
01742 unlink($file);
01743 if ($descr[2]) { $this->config_array[$descr[2]]=1; }
01744 $this->message($ext, $relpath.' writable','',-1);
01745 } else {
01746 $severity = ($descr[1]==2 || $descr[1]==0) ? 3 : 2;
01747 if ($descr[1] == 0 || $descr[1] == 2) {
01748 $msg = 'The directory '.$relpath.' must be writable!';
01749 } elseif ($descr[1] == -1 || $descr[1] == 1) {
01750 $msg = 'The directory '.$relpath.' does not neccesarily have to be writable.';
01751 }
01752 $this->message($ext, $relpath.' directory not writable','
01753 <em>Full path: '.$file.'</em>
01754 '.$general_message.'
01755
01756 Tried to write this file (with touch()) but didn\'t succeed.
01757 '.$msg.'
01758 ',$severity);
01759 }
01760 }
01761 }
01762 }
01763
01772 function checkImageMagick($paths) {
01773 $ext='Check Image Magick';
01774 $this->message($ext);
01775
01776 $paths = array_unique($paths);
01777
01778 $programs = explode(',','gm,convert,combine,composite,identify');
01779 $isExt = TYPO3_OS=="WIN" ? ".exe" : "";
01780 $this->config_array['im_combine_filename']='combine';
01781 reset($paths);
01782 while(list($k,$v)=each($paths)) {
01783 reset($programs);
01784 if (!ereg('[\\\/]$',$v)) $v.='/';
01785 while(list(,$filename)=each($programs)) {
01786 if (ini_get('open_basedir') || (@file_exists($v)&&@is_file($v.$filename.$isExt))) {
01787 $version = $this->_checkImageMagick_getVersion($filename,$v);
01788 if($version > 0) {
01789 if($filename=='gm') {
01790 $index[$v]['gm']=$version;
01791 continue;
01792 } else {
01793 $index[$v][$filename]=$version;
01794 }
01795 }
01796 }
01797 }
01798 if (count($index[$v])>=3 || $index[$v]['gm']) { $this->config_array['im']=1; }
01799
01800 if ($index[$v]['gm'] || (!$index[$v]['composite'] && $index[$v]['combine'])) {
01801 $this->config_array['im_combine_filename']='combine';
01802 } elseif ($index[$v]['composite'] && !$index[$v]['combine']) {
01803 $this->config_array['im_combine_filename']='composite';
01804 }
01805
01806 if (isset($index[$v]['convert']) && $this->checkIMlzw) {
01807 $index[$v]['gif_capability'] = ''.$this->_checkImageMagickGifCapability($v);
01808 }
01809 }
01810 $this->config_array['im_versions']=$index;
01811 if (!$this->config_array['im']) {
01812 $this->message($ext, 'No ImageMagick install available',"
01813 It seems that there is no adequate ImageMagick installation available at the checked locations (".implode($paths, ', ').")
01814 An 'adequate' installation for requires 'convert', 'combine'/'composite' and 'identify' to be available
01815 ",2);
01816 } else {
01817 $theCode='';
01818 reset($this->config_array['im_versions']);
01819 while(list($p,$v)=each($this->config_array['im_versions'])) {
01820 $ka=array();
01821 reset($v);
01822 while(list($ka[])=each($v)){}
01823 $theCode.='<tr><td>'.$this->fw($p).'</td><td>'.$this->fw(implode($ka,'<br />')).'</td><td>'.$this->fw(implode($v,'<br />')).'</td></tr>';
01824 }
01825 $this->message($ext, 'Available ImageMagick/GraphicsMagick installations:','<table border="1" cellpadding="2" cellspacing="2">'.$theCode.'</table>',-1);
01826 }
01827 $this->message($ext, 'Search for ImageMagick:','
01828 <form action="'.$this->action.'" method="post">
01829 <input type="checkbox" name="TYPO3_INSTALL[checkIM][lzw]" value="1"'.($this->INSTALL['checkIM']['lzw']?' checked="checked"':'').'> Check LZW capabilities.
01830
01831 Check this path for ImageMagick installation:
01832 <input type="text" name="TYPO3_INSTALL[checkIM][path]" value="'.htmlspecialchars($this->INSTALL['checkIM']['path']).'">
01833 (Eg. "D:\wwwroot\im537\ImageMagick\" for windows or "/usr/bin/" for Unix)<br />
01834
01835 <input type="submit" value="Send">
01836 </form>
01837 ',0);
01838
01839 }
01840
01847 function _checkImageMagickGifCapability($path) {
01848 if ($this->config_array['dir_typo3temp']) { // && !$this->config_array['safemode']
01849 $tempPath = $this->typo3temp_path;
01850 $uniqueName = md5(uniqid(microtime()));
01851 $dest = $tempPath.$uniqueName.'.gif';
01852 $src = $this->backPath.'gfx/typo3logo.gif';
01853 if (@is_file($src) && !strstr($src,' ') && !strstr($dest,' ')) {
01854 $cmd = t3lib_div::imageMagickCommand('convert', $src.' '.$dest, $path);
01855 exec($cmd);
01856 } else die('No typo3/gfx/typo3logo.gif file!');
01857 $out='';
01858 if (@is_file($dest)) {
01859 $new_info = @getimagesize($dest);
01860 clearstatcache();
01861 $new_size = filesize($dest);
01862 $src_info = @getimagesize($src);
01863 clearstatcache();
01864 $src_size = @filesize($src);
01865
01866 if ($new_info[0]!=$src_info[0] || $new_info[1]!=$src_info[1] || !$new_size || !$src_size) {
01867 $out='error';
01868 } else {
01869 if ($new_size/$src_size > 4) { // NONE-LZW ratio was 5.5 in test
01870 $out='NONE';
01871 } elseif ($new_size/$src_size > 1.5) { // NONE-RLE ratio was not tested
01872 $out='RLE';
01873 } else {
01874 $out='LZW';
01875 }
01876 }
01877 unlink($dest);
01878 }
01879 return $out;
01880 }
01881 }
01882
01890 function _checkImageMagick_getVersion($file, $path) {
01891 // Temporarily override some settings
01892 $im_version = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'];
01893 $combine_filename = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename'];
01894
01895 if ($file=='gm') {
01896 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'] = 'gm';
01897 $file = 'identify'; // Work-around, preventing execution of "gm gm"
01898 $parameters = '-version'; // Work-around - GM doesn't like to be executed without any arguments
01899 } else {
01900 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'] = 'im5';
01901
01902 if($file=='combine' || $file=='composite') { // Override the combine_filename setting
01903 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename'] = $file;
01904 }
01905 }
01906
01907 $cmd = t3lib_div::imageMagickCommand($file, $parameters, $path);
01908 $retVal = false;
01909 exec($cmd, $retVal);
01910 $string = $retVal[0];
01911 list(,$ver) = explode('Magick', $string);
01912 list($ver) = explode(' ',trim($ver));
01913
01914 // Restore the values
01915 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'] = $im_version;
01916 $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename'] = $combine_filename;
01917 return trim($ver);
01918 }
01919
01925 function checkDatabase() {
01926 $ext='Check database';
01927 $this->message($ext);
01928
01929 if (!extension_loaded('mysql') && !t3lib_extMgm::isLoaded('dbal')) {
01930 $this->message($ext, 'MySQL not available',"
01931 PHP does not feature MySQL support (which is pretty unusual).
01932 ",2);
01933 } else {
01934 $cInfo='
01935 Username: <strong>'.TYPO3_db_username.'</strong>
01936 Password: <strong>'.TYPO3_db_password.'</strong>
01937 Host: <strong>'.TYPO3_db_host.'</strong>
01938 ';
01939 if (!TYPO3_db_host || !TYPO3_db_username) {
01940 $this->message($ext, 'Username, password or host not set',"
01941 You may need to enter data for these values:
01942 ".trim($cInfo)."
01943
01944 Use the form below.
01945 ",2);
01946 }
01947 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
01948 $this->message($ext, 'Connected to SQL database successfully',"
01949 ".trim($cInfo)."
01950 ",-1,1);
01951 $this->config_array['mysqlConnect']=1;
01952 if (!TYPO3_db) {
01953 $this->message($ext, 'No database selected',"
01954 Currently you have no database selected.
01955 Please select one or create a new database.
01956 ",3);
01957 $this->config_array['no_database']=1;
01958 } elseif (!$GLOBALS['TYPO3_DB']->sql_select_db(TYPO3_db)) {
01959 $this->message($ext, 'Database',"
01960 '".TYPO3_db."' could not be selected as database!
01961 Please select another one or create a new database.
01962 ",3,1);
01963 $this->config_array['no_database']=1;
01964 } else {
01965 $this->message($ext, 'Database',"
01966 <strong>".TYPO3_db."</strong> is selected as database.
01967 ",1,1);
01968 }
01969 } else {
01970 $this->message($ext, 'Could not connect to SQL database!',"
01971 Connecting to SQL database failed with these settings:
01972 ".trim($cInfo)."
01973
01974 Make sure you're using the correct set of data.".($this->config_array['sql.safe_mode_user']? "
01975 <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']."'":"")."
01976 ",3);
01977 }
01978 }
01979 }
01980
01987 function setupGeneral($cmd='') {
01988 switch($cmd) {
01989 case 'get_form':
01990 // Database:
01991 $out='
01992 <form name="setupGeneral" action="'.$this->action.'" method="post">
01993 <table border="0" cellpadding="0" cellspacing="0">';
01994
01995 $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>":""));
01996 $out.=$this->wrapInCells('Password:', '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_password]" value="'.htmlspecialchars(TYPO3_db_password).'">');
01997 $out.=$this->wrapInCells('Host:', '<input type="text" name="TYPO3_INSTALL[localconf.php][typo_db_host]" value="'.htmlspecialchars(TYPO3_db_host).'">');
01998 if ($this->config_array['mysqlConnect']) {
01999 $dbArr = $this->getDatabaseList();
02000 reset($dbArr);
02001 $options='';
02002 $dbIncluded=0;
02003 while(list(,$dbname)=each($dbArr)) {
02004 $options.='<option value="'.htmlspecialchars($dbname).'"'.($dbname==TYPO3_db?' selected="selected"':'').'>'.htmlspecialchars($dbname).'</option>';
02005 if ($dbname==TYPO3_db) $dbIncluded=1;
02006 }
02007 if (!$dbIncluded && TYPO3_db) {
02008 $options.='<option value="'.htmlspecialchars(TYPO3_db).'" selected="selected">'.htmlspecialchars(TYPO3_db).' (NO ACCESS!)</option>';
02009 }
02010 $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="">';
02011 } else {
02012 $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).'">';
02013 }
02014 $out.=$this->wrapInCells('', '<br />');
02015 $out.=$this->wrapInCells('Database:', $theCode);
02016 $out.=$this->wrapInCells('', '<br />');
02017
02018 if ($this->mode!='123') {
02019 $out.=$this->wrapInCells('Site name:', '<input type="text" name="TYPO3_INSTALL[localconf.php][sitename]" value="'.htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']).'">');
02020 $out.=$this->wrapInCells('', '<br />');
02021 $out.='<script type="text/javascript" src="../md5.js"></script><script type="text/javascript">function generateEncryptionKey(key) {time=new Date(); key=MD5(time.getMilliseconds().toString());while(key.length<66){key=key+MD5(key)};return key;}</script>';
02022 $out.=$this->wrapInCells('Encryption key:', '<a name="set_encryptionKey"></a><input type="text" name="TYPO3_INSTALL[localconf.php][encryptionKey]" value="'.htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']).'"><br /><input type="button" onclick="document.forms[\'setupGeneral\'].elements[\'TYPO3_INSTALL[localconf.php][encryptionKey]\'].value=generateEncryptionKey(document.forms[\'setupGeneral\'].elements[\'TYPO3_INSTALL[localconf.php][encryptionKey]\'].value);" value="Generate random key">');
02023 $out.=$this->wrapInCells('', '<br />');
02024
02025
02026 $fA = $this->setupGeneralCalculate();
02027
02028 if (is_array($fA['disable_exec_function'])) {
02029 $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']));
02030 }
02031 if (is_array($fA['gdlib'])) {
02032 $out.=$this->wrapInCells('[GFX][gdlib]=', $this->getFormElement($fA['gdlib'], $fA['gdlib'], 'TYPO3_INSTALL[localconf.php][gdlib]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']));
02033 if (is_array($fA['gdlib_png']) && $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']) {
02034 $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']));
02035 }
02036 }
02037 if (is_array($fA['im'])) {
02038 $out.=$this->wrapInCells('[GFX][im]=', $this->getFormElement($fA['im'], $fA['im'], 'TYPO3_INSTALL[localconf.php][im]', $GLOBALS['TYPO3_CONF_VARS']['GFX']['im']));
02039 $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']));
02040 $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']));
02041 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im']) {
02042 if (is_array($fA['im_path'])) {
02043 $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']));
02044 }
02045 if (is_array($fA['im_path_lzw'])) {
02046 $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']));
02047 }
02048 }
02049 }
02050 $out.=$this->wrapInCells('[GFX][TTFdpi]=', '<input type="text" name="TYPO3_INSTALL[localconf.php][TTFdpi]" value="'.htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['GFX']['TTFdpi']).'">');
02051 }
02052
02053
02054 $out.=$this->wrapInCells('', '<br /><input type="submit" value="Update localconf.php"><br />
02055 <strong>NOTICE: </strong>By clicking this button, localconf.php is updated with new values for the parameters listed above!');
02056 $out.='
02057 </table>
02058 </form>';
02059 break;
02060 default:
02061 if (is_array($this->INSTALL['localconf.php'])) {
02062 $errorMessages=array();
02063 $lines = $this->writeToLocalconf_control();
02064
02065
02066 #debug($this->INSTALL);
02067 if (trim($this->INSTALL['localconf.php']['NEW_DATABASE_NAME'])) {
02068 $newdbname=trim($this->INSTALL['localconf.php']['NEW_DATABASE_NAME']);
02069 if (!ereg('[^[:alnum:]_-]',$newdbname)) {
02070 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
02071 if ($GLOBALS['TYPO3_DB']->admin_query('CREATE DATABASE '.$newdbname)) {
02072 $this->INSTALL['localconf.php']['typo_db'] = $newdbname;
02073 $this->messages[]= "Database '".$newdbname."' created";
02074 } else $this->messages[]= $errorMessages[] = "Could not create database '".$newdbname."' (...not created)";
02075 } else $this->messages[]= $errorMessages[] = "Could not connect to database when creating database '".$newdbname."' (...not created)";
02076 } else $this->messages[]= $errorMessages[] = "The NEW database name '".$newdbname."' was not alphanumeric, a-zA-Z0-9_- (...not created)";
02077 }
02078 #debug($this->messages) ;
02079
02080 reset($this->INSTALL['localconf.php']);
02081 while(list($key,$value)=each($this->INSTALL['localconf.php'])) {
02082 switch((string)$key) {
02083 case 'typo_db_username':
02084 if (strlen($value)<50) {
02085 if (strcmp(TYPO3_db_username,$value)) $this->setValueInLocalconfFile($lines, '$typo_db_username', trim($value));
02086 } else $this->messages[]= $errorMessages[] = "Username '".$value."' was longer than 50 chars (...not saved)";
02087 break;
02088 case 'typo_db_password':
02089 if (strlen($value)<50) {
02090 if (strcmp(TYPO3_db_password,$value)) $this->setValueInLocalconfFile($lines, '$typo_db_password', trim($value));
02091 } else $this->messages[]= $errorMessages[] = "Password '".$value."' was longer than 50 chars (...not saved)";
02092 break;
02093 case 'typo_db_host':
02094 if (!ereg("[^[:alnum:]_\.:-]",$value) && strlen($value)<50) {
02095 if (strcmp(TYPO3_db_host,$value)) $this->setValueInLocalconfFile($lines, '$typo_db_host', $value);
02096 } else $this->messages[]= $errorMessages[] = "Host '".$value."' was not alphanumeric, a-zA-Z0-9_-:., or longer than 50 chars (...not saved)";
02097 break;
02098 case 'typo_db':
02099 if (strlen($value)<50) {
02100 if (strcmp(TYPO3_db,$value)) $this->setValueInLocalconfFile($lines, '$typo_db', trim($value));
02101 } else $this->messages[]= $errorMessages[] = "Database name '".$value."' was longer than 50 chars (...not saved)";
02102 break;
02103 case 'disable_exec_function':
02104 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['BE']['disable_exec_function'],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'BE\'][\'disable_exec_function\']', $value?1:0);
02105 break;
02106 case 'sitename':
02107 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'SYS\'][\'sitename\']', $value);
02108 break;
02109 case 'encryptionKey':
02110 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'SYS\'][\'encryptionKey\']', $value);
02111 break;
02112 case 'compat_version':
02113 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['SYS']['compat_version'],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'SYS\'][\'compat_version\']', $value);
02114 break;
02115 case 'im_combine_filename':
02116 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_combine_filename'],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\'][\'im_combine_filename\']', $value);
02117 break;
02118 case 'gdlib':
02119 case 'gdlib_png':
02120 case 'im':
02121 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX'][$key],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\']["'.$key.'"]', $value?1:0);
02122 break;
02123 case 'im_path':
02124 list($value,$version) = explode('|',$value);
02125 if (!ereg('[[:space:]]',$value,$reg) && strlen($value)<100) {
02126 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX'][$key],$value)) {
02127 $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\']["'.$key.'"]', $value);
02128 }
02129 if(doubleval($version)>0 && doubleval($version)<4) {
02130 $value_ext = 'gm';
02131 } elseif(doubleval($version)<5) {
02132 $value_ext = '';
02133 } else {
02134 $value_ext = 'im5';
02135 }
02136 if (strcmp(strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']),$value_ext)) {
02137 $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\'][\'im_version_5\']', $value_ext);
02138 }
02139
02140 } else $this->messages[]= $errorMessages[] = "Path '".$value."' contains spaces or is longer than 100 chars (...not saved)";
02141 break;
02142 case 'im_path_lzw':
02143 list($value) = explode('|',$value);
02144 if (!ereg('[[:space:]]',$value) && strlen($value)<100) {
02145 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX'][$key],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\']["'.$key.'"]', $value);
02146 } else $this->messages[]= $errorMessages[] = "Path '".$value."' contains spaces or is longer than 100 chars (...not saved)";
02147 break;
02148 case 'TTFdpi':
02149 if (strcmp($GLOBALS['TYPO3_CONF_VARS']['GFX']['TTFdpi'],$value)) $this->setValueInLocalconfFile($lines, '$TYPO3_CONF_VARS[\'GFX\'][\'TTFdpi\']', $value);
02150 break;
02151 }
02152
02153
02154 }
02155
02156 if (count($errorMessages)) {
02157 echo '<h3>ERRORS</h3>';
02158 echo t3lib_div::view_array($errorMessages);
02159 echo 'Click the browsers "Back" button to reenter the values.';
02160 exit;
02161 }
02162 $this->writeToLocalconf_control($lines);
02163 }
02164 break;
02165 }
02166 return $out;
02167 }
02168
02176 function writeToLocalconf_control($lines="", $showOutput=1) {
02177 $returnVal = parent::writeToLocalconf_control($lines);
02178
02179 if ($showOutput) {
02180 switch($returnVal) {
02181 case 'continue':
02182 $content = '<br /><br />'.implode($this->messages,'<hr />').'<br /><br /><a href="'.$this->action.'">Click to continue...</a>';
02183 $this->outputExitBasedOnStep($content);
02184 break;
02185 case 'nochange':
02186 $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>';
02187 $this->outputExitBasedOnStep('<br />'.$content);
02188 break;
02189 }
02190 }
02191 return $returnVal;
02192 }
02193
02200 function outputExitBasedOnStep($content) {
02201 if ($this->step) {
02202 Header('Location: '.t3lib_div::locationHeaderUrl($this->action));
02203 } else {
02204 echo $this->outputWrapper($content);
02205 }
02206 exit;
02207 }
02208
02216 function setLabelValueArray($arr,$type) {
02217 reset($arr);
02218 while(list($k,$v)=each($arr)) {
02219 if($this->config_array['im_versions'][$v]['gm']) {
02220 $program = 'gm';
02221 } else {
02222 $program = 'convert';
02223 }
02224
02225 switch($type) {
02226 case 0:
02227 $arr[$k].='|'.$this->config_array['im_versions'][$v][$program];
02228 break;
02229 case 1:
02230 if($this->config_array['im_versions'][$v][$program]) {
02231 $arr[$k].= ' ('.$this->config_array['im_versions'][$v][$program];
02232 $arr[$k].= ($this->config_array['im_versions'][$v]['gif_capability'] ? ', '.$this->config_array['im_versions'][$v]['gif_capability'] : '');
02233 $arr[$k].= ')';
02234 } else {
02235 $arr[$k].= '';
02236 }
02237 break;
02238 case 2:
02239 $arr[$k].=' ('.($v==1?'PNG':'GIF').')';
02240 break;
02241 }
02242 }
02243 return $arr;
02244 }
02245
02256 function getFormElement($labels,$values,$fieldName,$default,$msg='') {
02257 $out.='<strong>'.htmlspecialchars(current($labels)).'</strong><br />current value is '.htmlspecialchars($default).($msg?'<br />'.$msg:'');
02258 if (count($labels)>1) {
02259 reset($labels);
02260 while(list($k,$v)=each($labels)) {
02261 list($cleanV) =explode('|',$values[$k]);
02262 $options.='<option value="'.htmlspecialchars($values[$k]).'"'.(!strcmp($default,$cleanV)?' selected="selected"':'').'>'.htmlspecialchars($v).'</option>';
02263 }
02264 $out.='<br /><select name="'.$fieldName.'">'.$options.'</select>';
02265 } else {
02266 $out.='<input type="hidden" name="'.$fieldName.'" value="'.htmlspecialchars(current($values)).'">';
02267 }
02268 return $out.'<br />';
02269 }
02270
02276 function getDatabaseList() {
02277 $dbArr=array();
02278 if ($result = $GLOBALS['TYPO3_DB']->sql_pconnect(TYPO3_db_host, TYPO3_db_username, TYPO3_db_password)) {
02279 $dbArr = $GLOBALS['TYPO3_DB']->admin_get_dbs();
02280 }
02281 return $dbArr;
02282 }
02283
02300 function setupGeneralCalculate() {
02301 $formArray['disable_exec_function']=array(0);
02302 $formArray['im_path']=array('');
02303 $formArray['im_path_lzw']=array('');
02304 $formArray['im_combine_filename']=array('');
02305 $formArray['im_version_5']=array('');
02306 $formArray['im']=array(1);
02307 $formArray['gdlib']=array(1);
02308 if ($this->config_array['gd'] && ($this->config_array['gd_gif'] || $this->config_array['gd_png'])) {
02309 if ($this->config_array['gd_gif'] && !$this->config_array['gd_png']) {
02310 $formArray['gdlib_png']=array(0);
02311 } elseif (!$this->config_array['gd_gif'] && $this->config_array['gd_png']) {
02312 $formArray['gdlib_png']=array(1);
02313 } else {
02314 $formArray['gdlib_png']=array(0,1);
02315 }
02316 } else {
02317 $formArray['gdlib']=array(0);
02318 }
02319 if ($this->config_array['safemode']) {
02320 $formArray['disable_exec_function']=array(1);
02321 }
02322 if ($this->config_array['im']) {
02323 $formArray['im']=array(1);
02324 $LZW_found=0;
02325 $found=0;
02326 reset($this->config_array['im_versions']);
02327 $totalArr=array();
02328 while(list($path,$dat)=each($this->config_array['im_versions'])) {
02329 if (count($dat)>=3) {
02330 if (doubleval($dat['convert'])<5) {
02331 $formArray['im_version_5']=array(0);
02332 if ($dat['gif_capability']=='LZW') {
02333 $formArray['im_path']=array($path);
02334 $found=2;
02335 } elseif ($found<2) {
02336 $formArray['im_path']=array($path);
02337 $found=1;
02338 }
02339 } elseif (!$found) {
02340 $formArray['im_version_5']=array('im5');
02341 $formArray['im_path']=array($path);
02342 $found=1;
02343 }
02344 } elseif ($dat['gm']) {
02345 $formArray['im_version_5']=array('gm');
02346 if ($dat['gif_capability']=='LZW') {
02347 $formArray['im_path']=array($path);
02348 $found=2;
02349 } elseif ($found<2) {
02350 $formArray['im_path']=array($path);
02351 $found=1;
02352 }
02353 }
02354 if ($dat['gif_capability']=='LZW') {
02355 if (doubleval($dat['convert'])<5 || !$LZW_found) {
02356 $formArray['im_path_lzw']=array($path);
02357 $LZW_found=1;
02358 }
02359 } elseif ($dat['gif_capability']=="RLE" && !$LZW_found) {
02360 $formArray['im_path_lzw']=array($path);
02361 }
02362 $totalArr[]=$path;
02363 }
02364 $formArray['im_path']=array_unique(array_merge($formArray['im_path'],$totalArr));
02365 $formArray['im_path_lzw']=array_unique(array_merge($formArray['im_path_lzw'],$totalArr));
02366 $formArray['im_combine_filename']=array($this->config_array['im_combine_filename']);
02367 } else {
02368 $formArray['im']=array(0);
02369 }
02370 return $formArray;
02371 }
02372
02378 function getGDPartOfPhpinfo() {
02379 ob_start();
02380 phpinfo();
02381 $contents = ob_get_contents();
02382 ob_end_clean();
02383 $start_string = $this->getGD_start_string;
02384 $end_string = $this->getGD_end_string;
02385 list(,$gdpart_tmp) = explode($start_string,$contents,2);
02386 list($gdpart) = explode($end_string,$start_string.$gdpart_tmp,2);
02387 $gdpart.=$end_string;
02388 return $gdpart;
02389 }
02390
02397 function isTTF($phpinfo='') {
02398
02399
02400
02401
02402
02403 if (!function_exists('imagettftext')) return 0;
02404
02405
02406 $im = @imagecreate (300, 50);
02407 $background_color = imagecolorallocate ($im, 255, 255, 55);
02408 $text_color = imagecolorallocate ($im, 233, 14, 91);
02409
02410 $test = @imagettftext($im, t3lib_div::freetypeDpiComp(20), 0, 10, 20, $text_color, PATH_t3lib."/fonts/vera.ttf", 'Testing Truetype support');
02411 if (t3lib_div::_GP('testingTrueTypeSupport')) {
02412 if ($this->isGIF()) {
02413 header ('Content-type: image/gif');
02414 imagegif ($im);
02415 } else {
02416 header ('Content-type: image/png');
02417 imagepng ($im);
02418 }
02419 exit;
02420 }
02421 return is_array($test)?1:0;
02422 }
02423
02424
02425
02426
02427
02428
02429
02430
02431
02432
02433
02434
02435
02436
02437
02438
02439
02440
02441
02442
02446 function isGD() {
02447 if (function_exists('imagecreate')) {
02448 if (@imagecreate (50, 100)) return 1;
02449 }
02450 }
02451
02457 function isGIF() {
02458 if (function_exists('imagecreatefromgif') && function_exists('imagegif') && ($this->ImageTypes() & IMG_GIF)) {
02459 $im = @imagecreatefromgif(t3lib_extMgm::extPath('install').'imgs/jesus.gif');
02460 return $im?1:0;
02461 }
02462 }
02463
02469 function isJPG() {
02470 if (function_exists('imagecreatefromjpeg') && function_exists('imagejpeg') && ($this->ImageTypes() & IMG_JPG)) {
02471 return 1;
02472 }
02473 }
02474
02480 function isPNG() {
02481 if (function_exists('imagecreatefrompng') && function_exists('imagepng') && ($this->ImageTypes() & IMG_PNG)) {
02482 $im = imagecreatefrompng(t3lib_extMgm::extPath('install').'imgs/jesus.png');
02483 return $im?1:0;
02484 }
02485 }
02486
02492 function ImageTypes() {
02493 if (phpversion()!='4.1.2') {
02494 return imagetypes();
02495 } else return IMG_GIF+IMG_JPG+IMG_PNG;
02496 }
02497
02503 function getGDSoftwareInfo() {
02504 return trim('
02505 You can get GDLib in the PNG version from '.$this->linkIt('http:
02506 Generally, software for TYPO3 is found at '.$this->linkIt('http:
02507 ');
02508 }
02509
02515 function generallyAboutConfiguration() {
02516 $out='
02517 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.
02518 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.
02519 See this page for '.$this->linkIt('http:
02520 ';
02521 return trim($out);
02522 }
02523
02524
02525
02526
02527
02528
02529
02530
02531
02532
02533
02534
02535
02536
02537
02538
02539
02540
02541
02575 function checkTheImageProcessing() {
02576 $this->message('Image Processing','What is it?',"
02577 TYPO3 is known for its ability to process images on the server.
02578 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).
02579 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).
02580 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.
02581
02582 In order to do this, TYPO3 uses two sets of tools:
02583
02584 <strong>ImageMagick:</strong>
02585 For conversion of non-web formats to webformats, combining images with alpha-masks, performing image-effects like blurring and sharpening.
02586 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).
02587 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).
02588 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])
02589 ImageMagick homepage is at ".$this->linkIt('http:
02590
02591 <strong>GDLib:</strong>
02592 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.
02593 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.
02594 ".$this->getGDSoftwareInfo().'
02595
02596 You can disable all image processing options in TYPO3 ([GFX][image_processing]=0), but that would seriously disable TYPO3.
02597 ');
02598
02599 $this->message('Image Processing','Verifying the image processing capabilities of your server',"
02600 This page performs image processing and displays the result. It's a thorough check that everything you've configured is working correctly.
02601 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.
02602
02603 The image to the right is the reference image (how it should be) and to the left the image made by your server.
02604 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.
02605
02606 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.
02607 ");
02608
02609 $im_path = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path'];
02610 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']=='gm') {
02611 $im_path_version = $this->config_array['im_versions'][$im_path]['gm'];
02612 } else {
02613 $im_path_version = $this->config_array['im_versions'][$im_path]['convert'];
02614 }
02615 $im_path_lzw = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw'];
02616 $im_path_lzw_version = $this->config_array['im_versions'][$im_path_lzw]['convert'];
02617 $msg = '
02618 ImageMagick enabled: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im'].'</strong>
02619 ImageMagick path: <strong>'.$im_path.'</strong> ('.$im_path_version.')
02620 ImageMagick path/LZW: <strong>'.$im_path_lzw.'</strong> ('.$im_path_lzw_version.')
02621 Version 5/GraphicsMagick flag: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'].'</strong>
02622
02623 GDLib enabled: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib'].'</strong>
02624 GDLib using PNG: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_png'].'</strong>
02625 GDLib 2 enabled: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib_2'].'</strong>
02626 IM5 effects enabled: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_v5effects'].'</strong> (Blurring/Sharpening with IM 5+)
02627 Freetype DPI: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['TTFdpi'].'</strong> (Should be 96 for Freetype 2)
02628 Mask invert: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_imvMaskState'].'</strong> (Should be set for some IM versions approx. 5.4+)
02629
02630 File Formats: <strong>'.$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'].'</strong>
02631 ';
02632
02633 // Various checks to detect IM/GM version mismatches
02634 $mismatch=false;
02635 switch (strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'])) {
02636 case 'gm':
02637 if (doubleval($im_path_version)>=2) $mismatch=true;
02638 break;
02639 case 'im4':
02640 if (doubleval($im_path_version)>=5) $mismatch=true;
02641 break;
02642 default:
02643 if (($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']?true:false) != (doubleval($im_path_version)>=5)) $mismatch=true;
02644 break;
02645 }
02646
02647 if ($mismatch) {
02648 $msg.= 'Warning: Mismatch between the version of ImageMagick'.
02649 ' ('.$im_path_version.') and the configuration of '.
02650 '[GFX][im_version_5] ('.$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5'].')';
02651 $etype=2;
02652 } else $etype=1;
02653
02654 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']=='gm') {
02655 $msg = str_replace('ImageMagick','GraphicsMagick',$msg);
02656 }
02657
02658 $this->message('Image Processing','Current configuration',$msg,$etype);
02659
02660
02661
02662
02663 if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['image_processing']) {
02664 $this->message('Image Processing','Image Processing disabled!',"
02665 Image Processing is disabled by the config flag <nobr>[GFX][image_processing]</nobr> set to false (zero)
02666 ",2);
02667 echo $this->outputWrapper($this->printAll());
02668 return;
02669 }
02670 if (!$this->config_array['dir_typo3temp']) {
02671 $this->message('Image Processing','typo3temp/ not writable!',"
02672 You must make typo3temp/ write enabled before you can proceed with this test.
02673 ",2);
02674 echo $this->outputWrapper($this->printAll());
02675 return;
02676 }
02677
02678
02679
02680 $msg='<a name="testmenu"></a>Click each of these links in turn to test a topic. <strong>Please be aware that each test may take several seconds!</strong>:
02681
02682 '.$this->imagemenu();
02683 $this->message('Image Processing','Testmenu',$msg,'');
02684
02685
02686 $this->messageFunc_nl2br=0;
02687 $parseStart = microtime();
02688 $imageProc = t3lib_div::makeInstance('t3lib_stdGraphic');
02689 $imageProc->init();
02690 $imageProc->tempPath = $this->typo3temp_path;
02691 $imageProc->dontCheckForExistingTempFile=1;
02692 // $imageProc->filenamePrefix='install_'.($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_version_5']?"v5":"");
02693 $imageProc->filenamePrefix='install_';
02694 $imageProc->dontCompress=1;
02695 $imageProc->alternativeOutputKey='TYPO3_INSTALL_SCRIPT';
02696 $imageProc->noFramePrepended=$GLOBALS['TYPO3_CONF_VARS']['GFX']['im_noFramePrepended'];
02697
02698 // Very temporary!!!
02699 $imageProc->dontUnlinkTempFiles=0;
02700
02701
02702 $imActive = ($this->config_array['im'] && $im_path);
02703 $gdActive = ($this->config_array['gd'] && $GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']);
02704
02705 switch($this->INSTALL['images_type']) {
02706 case 'read':
02707 $refParseTime='5600'; // 4.2.9
02708 $refParseTime='3300'; // 5.2.3
02709 $headCode = 'Reading and converting images';
02710 $this->message($headCode,'Supported file formats',"
02711 This verifies that your ImageMagick installation is able to read the nine default file formats; JPG, GIF, PNG, TIF, BMP, PCX, TGA, PDF, AI.
02712 The tool 'identify' will be used to read the pixeldimensions of non-web formats.
02713 The tool 'convert' is used to read the image and write a temporary JPG-file
02714 ");
02715
02716 if ($imActive) {
02717 // Reading formats - writing JPG
02718
02719 $extArr = explode(',','jpg,gif,png,tif,bmp,pcx,tga');
02720 while(list(,$ext)=each($extArr)) {
02721 if ($this->isExtensionEnabled($ext, $headCode, "Read ".strtoupper($ext))) {
02722 $imageProc->IM_commands=array();
02723 $theFile = t3lib_extMgm::extPath('install').'imgs/jesus.'.$ext;
02724 if (!@is_file($theFile)) die('Error: '.$theFile.' was not a file');
02725
02726 $imageProc->imageMagickConvert_forceFileNameBody='read_'.$ext;
02727 $fileInfo = $imageProc->imageMagickConvert($theFile,'jpg',"",'',"",'',"",1);
02728 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02729 $this->message($headCode,"Read ".strtoupper($ext),$result[0],$result[1]);
02730 }
02731 }
02732
02733 if ($this->isExtensionEnabled('pdf', $headCode, 'Read PDF')) {
02734 $imageProc->IM_commands=array();
02735 $theFile = t3lib_extMgm::extPath('install').'imgs/pdf_from_imagemagick.pdf';
02736 if (!@is_file($theFile)) die('Error: '.$theFile.' was not a file');
02737
02738 $imageProc->imageMagickConvert_forceFileNameBody='read_pdf';
02739 $fileInfo = $imageProc->imageMagickConvert($theFile,'jpg',"170",'',"",'',"",1);
02740 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02741 $this->message($headCode,'Read PDF',$result[0],$result[1]);
02742 }
02743 if ($this->isExtensionEnabled('ai', $headCode, 'Read AI')) {
02744 $imageProc->IM_commands=array();
02745 $theFile = t3lib_extMgm::extPath('install').'imgs/typo3logotype.ai';
02746 if (!@is_file($theFile)) die('Error: '.$theFile.' was not a file');
02747
02748 $imageProc->imageMagickConvert_forceFileNameBody='read_ai';
02749 $fileInfo = $imageProc->imageMagickConvert($theFile,'jpg',"170",'',"",'',"",1);
02750 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02751 $this->message($headCode,'Read AI',$result[0],$result[1]);
02752 }
02753 } else {
02754 $this->message($headCode,'Test skipped',"
02755 Use of ImageMagick has been disabled in the configuration.
02756 Refer to section 'Basic Configuration' to change or review you configuration settings
02757 ",2);
02758 }
02759 break;
02760 case 'write':
02761 $refParseTime='300';
02762
02763 // Writingformats - writing JPG
02764 $headCode = 'Writing images';
02765 $this->message($headCode,'Writing GIF and PNG','
02766 This verifies that ImageMagick is able to write GIF and PNG files.
02767 The GIF-file is attempted compressed with LZW by the t3lib_div::gif_compress() function.
02768 ');
02769
02770 if ($imActive) {
02771 // Writing GIF
02772 $imageProc->IM_commands=array();
02773 $theFile = t3lib_extMgm::extPath('install').'imgs/jesus.gif';
02774 if (!@is_file($theFile)) die('Error: '.$theFile.' was not a file');
02775
02776 $imageProc->imageMagickConvert_forceFileNameBody='write_gif';
02777 $fileInfo = $imageProc->imageMagickConvert($theFile,'gif',"",'',"",'',"",1);
02778 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gif_compress']) {
02779 clearstatcache();
02780 $prevSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02781 $returnCode = t3lib_div::gif_compress($fileInfo[3],'');
02782 clearstatcache();
02783 $curSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02784 $note = array('Note on gif_compress() function:',"The 'gif_compress' method used was '".$returnCode."'.<br />Previous filesize: ".$prevSize.'. Current filesize:'.$curSize);
02785 } else $note=array('Note on gif_compress() function:','<em>Not used! Disabled by [GFX][gif_compress]</em>');
02786 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands, $note);
02787 $this->message($headCode,'Write GIF',$result[0],$result[1]);
02788
02789
02790 // Writing PNG
02791 $imageProc->IM_commands=array();
02792 $theFile = t3lib_extMgm::extPath('install').'imgs/jesus.gif';
02793
02794 $imageProc->imageMagickConvert_forceFileNameBody='write_png';
02795 $fileInfo = $imageProc->imageMagickConvert($theFile,'png',"",'',"",'',"",1);
02796 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02797 $this->message($headCode,'Write PNG',$result[0],$result[1]);
02798 } else {
02799 $this->message($headCode,'Test skipped',"
02800 Use of ImageMagick has been disabled in the configuration.
02801 Refer to section 'Basic Configuration' to change or review you configuration settings
02802 ",2);
02803 }
02804 break;
02805 case 'scaling':
02806 $refParseTime='650';
02807
02808 // Scaling
02809 $headCode = 'Scaling images';
02810 $this->message($headCode,'Scaling transparent images','
02811 This shows how ImageMagick reacts when scaling transparent GIF and PNG files.
02812 ');
02813
02814 if ($imActive) {
02815 // Scaling transparent image
02816 $imageProc->IM_commands=array();
02817 $theFile = t3lib_extMgm::extPath('install').'imgs/jesus2_transp.gif';
02818 if (!@is_file($theFile)) die('Error: '.$theFile.' was not a file');
02819
02820 $imageProc->imageMagickConvert_forceFileNameBody='scale_gif';
02821 $fileInfo = $imageProc->imageMagickConvert($theFile,'gif',"150",'',"",'',"",1);
02822 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gif_compress']) {
02823 clearstatcache();
02824 $prevSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02825 $returnCode = t3lib_div::gif_compress($fileInfo[3],'');
02826 clearstatcache();
02827 $curSize=t3lib_div::formatSize(@filesize($fileInfo[3]));
02828 $note = array('Note on gif_compress() function:',"The 'gif_compress' method used was '".$returnCode."'.<br />Previous filesize: ".$prevSize.'. Current filesize:'.$curSize);
02829 } else $note=array('Note on gif_compress() function:','<em>Not used! Disabled by [GFX][gif_compress]</em>');
02830 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands,$note);
02831 $this->message($headCode,'GIF to GIF, 150 pixels wide',$result[0],$result[1]);
02832
02833 $imageProc->IM_commands=array();
02834 $theFile = t3lib_extMgm::extPath('install').'imgs/jesus2_transp.png';
02835 if (!@is_file($theFile)) die('Error: '.$theFile.' was not a file');
02836
02837 $imageProc->imageMagickConvert_forceFileNameBody='scale_png';
02838 $fileInfo = $imageProc->imageMagickConvert($theFile,'png',"150",'',"",'',"",1);
02839 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02840 $this->message($headCode,'PNG to PNG, 150 pixels wide',$result[0],$result[1]);
02841
02842 $imageProc->IM_commands=array();
02843 $theFile = t3lib_extMgm::extPath('install').'imgs/jesus2_transp.gif';
02844 if (!@is_file($theFile)) die('Error: '.$theFile.' was not a file');
02845 $imageProc->imageMagickConvert_forceFileNameBody='scale_jpg';
02846 $fileInfo = $imageProc->imageMagickConvert($theFile,'jpg',"150",'',"",'',"",1);
02847 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02848 $this->message($headCode,'GIF to JPG, 150 pixels wide',$result[0],$result[1]);
02849 } else {
02850 $this->message($headCode,'Test skipped',"
02851 Use of ImageMagick has been disabled in the configuration.
02852 Refer to section 'Basic Configuration' to change or review you configuration settings
02853 ",2);
02854 }
02855 break;
02856 case 'combining':
02857 $refParseTime='150'; // 4.2.9
02858 $refParseTime='250'; // 5.2.3
02859 // Combine
02860 $headCode = 'Combining images';
02861 $this->message($headCode,'Combining images',"
02862 This verifies that the ImageMagick tool, 'combine'/'composite', is able to combine two images through a grayscale mask.<br />
02863 If the masking seems to work but inverted, that just means you'll have to make sure the invert flag is set (some combination of im_negate_mask/im_imvMaskState)
02864 ");
02865
02866 if ($imActive) {
02867 $imageProc->IM_commands=array();
02868 $input = t3lib_extMgm::extPath('install').'imgs/greenback.gif';
02869 $overlay = t3lib_extMgm::extPath('install').'imgs/jesus.jpg';
02870 $mask = t3lib_extMgm::extPath('install').'imgs/blackwhite_mask.gif';
02871 if (!@is_file($input)) die('Error: '.$input.' was not a file');
02872 if (!@is_file($overlay)) die('Error: '.$overlay.' was not a file');
02873 if (!@is_file($mask)) die('Error: '.$mask.' was not a file');
02874
02875 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5($imageProc->alternativeOutputKey.'combine1').'.jpg';
02876 $imageProc->combineExec($input,$overlay,$mask,$output, true);
02877 $fileInfo = $imageProc->getImageDimensions($output);
02878 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02879 $this->message($headCode,'Combine using a GIF mask with only black and white',$result[0],$result[1]);
02880
02881 // Combine
02882 $imageProc->IM_commands=array();
02883 $input = t3lib_extMgm::extPath('install').'imgs/combine_back.jpg';
02884 $overlay = t3lib_extMgm::extPath('install').'imgs/jesus.jpg';
02885 $mask = t3lib_extMgm::extPath('install').'imgs/combine_mask.jpg';
02886 if (!@is_file($input)) die('Error: '.$input.' was not a file');
02887 if (!@is_file($overlay)) die('Error: '.$overlay.' was not a file');
02888 if (!@is_file($mask)) die('Error: '.$mask.' was not a file');
02889
02890 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5($imageProc->alternativeOutputKey.'combine2').'.jpg';
02891 $imageProc->combineExec($input,$overlay,$mask,$output, true);
02892 $fileInfo = $imageProc->getImageDimensions($output);
02893 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02894 $this->message($headCode,'Combine using a JPG mask with graylevels',$result[0],$result[1]);
02895 } else {
02896 $this->message($headCode,'Test skipped',"
02897 Use of ImageMagick has been disabled in the configuration.
02898 Refer to section 'Basic Configuration' to change or review you configuration settings
02899 ",2);
02900 }
02901 break;
02902 case 'gdlib':
02903 $refParseTime='1800'; // GIF / 4.2.9 / LZW (5.2.3)
02904 $refParseTime='2700'; // PNG / 4.2.9 / LZW (5.2.3)
02905 $refParseTime='1600'; // GIF / 5.2.3 / LZW (5.2.3)
02906 // GDLibrary
02907 $headCode = 'GDLib';
02908 $this->message($headCode,'Testing GDLib','
02909 This verifies that the GDLib installation works properly.
02910 ');
02911
02912
02913 if ($gdActive) {
02914 // GD with box
02915 $imageProc->IM_commands=array();
02916 $im = $imageProc->imageCreate(170,136);
02917 $Bcolor = ImageColorAllocate ($im, 0, 0, 0);
02918 ImageFilledRectangle($im, 0, 0, 170, 136, $Bcolor);
02919 $workArea=array(0,0,170,136);
02920 $conf=array(
02921 'dimensions' => '10,50,150,36',
02922 'color' => 'olive'
02923 );
02924 $imageProc->makeBox($im,$conf,$workArea);
02925 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDbox').'.'.$imageProc->gifExtension;
02926 $imageProc->ImageWrite($im,$output);
02927 $fileInfo = $imageProc->getImageDimensions($output);
02928 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02929 $this->message($headCode,'Create simple image',$result[0],$result[1]);
02930
02931
02932 // GD from image with box
02933 $imageProc->IM_commands=array();
02934 $input = t3lib_extMgm::extPath('install').'imgs/jesus.'.$imageProc->gifExtension;
02935 if (!@is_file($input)) die('Error: '.$input.' was not a file');
02936 $im = $imageProc->imageCreateFromFile($input);
02937 $workArea=array(0,0,170,136);
02938 $conf=array();
02939 $conf['dimensions']='10,50,150,36';
02940 $conf['color']='olive';
02941 $imageProc->makeBox($im,$conf,$workArea);
02942 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDfromImage+box').'.'.$imageProc->gifExtension;
02943 $imageProc->ImageWrite($im,$output);
02944 $fileInfo = $imageProc->getImageDimensions($output);
02945 $GDWithBox_filesize = @filesize($output);
02946 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02947 $this->message($headCode,'Create image from file',$result[0],$result[1]);
02948
02949
02950 // GD with text
02951 $imageProc->IM_commands=array();
02952 $im = $imageProc->imageCreate(170,136);
02953 $Bcolor = ImageColorAllocate ($im, 128,128,150);
02954 ImageFilledRectangle($im, 0, 0, 170, 136, $Bcolor);
02955 $workArea=array(0,0,170,136);
02956 $conf=array(
02957 'iterations' => 1,
02958 'angle' => 0,
02959 'antiAlias' => 1,
02960 'text' => 'HELLO WORLD',
02961 'fontColor' => '#003366',
02962 'fontSize' => 18,
02963 'fontFile' => $this->backPath.'../t3lib/fonts/vera.ttf',
02964 'offset' => '17,40'
02965 );
02966 $conf['BBOX'] = $imageProc->calcBBox($conf);
02967 $imageProc->makeText($im,$conf,$workArea);
02968
02969 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDwithText').'.'.$imageProc->gifExtension;
02970 $imageProc->ImageWrite($im,$output);
02971 $fileInfo = $imageProc->getImageDimensions($output);
02972 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands);
02973 $this->message($headCode,'Render text with TrueType font',$result[0],$result[1]);
02974
02975 if ($imActive) {
02976 // extension: GD with text, niceText
02977 $conf['offset'] = '17,65';
02978 $conf['niceText'] = 1;
02979 $imageProc->makeText($im,$conf,$workArea);
02980
02981 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDwithText-niceText').'.'.$imageProc->gifExtension;
02982 $imageProc->ImageWrite($im,$output);
02983 $fileInfo = $imageProc->getImageDimensions($output);
02984 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands, array("Note on 'niceText':","'niceText' is a concept that tries to improve the antialiasing of the rendered type by actually rendering the textstring in double size on a black/white mask, downscaling the mask and masking the text onto the image through this mask. This involves ImageMagick 'combine'/'composite' and 'convert'."));
02985 $this->message($headCode,"Render text with TrueType font using 'niceText' option",
02986 "(If the image has another background color than the image above (eg. dark background color with light text) then you will have to set TYPO3_CONF_VARS[GFX][im_imvMaskState]=1)<br /><br />".
02987 $result[0],$result[1]);
02988 } else {
02989 $this->message($headCode,"Render text with TrueType font using 'niceText' option","
02990 <strong>Test is skipped!</strong><br /><br />
02991
02992 Use of ImageMagick has been disabled in the configuration. ImageMagick is needed to generate text with the niceText option.
02993 Refer to section 'Basic Configuration' to change or review you configuration settings
02994 ",2);
02995 }
02996
02997 if ($imActive) {
02998 // extension: GD with text, niceText AND shadow
02999 $conf['offset'] = '17,90';
03000 $conf['niceText'] = 1;
03001 $conf['shadow.'] = array(
03002 'offset'=>'2,2',
03003 'blur' => $imageProc->V5_EFFECTS?"20":"90",
03004 'opacity' => '50',
03005 'color' => 'black'
03006 );
03007 $imageProc->makeShadow($im,$conf['shadow.'],$workArea,$conf);
03008 $imageProc->makeText($im,$conf,$workArea);
03009
03010 $output = $imageProc->tempPath.$imageProc->filenamePrefix.t3lib_div::shortMD5('GDwithText-niceText-shadow').'.'.$imageProc->gifExtension;
03011 $imageProc->ImageWrite($im,$output);
03012 $fileInfo = $imageProc->getImageDimensions($output);
03013 $result = $this->displayTwinImage($fileInfo[3],$imageProc->IM_commands, array('Note on drop shadows:','Drop shadows are done my using ImageMagick to blur a mask through which the drop shadow is generated. The blurring of the mask only works in ImageMagick 4.2.9 and <i>not</i> ImageMagick 5 - which is why you may see a hard and not soft shadow.'));
03014 $this->message($headCode,"Render 'niceText' with a shadow under",
03015 "(This test makes sense only if the above test had a correct output. But if so, you may not see a soft dropshadow from the third text string as you should. In that case you are most likely using ImageMagick 5 and should set the flag TYPO3_CONF_VARS[GFX][im_v5effects]. However this may cost server performance!<br />Finally if you see no drop shadow at all or if the shadow is still not soft, then check if you are using GDlib2 and if so set TYPO3_CONF_VARS[GFX][gdlib_2]=1)<br /><br />".
03016 $result[0],$result[1]);
03017 } else {
03018 $this->message($headCode,"Render 'niceText' with a shadow under","
03019 <strong>Test is skipped!</strong><br /><br />
03020
03021 Use of ImageMagick has been disabled in the configuration. ImageMagick is needed to generate shadows.
03022 Refer to section 'Basic Configuration' to change or review you configuration settings
03023 ",2);
03024 }
03025
03026 if ($imageProc->gifExtension=='gif') {
03027 $buffer=20;
03028 $assess = "This assessment is based on the filesize from 'Create image from file' test, which were ".$GDWithBox_filesize.' bytes';
03029 $goodNews = "If the image was LZW compressed you would expect to have a size of less than 9000 bytes. If you open the image with Photoshop and saves it from Photoshop, you'll a filesize like that.<br />The good news is (hopefully) that your [GFX][im_path_lzw] path is correctly set so the gif_compress() function will take care of the compression for you!";
03030 if ($GDWithBox_filesize<8784+$buffer) {
03031 $msg="<strong>Your GDLib appears to have LZW compression!</strong><br />
03032 This assessment is based on the filesize from 'Create image from file' test, which were ".$GDWithBox_filesize." bytes.<br />
03033 This is a real advantage for you because you don't need to use ImageMagick for LZW compressing. In order to make sure that GDLib is used, <strong>please set the config option [GFX][im_path_lzw] to an empty string!</strong><br />
03034 When you disable the use of ImageMagick for LZW compressing, you'll see that the gif_compress() function has a return code of 'GD' (for GDLib) instead of 'IM' (for ImageMagick)
03035 ";
03036 } elseif ($GDWithBox_filesize>19000) {
03037 $msg='<strong>Your GDLib appears to have no compression at all!</strong><br />
03038 '.$assess.'<br />'.$goodNews;
03039 } else {
03040 $msg='Your GDLib appears to have RLE compression<br />
03041 '.$assess.'<br />'.$goodNews;
03042 }
03043 $this->message($headCode,'GIF compressing in GDLib',"
03044 ".$msg."
03045 ",1);
03046 }
03047
03048 } else {
03049 $this->message($headCode,'Test skipped',"
03050 Use of GDLib has been disabled in the configuration.
03051 Refer to section 'Basic Configuration' to change or review you configuration settings
03052 ",2);
03053 }
03054 break;
03055 }
03056
03057 if ($this->INSTALL['images_type']) {
03058 // End info
03059 if ($this->fatalError) {
03060 $this->message('Info','Errors',"
03061 It seems that you had some fatal errors in this test. Please make sure that your ImageMagick and GDLib settings are correct.
03062 Refer to the 'Basic Configuration' section for more information and debugging of your settings.
03063 ");
03064 }
03065
03066 $parseStop = microtime();
03067 $parseMS = t3lib_div::convertMicrotime($parseStop)-t3lib_div::convertMicrotime($parseStart);
03068 $this->message('Info','Parsetime',$parseMS.' ms');
03069 }
03070 echo $this->outputWrapper($this->printAll());
03071 }
03072
03081 function isExtensionEnabled($ext, $headCode, $short) {
03082 if (!t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'],$ext)) {
03083 $this->message($headCode,$short,'Skipped - extension not in the list of allowed extensions ([GFX][imagefile_ext]).',1);
03084 } else {
03085 return 1;
03086 }
03087 }
03088
03097 function displayTwinImage ($imageFile, $IMcommands=array(), $note='') {
03098 $ex_rows='';
03099 $errorLevels=array(-1);
03100 if ($imageFile) {
03101 $verifyFile = t3lib_extMgm::extPath('install').'verify_imgs/'.basename($imageFile);
03102 #debug(array($imageFile,$this->backPath.'../'.substr($imageFile,strlen(PATH_site))),1);
03103 $destImg = @getImageSize($imageFile);
03104 $destImgCode ='<img src="'.$this->backPath.'../'.substr($imageFile,strlen(PATH_site)).'" '.$destImg[3].'>';
03105 $verifyImg = @getImageSize($verifyFile);
03106 $verifyImgCode = '<img src="'.$this->backPath.t3lib_extMgm::extRelPath('install').'verify_imgs/'.basename($verifyFile).'" '.$verifyImg[3].'>';
03107 if (!$verifyImg) {
03108 $gifVersion=1;
03109 $verifyFile_alt = substr($verifyFile,0,-3).'gif';
03110 $verifyImg = @getImageSize($verifyFile_alt);
03111 if ($verifyImg) {
03112 // FIXME what is that? old code? t3lib/install/verify_imgs/ do not exist
03113 $verifyImgCode = '<img src="'.$this->backPath.'t3lib/install/verify_imgs/'.basename($verifyFile_alt).'" '.$verifyImg[3].'>';
03114 $verifyImgCode= '<table border="0" cellpadding="4" cellspacing="0" bgcolor="red"><tr><td align="center">'.$verifyImgCode.'<br />'.$this->fw('<strong>NO REFERENCE FOUND!</strong><br /><br />GIF version looks like this.').'</td></tr></table>';
03115 } else {
03116 $verifyImgCode= '<table border="0" cellpadding="4" cellspacing="0" bgcolor="red"><tr><td align="center">'.$this->fw('<strong>NO REFERENCE FOUND!</strong><br /><br />'.basename($verifyFile)).'</td></tr></table>';
03117 }
03118 }
03119
03120 clearstatcache();
03121 $destImg['filesize'] = @filesize($imageFile);
03122 clearstatcache();
03123 $verifyImg['filesize'] = @filesize($verifyFile);
03124
03125 $ex_rows.='<tr>';
03126 $ex_rows.='<td>'.$destImgCode.'</td>';
03127 $ex_rows.='<td><img src="clear.gif" width="30" height="1"></td>';
03128 $ex_rows.='<td>'.$verifyImgCode.'</td>';
03129 $ex_rows.='</tr>';
03130
03131 $ex_rows.=$this->getTwinImageMessage('', 'Your server:', 'Reference:');
03132 $ex_rows.=$this->getTwinImageMessage('', t3lib_div::formatSize($destImg['filesize']).', '.$destImg[0].'x'.$destImg[1].' pixels', t3lib_div::formatSize($verifyImg['filesize']).', '.$verifyImg[0].'x'.$verifyImg[1].' pixels');
03133
03134 if (($destImg['filesize']!=$verifyImg['filesize']) && (intval($destImg['filesize']) && ($destImg['filesize']-$verifyImg['filesize']) > 2048)) { // Display a warning if the generated image is more than 2KB larger than its reference...
03135 $ex_rows.=$this->getTwinImageMessage('File size is very different from reference', $destImg['filesize'], $verifyImg['filesize']);
03136 $errorLevels[]=2;
03137 }
03138 if ($destImg[0]!=$verifyImg[0] || $destImg[1]!=$verifyImg[1]) {
03139 $ex_rows.=$this->getTwinImageMessage('Pixel dimension are not equal!');
03140 $errorLevels[]=2;
03141 }
03142 if ($note) {
03143 $ex_rows.=$this->getTwinImageMessage($note[0],$note[1]);
03144 }
03145 if ($this->dumpImCommands && count($IMcommands)) {
03146 $ex_rows.=$this->getTwinImageMessage('ImageMagick commands executed:',$this->formatImCmds($IMcommands));
03147 }
03148 } else {
03149 $ex_rows.=$this->getTwinImageMessage('There was no result from the ImageMagick operation', "Below there's a dump of the ImageMagick commands executed:<br />".$this->formatImCmds($IMcommands));
03150 $errorLevels[]=3;
03151 }
03152 $out='<table border="0" cellpadding="0" cellspacing="0" align="center" width="300">'.$ex_rows.'</table>';
03153
03154 return array($out,max($errorLevels));
03155 }
03156
03165 function getTwinImageMessage($message, $label_1="", $label_2='') {
03166 if ($message) $out.='<tr><td colspan="3"><strong>'.$this->fw($message).'</strong></td></tr>';
03167 if ($label_1 && !$label_2) {
03168 $out.='<tr><td colspan="3">'.$this->fw($label_1).'</td></tr>';
03169 } elseif ($label_1 || $label_2) {
03170 $out.='<tr><td>'.$this->fw($label_1).'</td><td></td><td>'.$this->fw($label_2).'</td></tr>';
03171 }
03172 return $out;
03173 }
03174
03181 function formatImCmds($arr) {
03182 $out=array();
03183 if (is_array($arr)) {
03184 reset($arr);
03185 while(list($k,$v)=each($arr)) {
03186 $out[]=$v[1];
03187 if ($v[2]) $out[]=' RETURNED: '.$v[2];
03188 }
03189 }
03190 if (count($out)) {
03191 $col = t3lib_div::intInRange(count($out),2,10);
03192 $outputStr = '<textarea cols=40 rows='.$col.' wrap="off" class="fixed-font">'.htmlspecialchars(implode($out,chr(10))).'</textarea>';
03193 return '<form action="">'.$outputStr.'</form>';
03194 };
03195 }
03196
03202 function imagemenu() {
03203 $menuitems = array(
03204 'read' => 'Reading image formats',
03205 'write' => 'Writing GIF and PNG',
03206 'scaling' => 'Scaling images',
03207 'combining' => 'Combining images',
03208 'gdlib' => 'GD library functions'
03209 );
03210 reset($menuitems);
03211 $c=0;
03212 $out=array();
03213 while(list($k,$v)=each($menuitems)) {
03214 $bgcolor = ($this->INSTALL['images_type']==$k ? ' bgcolor="#ABBBB4"' : ' bgcolor="#F4F0E8"');
03215 $c++;
03216 $out[]='<tr><td'.$bgcolor.'><a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[images_type]='.$k.'#testmenu').'">'.$this->fw($c.': '.$v).'</a></td></tr>';
03217 }
03218
03219 $code = '<table border="0" cellpadding="0" cellspacing="1">'.implode($out,'').'</table>';
03220 $code = '<table border="0" cellpadding="0" cellspacing="0" bgcolor="#ABBBB4"><tr><td>'.$code.'</td></tr></table>';
03221 return '<div align="center">'.$code.'</div>';
03222 }
03223
03224
03225
03226
03227
03228
03229
03230
03231
03232
03233
03234
03235 /**********************
03236 *
03237 * DATABASE analysing
03238 *
03239 **********************/
03240
03244 function checkTheDatabase() {
03245 if (!$this->config_array['mysqlConnect']) {
03246 $this->message('Database Analyser','Your database connection failed',"
03247 Please go to the 'Basic Configuration' section and correct this problem first.
03248 ",2);
03249 echo $this->outputWrapper($this->printAll());
03250 return;
03251 }
03252 if ($this->config_array['no_database']) {
03253 $this->message('Database Analyser','No database selected',"
03254 Please go to the 'Basic Configuration' section and correct this problem first.
03255 ",2);
03256 echo $this->outputWrapper($this->printAll());
03257 return;
03258 }
03259
03260 // Getting current tables
03261 $whichTables=$this->getListOfTables();
03262
03263
03264 // Getting number of static_template records
03265 if ($whichTables['static_template']) {
03266 $res_static = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'static_template', '');
03267 list($static_template_count) = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_static);
03268 }
03269 $static_template_count=intval($static_template_count);
03270
03271 $headCode ='Database Analyser';
03272 $this->message($headCode,'What is it?',"
03273 In this section you can get an overview of your currently selected database compared to sql-files. You can also import sql-data directly into the database or upgrade tables from earlier versions of TYPO3.
03274 ",0);
03275
03276 $cInfo='
03277 Username: <strong>'.TYPO3_db_username.'</strong>
03278 Password: <strong>'.TYPO3_db_password.'</strong>
03279 Host: <strong>'.TYPO3_db_host.'</strong>
03280 ';
03281 $this->message($headCode, 'Connected to SQL database successfully',"
03282 ".trim($cInfo)."
03283 ",-1,1);
03284 $this->message($headCode, 'Database',"
03285 <strong>".TYPO3_db.'</strong> is selected as database.
03286 Has <strong>'.count($whichTables)."</strong> tables.
03287 ",-1,1);
03288
03289
03290 // Menu
03291
03292 $this->messageFunc_nl2br = 0;
03293
03294 $sql_files = array_merge(
03295 t3lib_div::getFilesInDir(PATH_typo3conf,'sql',1,1),
03296 # t3lib_div::getFilesInDir(PATH_t3lib."stddb/",'sql',1,1),
03297 array()
03298 );
03299
03300 $action_type = $this->INSTALL['database_type'];
03301 $actionParts = explode('|',$action_type);
03302 if (count($actionParts)<2) {
03303 $action_type='';
03304 }
03305
03306 $out='';
03307
03308
03309 $out.='<tr>
03310 <td nowrap="nowrap"><strong>'.$this->fw('Update required tables').'</strong></td>
03311 <td'.($action_type=='cmpFile|CURRENT_TABLES'?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=cmpFile|CURRENT_TABLES#bottom').'"><strong>COMPARE</strong></a>').'</td>
03312 <td>'.$this->fw(' ').'</td>
03313 <td>'.$this->fw(' ').'</td>
03314 </tr>';
03315
03316 $out.='<tr>
03317 <td nowrap="nowrap"><strong>'.$this->fw('Dump static data').'</strong></td>
03318 <td>'.$this->fw(' ').'</td>
03319 <td nowrap="nowrap"'.($action_type=='import|CURRENT_STATIC'?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=import|CURRENT_STATIC#bottom').'"><strong>IMPORT</strong></a>').'</td>
03320 <td>'.$this->fw(' ').'</td>
03321 </tr>';
03322
03323 $out.='<tr>
03324 <td colspan="4"> </td>
03325 </tr>';
03326
03327
03328
03329
03330 reset($sql_files);
03331 $directJump='';
03332 while(list($k,$file)=each($sql_files)) {
03333 if ($this->mode=="123" && !count($whichTables) && strstr($file,'_testsite')) {
03334 $directJump = $this->action.'&TYPO3_INSTALL[database_type]=import|'.rawurlencode($file);
03335 }
03336 $lf=t3lib_div::testInt($k);
03337 $fShortName = substr($file,strlen(PATH_site));
03338
03339 /*
03340 $spec1 = (!count($whichTables) && $fShortName==TYPO3_mainDir.'t3lib/install/tables_'.str_replace('.','',$GLOBALS['TYPO_VERSION']).".sql" ? " <font color=#000066>(1)</span>" : "");
03341 $spec2 = (count($whichTables) && !$static_template_count && $fShortName==TYPO3_mainDir.'t3lib/install/static_template_'.str_replace('.','',$GLOBALS['TYPO_VERSION'])."+adt.sql" ? " <font color=#000066>(2)</span>" : "");
03342 */
03343 $spec1 = $spec2 = '';
03344
03345 $out.='<tr>
03346 <td nowrap="nowrap">'.$this->fw($fShortName.' ('.t3lib_div::formatSize(filesize($file)).')').'</td>
03347 <td'.($action_type=='cmpFile|'.$file?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=cmpFile|'.rawurlencode($file).'#bottom').'"><strong>COMPARE</strong></a>').'</td>
03348 <td nowrap="nowrap"'.($action_type=='import|'.$file?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=import|'.rawurlencode($file).'#bottom').'"><strong>IMPORT'.$spec1.$spec2.'</strong></a>').'</td>
03349 <td nowrap="nowrap"'.($action_type=='view|'.$file?' bgcolor="#D9D5C9"':'').'>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=view|'.rawurlencode($file).'#bottom').'"><strong>VIEW'.$spec1.$spec2.'</strong></a>').'</td>
03350 </tr>';
03351 }
03352 // TCA
03353 $out.='<tr>
03354 <td></td>
03355 <td colspan="3"'.($action_type=="cmpTCA|"?' bgcolor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=cmpTCA|#bottom').'">Compare with $TCA</a>').'</strong></td>
03356 </tr>';
03357 $out.='<tr>
03358 <td></td>
03359 <td colspan="3"'.($action_type=="adminUser|"?' bgcolor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=adminUser|#bottom').'">Create "admin" user</a>').'</strong></td>
03360 </tr>';
03361 $out.='<tr>
03362 <td></td>
03363 <td colspan="3"'.($action_type=="UC|"?' bgcolor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=UC|#bottom').'">Reset user preferences</a>').'</strong></td>
03364 </tr>';
03365 $out.='<tr>
03366 <td></td>
03367 <td colspan="3"'.($action_type=="cache|"?' bgcolor="#D9D5C9"':'').'><strong>'.$this->fw('<a href="'.htmlspecialchars($this->action.'&TYPO3_INSTALL[database_type]=cache|#bottom').'">Clear tables</a>').'</strong></td>
03368 </tr>';
03369
03370 $theForm='<table border="0" cellpadding="2" cellspacing="2">'.$out.'</table>';
03371 $theForm.='<a name="bottom"></a>';
03372
03373 if ($directJump) {
03374 if (!$action_type) {
03375 $this->message($headCode, 'Menu','
03376 <script language="javascript" type="text/javascript">
03377 window.location.href = "'.$directJump.'";
03378 </script>',0,1);
03379 }
03380 } else {
03381 $this->message($headCode, 'Menu',"
03382 From this menu you can select which of the available SQL files you want to either compare or import/merge with the existing database.<br /><br />
03383 <strong>COMPARE:</strong> Compares the tables and fields of the current database and the selected file. It also offers to 'update' the difference found.<br />
03384 <strong>IMPORT:</strong> Imports the SQL-dump file into the current database. You can either dump the raw file or choose which tables to import. In any case, you'll see a new screen where you must confirm the operation.<br />
03385 <strong>VIEW:</strong> Shows the content of the SQL-file, limiting characters on a single line to a reader-friendly amount.<br /><br />
03386 The SQL-files are selected from typo3conf/ (here you can put your own) and t3lib/stddb/ (TYPO3 distribution). The SQL-files should be made by the <em>mysqldump</em> tool or at least be formatted like that tool would do.
03387 <br />
03388 <br />
03389 ".$theForm."
03390 ",0,1);
03391 }
03392
03393
03394 // Install user
03395 // clear uc
03396 if ($action_type) {
03397 switch($actionParts[0]) {
03398 case 'cmpFile':
03399 $tblFileContent='';
03400 if (!strcmp($actionParts[1],'CURRENT_TABLES')) {
03401 $tblFileContent = t3lib_div::getUrl(PATH_t3lib.'stddb/tables.sql');
03402
03403 reset($GLOBALS['TYPO3_LOADED_EXT']);
03404 while(list(,$loadedExtConf)=each($GLOBALS['TYPO3_LOADED_EXT'])) {
03405 if (is_array($loadedExtConf) && $loadedExtConf['ext_tables.sql']) {
03406 $tblFileContent.= chr(10).chr(10).chr(10).chr(10).t3lib_div::getUrl($loadedExtConf['ext_tables.sql']);
03407 }
03408 }
03409 } elseif (@is_file($actionParts[1])) {
03410 $tblFileContent = t3lib_div::getUrl($actionParts[1]);
03411 }
03412 if ($tblFileContent) {
03413 $fileContent = implode(
03414 $this->getStatementArray($tblFileContent,1,'^CREATE TABLE '),
03415 chr(10)
03416 );
03417 $FDfile = $this->getFieldDefinitions_sqlContent($fileContent);
03418 if (!count($FDfile)) {
03419 die ("Error: There were no 'CREATE TABLE' definitions in the provided file");
03420 }
03421
03422 // Updating database...
03423 if (is_array($this->INSTALL['database_update'])) {
03424 $FDdb = $this->getFieldDefinitions_database();
03425 $diff = $this->getDatabaseExtra($FDfile, $FDdb);
03426 $update_statements = $this->getUpdateSuggestions($diff);
03427 $diff = $this->getDatabaseExtra($FDdb, $FDfile);
03428 $remove_statements = $this->getUpdateSuggestions($diff,'remove');
03429
03430 $this->performUpdateQueries($update_statements['add'],$this->INSTALL['database_update']);
03431 $this->performUpdateQueries($update_statements['change'],$this->INSTALL['database_update']);
03432 $this->performUpdateQueries($remove_statements['change'],$this->INSTALL['database_update']);
03433 $this->performUpdateQueries($remove_statements['drop'],$this->INSTALL['database_update']);
03434
03435 $this->performUpdateQueries($update_statements['create_table'],$this->INSTALL['database_update']);
03436 $this->performUpdateQueries($remove_statements['change_table'],$this->INSTALL['database_update']);
03437 $this->performUpdateQueries($remove_statements['drop_table'],$this->INSTALL['database_update']);
03438 }
03439
03440 // Init again / first time depending...
03441 $FDdb = $this->getFieldDefinitions_database();
03442
03443 $diff = $this->getDatabaseExtra($FDfile, $FDdb);
03444 $update_statements = $this->getUpdateSuggestions($diff);
03445
03446 $diff = $this->getDatabaseExtra($FDdb, $FDfile);
03447 $remove_statements = $this->getUpdateSuggestions($diff,'remove');
03448
03449 $tLabel = 'Update database tables and fields';
03450
03451 if ($remove_statements || $update_statements) {
03452 $formContent = $this->generateUpdateDatabaseForm('get_form',$update_statements,$remove_statements,$action_type);
03453 $this->message($tLabel,'Table and field definitions should be updated',"
03454 There seems to be a number of differencies between the database and the selected SQL-file.
03455 Please select which statements you want to execute in order to update your database:<br /><br />
03456 ".$formContent."
03457 ",2);
03458 } else {
03459 $formContent = $this->generateUpdateDatabaseForm('get_form',$update_statements,$remove_statements,$action_type);
03460 $this->message($tLabel,'Table and field definitions are OK.',"
03461 The tables and fields in the current database corresponds perfectly to the database in the selected SQL-file.
03462 ",-1);
03463 }
03464 }
03465 break;
03466 case 'cmpTCA':
03467 $this->includeTCA();
03468 $FDdb = $this->getFieldDefinitions_database();
03469
03470 // Displaying configured fields which are not in the database
03471 $tLabel='Tables and fields in $TCA, but not in database';
03472 $cmpTCA_DB = $this->compareTCAandDatabase($GLOBALS['TCA'],$FDdb);
03473 if (!count($cmpTCA_DB['extra'])) {
03474 $this->message($tLabel,'Table and field definitions OK','
03475 All fields and tables configured in $TCA appeared to exist in the database as well
03476 ',-1);
03477 } else {
03478 $this->message($tLabel,'Invalid table and field definitions in $TCA!','
03479 There are some tables and/or fields configured in the \$TCA array which does not exist in the database!
03480 This will most likely cause you trouble with the TYPO3 backend interface!
03481 ',3);
03482 while(list($tableName, $conf)=each($cmpTCA_DB['extra'])) {
03483 $this->message($tLabel, $tableName,$this->displayFields($conf['fields'],0,'Suggested database field:'),2);
03484 }
03485 }
03486
03487 // Displaying tables that are not setup in
03488 $cmpDB_TCA = $this->compareDatabaseAndTCA($FDdb,$GLOBALS['TCA']);
03489 $excludeTables='be_sessions,fe_session_data,fe_sessions';
03490 if (TYPO3_OS=='WIN') {$excludeTables = strtolower($excludeTables);}
03491 $excludeFields = array(
03492 'be_users' => 'uc,lastlogin,usergroup_cached_list',
03493 'fe_users' => 'uc,lastlogin,fe_cruser_id',
03494 'pages' => 'SYS_LASTCHANGED',
03495 'sys_dmail' => 'mailContent',
03496 'tt_board' => 'doublePostCheck',
03497 'tt_guest' => 'doublePostCheck',
03498 'tt_products' => 'ordered'
03499 );
03500 $tCount=0;
03501 $fCount=0;
03502 $tLabel="Tables from database, but not in \$TCA";
03503 $fLabel="Fields from database, but not in \$TCA";
03504 $this->message($tLabel);
03505 if (is_array($cmpDB_TCA['extra'])) {
03506 while(list($tableName, $conf)=each($cmpDB_TCA['extra'])) {
03507 if (!t3lib_div::inList($excludeTables,$tableName)
03508 && substr($tableName,0,4)!="sys_"
03509 && substr($tableName,-3)!="_mm"
03510 && substr($tableName,0,6)!="index_"
03511 && substr($tableName,0,6)!='cache_') {
03512 if ($conf['whole_table']) {
03513 $this->message($tLabel, $tableName,$this->displayFields($conf['fields']),1);
03514 $tCount++;
03515 } else {
03516 list($theContent, $fC) = $this->displaySuggestions($conf['fields'],$excludeFields[$tableName]);
03517 $fCount+=$fC;
03518 if ($fC) $this->message($fLabel, $tableName,$theContent,1);
03519 }
03520 }
03521 }
03522 }
03523 if (!$tCount) {
03524 $this->message($tLabel,'Correct number of tables in the database',"
03525 There are no extra tables in the database compared to the configured tables in the \$TCA array.
03526 ",-1);
03527 } else {
03528 $this->message($tLabel,'Extra tables in the database',"
03529 There are some tables in the database which are not configured in the \$TCA array.
03530 You should probably not worry about this, but please make sure that you know what these tables are about and why they are not configured in \$TCA.
03531 ",2);
03532 }
03533
03534 if (!$fCount) {
03535 $this->message($fLabel,'Correct number of fields in the database',"
03536 There are no additional fields in the database tables compared to the configured fields in the \$TCA array.
03537 ",-1);
03538 } else {
03539 $this->message($fLabel,'Extra fields in the database',"
03540 There are some additional fields the database tables which are not configured in the \$TCA array.
03541 You should probably not worry about this, but please make sure that you know what these fields are about and why they are not configured in \$TCA.
03542 ",2);
03543 }
03544
03545 // Displaying actual and suggested field database defitions
03546 if (is_array($cmpTCA_DB['matching'])) {
03547 $tLabel="Comparison between database and \$TCA";
03548
03549 $this->message($tLabel,'Actual and suggested field definitions',"
03550 This table shows you the suggested field definitions which are calculated based on the configuration in \$TCA.
03551 If the suggested value differs from the actual current database value, you should not panic, but simply check if the datatype of that field is sufficient compared to the data, you want TYPO3 to put there.
03552 ",0);
03553 while(list($tableName, $conf)=each($cmpTCA_DB['matching'])) {
03554 $this->message($tLabel, $tableName,$this->displayFieldComp($conf['fields'], $FDdb[$tableName]['fields']),1);
03555 }
03556 }
03557 break;
03558 case 'import':
03559 $mode123Imported=0;
03560 $tblFileContent='';
03561 if (preg_match('/^CURRENT_/', $actionParts[1])) {
03562 if (!strcmp($actionParts[1],'CURRENT_TABLES') || !strcmp($actionParts[1],'CURRENT_TABLES+STATIC')) {
03563 $tblFileContent = t3lib_div::getUrl(PATH_t3lib.'stddb/tables.sql');
03564
03565 reset($GLOBALS['TYPO3_LOADED_EXT']);
03566 while(list(,$loadedExtConf)=each($GLOBALS['TYPO3_LOADED_EXT'])) {
03567 if (is_array($loadedExtConf) && $loadedExtConf['ext_tables.sql']) {
03568 $tblFileContent.= chr(10).chr(10).chr(10).chr(10).t3lib_div::getUrl($loadedExtConf['ext_tables.sql']);
03569 }
03570 }
03571 }
03572 if (!strcmp($actionParts[1],'CURRENT_STATIC') || !strcmp($actionParts[1],'CURRENT_TABLES+STATIC')) {
03573 reset($GLOBALS['TYPO3_LOADED_EXT']);
03574 while(list(,$loadedExtConf)=each($GLOBALS['TYPO3_LOADED_EXT'])) {
03575 if (is_array($loadedExtConf) && $loadedExtConf['ext_tables_static+adt.sql']) {
03576 $tblFileContent.= chr(10).chr(10).chr(10).chr(10).t3lib_div::getUrl($loadedExtConf['ext_tables_static+adt.sql']);
03577 }
03578 }
03579 }
03580 } elseif (@is_file($actionParts[1])) {
03581 $tblFileContent = t3lib_div::getUrl($actionParts[1]);
03582 }
03583
03584 if ($tblFileContent) {
03585 $tLabel='Import SQL dump';
03586 // Getting statement array from
03587 $statements = $this->getStatementArray($tblFileContent,1);
03588 list($statements_table, $insertCount) = $this->getCreateTables($statements,1);
03589
03590 // Updating database...
03591 if ($this->INSTALL['database_import_all']) {
03592 $r=0;
03593 foreach ($statements as $k=>$v) {
03594 $res = $GLOBALS['TYPO3_DB']->admin_query($v);
03595 $r++;
03596 }
03597
03598 // Make a database comparison because some tables that are defined twice have not been created at this point. This applies to the "pages.*" fields defined in sysext/cms/ext_tables.sql for example.
03599 $fileContent = implode(
03600 $this->getStatementArray($tblFileContent,1,'^CREATE TABLE '),
03601 chr(10)
03602 );
03603 $FDfile = $this->getFieldDefinitions_sqlContent($fileContent);
03604 $FDdb = $this->getFieldDefinitions_database();
03605 $diff = $this->getDatabaseExtra($FDfile, $FDdb);
03606 $update_statements = $this->getUpdateSuggestions($diff);
03607 if (is_array($update_statements['add'])) {
03608 foreach ($update_statements['add'] as $statement) {
03609 $res = $GLOBALS['TYPO3_DB']->admin_query($statement);
03610 }
03611 }
03612
03613 if ($this->mode=='123') {
03614 // Create default be_user admin/password
03615 $username = 'admin';
03616 $pass = 'password';
03617
03618 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'be_users', 'username='.$GLOBALS['TYPO3_DB']->fullQuoteStr($username, 'be_users'));
03619 if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res)) {
03620 $insertFields = array(
03621 'username' => $username,
03622 'password' => md5($pass),
03623 'admin' => 1,
03624 'uc' => '',
03625 'fileoper_perms' => 7,
03626 'tstamp' => time(),
03627 'crdate' => time()
03628 );
03629
03630 $GLOBALS['TYPO3_DB']->exec_INSERTquery('be_users', $insertFields);
03631 }
03632 }
03633
03634 $this->message($tLabel,'Imported ALL',"
03635 Queries: ".$r."
03636 ",1,1);
03637 if (t3lib_div::_GP('goto_step')) {
03638 $this->action.='&step='.t3lib_div::_GP('goto_step');
03639 Header('Location: '.t3lib_div::locationHeaderUrl($this->action));
03640 exit;
03641 }
03642 } elseif (is_array($this->INSTALL['database_import'])) {
03643 // Traverse the tables
03644 reset($this->INSTALL['database_import']);
03645 while(list($table,$md5str)=each($this->INSTALL['database_import'])) {
03646 if ($md5str==md5($statements_table[$table])) {
03647 $res = $GLOBALS['TYPO3_DB']->admin_query('DROP TABLE IF EXISTS '.$table);
03648 $res = $GLOBALS['TYPO3_DB']->admin_query($statements_table[$table]);
03649
03650 if ($insertCount[$table]) {
03651 $statements_insert = $this->getTableInsertStatements($statements, $table);
03652 reset($statements_insert);
03653 while(list($k,$v)=each($statements_insert)) {
03654 $res = $GLOBALS['TYPO3_DB']->admin_query($v);
03655 }
03656 }
03657
03658 $this->message($tLabel,"Imported '".$table."'","
03659 Rows: ".$insertCount[$table]."
03660 ",1,1);
03661 }
03662 }
03663 }
03664
03665 $mode123Imported=$this->isBasicComplete($tLabel);
03666
03667 if (!$mode123Imported) {
03668 // Re-Getting current tables - may have been changed during import
03669 $whichTables=$this->getListOfTables();
03670
03671 if (count($statements_table)) {
03672 reset($statements_table);
03673 $out='';
03674 while(list($table,$definition)=each($statements_table)) {
03675 $exist=isset($whichTables[$table]);
03676 $out.='<tr>
03677 <td><input type="checkbox" name="TYPO3_INSTALL[database_import]['.$table.']" value="'.md5($definition).'"></td>
03678 <td><strong>'.$this->fw($table).'</strong></td>
03679 <td><img src="clear.gif" width="10" height="1"></td>
03680 <td nowrap="nowrap">'.$this->fw($insertCount[$table]?"Rows: ".$insertCount[$table]:"").'</td>
03681 <td><img src="clear.gif" width="10" height="1"></td>
03682 <td nowrap="nowrap">'.($exist?'<img src="'.$this->backPath.'gfx/icon_warning.gif" width="18" height="16" align="top" alt="">'.$this->fw('Table exists!'):'').'</td>
03683 </tr>';
03684 }
03685
03686 $content ='';
03687 if ($this->mode!='123') {
03688 $content.='<table border="0" cellpadding="0" cellspacing="0">'.$out.'</table>
03689 <hr />
03690 ';
03691 }
03692 $content.='<input type="checkbox" name="TYPO3_INSTALL[database_import_all]" value="1"'.($this->mode=="123"||t3lib_div::_GP('presetWholeTable')?' checked="checked"':'').'>'.$this->fw("Import the whole file '".basename($actionParts[1])."' directly (ignores selections above):").'<br />
03693
03694 ';
03695 $form = $this->getUpdateDbFormWrap($action_type, $content);
03696 $this->message($tLabel,'Select tables to import',"
03697 This is an overview of the CREATE TABLE definitions in the SQL file.
03698 Select which tables you want to dump to the database.
03699 Any table you choose dump to the database is dropped from the database first, so you'll lose all data in existing tables.
03700 ".$form,1,1);
03701 } else {
03702 $this->message($tLabel,'No tables',"
03703 There seems to be no CREATE TABLE definitions in the SQL file.
03704 This tool is intelligently creating one table at a time and not just dumping the whole content of the file uncritically. That's why there must be defined tables in the SQL file.
03705 ",3,1);
03706 }
03707 }
03708 }
03709 break;
03710 case 'view':
03711 if (@is_file($actionParts[1])) {
03712 $tLabel='Import SQL dump';
03713 // Getting statement array from
03714 $sqlContent = t3lib_div::getUrl($actionParts[1]);
03715 $statements = $this->getStatementArray($sqlContent,1);
03716 $maxL=1000;
03717 $strLen = strlen($sqlContent);
03718 $maxlen = 200+($maxL-t3lib_div::intInRange(($strLen-20000)/100,0,$maxL));
03719 if (count($statements)) {
03720 reset($statements);
03721 $out='';
03722 while(list(,$statement)=each($statements)) {
03723 $out.=nl2br(htmlspecialchars(t3lib_div::fixed_lgd($statement,$maxlen)).chr(10).chr(10));
03724 }
03725 }
03726 $this->message($tLabel,'Content of '.basename($actionParts[1]),$out,1);
03727 }
03728 break;
03729 case 'adminUser':
03730 if ($whichTables['be_users']) {
03731 if (is_array($this->INSTALL['database_adminUser'])) {
03732 $username = ereg_replace('[^[:alnum:]_-]','',trim($this->INSTALL['database_adminUser']['username']));
03733 $username = str_replace(' ','_',$username);
03734 $pass = trim($this->INSTALL['database_adminUser']['password']);
03735 if ($username && $pass) {
03736 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'be_users', 'username='.$GLOBALS['TYPO3_DB']->fullQuoteStr($username, 'be_users'));
03737 if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res)) {
03738
03739 $insertFields = array(
03740 'username' => $username,
03741 'password' => md5($pass),
03742 'admin' => 1,
03743 'uc' => '',
03744 'fileoper_perms' => 7,
03745 'tstamp' => time(),
03746 'crdate' => time()
03747 );
03748
03749 $GLOBALS['TYPO3_DB']->exec_INSERTquery('be_users', $insertFields);
03750
03751 $this->isBasicComplete($headCode);
03752
03753 $this->message($headCode,'User created','
03754 Username: <strong>'.htmlspecialchars($username).'</strong><br />
03755 Password: <strong>'.htmlspecialchars($pass).'</strong><br />'
03756 ,1,1);
03757 } else {
03758 $this->message($headCode,'Username not unique!','
03759 The username, <strong>'.htmlspecialchars($username).'</strong>, was not unique.',2,1);
03760 }
03761 }
03762 }
03763 $content = '
03764 <input type="text" name="TYPO3_INSTALL[database_adminUser][username]"> username - unique, no space, lowercase<br />
03765 <input type="text" name="TYPO3_INSTALL[database_adminUser][password]"> password
03766 ';
03767 $form = $this->getUpdateDbFormWrap($action_type, $content);
03768 $this->message($headCode,'Create admin user',"
03769 Enter username and password for a new admin user.<br />
03770 You should use this function only if there are no admin users in the database, for instance if this is a blank database.<br />
03771 After you've created the user, log in and add the rest of the user information, like email and real name.<br />
03772 <br />
03773 ".$form."
03774 ",0,1);
03775 } else {
03776 $this->message($headCode,'Required table not in database',"
03777 'be_users' must be a table in the database!
03778 ",3,1);
03779 }
03780 break;
03781 case 'UC':
03782 if ($whichTables['be_users']) {
03783 if (!strcmp($this->INSTALL['database_UC'],1)) {
03784 $GLOBALS['TYPO3_DB']->exec_UPDATEquery('be_users', '', array('uc' => ''));
03785 $this->message($headCode,'Clearing be_users.uc','Done.',1);
03786 }
03787 $content = '
03788 <input type="checkbox" name="TYPO3_INSTALL[database_UC]" value="1" checked="checked"> Clear be_users preferences ("uc" field)
03789 ';
03790 $form = $this->getUpdateDbFormWrap($action_type, $content);
03791 $this->message($headCode,'Clear user preferences',"
03792 If you press this button all backend users from the tables be_users will have their user preferences cleared (field 'uc' set to an empty string).<br />
03793 This may come in handy in rare cases where that configuration may be corrupt.<br />
03794 Clearing this will clear all user settings from the 'Setup' module.<br />
03795 <br />
03796 ".$form);
03797 } else {
03798 $this->message($headCode,'Required table not in database',"
03799 'be_users' must be a table in the database!
03800 ",3);
03801 }
03802 break;
03803 case 'cache':
03804 $tableListArr = explode(',','cache_pages,cache_pagesection,cache_hash,cache_imagesizes,--div--,sys_log,sys_history,--div--,be_sessions,fe_sessions,fe_session_data'.
03805 (t3lib_extMgm::isLoaded('indexed_search') ? ',--div--,index_words,index_rel,index_phash,index_grlist,index_section,index_fulltext' : '').
03806 (t3lib_extMgm::isLoaded('tt_products') ? ',--div--,sys_products_orders,sys_products_orders_mm_tt_products' : '').
03807 (t3lib_extMgm::isLoaded('direct_mail') ? ',--div--,sys_dmail_maillog' : '').
03808 (t3lib_extMgm::isLoaded('sys_stat') ? ',--div--,sys_stat' : '')
03809 );
03810
03811 if (is_array($this->INSTALL['database_clearcache'])) {
03812 $qList=array();
03813 reset($tableListArr);
03814 while(list(,$table)=each($tableListArr)) {
03815 if ($table!='--div--') {
03816 $table_c = TYPO3_OS=='WIN' ? strtolower($table) : $table;
03817 if ($this->INSTALL['database_clearcache'][$table] && $whichTables[$table_c]) {
03818 $GLOBALS['TYPO3_DB']->exec_DELETEquery($table, '');
03819 $qList[] = $table;
03820 }
03821 }
03822 }
03823 if (count($qList)) {
03824 $this->message($headCode,'Clearing cache','
03825 The following tables were emptied:<br /><br />
03826 '.implode($qList,'<br />')
03827 ,1);
03828 }
03829 }
03830 // Count entries and make checkboxes
03831 $labelArr = array(
03832 'cache_pages' => 'Pages',
03833 'cache_pagesection' => 'TS template related information',
03834 'cache_hash' => 'Multipurpose md5-hash cache',
03835 + 'cache_imagesizes' => 'Cached image sizes',
03836 'sys_log' => 'Backend action logging',
03837 'sys_stat' => 'Page hit statistics',
03838 'sys_history' => 'Addendum to the sys_log which tracks ALL changes to content through TCE. May become huge by time. Is used for rollback (undo) and the WorkFlow engine.',
03839 'be_sessions' => 'Backend User sessions',
03840 'fe_sessions' => 'Frontend User sessions',
03841 'fe_session_data' => 'Frontend User sessions data',
03842 'sys_dmail_maillog' => 'Direct Mail log',
03843 'sys_products_orders' => 'tt_product orders',
03844 'sys_products_orders_mm_tt_products' => 'relations between tt_products and sys_products_orders'
03845 );
03846
03847 $checkBoxes=array();
03848 $countEntries=array();
03849 reset($tableListArr);
03850 while(list(,$table)=each($tableListArr)) {
03851 if ($table!='--div--') {
03852 $table_c = TYPO3_OS=='WIN' ? strtolower($table) : $table;
03853 if ($whichTables[$table_c]) {
03854 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, '');
03855 list($countEntries[$table]) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
03856 // Checkboxes:
03857 $checkBoxes[]= '<input type="checkbox" name="TYPO3_INSTALL[database_clearcache]['.$table.']" id="TYPO3_INSTALL[database_clearcache]['.$table.']" value="1"'.($this->INSTALL['database_clearcache'][$table]||$_GET['PRESET']['database_clearcache'][$table]?' checked="checked"':'').'> <label for="TYPO3_INSTALL[database_clearcache]['.$table.']"><strong>'.$table.'</strong> ('.$countEntries[$table].' rows) - '.$labelArr[$table].'</label>';
03858 }
03859 } else {
03860 $checkBoxes[]= '<hr />';
03861 }
03862 }
03863
03864 $content = implode('<br />',$checkBoxes).'<br /><br />';
03865
03866 $form = $this->getUpdateDbFormWrap($action_type, $content);
03867 $this->message($headCode,'Clear out selected tables','
03868 Pressing this button will delete all records from the selected tables.<br />
03869 <br />
03870 '.$form.'
03871 ');
03872 break;
03873 }
03874 }
03875
03876 echo $this->outputWrapper($this->printAll());
03877 }
03878
03884 function updateWizard() {
03885 global $TYPO3_CONF_VARS;
03886
03887 // clear cache files
03888 t3lib_extMgm::removeCacheFiles();
03889
03890 // generate new cache files and include them
03891 $GLOBALS['TYPO3_CONF_VARS']['EXT']['extCache'] = 1;
03892 $TYPO3_LOADED_EXT = t3lib_extMgm::typo3_loadExtensions();
03893 if ($TYPO3_LOADED_EXT['_CACHEFILE']) {
03894 require(PATH_typo3conf.$TYPO3_LOADED_EXT['_CACHEFILE'].'_ext_localconf.php');
03895 }
03896
03897 // call wizard
03898 $action = ($this->INSTALL['database_type']?$this->INSTALL['database_type']:'checkForUpdate');
03899 $this->updateWizard_parts($action);
03900 echo $this->outputWrapper($this->printAll());
03901 }
03908 function updateWizard_parts($action) {
03909 $content = '';
03910 switch ($action) {
03911 case 'checkForUpdate': // first step - check for updates available
03912 $title = 'Update wizards';
03913 $updateWizardBoxes = '';
03914 if (!$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']) {
03915 $content = '<strong>No updates registered!</strong>';
03916 break;
03917 }
03918
03919 // step through list of updates, and check if update is needed and if yes, output an explanation
03920 foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] as $identifier => $className) {
03921 $tmpObj = $this->getUpgradeObjInstance($className, $identifier);
03922 if (method_exists($tmpObj,'checkForUpdate')) {
03923 $explanation = '';
03924 if ($tmpObj->checkForUpdate($explanation)) {
03925 $updateWizardBoxes .= '
03926 <div style="border: 1px solid; padding: 10px; margin: 10px; padding-top:0px;">
03927 <h3>'.$identifier.'</h3>
03928 <p>'.str_replace(chr(10),'<br />',$explanation).'</p>
03929 <input type="submit" name="TYPO3_INSTALL[update]['.$identifier.']" id="TYPO3_INSTALL[update]['.$identifier.']" value="'.$identifier.'" />
03930 </div>
03931 ';
03932 }
03933 }
03934 }
03935
03936 if ($updateWizardBoxes) {
03937 $updateWizardBoxes = '<table><tr><td>'.$updateWizardBoxes.'</td></tr></table>';
03938 $content = '
03939 <form action="'.$this->action.'#bottom" method="post">
03940 <input type="hidden" name="TYPO3_INSTALL[database_type]" value="'.htmlspecialchars('getUserInput').'">
03941 '.$updateWizardBoxes.'<br />
03942 </form>
03943 ';
03944 } else {
03945 $content = '<strong>No updates to perform!</strong>';
03946 }
03947 break;
03948 case 'getUserInput': // second step - get user input and ask for final confirmation
03949 $title = '2 - configuration of updates';
03950 $formContent = '<strong>The following updates will be performed:</strong>';
03951 if (!$this->INSTALL['update']) {
03952 $content = '<strong>No updates selected!</strong>';
03953 break;
03954 }
03955 // update methods might need to get custom data
03956 foreach ($this->INSTALL['update'] as $identifier => $tmp) {
03957 $className = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$identifier];
03958
03959 $tmpObj = $this->getUpgradeObjInstance($className, $identifier);
03960
03961 $formContent .= '<p><strong>'.$identifier.'</strong><input type="hidden" name="TYPO3_INSTALL[update][extList][]" value="'.$identifier.'" /><br />';
03962 if (method_exists($tmpObj,'getUserInput')) {
03963 $formContent .= $tmpObj->getUserInput('TYPO3_INSTALL[update]['.$identifier.']');
03964 }
03965 $formContent .= '</p><hr />';
03966 }
03967 $formContent .= '<p><input type="checkbox" name="TYPO3_INSTALL[update][showDatabaseQueries]" id="TYPO3_INSTALL[update][showDatabaseQueries]" value="1" /> <label for="TYPO3_INSTALL[update][showDatabaseQueries]">Show database queries performed</label></p>';
03968 $content = $this->getUpdateDbFormWrap('performUpdate', $formContent,'3 -Perform updates!');
03969 break;
03970 case 'performUpdate': // third step - perform update
03971 $title = '3 - perform updates';
03972 if (!$this->INSTALL['update']['extList']) { break; }
03973
03974 $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = TRUE;
03975 foreach ($this->INSTALL['update']['extList'] as $identifier) {
03976 $className = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][$identifier];
03977
03978 $tmpObj = &$this->getUpgradeObjInstance($className, $identifier);
03979
03980 $content = '<p><strong>'.$identifier.'</strong><br />';
03981 // check user input if testing method is available
03982 if (method_exists($tmpObj,'checkUserInput')) {
03983 $customOutput = '';
03984 if (!$tmpObj->checkUserInput($customOutput)) {
03985 $content .= '<strong>'.($customOutput?$customOutput:'Something went wrong').'</strong>';
03986 $content .= '<br /><a href="javascript:history.back()">Go back to update configuration</a>';
03987 break;
03988 }
03989 }
03990
03991 if (method_exists($tmpObj,'performUpdate')) {
03992 $customOutput = '';
03993 $dbQueries = array();
03994 if ($tmpObj->performUpdate($dbQueries, $customOutput)) {
03995 $content .= '<strong>Update successful!</strong>';
03996 } else {
03997 $content .= '<strong>FAILURE!</strong>';
03998 }
03999 if ($this->INSTALL['update']['showDatabaseQueries']) {
04000 $content .= '<br />' . implode('<br />',$dbQueries);
04001 }
04002 $content .= '<br />' . $customOutput;
04003
04004 } else {
04005 $content .= '<strong>No update method available!</strong>';
04006 }
04007 $content .= '</p><hr />';
04008 }
04009 $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = FALSE;
04010 break;
04011 }
04012 $this->message('Update Wizard',$title,$content);
04013 }
04014
04022 function getUpgradeObjInstance($className, $identifier) {
04023 $tmpObj = &t3lib_div::getUserObj($className);
04024 $tmpObj->versionNumber = t3lib_div::int_from_ver(TYPO3_version);
04025 $tmpObj->pObj = $this;
04026 $tmpObj->userInput = $this->INSTALL['update'][$identifier];
04027 return $tmpObj;
04028 }
04029
04035 function isBackendAdminUser() {
04036 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'be_users', 'admin=1');
04037 $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
04038 return current($row);
04039 }
04040
04046 function isStaticTemplates() {
04047 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', 'static_template', '');
04048 $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
04049 return current($row);
04050 }
04051
04058 function isBasicComplete($tLabel) {
04059 if ($this->mode=='123') {
04060 $tables = $this->getListOfTables();
04061
04062 if (count($tables)) {
04063 $beuser = $this->isBackendAdminUser();
04064 $static = $this->isStaticTemplates();
04065 }
04066 if (count($tables) && $beuser && $static) {
04067 $mode123Imported=1;
04068 $this->message($tLabel,'Basic Installation Completed',nl2br($this->messageBasicFinished()),-1,1);
04069 $this->message($tLabel,'Security Risk!',nl2br($this->securityRisk().$this->alterPasswordForm()),2,1);
04070 } else {
04071 $this->message($tLabel,'Still missing something?',nl2br('
04072 You may be missing one of these points before your TYPO3 installation is complete:
04073
04074 '.(count($tables)?'':'- You haven\'t imported any tables yet.
04075 ')
04076 .($static?'':'- You haven\'t imported the static_template table.
04077 ')
04078 .($beuser?'':'- You haven\'t created an admin-user yet.
04079 ')
04080 .'
04081
04082 You you\'re about to import a database with a complete site in it, these three points should be met.
04083 '),-1,1);
04084 }
04085 }
04086 return $mode123Imported;
04087 }
04088
04098 function generateUpdateDatabaseForm($type, $arr_update, $arr_remove, $action_type) {
04099 $content = '';
04100 switch($type) {
04101 case 'get_form':
04102 $content='';
04103 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update['add'],'Add fields');
04104 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update['change'],'Changing fields',(t3lib_extMgm::isLoaded('dbal')?0:1),0,$arr_update['change_currentValue']);
04105 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove['change'],'Remove unused fields (rename with prefix)',$this->setAllCheckBoxesByDefault,1);
04106 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove['drop'],'Drop fields (really!)',$this->setAllCheckBoxesByDefault);
04107
04108 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_update['create_table'],'Add tables');
04109 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove['change_table'],'Removing tables (rename with prefix)',$this->setAllCheckBoxesByDefault,1,$arr_remove['tables_count'],1);
04110 $content.=$this->generateUpdateDatabaseForm_checkboxes($arr_remove['drop_table'],'Drop tables (really!)',$this->setAllCheckBoxesByDefault,0,$arr_remove['tables_count'],1);
04111
04112 $content = $this->getUpdateDbFormWrap($action_type, $content);
04113 break;
04114 default:
04115
04116 break;
04117 }
04118 return $content;
04119 }
04120
04129 function getUpdateDbFormWrap($action_type, $content, $label='Write to database') {
04130 $form = '<form action="'.$this->action.'#bottom" method="post"><input type="hidden" name="TYPO3_INSTALL[database_type]" value="'.htmlspecialchars($action_type).'">'.$content.'<br /><input type="submit" value="'.$label.'">';
04131 return $form;
04132 }
04133
04142 function displayFields($arr, $pre=0, $label='') {
04143 $out='';
04144 $out.='<tr><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Field name:').'</strong></td><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw($label?$label:'Info:').'</strong></td></tr>';
04145 if (is_array($arr)) {
04146 reset($arr);
04147 while(list($fieldname, $fieldContent)=each($arr)) {
04148 if ($pre) {
04149 $fieldContent = '<pre>'.trim($fieldContent).'</pre>';
04150 } else {
04151 $fieldContent = $this->fw($fieldContent);
04152 }
04153 $out.='<tr><td bgcolor="#ABBBB4">'.$this->fw($fieldname).'</td><td bgcolor="#ABBBB4">'.$fieldContent.'</td></tr>';
04154 }
04155 }
04156 $out= '<table border="0" cellpadding="0" cellspacing="0">'.$out.'</table>';
04157 return $out;
04158 }
04159
04167 function displayFieldComp($arr, $arr_db) {
04168 $out='';
04169 $out.='<tr><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Field name:').'</strong></td>
04170 <td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw("Suggested value from \$TCA:").'</strong></td>
04171 <td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Actual value from database:').'</strong></td>
04172 </tr>';
04173 if (is_array($arr)) {
04174 reset($arr);
04175 while(list($fieldname, $fieldContent)=each($arr)) {
04176 // This tries to equalize the types tinyint and int
04177 $str1 = $fieldContent;
04178 $str2 = trim($arr_db[$fieldname]);
04179 $str1 = str_replace('tinyint(3)','tinyint(4)',$str1);
04180 $str2 = str_replace('tinyint(3)','tinyint(4)',$str2);
04181 $str1 = str_replace('int(10)','int(11)',$str1);
04182 $str2 = str_replace('int(10)','int(11)',$str2);
04183 // Compare:
04184 if (strcmp($str1,$str2)) {
04185 $bgcolor=' bgcolor="#ABBBB4"';
04186 } else {
04187 $bgcolor=' bgcolor="#D9D5C9"';
04188 }
04189 $fieldContent = $this->fw($fieldContent);
04190 $fieldContent_db = $this->fw($arr_db[$fieldname]);
04191 $out.='<tr>
04192 <td bgcolor="#D9D5C9">'.$this->fw($fieldname).'</td>
04193 <td'.$bgcolor.'>'.$fieldContent.'</td>
04194 <td'.$bgcolor.'>'.$fieldContent_db.'</td>
04195 </tr>';
04196 }
04197 }
04198 $out= '<table border="0" cellpadding="2" cellspacing="2">'.$out.'</table>';
04199 return $out;
04200 }
04201
04209 function displaySuggestions($arr, $excludeList='') {
04210 $out='';
04211 $out.='<tr><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Field name:').'</strong></td><td bgcolor="#9BA1A8" align="center"><strong>'.$this->fw('Info / Suggestion for the field:').'</strong></td></tr>';
04212 $fC=0;
04213 if (is_array($arr)) {
04214 reset($arr);
04215 while(list($fieldname, $fieldContent)=each($arr)) {
04216 if (!t3lib_div::inList($excludeList,$fieldname) && substr($fieldname,0,strlen($this->deletedPrefixKey))!=$this->deletedPrefixKey && substr($fieldname,-1)!='.') {
04217 $fieldContent = $this->fw($fieldContent);
04218 if ($arr[$fieldname.'.']) {
04219 $fieldContent.= '<hr />';
04220 $fieldContent.= '<pre>'.trim($arr[$fieldname.'.']).'</pre>';
04221 }
04222 $out.='<tr><td bgcolor="#ABBBB4">'.$this->fw($fieldname).'</td><td bgcolor="#ABBBB4">'.$fieldContent.'</td></tr>';
04223 $fC++;
04224 }
04225 }
04226 }
04227 $out= '<table border="0" cellpadding="2" cellspacing="2">'.$out.'</table>';
04228 return array($out,$fC);
04229 }
04230
04239 function compareDatabaseAndTCA($FDsrc, $TCA, $onlyFields=0) {
04240 $extraArr=array();
04241 if (is_array($FDsrc)) {
04242 reset($FDsrc);
04243 while(list($table,$info)=each($FDsrc)) {
04244 if (!isset($TCA[$table])) {
04245 if (!$onlyFields) {
04246 $extraArr[$table]=$info; // If the table was not in the FDcomp-array, the result array is loaded with that table.
04247 $extraArr[$table]['whole_table']=1;
04248 unset($extraArr[$table]['keys']);
04249 }
04250 } else {
04251 $theKey='fields';
04252 $excludeListArr=array();
04253 if (is_array($TCA[$table]['ctrl']['enablecolumns'])) $excludeListArr[]=$TCA[$table]['ctrl']['enablecolumns'];
04254 $excludeListArr[]=$TCA[$table]['ctrl']['tstamp'];
04255 $excludeListArr[]=$TCA[$table]['ctrl']['sortby'];
04256 $excludeListArr[]=$TCA[$table]['ctrl']['delete'];
04257 $excludeListArr[]=$TCA[$table]['ctrl']['cruser_id'];
04258 $excludeListArr[]=$TCA[$table]['ctrl']['crdate'];
04259 $excludeListArr[]='uid';
04260 $excludeListArr[]='pid';
04261 if ($table=='pages') {
04262 $excludeListArr[]='perms_userid';
04263 $excludeListArr[]='perms_groupid';
04264 $excludeListArr[]='perms_user';
04265 $excludeListArr[]='perms_group';
04266 $excludeListArr[]='perms_everybody';
04267 }
04268 if ($table=='sys_dmail') {
04269 $excludeListArr[]='scheduled';
04270 $excludeListArr[]='scheduled_begin';
04271 $excludeListArr[]='scheduled_end';
04272 $excludeListArr[]='query_info';
04273 }
04274
04275 if (is_array($info[$theKey])) {
04276 reset($info[$theKey]);
04277 while(list($fieldN,$fieldC)=each($info[$theKey])) {
04278 if (!isset($TCA[$table]['columns'][$fieldN]) && !in_array($fieldN,$excludeListArr)) {
04279 $extraArr[$table][$theKey][$fieldN] = $info['fields'][$fieldN];
04280 $extraArr[$table][$theKey][$fieldN.'.']=$this->suggestTCAFieldDefinition($fieldN,$fieldC);
04281 }
04282 }
04283 }
04284 }
04285 }
04286 }
04287 return array('extra'=>$extraArr);
04288 }
04289
04297 function compareTCAandDatabase($TCA, $FDcomp) {
04298 $extraArr=array();
04299 $matchingArr=array();
04300 if (is_array($TCA)) {
04301 reset($TCA);
04302 while(list($table)=each($TCA)) {
04303 $info=$TCA[$table];
04304 if (!isset($FDcomp[$table])) {
04305 // $extraArr[$table]=$info; // If the table was not in the FDcomp-array, the result array is loaded with that table.
04306 $extraArr[$table]['whole_table']=1;
04307 } else {
04308 reset($info['columns']);
04309 while(list($fieldN,$fieldC)=each($info['columns'])) {
04310 $fieldDef = $this->suggestFieldDefinition($fieldC);
04311 if (!is_array($fieldDef)) {
04312 if (!isset($FDcomp[$table]['fields'][$fieldN])) {
04313 $extraArr[$table]['fields'][$fieldN]=$fieldDef;
04314 } else {
04315 $matchingArr[$table]['fields'][$fieldN]=$fieldDef;
04316 }
04317 }
04318 }
04319 }
04320 }
04321 }
04322 return array('extra'=>$extraArr, 'matching'=>$matchingArr);
04323 }
04324
04331 function suggestFieldDefinition($fieldInfo) {
04332 $out='';
04333 switch($fieldInfo['config']['type']) {
04334 case 'input':
04335 if (ereg('date|time|int|year',$fieldInfo['config']['eval'])) {
04336 $out = "int(11) NOT NULL default '0'";
04337 } else {
04338 $max = intval($fieldInfo['config']['max']);
04339 if ($max>0 && $max<200) {
04340 $out = 'varchar('.$max.") NOT NULL default ''";
04341 } else {
04342 $out = 'tinytext NOT NULL';
04343 }
04344 }
04345 break;
04346 case 'text':
04347 $out = 'text NOT NULL';
04348 break;
04349 case 'check':
04350 if (is_array($fieldInfo['config']['items']) && count($fieldInfo['config']['items'])>8) {
04351 $out = "int(11) NOT NULL default '0'";
04352 } else {
04353 $out = "tinyint(3) NOT NULL default '0'";
04354 }
04355 break;
04356 case 'radio':
04357 if (is_array($fieldInfo['config']['items'])) {
04358 $out = $this->getItemArrayType($fieldInfo['config']['items']);
04359 } else {
04360 $out = 'ERROR: Radiobox did not have items!';
04361 }
04362 break;
04363 case 'group':
04364 if ($fieldInfo['config']['internal_type']=='db') {
04365 $max = t3lib_div::intInRange($fieldInfo['config']['maxitems'],1,10000);
04366 if (count(explode(',',$fieldInfo['config']['allowed']))>1) {
04367 $len = $max*(10+1+5+1);
04368 $out=$this->getItemBlobSize($len);
04369 } elseif ($max<=1) {
04370 $out = "int(11) NOT NULL default '0'";
04371 } else {
04372 $len = $max*(5+1);
04373 $out=$this->getItemBlobSize($len);
04374 }
04375 }
04376 if ($fieldInfo['config']['internal_type']=='file') {
04377 $max = t3lib_div::intInRange($fieldInfo['config']['maxitems'],1,10000);
04378 $len = $max*(30+1);
04379 $out=$this->getItemBlobSize($len);
04380 }
04381 break;
04382 case 'select':
04383 $max = t3lib_div::intInRange($fieldInfo['config']['maxitems'],1,10000);
04384 if ($max<=1) {
04385 if ($fieldInfo['config']['foreign_table']) {
04386 $out = "int(11) NOT NULL default '0'";
04387 } else {
04388 $out = $this->getItemArrayType($fieldInfo['config']['items']);
04389 }
04390 } else {
04391
04392 $len = $max*(($fieldInfo['config']['special']?10:5)+1);
04393 $out=$this->getItemBlobSize($len);
04394 }
04395 break;
04396 default:
04397 break;
04398 }
04399 return $out?$out:$fieldInfo;
04400 }
04401
04408 function getItemArrayType($arr) {
04409 if (is_array($arr)) {
04410 reset($arr);
04411 $type[]=0;
04412 $intSize[]=0;
04413 while(list(,$item)=each($arr)) {
04414 if (!t3lib_div::testInt($item[1]) && $item[1]!='--div--') {
04415 $type[]=strlen($item[1]);
04416 } else {
04417 $intSize[]=$item[1];
04418 }
04419 }
04420 $us = min($intSize)>=0 ? ' unsigned' : '';
04421 if (max($type)>0) {
04422 $out = 'varchar('.max($type).") NOT NULL default ''";
04423 } else {
04424 $out = "int(11) NOT NULL default '0'";
04425 }
04426 }
04427 return $out;
04428 }
04429
04436 function getItemBlobSize($len) {
04437 return ($len>255 ? 'tiny' : '').'blob NOT NULL';
04438 }
04439
04447 function suggestTCAFieldDefinition($fieldName,$fieldInfo) {
04448 list($type,$len) = split(' |\(|\)',$fieldInfo,3);
04449 switch($type) {
04450 case 'int':
04451 $out="
04452 '".$fieldName."' => array (
04453 'label' => '".strtoupper($fieldName).":',
04454 'exclude' => 0,
04455 'config' => array (
04456 'type' => 'input',
04457 'size' => '8',
04458 'max' => '20',
04459 'eval' => 'date',
04460 'default' => '0',
04461 'checkbox' => '0'
04462 )
04463 ),
04464
04465 ----- OR -----
04466
04467 '".$fieldName."' => array (
04468 'label' => '".strtoupper($fieldName).":',
04469 'exclude' => 0,
04470 'config' => array (
04471 'type' => 'select',
04472 'items' => array (
04473 array('[nothing]', 0),
04474 array('Extra choice! Only negative values here.', -1),
04475 array('__Divider:__', '--div--')
04476 ),
04477 'foreign_table' => '[some_table_name]'
04478 )
04479 ),";
04480 break;
04481 case 'varchar':
04482 if ($len>10) {
04483 $out="
04484 '".$fieldName."' => array (
04485 'label' => '".strtoupper($fieldName).":',
04486 'exclude' => 0,
04487 'config' => array (
04488 'type' => 'input',
04489 'size' => '8',
04490 'max' => '".$len."',
04491 'eval' => 'trim',
04492 'default' => ''
04493 )
04494 ),";
04495 } else {
04496 $out="
04497 '".$fieldName."' => array (
04498 'label' => '".strtoupper($fieldName).":',
04499 'exclude' => 0,
04500 'config' => array (
04501 'type' => 'select',
04502 'items' => array (
04503 array('Item number 1', 'key1'),
04504 array('Item number 2', 'key2'),
04505 array('-----', '--div--'),
04506 array('Item number 3', 'key3')
04507 ),
04508 'default' => '1'
04509 )
04510 ),";
04511 }
04512 break;
04513 case 'tinyint':
04514 $out="
04515 '".$fieldName."' => array (
04516 'label' => '".strtoupper($fieldName).":',
04517 'exclude' => 0,
04518 'config' => array (
04519 'type' => 'select',
04520 'items' => array (
04521 array('Item number 1', '1'),
04522 array('Item number 2', '2'),
04523 array('-----', '--div--'),
04524 array('Item number 3', '3')
04525 ),
04526 'default' => '1'
04527 )
04528 ),
04529
04530 ----- OR -----
04531
04532 '".$fieldName."' => array (
04533 'label' => '".strtoupper($fieldName).":',
04534 'exclude' => 0,
04535 'config' => array (
04536 'type' => 'check',
04537 'default' => '1'
04538 )
04539 ),";
04540 break;
04541 case 'tinytext':
04542 $out="
04543 '".$fieldName."' => array (
04544 'label' => '".strtoupper($fieldName).":',
04545 'exclude' => 0,
04546 'config' => array (
04547 'type' => 'input',
04548 'size' => '40',
04549 'max' => '255',
04550 'eval' => '',
04551 'default' => ''
04552 )
04553 ),";
04554 break;
04555 case 'text':
04556 case 'mediumtext':
04557 $out="
04558 '".$fieldName."' => array (
04559 'label' => '".strtoupper($fieldName).":',
04560 'config' => array (
04561 'type' => 'text',
04562 'cols' => '48',
04563 'rows' => '5'
04564 )
04565 ),";
04566 break;
04567 default:
04568 $out="
04569 '".$fieldName."' => array (
04570 'label' => '".strtoupper($fieldName).":',
04571 'exclude' => 0,
04572 'config' => array (
04573 'type' => 'input',
04574 'size' => '30',
04575 'max' => '',
04576 'eval' => '',
04577 'default' => ''
04578 )
04579 ),";
04580 break;
04581 }
04582 return $out?$out:$fieldInfo;
04583 }
04584
04590 function includeTCA() {
04591 global $TCA;
04592
04593 include (TYPO3_tables_script ? PATH_typo3conf.TYPO3_tables_script : PATH_t3lib.'stddb/tables.php');
04594
04595
04596 if ($GLOBALS['TYPO3_LOADED_EXT']['_CACHEFILE']) {
04597 include(PATH_typo3conf.$GLOBALS['TYPO3_LOADED_EXT']['_CACHEFILE'].'_ext_tables.php');
04598 } else {
04599 include(PATH_t3lib.'stddb/load_ext_tables.php');
04600 }
04601
04602 if (TYPO3_extTableDef_script) {
04603 include (PATH_typo3conf.TYPO3_extTableDef_script);
04604 }
04605
04606 reset($TCA);
04607 while(list($table)=each($TCA)) {
04608 t3lib_div::loadTCA($table);
04609 }
04610 }
04611
04612
04613
04614
04615
04616
04617
04618
04619
04620
04621
04622
04623
04624
04632 function linkIt($url,$link='') {
04633 return '<a href="'.$url.'" target="_blank">'.($link?$link:$url).'</a>';
04634 }
04635
04646 function message($head, $short_string='', $long_string='', $type=0, $force=0) {
04647 if (!$force && $this->mode=='123' && $type<2) { return; }
04648
04649 if ($type==3) { $this->fatalError=1; }
04650 if ($this->messageFunc_nl2br && !preg_match('/<\/table>/', $long_string)) {
04651 $long_string = nl2br(trim($long_string));
04652 } else {
04653 $long_string = trim($long_string);
04654 }
04655 if (!$this->silent) $this->printSection($head, $short_string, $long_string, $type);
04656 }
04657
04667 function printSection($head, $short_string, $long_string, $type) {
04668 $icon='';
04669
04670 $bgCol =' bgcolor="#D9D5C9"';
04671 switch($type) {
04672 case '3':
04673 $bgCol =' bgcolor="red"';
04674 $icon = 'gfx/icon_fatalerror.gif';
04675 break;
04676 case '2':
04677 $bgCol =' bgcolor="#9BA1A8"';
04678 $icon = 'gfx/icon_warning.gif';
04679 break;
04680 case '1':
04681
04682 $icon = 'gfx/icon_note.gif';
04683 break;
04684 case '-1':
04685
04686 $icon = 'gfx/icon_ok.gif';
04687 break;
04688 default:
04689 $bgCol =' bgcolor="#D3D9DC"';
04690 break;
04691 }
04692 if (!trim($short_string)) {
04693 $this->sections[$head][]='';
04694 } else {
04695 $this->sections[$head][]='
04696 <tr><td'.$bgCol.' nowrap="nowrap">'.($icon?'<img src="'.$this->backPath.$icon.'" width="18" height="16" align="top" alt="">':'').'<strong>'.$this->fw($short_string).'</strong></td></tr>'.(trim($long_string)?'
04697 <tr><td>'.$this->fw($long_string).'<br /><br /></td></tr>' : '');
04698 }
04699 }
04700
04708 function fw($str,$size=1) {
04709
04710 if (preg_match('/^<table/', $str) && preg_match('/<\/table>$/', $str)) {
04711
04712 } else {
04713 if($size==1) {
04714 $size = 'class="smalltext"';
04715 } elseif ($size==2) {
04716 $size = 'class="bodytext"';
04717 } else {
04718 $size = 'size="size'.$size.'text"';
04719 }
04720 $str = '<span '.$size.'>'.$str.'</span>';
04721 }
04722 return $str;
04723 }
04724
04731 function fwheader($str) {
04732 return '<div align="center"><strong>'.$this->fw($str,3).'</strong></div>';
04733 }
04734
04742 function wrapInCells($label,$content) {
04743 return '<tr><td valign="top" nowrap="nowrap"><strong>'.$this->fw($label).'</strong></td><td> </td><td valign="top">'.$this->fw($content).'<br /></td></tr>';
04744 }
04745
04751 function printAll() {
04752 reset($this->sections);
04753 $out='';
04754 while(list($header,$valArray)=each($this->sections)) {
04755 $out.='
04756 <tr><td> </td></tr>
04757 <tr><td><div align="center"><strong>'.$this->fw($header.':',2).'</strong></div></td></tr>
04758 ';
04759 $out.=implode($valArray,chr(10));
04760 }
04761 return '<table border="0" cellpadding="2" cellspacing="2">'.$out.'</table>';
04762 }
04763
04770 function outputWrapper($content) {
04771 $out='
04772 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
04773 "http://www.w3.org/TR/html4/loose.dtd">
04774 <html>
04775 <head>
04776
04777 <style type="text/css">
04778 body, p, td, a, span, input, .bodytext {
04779 font-family:verdana,sans-serif;
04780 font-size:1em;
04781 color:#000;
04782 text-align: left;
04783 }
04784 .smalltext {
04785 font-size:0.9em;
04786 }
04787 .size3text {
04788 font-size:1.2em;
04789 }
04790 .size4text {
04791 font-size:1.5em;
04792 }
04793 a {color: #600; text-decoration: none;}
04794 a:active {text-decoration: none;}
04795 a:hover {color: #006; text-decoration:underline:}
04796 </style>
04797 '.$this->headerStyle.'
04798
04799 <title>TYPO3 Install Tool</title>
04800 '.($this->JSmessage?'
04801 <script language="javascript" type="text/javascript">alert(unescape(\''.rawurlencode($this->JSmessage).'\'));</script>
04802
04803 ':'').'
04804 </head>
04805 <body bgcolor="white" alink="maroon" link="maroon" vlink="maroon">'.$this->contentBeforeTable.'
04806 <div align="center">
04807 <table border="0" cellspacing="0" cellpadding="0" width="333" bgcolor="white">
04808 <tr>
04809 <td style="text-align:center;"><img src="'.$this->backPath.'gfx/typo3logo.gif" width="123" height="34" vspace="10" hspace="50" alt="TYPO3"></td>
04810 </tr>
04811 <tr>
04812 <td bgcolor="black">
04813 <table width="100%" border="0" cellspacing="1" cellpadding="10">
04814 <tr>
04815 <td bgcolor="#F4F0E8">
04816 <div align="center"><span class="size4text"><strong>TYPO3 '.$GLOBALS['TYPO_VERSION'].' Install Tool</strong></span></div>
04817 <div align="center"><span style="color:navy;"><strong>Site: '.$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'].'</strong></span></div><br />
04818
04819 '.($this->step?$this->stepHeader():$this->menu()).$content.'<hr />'.$this->note123().$this->endNotes().'
04820 </td>
04821 </tr>
04822 </table>
04823 </td>
04824 </tr>
04825 </table>
04826 </div>
04827 </body>
04828 </html>';
04829 return $out;
04830 }
04831
04837 function menu() {
04838 if (!$this->passwordOK) return;
04839
04840 reset($this->menuitems);
04841 $c=0;
04842 $out=array();
04843 while(list($k,$v)=each($this->menuitems)) {
04844 $bgcolor = ($this->INSTALL['type']==$k ? ' bgcolor="#ABBBB4"' : ' bgcolor="#F4F0E8"');
04845 $c++;
04846 $out[]='<tr><td'.$bgcolor.'><a href="'.htmlspecialchars($this->scriptSelf.'?TYPO3_INSTALL[type]='.$k.($this->mode?'&mode='.rawurlencode($this->mode):'')).'">'.$this->fw($c.': '.$v).'</a></td></tr>';
04847 }
04848
04849 $code = '<table border="0" cellpadding="0" cellspacing="1">'.implode($out,chr(10)).'</table>';
04850 $code = '<table border="0" cellpadding="0" cellspacing="0" bgcolor="#ABBBB4"><tr><td>'.$code.'</td></tr></table>';
04851 return '<div align="center">'.$code.'</div>';
04852 }
04853
04859 function stepHeader() {
04860 $msg1='Type in your database parameters here:';
04861 $msg2='Database';
04862 $msg3='Import the database sql-file';
04863 $msg4='You\'re done!';
04864 $out='<img src="'.$this->backPath.'gfx/123_'.$this->step.'.png" width="402" height="73" border="0" alt="" usemap="#id123_print_Map">
04865 <map name="id123_print_Map">
04866 <area title="'.$msg4.'" shape="poly" alt="" coords="299,35, 303,19, 313,9, 335,5, 366,6, 379,11, 388,21, 392,35, 390,47, 381,58, 376,64, 359,67, 320,66, 307,60, 302,51, 300,44" href="'.htmlspecialchars($this->scriptSelf.'?mode='.$this->mode.'&step=go').'">
04867 <area title="'.$msg3.'" shape="circle" alt="" coords="234,36,32" href="'.htmlspecialchars($this->scriptSelf.'?mode='.$this->mode.'&step=3').'">
04868 <area title="'.$msg2.'" shape="circle" alt="" coords="136,37,30" href="'.htmlspecialchars($this->scriptSelf.'?mode='.$this->mode.'&step=2').'">
04869 <area title="'.$msg1.'" shape="circle" alt="" coords="40,36,29" href="'.htmlspecialchars($this->scriptSelf.'?mode='.$this->mode.'&step=1').'">
04870 </map>
04871
04872
04873 <br />';
04874 $msg='';
04875 switch(strtolower($this->step)) {
04876 case 1:
04877 $msg=$msg1;
04878 break;
04879 case 2:
04880 $msg=$msg2;
04881 break;
04882 case 3:
04883 $msg=$msg3;
04884 break;
04885 case 'go':
04886 $msg=$msg4;
04887 break;
04888 default:
04889 break;
04890 }
04891 $out.='<br /><div align="center"><strong>'.$this->fw($msg,2).'</strong></div>';
04892
04893 return $out;
04894 }
04895
04901 function note123() {
04902 if ($this->mode=='123') {
04903 $c='<table border="0" cellpadding="0" cellspacing="0" width="100%">
04904 <tr><td bgcolor="#D9D5C9" nowrap="nowrap"><img src="'.$this->backPath.'gfx/icon_note.gif" width="18" height="16" align="top" alt=""><strong>'.$this->fontTag1.'NOTICE: Install Tool is running in \'123\' mode. <a href="'.$this->scriptSelf.'">Click here to disable.</a></span></strong></td></tr>
04905 </table>';
04906 return $c;
04907 }
04908 }
04909
04915 function endNotes() {
04916 if ($this->mode!='123' && $this->passwordOK) {
04917 $c.='OS detected: <strong>'.(TYPO3_OS=='WIN'?'WIN':'UNIX').'</strong><br />';
04918 $c.='UNIX/CGI detected: <strong>'.(php_sapi_name()=='cgi' ? 'YES' : 'NO').'</strong><br />';
04919 $c.='PATH_thisScript: <strong>'.PATH_thisScript.'</strong><br />';
04920 $c.='<br />';
04921 $c.='<a href="../index.php" target="install_backend">Backend admin in new window.</a><br />';
04922 $c.='<a href="../../index.php" target="install_frontend">Frontend website in new window.</a><br />';
04923
04924 return $this->fw($c);
04925 }
04926 }
04927
04934 function convertByteSize($bytes) {
04935 if (stristr($bytes,'m')) {
04936 $bytes=doubleval($bytes)*1024*1024;
04937 } elseif (stristr($bytes,'k')) {
04938 $bytes=doubleval($bytes)*1024;
04939 }
04940 return $bytes;
04941 }
04942
04948 function securityRisk() {
04949 $c='This script is a <strong>great danger to the security of TYPO3</strong> if you don\'t secure it somehow.
04950 We suggest one of the following:
04951
04952 - change the password as defined by the md5-hash in TYPO3_CONF_VARS[BE][installToolPassword].
04953 - delete the folder \'typo3/install/\' with this script in or just insert an \'exit;\' line in the script-file there.
04954 - password protect the \'typo3/install/\' folder, eg. with a .htaccess file
04955
04956 The TYPO3_CONF_VARS[BE][installToolPassword] is always active, but choosing one of the other options will improve security and is recommended highly.
04957 ';
04958 return $c;
04959 }
04960
04966 function alterPasswordForm() {
04967 $content = '<form action="'.$this->scriptSelf.'?TYPO3_INSTALL[type]=extConfig" method="post">
04968 Enter new password:
04969 <input type="password" name="TYPO3_INSTALL[extConfig][BE][installToolPassword]" /><br />Enter again:
04970 <input type="password" name="installToolPassword_check" />
04971 <input type="hidden" name="installToolPassword_md5" value="1" />
04972 <input type="submit" value="Set new password" /><br />
04973 </form>';
04974 return $content;
04975 }
04976
04982 function messageBasicFinished() {
04983 $msg ='
04984 Apparently you have completed the basic setup of the TYPO3 database.
04985 Now you can choose between these options:
04986
04987 - <a href="../../index.php"><strong>Go to the frontend pages</strong></a>
04988
04989 - <a href="../index.php"><strong>Go to the backend login</strong></a>
04990 (username may be: <i>admin</i>, password may be: <i>password</i>.)
04991
04992 - <a href="'.$this->scriptSelf.'"><strong>Continue to configure TYPO3</strong></a> (Recommended).
04993 This will let you analyse and verify that everything in your PHP installation is alright. Also if you want to configure TYPO3 to use all the cool features, you <em>must</em> dig into the this!
04994 ';
04995 return $msg;
04996 }
04997
05004 function setScriptName($type) {
05005 $value = $this->scriptSelf.'?TYPO3_INSTALL[type]='.$type.($this->mode?'&mode='.rawurlencode($this->mode):'').($this->step?'&step='.rawurlencode($this->step):'');
05006 return $value;
05007 }
05008
05017 function formWidth($size=48,$textarea=0,$styleOverride='') {
05018
05019 $wAttrib = $textarea?'cols':'size';
05020 if (!$GLOBALS['CLIENT']['FORMSTYLE']) {
05021 $size = ceil($size*1);
05022 $retVal = ' '.$wAttrib.'="'.$size.'"';
05023 } else {
05024 $pixels = ceil($size*10);
05025 $retVal = $styleOverride ? ' style="'.$styleOverride.'"' : ' style="width:'.$pixels.'px;"';
05026 }
05027 return $retVal;
05028 }
05029
05038 function formWidthText($size=48,$styleOverride='',$wrap='') {
05039 $wTags = $this->formWidth($size,1,$styleOverride);
05040
05041 if (strtolower(trim($wrap))!='off' && $GLOBALS['CLIENT']['BROWSER']=='net' && $GLOBALS['CLIENT']['VERSION']>=5) {
05042 $wTags.=' cols="'.$size.'"';
05043 }
05044 return $wTags;
05045 }
05046
05054 function getBackupFilename($filename) {
05055 if (preg_match('/\.php$/', $filename)) {
05056 $backupFile = str_replace('.php', '_bak.php', $filename);
05057 } else {
05058 $backupFile = $filename.'~';
05059 }
05060
05061 return $backupFile;
05062 }
05063 }
05064
05065 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/install/mod/class.tx_install.php']) {
05066 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/install/mod/class.tx_install.php']);
05067 }
05068 ?>