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
00099
00100
00101
00102 error_reporting (E_ALL ^ E_NOTICE);
00103 define('TYPO3_mainDir', 'typo3/');
00104
00105
00106
00107 $path_t3lib = './typo3_src/t3lib/';
00108 include_once($path_t3lib.'class.t3lib_div.php');
00109 include_once($path_t3lib.'class.t3lib_db.php');
00110 $TYPO3_DB = t3lib_div::makeInstance('t3lib_DB');
00111
00112
00120 function debug($p1,$p2='') {
00121 t3lib_div::debug($p1,$p2);
00122 }
00123
00124
00125
00134 class t3lib_superadmin {
00135
00136
00137 var $targetWindow = 'superAdminWindow';
00138 var $targetWindowAdmin = 'superAdminWindowAdmin';
00139 var $targetWindowInstall = 'superAdminWindowInstall';
00140 var $scriptName = 'superadmin.php';
00141
00142
00143 var $show;
00144 var $type;
00145 var $exp;
00146
00147
00148 var $parentDirs = array();
00149 var $globalSiteInfo = array();
00150
00151 var $currentUrl = '';
00152 var $mapDBtoKey = array();
00153 var $collectAdminPasswords = array();
00154 var $changeAdminPasswords = array();
00155 var $collectInstallPasswords = array();
00156
00157
00158 var $full = 0;
00159
00160 var $noCVS = 0;
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00180 function t3lib_superadmin() {
00181 $this->show = t3lib_div::_GP('show');
00182 $this->type = t3lib_div::_GP('type');
00183 $this->exp = t3lib_div::_GP('exp');
00184 }
00185
00192 function init($parentDirs) {
00193 $this->parentDirs = $parentDirs;
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00215 function defaultSet() {
00216
00217
00218 switch($this->type) {
00219 case 'phpinfo':
00220 phpinfo();
00221 break;
00222 case 'page':
00223 ?>
00224 <!DOCTYPE html
00225 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
00226 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
00227 <html>
00228 <head>
00229 <style type="text/css">
00230 .redclass {color: red;}
00231 P {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px}
00232 BODY {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px}
00233 H1 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 20px; color: #000066;}
00234 H2 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 17px; color: #000066;}
00235 H3 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; color: #000066;}
00236 H4 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: maroon;}
00237 TD {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px}
00238 </style>
00239 <title>TYPO3 Super Admin</title>
00240 </head>
00241 <body>
00242 <?php
00243 echo $this->make();
00244 ?>
00245 </body>
00246 </html>
00247 <?php
00248 break;
00249 default:
00250 ?>
00251 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
00252 <html>
00253 <head>
00254 <title>TYPO3 Super Admin</title>
00255 </head>
00256 <frameset cols="250,*">
00257 <frame name="TSAmenu" src="superadmin.php?type=page&show=menu" marginwidth="10" marginheight="10" scrolling="auto" frameborder="0">
00258 <frame name="TSApage" src="superadmin.php?type=page" marginwidth="10" marginheight="10" scrolling="auto" frameborder="0">
00259 </frameset>
00260 </html>
00261 <?php
00262 break;
00263 }
00264 }
00265
00271 function make() {
00272
00273 $retVal = '';
00274
00275
00276 $content = $this->initProcess();
00277
00278
00279 switch($this->show) {
00280 case 'menu':
00281 $lines=array();
00282 $lines[]=$this->setMenuItem('info','INFO');
00283 $lines[]=$this->setMenuItem('update','UPDATE');
00284 $lines[]='';
00285 $lines[]='<a href="'.htmlspecialchars($this->scriptName.'?type=page').'" target="TSApage">Default</a>';
00286 $lines[]='<a href="'.htmlspecialchars($this->scriptName.'?type=page&show=all').'" target="TSApage">All details</a>';
00287 $lines[]='<a href="'.htmlspecialchars($this->scriptName.'?type=page&show=admin').'" target="TSApage">Admin logins</a>';
00288 $lines[]='<a href="'.htmlspecialchars($this->scriptName.'?type=phpinfo').'" target="TSApage">phpinfo()</a>';
00289 $lines[]='<a href="'.htmlspecialchars($this->scriptName.'?type=page&show=localext').'" target="TSApage">Local extensions</a>';
00290 $lines[]='';
00291 $content = implode('<br />',$lines);
00292 $content.= '<hr />';
00293 $content.=$this->menuContent($this->exp);
00294 $retVal = '<h2 align="center">TYPO3<br />Super Admin</h2>'.$content;
00295 break;
00296 case 'all':
00297 $retVal = '
00298 <h1>All details:</h1>
00299 <h2>Overview:</h2>
00300 '.$this->makeTable().'
00301 <br /><hr /><br />
00302 <h1>Details per site:</h1>
00303 '.$content;
00304 break;
00305 case 'admin':
00306 $content = $this->setNewPasswords();
00307 $this->makeTable();
00308 $retVal = $content.'
00309 <h1>Admin options:</h1>
00310
00311 <h2>Admin logins:</h2>
00312 '.$this->makeAdminLogin().'
00313 <br /><hr /><br />
00314
00315 <h2>TBE Admin Passwords:</h2>
00316 '.t3lib_div::view_array($this->collectAdminPasswords).'
00317 <br /><hr /><br />
00318
00319 <h2>Install Tool Passwords:</h2>
00320 '.t3lib_div::view_array($this->collectInstallPasswords).'
00321 <br /><hr /><br />
00322
00323 <h2>Change TBE Admin Passwords:</h2>
00324 '.$this->changeAdminPasswordsForm().'
00325 <br /><hr /><br />';
00326 break;
00327 case 'info':
00328 $retVal = '
00329 <h1>Single site details</h1>
00330 '.$this->singleSite($this->exp).
00331 '<br />';
00332 break;
00333 case 'rmTempCached':
00334 $retVal = '
00335 <h1>Removing temp_CACHED_*.php files</h1>
00336 '.$this->rmCachedFiles($this->exp).
00337 '<br />';
00338 break;
00339 case 'localext':
00340 $retVal = '
00341 <h1>Local Extensions Found:</h1>
00342 '.$this->localExtensions().
00343 '<br />';
00344 break;
00345 default:
00346 $retVal = '
00347 <h1>Default info:</h1>'.
00348 $content;
00349 break;
00350 }
00351 return $retVal;
00352 }
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00376 function setMenuItem($code,$label) {
00377 $out = '<a href="'.htmlspecialchars($this->scriptName.'?type=page&show=menu&exp='.$code).'" target="TSAmenu">'.htmlspecialchars($label).'</a>';
00378 if ($code==$this->exp) {
00379 $out = '<span style="color:red;">>></span>'.$out;
00380 }
00381 return $out;
00382 }
00383
00390 function error($str) {
00391 $out = '<span style="color:red; font-size: 14px; font-weight: bold;">'.htmlspecialchars($str).'</span>';
00392 return $out;
00393 }
00394
00401 function headerParentDir($str) {
00402 $out = '<h2>'.htmlspecialchars($str).'</h2>';
00403 return $out;
00404 }
00405
00412 function headerSiteDir($str) {
00413 $out = '<h3>'.htmlspecialchars($str).'</h3>';
00414 return $out;
00415 }
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00444 function initProcess() {
00445 $content = '';
00446
00447 foreach($this->parentDirs as $k => $v) {
00448 $dir = ereg_replace('/$','',$v['dir']);
00449 $baseUrl=ereg_replace('/$','',$v['url']);
00450 $content.='<br /><br /><br />';
00451 $content.=$this->headerParentDir($dir);
00452 if (@is_dir($dir)) {
00453 $in_dirs = t3lib_div::get_dirs($dir);
00454 asort($in_dirs);
00455 reset($in_dirs);
00456 $dirArr=array();
00457 while(list($k,$v)=each($in_dirs)) {
00458 if (substr($v,0,9)!='typo3_src') {
00459 $this->currentUrl = $baseUrl.'/'.$v;
00460 $content.= $this->headerSiteDir($v);
00461 $content.= $this->processSiteDir($dir.'/'.$v,$dir);
00462 }
00463 }
00464 } else {
00465 $content.=$this->error('"'.$dir.'" was not a directory!');
00466 }
00467 }
00468
00469 return $content;
00470 }
00471
00482 function processSiteDir($path,$dir) {
00483 if (@is_dir($path)) {
00484 $localconf = $path.'/typo3conf/localconf.php';
00485 if (@is_file($localconf)) {
00486 $key = md5($localconf);
00487 $this->includeLocalconf($localconf);
00488
00489 $this->mapDBtoKey[$this->globalSiteInfo[$key]['siteInfo']['TYPO3_db']] = $key;
00490 $this->globalSiteInfo[$key]['siteInfo']['MAIN_DIR'] = $dir;
00491 $this->globalSiteInfo[$key]['siteInfo']['SA_PATH'] = $path;
00492 $this->globalSiteInfo[$key]['siteInfo']['URL'] = $this->currentUrl.'/';
00493 $this->globalSiteInfo[$key]['siteInfo']['ADMIN_URL'] = $this->currentUrl.'/'.TYPO3_mainDir;
00494 $this->globalSiteInfo[$key]['siteInfo']['INSTALL_URL'] = $this->currentUrl.'/'.TYPO3_mainDir.'install/';
00495
00496 // Connect to database:
00497 $conMsg = $this->connectToDatabase($this->globalSiteInfo[$key]['siteInfo']);
00498 if (!$conMsg) {
00499 $this->getDBInfo($key);
00500 $out.='';
00501 } else {
00502 $out = $conMsg;
00503 }
00504
00505 // Show details:
00506 if ($this->full) {
00507 $out.=t3lib_div::view_array($this->globalSiteInfo[$key]);
00508 } else {
00509 $out.=t3lib_div::view_array($this->globalSiteInfo[$key]['siteInfo']);
00510 }
00511 } else $out = $this->error($localconf.' is not a file!');
00512 } else $out = $this->error($path.' is not a directory!');
00513 return $out;
00514 }
00515
00524 function includeLocalconf($localconf) {
00525 $TYPO3_CONF_VARS = array();
00526 $typo_db = '';
00527 $typo_db_username = '';
00528 $typo_db_password = '';
00529 $typo_db_host = '';
00530
00531 include($localconf);
00532
00533 $siteInfo=array();
00534 $siteInfo['sitename'] = $TYPO3_CONF_VARS['SYS']['sitename'];
00535 $siteInfo['TYPO3_db'] = $typo_db;
00536 $siteInfo['TYPO3_db_username'] = $typo_db_username;
00537 $siteInfo['TYPO3_db_password'] = $typo_db_password;
00538 $siteInfo['TYPO3_db_host'] = $typo_db_host;
00539 $siteInfo['installToolPassword'] = $TYPO3_CONF_VARS['BE']['installToolPassword'];
00540 $siteInfo['warningEmailAddress'] = $TYPO3_CONF_VARS['BE']['warning_email_addr'];
00541 $siteInfo['warningMode'] = $TYPO3_CONF_VARS['BE']['warning_mode'];
00542
00543 $this->globalSiteInfo[md5($localconf)] = array('siteInfo'=>$siteInfo,'TYPO3_CONF_VARS'=>$TYPO3_CONF_VARS);
00544 return $siteInfo;
00545 }
00546
00554 function connectToDatabase($siteInfo) {
00555 if (@mysql_pconnect($siteInfo['TYPO3_db_host'], $siteInfo['TYPO3_db_username'], $siteInfo['TYPO3_db_password'])) {
00556 if (!$siteInfo['TYPO3_db']) {
00557 return $this->error('No database selected');
00558 } elseif (!mysql_select_db($siteInfo['TYPO3_db'])) {
00559 return $this->error('Cannot connect to the current database, "'.$siteInfo['TYPO3_db'].'"');
00560 }
00561 } else {
00562 return $this->error('The current username, password or host was not accepted when the connection to the database was attempted to be established!');
00563 }
00564 }
00565
00566
00576 function getDBInfo($key) {
00577 $DB = $this->globalSiteInfo[$key]['siteInfo']['TYPO3_db'];
00578
00579
00580 $query = $GLOBALS['TYPO3_DB']->SELECTquery('count(*)', 'be_users', 'admin=0 AND deleted=0');
00581 $res = mysql($DB, $query);
00582 $row = mysql_fetch_row($res);
00583 $this->globalSiteInfo[$key]['siteInfo']['BE_USERS_NONADMIN'] = $row[0];
00584
00585
00586 $query = $GLOBALS['TYPO3_DB']->SELECTquery('count(*)', 'be_users', 'admin!=0 AND deleted=0');
00587 $res = mysql($DB, $query);
00588 $row = mysql_fetch_row($res);
00589 $this->globalSiteInfo[$key]['siteInfo']['BE_USERS_ADMIN'] = $row[0];
00590
00591
00592 $query = $GLOBALS['TYPO3_DB']->SELECTquery('uid,username,password,email,realName,disable', 'be_users', 'admin!=0 AND deleted=0');
00593 $res = mysql($DB, $query);
00594 while($row = mysql_fetch_assoc($res)) {
00595 $this->globalSiteInfo[$key]['siteInfo']['ADMINS'][] = $row;
00596 }
00597 }
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00626 function makeTable() {
00627
00628
00629 $info = array();
00630 $info[] = 'Site:';
00631 $info[] = 'Path:';
00632 $info[] = 'Database:';
00633 $info[] = 'Username';
00634 $info[] = 'Password';
00635 $info[] = 'Host';
00636 $info[] = 'Links (new win)';
00637 $info[] = '#Users NA/A';
00638 $info[] = 'Admin be_users Info';
00639 $info[] = 'Install Tool Password';
00640 $info[] = 'Warning email address';
00641 $info[] = 'W.mode';
00642 $mainArrRows[] = '
00643 <tr bgcolor="#eeeeee">
00644 <td nowrap="nowrap" valign="top">'.implode('</td>
00645 <td nowrap="nowrap" valign="top">',$info).'</td>
00646 </tr>';
00647
00648
00649 foreach($this->globalSiteInfo as $k => $all) {
00650 $info = array();
00651
00652
00653 $info[] = htmlspecialchars($all['siteInfo']['sitename']);
00654 $info[] = '<span style="color:#666666;">'.htmlspecialchars($all['siteInfo']['MAIN_DIR']).'</span>'.htmlspecialchars(substr($all['siteInfo']['SA_PATH'],strlen($all['siteInfo']['MAIN_DIR'])));
00655 $info[] = htmlspecialchars($all['siteInfo']['TYPO3_db']);
00656 $info[] = htmlspecialchars($all['siteInfo']['TYPO3_db_username']);
00657 $info[] = htmlspecialchars($all['siteInfo']['TYPO3_db_password']);
00658 $info[] = htmlspecialchars($all['siteInfo']['TYPO3_db_host']);
00659
00660
00661 $info[] = '<a href="'.htmlspecialchars($all['siteInfo']['URL']).'" target="'.$this->targetWindow.'">Site</a>'.
00662 ' / <a href="'.htmlspecialchars($all['siteInfo']['ADMIN_URL']).'" target="'.$this->targetWindowAdmin.'">Admin</a>'.
00663 ' / <a href="'.htmlspecialchars($all['siteInfo']['INSTALL_URL']).'" target="'.$this->targetWindowInstall.'">Install</a>';
00664 $info[] = htmlspecialchars($all['siteInfo']['BE_USERS_NONADMIN'].'/'.$all['siteInfo']['BE_USERS_ADMIN']);
00665
00666
00667 if (is_array($all['siteInfo']['ADMINS'])) {
00668 $lines = array();
00669 foreach($all['siteInfo']['ADMINS'] as $vArr) {
00670 $lines[] = htmlspecialchars($vArr['password'].' - '.$vArr['username'].' ('.$vArr['realName'].', '.$vArr['email'].')');
00671 $this->collectAdminPasswords[$vArr['password']][] = array(
00672 'path' => $all['siteInfo']['SA_PATH'],
00673 'site' => $all['siteInfo']['sitename'],
00674 'database' => $all['siteInfo']['TYPO3_db'],
00675 'user' => $vArr['username'],
00676 'name_email' => $vArr['realName'].', '.$vArr['email']
00677 );
00678 $this->changeAdminPasswords[$vArr['password']][] = $all['siteInfo']['TYPO3_db'].':'.$vArr['uid'].':'.$vArr['username'];
00679 }
00680 $info[] = implode('<br />',$lines);
00681 } else {
00682 $info[] = $this->error('No DB connection!');
00683 }
00684
00685 $info[] = htmlspecialchars($all['siteInfo']['installToolPassword']);
00686 $this->collectInstallPasswords[$all['siteInfo']['installToolPassword']][] = $all['siteInfo']['SA_PATH'].' - '.$all['siteInfo']['sitename'].' - ('.$all['siteInfo']['TYPO3_db'].')';
00687
00688 $info[] = htmlspecialchars($all['siteInfo']['warningEmailAddress']);
00689 $info[] = htmlspecialchars($all['siteInfo']['warningMode']);
00690
00691
00692 $mainArrRows[] = '
00693 <tr>
00694 <td nowrap="nowrap" valign="top">'.implode('</td>
00695 <td nowrap="nowrap" valign="top">',$info).'</td>
00696 </tr>';
00697 }
00698
00699
00700 $table = '<table border="1" cellpadding="1" cellspacing="1">'.implode('',$mainArrRows).'</table>';
00701 return $table;
00702 }
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00729 function localExtensions() {
00730 $this->extensionInfoArray=array();
00731
00732
00733 foreach($this->globalSiteInfo as $k => $all) {
00734 if ($all['siteInfo']['SA_PATH']) {
00735 $extDir = $all['siteInfo']['SA_PATH'].'/typo3conf/ext/';
00736 if (@is_dir($extDir)) {
00737 $this->extensionInfoArray['site'][$k] = array();
00738
00739
00740 $extensions=t3lib_div::get_dirs($extDir);
00741 if (is_array($extensions)) {
00742 foreach($extensions as $extKey) {
00743
00744 $eInfo = $this->getExtensionInfo($extDir,$extKey,$k);
00745 $this->extensionInfoArray['site'][$k][$extKey] = $eInfo;
00746 $this->extensionInfoArray['ext'][$extKey][$k] = $eInfo;
00747 }
00748 }
00749 }
00750 }
00751 }
00752
00753
00754 $out='';
00755 $headerRow = '
00756 <tr bgcolor="#ccccee" style="font-weight:bold;">
00757 <td>Extension key</td>
00758 <td>Path</td>
00759 <td>Title</td>
00760 <td>Ver.</td>
00761 <td>Files</td>
00762 <td><span title="If M, then there is a manual.">M</span></td>
00763 <td>Last mod. time</td>
00764 <td>Hash off all file mod. times:</td>
00765 <td>TYPO3 ver. req.</td>
00766 <td>CGL compliance</td>
00767 </tr>
00768 ';
00769
00770
00771 if (is_array($this->extensionInfoArray['ext'])) {
00772 $extensionKeysCollect=array();
00773
00774 ksort($this->extensionInfoArray['ext']);
00775 reset($this->extensionInfoArray['ext']);
00776 $rows=array(
00777 'reg'=>array(),
00778 'user'=>array()
00779 );
00780
00781 foreach($this->extensionInfoArray['ext'] as $extKey => $instances) {
00782 $mtimes = array();
00783
00784
00785 reset($instances);
00786 while(list($k,$eInfo)=each($instances)) {
00787 $mtimes[] = $eInfo['mtime'];
00788 }
00789
00790 $maxMtime = max($mtimes);
00791 $c = 0;
00792
00793
00794 foreach($instances as $k => $eInfo) {
00795
00796 if ($maxMtime==$eInfo['mtime']) {
00797 $this->extensionInfoArray['site'][$k][$extKey]['_highlight']=1;
00798 $bgCol = $eInfo['dirtype']=='link' ? ' bgcolor="#ffcccc"' : ' bgcolor="#eeeeee"';
00799 } else {
00800 $bgCol = ' style="color: #999999; font-style: italic;"';
00801 }
00802
00803
00804 $type = substr($extKey,0,5)!='user_' ? 'reg' : 'user';
00805 if ($type=='reg') $extensionKeysCollect[] = $extKey;
00806
00807 if (!is_array($eInfo)) {
00808
00809 $rows[$type][] = '
00810 <tr>
00811 '.(!$c?'<td rowspan="'.count($instances).'">'.htmlspecialchars($extKey).'</td>':'').'
00812 <td nowrap="nowrap" bgcolor="#ccddcc">'.htmlspecialchars($this->globalSiteInfo[$k]['siteInfo']['SA_PATH']).'</td>
00813 <td nowrap="nowrap" bgcolor="#ccddcc" colspan="8"><em>'.htmlspecialchars($eInfo).'</em></td>
00814 </tr>
00815 ';
00816 } else {
00817
00818 $rows[$type][] = '
00819 <tr>
00820 '.(!$c?'<td rowspan="'.count($instances).'">'.htmlspecialchars($extKey).'</td>':'').'
00821 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($this->globalSiteInfo[$k]['siteInfo']['SA_PATH']).'</td>
00822 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['title']).'</td>
00823 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['version']).'</td>
00824 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['numberfiles']).'</td>
00825 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['manual']?'M':'-').'</td>
00826 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['mtime']?date('d-m-y H:i:s',$eInfo['mtime']):'').'</td>
00827 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['mtime_hash']).'</td>
00828
00829 <td'.$bgCol.'>'.htmlspecialchars($eInfo['TYPO3_version']).'</td>
00830 <td'.$bgCol.'><img src="clear.gif" width="150" height="1" alt="" /><br />'.htmlspecialchars($eInfo['CGLcompliance'].($eInfo['CGLcompliance_note'] ? ' - '.$eInfo['CGLcompliance_note'] : '')).'</td>
00831 </tr>
00832 ';
00833 }
00834 $c++;
00835 }
00836 }
00837
00838
00839 $out.='
00840 <h3>Registered extensions:</h3>
00841 <table border="1">'.$headerRow.implode('',$rows['reg']).'</table>';
00842
00843
00844 $extensionKeysCollect = array_unique($extensionKeysCollect);
00845 asort($extensionKeysCollect);
00846 $out.='<form action=""><textarea cols="80" rows="10">'.implode(chr(10),$extensionKeysCollect).'</textarea></form>';
00847
00848
00849 $out.='<br />
00850 <h3>User extensions:</h3>
00851 <table border="1">'.$headerRow.implode('',$rows['user']).'</table>';
00852 }
00853
00854
00855 if (is_array($this->extensionInfoArray['site'])) {
00856 $rows = array();
00857 foreach($this->extensionInfoArray['site'] as $k => $extensions) {
00858
00859
00860 $c = 0;
00861 foreach($extensions as $extKey => $eInfo) {
00862
00863
00864 if ($eInfo['_highlight']) {
00865 $bgCol = $eInfo['dirtype']=='link' ? ' bgcolor="#ffcccc"' : ' bgcolor="#eeeeee"';
00866 } else {
00867 $bgCol = ' style="color: #999999; font-style: italic;"';
00868 }
00869
00870
00871 $rows[] = '
00872 <tr>
00873 '.(!$c?'<td rowspan="'.count($extensions).'">'.htmlspecialchars($this->globalSiteInfo[$k]['siteInfo']['SA_PATH']).'</td>':'').'
00874 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($extKey).'</td>
00875 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['title']).'</td>
00876 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['version']).'</td>
00877 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['numberfiles']).'</td>
00878 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['mtime']?date('d-m-y H:i:s',$eInfo['mtime']):'').'</td>
00879 <td nowrap="nowrap"'.$bgCol.'>'.htmlspecialchars($eInfo['mtime_hash']).'</td>
00880 </tr>
00881 ';
00882 $c++;
00883 }
00884 }
00885 $out.='<br />
00886 <h3>Sites:</h3>
00887 <table border="1">'.implode('',$rows).'</table>';
00888 }
00889
00890
00891 return $out;
00892 }
00893
00902 function getExtensionInfo($path,$extKey,$k) {
00903 $file = $path.$extKey.'/ext_emconf.php';
00904 if (@is_file($file)) {
00905 $_EXTKEY = $extKey;
00906 $EM_CONF = array();
00907 include($file);
00908
00909 $eInfo = array();
00910
00911 $eInfo['title'] = $EM_CONF[$extKey]['title'];
00912 $eInfo['version'] = $EM_CONF[$extKey]['version'];
00913 $eInfo['CGLcompliance'] = $EM_CONF[$extKey]['CGLcompliance'];
00914 $eInfo['CGLcompliance_note'] = $EM_CONF[$extKey]['CGLcompliance_note'];
00915 $eInfo['TYPO3_version'] = $EM_CONF[$extKey]['TYPO3_version'];
00916 $filesHash = unserialize($EM_CONF[$extKey]['_md5_values_when_last_written']);
00917
00918 if (!is_array($filesHash) || count($filesHash)<500) {
00919
00920
00921 $extPath = $path.$extKey.'/';
00922 $fileArr = array();
00923 $fileArr = $this->removePrefixPathFromList($this->getAllFilesAndFoldersInPath($fileArr,$extPath),$extPath);
00924
00925 if (!is_array($fileArr)) {
00926 debug(array($fileArr,$extKey,$extPath,$this->getAllFilesAndFoldersInPath(array(),$extPath)),'ERROR');
00927 }
00928
00929
00930 $eInfo['numberfiles'] = count($fileArr);
00931 $eInfo['dirtype'] = filetype($path.$extKey);
00932
00933
00934 $eInfo['mtime_files'] = $this->findMostRecent($fileArr,$extPath);
00935 if (count($eInfo['mtime_files'])) $eInfo['mtime'] = max($eInfo['mtime_files']);
00936 $eInfo['mtime_hash'] = md5(implode(',',$eInfo['mtime_files']));
00937 } else {
00938 $eInfo['mtime_hash'] = 'No calculation done, too many files in extension: '.count($filesHash);
00939 }
00940
00941 $eInfo['manual'] = @is_file($path.$extKey.'/doc/manual.sxw');
00942
00943 return $eInfo;
00944 } else return 'ERROR: No emconf.php file: '.$file;
00945 }
00946
00956 function getAllFilesAndFoldersInPath($fileArr,$extPath,$extList='',$regDirs=0) {
00957 if ($regDirs) $fileArr[] = $extPath;
00958 $fileArr = array_merge($fileArr,t3lib_div::getFilesInDir($extPath,$extList,1,1));
00959
00960 $dirs = t3lib_div::get_dirs($extPath);
00961 if (is_array($dirs)) {
00962 foreach($dirs as $subdirs) {
00963 if ($subdirs && (strcmp($subdirs,'CVS') || !$this->noCVS)) {
00964 $fileArr = $this->getAllFilesAndFoldersInPath($fileArr,$extPath.$subdirs.'/',$extList,$regDirs);
00965 }
00966 }
00967 }
00968 return $fileArr;
00969 }
00970
00978 function findMostRecent($fileArr,$extPath) {
00979 $mtimeArray = array();
00980 foreach($fileArr as $fN) {
00981 if ($fN!='ext_emconf.php') {
00982 $mtime = filemtime($extPath.$fN);
00983 $mtimeArray[$fN] = $mtime;
00984 }
00985 }
00986 return $mtimeArray;
00987 }
00988
00996 function removePrefixPathFromList($fileArr,$extPath) {
00997 reset($fileArr);
00998 while(list($k,$absFileRef)=each($fileArr)) {
00999 if(t3lib_div::isFirstPartOfStr($absFileRef,$extPath)) {
01000 $fileArr[$k]=substr($absFileRef,strlen($extPath));
01001 } else return 'ERROR: One or more of the files was NOT prefixed with the prefix-path!';
01002 }
01003 return $fileArr;
01004 }
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01033 function singleSite($exp) {
01034 $all = $this->globalSiteInfo[$exp];
01035
01036
01037 $content = '
01038 <h2>'.htmlspecialchars($all['siteInfo']['sitename'].' (DB: '.$all['siteInfo']['TYPO3_db']).')</h2>
01039 <hr />
01040
01041 <h3>Main details:</h3>
01042
01043 LINKS: <a href="'.htmlspecialchars($all['siteInfo']['URL']).'" target="'.$this->targetWindow.'">Site</a> / <a href="'.htmlspecialchars($all['siteInfo']['ADMIN_URL']).'" target="'.$this->targetWindowAdmin.'">Admin</a> / <a href="'.htmlspecialchars($all['siteInfo']['INSTALL_URL']).'" target="'.$this->targetWindowInstall.'">Install</a>
01044 <br /><br />';
01045
01046
01047 $content.= t3lib_div::view_array($all);
01048
01049
01050 $content.= '
01051 <h3>Login-Log for last month:</h3>';
01052 $content.= $this->loginLog($all['siteInfo']['TYPO3_db']);
01053
01054
01055 return $content;
01056 }
01057
01064 function loginLog($DB) {
01065
01066
01067 $query = $GLOBALS['TYPO3_DB']->SELECTquery(
01068 'sys_log.*, be_users.username AS username, be_users.admin AS admin',
01069 'sys_log,be_users',
01070 'be_users.uid=sys_log.userid AND sys_log.type=255 AND sys_log.tstamp > '.(time()-(60*60*24*30)),
01071 '',
01072 'sys_log.tstamp DESC'
01073 );
01074 $res = mysql($DB,$query);
01075
01076 $dayRef = '';
01077 $lines = array();
01078
01079 while($row = mysql_fetch_assoc($res)) {
01080 $day = date('d-m-Y',$row['tstamp']);
01081 if ($dayRef!=$day) {
01082 $lines[] = '
01083 <h4>'.$day.':</h4>';
01084 $dayRef=$day;
01085 }
01086 $theLine = date('H:i',$row['tstamp']).': '.str_pad(substr($row['username'],0,10),10).' '.$this->log_getDetails($row['details'],unserialize($row['log_data']));
01087 $theLine = htmlspecialchars($theLine);
01088 $lines[]= $row['admin'] ? '<span class="redclass">'.$theLine.'</span>' : $theLine;
01089
01090
01091 }
01092 return '<pre>'.implode(chr(10),$lines).'</pre>';
01093 }
01094
01102 function log_getDetails($text,$data) {
01103
01104 if (is_array($data)) {
01105 return sprintf($text, $data[0],$data[1],$data[2],$data[3],$data[4]);
01106 } else return $text;
01107 }
01108
01109
01116 function rmCachedFiles($exp) {
01117 $all = $this->globalSiteInfo[$exp];
01118 $content = '
01119 <h2>'.htmlspecialchars($all['siteInfo']['sitename'].' (DB: '.$all['siteInfo']['TYPO3_db']).')</h2>
01120 <hr />
01121 <h3>typo3conf/temp_CACHED_* files:</h3>';
01122
01123 $path = $all['siteInfo']['SA_PATH'].'/typo3conf/';
01124 if (@is_dir($path)) {
01125 $filesInDir = t3lib_div::getFilesInDir($path,'php',1);
01126
01127 foreach($filesInDir as $kk => $vv) {
01128 if (t3lib_div::isFirstPartOfStr(basename($vv),'temp_CACHED_')) {
01129 if (strstr(basename($vv),'ext_localconf.php') || strstr(basename($vv),'ext_tables.php')) {
01130 $content.='REMOVED: '.$vv.'<br />';
01131 unlink($vv);
01132 if (file_exists($vv)) $content.= $this->error('ERROR: File still exists, so could not be removed anyways!').'<br />';
01133 }
01134 }
01135 }
01136 } else {
01137 $content.= $this->error('ERROR: '.$path.' was not a directory!');
01138 }
01139
01140 return $content;
01141 }
01142
01149 function menuContent($exp) {
01150 if ($exp) {
01151
01152
01153 $lines = array();
01154 $head = '';
01155
01156 foreach($this->globalSiteInfo as $k => $all) {
01157
01158
01159 if ($head!=$all['siteInfo']['MAIN_DIR']) {
01160 $lines[] = '
01161 <h4 style="white-space: nowrap;">'.htmlspecialchars(t3lib_div::fixed_lgd_pre($all['siteInfo']['MAIN_DIR'],18)).'</h4>';
01162 $head = $all['siteInfo']['MAIN_DIR'];
01163 }
01164
01165
01166 switch($exp) {
01167 case 'update':
01168
01169
01170 $label = $all['siteInfo']['sitename'] ? $all['siteInfo']['sitename'] : '(DB: '.$all['siteInfo']['TYPO3_db'].')';
01171 $lines[] = '
01172 <hr />
01173 <b>'.htmlspecialchars($label).'</b> ('.htmlspecialchars(substr($all['siteInfo']['SA_PATH'],strlen($all['siteInfo']['MAIN_DIR'])+1)).')<br />';
01174
01175
01176 $tempVal='&_someUniqueValue='.time();
01177
01178
01179 $url = $this->scriptName.'?type=page&show=rmTempCached&exp='.$k.$tempVal;
01180 $lines[] = '<span style="white-space: nowrap;"><a href="'.htmlspecialchars($url).'" target="TSApage">Remove temp_CACHED files</a></span>';
01181
01182 $url = $all['siteInfo']['INSTALL_URL'].'index.php?TYPO3_INSTALL[type]=database&TYPO3_INSTALL[database_type]=import|CURRENT_STATIC'."&presetWholeTable=1".$tempVal.'#bottom';
01183 $lines[] = '<span style="white-space: nowrap;"><a href="'.htmlspecialchars($url).'" target="TSApage">CURRENT_STATIC</a></span>';
01184
01185 $url = $all['siteInfo']['INSTALL_URL'].'index.php?TYPO3_INSTALL[type]=database&TYPO3_INSTALL[database_type]=cmpFile|CURRENT_TABLES'.$tempVal.'#bottom';
01186 $lines[] = '<span style="white-space: nowrap;"><a href="'.htmlspecialchars($url).'" target="TSApage">CURRENT_TABLES</a></span>';
01187
01188
01189 $url = $all['siteInfo']['INSTALL_URL'].'index.php?TYPO3_INSTALL[type]=database&TYPO3_INSTALL[database_type]=cache|'.
01190 "&PRESET[database_clearcache][cache_pages]=1".
01191 '&PRESET[database_clearcache][cache_pagesection]=1'.
01192 "&PRESET[database_clearcache][cache_hash]=1".
01193 $tempVal.
01194 '#bottom';
01195 $lines[] = '<span style="white-space: nowrap;"><a href="'.htmlspecialchars($url).'" target="TSApage">Clear cache</a></span>';
01196
01197
01198 $url = $all['siteInfo']['ADMIN_URL'].'index.php';
01199 $lines[] = '<span style="white-space: nowrap;"><a href="'.htmlspecialchars($url).'" target="'.$this->targetWindowAdmin.'">Admin -></a></span>';
01200 break;
01201 case 'info':
01202
01203 $label = $all['siteInfo']['sitename'] ? $all['siteInfo']['sitename'] : '(DB: '.$all['siteInfo']['TYPO3_db'].')';
01204
01205 $url = $this->scriptName.'?type=page&show=info&exp='.$k;
01206 $lines[] = '<span style="white-space: nowrap;"><a href="'.htmlspecialchars($url).'" target="TSApage">'.htmlspecialchars($label).'</a> ('.htmlspecialchars(substr($all['siteInfo']['SA_PATH'],strlen($all['siteInfo']['MAIN_DIR'])+1)).'/)</span>';
01207 break;
01208 }
01209 }
01210
01211
01212 return implode('<br />',$lines).'<br />';
01213 }
01214 }
01215
01221 function makeAdminLogin() {
01222
01223
01224 $lines = array();
01225 $head = '';
01226
01227
01228 foreach($this->globalSiteInfo as $k => $all) {
01229
01230
01231 if ($head!=$all['siteInfo']['MAIN_DIR']) {
01232 $lines[] = '
01233 <tr>
01234 <td colspan="2"><br />
01235 <h4>'.htmlspecialchars($all['siteInfo']['MAIN_DIR']).'</h4>
01236 </td>
01237 </tr>';
01238 $head = $all['siteInfo']['MAIN_DIR'];
01239 }
01240
01241
01242 $label = $all['siteInfo']['sitename'] ? $all['siteInfo']['sitename'] : '(DB: '.$all['siteInfo']['TYPO3_db'].')';
01243 $unique = md5(microtime());
01244
01245 $opts = array();
01246 $defUName = '';
01247
01248 if (is_array($all['siteInfo']['ADMINS'])) {
01249
01250 foreach($all['siteInfo']['ADMINS'] as $vArr) {
01251 $chalVal = md5($vArr['username'].':'.$vArr['password'].':'.$unique);
01252 $opts[] = '<option value="'.$chalVal.'">'.htmlspecialchars($vArr['username'].($vArr['disable']?' [DISABLED]':'')).'</option>';
01253 if (!$defUName) { $defUName = $vArr['username']; }
01254 }
01255 }
01256 if (count($opts)>1) {
01257 $userident = '
01258 <select name="userident" onchange="document[\''.$k.'\'].username.value=this.options[this.selectedIndex].text;">
01259 '.implode('
01260 ',$opts).'
01261 </select>
01262 ';
01263 } else {
01264 $userident = '
01265 ('.$defUName.')<br />
01266 <input type="hidden" name="userident" value="'.$chalVal.'" />';
01267 }
01268
01269 $form='
01270 <form name="'.$k.'" action="'.$all['siteInfo']['ADMIN_URL'].'index.php" target="EXTERnalWindow" method="post">
01271 <input type="submit" name="submit" value="Login" />
01272 <input type="hidden" name="username" value="'.$defUName.'" />
01273 <input type="hidden" name="challenge" value="'.$unique.'" />
01274 <input type="hidden" name="redirect_url" value="" />
01275 <input type="hidden" name="login_status" value="login" />
01276 '.trim($userident).'
01277 </form>';
01278
01279 $lines[] = '
01280 <tr>
01281 <td><strong>'.htmlspecialchars($label).'</strong></td>
01282 <td nowrap="nowrap">'.trim($form).'</td>
01283 </tr>';
01284 }
01285
01286
01287 return '<table border="1" cellpadding="5" cellspacing="1">'.implode('',$lines).'</table>';
01288 }
01289
01295 function changeAdminPasswordsForm() {
01296 $content='';
01297
01298 foreach($this->changeAdminPasswords as $k => $p) {
01299 $content.='
01300 <h3>'.$k.'</h3>';
01301
01302 foreach($p as $kk => $pp) {
01303 $content.= '<span style="white-space: nowrap;">';
01304 $content.= '<input type="checkbox" name="SETFIELDS[]" value="'.$pp.'" /> '.$pp.' - ';
01305 $content.= htmlspecialchars(implode(' - ',$this->collectAdminPasswords[$k][$kk]));
01306 $content.= '</span><br />';
01307 }
01308 }
01309
01310 $content.='New password: <input type="text" name="NEWPASS" /><br />';
01311 $content.='New password (md5): <input type="text" name="NEWPASS_md5" /><br />
01312 (This overrules any plain password above!)
01313 <br />';
01314 $content='
01315 <form action="'.htmlspecialchars($this->scriptName.'?type=page&show=admin').'" method="post">
01316 '.$content.'
01317 <input type="submit" name="Set" />
01318 </form>
01319 ';
01320
01321 return $content;
01322 }
01323
01330 function setNewPasswords() {
01331 $whichFields = t3lib_div::_POST('SETFIELDS');
01332 $pass = trim(t3lib_div::_POST('NEWPASS'));
01333 $passMD5 = t3lib_div::_POST('NEWPASS_md5');
01334
01335 $updatedFlag = 0;
01336 if (($pass || $passMD5) && is_array($whichFields)) {
01337 $pass = $passMD5 ? $passMD5 : md5($pass);
01338
01339 foreach($whichFields as $values) {
01340 $parts = explode(':',$values);
01341 if (count($parts)>2) {
01342 $key = $this->mapDBtoKey[$parts[0]];
01343 if ($key && isset($this->globalSiteInfo[$key]['siteInfo'])) {
01344 $error = $this->connectToDatabase($this->globalSiteInfo[$key]['siteInfo']);
01345 if (!$error) {
01346 $DB = $this->globalSiteInfo[$key]['siteInfo']['TYPO3_db'];
01347 $content.='<h3>Updating '.$DB.':</h3>';
01348
01349 $query = $GLOBALS['TYPO3_DB']->UPDATEquery(
01350 'be_users',
01351 'uid='.intval($parts[1]).' AND username="'.addslashes($parts[2]).'" AND admin!=0',
01352 array('password' => $pass)
01353 );
01354 mysql($DB,$query);
01355
01356 $content.= 'Affected rows: '.mysql_affected_rows().'<br /><hr />';
01357 $updatedFlag = '1';
01358 }
01359 }
01360 }
01361 }
01362 }
01363
01364 $this->initProcess();
01365 return $content;
01366 }
01367 }
01368
01369 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_superadmin.php']) {
01370 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_superadmin.php']);
01371 }
01372 ?>