summaryrefslogtreecommitdiff
path: root/src/server/webfinger.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/webfinger.ts')
-rw-r--r--src/server/webfinger.ts47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/server/webfinger.ts b/src/server/webfinger.ts
new file mode 100644
index 0000000000..864bb4af52
--- /dev/null
+++ b/src/server/webfinger.ts
@@ -0,0 +1,47 @@
+import config from '../conf';
+import parseAcct from '../common/user/parse-acct';
+import User from '../models/user';
+const express = require('express');
+
+const app = express();
+
+app.get('/.well-known/webfinger', async (req, res) => {
+ if (typeof req.query.resource !== 'string') {
+ return res.sendStatus(400);
+ }
+
+ const resourceLower = req.query.resource.toLowerCase();
+ const webPrefix = config.url.toLowerCase() + '/@';
+ let acctLower;
+
+ if (resourceLower.startsWith(webPrefix)) {
+ acctLower = resourceLower.slice(webPrefix.length);
+ } else if (resourceLower.startsWith('acct:')) {
+ acctLower = resourceLower.slice('acct:'.length);
+ } else {
+ acctLower = resourceLower;
+ }
+
+ const parsedAcctLower = parseAcct(acctLower);
+ if (![null, config.host.toLowerCase()].includes(parsedAcctLower.host)) {
+ return res.sendStatus(422);
+ }
+
+ const user = await User.findOne({ usernameLower: parsedAcctLower.username, host: null });
+ if (user === null) {
+ return res.sendStatus(404);
+ }
+
+ return res.json({
+ subject: `acct:${user.username}@${config.host}`,
+ links: [
+ {
+ rel: 'self',
+ type: 'application/activity+json',
+ href: `${config.url}/@${user.username}`
+ }
+ ]
+ });
+});
+
+export default app;