Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2017-06-15 07:20:27 +0300
committerGitHub <noreply@github.com>2017-06-15 07:20:27 +0300
commit3e9cda35cbd97b050e9ee51e8f7c9233f529cd6a (patch)
treef8888defce800c245947cffa7238dc8c2708b0c9 /lib/private
parent27710d3fdb1a47c339c1643fc7a7a7bc425dd687 (diff)
parent6f1fd9ce087062d128e5ea61e7b69318e43a5dbc (diff)
Merge pull request #5190 from nextcloud/treat-session-regid-error-stable11
[stable11] Treat PHP Errors on User session regenerate
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/Session/Internal.php41
1 files changed, 32 insertions, 9 deletions
diff --git a/lib/private/Session/Internal.php b/lib/private/Session/Internal.php
index 22878154c05..c6f9734c9e5 100644
--- a/lib/private/Session/Internal.php
+++ b/lib/private/Session/Internal.php
@@ -43,12 +43,12 @@ class Internal extends Session {
* @throws \Exception
*/
public function __construct($name) {
- session_name($name);
set_error_handler(array($this, 'trapError'));
+ $this->invoke('session_name', [$name]);
try {
- session_start();
+ $this->invoke('session_start');
} catch (\Exception $e) {
- setcookie(session_name(), null, -1, \OC::$WEBROOT ? : '/');
+ setcookie($this->invoke('session_name'), null, -1, \OC::$WEBROOT ?: '/');
}
restore_error_handler();
if (!isset($_SESSION)) {
@@ -94,14 +94,14 @@ class Internal extends Session {
}
public function clear() {
- session_unset();
+ $this->invoke('session_unset');
$this->regenerateId();
- @session_start();
- $_SESSION = array();
+ $this->invoke('session_start', [], true);
+ $_SESSION = [];
}
public function close() {
- session_write_close();
+ $this->invoke('session_write_close');
parent::close();
}
@@ -112,7 +112,11 @@ class Internal extends Session {
* @return void
*/
public function regenerateId($deleteOldSession = true) {
- @session_regenerate_id($deleteOldSession);
+ try {
+ @session_regenerate_id($deleteOldSession);
+ } catch (\Error $e) {
+ $this->trapError($e->getCode(), $e->getMessage());
+ }
}
/**
@@ -123,7 +127,7 @@ class Internal extends Session {
* @since 9.1.0
*/
public function getId() {
- $id = @session_id();
+ $id = $this->invoke('session_id', [], true);
if ($id === '') {
throw new SessionNotAvailableException();
}
@@ -154,4 +158,23 @@ class Internal extends Session {
throw new \Exception('Session has been closed - no further changes to the session are allowed');
}
}
+
+ /**
+ * @param string $functionName the full session_* function name
+ * @param array $parameters
+ * @param bool $silence whether to suppress warnings
+ * @throws \ErrorException via trapError
+ * @return mixed
+ */
+ private function invoke($functionName, array $parameters = [], $silence = false) {
+ try {
+ if($silence) {
+ return @call_user_func_array($functionName, $parameters);
+ } else {
+ return call_user_func_array($functionName, $parameters);
+ }
+ } catch(\Error $e) {
+ $this->trapError($e->getCode(), $e->getMessage());
+ }
+ }
}