diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2018-04-01 14:13:21 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-01 14:13:21 +0900 |
| commit | cbe544a97bb98cb9c49d73322e2abb838ebb8d16 (patch) | |
| tree | 05fc0cc7a2798abd79cc0fd3e2cc6231d5670449 /src | |
| parent | Merge pull request #1347 from akihikodaki/user (diff) | |
| parent | Implement WebFinger (diff) | |
| download | misskey-cbe544a97bb98cb9c49d73322e2abb838ebb8d16.tar.gz misskey-cbe544a97bb98cb9c49d73322e2abb838ebb8d16.tar.bz2 misskey-cbe544a97bb98cb9c49d73322e2abb838ebb8d16.zip | |
Merge pull request #1348 from akihikodaki/webfinger
Implement WebFinger
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/index.ts | 2 | ||||
| -rw-r--r-- | src/server/webfinger.ts | 47 |
2 files changed, 49 insertions, 0 deletions
diff --git a/src/server/index.ts b/src/server/index.ts index 92d46d46a2..1874790116 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -10,6 +10,7 @@ import * as morgan from 'morgan'; import Accesses from 'accesses'; import activityPub from './activitypub'; +import webFinger from './webfinger'; import log from './log-request'; import config from '../conf'; @@ -55,6 +56,7 @@ app.use((req, res, next) => { app.use('/api', require('./api')); app.use('/files', require('./file')); app.use(activityPub); +app.use(webFinger); app.use(require('./web')); function createServer() { 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; |