]> git.mxchange.org Git - friendica.git/commitdiff
Added processing of incoming block notices
authorMichael <heluecht@pirati.ca>
Tue, 5 Apr 2022 19:14:29 +0000 (19:14 +0000)
committerMichael <heluecht@pirati.ca>
Tue, 5 Apr 2022 19:14:29 +0000 (19:14 +0000)
database.sql
doc/database/db_user-contact.md
src/Model/Contact/User.php
src/Protocol/ActivityPub/Processor.php
src/Protocol/ActivityPub/Receiver.php
static/dbstructure.config.php

index b986cc409f9df08edc702acd2d22a845796f0b61..1f35cd0573cb40bc93a7a7e746d587a79cd3f46d 100644 (file)
@@ -1,6 +1,6 @@
 -- ------------------------------------------
 -- Friendica 2022.05-dev (Siberian Iris)
--- DB_UPDATE_VERSION 1454
+-- DB_UPDATE_VERSION 1455
 -- ------------------------------------------
 
 
@@ -1526,6 +1526,7 @@ CREATE TABLE IF NOT EXISTS `user-contact` (
        `ignored` boolean COMMENT 'Posts from this contact are ignored',
        `collapsed` boolean COMMENT 'Posts from this contact are collapsed',
        `hidden` boolean COMMENT 'This contact is hidden from the others',
+       `is-blocked` boolean COMMENT 'User is blocked by this contact',
        `pending` boolean COMMENT '',
        `rel` tinyint unsigned COMMENT 'The kind of the relation between the user and the contact',
        `info` mediumtext COMMENT '',
index 2cd910bb059399a46ae1853e64dea34de5b1d794..30c80c5261034dc050b17b026bb69bd6079851ef 100644 (file)
@@ -15,6 +15,7 @@ Fields
 | ignored                   | Posts from this contact are ignored                          | boolean            | YES  |     | NULL    |       |
 | collapsed                 | Posts from this contact are collapsed                        | boolean            | YES  |     | NULL    |       |
 | hidden                    | This contact is hidden from the others                       | boolean            | YES  |     | NULL    |       |
+| is-blocked                | User is blocked by this contact                              | boolean            | YES  |     | NULL    |       |
 | pending                   |                                                              | boolean            | YES  |     | NULL    |       |
 | rel                       | The kind of the relation between the user and the contact    | tinyint unsigned   | YES  |     | NULL    |       |
 | info                      |                                                              | mediumtext         | YES  |     | NULL    |       |
index c39b1302a485e973d608503887d1c5f9b25e3ff5..665b95624dd477dc7c84eee76a300f341d396c87 100644 (file)
@@ -311,4 +311,48 @@ class User
 
                return $collapsed;
        }
+
+       /**
+        * Set/Release that the user is blocked by the contact
+        *
+        * @param int     $cid     Either public contact id or user's contact id
+        * @param int     $uid     User ID
+        * @param boolean $blocked Is the user blocked or unblocked by the contact?
+        * @throws \Exception
+        */
+       public static function setIsBlocked($cid, $uid, $blocked)
+       {
+               $cdata = Contact::getPublicAndUserContactID($cid, $uid);
+               if (empty($cdata)) {
+                       return;
+               }
+
+               DBA::update('user-contact', ['is-blocked' => $blocked], ['cid' => $cdata['public'], 'uid' => $uid], true);
+       }
+
+       /**
+        * Returns if the user is blocked by the contact
+        *
+        * @param int $cid Either public contact id or user's contact id
+        * @param int $uid User ID
+        *
+        * @return boolean Is the user blocked or unblocked by the contact?
+        * @throws \Exception
+        */
+       public static function isIsBlocked($cid, $uid)
+       {
+               $cdata = Contact::getPublicAndUserContactID($cid, $uid);
+               if (empty($cdata)) {
+                       return false;
+               }
+
+               if (!empty($cdata['public'])) {
+                       $public_contact = DBA::selectFirst('user-contact', ['is-blocked'], ['cid' => $cdata['public'], 'uid' => $uid]);
+                       if (DBA::isResult($public_contact)) {
+                               return $public_contact['is-blocked'];
+                       }
+               }
+
+               return false;
+       }
 }
