*/ /** * [CLASS/FUNCTION INDEX of SCRIPT] * * 119: function debug($p1,$p2='') * * * 133: class t3lib_superadmin * * SECTION: Initialize stuff * 179: function t3lib_superadmin() * 191: function init($parentDirs) * * SECTION: Main functions * 214: function defaultSet() * 270: function make() * * SECTION: Output preparation * 372: function setMenuItem($code,$label) * 386: function error($str) * 397: function headerParentDir($str) * 408: function headerSiteDir($str) * * SECTION: Collection information * 440: function initProcess() * 478: function processSiteDir($path,$dir) * 520: function includeLocalconf($localconf) * 544: function connectToDatabase($siteInfo) * 566: function getDBInfo($key) * * SECTION: Content: Installation Overview * 616: function makeTable() * * SECTION: Content: Local extensions * 719: function localExtensions() * 892: function getExtensionInfo($path,$extKey,$k) * 945: function getAllFilesAndFoldersInPath($fileArr,$extPath,$extList='',$regDirs=0) * 967: function findMostRecent($fileArr,$extPath) * 985: function removePrefixPathFromList($fileArr,$extPath) * * SECTION: Content: Other * 1022: function singleSite($exp) * 1053: function loginLog($DB) * 1091: function log_getDetails($text,$data) * 1105: function rmCachedFiles($exp) * 1138: function menuContent($exp) * 1210: function makeAdminLogin() * 1284: function changeAdminPasswordsForm() * 1319: function setNewPasswords() * * TOTAL FUNCTIONS: 28 * (This index is automatically created/updated by the extension "extdeveval") * */ // ******************************* // Set error reporting // ******************************* error_reporting (E_ALL ^ E_NOTICE); define('TYPO3_mainDir', 'typo3/'); // This is the directory of the backend administration for the sites of this TYPO3 installation. // Dependency: include_once('./typo3_src/t3lib/class.t3lib_div.php'); include_once('./typo3_src/t3lib/class.t3lib_db.php'); $TYPO3_DB = t3lib_div::makeInstance('t3lib_DB'); /** * Debug function. Substitute since no config_default.php file is included anywhere * * @param mixed Debug var * @param string Header string * @return void */ function debug($p1,$p2='') { t3lib_div::debug($p1,$p2); } /** * Super Admin class has functions for the administration of multiple TYPO3 sites in folders * NOTICE: Only compliant with single MySQL database usage per installation! * * @author Kasper Skaarhoj * @package TYPO3 * @subpackage t3lib */ class t3lib_superadmin { // External, static: var $targetWindow = 'superAdminWindow'; var $targetWindowAdmin = 'superAdminWindowAdmin'; var $targetWindowInstall = 'superAdminWindowInstall'; var $scriptName = 'superadmin.php'; // GP vars: var $show; // "menu", "all", "admin", "info", "rmTempCached", "localext" var $type; // "phpinfo", "page" - default renders a frameset var $exp; // Additional parameter, typically a md5-hash pointing to an installation of TYPO3 // Internal, static: var $parentDirs = array(); // Configured directories to search var $globalSiteInfo = array(); // Array with information about found TYPO3 installations var $currentUrl = ''; var $mapDBtoKey = array(); var $collectAdminPasswords = array(); var $changeAdminPasswords = array(); var $collectInstallPasswords = array(); // Control: var $full = 0; // If set, the full information array per site is printed. var $noCVS = 0; // See tools/em/index.php.... /********************************** * * Initialize stuff * **********************************/ /** * Constructor, setting GP vars * * @return void */ function t3lib_superadmin() { $this->show = t3lib_div::_GP('show'); $this->type = t3lib_div::_GP('type'); $this->exp = t3lib_div::_GP('exp'); } /** * Initialize with configuration - from the 'superadmin.php' script. See misc/superadmin.php for example. * * @param array Numerical array with arrays having two keys, 'dir' and 'url' where 'dir' is the absolute path to a directory with TYPO3 installations inside. * @return void */ function init($parentDirs) { $this->parentDirs = $parentDirs; } /************************** * * Main functions * **************************/ /** * Main function, creating HTML content; frameset, menu, content frames. * Outputs the full HTML to browser. * * @return void */ function defaultSet() { // Creating content based on "type" variable: switch($this->type) { case 'phpinfo': phpinfo(); break; case 'page': ?> TYPO3 Super Admin make(); ?> TYPO3 Super Admin initProcess(); // Output mode: switch($this->show) { case 'menu': $lines=array(); $lines[]=$this->setMenuItem('info','INFO'); $lines[]=$this->setMenuItem('update','UPDATE'); $lines[]=''; $lines[]='Default'; $lines[]='All details'; $lines[]='Admin logins'; $lines[]='phpinfo()'; $lines[]='Local extensions'; $lines[]=''; $content = implode('
',$lines); $content.= '
'; $content.=$this->menuContent($this->exp); return '

