]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/Security.php
Merge pull request #8912 from annando/subscribed-tags
[friendica.git] / src / Util / Security.php
index aa6209f3245b60bf55381a600f0aacf555d824aa..42333821602d7b123d7da520c175d21ceb0eacea 100644 (file)
@@ -1,26 +1,42 @@
 <?php
 /**
- * @file /src/Util/Security.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\Util;
 
-use Friendica\BaseObject;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
 use Friendica\Model\Group;
 use Friendica\Model\User;
+use Friendica\Core\Session;
 
 /**
  * Secures that User is allow to do requests
  */
-class Security extends BaseObject
+class Security
 {
        public static function canWriteToUserWall($owner)
        {
                static $verified = 0;
 
-               if (!local_user() && !remote_user()) {
+               if (!Session::isAuthenticated()) {
                        return false;
                }
 
@@ -33,7 +49,7 @@ class Security extends BaseObject
                        return true;
                }
 
-               if (remote_user($owner)) {
+               if (!empty(Session::getRemoteContactID($owner))) {
                        // use remembered decision and avoid a DB lookup for each and every display item
                        // DO NOT use this function if there are going to be multiple owners
                        // We have a contact-id for an authenticated remote user, this block determines if the contact
@@ -44,7 +60,7 @@ class Security extends BaseObject
                        } elseif ($verified === 1) {
                                return false;
                        } else {
-                               $cid = remote_user($owner);
+                               $cid = Session::getRemoteContactID($owner);
                                if (!$cid) {
                                        return false;
                                }
@@ -71,21 +87,32 @@ class Security extends BaseObject
                return false;
        }
 
-       /// @TODO $groups should be array
-       public static function getPermissionsSQLByUserId($owner_id, $remote_verified = false, $groups = null)
+       /**
+        * Create a permission string for an element based on the visitor
+        *
+        * @param integer $owner_id   User ID of the owner of the element
+        * @param boolean $accessible Should the element be accessible anyway?
+        * @return string SQL permissions
+        */
+       public static function getPermissionsSQLByUserId(int $owner_id, bool $accessible = false)
        {
                $local_user = local_user();
-               $remote_user = remote_user($owner_id);
+               $remote_contact = Session::getRemoteContactID($owner_id);
+               $acc_sql = '';
+
+               if ($accessible) {
+                       $acc_sql = ' OR `accessible`';
+               }
 
                /*
                 * Construct permissions
                 *
                 * default permissions - anonymous user
                 */
-               $sql = " AND allow_cid = ''
+               $sql = " AND (allow_cid = ''
                         AND allow_gid = ''
                         AND deny_cid  = ''
-                        AND deny_gid  = '' ";
+                        AND deny_gid  = ''" . $acc_sql . ") ";
 
                /*
                 * Profile owner - everything is visible
@@ -93,48 +120,28 @@ class Security extends BaseObject
                if ($local_user && $local_user == $owner_id) {
                        $sql = '';
                /*
-                * Authenticated visitor. Unless pre-verified,
-                * check that the contact belongs to this $owner_id
-                * and load the groups the visitor belongs to.
-                * If pre-verified, the caller is expected to have already
-                * done this and passed the groups into this function.
+                * Authenticated visitor. Load the groups the visitor belongs to.
                 */
-               } elseif ($remote_user) {
-                       $cid = \Friendica\Core\Session::getVisitorContactIDForUserID($owner_id);
-
-                       /*
-                        * Authenticated visitor. Unless pre-verified,
-                        * check that the contact belongs to this $owner_id
-                        * and load the groups the visitor belongs to.
-                        * If pre-verified, the caller is expected to have already
-                        * done this and passed the groups into this function.
-                        */
-
-                       if (!$remote_verified) {
-                               if ($cid && DBA::exists('contact', ['id' => $cid, 'uid' => $owner_id, 'blocked' => false])) {
-                                       $remote_verified = true;
-                                       $groups = Group::getIdsByContactId($cid);
-                               }
-                       }
+               } elseif ($remote_contact) {
+                       $gs = '<<>>'; // should be impossible to match
 
-                       if ($remote_verified) {
-                               $gs = '<<>>'; // should be impossible to match
+                       $groups = Group::getIdsByContactId($remote_contact);
 
-                               if (is_array($groups)) {
-                                       foreach ($groups as $g) {
-                                               $gs .= '|<' . intval($g) . '>';
-                                       }
+                       if (is_array($groups)) {
+                               foreach ($groups as $g) {
+                                       $gs .= '|<' . intval($g) . '>';
                                }
-
-                               $sql = sprintf(
-                                       " AND (NOT (deny_cid REGEXP '<%d>' OR deny_gid REGEXP '%s')
-                                         AND (allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s' OR (allow_cid = '' AND allow_gid = ''))) ",
-                                       intval($cid),
-                                       DBA::escape($gs),
-                                       intval($cid),
-                                       DBA::escape($gs)
-                               );
                        }
+
+                       $sql = sprintf(
+                               " AND (NOT (deny_cid REGEXP '<%d>' OR deny_gid REGEXP '%s')
+                                 AND (allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s'
+                                 OR (allow_cid = '' AND allow_gid = ''))" . $acc_sql . ") ",
+                               intval($remote_contact),
+                               DBA::escape($gs),
+                               intval($remote_contact),
+                               DBA::escape($gs)
+                       );
                }
                return $sql;
        }