From 1b781bb0c1b806d541a01df6607e177134a74935 Mon Sep 17 00:00:00 2001 From: Jan De Dobbeleer Date: Fri, 28 Apr 2023 11:12:25 +0200 Subject: [PATCH] docs: add webfinger API --- website/api/webfinger/function.json | 18 +++++++ website/api/webfinger/index.js | 83 +++++++++++++++++++++++++++++ website/staticwebapp.config.json | 9 +++- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 website/api/webfinger/function.json create mode 100644 website/api/webfinger/index.js diff --git a/website/api/webfinger/function.json b/website/api/webfinger/function.json new file mode 100644 index 00000000..c7642f69 --- /dev/null +++ b/website/api/webfinger/function.json @@ -0,0 +1,18 @@ +{ + "bindings": [ + { + "authLevel": "anonymous", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get" + ] + }, + { + "type": "http", + "direction": "out", + "name": "res" + } + ] +} diff --git a/website/api/webfinger/index.js b/website/api/webfinger/index.js new file mode 100644 index 00000000..df2a0dd8 --- /dev/null +++ b/website/api/webfinger/index.js @@ -0,0 +1,83 @@ +// GET https://${MASTODON_DOMAIN}/.well-known/webfinger?resource=acct:${MASTODON_USER}@${MASTODON_DOMAIN} + +function trimPrefix(str, prefix) { + if (str.startsWith(prefix)) { + return str.slice(prefix.length) + } + return str +} + +function webfinger(username) { + return { + "subject": `acct:${username}@hachyderm.io`, + "aliases": [ + `https://hachyderm.io/@${username}`, + `https://hachyderm.io/users/${username}` + ], + "links": [ + { + "rel": "http://webfinger.net/rel/profile-page", + "type": "text/html", + "href": `https://hachyderm.io/@${username}` + }, + { + "rel": "self", + "type": "application/activity+json", + "href": `https://hachyderm.io/users/${username}` + }, + { + "rel": "http://ostatus.org/schema/1.0/subscribe", + "template": "https://hachyderm.io/authorize_interaction?uri={uri}" + } + ] + }; +} + +module.exports = async function (context, req) { + context.log('Webfinger function processed a request'); + + try { + let resource = req.query.resource; + if (!resource) { + resource = "jan@social.ohmyposh.dev"; + } + + resource = trimPrefix(resource, "acct:"); + + context.log(`Creating Mastodon user info for ${resource}`); + + let body; + + switch (resource) { + case "releasebot@social.ohmyposh.dev": + body = webfinger("releasebot"); + break; + case "jan@social.ohmyposh.dev": + body = webfinger("jandedobbeleer"); + break; + default: + context.log(`Unknown resource: ${resource}`); + context.res = { + body: "Unknown resource", + status: 400 + }; + return; + } + + // return body as application/jrd+json + context.res = { + body: body, + headers: { + "Content-Type": "application/jrd+json" + } + }; + } catch (error) { + context.log(error); + context.res = { + body: { + "message": (error.message) ? error.message : "unable to create webfinger" + }, + status: 500 + }; + } +} diff --git a/website/staticwebapp.config.json b/website/staticwebapp.config.json index 1a262873..fa423426 100644 --- a/website/staticwebapp.config.json +++ b/website/staticwebapp.config.json @@ -1,5 +1,12 @@ { "platform": { "apiRuntime": "node:16" - } + }, + "routes": [ + { + "route": "/.well-known/webfinger*", + "methods": ["GET"], + "rewrite": "/api/webfinger" + } + ] }