Skip to content
Snippets Groups Projects
Commit fabf2334 authored by Akihiko Odaki's avatar Akihiko Odaki
Browse files

Implement inbox

parent 9a71a8b9
No related branches found
No related tags found
No related merge requests found
......@@ -134,6 +134,7 @@
"hard-source-webpack-plugin": "0.6.4",
"highlight.js": "9.12.0",
"html-minifier": "3.5.12",
"http-signature": "^1.2.0",
"inquirer": "5.2.0",
"is-root": "2.0.0",
"is-url": "1.2.4",
......
......@@ -62,6 +62,10 @@ export default async (value, usernameLower, hostLower, acctLower) => {
host: toUnicode(finger.subject.replace(/^.*?@/, '')),
hostLower,
account: {
publicKey: {
id: object.publicKey.id,
publicKeyPem: object.publicKey.publicKeyPem
},
uri: object.id,
},
});
......
......@@ -71,6 +71,10 @@ export type ILocalAccount = {
export type IRemoteAccount = {
uri: string;
publicKey: {
id: string;
publicKeyPem: string;
};
};
export type IUser = {
......
import * as bodyParser from 'body-parser';
import * as express from 'express';
import { parseRequest, verifySignature } from 'http-signature';
import User, { IRemoteAccount } from '../../models/user';
import queue from '../../queue';
const app = express();
app.disable('x-powered-by');
app.use(bodyParser.json());
app.get('/@:user/inbox', async (req, res) => {
let parsed;
try {
parsed = parseRequest(req);
} catch (exception) {
return res.sendStatus(401);
}
const user = await User.findOne({
host: { $ne: null },
account: { publicKey: { id: parsed.keyId } }
});
if (user === null) {
return res.sendStatus(401);
}
if (!verifySignature(parsed, (user.account as IRemoteAccount).publicKey.publicKeyPem)) {
return res.sendStatus(401);
}
queue.create('http', {
type: 'performActivityPub',
actor: user._id,
outbox: req.body,
}).save();
return res.sendStatus(200);
});
export default app;
import * as express from 'express';
import user from './user';
import inbox from './inbox';
const app = express();
app.disable('x-powered-by');
app.use(user);
app.use(inbox);
export default app;
import * as express from 'express';
import config from '../conf';
import { extractPublic } from '../crypto_key';
import parseAcct from '../common/user/parse-acct';
import User, { ILocalAccount } from '../models/user';
import config from '../../conf';
import { extractPublic } from '../../crypto_key';
import parseAcct from '../../common/user/parse-acct';
import User, { ILocalAccount } from '../../models/user';
const app = express();
app.disable('x-powered-by');
app.get('/@:user', async (req, res, next) => {
const accepted = req.accepts(['html', 'application/activity+json', 'application/ld+json']);
if (!['application/activity+json', 'application/ld+json'].includes(accepted)) {
if (!(['application/activity+json', 'application/ld+json'] as Array<any>).includes(accepted)) {
return next();
}
......@@ -40,6 +39,7 @@ app.get('/@:user', async (req, res, next) => {
],
type: 'Person',
id,
inbox: `${id}/inbox`,
preferredUsername: user.username,
name: user.name,
summary: user.description,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment