]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/DFRN.php
Fix: Posts sent to forums had been rejected
[friendica.git] / src / Protocol / DFRN.php
index cfbf12c784e79b5593016223c396d98411df4c25..b6f7f1cb2b0cdc670b615059a01b7ee541a5b669 100644 (file)
@@ -39,6 +39,7 @@ use Friendica\Model\ItemURI;
 use Friendica\Model\Mail;
 use Friendica\Model\Notify\Type;
 use Friendica\Model\PermissionSet;
+use Friendica\Model\Post;
 use Friendica\Model\Post\Category;
 use Friendica\Model\Profile;
 use Friendica\Model\Tag;
@@ -1499,15 +1500,20 @@ class DFRN
 
                $fields = ['id', 'uid', 'url', 'network', 'avatar-date', 'avatar', 'name-date', 'uri-date', 'addr',
                        'name', 'nick', 'about', 'location', 'keywords', 'xmpp', 'bdyear', 'bd', 'hidden', 'contact-type'];
-               $condition = ["`uid` = ? AND `nurl` = ? AND `network` != ? AND NOT `pending` AND NOT `blocked` AND `rel` IN (?, ?)",
-                       $importer["importer_uid"], Strings::normaliseLink($author["link"]), Protocol::STATUSNET,
-                       Contact::SHARING, Contact::FRIEND];
+               $condition = ["`uid` = ? AND `nurl` = ? AND `network` != ? AND NOT `pending` AND NOT `blocked`",
+                       $importer["importer_uid"], Strings::normaliseLink($author["link"]), Protocol::STATUSNET];
+
+               if ($importer['account-type'] != User::ACCOUNT_TYPE_COMMUNITY) {
+                       $condition = DBA::mergeConditions($condition, ['rel' => [Contact::SHARING, Contact::FRIEND]]);
+               }
+
                $contact_old = DBA::selectFirst('contact', $fields, $condition);
 
                if (DBA::isResult($contact_old)) {
                        $author["contact-id"] = $contact_old["id"];
                        $author["network"] = $contact_old["network"];
                } else {
+                       Logger::info('Blubb', ['condition' => $condition]);
                        if (!$onlyfetch) {
                                Logger::debug("Contact ".$author["link"]." wasn't found for user ".$importer["importer_uid"]." XML: ".$xml);
                        }
@@ -1795,9 +1801,9 @@ class DFRN
        {
                Logger::notice('Processing suggestions');
 
-               $url = $xpath->query('dfrn:url/text()', $suggestion)->item(0)->nodeValue;
+               $url = $xpath->evaluate('string(dfrn:url[1]/text())', $suggestion);
                $cid = Contact::getIdForURL($url);
-               $note = $xpath->query('dfrn:note/text()', $suggestion)->item(0)->nodeValue;
+               $note = $xpath->evaluate('string(dfrn:note[1]/text())', $suggestion);
 
                return FContact::addSuggestion($importer['importer_uid'], $cid, $importer['id'], $note);
        }
@@ -2176,13 +2182,32 @@ class DFRN
                                                        $item["attach"] = "";
                                                }
 
-                                               $item["attach"] .= '[attach]href="' . $href . '" length="' . $length . '" type="' . $type . '" title="' . $title . '"[/attach]';
+                                               $item["attach"] .= Post\Media::getAttachElement($href, $length, $type, $title);
                                                break;
                                }
                        }
                }
        }
 
+       /**
+        * Checks if an incoming message is wanted
+        *
+        * @param array $item
+        * @return boolean Is the message wanted?
+        */
+       private static function isSolicitedMessage(array $item)
+       {
+               if (DBA::exists('contact', ["`nurl` = ? AND `uid` != ? AND `rel` IN (?, ?)",
+                       Strings::normaliseLink($item["author-link"]), 0, Contact::FRIEND, Contact::SHARING])) {
+                       Logger::info('Author has got followers - accepted', ['uri' => $item['uri'], 'author' => $item["author-link"]]);
+                       return true;
+               }
+
+               $taglist = Tag::getByURIId($item['uri-id'], [Tag::HASHTAG]);
+               $tags = array_column($taglist, 'name');
+               return Relay::isSolicitedPost($tags, $item['body'], $item['author-id'], $item['uri'], Protocol::DFRN);
+       }
+
        /**
         * Processes the entry elements which contain the items and comments
         *
@@ -2372,6 +2397,14 @@ class DFRN
                        }
                }
 
+               // Check if the message is wanted
+               if (($importer["importer_uid"] == 0) && ($item['uri'] == $item['parent-uri'])) {
+                       if (!self::isSolicitedMessage($item)) {
+                               DBA::delete('item-uri', ['uri' => $item['uri']]);
+                               return 403;
+                       }
+               }
+                               
                // Get the type of the item (Top level post, reply or remote reply)
                $entrytype = self::getEntryType($importer, $item);