1 import { Request, Response, NextFunction } from 'express'
3 import { database as db } from '../initializers'
6 getAccountFromWebfinger,
9 import { ActivityPubSignature } from '../../shared'
11 async function checkSignature (req: Request, res: Response, next: NextFunction) {
12 const signatureObject: ActivityPubSignature = req.body.signature
14 logger.debug('Checking signature of account %s...', signatureObject.creator)
16 let account = await db.Account.loadByUrl(signatureObject.creator)
18 // We don't have this account in our database, fetch it on remote
20 account = await getAccountFromWebfinger(signatureObject.creator)
23 return res.sendStatus(403)
26 // Save our new account in database
30 const verified = await isSignatureVerified(account, req.body)
31 if (verified === false) return res.sendStatus(403)
33 res.locals.signature.account = account
38 function executeIfActivityPub (fun: any | any[]) {
39 return (req: Request, res: Response, next: NextFunction) => {
40 if (req.header('Accept') !== 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"') {
44 if (Array.isArray(fun) === true) {
45 fun[0](req, res, next) // FIXME: doesn't work
48 return fun(req, res, next)
52 // ---------------------------------------------------------------------------