Add support for a reverse proxy that handles multiple domains via different web roots (http[s]://proxy.tld/domain.tld/owncloud). As the reverse proxy web root is transparent for the web server the REQUEST_URI and SCRIPT_NAME need manual adjustments. This patch replace the direct use of this _SERVER variables with function calls and extend this functions to overwrite the web root. Additionally it adds a Sabre request backend that extends the Sabre_HTTP_Request to use the same functions.tags/v5.0.0alpha1
// Backends | // Backends | ||||
$authBackend = new OC_Connector_Sabre_Auth(); | $authBackend = new OC_Connector_Sabre_Auth(); | ||||
$lockBackend = new OC_Connector_Sabre_Locks(); | $lockBackend = new OC_Connector_Sabre_Locks(); | ||||
$requestBackend = new OC_Connector_Sabre_Request(); | |||||
// Create ownCloud Dir | // Create ownCloud Dir | ||||
$publicDir = new OC_Connector_Sabre_Directory(''); | $publicDir = new OC_Connector_Sabre_Directory(''); | ||||
// Fire up server | // Fire up server | ||||
$server = new Sabre_DAV_Server($publicDir); | $server = new Sabre_DAV_Server($publicDir); | ||||
$server->httpRequest = $requestBackend; | |||||
$server->setBaseUri($baseuri); | $server->setBaseUri($baseuri); | ||||
// Load plugins | // Load plugins |
$dir = isset($_GET['dir']) ? stripslashes($_GET['dir']) : ''; | $dir = isset($_GET['dir']) ? stripslashes($_GET['dir']) : ''; | ||||
// Redirect if directory does not exist | // Redirect if directory does not exist | ||||
if (!\OC\Files\Filesystem::is_dir($dir . '/')) { | if (!\OC\Files\Filesystem::is_dir($dir . '/')) { | ||||
header('Location: ' . $_SERVER['SCRIPT_NAME'] . ''); | |||||
header('Location: ' . OCP\Util::getScriptName() . ''); | |||||
exit(); | exit(); | ||||
} | } | ||||
/* The automatic protocol detection of ownCloud can fail in certain reverse proxy situations. This option allows to manually override the protocol detection. For example "https" */ | /* The automatic protocol detection of ownCloud can fail in certain reverse proxy situations. This option allows to manually override the protocol detection. For example "https" */ | ||||
"overwriteprotocol" => "", | "overwriteprotocol" => "", | ||||
/* The automatic webroot detection of ownCloud can fail in certain reverse proxy situations. This option allows to manually override the automatic detection. For example "/domain.tld/ownCloud" */ | |||||
"overwritewebroot" => "", | |||||
/* A proxy to use to connect to the internet. For example "myproxy.org:88" */ | /* A proxy to use to connect to the internet. For example "myproxy.org:88" */ | ||||
"proxy" => "", | "proxy" => "", | ||||
* @return string | * @return string | ||||
*/ | */ | ||||
public static function getCurrentApp() { | public static function getCurrentApp() { | ||||
$script=substr($_SERVER["SCRIPT_NAME"], strlen(OC::$WEBROOT)+1); | |||||
$script=substr(OC_Request::scriptName(), strlen(OC::$WEBROOT)+1); | |||||
$topFolder=substr($script, 0, strpos($script, '/')); | $topFolder=substr($script, 0, strpos($script, '/')); | ||||
if (empty($topFolder)) { | if (empty($topFolder)) { | ||||
$path_info = OC_Request::getPathInfo(); | $path_info = OC_Request::getPathInfo(); |
// calculate the root directories | // calculate the root directories | ||||
OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4)); | OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4)); | ||||
OC::$SUBURI = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen(OC::$SERVERROOT))); | OC::$SUBURI = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen(OC::$SERVERROOT))); | ||||
$scriptName = $_SERVER["SCRIPT_NAME"]; | |||||
$scriptName = OC_Request::scriptName(); | |||||
if (substr($scriptName, -1) == '/') { | if (substr($scriptName, -1) == '/') { | ||||
$scriptName .= 'index.php'; | $scriptName .= 'index.php'; | ||||
//make sure suburi follows the same rules as scriptName | //make sure suburi follows the same rules as scriptName | ||||
header('Strict-Transport-Security: max-age=31536000'); | header('Strict-Transport-Security: max-age=31536000'); | ||||
ini_set("session.cookie_secure", "on"); | ini_set("session.cookie_secure", "on"); | ||||
if (OC_Request::serverProtocol() <> 'https' and !OC::$CLI) { | if (OC_Request::serverProtocol() <> 'https' and !OC::$CLI) { | ||||
$url = "https://" . OC_Request::serverHost() . $_SERVER['REQUEST_URI']; | |||||
$url = "https://" . OC_Request::serverHost() . OC_Request::requestUri(); | |||||
header("Location: $url"); | header("Location: $url"); | ||||
exit(); | exit(); | ||||
} | } | ||||
if (OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) { | if (OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) { | ||||
//OC_Log::write('core',"Logged in with HTTP Authentication", OC_Log::DEBUG); | //OC_Log::write('core',"Logged in with HTTP Authentication", OC_Log::DEBUG); | ||||
OC_User::unsetMagicInCookie(); | OC_User::unsetMagicInCookie(); | ||||
$_REQUEST['redirect_url'] = (isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''); | |||||
$_REQUEST['redirect_url'] = OC_Request::requestUri(); | |||||
OC_Util::redirectToDefaultPage(); | OC_Util::redirectToDefaultPage(); | ||||
} | } | ||||
return true; | return true; |
<?php | |||||
/** | |||||
* ownCloud | |||||
* | |||||
* @author Stefan Herbrechtsmeier | |||||
* @copyright 2012 Stefan Herbrechtsmeier <stefan@herbrechtsmeier.net> | |||||
* | |||||
* This library is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or any later version. | |||||
* | |||||
* This library is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details. | |||||
* | |||||
* You should have received a copy of the GNU Affero General Public | |||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. | |||||
* | |||||
*/ | |||||
class OC_Connector_Sabre_Request extends Sabre_HTTP_Request { | |||||
/** | |||||
* Returns the requested uri | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function getUri() { | |||||
return OC_Request::requestUri(); | |||||
} | |||||
/** | |||||
* Returns a specific item from the _SERVER array. | |||||
* | |||||
* Do not rely on this feature, it is for internal use only. | |||||
* | |||||
* @param string $field | |||||
* @return string | |||||
*/ | |||||
public function getRawServerValue($field) { | |||||
if($field == 'REQUEST_URI'){ | |||||
return $this->getUri(); | |||||
} | |||||
else{ | |||||
return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null; | |||||
} | |||||
} | |||||
} |
return(\OC_Request::serverProtocol()); | return(\OC_Request::serverProtocol()); | ||||
} | } | ||||
/** | |||||
* @brief Returns the request uri | |||||
* @returns the request uri | |||||
* | |||||
* Returns the request uri, even if the website uses one or more | |||||
* reverse proxies | |||||
*/ | |||||
public static function getRequestUri() { | |||||
return(\OC_Request::requestUri()); | |||||
} | |||||
/** | |||||
* @brief Returns the script name | |||||
* @returns the script name | |||||
* | |||||
* Returns the script name, even if the website uses one or more | |||||
* reverse proxies | |||||
*/ | |||||
public static function getScriptName() { | |||||
return(\OC_Request::scriptName()); | |||||
} | |||||
/** | /** | ||||
* @brief Creates path to an image | * @brief Creates path to an image | ||||
* @param string $app app | * @param string $app app |
return $proto; | return $proto; | ||||
} | } | ||||
/** | |||||
* @brief Returns the request uri | |||||
* @returns the request uri | |||||
* | |||||
* Returns the request uri, even if the website uses one or more | |||||
* reverse proxies | |||||
*/ | |||||
public static function requestUri() { | |||||
$uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; | |||||
if (OC_Config::getValue('overwritewebroot', '') <> '') { | |||||
$uri = self::scriptName() . substr($uri, strlen($_SERVER['SCRIPT_NAME'])); | |||||
} | |||||
return $uri; | |||||
} | |||||
/** | |||||
* @brief Returns the script name | |||||
* @returns the script name | |||||
* | |||||
* Returns the script name, even if the website uses one or more | |||||
* reverse proxies | |||||
*/ | |||||
public static function scriptName() { | |||||
$name = $_SERVER['SCRIPT_NAME']; | |||||
if (OC_Config::getValue('overwritewebroot', '') <> '') { | |||||
$serverroot = str_replace("\\", '/', substr(__DIR__, 0, -4)); | |||||
$suburi = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen($serverroot))); | |||||
$name = OC_Config::getValue('overwritewebroot', '') . $suburi; | |||||
} | |||||
return $name; | |||||
} | |||||
/** | /** | ||||
* @brief get Path info from request | * @brief get Path info from request | ||||
* @returns string Path info or false when not found | * @returns string Path info or false when not found |
public static function checkLoggedIn() { | public static function checkLoggedIn() { | ||||
// Check if we are a user | // Check if we are a user | ||||
if( !OC_User::isLoggedIn()) { | if( !OC_User::isLoggedIn()) { | ||||
header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php', array('redirect_url' => $_SERVER["REQUEST_URI"]))); | |||||
header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php', array('redirect_url' => OC_Request::requestUri()))); | |||||
exit(); | exit(); | ||||
} | } | ||||
} | } |
require_once '../lib/base.php'; | require_once '../lib/base.php'; | ||||
$url=OCP\Util::getServerProtocol().'://'.substr(OCP\Util::getServerHost().$_SERVER['REQUEST_URI'], 0, -17).'ocs/v1.php/'; | |||||
$url=OCP\Util::getServerProtocol().'://'.substr(OCP\Util::getServerHost().OCP\Util::getRequestUri(), 0, -17).'ocs/v1.php/'; | |||||
echo(' | echo(' | ||||
<providers> | <providers> |