]> git.mxchange.org Git - friendica.git/blobdiff - src/Core/Session.php
Add "addon" console command to enable and disable addons
[friendica.git] / src / Core / Session.php
index 02e10482d52ba466e6cd5fa27a712c372cfb02e6..c4fbb3f8c6d043b9764a0ef2623c64a92e2752d9 100644 (file)
 <?php
-
 /**
- * @file src/Core/Session.php
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
  */
+
 namespace Friendica\Core;
 
-use Friendica\App;
-use Friendica\Core\Session\CacheSessionHandler;
-use Friendica\Core\Session\DatabaseSessionHandler;
 use Friendica\Database\DBA;
+use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Util\Strings;
 
 /**
  * High-level Session service class
- *
- * @author Hypolite Petovan <hypolite@mrpetovan.com>
  */
 class Session
 {
        public static $exists = false;
        public static $expire = 180000;
 
-       public static function init()
-       {
-               ini_set('session.gc_probability', 50);
-               ini_set('session.use_only_cookies', 1);
-               ini_set('session.cookie_httponly', 1);
-
-               if (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL) {
-                       ini_set('session.cookie_secure', 1);
-               }
-
-               $session_handler = Config::get('system', 'session_handler', 'database');
-               if ($session_handler != 'native') {
-                       if ($session_handler == 'cache' && Config::get('system', 'cache_driver', 'database') != 'database') {
-                               $SessionHandler = new CacheSessionHandler();
-                       } else {
-                               $SessionHandler = new DatabaseSessionHandler();
-                       }
-
-                       session_set_save_handler($SessionHandler);
-               }
-       }
-
        public static function exists($name)
        {
-               return isset($_SESSION[$name]);
+               return DI::session()->exists($name);
        }
 
-       /**
-        * Retrieves a key from the session super global or the defaults if the key is missing or the value is falsy.
-        *
-        * Handle the case where session_start() hasn't been called and the super global isn't available.
-        *
-        * @param string $name
-        * @param mixed $defaults
-        * @return mixed
-        */
        public static function get($name, $defaults = null)
        {
-               return $_SESSION[$name] ?? $defaults;
+               return DI::session()->get($name, $defaults);
        }
 
-       /**
-        * Sets a single session variable.
-        * Overrides value of existing key.
-        *
-        * @param string $name
-        * @param mixed $value
-        */
        public static function set($name, $value)
        {
-               $_SESSION[$name] = $value;
+               DI::session()->set($name, $value);
        }
 
-       /**
-        * Sets multiple session variables.
-        * Overrides values for existing keys.
-        *
-        * @param array $values
-        */
        public static function setMultiple(array $values)
        {
-               $_SESSION = $values + $_SESSION;
+               DI::session()->setMultiple($values);
        }
 
-       /**
-        * Removes a session variable.
-        * Ignores missing keys.
-        *
-        * @param $name
-        */
        public static function remove($name)
        {
-               unset($_SESSION[$name]);
+               DI::session()->remove($name);
        }
 
-       /**
-        * Clears the current session array
-        */
        public static function clear()
        {
-               session_unset();
-               session_start();
-               $_SESSION = [];
+               DI::session()->clear();
        }
 
        /**
-        * Returns contact ID for given user ID
+        * Return the user contact ID of a visitor for the given user ID they are visiting
         *
         * @param integer $uid User ID
-        * @return integer Contact ID of visitor for given user ID
+        * @return integer
         */
        public static function getRemoteContactID($uid)
        {
-               if (empty($_SESSION['remote'][$uid])) {
-                       return false;
+               $session = DI::session();
+
+               if (!empty($session->get('remote')[$uid])) {
+                       $remote = $session->get('remote')[$uid];
+               } else {
+                       $remote = 0;
                }
 
-               return $_SESSION['remote'][$uid];
+               $local_user = !empty($session->get('authenticated')) ? $session->get('uid') : 0;
+
+               if (empty($remote) && ($local_user != $uid) && !empty($my_address = $session->get('my_address'))) {
+                       $remote = Contact::getIdForURL($my_address, $uid, false);
+               }
+
+               return $remote;
        }
 
        /**
@@ -130,11 +97,13 @@ class Session
         */
        public static function getUserIDForVisitorContactID($cid)
        {
-               if (empty($_SESSION['remote'])) {
+               $session = DI::session();
+
+               if (empty($session->get('remote'))) {
                        return false;
                }
 
-               return array_search($cid, $_SESSION['remote']);
+               return array_search($cid, $session->get('remote'));
        }
 
        /**
@@ -144,15 +113,17 @@ class Session
         */
        public static function setVisitorsContacts()
        {
-               $_SESSION['remote'] = [];
+               $session = DI::session();
+
+               $session->set('remote', []);
 
-               $remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => Strings::normaliseLink($_SESSION['my_url']), 'rel' => [Contact::FOLLOWER, Contact::FRIEND], 'self' => false]);
+               $remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => Strings::normaliseLink($session->get('my_url')), 'rel' => [Contact::FOLLOWER, Contact::FRIEND], 'self' => false]);
                while ($contact = DBA::fetch($remote_contacts)) {
-                       if (($contact['uid'] == 0) || Contact::isBlockedByUser($contact['id'], $contact['uid'])) {
+                       if (($contact['uid'] == 0) || Contact\User::isBlocked($contact['id'], $contact['uid'])) {
                                continue;
                        }
 
-                       $_SESSION['remote'][$contact['uid']] = $contact['id'];
+                       $session->set('remote', [$contact['uid'] => $contact['id']]);
                }
                DBA::close($remote_contacts);
        }
@@ -164,81 +135,8 @@ class Session
         */
        public static function isAuthenticated()
        {
-               if (empty($_SESSION['authenticated'])) {
-                       return false;
-               }
-
-               return $_SESSION['authenticated'];
-       }
-
-       /**
-        * @brief Calculate the hash that is needed for the "Friendica" cookie
-        *
-        * @param array $user Record from "user" table
-        *
-        * @return string Hashed data
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       private static function getCookieHashForUser($user)
-       {
-               return hash_hmac(
-                       "sha256",
-                       hash_hmac("sha256", $user["password"], $user["prvkey"]),
-                       Config::get("system", "site_prvkey")
-               );
-       }
-
-       /**
-        * @brief Set the "Friendica" cookie
-        *
-        * @param int   $time
-        * @param array $user Record from "user" table
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public static function setCookie($time, $user = [])
-       {
-               if ($time != 0) {
-                       $time = $time + time();
-               }
-
-               if ($user) {
-                       $value = json_encode([
-                               "uid" => $user["uid"],
-                               "hash" => self::getCookieHashForUser($user),
-                               "ip" => ($_SERVER['REMOTE_ADDR'] ?? '') ?: '0.0.0.0'
-                       ]);
-               } else {
-                       $value = "";
-               }
-
-               setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL), true);
-       }
-
-       /**
-        * @brief Checks if the "Friendica" cookie is set
-        *
-        * @param string $hash
-        * @param array  $user Record from "user" table
-        *
-        * @return boolean True, if the cookie is set
-        *
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public static function checkCookie(string $hash, array $user)
-       {
-               return hash_equals(
-                       self::getCookieHashForUser($user),
-                       $hash
-               );
-       }
+               $session = DI::session();
 
-       /**
-        * @brief Kills the "Friendica" cookie and all session data
-        */
-       public static function delete()
-       {
-               self::setCookie(-3600); // make sure cookie is deleted on browser close, as a security measure
-               session_unset();
-               session_destroy();
+               return $session->get('authenticated', false);
        }
 }