diff options
Diffstat (limited to 'install/ElggRewriteTester.php')
-rw-r--r-- | install/ElggRewriteTester.php | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/install/ElggRewriteTester.php b/install/ElggRewriteTester.php new file mode 100644 index 000000000..ab68da2b7 --- /dev/null +++ b/install/ElggRewriteTester.php @@ -0,0 +1,199 @@ +<?php + +/** + * Elgg RewriteTester. + * Test if URL rewriting is working. + * + * @package Elgg.Core + * @subpackage Installer + */ +class ElggRewriteTester { + protected $webserver; + protected $serverSupportsRemoteRead; + protected $rewriteTestPassed; + protected $htaccessIssue; + + /** + * Set the webserver as unknown. + */ + public function __construct() { + $this->webserver = 'unknown'; + } + + /** + * Run the rewrite test and return a status array + * + * @param string $url URL of rewrite test + * @param string $path Root directory of Elgg with trailing slash + * + * @return array + */ + public function run($url, $path) { + + $this->webserver = ElggRewriteTester::guessWebServer(); + + $this->rewriteTestPassed = $this->runRewriteTest($url); + + if ($this->rewriteTestPassed == FALSE) { + if ($this->webserver == 'apache' || $this->webserver == 'unknown') { + if ($this->createHtaccess($path)) { + $this->rewriteTestPassed = $this->runRewriteTest($url); + } + } + } + + return $this->returnStatus($url); + } + + /** + * Guess the web server from $_SERVER['SERVER_SOFTWARE'] + * + * @return string + */ + public static function guessWebServer() { + $serverString = strtolower($_SERVER['SERVER_SOFTWARE']); + $possibleServers = array('apache', 'nginx', 'lighttpd', 'iis'); + foreach ($possibleServers as $server) { + if (strpos($serverString, $server) !== FALSE) { + return $server; + } + } + return 'unknown'; + } + + /** + * Hit the rewrite test URL to determine if the rewrite rules are working + * + * @param string $url Rewrite test URL + * + * @return bool + */ + protected function runRewriteTest($url) { + + $this->serverSupportsRemoteRead = TRUE; + + if (function_exists('curl_init')) { + // try curl if installed + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + $response = curl_exec($ch); + curl_close($ch); + return $response === 'success'; + } else if (ini_get('allow_url_fopen')) { + // use file_get_contents as fallback + $response = file_get_contents($url); + return $response === 'success'; + } else { + $this->serverSupportsRemoteRead = FALSE; + return FALSE; + } + } + + /** + * Create Elgg's .htaccess file or confirm that it exists + * + * @param string $path Elgg's root directory with trailing slash + * + * @return bool + */ + public function createHtaccess($path) { + $filename = "{$path}.htaccess"; + if (file_exists($filename)) { + // check that this is the Elgg .htaccess + $data = file_get_contents($filename); + if ($data === FALSE) { + // don't have permission to read the file + $this->htaccessIssue = 'read_permission'; + return FALSE; + } + if (strpos($data, 'Elgg') === FALSE) { + $this->htaccessIssue = 'non_elgg_htaccess'; + return FALSE; + } else { + // check if this is an old Elgg htaccess + if (strpos($data, 'RewriteRule ^rewrite.php$ install.php') == FALSE) { + $this->htaccessIssue = 'old_elgg_htaccess'; + return FALSE; + } + return TRUE; + } + } + + if (!is_writable($path)) { + $this->htaccessIssue = 'write_permission'; + return FALSE; + } + + // create the .htaccess file + $result = copy("{$path}htaccess_dist", $filename); + if (!$result) { + $this->htaccessIssue = 'cannot_copy'; + return FALSE; + } + + return TRUE; + } + + /** + * Create the status array required by the ElggInstaller + * + * @param string $url Rewrite test URL + * + * @return array + */ + protected function returnStatus($url) { + if ($this->rewriteTestPassed) { + return array( + 'severity' => 'pass', + 'message' => elgg_echo('install:check:rewrite:success'), + ); + } + + if ($this->serverSupportsRemoteRead == FALSE) { + $msg = elgg_echo('install:warning:rewrite:unknown', array($url)); + $msg .= elgg_view('install/js_rewrite_check', array('url' => $url)); + + return array( + 'severity' => 'warning', + 'message' => $msg, + ); + } + + if ($this->webserver == 'apache') { + $serverString = elgg_echo('install:error:rewrite:apache'); + $msg = "$serverString\n\n"; + if (!isset($this->htaccessIssue)) { + $msg .= elgg_echo('install:error:rewrite:allowoverride'); + $msg .= elgg_view('install/js_rewrite_check', array('url' => $url)); + + return array( + 'severity' => 'failure', + 'message' => $msg, + ); + } + $msg .= elgg_echo("install:error:rewrite:htaccess:{$this->htaccessIssue}"); + return array( + 'severity' => 'failure', + 'message' => $msg, + ); + } + + if ($this->webserver != 'unknown') { + $serverString = elgg_echo("install:error:rewrite:{$this->webserver}"); + $msg = "$serverString\n\n"; + $msg .= elgg_echo("install:error:rewrite:altserver"); + return array( + 'severity' => 'failure', + 'message' => $msg, + ); + } + + return array( + 'severity' => 'failure', + 'message' => elgg_echo('install:error:rewrite:unknown'), + ); + } +}
\ No newline at end of file |