Merge pull request #7434 from annando/contact-protocol

New functions to check if a contact supports that protocol
This commit is contained in:
Hypolite Petovan 2019-07-27 17:47:54 -04:00 committed by GitHub
commit 8b344141da
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 81 additions and 17 deletions

View file

@ -194,4 +194,18 @@ class ActivityPub
ActivityPub\Receiver::processActivity($ldactivity, '', $uid, true); ActivityPub\Receiver::processActivity($ldactivity, '', $uid, true);
} }
} }
/**
* Checks if the given contact url does support ActivityPub
*
* @param string $url profile url
* @param boolean $update true = always update, false = never update, null = update when not found or outdated
* @return boolean
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isSupportedByContactUrl($url, $update = null)
{
return !empty(APContact::getByURL($url, $update));
}
} }

View file

@ -29,6 +29,7 @@ use Friendica\Model\Mail;
use Friendica\Model\PermissionSet; use Friendica\Model\PermissionSet;
use Friendica\Model\Profile; use Friendica\Model\Profile;
use Friendica\Model\User; use Friendica\Model\User;
use Friendica\Network\Probe;
use Friendica\Object\Image; use Friendica\Object\Image;
use Friendica\Util\BaseURL; use Friendica\Util\BaseURL;
use Friendica\Util\Crypto; use Friendica\Util\Crypto;
@ -3041,4 +3042,19 @@ class DFRN
return (strcmp($existing_edited, $update_edited) < 0); 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;
}
} }

View file

@ -942,31 +942,41 @@ class Diaspora
* @brief Fetches data for a given handle * @brief Fetches data for a given handle
* *
* @param string $handle The handle * @param string $handle The handle
* @param boolean $update true = always update, false = never update, null = update when not found or outdated
* *
* @return array the queried data * @return array the queried data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function personByHandle($handle) public static function personByHandle($handle, $update = null)
{ {
$update = false;
$person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'addr' => $handle]); $person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'addr' => $handle]);
if (!DBA::isResult($person)) {
$urls = [$handle, str_replace('http://', 'https://', $handle), Strings::normaliseLink($handle)];
$person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'url' => $urls]);
}
if (DBA::isResult($person)) { if (DBA::isResult($person)) {
Logger::debug("In cache " . print_r($person, true)); Logger::debug("In cache " . print_r($person, true));
// update record occasionally so it doesn't get stale if (is_null($update)) {
$d = strtotime($person["updated"]." +00:00"); // update record occasionally so it doesn't get stale
if ($d < strtotime("now - 14 days")) { $d = strtotime($person["updated"]." +00:00");
$update = true; if ($d < strtotime("now - 14 days")) {
} $update = true;
}
if ($person["guid"] == "") { if ($person["guid"] == "") {
$update = true; $update = true;
}
} }
} elseif (is_null($update)) {
$update = !DBA::isResult($person);
} else {
$person = [];
} }
if (!DBA::isResult($person) || $update) { if ($update) {
Logger::log("create or refresh", Logger::DEBUG); Logger::log("create or refresh", Logger::DEBUG);
$r = Probe::uri($handle, Protocol::DIASPORA); $r = Probe::uri($handle, Protocol::DIASPORA);
@ -975,12 +985,7 @@ class Diaspora
if ($r && ($r["network"] === Protocol::DIASPORA)) { if ($r && ($r["network"] === Protocol::DIASPORA)) {
self::updateFContact($r); self::updateFContact($r);
// Fetch the updated or added contact $person = self::personByHandle($handle, false);
$person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'addr' => $handle]);
if (!DBA::isResult($person)) {
$person = $r;
$person['id'] = 0;
}
} }
} }
@ -1117,6 +1122,20 @@ class Diaspora
return $contact; return $contact;
} }
/**
* Checks if the given contact url does support ActivityPub
*
* @param string $url profile url
* @param boolean $update true = always update, false = never update, null = update when not found or outdated
* @return boolean
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isSupportedByContactUrl($url, $update = null)
{
return !empty(self::personByHandle($url, $update));
}
/** /**
* @brief Check if posting is allowed for this contact * @brief Check if posting is allowed for this contact
* *

View file

@ -2302,4 +2302,19 @@ class OStatus
return trim($doc->saveXML()); return trim($doc->saveXML());
} }
/**
* Checks if the given contact url does support OStatus
*
* @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::OSTATUS, 0, !$update);
return $probe['network'] == Protocol::OSTATUS;
}
} }