TYPO3
Super Admin

'.$content; break; case 'all': return '

All details:

Overview:

'.$this->makeTable().'


Details per site:

'.$content; break; case 'admin': $content = $this->setNewPasswords(); $this->makeTable(); return $content.'

Admin options:

Admin logins:

'.$this->makeAdminLogin().'


TBE Admin Passwords:

'.t3lib_div::view_array($this->collectAdminPasswords).'


Install Tool Passwords:

'.t3lib_div::view_array($this->collectInstallPasswords).'


Change TBE Admin Passwords:

'.$this->changeAdminPasswordsForm().'


'; break; case 'info': return '

Single site details

'.$this->singleSite($this->exp). '
'; break; case 'rmTempCached': return '

Removing temp_CACHED_*.php files

'.$this->rmCachedFiles($this->exp). '
'; break; case 'localext': return '

Local Extensions Found:

'.$this->localExtensions(). '
'; break; default: return '

Default info:

'. $content; break; } } /******************************** * * Output preparation * *******************************/ /** * Creates menu item from input. * * @param string Value for "&exp" parameter * @param string The label * @return string Wrapped value */ function setMenuItem($code,$label) { $out = ''.htmlspecialchars($label).''; if ($code==$this->exp) { $out = '>>'.$out; } return $out; } /** * Wrap string in red span tag (for errors) * * @param string Input string * @return string Output string */ function error($str) { $out = ''.htmlspecialchars($str).''; return $out; } /** * Wraps input string in

* * @param string Input string * @return string Output string, wrapped in

