aboutsummaryrefslogtreecommitdiff
path: root/install/ElggRewriteTester.php
diff options
context:
space:
mode:
Diffstat (limited to 'install/ElggRewriteTester.php')
-rw-r--r--install/ElggRewriteTester.php181
1 files changed, 181 insertions, 0 deletions
diff --git a/install/ElggRewriteTester.php b/install/ElggRewriteTester.php
new file mode 100644
index 000000000..7f3501059
--- /dev/null
+++ b/install/ElggRewriteTester.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * Elgg RewriteTester.
+ * Test if URL rewriting is working.
+ *
+ * @package Elgg
+ * @subpackage Installer
+ */
+
+
+class ElggRewriteTester {
+ protected $webserver;
+ protected $serverSupportsRemoteRead;
+ protected $rewriteTestPassed;
+ protected $htaccessIssue;
+
+ 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->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']
+ */
+ protected function guessWebServer() {
+ $serverString = strtolower($_SERVER['SERVER_SOFTWARE']);
+ $possibleServers = array('apache', 'nginx', 'lighttpd', 'iis');
+ foreach ($possibleServers as $server) {
+ if (strpos($serverString, $server) !== FALSE) {
+ $this->webserver = $server;
+ return;
+ }
+ }
+ }
+
+ /**
+ * 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);
+ $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
+ */
+ protected 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 {
+ 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 = sprintf(elgg_echo('install:warning:rewrite:unknown'), $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');
+ 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