Add method to delete all user sessions
authorjoshuaruesweg <ruesweg@woltlab.com>
Sat, 24 Oct 2020 14:12:21 +0000 (16:12 +0200)
committerjoshuaruesweg <ruesweg@woltlab.com>
Mon, 2 Nov 2020 11:22:40 +0000 (12:22 +0100)
wcfsetup/install/files/lib/system/session/SessionHandler.class.php

index 6e5a01d747ffead3f8b421dab44462e8bd076f88..017a234bbc6741b8347d78e901c1c59732771c65 100644 (file)
@@ -985,6 +985,34 @@ final class SessionHandler extends SingletonFactory {
                return $this->firstVisit;
        }
        
+       /**
+        * Deletes the user sessions for a specific user, except the session with the given session id.
+        * If the given session id is null or unknown, all sessions for the user will be deleted.
+        */
+       public function deleteUserSessionsExcept(User $user, ?string $sessionID = null): void {
+               if ($user->userID === 0) {
+                       throw new \InvalidArgumentException("The given user is a guest.");
+               }
+               
+               $conditionBuilder = new PreparedStatementConditionBuilder();
+               $conditionBuilder->add('userID = ?', [$user->userID]);
+               
+               if ($sessionID !== null) {
+                       $conditionBuilder->add('sessionID <> ?', [$sessionID]);
+               }
+               
+               $sql = "DELETE FROM     wcf".WCF_N."_user_session
+                       ". $conditionBuilder;
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute($conditionBuilder->getParameters());
+               
+               // Delete legacy session.
+               $sql = "DELETE FROM     wcf".WCF_N."_session
+                       ". $conditionBuilder;
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute($conditionBuilder->getParameters());
+       }
+       
        /**
         * Deletes a user session with the given session id.
         */