namespace Friendica\Model;
use Friendica\Content\Text\HTML;
+use Friendica\Core\Cache\Duration;
use Friendica\Core\Logger;
+use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Network\Probe;
use Friendica\Protocol\ActivityNamespace;
use Friendica\Protocol\ActivityPub;
use Friendica\Util\Crypto;
-use Friendica\Util\Network;
-use Friendica\Util\JsonLD;
use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Strings;
+use Friendica\Util\JsonLD;
+use Friendica\Util\Network;
class APContact
{
* @param string $addr Address
* @return array webfinger data
*/
- public static function fetchWebfingerData(string $addr)
+ private static function fetchWebfingerData(string $addr)
{
$addr_parts = explode('@', $addr);
if (count($addr_parts) != 2) {
return $fetched_contact;
}
+ // Detect multiple fast repeating request to the same address
+ // See https://github.com/friendica/friendica/issues/9303
+ $cachekey = 'apcontact:getByURL:' . $url;
+ $result = DI::cache()->get($cachekey);
+ if (!is_null($result)) {
+ Logger::notice('Multiple requests for the address', ['url' => $url, 'update' => $update, 'callstack' => System::callstack(20), 'result' => $result]);
+ } else {
+ DI::cache()->set($cachekey, System::callstack(20), Duration::FIVE_MINUTES);
+ }
+
$apcontact['url'] = $compacted['@id'];
$apcontact['uuid'] = JsonLD::fetchElement($compacted, 'diaspora:guid', '@value');
$apcontact['type'] = str_replace('as:', '', JsonLD::fetchElement($compacted, '@type'));
$apcontact['baseurl'] = null;
}
+ if (empty($apcontact['subscribe'])) {
+ $apcontact['subscribe'] = null;
+ }
+
if (!empty($apcontact['baseurl']) && empty($fetched_contact['gsid'])) {
$apcontact['gsid'] = GServer::getID($apcontact['baseurl']);
} elseif (!empty($fetched_contact['gsid'])) {
$apcontact['updated'] = DateTimeFormat::utcNow();
- DBA::update('apcontact', $apcontact, ['url' => $url], true);
-
// We delete the old entry when the URL is changed
- if (($url != $apcontact['url']) && DBA::exists('apcontact', ['url' => $url]) && DBA::exists('apcontact', ['url' => $apcontact['url']])) {
+ if ($url != $apcontact['url']) {
+ Logger::info('Delete changed profile url', ['old' => $url, 'new' => $apcontact['url']]);
DBA::delete('apcontact', ['url' => $url]);
}
+ if (DBA::exists('apcontact', ['url' => $apcontact['url']])) {
+ DBA::update('apcontact', $apcontact, ['url' => $apcontact['url']]);
+ } else {
+ DBA::replace('apcontact', $apcontact);
+ }
+
Logger::info('Updated profile', ['url' => $url]);
return $apcontact;
if (!DBA::exists('inbox-status', ['url' => $url])) {
$fields = array_merge($fields, ['url' => $url, 'created' => $now]);
- DBA::insert('inbox-status', $fields);
+ DBA::replace('inbox-status', $fields);
} else {
DBA::update('inbox-status', $fields, ['url' => $url]);
}