use Friendica\Model\Event;
use Friendica\Model\GContact;
use Friendica\Model\Item;
+use Friendica\Model\Mail;
use Friendica\Model\PermissionSet;
use Friendica\Model\Profile;
use Friendica\Model\User;
+use Friendica\Network\Probe;
use Friendica\Object\Image;
+use Friendica\Util\BaseURL;
use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network;
$item["entry:cid"] = defaults($item, "entry:cid", 0);
$entry = self::entry($doc, "text", $item, $owner, $item["entry:comment-allow"], $item["entry:cid"]);
- $root->appendChild($entry);
+ if (isset($entry)) {
+ $root->appendChild($entry);
+ }
}
return trim($doc->saveXML());
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'
- $sql_extra
- ORDER BY `item`.`parent` ".$sort.", `item`.`created` ASC LIMIT 0, 300",
+ AND `item`.`visible` $sql_extra
+ ORDER BY `item`.`parent` ".$sort.", `item`.`received` ASC LIMIT 0, 300",
intval($owner_id),
DBA::escape($check_date),
DBA::escape($sort)
}
$entry = self::entry($doc, $type, $item, $owner, true);
- $root->appendChild($entry);
+ if (isset($entry)) {
+ $root->appendChild($entry);
+ }
}
$atom = trim($doc->saveXML());
$ret = Item::select(Item::DELIVER_FIELDLIST, $condition);
$items = Item::inArray($ret);
if (!DBA::isResult($items)) {
- exit();
+ return '';
}
$item = $items[0];
if ($item['uid'] != 0) {
$owner = User::getOwnerDataById($item['uid']);
if (!$owner) {
- exit();
+ return '';
}
} else {
$owner = ['uid' => 0, 'nick' => 'feed-item'];
foreach ($items as $item) {
$entry = self::entry($doc, $type, $item, $owner, true, 0);
- $root->appendChild($entry);
+ if (isset($entry)) {
+ $root->appendChild($entry);
+ }
}
} else {
- $root = self::entry($doc, $type, $item, $owner, true, 0, true);
+ self::entry($doc, $type, $item, $owner, true, 0, true);
}
$atom = trim($doc->saveXML());
*/
private static function addEntryAuthor(DOMDocument $doc, $element, $contact_url, $item)
{
- $contact = Contact::getDetailsByURL($contact_url, $item["uid"]);
-
$author = $doc->createElement($element);
- XML::addElement($doc, $author, "name", $contact["name"]);
- XML::addElement($doc, $author, "uri", $contact["url"]);
- XML::addElement($doc, $author, "dfrn:handle", $contact["addr"]);
- /// @Todo
- /// - Check real image type and image size
- /// - Check which of these boths elements we should use
- $attributes = [
+ $contact = Contact::getDetailsByURL($contact_url, $item["uid"]);
+ if (!empty($contact)) {
+ XML::addElement($doc, $author, "name", $contact["name"]);
+ XML::addElement($doc, $author, "uri", $contact["url"]);
+ XML::addElement($doc, $author, "dfrn:handle", $contact["addr"]);
+
+ /// @Todo
+ /// - Check real image type and image size
+ /// - Check which of these boths elements we should use
+ $attributes = [
"rel" => "photo",
"type" => "image/jpeg",
"media:width" => 80,
"media:height" => 80,
"href" => $contact["photo"]];
- XML::addElement($doc, $author, "link", "", $attributes);
+ XML::addElement($doc, $author, "link", "", $attributes);
- $attributes = [
+ $attributes = [
"rel" => "avatar",
"type" => "image/jpeg",
"media:width" => 80,
"media:height" => 80,
"href" => $contact["photo"]];
- XML::addElement($doc, $author, "link", "", $attributes);
+ XML::addElement($doc, $author, "link", "", $attributes);
+ }
return $author;
}
* @param int $cid Contact ID of the recipient
* @param bool $single If set, the entry is created as an XML document with a single "entry" element
*
- * @return \DOMElement XML entry object
+ * @return null|\DOMElement XML entry object
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
* @todo Find proper type-hints
$mentioned = [];
if (!$item['parent']) {
- return;
+ Logger::notice('Item without parent found.', ['type' => $type, 'item' => $item]);
+ return null;
}
if ($item['deleted']) {
}
// Add conversation data. This is used for OStatus
- $conversation_href = System::baseUrl()."/display/".$owner["nick"]."/".$item["parent"];
+ $conversation_href = System::baseUrl()."/display/".$item["parent-guid"];
$conversation_uri = $conversation_href;
if (isset($parent_item)) {
* @param string $atom Content that will be transmitted
* @param bool $dissolve (to be documented)
*
- * @param bool $legacy_transport
* @return int Deliver status. Negative values mean an error.
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
* @todo Add array type-hint for $owner, $contact
*/
- public static function deliver($owner, $contact, $atom, $dissolve = false, $legacy_transport = false)
+ public static function deliver($owner, $contact, $atom, $dissolve = false)
{
- // At first try the Diaspora transport layer
- if (!$dissolve && !$legacy_transport) {
- $curlResult = self::transmit($owner, $contact, $atom);
- if ($curlResult >= 200) {
- Logger::log('Delivery via Diaspora transport layer was successful with status ' . $curlResult);
- return $curlResult;
- }
- }
-
$idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
if ($contact['duplex'] && $contact['dfrn-id']) {
$ssl_val = intval(Config::get('system', 'ssl_policy'));
switch ($ssl_val) {
- case SSL_POLICY_FULL:
+ case BaseURL::SSL_POLICY_FULL:
$ssl_policy = 'full';
break;
- case SSL_POLICY_SELFSIGN:
+ case BaseURL::SSL_POLICY_SELFSIGN:
$ssl_policy = 'self';
break;
- case SSL_POLICY_NONE:
+ case BaseURL::SSL_POLICY_NONE:
default:
$ssl_policy = 'none';
break;
$curlResult = Network::curl($url);
if ($curlResult->isTimeout()) {
- Contact::markForArchival($contact);
return -2; // timed out
}
$curl_stat = $curlResult->getReturnCode();
if (empty($curl_stat)) {
- Contact::markForArchival($contact);
return -3; // timed out
}
Logger::log('dfrn_deliver: ' . $xml, Logger::DATA);
if (empty($xml)) {
- Contact::markForArchival($contact);
return 3;
}
if (strpos($xml, '<?xml') === false) {
Logger::log('dfrn_deliver: no valid XML returned');
Logger::log('dfrn_deliver: returned XML: ' . $xml, Logger::DATA);
- Contact::markForArchival($contact);
return 3;
}
$res = XML::parseString($xml);
if (!is_object($res) || (intval($res->status) != 0) || !strlen($res->challenge) || !strlen($res->dfrn_id)) {
- Contact::markForArchival($contact);
-
if (empty($res->status)) {
$status = 3;
} else {
if ($final_dfrn_id != $orig_id) {
Logger::log('dfrn_deliver: wrong dfrn_id.');
// did not decode properly - cannot trust this site
- Contact::markForArchival($contact);
return 3;
}
default:
Logger::log("rino: invalid requested version '$rino_remote_version'");
- Contact::markForArchival($contact);
return -8;
}
$curl_stat = $postResult->getReturnCode();
if (empty($curl_stat) || empty($xml)) {
- Contact::markForArchival($contact);
return -9; // timed out
}
if (($curl_stat == 503) && stristr($postResult->getHeader(), 'retry-after')) {
- Contact::markForArchival($contact);
return -10;
}
if (strpos($xml, '<?xml') === false) {
Logger::log('dfrn_deliver: phase 2: no valid XML returned');
Logger::log('dfrn_deliver: phase 2: returned XML: ' . $xml, Logger::DATA);
- Contact::markForArchival($contact);
return 3;
}
$res = XML::parseString($xml);
if (!isset($res->status)) {
- Contact::markForArchival($contact);
return -11;
}
Logger::log('Delivery returned status '.$res->status.' - '.$res->message, Logger::DEBUG);
}
- if (($res->status >= 200) && ($res->status <= 299)) {
- Contact::unmarkForArchival($contact);
- }
-
return intval($res->status);
}
if (empty($contact['addr'])) {
Logger::log('Unable to find contact handle for ' . $contact['id'] . ' - ' . $contact['url']);
- Contact::markForArchival($contact);
return -21;
}
}
$fcontact = Diaspora::personByHandle($contact['addr']);
if (empty($fcontact)) {
Logger::log('Unable to find contact details for ' . $contact['id'] . ' - ' . $contact['addr']);
- Contact::markForArchival($contact);
return -22;
}
$pubkey = $fcontact['pubkey'];
$dest_url = ($public_batch ? $contact["batch"] : $contact["notify"]);
+ if (empty($dest_url)) {
+ Logger::info('Empty destination', ['public' => $public_batch, 'contact' => $contact]);
+ return -24;
+ }
+
$content_type = ($public_batch ? "application/magic-envelope+xml" : "application/json");
$postResult = Network::post($dest_url, $envelope, ["Content-Type: ".$content_type]);
$curl_stat = $postResult->getReturnCode();
if (empty($curl_stat) || empty($xml)) {
Logger::log('Empty answer from ' . $contact['id'] . ' - ' . $dest_url);
- Contact::markForArchival($contact);
return -9; // timed out
}
if (($curl_stat == 503) && (stristr($postResult->getHeader(), 'retry-after'))) {
- Contact::markForArchival($contact);
return -10;
}
if (strpos($xml, '<?xml') === false) {
Logger::log('No valid XML returned from ' . $contact['id'] . ' - ' . $dest_url);
Logger::log('Returned XML: ' . $xml, Logger::DATA);
- Contact::markForArchival($contact);
return 3;
}
$res = XML::parseString($xml);
if (empty($res->status)) {
- Contact::markForArchival($contact);
return -23;
}
Logger::log('Transmit to ' . $dest_url . ' returned status '.$res->status.' - '.$res->message, Logger::DEBUG);
}
- if (($res->status >= 200) && ($res->status <= 299)) {
- Contact::unmarkForArchival($contact);
- }
-
return intval($res->status);
}
Event::createBirthday($contact, $birthday);
}
- // Get all field names
- $fields = [];
- foreach ($contact_old as $field => $data) {
- $fields[$field] = $data;
- }
-
- unset($fields["id"]);
- unset($fields["uid"]);
- unset($fields["url"]);
- unset($fields["avatar-date"]);
- unset($fields["avatar"]);
- unset($fields["name-date"]);
- unset($fields["uri-date"]);
-
- $update = false;
- // Update check for this field has to be done differently
- $datefields = ["name-date", "uri-date"];
- foreach ($datefields as $field) {
- // The date fields arrives as '2018-07-17T10:44:45Z' - the database return '2018-07-17 10:44:45'
- // The fields have to be in the same format to be comparable, since strtotime does add timezones.
- $contact[$field] = DateTimeFormat::utc($contact[$field]);
+ $fields = ['name' => $contact['name'], 'nick' => $contact['nick'], 'about' => $contact['about'],
+ 'location' => $contact['location'], 'addr' => $contact['addr'], 'keywords' => $contact['keywords'],
+ 'bdyear' => $contact['bdyear'], 'bd' => $contact['bd'], 'hidden' => $contact['hidden'],
+ 'xmpp' => $contact['xmpp'], 'name-date' => DateTimeFormat::utc($contact['name-date']),
+ 'unsearchable' => $contact['hidden'], 'uri-date' => DateTimeFormat::utc($contact['uri-date'])];
- if (strtotime($contact[$field]) > strtotime($contact_old[$field])) {
- Logger::log("Difference for contact " . $contact["id"] . " in field '" . $field . "'. New value: '" . $contact[$field] . "', old value '" . $contact_old[$field] . "'", Logger::DEBUG);
- $update = true;
- }
- }
+ DBA::update('contact', $fields, ['id' => $contact['id'], 'network' => $contact['network']], $contact_old);
- foreach ($fields as $field => $data) {
- if ($contact[$field] != $contact_old[$field]) {
- Logger::log("Difference for contact " . $contact["id"] . " in field '" . $field . "'. New value: '" . $contact[$field] . "', old value '" . $contact_old[$field] . "'", Logger::DEBUG);
- $update = true;
- }
- }
+ // Update the public contact. Don't set the "hidden" value, this is used differently for public contacts
+ unset($fields['hidden']);
+ $condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($contact_old['url'])];
+ DBA::update('contact', $fields, $condition, true);
- if ($update) {
- Logger::log("Update contact data for contact " . $contact["id"] . " (" . $contact["nick"] . ")", Logger::DEBUG);
+ Contact::updateAvatar($author['avatar'], $importer['importer_uid'], $contact['id']);
- q(
- "UPDATE `contact` SET `name` = '%s', `nick` = '%s', `about` = '%s', `location` = '%s',
- `addr` = '%s', `keywords` = '%s', `bdyear` = '%s', `bd` = '%s', `hidden` = %d,
- `xmpp` = '%s', `name-date` = '%s', `uri-date` = '%s'
- WHERE `id` = %d AND `network` = '%s'",
- DBA::escape($contact["name"]), DBA::escape($contact["nick"]), DBA::escape($contact["about"]), DBA::escape($contact["location"]),
- DBA::escape($contact["addr"]), DBA::escape($contact["keywords"]), DBA::escape($contact["bdyear"]),
- DBA::escape($contact["bd"]), intval($contact["hidden"]), DBA::escape($contact["xmpp"]),
- DBA::escape(DateTimeFormat::utc($contact["name-date"])), DBA::escape(DateTimeFormat::utc($contact["uri-date"])),
- intval($contact["id"]), DBA::escape($contact["network"])
- );
+ $pcid = Contact::getIdForURL($contact_old['url']);
+ if (!empty($pcid)) {
+ Contact::updateAvatar($author['avatar'], 0, $pcid);
}
- Contact::updateAvatar(
- $author['avatar'],
- $importer['importer_uid'],
- $contact['id'],
- (strtotime($contact['avatar-date']) > strtotime($contact_old['avatar-date']) || ($author['avatar'] != $contact_old['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
{
Logger::log("Processing mails");
- /// @TODO Rewrite this to one statement
$msg = [];
$msg["uid"] = $importer["importer_uid"];
$msg["from-name"] = $xpath->query("dfrn:sender/dfrn:name/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["seen"] = 0;
- $msg["replied"] = 0;
-
- DBA::insert('mail', $msg);
-
- $msg["id"] = DBA::lastInsertId();
-
- // send notifications.
- /// @TODO Arange this mess
- $notif_params = [
- "type" => NOTIFY_MAIL,
- "notify_flags" => $importer["notify-flags"],
- "language" => $importer["language"],
- "to_name" => $importer["username"],
- "to_email" => $importer["email"],
- "uid" => $importer["importer_uid"],
- "item" => $msg,
- "parent" => $msg["parent-uri"],
- "source_name" => $msg["from-name"],
- "source_link" => $importer["url"],
- "source_photo" => $importer["thumb"],
- "verb" => ACTIVITY_POST,
- "otype" => "mail"
- ];
-
- notification($notif_params);
-
- Logger::log("Mail is processed, notification was sent.");
+
+ Mail::insert($msg);
}
/**
*/
private static function processSuggestion($xpath, $suggestion, $importer)
{
- Logger::log("Processing suggestions");
+ 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;
+ $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?
*
* @see https://github.com/friendica/friendica/pull/3254#discussion_r107315246
*/
- $condition = ['name' => $suggest["name"], 'nurl' => Strings::normaliseLink($suggest["url"]),
- 'uid' => $suggest["uid"]];
+ $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;
- $condition = ['url' => $suggest["url"], 'name' => $suggest["name"], 'request' => $suggest["request"]];
- $fcontact = DBA::selectFirst('fcontact', ['id'], $condition);
+ $fcontact = DBA::selectFirst('fcontact', ['id'], ['url' => $suggest['url']]);
if (DBA::isResult($fcontact)) {
- $fid = $fcontact["id"];
+ $fid = $fcontact['id'];
// OK, we do. Do we already have an introduction for this person?
- if (DBA::exists('intro', ['uid' => $suggest["uid"], 'fid' => $fid])) {
+ 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
return false;
}
}
+
if (!$fid) {
- $r = q(
- "INSERT INTO `fcontact` (`name`,`url`,`photo`,`request`) VALUES ('%s', '%s', '%s', '%s')",
- DBA::escape($suggest["name"]),
- DBA::escape($suggest["url"]),
- DBA::escape($suggest["photo"]),
- DBA::escape($suggest["request"])
- );
- $fid = $r[0]["id"];
+ $fields = ['name' => $suggest['name'], 'url' => $suggest['url'],
+ 'photo' => $suggest['photo'], 'request' => $suggest['request']];
+ DBA::insert('fcontact', $fields);
+ $fid = DBA::lastInsertId();
}
- $condition = ['url' => $suggest["url"], 'name' => $suggest["name"], 'request' => $suggest["request"]];
- $fcontact = DBA::selectFirst('fcontact', ['id'], $condition);
-
/*
* If no record in fcontact is found, below INSERT statement will not
* link an introduction to it.
*/
- if (!DBA::isResult($fcontact)) {
+ if (empty($fid)) {
// Database record did not get created. Quietly give up.
exit();
}
$hash = Strings::getRandomHex();
- q(
- "INSERT INTO `intro` (`uid`, `fid`, `contact-id`, `note`, `hash`, `datetime`, `blocked`)
- VALUES(%d, %d, %d, '%s', '%s', '%s', %d)",
- intval($suggest["uid"]),
- intval($fid),
- intval($suggest["cid"]),
- DBA::escape($suggest["body"]),
- DBA::escape($hash),
- DBA::escape(DateTimeFormat::utcNow()),
- intval(0)
- );
+ $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" => NOTIFY_SUGGEST,
- "notify_flags" => $importer["notify-flags"],
- "language" => $importer["language"],
- "to_name" => $importer["username"],
- "to_email" => $importer["email"],
- "uid" => $importer["importer_uid"],
- "item" => $suggest,
- "link" => System::baseUrl()."/notifications/intros",
- "source_name" => $importer["name"],
- "source_link" => $importer["url"],
- "source_photo" => $importer["photo"],
- "verb" => ACTIVITY_REQ_FRIEND,
- "otype" => "intro"]
+ 'type' => NOTIFY_SUGGEST,
+ 'notify_flags' => $importer['notify-flags'],
+ 'language' => $importer['language'],
+ 'to_name' => $importer['username'],
+ 'to_email' => $importer['email'],
+ 'uid' => $importer['importer_uid'],
+ 'item' => $suggest,
+ 'link' => System::baseUrl().'/notifications/intros',
+ 'source_name' => $importer['name'],
+ 'source_link' => $importer['url'],
+ 'source_photo' => $importer['photo'],
+ 'verb' => ACTIVITY_REQ_FRIEND,
+ 'otype' => 'intro']
);
return true;
/**
* @brief Send a "poke"
*
- * @param array $item the new item record
+ * @param array $item The new item record
* @param array $importer Record of the importer user mixed with contact of the content
- * @param int $posted_id The record number of item record that was just posted
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo set proper type-hints (array?)
*/
- private static function doPoke($item, $importer, $posted_id)
+ private static function doPoke(array $item, array $importer)
{
$verb = urldecode(substr($item["verb"], strpos($item["verb"], "#")+1));
if (!$verb) {
if ($Blink && Strings::compareLink($Blink, System::baseUrl() . "/profile/" . $importer["nickname"])) {
$author = DBA::selectFirst('contact', ['name', 'thumb', 'url'], ['id' => $item['author-id']]);
- $item['id'] = $posted_id;
-
$parent = Item::selectFirst(['id'], ['uri' => $item['parent-uri'], 'uid' => $importer["importer_uid"]]);
$item["parent"] = $parent['id'];
"to_email" => $importer["email"],
"uid" => $importer["importer_uid"],
"item" => $item,
- "link" => System::baseUrl()."/display/".urlencode(Item::getGuidById($posted_id)),
+ "link" => System::baseUrl()."/display/".urlencode($item['guid']),
"source_name" => $author["name"],
"source_link" => $author["url"],
"source_photo" => $author["thumb"],
{
Logger::log("Process verb ".$item["verb"]." and object-type ".$item["object-type"]." for entrytype ".$entrytype, Logger::DEBUG);
- if (($entrytype == DFRN::TOP_LEVEL)) {
+ if (($entrytype == DFRN::TOP_LEVEL) && !empty($importer['id'])) {
// The filling of the the "contact" variable is done for legcy reasons
// The functions below are partly used by ostatus.php as well - where we have this variable
- $r = q("SELECT * FROM `contact` WHERE `id` = %d", intval($importer["id"]));
- $contact = $r[0];
- $nickname = $contact["nick"];
+ $contact = Contact::select([], ['id' => $importer['id']]);
// Big question: Do we need these functions? They were part of the "consume_feed" function.
// This function once was responsible for DFRN and OStatus.
if (activity_match($item["verb"], ACTIVITY_FOLLOW)) {
Logger::log("New follower");
- Contact::addRelationship($importer, $contact, $item, $nickname);
+ Contact::addRelationship($importer, $contact, $item);
return false;
}
if (activity_match($item["verb"], ACTIVITY_UNFOLLOW)) {
}
if (activity_match($item["verb"], ACTIVITY_REQ_FRIEND)) {
Logger::log("New friend request");
- Contact::addRelationship($importer, $contact, $item, $nickname, true);
+ Contact::addRelationship($importer, $contact, $item, true);
return false;
}
if (activity_match($item["verb"], ACTIVITY_UNFRIEND)) {
}
if (stristr($item["verb"], ACTIVITY_POKE)) {
- self::doPoke($item, $importer, $posted_id);
+ $item['id'] = $posted_id;
+ self::doPoke($item, $importer);
}
}
}
{
// prevent looping
if (!empty($_REQUEST['redir'])) {
- return;
+ Logger::log('autoRedir might be looping because redirect has been redirected', Logger::DEBUG);
+ // looping prevention also appears to sometimes prevent authentication for images
+ // because browser may have multiple connections open and load an image on a connection
+ // whose session wasn't updated when a previous redirect authenticated
+ // Leaving commented in case looping reappears
+ //return;
}
if ((! $contact_nick) || ($contact_nick === $a->user['nickname'])) {
$baseurl = substr($baseurl, $domain_st + 3);
$nurl = Strings::normaliseLink($baseurl);
+ $r = User::getByNickname($contact_nick, ["uid"]);
+ $contact_uid = $r["uid"];
+
/// @todo Why is there a query for "url" *and* "nurl"? Especially this normalising is strange.
$r = q("SELECT `id` FROM `contact` WHERE `uid` = (SELECT `uid` FROM `user` WHERE `nickname` = '%s' LIMIT 1)
AND `nick` = '%s' AND NOT `self` AND (`url` LIKE '%%%s%%' OR `nurl` LIKE '%%%s%%') AND NOT `blocked` AND NOT `pending` LIMIT 1",
DBA::escape($baseurl),
DBA::escape($nurl)
);
- if ((! DBA::isResult($r)) || $r[0]['id'] == remote_user()) {
+ if ((! DBA::isResult($r))) {
return;
}
+ // test if redirect authentication already succeeded
+ // Note that "contact" in the sense used in the $contact_nick argument to this function
+ // and the sense in the $remote[]["cid"] in the session are opposite.
+ // In the session variable the user currently fetching is the contact
+ // while $contact_nick is the nick of tho user who owns the stuff being fetched.
+ foreach (\Friendica\Core\Session::get('remote', []) as $visitor) {
+ if ($visitor['uid'] == $contact_uid && $visitor['cid'] == $r[0]['id']) {
+ return;
+ }
+ }
$r = q("SELECT * FROM contact WHERE nick = '%s'
AND network = '%s' AND uid = %d AND url LIKE '%%%s%%' LIMIT 1",
return (strcmp($existing_edited, $update_edited) < 0);
}
+
+ /**
+ * 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)
+ {
+ $probe = Probe::uri($url, Protocol::DFRN, 0, !$update);
+ return $probe['network'] == Protocol::DFRN;
+ }
}