From 73a1ece7533b9d90305e11052947809b91850184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 10 Mar 2014 14:21:12 +0100 Subject: [PATCH] adding an explicit close method to class session - write operations (set and remove) being called after close() will throw an exception --- lib/private/session/internal.php | 2 +- lib/private/session/memory.php | 8 ++++++++ lib/private/session/session.php | 6 ++++++ lib/public/isession.php | 5 +++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/private/session/internal.php b/lib/private/session/internal.php index a7c9e2fdef..d589932d42 100644 --- a/lib/private/session/internal.php +++ b/lib/private/session/internal.php @@ -27,7 +27,7 @@ class Internal extends Memory { public function __destruct() { $_SESSION = array_merge($_SESSION, $this->data); - session_write_close(); + \OC::$session->close(); } /** diff --git a/lib/private/session/memory.php b/lib/private/session/memory.php index 1b9ac45257..1562c2ce03 100644 --- a/lib/private/session/memory.php +++ b/lib/private/session/memory.php @@ -28,6 +28,7 @@ class Memory extends Session { * @param integer $value */ public function set($key, $value) { + $this->validateSession(); $this->data[$key] = $value; } @@ -54,10 +55,17 @@ class Memory extends Session { * @param string $key */ public function remove($key) { + $this->validateSession(); unset($this->data[$key]); } public function clear() { $this->data = array(); } + + private function validateSession() { + if ($this->sessionClosed) { + throw new \Exception('Session has been closed - no further changes to the session as allowed'); + } + } } diff --git a/lib/private/session/session.php b/lib/private/session/session.php index fe160faa26..5c18f3e495 100644 --- a/lib/private/session/session.php +++ b/lib/private/session/session.php @@ -49,4 +49,10 @@ abstract class Session implements \ArrayAccess, ISession { public function offsetUnset($offset) { $this->remove($offset); } + + protected $sessionClosed = false; + + public function close() { + $this->sessionClosed = true; + } } diff --git a/lib/public/isession.php b/lib/public/isession.php index 20da712cda..dc5719625c 100644 --- a/lib/public/isession.php +++ b/lib/public/isession.php @@ -75,4 +75,9 @@ interface ISession { */ public function clear(); + /** + * Close the session and release the lock + */ + public function close(); + }