From bfc1c157f1e4d2e84437e6f149bdb3e8b6290b8a Mon Sep 17 00:00:00 2001
From: Philipp <admin@philipp.info>
Date: Mon, 26 Dec 2022 13:08:41 +0100
Subject: [PATCH] Adapt UserSession - Move from App methods to UserSession
 methods - Deprecate corresponding App methods

---
 src/App.php                                   | 52 +++++--------------
 .../Capability/IHandleUserSessions.php        | 14 +++++
 src/Core/Session/Model/UserSession.php        | 17 ++++++
 src/Model/User.php                            | 16 ++++++
 src/Security/Authentication.php               |  3 --
 .../Api/Twitter/DirectMessages/NewDMTest.php  |  6 +--
 6 files changed, 62 insertions(+), 46 deletions(-)

diff --git a/src/App.php b/src/App.php
index eb0d1cc217..b41215380f 100644
--- a/src/App.php
+++ b/src/App.php
@@ -29,7 +29,6 @@ use Friendica\Core\Config\Factory\Config;
 use Friendica\Core\Session\Capability\IHandleUserSessions;
 use Friendica\Database\Definition\DbaDefinition;
 use Friendica\Database\Definition\ViewDefinition;
-use Friendica\Model\User;
 use Friendica\Module\Maintenance;
 use Friendica\Security\Authentication;
 use Friendica\Core\Config\ValueObject\Cache;
@@ -73,8 +72,6 @@ class App
 		'videoheight'       => 350,
 	];
 
-	private $user_id       = 0;
-	private $nickname      = '';
 	private $timezone      = '';
 	private $profile_owner = 0;
 	private $contact_id    = 0;
@@ -136,64 +133,39 @@ class App
 	private $session;
 
 	/**
-	 * Set the user ID
-	 *
-	 * @param int $user_id
-	 * @return void
+	 * @deprecated 2022.03
+	 * @see IHandleUserSessions::isAuthenticated()
 	 */
-	public function setLoggedInUserId(int $user_id)
-	{
-		$this->user_id = $user_id;
-	}
-
-	/**
-	 * Set the nickname
-	 *
-	 * @param int $user_id
-	 * @return void
-	 */
-	public function setLoggedInUserNickname(string $nickname)
-	{
-		$this->nickname = $nickname;
-	}
-
 	public function isLoggedIn(): bool
 	{
-		return $this->session->getLocalUserId() && $this->user_id && ($this->user_id == $this->session->getLocalUserId());
+		return $this->session->isAuthenticated();
 	}
 
 	/**
-	 * Check if current user has admin role.
-	 *
-	 * @return bool true if user is an admin
-	 * @throws Exception
+	 * @deprecated 2022.03
+	 * @see IHandleUserSessions::isSiteAdmin()
 	 */
 	public function isSiteAdmin(): bool
 	{
-		return
-			$this->session->getLocalUserId()
-			&& $this->database->exists('user', [
-				'uid'   => $this->getLoggedInUserId(),
-				'email' => User::getAdminEmailList()
-			]);
+		return $this->session->isSiteAdmin();
 	}
 
 	/**
-	 * Fetch the user id
-	 * @return int User id
+	 * @deprecated 2022.03
+	 * @see IHandleUserSessions::getLocalUserId()
 	 */
 	public function getLoggedInUserId(): int
 	{
-		return $this->user_id;
+		return $this->session->getLocalUserId();
 	}
 
 	/**
-	 * Fetch the user nick name
-	 * @return string User's nickname
+	 * @deprecated 2022.03
+	 * @see IHandleUserSessions::getLocalUserNickname()
 	 */
 	public function getLoggedInUserNickname(): string
 	{
-		return $this->nickname;
+		return $this->session->getLocalUserNickname();
 	}
 
 	/**
diff --git a/src/Core/Session/Capability/IHandleUserSessions.php b/src/Core/Session/Capability/IHandleUserSessions.php
index e65749c8df..7a6ca64ba1 100644
--- a/src/Core/Session/Capability/IHandleUserSessions.php
+++ b/src/Core/Session/Capability/IHandleUserSessions.php
@@ -33,6 +33,13 @@ interface IHandleUserSessions extends IHandleSessions
 	 */
 	public function getLocalUserId();
 
+	/**
+	 * Returns the user nickname of locally logged-in user.
+	 *
+	 * @return string|false User's nickname or false
+	 */
+	public function getLocalUserNickname();
+
 	/**
 	 * Returns the public contact id of logged-in user or false.
 	 *
@@ -79,6 +86,13 @@ interface IHandleUserSessions extends IHandleSessions
 	 */
 	public function isAuthenticated(): bool;
 
