implement ActivityPub user endpoint

This commit is contained in:
jesopo 2019-09-10 16:21:31 +01:00
parent 49527495b8
commit 7dac75e566

View file

@ -1,3 +1,5 @@
#--require-config tls-certificate
import urllib.parse import urllib.parse
from src import ModuleManager, utils from src import ModuleManager, utils
@ -137,11 +139,17 @@ class Module(ModuleManager.BaseModule):
event["stdout"].write("%s: %s - %s" % (preferred_username, event["stdout"].write("%s: %s - %s" % (preferred_username,
content, shorturl)) content, shorturl))
def _ap_self(self):
our_username = self.bot.get_setting("fediverse", None)
return _parse_username(our_username)
def _ap_self_id(self, for_url, our_username):
return "https://%s" % url_for("api", "ap-user", {"u": our_username})
@utils.hook("api.get.ap-webfinger") @utils.hook("api.get.ap-webfinger")
@utils.kwarg("authenticated", False) @utils.kwarg("authenticated", False)
def webfinger(self, event): def ap_webfinger(self, event):
our_username = self.bot.get_setting("fediverse", None) our_username, our_instance = self._ap_self()
our_username, our_instance = _parse_username(our_username)
resource = event["params"].get("resource", None) resource = event["params"].get("resource", None)
if resource and resource.startswith("acct:"): if resource and resource.startswith("acct:"):
@ -150,11 +158,10 @@ class Module(ModuleManager.BaseModule):
if (requested_username == our_username and if (requested_username == our_username and
requested_instance == our_instance): requested_instance == our_instance):
self_id = self._ap_self_id(event["url_for"], our_username)
event["response"].content_type = "application/jrd+json" event["response"].content_type = "application/jrd+json"
location = "https://%s" % event["url_for"]("api", "ap-user",
{"u": our_username})
event["response"].write_json({ event["response"].write_json({
"aliases": [location], "aliases": [location],
"links": [{ "links": [{
@ -164,3 +171,34 @@ class Module(ModuleManager.BaseModule):
}], }],
"subject": resource "subject": resource
}) })
@utils.hook("api.get.ap-user")
@utils.kwarg("authenticated", False)
def ap_user(self, event):
our_username, our_instance = self._ap_self()
username = event["params"].get("u", None)
if username and username == our_username:
self_id = self._ap_self._id(event["url_for"], our_username)
inbox = event["url_for"]("api", "ap-inbox", {"u": our_username})
cert_filename = self.bot.config["tls-certificate"]
with open(cert_filename) as cert_file:
cert = cert_file.read()
event["response"].content_type = ("application/ld+json; "
"profile=\"https://www.w3.org/ns/activitystreams\"")
event["response"].write_json({
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1"
],
"id": self_id,
"type": "Person",
"preferredUsername": our_username,
"inbox": index,
"publicKey": {
"id": "%s#key" % self_id,
"owner": self_id,
"publicKeyPem": cert
}
})