*/ function headerParentDir($str) { $out = '

'.htmlspecialchars($str).'

'; return $out; } /** * Wraps input string in

* * @param string Input string * @return string Output string, wrapped in

*/ function headerSiteDir($str) { $out = '

'.htmlspecialchars($str).'

'; return $out; } /******************************** * * Collection information * *******************************/ /** * Traverses the parent dirs, collecting the list of TYPO3 installations into $this->globalSiteInfo * * @return string HTML content (The default view seen when starting the superadmin.php script) */ function initProcess() { $content = ''; foreach($this->parentDirs as $k => $v) { $dir = ereg_replace('/$','',$v['dir']); $baseUrl=ereg_replace('/$','',$v['url']); $content.='


'; $content.=$this->headerParentDir($dir); if (@is_dir($dir)) { $in_dirs = t3lib_div::get_dirs($dir); asort($in_dirs); reset($in_dirs); $dirArr=array(); while(list($k,$v)=each($in_dirs)) { if (substr($v,0,9)!='typo3_src') { $this->currentUrl = $baseUrl.'/'.$v; $content.= $this->headerSiteDir($v); $content.= $this->processSiteDir($dir.'/'.$v,$dir); } } } else { $content.=$this->error('"'.$dir.'" was not a directory!'); } } return $content; } /** * Creating information array for a specific TYPO3 installation * Information about site is stored in ->globalSiteInfo array * * @param string Absolute path to installation (PATH_site) * @param string Directory of main directory (level under PATH_site) * @return string HTML content with information about the site. * @access private * @see initProcess() */ function processSiteDir($path,$dir) { if (@is_dir($path)) { $localconf = $path.'/typo3conf/localconf.php'; if (@is_file($localconf)) { $key = md5($localconf); $this->includeLocalconf($localconf); $this->mapDBtoKey[$this->globalSiteInfo[$key]['siteInfo']['TYPO3_db']] = $key; $this->globalSiteInfo[$key]['siteInfo']['MAIN_DIR'] = $dir; $this->globalSiteInfo[$key]['siteInfo']['SA_PATH'] = $path; $this->globalSiteInfo[$key]['siteInfo']['URL'] = $this->currentUrl.'/'; $this->globalSiteInfo[$key]['siteInfo']['ADMIN_URL'] = $this->currentUrl.'/'.TYPO3_mainDir; $this->globalSiteInfo[$key]['siteInfo']['INSTALL_URL'] = $this->currentUrl.'/'.TYPO3_mainDir.'install/'; // Connect to database: $conMsg = $this->connectToDatabase($this->globalSiteInfo[$key]['siteInfo']); if (!$conMsg) { $this->getDBInfo($key); $out.=''; } else { $out = $conMsg; } // Show details: if ($this->full) { $out.=t3lib_div::view_array($this->globalSiteInfo[$key]); } else { $out.=t3lib_div::view_array($this->globalSiteInfo[$key]['siteInfo']); } } else $out = $this->error($localconf.' is not a file!'); } else $out = $this->error($path.' is not a directory!'); return $out; } /** * Includes "localconf" of a TYPO3 installation an loads $this->globalSiteInfo with this information. * * @param string Absolute path to localconf.php file to include. * @return array Array with information about the site. * @access private * @see processSiteDir() */ function includeLocalconf($localconf) { include($localconf); $siteInfo=array(); $siteInfo['sitename'] = $TYPO3_CONF_VARS['SYS']['sitename']; $siteInfo['TYPO3_db'] = $typo_db; $siteInfo['TYPO3_db_username'] = $typo_db_username; $siteInfo['TYPO3_db_password'] = $typo_db_password; $siteInfo['TYPO3_db_host'] = $typo_db_host; $siteInfo['installToolPassword'] = $TYPO3_CONF_VARS['BE']['installToolPassword']; $siteInfo['warningEmailAddress'] = $TYPO3_CONF_VARS['BE']['warning_email_addr']; $siteInfo['warningMode'] = $TYPO3_CONF_VARS['BE']['warning_mode']; $this->globalSiteInfo[md5($localconf)] = array('siteInfo'=>$siteInfo,'TYPO3_CONF_VARS'=>$TYPO3_CONF_VARS); return $siteInfo; } /** * Connects to a MySQL database with the TYPO3 db host/username/password and database as found in the localconf.php file! * This is NOT compatible with DBAL and connection will obviously just fail with an error message if it turns out that the _DEFAULT handler of a site is not in a MySQL database * * @param array $siteInfo array, containing username/password/host/database values. * @return string Array message if any */ function connectToDatabase($siteInfo) { if (@mysql_pconnect($siteInfo['TYPO3_db_host'], $siteInfo['TYPO3_db_username'], $siteInfo['TYPO3_db_password'])) { if (!$siteInfo['TYPO3_db']) { return $this->error('No database selected'); } elseif (!mysql_select_db($siteInfo['TYPO3_db'])) { return $this->error('Cannot connect to the current database, "'.$siteInfo['TYPO3_db'].'"'); } } else { return $this->error('The current username, password or host was not accepted when the connection to the database was attempted to be established!'); } } /** * Get database information, assuming standard tables like "be_users" * Adding the information to ->globalSiteInfo * * @param string Key for site in ->globalSiteInfo * @return void * @access private * @see processSiteDir() */ function getDBInfo($key) { $DB = $this->globalSiteInfo[$key]['siteInfo']['TYPO3_db']; // Non-admin users $query = $GLOBALS['TYPO3_DB']->SELECTquery('count(*)', 'be_users', 'admin=0 AND NOT deleted'); $res = mysql($DB, $query); $row = mysql_fetch_row($res); $this->globalSiteInfo[$key]['siteInfo']['BE_USERS_NONADMIN'] = $row[0]; // Admin users $query = $GLOBALS['TYPO3_DB']->SELECTquery('count(*)', 'be_users', 'admin!=0 AND NOT deleted'); $res = mysql($DB, $query); $row = mysql_fetch_row($res); $this->globalSiteInfo[$key]['siteInfo']['BE_USERS_ADMIN'] = $row[0]; // Select Admin users $query = $GLOBALS['TYPO3_DB']->SELECTquery('uid,username,password,email,realName,disable', 'be_users', 'admin!=0 AND NOT deleted'); $res = mysql($DB, $query); while($row = mysql_fetch_assoc($res)) { $this->globalSiteInfo[$key]['siteInfo']['ADMINS'][] = $row; } } /****************************** * * Content: Installation Overview * ******************************/ /** * Creates big table with information about all installations in ->globalSiteInfo * * @return string HTML table */ function makeTable() { // Header row $info = array(); $info[] = 'Site:'; $info[] = 'Path:'; $info[] = 'Database:'; $info[] = 'Username'; $info[] = 'Password'; $info[] = 'Host'; $info[] = 'Links (new win)'; $info[] = '#Users NA/A'; $info[] = 'Admin be_users Info'; $info[] = 'Install Tool Password'; $info[] = 'Warning email address'; $info[] = 'W.mode'; $mainArrRows[] = ' '.implode(' ',$info).' '; // Traverse globalSiteInfo for each site: foreach($this->globalSiteInfo as $k => $all) { $info = array(); // Sitename and Database details: $info[] = htmlspecialchars($all['siteInfo']['sitename']); $info[] = ''.htmlspecialchars($all['siteInfo']['MAIN_DIR']).''.htmlspecialchars(substr($all['siteInfo']['SA_PATH'],strlen($all['siteInfo']['MAIN_DIR']))); $info[] = htmlspecialchars($all['siteInfo']['TYPO3_db']); $info[] = htmlspecialchars($all['siteInfo']['TYPO3_db_username']); $info[] = htmlspecialchars($all['siteInfo']['TYPO3_db_password']); $info[] = htmlspecialchars($all['siteInfo']['TYPO3_db_host']); // URL $info[] = 'Site'. ' / Admin'. ' / Install'; $info[] = htmlspecialchars($all['siteInfo']['BE_USERS_NONADMIN'].'/'.$all['siteInfo']['BE_USERS_ADMIN']); // Admin if (is_array($all['siteInfo']['ADMINS'])) { $lines = array(); foreach($all['siteInfo']['ADMINS'] as $vArr) { $lines[] = htmlspecialchars($vArr['password'].' - '.$vArr['username'].' ('.$vArr['realName'].', '.$vArr['email'].')'); $this->collectAdminPasswords[$vArr['password']][] = array( 'path' => $all['siteInfo']['SA_PATH'], 'site' => $all['siteInfo']['sitename'], 'database' => $all['siteInfo']['TYPO3_db'], 'user' => $vArr['username'], 'name_email' => $vArr['realName'].', '.$vArr['email'] ); $this->changeAdminPasswords[$vArr['password']][] = $all['siteInfo']['TYPO3_db'].':'.$vArr['uid'].':'.$vArr['username']; } $info[] = implode('
',$lines); } else { $info[] = $this->error('No DB connection!'); } // Install $info[] = htmlspecialchars($all['siteInfo']['installToolPassword']); $this->collectInstallPasswords[$all['siteInfo']['installToolPassword']][] = $all['siteInfo']['SA_PATH'].' - '.$all['siteInfo']['sitename'].' - ('.$all['siteInfo']['TYPO3_db'].')'; $info[] = htmlspecialchars($all['siteInfo']['warningEmailAddress']); $info[] = htmlspecialchars($all['siteInfo']['warningMode']); // compile $mainArrRows[] = ' '.implode(' ',$info).' '; } // Compile / return table finally: $table = ''.implode('',$mainArrRows).'
'; return $table; } /****************************** * * Content: Local extensions * ******************************/ /** * Based on the globalSiteInfo array, this prints information about local extensions for each site. * In particular version number and most recent mod-time is interesting! * * @return string HTML */ function localExtensions() { $this->extensionInfoArray=array(); // Traverse $this->globalSiteInfo for local extensions: foreach($this->globalSiteInfo as $k => $all) { if ($all['siteInfo']['SA_PATH']) { $extDir = $all['siteInfo']['SA_PATH'].'/typo3conf/ext/'; if (@is_dir($extDir)) { $this->extensionInfoArray['site'][$k] = array(); // Get extensions in local directory $extensions=t3lib_div::get_dirs($extDir); if (is_array($extensions)) { foreach($extensions as $extKey) { // Getting and setting information for extension: $eInfo = $this->getExtensionInfo($extDir,$extKey,$k); $this->extensionInfoArray['site'][$k][$extKey] = $eInfo; $this->extensionInfoArray['ext'][$extKey][$k] = $eInfo; } } } } } // Display results: $out=''; $headerRow = ' Extension key Path Title Ver. Files M Last mod. time Hash off all file mod. times: TYPO3 ver. req. CGL compliance '; // PER EXTENSION: if (is_array($this->extensionInfoArray['ext'])) { $extensionKeysCollect=array(); ksort($this->extensionInfoArray['ext']); reset($this->extensionInfoArray['ext']); $rows=array( 'reg'=>array(), 'user'=>array() ); foreach($this->extensionInfoArray['ext'] as $extKey => $instances) { $mtimes = array(); // Find most recent mtime of the options: reset($instances); while(list($k,$eInfo)=each($instances)) { $mtimes[] = $eInfo['mtime']; } // Max mtime: $maxMtime = max($mtimes); $c = 0; // So, traverse all sites with the extension present: foreach($instances as $k => $eInfo) { // Set background color if mtime matches if ($maxMtime==$eInfo['mtime']) { $this->extensionInfoArray['site'][$k][$extKey]['_highlight']=1; $bgCol = $eInfo['dirtype']=='link' ? ' bgcolor="#ffcccc"' : ' bgcolor="#eeeeee"'; } else { $bgCol = ' style="color: #999999; font-style: italic;"'; } // Make row: $type = substr($extKey,0,5)!='user_' ? 'reg' : 'user'; if ($type=='reg') $extensionKeysCollect[] = $extKey; if (!is_array($eInfo)) { // Standard listing: $rows[$type][] = ' '.(!$c?''.htmlspecialchars($extKey).'':'').' '.htmlspecialchars($this->globalSiteInfo[$k]['siteInfo']['SA_PATH']).' '.htmlspecialchars($eInfo).' '; } else { // Standard listing: $rows[$type][] = ' '.(!$c?''.htmlspecialchars($extKey).'':'').' '.htmlspecialchars($this->globalSiteInfo[$k]['siteInfo']['SA_PATH']).' '.htmlspecialchars($eInfo['title']).' '.htmlspecialchars($eInfo['version']).' '.htmlspecialchars($eInfo['numberfiles']).' '.htmlspecialchars($eInfo['manual']?'M':'-').' '.htmlspecialchars($eInfo['mtime']?date('d-m-y H:i:s',$eInfo['mtime']):'').' '.htmlspecialchars($eInfo['mtime_hash']).' '.htmlspecialchars($eInfo['TYPO3_version']).'
'.htmlspecialchars($eInfo['CGLcompliance'].($eInfo['CGLcompliance_note'] ? ' - '.$eInfo['CGLcompliance_note'] : '')).' '; } $c++; } } // Extensions with registered extension keys: $out.='

Registered extensions:

'.$headerRow.implode('',$rows['reg']).'
'; // List of those extension keys in a form field: $extensionKeysCollect = array_unique($extensionKeysCollect); asort($extensionKeysCollect); $out.='
'; // USER extension (prefixed "user_") $out.='

User extensions:

'.$headerRow.implode('',$rows['user']).'
'; } // PER SITE: if (is_array($this->extensionInfoArray['site'])) { $rows = array(); foreach($this->extensionInfoArray['site'] as $k => $extensions) { // So, traverse all sites with the extension present: $c = 0; foreach($extensions as $extKey => $eInfo) { // Set background color if mtime matches if ($eInfo['_highlight']) { $bgCol = $eInfo['dirtype']=='link' ? ' bgcolor="#ffcccc"' : ' bgcolor="#eeeeee"'; } else { $bgCol = ' style="color: #999999; font-style: italic;"'; } // Make row: $rows[] = ' '.(!$c?''.htmlspecialchars($this->globalSiteInfo[$k]['siteInfo']['SA_PATH']).'':'').' '.htmlspecialchars($extKey).' '.htmlspecialchars($eInfo['title']).' '.htmlspecialchars($eInfo['version']).' '.htmlspecialchars($eInfo['numberfiles']).' '.htmlspecialchars($eInfo['mtime']?date('d-m-y H:i:s',$eInfo['mtime']):'').' '.htmlspecialchars($eInfo['mtime_hash']).' '; $c++; } } $out.='

Sites:

'.implode('',$rows).'
'; } // Return content return $out; } /** * Gets information for an extension, eg. version and most-recently-edited-script * * @param string Path to local extension folder * @param string Extension key * @param string Key to globalSiteInformation array * @return array Information array (unless an error occured) */ function getExtensionInfo($path,$extKey,$k) { $file = $path.$extKey.'/ext_emconf.php'; if (@is_file($file)) { $_EXTKEY = $extKey; include($file); $eInfo = array(); // Info from emconf: $eInfo['title'] = $EM_CONF[$extKey]['title']; $eInfo['version'] = $EM_CONF[$extKey]['version']; $eInfo['CGLcompliance'] = $EM_CONF[$extKey]['CGLcompliance']; $eInfo['CGLcompliance_note'] = $EM_CONF[$extKey]['CGLcompliance_note']; $eInfo['TYPO3_version'] = $EM_CONF[$extKey]['TYPO3_version']; $filesHash = unserialize($EM_CONF[$extKey]['_md5_values_when_last_written']); if (!is_array($filesHash) || count($filesHash)<500) { // Get all files list (may take LOONG time): $extPath = $path.$extKey.'/'; $fileArr = array(); $fileArr = $this->removePrefixPathFromList($this->getAllFilesAndFoldersInPath($fileArr,$extPath),$extPath); if (!is_array($fileArr)) { debug(array($fileArr,$extKey,$extPath,$this->getAllFilesAndFoldersInPath(array(),$extPath)),'ERROR'); } // Number of files: $eInfo['numberfiles'] = count($fileArr); $eInfo['dirtype'] = filetype($path.$extKey); // Most recent modification: $eInfo['mtime_files'] = $this->findMostRecent($fileArr,$extPath); if (count($eInfo['mtime_files'])) $eInfo['mtime'] = max($eInfo['mtime_files']); $eInfo['mtime_hash'] = md5(implode(',',$eInfo['mtime_files'])); } else { $eInfo['mtime_hash'] = 'No calculation done, too many files in extension: '.count($filesHash); } $eInfo['manual'] = @is_file($path.$extKey.'/doc/manual.sxw'); return $eInfo; } else return 'ERROR: No emconf.php file: '.$file; } /** * Recursively gather all files and folders of extension path. * * @param array Array of files to which new files are added * @param string Path to look up files in * @param string List of file extensions to include. Blank = all * @param boolean If set, directories are included as well. * @return array $fileArr with new entries added. */ function getAllFilesAndFoldersInPath($fileArr,$extPath,$extList='',$regDirs=0) { if ($regDirs) $fileArr[] = $extPath; $fileArr = array_merge($fileArr,t3lib_div::getFilesInDir($extPath,$extList,1,1)); $dirs = t3lib_div::get_dirs($extPath); if (is_array($dirs)) { foreach($dirs as $subdirs) { if ($subdirs && (strcmp($subdirs,'CVS') || !$this->noCVS)) { $fileArr = $this->getAllFilesAndFoldersInPath($fileArr,$extPath.$subdirs.'/',$extList,$regDirs); } } } return $fileArr; } /** * Creates an array with modification times of all files in $fileArr * * @param array Files in extension (rel path) * @param string Abs path prefix for files. * @return array Array with modification times of files (filenames are keys) */ function findMostRecent($fileArr,$extPath) { $mtimeArray = array(); foreach($fileArr as $fN) { if ($fN!='ext_emconf.php') { $mtime = filemtime($extPath.$fN); $mtimeArray[$fN] = $mtime; } } return $mtimeArray; } /** * Removes the absolute part of all files/folders in fileArr * * @param array File array * @param string Prefix to remove * @return array Modified file array (or error string) */ function removePrefixPathFromList($fileArr,$extPath) { reset($fileArr); while(list($k,$absFileRef)=each($fileArr)) { if(t3lib_div::isFirstPartOfStr($absFileRef,$extPath)) { $fileArr[$k]=substr($absFileRef,strlen($extPath)); } else return 'ERROR: One or more of the files was NOT prefixed with the prefix-path!'; } return $fileArr; } /****************************** * * Content: Other * ******************************/ /** * Shows detailed information for a single installation of TYPO3 * * @param string KEY pointing to installation * @return string HTML content */ function singleSite($exp) { $all = $this->globalSiteInfo[$exp]; // General information: $content = '

'.htmlspecialchars($all['siteInfo']['sitename'].' (DB: '.$all['siteInfo']['TYPO3_db']).')


Main details:

LINKS: Site / Admin / Install

'; // Add all information in globalSiteInfo array: $content.= t3lib_div::view_array($all); // Last-login: $content.= '

Login-Log for last month:

'; $content.= $this->loginLog($all['siteInfo']['TYPO3_db']); // Return content return $content; } /** * Get last-login log for database. * * @param string Database * @return string HTML */ function loginLog($DB) { // Non-admin users //1=login, 2=logout, 3=failed login (+ errorcode 3), 4=failure_warning_email sent $query = $GLOBALS['TYPO3_DB']->SELECTquery( 'sys_log.*, be_users.username AS username, be_users.admin AS admin', 'sys_log,be_users', 'be_users.uid=sys_log.userid AND sys_log.type=255 AND sys_log.tstamp > '.(time()-(60*60*24*30)), '', 'sys_log.tstamp DESC' ); $res = mysql($DB,$query); $dayRef = ''; $lines = array(); while($row = mysql_fetch_assoc($res)) { $day = date('d-m-Y',$row['tstamp']); if ($dayRef!=$day) { $lines[] = '

'.$day.':

'; $dayRef=$day; } $theLine = date('H:i',$row['tstamp']).': '.str_pad(substr($row['username'],0,10),10).' '.$this->log_getDetails($row['details'],unserialize($row['log_data'])); $theLine = htmlspecialchars($theLine); $lines[]= $row['admin'] ? ''.$theLine.'' : $theLine; // debug($row); } return '
'.implode(chr(10),$lines).'
'; } /** * Compile log details into template string * * @param string Log message (template) * @param array Data array to insert in log message * @return string Log details. */ function log_getDetails($text,$data) { // $code is used later on to substitute errormessages with language-corrected values... if (is_array($data)) { return sprintf($text, $data[0],$data[1],$data[2],$data[3],$data[4]); } else return $text; } /** * Removing temp_CACHED files for installation * * @param string KEY pointing to installation * @return string HTML content */ function rmCachedFiles($exp) { $all = $this->globalSiteInfo[$exp]; $content = '

'.htmlspecialchars($all['siteInfo']['sitename'].' (DB: '.$all['siteInfo']['TYPO3_db']).')


typo3conf/temp_CACHED_* files:

'; $path = $all['siteInfo']['SA_PATH'].'/typo3conf/'; if (@is_dir($path)) { $filesInDir = t3lib_div::getFilesInDir($path,'php',1); foreach($filesInDir as $kk => $vv) { if (t3lib_div::isFirstPartOfStr(basename($vv),'temp_CACHED_')) { if (strstr(basename($vv),'ext_localconf.php') || strstr(basename($vv),'ext_tables.php')) { $content.='REMOVED: '.$vv.'
'; unlink($vv); if (file_exists($vv)) $content.= $this->error('ERROR: File still exists, so could not be removed anyways!').'
'; } } } } else { $content.= $this->error('ERROR: '.$path.' was not a directory!'); } return $content; } /** * Menu for either update/information, showing links for each installation found * * @param string Action key "update" or "info" * @return string HTML output. */ function menuContent($exp) { if ($exp) { // Initialize: $lines = array(); $head = ''; foreach($this->globalSiteInfo as $k => $all) { // Setting section header, if needed. if ($head!=$all['siteInfo']['MAIN_DIR']) { $lines[] = '

'.htmlspecialchars(t3lib_div::fixed_lgd_pre($all['siteInfo']['MAIN_DIR'],18)).'

'; $head = $all['siteInfo']['MAIN_DIR']; // Set new head... } // Display mode: switch($exp) { case 'update': // Label: $label = $all['siteInfo']['sitename'] ? $all['siteInfo']['sitename'] : '(DB: '.$all['siteInfo']['TYPO3_db'].')'; $lines[] = '
'.htmlspecialchars($label).' ('.htmlspecialchars(substr($all['siteInfo']['SA_PATH'],strlen($all['siteInfo']['MAIN_DIR'])+1)).')
'; // To avoid "visited links" display on next hit: $tempVal='&_someUniqueValue='.time(); // Add links for update: $url = $this->scriptName.'?type=page&show=rmTempCached&exp='.$k.$tempVal; $lines[] = 'Remove temp_CACHED files'; $url = $all['siteInfo']['INSTALL_URL'].'index.php?TYPO3_INSTALL[type]=database&TYPO3_INSTALL[database_type]=import|CURRENT_STATIC'."&presetWholeTable=1".$tempVal.'#bottom'; $lines[] = 'CURRENT_STATIC'; $url = $all['siteInfo']['INSTALL_URL'].'index.php?TYPO3_INSTALL[type]=database&TYPO3_INSTALL[database_type]=cmpFile|CURRENT_TABLES'.$tempVal.'#bottom'; $lines[] = 'CURRENT_TABLES'; // Cache $url = $all['siteInfo']['INSTALL_URL'].'index.php?TYPO3_INSTALL[type]=database&TYPO3_INSTALL[database_type]=cache|'. "&PRESET[database_clearcache][cache_pages]=1". '&PRESET[database_clearcache][cache_pagesection]=1'. "&PRESET[database_clearcache][cache_hash]=1". $tempVal. '#bottom'; $lines[] = 'Clear cache'; // Admin link $url = $all['siteInfo']['ADMIN_URL'].'index.php'; $lines[] = 'Admin ->'; break; case 'info': // item $label = $all['siteInfo']['sitename'] ? $all['siteInfo']['sitename'] : '(DB: '.$all['siteInfo']['TYPO3_db'].')'; $url = $this->scriptName.'?type=page&show=info&exp='.$k; $lines[] = ''.htmlspecialchars($label).' ('.htmlspecialchars(substr($all['siteInfo']['SA_PATH'],strlen($all['siteInfo']['MAIN_DIR'])+1)).'/)'; break; } } // Return result. return implode('
',$lines).'
'; } } /** * Create list of admin logins. * * @return string HTML table */ function makeAdminLogin() { // Initialize: $lines = array(); $head = ''; // Traverse installations found: foreach($this->globalSiteInfo as $k => $all) { // Setting section header, if needed. if ($head!=$all['siteInfo']['MAIN_DIR']) { $lines[] = '

'.htmlspecialchars($all['siteInfo']['MAIN_DIR']).'

'; $head = $all['siteInfo']['MAIN_DIR']; } // item $label = $all['siteInfo']['sitename'] ? $all['siteInfo']['sitename'] : '(DB: '.$all['siteInfo']['TYPO3_db'].')'; $unique = md5(microtime()); $opts = array(); $defUName = ''; if (is_array($all['siteInfo']['ADMINS'])) { foreach($all['siteInfo']['ADMINS'] as $vArr) { $chalVal = md5($vArr['username'].':'.$vArr['password'].':'.$unique); $opts[] = ''; if (!$defUName) { $defUName = $vArr['username']; } } } if (count($opts)>1) { $userident = ' '; } else { $userident = ' ('.$defUName.')
'; } $form='
'.trim($userident).'
'; $lines[] = ' '.htmlspecialchars($label).' '.trim($form).' '; } // Return login table: return ''.implode('',$lines).'
'; } /** * For for changing admin passwords * * @return string Form content. */ function changeAdminPasswordsForm() { $content=''; foreach($this->changeAdminPasswords as $k => $p) { $content.='

'.$k.'

'; foreach($p as $kk => $pp) { $content.= ''; $content.= ' '.$pp.' - '; $content.= htmlspecialchars(implode(' - ',$this->collectAdminPasswords[$k][$kk])); $content.= '
'; } } $content.='New password:
'; $content.='New password (md5):
(This overrules any plain password above!)
'; $content='
'.$content.'
'; return $content; } /** * Setting new passwords * * @return string Status * @see changeAdminPasswordsForm() */ function setNewPasswords() { $whichFields = t3lib_div::_POST('SETFIELDS'); $pass = trim(t3lib_div::_POST('NEWPASS')); $passMD5 = t3lib_div::_POST('NEWPASS_md5'); $updatedFlag = 0; if (($pass || $passMD5) && is_array($whichFields)) { $pass = $passMD5 ? $passMD5 : md5($pass); foreach($whichFields as $values) { $parts = explode(':',$values); if (count($parts)>2) { $key = $this->mapDBtoKey[$parts[0]]; if ($key && isset($this->globalSiteInfo[$key]['siteInfo'])) { $error = $this->connectToDatabase($this->globalSiteInfo[$key]['siteInfo']); if (!$error) { $DB = $this->globalSiteInfo[$key]['siteInfo']['TYPO3_db']; $content.='

Updating '.$DB.':

'; $query = $GLOBALS['TYPO3_DB']->UPDATEquery( 'be_users', 'uid='.intval($parts[1]).' AND username="'.addslashes($parts[2]).'" AND admin!=0', array('password' => $pass) ); // username/admin are added to security. But they are certainly redundant!! mysql($DB,$query); $content.= 'Affected rows: '.mysql_affected_rows().'

'; $updatedFlag = '1'; } } } } } $this->initProcess(); return $content; } } if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_superadmin.php']) { include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_superadmin.php']); } ?>