Proper ActivityPub profiles

This commit is contained in:
Diogo Cordeiro 2018-07-27 21:45:43 +01:00
parent e0d5b2ebd7
commit 01c16fcef0
3 changed files with 54 additions and 40 deletions

View File

@ -302,9 +302,11 @@ class ActivityPubPlugin extends Plugin
public function onEndWebFingerProfileLinks(XML_XRD &$xrd, Managed_DataObject $object) public function onEndWebFingerProfileLinks(XML_XRD &$xrd, Managed_DataObject $object)
{ {
if ($object->isPerson()) { if ($object->isPerson()) {
$link = new XML_XRD_Element_Link ('self', $link = new XML_XRD_Element_Link(
'self',
ActivityPubPlugin::actor_uri($object->getProfile()), ActivityPubPlugin::actor_uri($object->getProfile()),
'application/activity+json'); 'application/activity+json'
);
$xrd->links[] = clone ($link); $xrd->links[] = clone ($link);
} }
} }

View File

@ -86,37 +86,47 @@ class Activitypub_profile extends Profile
$res = [ $res = [
'@context' => [ '@context' => [
"https://www.w3.org/ns/activitystreams", "https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1",
[ [
"@language" => "en" 'manuallyApprovesFollowers' => 'as=>manuallyApprovesFollowers',
'sensitive' => 'as=>sensitive',
'movedTo' => 'as=>movedTo',
'Hashtag' => 'as=>Hashtag',
'ostatus' => 'http=>//ostatus.org#',
'atomUri' => 'ostatus=>atomUri',
'inReplyToAtomUri' => 'ostatus=>inReplyToAtomUri',
'conversation' => 'ostatus=>conversation',
'schema' => 'http=>//schema.org#',
'PropertyValue' => 'schema=>PropertyValue',
'value' => 'schema=>value'
] ]
], ],
'id' => $uri, 'id' => $uri,
'type' => 'Person', 'type' => 'Person',
'preferredUsername' => $profile->getNickname(),
'is_local' => $profile->isLocal(),
'inbox' => common_local_url("apActorInbox", array("id" => $id)),
'name' => $profile->getFullname(),
'followers' => common_local_url("apActorFollowers", array("id" => $id)),
'followers_count' => $profile->subscriberCount(),
'following' => common_local_url("apActorFollowing", array("id" => $id)), 'following' => common_local_url("apActorFollowing", array("id" => $id)),
'following_count' => $profile->subscriptionCount(), 'followers' => common_local_url("apActorFollowers", array("id" => $id)),
'liked' => common_local_url("apActorLiked", array("id" => $id)), 'liked' => common_local_url("apActorLiked", array("id" => $id)),
'liked_count' => Fave::countByProfile($profile), 'inbox' => common_local_url("apActorInbox", array("id" => $id)),
'preferredUsername' => $profile->getNickname(),
'name' => $profile->getFullname(),
'summary' => ($desc = $profile->getDescription()) == null ? "" : $desc, 'summary' => ($desc = $profile->getDescription()) == null ? "" : $desc,
'url' => $profile->getUrl(),
'manuallyApprovesFollowers' => false,
'tag' => [],
'attachment' => [],
'icon' => [ 'icon' => [
'type' => 'Image', 'type' => 'Image',
'width' => AVATAR_PROFILE_SIZE, 'mediaType' => 'image/jpeg',
'height' => AVATAR_PROFILE_SIZE, 'url' => $profile->avatarUrl()
'url' => $profile->avatarUrl(AVATAR_PROFILE_SIZE)
] ]
]; ];
if ($profile->isLocal()) { if ($profile->isLocal()) {
$res["sharedInbox"] = common_local_url("apSharedInbox", array("id" => $id)); $res['endpoints']['sharedInbox'] = common_local_url("apSharedInbox", array("id" => $id));
} else { } else {
$aprofile = new Activitypub_profile(); $aprofile = new Activitypub_profile();
$aprofile = $aprofile->from_profile($profile); $aprofile = $aprofile->from_profile($profile);
$res["sharedInbox"] = $aprofile->sharedInboxuri; $res['endpoints']['sharedInbox'] = $aprofile->sharedInboxuri;
} }
return $res; return $res;

View File

@ -203,12 +203,12 @@ class Activitypub_explorer
private function store_profile($res) private function store_profile($res)
{ {
$aprofile = new Activitypub_profile; $aprofile = new Activitypub_profile;
$aprofile->uri = $res["id"]; $aprofile->uri = $res['id'];
$aprofile->nickname = $res["preferredUsername"]; $aprofile->nickname = $res['preferredUsername'];
$aprofile->fullname = $res["name"]; $aprofile->fullname = $res['name'];
$aprofile->bio = substr($res["summary"], 0, 1000); $aprofile->bio = substr($res['summary'], 0, 1000);
$aprofile->inboxuri = $res["inbox"]; $aprofile->inboxuri = $res['inbox'];
$aprofile->sharedInboxuri = isset($res["sharedInbox"]) ? $res["sharedInbox"] : $res["inbox"]; $aprofile->sharedInboxuri = isset($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : $res['inbox'];
$aprofile->do_insert(); $aprofile->do_insert();
@ -225,7 +225,7 @@ class Activitypub_explorer
*/ */
private static function validate_remote_response($res) private static function validate_remote_response($res)
{ {
if (!isset($res["id"], $res["preferredUsername"], $res["name"], $res["summary"], $res["inbox"])) { if (!isset($res['id'], $res['preferredUsername'], $res['name'], $res['summary'], $res['inbox'])) {
return false; return false;
} }
@ -247,12 +247,14 @@ class Activitypub_explorer
$headers[] = 'User-Agent: GNUSocialBot v0.1 - https://gnu.io/social'; $headers[] = 'User-Agent: GNUSocialBot v0.1 - https://gnu.io/social';
$response = $client->get($url, $headers); $response = $client->get($url, $headers);
if (!$response->isOk()) { if (!$response->isOk()) {
throw new Exception("Invalid Actor URL."); throw new Exception('Invalid Actor URL.');
} }
$res = json_decode($response->getBody(), JSON_UNESCAPED_SLASHES); $res = json_decode($response->getBody(), JSON_UNESCAPED_SLASHES);
if (self::validate_remote_response($res)) { if (self::validate_remote_response($res)) {
return array("inbox" => $res["inbox"], return [
"sharedInbox" => isset($res["sharedInbox"]) ? $res["sharedInbox"] : $res["inbox"]); 'inbox' => $res['inbox'],
'sharedInbox' => isset($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : $res['inbox']
];
} }
return false; return false;