summaryrefslogtreecommitdiff
path: root/src/queue/processors/http/process-inbox.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/queue/processors/http/process-inbox.ts')
-rw-r--r--src/queue/processors/http/process-inbox.ts39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts
new file mode 100644
index 0000000000..de1dbd2f98
--- /dev/null
+++ b/src/queue/processors/http/process-inbox.ts
@@ -0,0 +1,39 @@
+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 }): Promise<void> => {
+ const keyIdLower = data.signature.keyId.toLowerCase();
+ let user;
+
+ if (keyIdLower.startsWith('acct:')) {
+ const { username, host } = parseAcct(keyIdLower.slice('acct:'.length));
+ if (host === null) {
+ throw 'request was made by local user';
+ }
+
+ 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(data.signature.keyId);
+ }
+ }
+
+ if (user === null) {
+ throw 'failed to resolve user';
+ }
+
+ if (!verifySignature(data.signature, user.account.publicKey.publicKeyPem)) {
+ throw 'signature verification failed';
+ }
+
+ await Promise.all(await act(new Resolver(), user, data.inbox, true));
+};