summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2018-04-01 14:13:21 +0900
committerGitHub <noreply@github.com>2018-04-01 14:13:21 +0900
commitcbe544a97bb98cb9c49d73322e2abb838ebb8d16 (patch)
tree05fc0cc7a2798abd79cc0fd3e2cc6231d5670449 /src
parentMerge pull request #1347 from akihikodaki/user (diff)
parentImplement WebFinger (diff)
downloadmisskey-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.ts2
-rw-r--r--src/server/webfinger.ts47
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;