diff options
author | Morris Jobke <hey@morrisjobke.de> | 2017-06-15 07:20:27 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-15 07:20:27 +0300 |
commit | 3e9cda35cbd97b050e9ee51e8f7c9233f529cd6a (patch) | |
tree | f8888defce800c245947cffa7238dc8c2708b0c9 /lib/private | |
parent | 27710d3fdb1a47c339c1643fc7a7a7bc425dd687 (diff) | |
parent | 6f1fd9ce087062d128e5ea61e7b69318e43a5dbc (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.php | 41 |
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()); + } + } } |