+ * @package TYPO3
+ * @subpackage reports
+ */
+class tx_reports_reports_status_SystemStatus implements tx_reports_StatusProvider {
+
+ /**
+ * Determines the Install Tool's status, mainly concerning its protection.
+ *
+ * @see typo3/sysext/reports/interfaces/tx_reports_StatusProvider::getStatus()
+ */
+ public function getStatus() {
+ $statuses = array(
+ 'encryptionKeyEmpty' => $this->getEncryptionKeyStatus(),
+ 'fileDenyPattern' => $this->getFileDenyPatternStatus(),
+ 'htaccessUpload' => $this->getHtaccessUploadStatus(),
+ 'remainingUdates' => $this->getRemainingUpdatesStatus(),
+ 'emptyReferenceIndex' => $this->getReferenceIndexStatus()
+ );
+
+ if ($this->isMemcachedUsed()) {
+ $statuses['memcachedConnection'] = $this->getMemcachedConnectionStatus();
+ }
+
+ return $statuses;
+ }
+
+ /**
+ * Checks whether the encryption key is empty.
+ *
+ * @return tx_reports_reports_status_Status An tx_reports_reports_status_Status object representing whether the encryption key is empty or not
+ */
+ protected function getEncryptionKeyStatus() {
+ $value = $GLOBALS['LANG']->getLL('status_ok');
+ $message = '';
+ $severity = tx_reports_reports_status_Status::OK;
+
+ if (empty($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'])) {
+ $value = $GLOBALS['LANG']->getLL('status_insecure');
+ $severity = tx_reports_reports_status_Status::ERROR;
+
+ $url = 'install/index.php?redirect_url=index.php'
+ . urlencode('?TYPO3_INSTALL[type]=config#set_encryptionKey');
+
+ $message = sprintf(
+ $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:warning.install_encryption'),
+ '',
+ ''
+ );
+ }
+
+ return t3lib_div::makeInstance('tx_reports_reports_status_Status',
+ 'Encryption Key', $value, $message, $severity
+ );
+ }
+
+ /**
+ * Checks if fileDenyPattern was changed which is dangerous on Apache
+ *
+ * @return tx_reports_reports_status_Status An tx_reports_reports_status_Status object representing whether the file deny pattern has changed
+ */
+ protected function getFileDenyPatternStatus() {
+ $value = $GLOBALS['LANG']->getLL('status_ok');
+ $message = '';
+ $severity = tx_reports_reports_status_Status::OK;
+
+ if ($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'] != FILE_DENY_PATTERN_DEFAULT) {
+ $value = $GLOBALS['LANG']->getLL('status_insecure');
+ $severity = tx_reports_reports_status_Status::ERROR;
+
+ $url = 'install/index.php?redirect_url=index.php'
+ . urlencode('?TYPO3_INSTALL[type]=config#set_encryptionKey');
+
+ $message = sprintf(
+ $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:warning.file_deny_pattern'),
+ '
'
+ . htmlspecialchars(FILE_DENY_PATTERN_DEFAULT)
+ . '
'
+ );
+ }
+
+ return t3lib_div::makeInstance('tx_reports_reports_status_Status',
+ 'File Deny Pattern', $value, $message, $severity
+ );
+ }
+
+ /**
+ * Checks if fileDenyPattern allows to upload .htaccess files which is
+ * dangerous on Apache.
+ *
+ * @return tx_reports_reports_status_Status An tx_reports_reports_status_Status object representing whether it's possible to upload .htaccess files
+ */
+ protected function getHtaccessUploadStatus() {
+ $value = $GLOBALS['LANG']->getLL('status_ok');
+ $message = '';
+ $severity = tx_reports_reports_status_Status::OK;
+
+ if ($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'] != FILE_DENY_PATTERN_DEFAULT && t3lib_div::verifyFilenameAgainstDenyPattern('.htaccess')) {
+ $value = $GLOBALS['LANG']->getLL('status_insecure');
+ $severity = tx_reports_reports_status_Status::ERROR;
+ $message = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:warning.file_deny_htaccess');
+ }
+
+ return t3lib_div::makeInstance('tx_reports_reports_status_Status',
+ '.htaccess Upload Protection', $value, $message, $severity
+ );
+ }
+
+ /**
+ * Checks if there are still updates to perform
+ *
+ * @return tx_reports_reports_status_Status An tx_reports_reports_status_Status object representing whether the installation is not completely updated yet
+ */
+ protected function getRemainingUpdatesStatus() {
+ $value = $GLOBALS['LANG']->getLL('status_updateComplete');
+ $message = '';
+ $severity = tx_reports_reports_status_Status::OK;
+
+ if (!t3lib_div::compat_version(TYPO3_branch)) {
+ $value = $GLOBALS['LANG']->getLL('status_updateIncomplete');
+ $severity = tx_reports_reports_status_Status::WARNING;
+
+ $url = 'install/index.php?redirect_url=index.php'
+ . urlencode('?TYPO3_INSTALL[type]=update');
+ $message = sprintf(
+ $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:warning.install_update'),
+ '',
+ ''
+ );
+ }
+
+ return t3lib_div::makeInstance('tx_reports_reports_status_Status',
+ 'Remaining Updates', $value, $message, $severity
+ );
+ }
+
+ /**
+ * Checks if sys_refindex is empty.
+ *
+ * @return tx_reports_reports_status_Status An tx_reports_reports_status_Status object representing whether the reference index is empty or not
+ */
+ protected function getReferenceIndexStatus() {
+ $value = $GLOBALS['LANG']->getLL('status_ok');
+ $message = '';
+ $severity = tx_reports_reports_status_Status::OK;
+
+ $count = $GLOBALS['TYPO3_DB']->exec_SELECTcountRows('*', 'sys_refindex');
+
+ if (!$count) {
+ $value = $GLOBALS['LANG']->getLL('status_empty');
+ $severity = tx_reports_reports_status_Status::WARNING;
+
+ $url = 'sysext/lowlevel/dbint/index.php?&id=0&SET[function]=refindex';
+ $message = sprintf(
+ $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:warning.backend_reference'),
+ '',
+ ''
+ );
+ }
+
+ return t3lib_div::makeInstance('tx_reports_reports_status_Status',
+ 'Reference Index', $value, $message, $severity
+ );
+ }
+
+ /**
+ * Checks whether memcached is configured, if that's the case we asume it's also used.
+ *
+ * @return boolean True if memcached is used, false otherwise.
+ */
+ protected function isMemcachedUsed() {
+ $memcachedUsed = false;
+
+ $memcachedServers = $this->getConfiguredMemcachedServers();
+ if (count($memcachedServers)) {
+ $memcachedUsed = true;
+ }
+
+ return $memcachedUsed;
+ }
+
+ /**
+ * Gets the configured memcached server connections.
+ *
+ * @return array An array of configured memcached server connections.
+ */
+ protected function getConfiguredMemcachedServers() {
+ $memcachedServers = array();
+
+ if (is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'])) {
+ foreach ($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] as $table => $conf) {
+ if (is_array($conf)) {
+ foreach ($conf as $key => $value) {
+ if (!is_array($value) && $value === 't3lib_cache_backend_MemcachedBackend') {
+ $memcachedServers = $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$table]['options']['servers'];
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return $memcachedServers;
+ }
+
+ /**
+ * Checks whether TYPO3 can connect to the configured memcached servers.
+ *
+ * @return tx_reports_reports_status_Status An tx_reports_reports_status_Status object representing whether TYPO3 can connect to the configured memcached servers
+ */
+ protected function getMemcachedConnectionStatus() {
+ $value = $GLOBALS['LANG']->getLL('status_ok');
+ $message = '';
+ $severity = tx_reports_reports_status_Status::OK;
+
+ $failedConnections = array();
+ $defaultMemcachedPort = ini_get('memcache.default_port');
+ $memcachedServers = $this->getConfiguredMemcachedServers();
+
+ if (function_exists('memcache_connect') && is_array($memcachedServers)) {
+ foreach ($memcachedServers as $testServer) {
+ $configuredServer = $testServer;
+ if (substr($testServer, 0, 7) == 'unix://') {
+ $host = $testServer;
+ $port = 0;
+ } else {
+ if (substr($testServer, 0, 6) === 'tcp://') {
+ $testServer = substr($testServer, 6);
+ }
+ if (strstr($testServer, ':') !== FALSE) {
+ list($host, $port) = explode(':', $testServer, 2);
+ } else {
+ $host = $testServer;
+ $port = $defaultPort;
+ }
+ }
+ $memcachedConnection = @memcache_connect($host, $port);
+ if ($memcachedConnection != null) {
+ memcache_close($memcachedConnection);
+ } else {
+ $failedConnections[] = $configuredServer;
+ }
+ }
+ }
+
+ if (count($failedConnections)) {
+ $value = $GLOBALS['LANG']->getLL('status_connectionFailed');
+ $severity = tx_reports_reports_status_Status::WARNING;
+
+ $message = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:warning.memcache_not_usable')
+ . '
'
+ . '- '
+ . implode('
- ', $failedConnections)
+ . '
';
+ }
+
+ return t3lib_div::makeInstance('tx_reports_reports_status_Status',
+ 'Memcached Configuration', $value, $message, $severity
+ );
+ }
+}
+
+
+if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/reports/reports/status/class.tx_reports_reports_status_systemstatus.php']) {
+ include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/reports/reports/status/class.tx_reports_reports_status_systemstatus.php']);
+}
+
+?>
\ No newline at end of file
Index: typo3/sysext/reports/ext_autoload.php
===================================================================
--- typo3/sysext/reports/ext_autoload.php (revision 5980)
+++ typo3/sysext/reports/ext_autoload.php (working copy)
@@ -11,6 +11,7 @@
'tx_reports_module' => $extensionPath . 'mod/index.php',
'tx_reports_reports_status' => $extensionPath . 'reports/class.tx_reports_reports_status.php',
'tx_reports_reports_status_installtoolstatus' => $extensionPath . 'reports/status/class.tx_reports_reports_status_installtoolstatus.php',
+ 'tx_reports_reports_status_systemstatus' => $extensionPath . 'reports/status/class.tx_reports_reports_status_systemstatus.php',
'tx_reports_reports_status_status' => $extensionPath . 'reports/status/class.tx_reports_reports_status_status.php',
);
?>
Index: typo3/sysext/reports/ext_tables.php
===================================================================
--- typo3/sysext/reports/ext_tables.php (revision 5980)
+++ typo3/sysext/reports/ext_tables.php (working copy)
@@ -18,7 +18,9 @@
$statusReport
);
+ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']['tx_reports']['status']['system'] = 'tx_reports_reports_status_SystemStatus';
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']['tx_reports']['status']['_installtool'] = 'tx_reports_reports_status_InstallToolStatus';
+
}
?>
\ No newline at end of file