+	/**
+	 * Check if current user has admin role.
+	 *
+	 * @return bool true if user is an admin
+	 */
+	public function isSiteAdmin(): bool;
+
 	/**
 	 * Returns User ID of the managed user in case it's a different identity
 	 *
diff --git a/src/Core/Session/Model/UserSession.php b/src/Core/Session/Model/UserSession.php
index 959ca1af2d..6cd689e9c7 100644
--- a/src/Core/Session/Model/UserSession.php
+++ b/src/Core/Session/Model/UserSession.php
@@ -24,6 +24,7 @@ namespace Friendica\Core\Session\Model;
 use Friendica\Core\Session\Capability\IHandleSessions;
 use Friendica\Core\Session\Capability\IHandleUserSessions;
 use Friendica\Model\Contact;
+use Friendica\Model\User;
 
 /**
  * This class handles user sessions, which is directly extended from regular session
@@ -50,6 +51,16 @@ class UserSession implements IHandleUserSessions
 		return false;
 	}
 
+	/** {@inheritDoc} */
+	public function getLocalUserNickname()
+	{
+		if ($this->isAuthenticated()) {
+			return $this->session->get('nickname');
+		}
+
+		return false;
+	}
+
 	/** {@inheritDoc} */
 	public function getPublicContactId()
 	{
@@ -122,6 +133,12 @@ class UserSession implements IHandleUserSessions
 		return $this->session->get('authenticated', false);
 	}
 
+	/** {@inheritDoc} */
+	public function isSiteAdmin(): bool
+	{
+		return User::isSiteAdmin($this->getLocalUserId());
+	}
+
 	/** {@inheritDoc} */
 	public function setVisitorsContacts()
 	{
diff --git a/src/Model/User.php b/src/Model/User.php
index 132e4f11a9..916844251e 100644
--- a/src/Model/User.php
+++ b/src/Model/User.php
@@ -830,6 +830,22 @@ class User
 		return DBA::update('user', $fields, ['uid' => $uid]);
 	}
 
+	/**
+	 * Returns if the given uid is valid and in the admin list
+	 *
+	 * @param int $uid
+	 *
+	 * @return bool
+	 * @throws Exception
+	 */
+	public static function isSiteAdmin(int $uid): bool
+	{
+		return DBA::exists('user', [
+			'uid'   => $uid,
+			'email' => self::getAdminEmailList()
+		]);
+	}
+
 	/**
 	 * Checks if a nickname is in the list of the forbidden nicknames
 	 *
diff --git a/src/Security/Authentication.php b/src/Security/Authentication.php
index 5dcc399403..c6a8403672 100644
--- a/src/Security/Authentication.php
+++ b/src/Security/Authentication.php
@@ -392,9 +392,6 @@ class Authentication
 			}
 		}
 
-		$a->setLoggedInUserId($user_record['uid']);
-		$a->setLoggedInUserNickname($user_record['nickname']);
-
 		if ($login_initial) {
 			Hook::callAll('logged_in', $user_record);
 		}
diff --git a/tests/src/Module/Api/Twitter/DirectMessages/NewDMTest.php b/tests/src/Module/Api/Twitter/DirectMessages/NewDMTest.php
index b2bcfb37fa..cab3c22026 100644
--- a/tests/src/Module/Api/Twitter/DirectMessages/NewDMTest.php
+++ b/tests/src/Module/Api/Twitter/DirectMessages/NewDMTest.php
@@ -88,7 +88,7 @@ class NewDMTest extends ApiTest
 	 */
 	public function testApiDirectMessagesNewWithScreenName()
 	{
-		DI::app()->setLoggedInUserNickname('selfcontact');
+		DI::session()->set('nickname', 'selfcontact');
 
 		$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser());
 
@@ -112,7 +112,7 @@ class NewDMTest extends ApiTest
 	 */
 	public function testApiDirectMessagesNewWithTitle()
 	{
-		DI::app()->setLoggedInUserNickname('selfcontact');
+		DI::session()->set('nickname', 'selfcontact');
 
 		$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser());
 
@@ -138,7 +138,7 @@ class NewDMTest extends ApiTest
 	 */
 	public function testApiDirectMessagesNewWithRss()
 	{
-		DI::app()->setLoggedInUserNickname('selfcontact');
+		DI::session()->set('nickname', 'selfcontact');
 
 		$directMessage = new DirectMessage(DI::logger(), DI::dba(), DI::twitterUser());