Merge pull request #7651 from owncloud/close-session-faster-master

Close session faster
This commit is contained in:
Thomas Müller 2014-03-20 11:07:21 +01:00
commit 8a81df0f2c
22 changed files with 135 additions and 15 deletions

View File

@ -1,10 +1,9 @@
<?php
// Init owncloud
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
\OC::$session->close();
// Get data
$dir = stripslashes($_POST["dir"]);

View File

@ -29,6 +29,7 @@ $RUNTIME_APPTYPES=array('filesystem');
// Check if we are a user
OCP\User::checkLoggedIn();
\OC::$session->close();
$files = $_GET["files"];
$dir = $_GET["dir"];

View File

@ -10,6 +10,7 @@ if (isset($_GET['dir'])) {
}
OCP\JSON::checkLoggedIn();
\OC::$session->close();
// send back json
OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics($dir)));

View File

@ -7,6 +7,7 @@ $RUNTIME_APPTYPES=array('filesystem');
OCP\JSON::checkLoggedIn();
\OC::$session->close();
// Load the files
$dir = isset( $_GET['dir'] ) ? $_GET['dir'] : '';

View File

@ -1,3 +1,4 @@
<?php
\OC::$session->close();
print OC_Helper::mimetypeIcon($_GET['mime']);

View File

@ -1,10 +1,8 @@
<?php
// Init owncloud
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
\OC::$session->close();
// Get data
$dir = stripslashes($_POST["dir"]);

View File

@ -7,7 +7,8 @@ if(!OC_User::isLoggedIn()) {
exit;
}
session_write_close();
\OC::$session->close();
// Get the params
$dir = isset( $_REQUEST['dir'] ) ? '/'.trim($_REQUEST['dir'], '/\\') : '';
$filename = isset( $_REQUEST['filename'] ) ? trim($_REQUEST['filename'], '/\\') : '';

View File

@ -5,6 +5,7 @@
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
\OC::$session->close();
// Get the params
$dir = isset( $_POST['dir'] ) ? stripslashes($_POST['dir']) : '';

View File

@ -4,6 +4,7 @@
$RUNTIME_APPTYPES = array('filesystem');
OCP\JSON::checkLoggedIn();
\OC::$session->close();
// Load the files
$dir = isset($_GET['dir']) ? $_GET['dir'] : '';

View File

@ -23,6 +23,7 @@
OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
\OC::$session->close();
$files = new \OCA\Files\App(
\OC\Files\Filesystem::getView(),

View File

@ -1,6 +1,6 @@
<?php
set_time_limit(0); //scanning can take ages
session_write_close();
\OC::$session->close();
$force = (isset($_GET['force']) and ($_GET['force'] === 'true'));
$dir = isset($_GET['dir']) ? $_GET['dir'] : '';

View File

@ -58,6 +58,7 @@ if (empty($_POST['dirToken'])) {
OCP\JSON::callCheck();
\OC::$session->close();
// get array with current storage stats (e.g. max file size)

View File

@ -367,9 +367,14 @@ class Helper {
$post = 0;
if(count($_POST) > 0) {
$post = 1;
}
header('Location: ' . $location . '?p=' . $post . '&errorCode=' . $errorCode);
exit();
}
if(defined('PHPUNIT_RUN') and PHPUNIT_RUN) {
throw new \Exception("Encryption error: $errorCode");
}
header('Location: ' . $location . '?p=' . $post . '&errorCode=' . $errorCode);
exit();
}
/**

View File

@ -48,7 +48,7 @@ try {
require_once 'lib/base.php';
session_write_close();
\OC::$session->close();
$logger = \OC_Log::$object;

View File

@ -73,6 +73,20 @@ class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic {
*/
public function authenticate(Sabre_DAV_Server $server, $realm) {
$result = $this->auth($server, $realm);
// close the session - right after authentication there is not need to write to the session any more
\OC::$session->close();
return $result;
}
/**
* @param Sabre_DAV_Server $server
* @param $realm
* @return bool
*/
private function auth(Sabre_DAV_Server $server, $realm) {
if (OC_User::handleApacheAuth() || OC_User::isLoggedIn()) {
$user = OC_User::getUser();
OC_Util::setupFS($user);
@ -81,5 +95,5 @@ class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic {
}
return parent::authenticate($server, $realm);
}
}
}

View File

@ -26,8 +26,7 @@ class Internal extends Memory {
}
public function __destruct() {
$_SESSION = array_merge($_SESSION, $this->data);
session_write_close();
$this->close();
}
/**
@ -47,4 +46,15 @@ class Internal extends Memory {
@session_start();
$this->data = $_SESSION = array();
}
public function close() {
$_SESSION = array_merge($_SESSION, $this->data);
session_write_close();
parent::close();
}
public function reopen() {
throw new \Exception('The session cannot be reopened - reopen() is ony to be used in unit testing.');
}
}

View File

@ -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,29 @@ class Memory extends Session {
* @param string $key
*/
public function remove($key) {
$this->validateSession();
unset($this->data[$key]);
}
public function clear() {
$this->data = array();
}
/**
* Helper function for PHPUnit execution - don't use in non-test code
*/
public function reopen() {
$this->sessionClosed = false;
}
/**
* In case the session has already been locked an exception will be thrown
*
* @throws \Exception
*/
private function validateSession() {
if ($this->sessionClosed) {
throw new \Exception('Session has been closed - no further changes to the session as allowed');
}
}
}

View File

@ -12,6 +12,11 @@ use OCP\ISession;
abstract class Session implements \ArrayAccess, ISession {
/**
* @var bool
*/
protected $sessionClosed = false;
/**
* $name serves as a namespace for the session keys
*
@ -49,4 +54,11 @@ abstract class Session implements \ArrayAccess, ISession {
public function offsetUnset($offset) {
$this->remove($offset);
}
/**
* Close the session and release the lock
*/
public function close() {
$this->sessionClosed = true;
}
}

View File

@ -75,4 +75,9 @@ interface ISession {
*/
public function clear();
/**
* Close the session and release the lock
*/
public function close();
}

View File

@ -36,6 +36,7 @@
</whitelist>
</filter>
<listeners>
<listener class="StartSessionListener" file="startsessionlistener.php" />
<listener class="TestCleanupListener" file="testcleanuplistener.php">
<arguments>
<string>detail</string>

View File

@ -29,4 +29,7 @@
</exclude>
</whitelist>
</filter>
<listeners>
<listener class="StartSessionListener" file="startsessionlistener.php" />
</listeners>
</phpunit>

View File

@ -0,0 +1,44 @@
<?php
/**
* Copyright (c) 2014 Thomas Müller <deepdiver@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
/**
* Starts a new session before each test execution
*/
class StartSessionListener implements PHPUnit_Framework_TestListener {
public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) {
}
public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) {
}
public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) {
}
public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) {
}
public function startTest(PHPUnit_Framework_Test $test) {
}
public function endTest(PHPUnit_Framework_Test $test, $time) {
// reopen the session - only allowed for memory session
if (\OC::$session instanceof \OC\Session\Memory) {
/** @var $session \OC\Session\Memory */
$session = \OC::$session;
$session->reopen();
}
}
public function startTestSuite(PHPUnit_Framework_TestSuite $suite) {
}
public function endTestSuite(PHPUnit_Framework_TestSuite $suite) {
}
}