Store the diaspora signature differently

This commit is contained in:
Michael 2020-05-13 05:48:26 +00:00
parent c4062ddb3b
commit 13bd43f3f6
2 changed files with 22 additions and 31 deletions

View file

@ -1454,7 +1454,7 @@ class Item
if ($item['verb'] == Activity::FOLLOW) { if ($item['verb'] == Activity::FOLLOW) {
if (!$item['origin'] && ($item['author-id'] == Contact::getPublicIdByUserId($item['uid']))) { if (!$item['origin'] && ($item['author-id'] == Contact::getPublicIdByUserId($item['uid']))) {
// Our own follow request can be relayed to us. We don't store it to avoid notification chaos. // Our own follow request can be relayed to us. We don't store it to avoid notification chaos.
Logger::log("Follow: Don't store not origin follow request from us for " . $item['parent-uri'], Logger::DEBUG); Logger::info("Follow: Don't store not origin follow request", ['parent-uri' => $item['parent-uri']]);
return false; return false;
} }
@ -1462,7 +1462,7 @@ class Item
'parent-uri' => $item['parent-uri'], 'author-id' => $item['author-id']]; 'parent-uri' => $item['parent-uri'], 'author-id' => $item['author-id']];
if (self::exists($condition)) { if (self::exists($condition)) {
// It happens that we receive multiple follow requests by the same author - we only store one. // It happens that we receive multiple follow requests by the same author - we only store one.
Logger::log('Follow: Found existing follow request from author ' . $item['author-id'] . ' for ' . $item['parent-uri'], Logger::DEBUG); Logger::info('Follow: Found existing follow request from author', ['author-id' => $item['author-id'], 'parent-uri' => $item['parent-uri']]);
return false; return false;
} }
} }
@ -1706,20 +1706,11 @@ class Item
$item['author-id'] = ($item['author-id'] ?? 0) ?: Contact::getIdForURL($item['author-link'], 0, false, $default); $item['author-id'] = ($item['author-id'] ?? 0) ?: Contact::getIdForURL($item['author-link'], 0, false, $default);
unset($item['author-link']);
unset($item['author-name']);
unset($item['author-avatar']);
unset($item['author-network']);
$default = ['url' => $item['owner-link'], 'name' => $item['owner-name'], $default = ['url' => $item['owner-link'], 'name' => $item['owner-name'],
'photo' => $item['owner-avatar'], 'network' => $item['network']]; 'photo' => $item['owner-avatar'], 'network' => $item['network']];
$item['owner-id'] = ($item['owner-id'] ?? 0) ?: Contact::getIdForURL($item['owner-link'], 0, false, $default); $item['owner-id'] = ($item['owner-id'] ?? 0) ?: Contact::getIdForURL($item['owner-link'], 0, false, $default);
unset($item['owner-link']);
unset($item['owner-name']);
unset($item['owner-avatar']);
// The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes // The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes
$item["contact-id"] = self::contactId($item); $item["contact-id"] = self::contactId($item);
@ -1740,6 +1731,17 @@ class Item
unset($item['causer-id']); unset($item['causer-id']);
unset($item['causer-link']); unset($item['causer-link']);
// We don't store these fields anymore in the item table
unset($item['author-link']);
unset($item['author-name']);
unset($item['author-avatar']);
unset($item['author-network']);
unset($item['owner-link']);
unset($item['owner-name']);
unset($item['owner-avatar']);
$item['thr-parent'] = $item['parent-uri']; $item['thr-parent'] = $item['parent-uri'];
if ($item['parent-uri'] != $item['uri']) { if ($item['parent-uri'] != $item['uri']) {
@ -1813,37 +1815,22 @@ class Item
unset($item['api_source']); unset($item['api_source']);
// Filling item related side tables // Filling item related side tables
if (!empty($item['dsprsig'])) {
$dsprsig = json_decode(base64_decode($item['dsprsig']));
/*
* Friendica servers lower than 3.4.3-2 had double encoded the signature ...
* We can check for this condition when we decode and encode the stuff again.
*/
if (base64_encode(base64_decode(base64_decode($dsprsig->signature))) == base64_decode($dsprsig->signature)) {
$dsprsig->signature = base64_decode($dsprsig->signature);
Logger::log("Repaired double encoded signature from handle ".$dsprsig->signer, Logger::DEBUG);
}
if (!empty($dsprsig->signed_text) && empty($dsprsig->signature) && empty($dsprsig->signer)) {
DBA::insert('diaspora-interaction', ['uri-id' => $item['uri-id'], 'interaction' => $dsprsig->signed_text], true);
}
}
unset($item['dsprsig']);
// Diaspora signature
if (!empty($item['diaspora_signed_text'])) { if (!empty($item['diaspora_signed_text'])) {
DBA::insert('diaspora-interaction', ['uri-id' => $item['uri-id'], 'interaction' => $item['diaspora_signed_text']], true); DBA::insert('diaspora-interaction', ['uri-id' => $item['uri-id'], 'interaction' => $item['diaspora_signed_text']], true);
} }
unset($item['diaspora_signed_text']); unset($item['diaspora_signed_text']);
// Attached file links
if (array_key_exists('file', $item) && !empty($item['file'])) { if (array_key_exists('file', $item) && !empty($item['file'])) {
Category::storeTextByURIId($item['uri-id'], $item['uid'], $item['file']); Category::storeTextByURIId($item['uri-id'], $item['uid'], $item['file']);
} }
unset($item['file']); unset($item['file']);
// Delivery relevant data
$delivery_data = Post\DeliveryData::extractFields($item); $delivery_data = Post\DeliveryData::extractFields($item);
unset($item['postopts']); unset($item['postopts']);
unset($item['inform']); unset($item['inform']);

View file

@ -2384,7 +2384,11 @@ class DFRN
// We store the data from "dfrn:diaspora_signature" in a different table, this is done in "Item::insert" // We store the data from "dfrn:diaspora_signature" in a different table, this is done in "Item::insert"
$dsprsig = XML::unescape(XML::getFirstNodeValue($xpath, "dfrn:diaspora_signature/text()", $entry)); $dsprsig = XML::unescape(XML::getFirstNodeValue($xpath, "dfrn:diaspora_signature/text()", $entry));
if ($dsprsig != "") { if ($dsprsig != "") {
$item["dsprsig"] = $dsprsig; $signature = json_decode(base64_decode($dsprsig));
// We don't store the old style signatures anymore that also contained the "signature" and "signer"
if (!empty($signature->signed_text) && empty($signature->signature) && empty($signature->signer)) {
$item["diaspora_signed_text"] = $signature->signed_text;
}
} }
$item["verb"] = XML::getFirstNodeValue($xpath, "activity:verb/text()", $entry); $item["verb"] = XML::getFirstNodeValue($xpath, "activity:verb/text()", $entry);