index 5caef7745eae7e9dc294efb126f0641ffd10eebb..89d7604bb40e10744812aeb5fbbb8beb7c6cfad4 100644 (file)
@@ -1206,6 +1206,52 @@ class Processor
                Logger::info('Deleted contact', ['object' => $activity['object_id']]);
        }
 
+       /**
+        * Blocks the user by the contact
+        *
+        * @param array $activity
+        * @throws \Exception
+        */
+       public static function blockPerson($activity)
+       {
+               $cid = Contact::getIdForURL($activity['actor']);
+               if (empty($cid)) {
+                       return;
+               }
+
+               $uid = User::getIdForURL($activity['object_id']);
+               if (empty($uid)) {
+                       return;                 
+               }
+
+               Contact\User::setIsBlocked($cid, $uid, true);
+
+               Logger::info('Contact blocked user', ['contact' => $cid, 'user' => $uid]);
+       }
+
+       /**
+        * Unblocks the user by the contact
+        *
+        * @param array $activity
+        * @throws \Exception
+        */
+       public static function unblockPerson($activity)
+       {
+               $cid = Contact::getIdForURL($activity['actor']);
+               if (empty($cid)) {
+                       return;
+               }
+
+               $uid = User::getIdForURL($activity['object_object']);
+               if (empty($uid)) {
+                       return;                 
+               }
+
+               Contact\User::setIsBlocked($cid, $uid, false);
+
+               Logger::info('Contact unblocked user', ['contact' => $cid, 'user' => $uid]);
+       }
+
        /**
         * Accept a follow request
         *
index 80bba0b0b9e8070e070715c537df4be1026ea393..53cab9aafd368cd75341712af3d59acf0d824dcc 100644 (file)
@@ -670,8 +670,7 @@ class Receiver
 
                        case 'as:Block':
                                if (in_array($object_data['object_type'], self::ACCOUNT_TYPES)) {
-                                       // Used by Mastodon to announce that the sender has blocked the account
-                                       self::storeUnhandledActivity(false, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer);
+                                       ActivityPub\Processor::blockPerson($object_data);
                                } else {
                                        self::storeUnhandledActivity(true, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer);
                                }
@@ -728,6 +727,9 @@ class Receiver
                                } elseif (($object_data['object_type'] == 'as:Accept') &&
                                        in_array($object_data['object_object_type'], self::ACCOUNT_TYPES)) {
                                        ActivityPub\Processor::rejectFollowUser($object_data);
+                               } elseif (($object_data['object_type'] == 'as:Block') &&
+                                       in_array($object_data['object_object_type'], self::ACCOUNT_TYPES)) {
+                                       ActivityPub\Processor::unblockPerson($object_data);
                                } elseif (in_array($object_data['object_type'], array_merge(self::ACTIVITY_TYPES, ['as:Announce'])) &&
                                        in_array($object_data['object_object_type'], array_merge(['as:Tombstone'], self::CONTENT_TYPES))) {
                                        ActivityPub\Processor::undoActivity($object_data);
index 36c9ca3e0a3767afcdccf57baf50e32410c8468c..95daab46494d9570d61083d8357f46df624fcaa8 100644 (file)
@@ -55,7 +55,7 @@
 use Friendica\Database\DBA;
 
 if (!defined('DB_UPDATE_VERSION')) {
-       define('DB_UPDATE_VERSION', 1454);
+       define('DB_UPDATE_VERSION', 1455);
 }
 
 return [
@@ -1544,6 +1544,7 @@ return [
                        "ignored" => ["type" => "boolean", "comment" => "Posts from this contact are ignored"],
                        "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"],
                        "hidden" => ["type" => "boolean", "comment" => "This contact is hidden from the others"],
+                       "is-blocked" => ["type" => "boolean", "comment" => "User is blocked by this contact"],
                        "pending" => ["type" => "boolean", "comment" => ""],
                        "rel" => ["type" => "tinyint unsigned", "comment" => "The kind of the relation between the user and the contact"],
                        "info" => ["type" => "mediumtext", "comment" => ""],