summaryrefslogtreecommitdiff
path: root/src/queue/processors/http/process-inbox.ts
blob: 7eeaa19f8a528fb2390e0d9036d42cf7a94f05d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { verifySignature } from 'http-signature';
import parseAcct from '../../../acct/parse';
import User, { IRemoteUser } from '../../../models/user';
import act from '../../../remote/activitypub/act';
import resolvePerson from '../../../remote/activitypub/resolve-person';
import Resolver from '../../../remote/activitypub/resolver';

export default async ({ data }, done) => {
	try {
		const keyIdLower = data.signature.keyId.toLowerCase();
		let user;

		if (keyIdLower.startsWith('acct:')) {
			const { username, host } = parseAcct(keyIdLower.slice('acct:'.length));
			if (host === null) {
				done();
				return;
			}

			user = await User.findOne({ usernameLower: username, hostLower: host }) as IRemoteUser;
		} else {
			user = await User.findOne({
				host: { $ne: null },
				'account.publicKey.id': data.signature.keyId
			}) as IRemoteUser;

			if (user === null) {
				user = await resolvePerson(new Resolver(), data.signature.keyId);
			}
		}

		if (user === null || !verifySignature(data.signature, user.account.publicKey.publicKeyPem)) {
			done();
			return;
		}

		await Promise.all(await act(new Resolver(), user, data.inbox, true));
	} catch (error) {
		done(error);
		return;
	}

	done();
};