}
protected function exportSessionIpAddresses() {
- $exportFromVirtual = function ($sessionTable, $sessionVirtualTable) {
- $sql = "SELECT sv.ipAddress, sv.lastActivityTime
- FROM ${sessionVirtualTable} sv
- WHERE sv.sessionID IN (
- SELECT sessionID
- FROM ${sessionTable}
- WHERE userID = ?
- )";
- $statement = WCF::getDB()->prepareStatement($sql);
- $statement->execute([$this->user->userID]);
-
- return $this->fetchIpAddresses($statement, 'ipAddress', 'lastActivityTime');
- };
-
$data = [
'session' => [],
'acpSession' => [],
'acpSessionLog' => []
];
- // we can safely ignore the wcfN_session table in this case, because its data is
- // just mirrored from the virtual session table, except that it shows the data
- // from the last client only
- $data['session'] = $exportFromVirtual('wcf' . WCF_N . '_session', 'wcf' . WCF_N . '_session_virtual');
+ // TODO: Fix this.
+ $data['session'] = [];
- // ACP sessions always support virtualization
- $data['acpSession'] = $exportFromVirtual('wcf' . WCF_N . '_acp_session', 'wcf' . WCF_N . '_acp_session_virtual');
+ // TODO: Fix this.
+ $data['acpSession'] = [];
// we can ignore the wcfN_acp_session_access_log table because it is directly related
// to the wcfN_acp_session_log table and ACP sessions are bound to the ip address
+++ /dev/null
-<?php
-namespace wcf\data\acp\session\virtual;
-use wcf\data\DatabaseObject;
-use wcf\system\WCF;
-use wcf\util\UserUtil;
-
-/**
- * Virtual Sessions extend the original session system with a transparent layer.
- * It's only purpose is to enforce session validation based on IP address and/or user agent.
- *
- * The legacy session system does not allow the same user being logged-in more than once
- * and the same is true for WCF 2.1 unless we break most parts of the API.
- * In order to solve this, we do allow multiple clients to share the exact same session
- * among them, while the individual clients are tracked within wcf1_session_virtual.
- *
- * @author Alexander Ebert
- * @copyright 2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package WoltLabSuite\Core\Data\Acp\Session\Virtual
- *
- * @property-read integer $virtualSessionID unique id of the virtual acp session
- * @property-read string $sessionID id of the acp session the virtual acp session belongs to
- * @property-read string $ipAddress id of the user whom the virtual acp session belongs to
- * @property-read string $userAgent user agent of the user whom the virtual acp session belongs to
- * @property-read integer $lastActivityTime timestamp at which the latest activity occurred
- */
-class ACPSessionVirtual extends DatabaseObject {
- /**
- * @inheritDoc
- */
- protected static $databaseTableIndexName = 'virtualSessionID';
-
- /**
- * Returns the active virtual session object or null.
- *
- * @param string $sessionID
- * @return ACPSessionVirtual
- */
- public static function getExistingSession($sessionID) {
- $sql = "SELECT *
- FROM ".static::getDatabaseTableName()."
- WHERE sessionID = ?
- AND ipAddress = ?
- AND userAgent = ?";
- $statement = WCF::getDB()->prepareStatement($sql);
- $statement->execute([
- $sessionID,
- UserUtil::getIpAddress(),
- UserUtil::getUserAgent()
- ]);
-
- return $statement->fetchObject(static::class);
- }
-
- /**
- * Returns the number of virtual sessions associated with the given session id.
- *
- * @param string $sessionID
- * @return integer
- */
- public static function countVirtualSessions($sessionID) {
- $sql = "SELECT COUNT(*) AS count
- FROM ".static::getDatabaseTableName()."
- WHERE sessionID = ?";
- $statement = WCF::getDB()->prepareStatement($sql);
- $statement->execute([$sessionID]);
-
- return $statement->fetchSingleColumn();
- }
-}
+++ /dev/null
-<?php
-namespace wcf\data\acp\session\virtual;
-use wcf\data\AbstractDatabaseObjectAction;
-use wcf\util\UserUtil;
-
-/**
- * Executes virtual session-related actions.
- *
- * @author Alexander Ebert
- * @copyright 2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package WoltLabSuite\Core\Data\Acp\Session\Virtual
- *
- * @method ACPSessionVirtualEditor[] getObjects()
- * @method ACPSessionVirtualEditor getSingleObject()
- */
-class ACPSessionVirtualAction extends AbstractDatabaseObjectAction {
- /**
- * @inheritDoc
- */
- protected $className = ACPSessionVirtualEditor::class;
-
- /**
- * Attention: This method does not always return a new object, in case a matching virtual session
- * already exists, the existing session will be returned rather than a new session being created.
- *
- * @return ACPSessionVirtual
- */
- public function create() {
- // try to find an existing virtual session
- $baseClass = call_user_func([$this->className, 'getBaseClass']);
- $virtualSession = call_user_func([$baseClass, 'getExistingSession'], $this->parameters['data']['sessionID']);
- if ($virtualSession !== null) {
- return $virtualSession;
- }
-
- if (!isset($this->parameters['data']['lastActivityTime'])) $this->parameters['data']['lastActivityTime'] = TIME_NOW;
- if (!isset($this->parameters['data']['ipAddress'])) $this->parameters['data']['ipAddress'] = UserUtil::getIpAddress();
- if (!isset($this->parameters['data']['userAgent'])) $this->parameters['data']['userAgent'] = UserUtil::getUserAgent();
-
- /** @noinspection PhpIncompatibleReturnTypeInspection */
- return parent::create();
- }
-}
+++ /dev/null
-<?php
-namespace wcf\data\acp\session\virtual;
-use wcf\data\DatabaseObjectEditor;
-use wcf\system\WCF;
-
-/**
- * Provides functions to edit virtual sessions.
- *
- * @author Alexander Ebert
- * @copyright 2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package WoltLabSuite\Core\Data\Acp\Session\Virtual
- *
- * @method static ACPSessionVirtual create(array $parameters = [])
- * @method ACPSessionVirtual getDecoratedObject()
- * @mixin ACPSessionVirtual
- */
-class ACPSessionVirtualEditor extends DatabaseObjectEditor {
- /**
- * @inheritDoc
- */
- protected static $baseClass = ACPSessionVirtual::class;
-
- /**
- * Updates last activity time of this virtual session.
- */
- public function updateLastActivityTime() {
- $this->update(['lastActivityTime' => TIME_NOW]);
- }
-
- /**
- * Deletes the expired virtual sessions.
- *
- * @param integer $timestamp
- */
- public static function deleteExpiredSessions($timestamp) {
- $sql = "DELETE FROM ".call_user_func([static::$baseClass, 'getDatabaseTableName'])."
- WHERE lastActivityTime < ?";
- $statement = WCF::getDB()->prepareStatement($sql);
- $statement->execute([$timestamp]);
- }
-}
+++ /dev/null
-<?php
-namespace wcf\data\acp\session\virtual;
-use wcf\data\DatabaseObjectList;
-
-/**
- * Represents a list of virtual sessions.
- *
- * @author Alexander Ebert
- * @copyright 2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package WoltLabSuite\Core\Data\Acp\Session\Virtual
- *
- * @method ACPSessionVirtual current()
- * @method ACPSessionVirtual[] getObjects()
- * @method ACPSessionVirtual|null search($objectID)
- * @property ACPSessionVirtual[] $objects
- */
-class ACPSessionVirtualList extends DatabaseObjectList {
- /**
- * @inheritDoc
- */
- public $className = ACPSessionVirtual::class;
-}
+++ /dev/null
-<?php
-namespace wcf\data\session\virtual;
-use wcf\data\acp\session\virtual\ACPSessionVirtual;
-
-/**
- * Virtual sessions for the frontend.
- *
- * @see \wcf\data\acp\session\virtual\ACPSessionVirtual
- * @author Tim Duesterhus
- * @copyright 2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package WoltLabSuite\Core\Data\Session\Virtual
- */
-class SessionVirtual extends ACPSessionVirtual {}
+++ /dev/null
-<?php
-namespace wcf\data\session\virtual;
-use wcf\data\acp\session\virtual\ACPSessionVirtualAction;
-
-/**
- * Virtual sessions for the frontend.
- *
- * @see \wcf\data\acp\session\virtual\ACPSessionVirtualAction
- * @author Tim Duesterhus
- * @copyright 2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package WoltLabSuite\Core\Data\Session\Virtual
- *
- * @method SessionVirtual create()
- * @method SessionVirtualEditor[] getObjects()
- * @method SessionVirtualEditor getSingleObject()
- */
-class SessionVirtualAction extends ACPSessionVirtualAction {
- /**
- * @inheritDoc
- */
- protected $className = SessionVirtualEditor::class;
-}
+++ /dev/null
-<?php
-namespace wcf\data\session\virtual;
-use wcf\data\acp\session\virtual\ACPSessionVirtualEditor;
-
-/**
- * Virtual sessions for the frontend.
- *
- * @see \wcf\data\acp\session\virtual\ACPSessionVirtualEditor
- * @author Tim Duesterhus
- * @copyright 2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package WoltLabSuite\Core\Data\Session\Virtual
- *
- * @method SessionVirtual getDecoratedObject()
- * @mixin SessionVirtual
- */
-class SessionVirtualEditor extends ACPSessionVirtualEditor {
- /**
- * @inheritDoc
- */
- protected static $baseClass = SessionVirtual::class;
-}
+++ /dev/null
-<?php
-namespace wcf\data\session\virtual;
-use wcf\data\acp\session\virtual\ACPSessionVirtualList;
-
-/**
- * Virtual sessions for the frontend.
- *
- * @see \wcf\data\acp\session\virtual\ACPSessionVirtualList
- * @author Tim Duesterhus
- * @copyright 2001-2019 WoltLab GmbH
- * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
- * @package WoltLabSuite\Core\Data\Session\Virtual
- *
- * @method SessionVirtual current()
- * @method SessionVirtual[] getObjects()
- * @method SessionVirtual|null search($objectID)
- * @property SessionVirtual[] $objects
- */
-class SessionVirtualList extends ACPSessionVirtualList {
- /**
- * @inheritDoc
- */
- public $className = SessionVirtual::class;
-}
<?php
namespace wcf\system\cronjob;
-use wcf\data\acp\session\virtual\ACPSessionVirtualEditor;
use wcf\data\acp\session\ACPSessionEditor;
use wcf\data\cronjob\Cronjob;
-use wcf\data\session\virtual\SessionVirtualEditor;
use wcf\data\session\SessionEditor;
/**
// Prevent the sessions from expiring while the development mode is active.
if (!ENABLE_DEBUG_MODE || !ENABLE_DEVELOPER_TOOLS) {
ACPSessionEditor::deleteExpiredSessions(TIME_NOW - SESSION_TIMEOUT);
- ACPSessionVirtualEditor::deleteExpiredSessions(TIME_NOW - SESSION_TIMEOUT);
}
SessionEditor::deleteExpiredSessions(TIME_NOW - SESSION_TIMEOUT);
- SessionVirtualEditor::deleteExpiredSessions(TIME_NOW - SESSION_TIMEOUT);
}
}
<?php
namespace wcf\system\session;
-use wcf\data\acp\session\virtual\ACPSessionVirtual;
-use wcf\data\session\virtual\SessionVirtual;
use wcf\data\session\SessionEditor;
use wcf\data\user\User;
use wcf\data\user\UserEditor;
// user -> guest (logout)
//
case 0:
- if ($this->isACP) {
- $sessionCount = ACPSessionVirtual::countVirtualSessions($this->session->sessionID);
- }
- else {
- $sessionCount = SessionVirtual::countVirtualSessions($this->session->sessionID);
- }
+ $sessionCount = 1;
// there are still other virtual sessions, create a new session
if ($sessionCount) {