]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/Diaspora.php
Restrict the access for servers that the user ignored
[friendica.git] / src / Protocol / Diaspora.php
index 4549ba643f88023ebcbf17aebf6d97a8b01868f9..59918287abfc7bd8817093d7249e6ad9bc9f6449 100644 (file)
@@ -42,7 +42,6 @@ use Friendica\Model\Tag;
 use Friendica\Model\User;
 use Friendica\Network\HTTPClient\Client\HttpClientAccept;
 use Friendica\Network\HTTPException;
-use Friendica\Network\HTTPException\BadRequestException;
 use Friendica\Network\Probe;
 use Friendica\Protocol\Delivery;
 use Friendica\Util\Crypto;
@@ -268,7 +267,7 @@ class Diaspora
                                if ($no_exit) {
                                        return false;
                                } else {
-                                       throw new BadRequestException();
+                                       throw new HTTPException\BadRequestException();
                                }
                        }
                } else {
@@ -282,7 +281,7 @@ class Diaspora
                        if ($no_exit) {
                                return false;
                        } else {
-                               throw new BadRequestException();
+                               throw new HTTPException\BadRequestException();
                        }
                }
 
@@ -308,7 +307,7 @@ class Diaspora
                        if ($no_exit) {
                                return false;
                        } else {
-                               throw new BadRequestException();
+                               throw new HTTPException\BadRequestException();
                        }
                }
 
@@ -323,7 +322,7 @@ class Diaspora
                        if ($no_exit) {
                                return false;
                        } else {
-                               throw new BadRequestException();
+                               throw new HTTPException\BadRequestException();
                        }
                }
 
@@ -333,7 +332,7 @@ class Diaspora
                        if ($no_exit) {
                                return false;
                        } else {
-                               throw new BadRequestException();
+                               throw new HTTPException\BadRequestException();
                        }
                }
 
@@ -425,7 +424,7 @@ class Diaspora
 
                if (!$base) {
                        Logger::notice('unable to locate salmon data in xml');
-                       throw new BadRequestException();
+                       throw new HTTPException\BadRequestException();
                }
 
 
@@ -465,14 +464,14 @@ class Diaspora
                $key = self::key($author);
                if (!$key) {
                        Logger::notice('Could not retrieve author key.');
-                       throw new BadRequestException();
+                       throw new HTTPException\BadRequestException();
                }
 
                $verify = Crypto::rsaVerify($signed_data, $signature, $key);
 
                if (!$verify) {
                        Logger::notice('Message did not verify. Discarding.');
-                       throw new BadRequestException();
+                       throw new HTTPException\BadRequestException();
                }
 
                Logger::info('Message verified.');
@@ -797,7 +796,7 @@ class Diaspora
         */
        private static function key(WebFingerUri $uri): string
        {
-               Logger::info('Fetching diaspora key', ['handle' => $uri->getAddr(), 'callstack' => System::callstack(20)]);
+               Logger::info('Fetching diaspora key', ['handle' => $uri->getAddr()]);
                try {
                        return DI::dsprContact()->getByAddr($uri)->pubKey;
                } catch (HTTPException\NotFoundException | \InvalidArgumentException $e) {
@@ -1193,6 +1192,7 @@ class Diaspora
        {
                $fields = [
                        'id', 'parent', 'body', 'wall', 'uri', 'guid', 'private', 'origin',
+                       'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
                        'author-name', 'author-link', 'author-avatar', 'gravity',
                        'owner-name', 'owner-link', 'owner-avatar'
                ];
@@ -1568,6 +1568,12 @@ class Diaspora
                $datarray['verb'] = Activity::POST;
                $datarray['gravity'] = Item::GRAVITY_COMMENT;
 
+               $datarray['private']   = $toplevel_parent_item['private'];
+               $datarray['allow_cid'] = $toplevel_parent_item['allow_cid'];
+               $datarray['allow_gid'] = $toplevel_parent_item['allow_gid'];
+               $datarray['deny_cid']  = $toplevel_parent_item['deny_cid'];
+               $datarray['deny_gid']  = $toplevel_parent_item['deny_gid'];
+
                $datarray['thr-parent'] = $thr_parent ?: $toplevel_parent_item['uri'];
 
                $datarray['object-type'] = Activity\ObjectType::COMMENT;
@@ -1824,6 +1830,13 @@ class Diaspora
 
                $datarray['verb'] = $verb;
                $datarray['gravity'] = Item::GRAVITY_ACTIVITY;
+
+               $datarray['private']   = $toplevel_parent_item['private'];
+               $datarray['allow_cid'] = $toplevel_parent_item['allow_cid'];
+               $datarray['allow_gid'] = $toplevel_parent_item['allow_gid'];
+               $datarray['deny_cid']  = $toplevel_parent_item['deny_cid'];
+               $datarray['deny_gid']  = $toplevel_parent_item['deny_gid'];
+
                $datarray['thr-parent'] = $toplevel_parent_item['uri'];
 
                $datarray['object-type'] = Activity\ObjectType::NOTE;
@@ -2655,7 +2668,7 @@ class Diaspora
 
                $datarray = [
                        'guid'        => $guid,
-                       'uri-id'      => ItemURI::insert(['uri' => $guid, 'guid' => $guid]),
+                       'plink'       => self::plink($author, $guid),
                        'uid'         => $importer['uid'],
                        'contact-id'  => $contact['id'],
                        'network'     => Protocol::DIASPORA,
@@ -2673,9 +2686,12 @@ class Diaspora
                        'post-type'   => Item::PT_NOTE,
                ];
 
-               $datarray['guid'] = $guid;
-               $datarray['uri'] = $datarray['thr-parent'] = self::getUriFromGuid($guid, $author);
-               $datarray['uri-id'] = ItemURI::insert(['uri' => $datarray['uri'], 'guid' => $datarray['guid']]);
+               $datarray['uri']        = $datarray['thr-parent'] = self::getUriFromGuid($guid, $author);
+               $datarray['uri-id']     = ItemURI::insert(['uri' => $datarray['uri'], 'guid' => $datarray['guid']]);
+               $datarray['owner-link'] = $datarray['author-link'];
+               $datarray['owner-id']   = $datarray['author-id'];
+
+               $datarray = self::setDirection($datarray, $direction);
 
                // Attach embedded pictures to the body
                if ($data->photo) {
@@ -2686,7 +2702,6 @@ class Diaspora
                        $datarray['object-type'] = Activity\ObjectType::IMAGE;
                        $datarray['post-type'] = Item::PT_IMAGE;
                } elseif ($data->poll) {
-                       $datarray['object-type'] = Activity\ObjectType::NOTE;
                        $datarray['post-type'] = Item::PT_POLL;
                }
 
@@ -2711,7 +2726,6 @@ class Diaspora
                        $datarray['app'] = $provider_display_name;
                }
 
-               $datarray['plink'] = self::plink($author, $guid);
                $datarray['changed'] = $datarray['created'] = $datarray['edited'] = $created_at;
 
                if (isset($address['address'])) {
@@ -3022,7 +3036,7 @@ class Diaspora
                        // The "addr" field should always be filled.
                        // If this isn't the case, it will raise a notice some lines later.
                        // And in the log we will see where it came from, and we can handle it there.
-                       Logger::notice('Empty addr', ['contact' => $contact ?? [], 'callstack' => System::callstack(20)]);
+                       Logger::notice('Empty addr', ['contact' => $contact ?? []]);
                }
 
                $envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $pubkey ?? '', $public_batch);
@@ -3062,10 +3076,7 @@ class Diaspora
                // If the item belongs to a user, we take this user id.
                if ($item['uid'] == 0) {
                        // @todo Possibly use an administrator account?
-                       $condition = [
-                               'verified' => true, 'blocked' => false,
-                               'account_removed' => false, 'account_expired' => false, 'account-type' => User::ACCOUNT_TYPE_PERSON
-                       ];
+                       $condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false, 'account-type' => User::ACCOUNT_TYPE_PERSON];
                        $first_user = DBA::selectFirst('user', ['uid'], $condition, ['order' => ['uid']]);
                        $owner = User::getOwnerDataById($first_user['uid']);
                } else {
@@ -3392,7 +3403,8 @@ class Diaspora
                        if ($item['event-id'] > 0) {
                                $event = self::buildEvent($item['event-id']);
                                if (count($event)) {
-                                       $message['event'] = $event;
+                                       // Deactivated, since Diaspora seems to have problems with the processing.
+                                       // $message['event'] = $event;
 
                                        if (
                                                !empty($event['location']['address']) &&
@@ -3873,7 +3885,7 @@ class Diaspora
         */
        private static function createProfileData(int $uid): array
        {
-               $profile = DBA::selectFirst('owner-view', ['uid', 'addr', 'name', 'location', 'net-publish', 'dob', 'about', 'pub_keywords'], ['uid' => $uid]);
+               $profile = DBA::selectFirst('owner-view', ['uid', 'addr', 'name', 'location', 'net-publish', 'dob', 'about', 'pub_keywords', 'updated'], ['uid' => $uid]);
 
                if (!DBA::isResult($profile)) {
                        return [];
@@ -3883,17 +3895,21 @@ class Diaspora
 
                $data = [
                        'author'           => $profile['addr'],
+                       'edited_at'        => DateTimeFormat::utc($profile['updated']),
+                       'full_name'        => $profile['name'],
                        'first_name'       => $split_name['first'],
                        'last_name'        => $split_name['last'],
                        'image_url'        => DI::baseUrl() . '/photo/custom/300/' . $profile['uid'] . '.jpg',
                        'image_url_medium' => DI::baseUrl() . '/photo/custom/100/' . $profile['uid'] . '.jpg',
                        'image_url_small'  => DI::baseUrl() . '/photo/custom/50/'  . $profile['uid'] . '.jpg',
-                       'searchable'       => ($profile['net-publish'] ? 'true' : 'false'),
+                       'bio'              => null,
                        'birthday'         => null,
-                       'about'            => null,
+                       'gender'           => null,
                        'location'         => null,
-                       'tag_string'       => null,
+                       'searchable'       => ($profile['net-publish'] ? 'true' : 'false'),
+                       'public'           => 'false',
                        'nsfw'             => 'false',
+                       'tag_string'       => null,
                ];
 
                if ($data['searchable'] === 'true') {
@@ -3907,7 +3923,7 @@ class Diaspora
                                $data['birthday'] = DateTimeFormat::utc($year . '-' . $month . '-' . $day, 'Y-m-d');
                        }
 
-                       $data['about'] = BBCode::toMarkdown($profile['about'] ?? '');
+                       $data['bio'] = BBCode::toMarkdown($profile['about'] ?? '');
 
                        $data['location'] = $profile['location'];
                        $data['tag_string'] = '';
@@ -3966,8 +3982,10 @@ class Diaspora
 
                // @todo Split this into single worker jobs
                foreach ($recipients as $recipient) {
-                       Logger::info('Send updated profile data for user ' . $uid . ' to contact ' . $recipient['id']);
-                       self::buildAndTransmit($owner, $recipient, 'profile', $message);
+                       if ((empty($recipient['gsid']) || GServer::isReachableById($recipient['gsid'])) && !Contact\User::isBlocked($recipient['id'], $uid)) {
+                               Logger::info('Send updated profile data for user ' . $uid . ' to contact ' . $recipient['id']);
+                               self::buildAndTransmit($owner, $recipient, 'profile', $message);
+                       }
                }
        }