use Friendica\Model\Contact;
use Friendica\Model\Conversation;
use Friendica\Model\Event;
-use Friendica\Model\GContact;
+use Friendica\Model\FContact;
use Friendica\Model\Item;
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;
use Friendica\Model\User;
+use Friendica\Model\Verb;
use Friendica\Network\Probe;
use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat;
FROM `item` USE INDEX (`uid_wall_changed`) $sql_post_table
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
WHERE `item`.`uid` = %d AND `item`.`wall` AND `item`.`changed` > '%s'
- AND `item`.`visible` $sql_extra
+ AND `vid` != %d AND `item`.`visible` $sql_extra
ORDER BY `item`.`parent` ".$sort.", `item`.`received` ASC LIMIT 0, 300",
intval($owner_id),
DBA::escape($check_date),
+ Verb::getID(Activity::ANNOUNCE),
DBA::escape($sort)
);
{
$author = $doc->createElement($element);
- $contact = Contact::getDetailsByURL($contact_url, $item["uid"]);
+ $contact = Contact::getByURLForUser($contact_url, $item["uid"], false, ['url', 'name', 'addr', 'photo']);
if (!empty($contact)) {
XML::addElement($doc, $author, "name", $contact["name"]);
XML::addElement($doc, $author, "uri", $contact["url"]);
$dfrnowner = self::addEntryAuthor($doc, "dfrn:owner", $item["owner-link"], $item);
$entry->appendChild($dfrnowner);
- if (($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || (($item['thr-parent'] !== '') && ($item['thr-parent'] !== $item['uri']))) {
+ if ($item['gravity'] != GRAVITY_PARENT) {
$parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']);
$parent = Item::selectFirst(['guid', 'plink'], ['uri' => $parent_item, 'uid' => $item['uid']]);
- $attributes = ["ref" => $parent_item, "type" => "text/html",
- "href" => $parent['plink'],
- "dfrn:diaspora_guid" => $parent['guid']];
- XML::addElement($doc, $entry, "thr:in-reply-to", "", $attributes);
+ if (DBA::isResult($parent)) {
+ $attributes = ["ref" => $parent_item, "type" => "text/html",
+ "href" => $parent['plink'],
+ "dfrn:diaspora_guid" => $parent['guid']];
+ XML::addElement($doc, $entry, "thr:in-reply-to", "", $attributes);
+ }
}
// Add conversation data. This is used for OStatus
Logger::log('dfrn_deliver: ' . $url);
- $curlResult = Network::curl($url);
+ $curlResult = DI::httpRequest()->get($url);
if ($curlResult->isTimeout()) {
return -2; // timed out
}
- Logger::log('dfrn_deliver: ' . "SENDING: " . print_r($postvars, true), Logger::DATA);
+ Logger::debug('dfrn_deliver', ['post' => $postvars]);
- $postResult = Network::post($contact['notify'], $postvars);
+ $postResult = DI::httpRequest()->post($contact['notify'], $postvars);
$xml = $postResult->getBody();
}
}
- $fcontact = Diaspora::personByHandle($contact['addr']);
+ $fcontact = FContact::getByURL($contact['addr']);
if (empty($fcontact)) {
Logger::log('Unable to find contact details for ' . $contact['id'] . ' - ' . $contact['addr']);
return -22;
$content_type = ($public_batch ? "application/magic-envelope+xml" : "application/json");
- $postResult = Network::post($dest_url, $envelope, ["Content-Type: ".$content_type]);
+ $postResult = DI::httpRequest()->post($dest_url, $envelope, ["Content-Type: " . $content_type]);
$xml = $postResult->getBody();
$curl_stat = $postResult->getReturnCode();
$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` != ?",
+ $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);
}
$author["contact-unknown"] = true;
- $author["contact-id"] = $importer["id"];
- $author["network"] = $importer["network"];
+ $contact = Contact::getByURL($author["link"], null, ["id", "network"]);
+ $author["contact-id"] = $contact["id"] ?? $importer["id"];
+ $author["network"] = $contact["network"] ?? $importer["network"];
$onlyfetch = true;
}
if (DBA::isResult($contact_old) && !$onlyfetch) {
Logger::log("Check if contact details for contact " . $contact_old["id"] . " (" . $contact_old["nick"] . ") have to be updated.", Logger::DEBUG);
- $poco = ["url" => $contact_old["url"]];
+ $poco = ["url" => $contact_old["url"], "network" => $contact_old["network"]];
// When was the last change to name or uri?
$name_element = $xpath->query($element . "/atom:name", $context)->item(0);
$condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($contact_old['url'])];
DBA::update('contact', $fields, $condition, true);
- Contact::updateAvatar($author['avatar'], $importer['importer_uid'], $contact['id']);
+ Contact::updateAvatar($contact['id'], $author['avatar']);
$pcid = Contact::getIdForURL($contact_old['url']);
if (!empty($pcid)) {
- Contact::updateAvatar($author['avatar'], 0, $pcid);
+ Contact::updateAvatar($pcid, $author['avatar']);
}
-
- /*
- * The generation is a sign for the reliability of the provided data.
- * It is used in the socgraph.php to prevent that old contact data
- * that was relayed over several servers can overwrite contact
- * data that we received directly.
- */
-
- $poco["generation"] = 2;
- $poco["photo"] = $author["avatar"];
- $poco["hide"] = $hide;
- $poco["contact-type"] = $contact["contact-type"];
- $gcid = GContact::update($poco);
-
- GContact::link($gcid, $importer["importer_uid"], $contact["id"]);
}
return $author;
$msg = [];
$msg["uid"] = $importer["importer_uid"];
- $msg["from-name"] = $xpath->query("dfrn:sender/dfrn:name/text()", $mail)->item(0)->nodeValue;
- $msg["from-url"] = $xpath->query("dfrn:sender/dfrn:uri/text()", $mail)->item(0)->nodeValue;
- $msg["from-photo"] = $xpath->query("dfrn:sender/dfrn:avatar/text()", $mail)->item(0)->nodeValue;
+ $msg["from-name"] = XML::getFirstValue($xpath, "dfrn:sender/dfrn:name/text()", $mail);
+ $msg["from-url"] = XML::getFirstValue($xpath, "dfrn:sender/dfrn:uri/text()", $mail);
+ $msg["from-photo"] = XML::getFirstValue($xpath, "dfrn:sender/dfrn:avatar/text()", $mail);
$msg["contact-id"] = $importer["id"];
- $msg["uri"] = $xpath->query("dfrn:id/text()", $mail)->item(0)->nodeValue;
- $msg["parent-uri"] = $xpath->query("dfrn:in-reply-to/text()", $mail)->item(0)->nodeValue;
- $msg["created"] = DateTimeFormat::utc($xpath->query("dfrn:sentdate/text()", $mail)->item(0)->nodeValue);
- $msg["title"] = $xpath->query("dfrn:subject/text()", $mail)->item(0)->nodeValue;
- $msg["body"] = $xpath->query("dfrn:content/text()", $mail)->item(0)->nodeValue;
+ $msg["uri"] = XML::getFirstValue($xpath, "dfrn:id/text()", $mail);
+ $msg["parent-uri"] = XML::getFirstValue($xpath, "dfrn:in-reply-to/text()", $mail);
+ $msg["created"] = DateTimeFormat::utc(XML::getFirstValue($xpath, "dfrn:sentdate/text()", $mail));
+ $msg["title"] = XML::getFirstValue($xpath, "dfrn:subject/text()", $mail);
+ $msg["body"] = XML::getFirstValue($xpath, "dfrn:content/text()", $mail);
Mail::insert($msg);
}
*/
private static function processSuggestion($xpath, $suggestion, $importer)
{
- Logger::log('Processing suggestions');
-
- /// @TODO Rewrite this to one statement
- $suggest = [];
- $suggest['uid'] = $importer['importer_uid'];
- $suggest['cid'] = $importer['id'];
- $suggest['url'] = $xpath->query('dfrn:url/text()', $suggestion)->item(0)->nodeValue;
- $suggest['name'] = $xpath->query('dfrn:name/text()', $suggestion)->item(0)->nodeValue;
- $suggest['photo'] = $xpath->query('dfrn:photo/text()', $suggestion)->item(0)->nodeValue;
- $suggest['request'] = $xpath->query('dfrn:request/text()', $suggestion)->item(0)->nodeValue;
- $suggest['body'] = $xpath->query('dfrn:note/text()', $suggestion)->item(0)->nodeValue;
-
- // Does our member already have a friend matching this description?
-
- /*
- * The valid result means the friend we're about to send a friend
- * suggestion already has them in their contact, which means no further
- * action is required.
- *
- * @see https://github.com/friendica/friendica/pull/3254#discussion_r107315246
- */
- $condition = ['nurl' => Strings::normaliseLink($suggest['url']), 'uid' => $suggest['uid']];
- if (DBA::exists('contact', $condition)) {
- return false;
- }
- // Do we already have an fcontact record for this person?
-
- $fid = 0;
- $fcontact = DBA::selectFirst('fcontact', ['id'], ['url' => $suggest['url']]);
- if (DBA::isResult($fcontact)) {
- $fid = $fcontact['id'];
-
- // OK, we do. Do we already have an introduction for this person?
- if (DBA::exists('intro', ['uid' => $suggest['uid'], 'fid' => $fid])) {
- /*
- * The valid result means the friend we're about to send a friend
- * suggestion already has them in their contact, which means no further
- * action is required.
- *
- * @see https://github.com/friendica/friendica/pull/3254#discussion_r107315246
- */
- return false;
- }
- }
+ Logger::notice('Processing suggestions');
- if (!$fid) {
- $fields = ['name' => $suggest['name'], 'url' => $suggest['url'],
- 'photo' => $suggest['photo'], 'request' => $suggest['request']];
- DBA::insert('fcontact', $fields);
- $fid = DBA::lastInsertId();
- }
+ $url = $xpath->evaluate('string(dfrn:url[1]/text())', $suggestion);
+ $cid = Contact::getIdForURL($url);
+ $note = $xpath->evaluate('string(dfrn:note[1]/text())', $suggestion);
- /*
- * If no record in fcontact is found, below INSERT statement will not
- * link an introduction to it.
- */
- if (empty($fid)) {
- // Database record did not get created. Quietly give up.
- exit();
- }
-
- $hash = Strings::getRandomHex();
-
- $fields = ['uid' => $suggest['uid'], 'fid' => $fid, 'contact-id' => $suggest['cid'],
- 'note' => $suggest['body'], 'hash' => $hash, 'datetime' => DateTimeFormat::utcNow(), 'blocked' => false];
- DBA::insert('intro', $fields);
-
- notification(
- [
- 'type' => Type::SUGGEST,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $suggest,
- 'link' => DI::baseUrl().'/notifications/intros',
- 'source_name' => $importer['name'],
- 'source_link' => $importer['url'],
- 'source_photo' => $importer['photo'],
- 'verb' => Activity::REQ_FRIEND,
- 'otype' => 'intro']
- );
-
- return true;
+ return FContact::addSuggestion($importer['importer_uid'], $cid, $importer['id'], $note);
}
/**
$old = $r[0];
- // Update the gcontact entry
- $relocate["server_url"] = preg_replace("=(https?://)(.*)/profile/(.*)=ism", "$1$2", $relocate["url"]);
-
- $fields = ['name' => $relocate["name"], 'photo' => $relocate["avatar"],
- 'url' => $relocate["url"], 'nurl' => Strings::normaliseLink($relocate["url"]),
- 'addr' => $relocate["addr"], 'connect' => $relocate["addr"],
- 'notify' => $relocate["notify"], 'server_url' => $relocate["server_url"]];
- DBA::update('gcontact', $fields, ['nurl' => Strings::normaliseLink($old["url"])]);
-
// Update the contact table. We try to find every entry.
$fields = ['name' => $relocate["name"], 'avatar' => $relocate["avatar"],
'url' => $relocate["url"], 'nurl' => Strings::normaliseLink($relocate["url"]),
DBA::update('contact', $fields, $condition);
- Contact::updateAvatar($relocate["avatar"], $importer["importer_uid"], $importer["id"], true);
+ Contact::updateAvatar($importer["id"], $relocate["avatar"], true);
Logger::log('Contacts are updated.');
|| ($item["verb"] == Activity::ATTEND)
|| ($item["verb"] == Activity::ATTENDNO)
|| ($item["verb"] == Activity::ATTENDMAYBE)
+ || ($item["verb"] == Activity::ANNOUNCE)
) {
$is_like = true;
$item["gravity"] = GRAVITY_ACTIVITY;
$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
*
$parts = explode(":", $scheme);
if ((count($parts) >= 4) && (array_shift($parts) == "X-DFRN")) {
$termurl = array_pop($parts);
- $termurl = array_pop($parts) . $termurl;
+ $termurl = array_pop($parts) . ':' . $termurl;
Tag::store($item['uri-id'], Tag::IMPLICIT_MENTION, $term, $termurl);
}
}
}
}
+ // 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);
}
if (in_array($entrytype, [DFRN::REPLY, DFRN::REPLY_RC])) {
+ // Will be overwritten for sharing accounts in Item::insert
+ if (empty($item['post-type']) && ($entrytype == DFRN::REPLY)) {
+ $item['post-type'] = Item::PT_COMMENT;
+ }
+
$posted_id = Item::insert($item);
if ($posted_id) {
Logger::log("Reply from contact ".$item["contact-id"]." was stored with id ".$posted_id, Logger::DEBUG);
* Checks if the given contact url does support DFRN
*
* @param string $url profile url
- * @param boolean $update Update the profile
* @return boolean
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public static function isSupportedByContactUrl($url, $update = false)
+ public static function isSupportedByContactUrl($url)
{
- $probe = Probe::uri($url, Protocol::DFRN, 0, !$update);
+ $probe = Probe::uri($url, Protocol::DFRN);
return $probe['network'] == Protocol::DFRN;
}
}