X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FDFRN.php;h=125d41fe654c74e6b5e307a0aab452d3e6245760;hb=fc4d1296e3a4d61a78438c94ad1216cd8b642027;hp=bffcb2086fb328e99c767cc021abeec1c0a9554e;hpb=4e9236e9e999a19d5346d8d19088b167f8e42e09;p=friendica.git diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index bffcb2086f..125d41fe65 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -63,7 +63,7 @@ class DFRN * @param array $owner Owner record * * @return string DFRN entries - * @todo Add type-hints + * @todo Find proper type-hints */ public static function entries($items, $owner) { @@ -120,8 +120,6 @@ class DFRN } } - - // default permissions - anonymous user $sql_extra = " AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' "; @@ -134,6 +132,7 @@ class DFRN ); if (! DBM::is_result($r)) { + logger(sprintf('No contact found for nickname=%d', $owner_nick), LOGGER_WARNING); killme(); } @@ -169,6 +168,7 @@ class DFRN ); if (! DBM::is_result($r)) { + logger(sprintf('No contact found for uid=%d', $owner_id), LOGGER_WARNING); killme(); } @@ -177,8 +177,10 @@ class DFRN $groups = Group::getIdsByContactId($contact['id']); if (count($groups)) { - for ($x = 0; $x < count($groups); $x ++) + for ($x = 0; $x < count($groups); $x ++) { $groups[$x] = '<' . intval($groups[$x]) . '>' ; + } + $gs = implode('|', $groups); } else { $gs = '<<>>' ; // Impossible to match @@ -397,7 +399,7 @@ class DFRN * @param array $owner Owner record * * @return string DFRN mail - * @todo Add type-hints + * @todo Find proper type-hints */ public static function mail($item, $owner) { @@ -433,7 +435,7 @@ class DFRN * @param array $owner Owner record * * @return string DFRN suggestions - * @todo Add type-hints + * @todo Find proper type-hints */ public static function fsuggest($item, $owner) { @@ -462,7 +464,7 @@ class DFRN * @param int $uid User ID * * @return string DFRN relocations - * @todo Add type-hints + * @todo Find proper type-hints */ public static function relocate($owner, $uid) { @@ -524,7 +526,7 @@ class DFRN * @param bool $public Is it a header for public posts? * * @return object XML root object - * @todo Add type-hints + * @todo Find proper type-hints */ private static function addHeader($doc, $owner, $authorelement, $alternatelink = "", $public = false) { @@ -600,7 +602,7 @@ class DFRN * @param boolean $public boolean * * @return object XML author object - * @todo Add type-hints + * @todo Find proper type-hints */ private static function addAuthor($doc, $owner, $authorelement, $public) { @@ -744,7 +746,7 @@ class DFRN * @param array $item Item elements * * @return object XML author object - * @todo Add type-hints + * @todo Find proper type-hints */ private static function addEntryAuthor($doc, $element, $contact_url, $item) { @@ -785,7 +787,7 @@ class DFRN * @param string $activity activity value * * @return object XML activity object - * @todo Add type-hints + * @todo Find proper type-hints */ private static function createActivity($doc, $element, $activity) { @@ -796,12 +798,15 @@ class DFRN if (!$r) { return false; } + if ($r->type) { XML::addElement($doc, $entry, "activity:object-type", $r->type); } + if ($r->id) { XML::addElement($doc, $entry, "id", $r->id); } + if ($r->title) { XML::addElement($doc, $entry, "title", $r->title); } @@ -848,7 +853,7 @@ class DFRN * @param array $item Item element * * @return object XML attachment object - * @todo Add type-hints + * @todo Find proper type-hints */ private static function getAttachment($doc, $root, $item) { @@ -888,7 +893,7 @@ class DFRN * @param bool $single If set, the entry is created as an XML document with a single "entry" element * * @return object XML entry object - * @todo Add type-hints + * @todo Find proper type-hints */ private static function entry($doc, $type, $item, $owner, $comment = false, $cid = 0, $single = false) { @@ -1197,6 +1202,7 @@ class DFRN $ret = Network::curl($url); if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { + Contact::markForArchival($contact); return -2; // timed out } @@ -1204,24 +1210,28 @@ class DFRN $curl_stat = $a->get_curl_code(); if (empty($curl_stat)) { + Contact::markForArchival($contact); return -3; // timed out } logger('dfrn_deliver: ' . $xml, LOGGER_DATA); if (empty($xml)) { + Contact::markForArchival($contact); return 3; } if (strpos($xml, 'status) != 0) || (! strlen($res->challenge)) || (! strlen($res->dfrn_id))) { + if ((intval($res->status) != 0) || !strlen($res->challenge) || !strlen($res->dfrn_id)) { + Contact::markForArchival($contact); return ($res->status ? $res->status : 3); } @@ -1274,6 +1284,7 @@ class DFRN if ($final_dfrn_id != $orig_id) { logger('dfrn_deliver: wrong dfrn_id.'); // did not decode properly - cannot trust this site + Contact::markForArchival($contact); return 3; } @@ -1283,7 +1294,6 @@ class DFRN $postvars['dissolve'] = '1'; } - if ((($contact['rel']) && ($contact['rel'] != CONTACT_IS_SHARING) && (! $contact['blocked'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) { $postvars['data'] = $atom; $postvars['perm'] = 'rw'; @@ -1309,6 +1319,7 @@ class DFRN break; default: logger("rino: invalid requested version '$rino_remote_version'"); + Contact::markForArchival($contact); return -8; } @@ -1346,22 +1357,26 @@ class DFRN $curl_stat = $a->get_curl_code(); if (empty($curl_stat) || empty($xml)) { + Contact::markForArchival($contact); return -9; // timed out } if (($curl_stat == 503) && stristr($a->get_curl_headers(), 'retry-after')) { + Contact::markForArchival($contact); return -10; } if (strpos($xml, 'status)) { + Contact::markForArchival($contact); return -11; } @@ -1374,7 +1389,7 @@ class DFRN logger('Delivery returned status '.$res->status.' - '.$res->message, LOGGER_DEBUG); } - if ($res->status == 200) { + if (($res->status >= 200) && ($res->status <= 299)) { Contact::unmarkForArchival($contact); } @@ -1394,26 +1409,33 @@ class DFRN { $a = get_app(); - if (empty($contact['addr'])) { - logger('Empty contact handle for ' . $contact['id'] . ' - ' . $contact['url'] . ' - trying to update it.'); - if (Contact::updateFromProbe($contact['id'])) { - $new_contact = dba::selectFirst('contact', ['addr'], ['id' => $contact['id']]); - $contact['addr'] = $new_contact['addr']; - } - + if (!$public_batch) { if (empty($contact['addr'])) { - logger('Unable to find contact handle for ' . $contact['id'] . ' - ' . $contact['url']); - return -21; + logger('Empty contact handle for ' . $contact['id'] . ' - ' . $contact['url'] . ' - trying to update it.'); + if (Contact::updateFromProbe($contact['id'])) { + $new_contact = dba::selectFirst('contact', ['addr'], ['id' => $contact['id']]); + $contact['addr'] = $new_contact['addr']; + } + + if (empty($contact['addr'])) { + logger('Unable to find contact handle for ' . $contact['id'] . ' - ' . $contact['url']); + Contact::markForArchival($contact); + return -21; + } } - } - $fcontact = Diaspora::personByHandle($contact['addr']); - if (empty($fcontact)) { - logger('Unable to find contact details for ' . $contact['id'] . ' - ' . $contact['addr']); - return -22; + $fcontact = Diaspora::personByHandle($contact['addr']); + if (empty($fcontact)) { + logger('Unable to find contact details for ' . $contact['id'] . ' - ' . $contact['addr']); + Contact::markForArchival($contact); + return -22; + } + $pubkey = $fcontact['pubkey']; + } else { + $pubkey = ''; } - $envelope = Diaspora::buildMessage($atom, $owner, $contact, $owner['uprvkey'], $fcontact['pubkey'], $public_batch); + $envelope = Diaspora::buildMessage($atom, $owner, $contact, $owner['uprvkey'], $pubkey, $public_batch); // Create the endpoint for public posts. This is some WIP and should later be added to the probing if ($public_batch && empty($contact["batch"])) { @@ -1433,22 +1455,26 @@ class DFRN $curl_stat = $a->get_curl_code(); if (empty($curl_stat) || empty($xml)) { logger('Empty answer from ' . $contact['id'] . ' - ' . $dest_url); + Contact::markForArchival($contact); return -9; // timed out } if (($curl_stat == 503) && (stristr($a->get_curl_headers(), 'retry-after'))) { + Contact::markForArchival($contact); return -10; } if (strpos($xml, 'status)) { + Contact::markForArchival($contact); return -23; } @@ -1456,7 +1482,7 @@ class DFRN logger('Transmit to ' . $dest_url . ' returned status '.$res->status.' - '.$res->message, LOGGER_DEBUG); } - if ($res->status == 200) { + if (($res->status >= 200) && ($res->status <= 299)) { Contact::unmarkForArchival($contact); } @@ -1554,7 +1580,7 @@ class DFRN $href = ""; $width = 0; foreach ($avatar->attributes as $attributes) { - /// @TODO Rewrite these similar if () to one switch + /// @TODO Rewrite these similar if() to one switch if ($attributes->name == "href") { $href = $attributes->textContent; } @@ -2056,94 +2082,31 @@ class DFRN // Update the gcontact entry $relocate["server_url"] = preg_replace("=(https?://)(.*)/profile/(.*)=ism", "$1$2", $relocate["url"]); - $x = q( - "UPDATE `gcontact` SET - `name` = '%s', - `photo` = '%s', - `url` = '%s', - `nurl` = '%s', - `addr` = '%s', - `connect` = '%s', - `notify` = '%s', - `server_url` = '%s' - WHERE `nurl` = '%s';", - dbesc($relocate["name"]), - dbesc($relocate["avatar"]), - dbesc($relocate["url"]), - dbesc(normalise_link($relocate["url"])), - dbesc($relocate["addr"]), - dbesc($relocate["addr"]), - dbesc($relocate["notify"]), - dbesc($relocate["server_url"]), - dbesc(normalise_link($old["url"])) - ); + $fields = ['name' => $relocate["name"], 'photo' => $relocate["avatar"], + 'url' => $relocate["url"], 'nurl' => normalise_link($relocate["url"]), + 'addr' => $relocate["addr"], 'connect' => $relocate["addr"], + 'notify' => $relocate["notify"], 'server_url' => $relocate["server_url"]]; + dba::update('gcontact', $fields, ['nurl' => normalise_link($old["url"])]); // Update the contact table. We try to find every entry. - $x = q( - "UPDATE `contact` SET - `name` = '%s', - `avatar` = '%s', - `url` = '%s', - `nurl` = '%s', - `addr` = '%s', - `request` = '%s', - `confirm` = '%s', - `notify` = '%s', - `poll` = '%s', - `site-pubkey` = '%s' - WHERE (`id` = %d AND `uid` = %d) OR (`nurl` = '%s');", - dbesc($relocate["name"]), - dbesc($relocate["avatar"]), - dbesc($relocate["url"]), - dbesc(normalise_link($relocate["url"])), - dbesc($relocate["addr"]), - dbesc($relocate["request"]), - dbesc($relocate["confirm"]), - dbesc($relocate["notify"]), - dbesc($relocate["poll"]), - dbesc($relocate["sitepubkey"]), - intval($importer["id"]), - intval($importer["importer_uid"]), - dbesc(normalise_link($old["url"])) - ); + $fields = ['name' => $relocate["name"], 'avatar' => $relocate["avatar"], + 'url' => $relocate["url"], 'nurl' => normalise_link($relocate["url"]), + 'addr' => $relocate["addr"], 'request' => $relocate["request"], + 'confirm' => $relocate["confirm"], 'notify' => $relocate["notify"], + 'poll' => $relocate["poll"], 'site-pubkey' => $relocate["sitepubkey"]]; + $condition = ["(`id` = ?) OR (`nurl` = ?)", $importer["id"], normalise_link($old["url"])]; + dba::update('contact', $fields, $condition); Contact::updateAvatar($relocate["avatar"], $importer["importer_uid"], $importer["id"], true); - if ($x === false) { - return false; - } + logger('Contacts are updated.'); // update items - /// @todo This is an extreme performance killer - $fields = [ - 'owner-link' => [$old["url"], $relocate["url"]], - 'author-link' => [$old["url"], $relocate["url"]], - //'owner-avatar' => array($old["photo"], $relocate["photo"]), - //'author-avatar' => array($old["photo"], $relocate["photo"]), - ]; - foreach ($fields as $n => $f) { - $r = q( - "SELECT `id` FROM `item` WHERE `%s` = '%s' AND `uid` = %d LIMIT 1", - $n, - dbesc($f[0]), - intval($importer["importer_uid"]) - ); + // This is an extreme performance killer + Item::update(['owner-link' => $relocate["url"]], ['owner-link' => $old["url"], 'uid' => $importer["importer_uid"]]); + Item::update(['author-link' => $relocate["url"]], ['author-link' => $old["url"], 'uid' => $importer["importer_uid"]]); - if (DBM::is_result($r)) { - $x = q( - "UPDATE `item` SET `%s` = '%s' WHERE `%s` = '%s' AND `uid` = %d", - $n, - dbesc($f[1]), - $n, - dbesc($f[0]), - intval($importer["importer_uid"]) - ); - - if ($x === false) { - return false; - } - } - } + logger('Items are updated.'); /// @TODO /// merge with current record, current contents have priority @@ -2756,6 +2719,10 @@ class DFRN if ($posted_id) { logger("Reply from contact ".$item["contact-id"]." was stored with id ".$posted_id, LOGGER_DEBUG); + if ($item['uid'] == 0) { + Item::distribute($posted_id); + } + $item["id"] = $posted_id; $r = q( @@ -2776,10 +2743,6 @@ class DFRN return true; } } else { // $entrytype == DFRN_TOP_LEVEL - if ($importer["readonly"]) { - logger('ignoring read-only contact '.$importer["id"]); - return; - } if (($importer["uid"] == 0) && ($importer["importer_uid"] != 0)) { logger("Contact ".$importer["id"]." isn't known to user ".$importer["importer_uid"].". The post will be ignored.", LOGGER_DEBUG); return; @@ -2808,8 +2771,16 @@ class DFRN $posted_id = Item::insert($item, false, $notify); + if ($notify) { + $posted_id = $notify; + } + logger("Item was stored with id ".$posted_id, LOGGER_DEBUG); + if ($item['uid'] == 0) { + Item::distribute($posted_id); + } + if (stristr($item["verb"], ACTIVITY_POKE)) { self::doPoke($item, $importer, $posted_id); } @@ -2829,6 +2800,7 @@ class DFRN { logger("Processing deletions"); $uri = null; + foreach ($deletion->attributes as $attributes) { if ($attributes->name == "ref") { $uri = $attributes->textContent;