const config = require('../config') const Helpers = require('./helpers') const crypto = require('crypto') const log = require('../log') const settingsController = require('../api/controller/settings') module.exports = { // follow request from fediverse async follow (req, res) { const body = req.body const settings = res.locals.settings if (typeof body.object !== 'string') { return } const username = body.object.replace(`${config.baseurl}/federation/u/`, '') if (username !== settings.instance_name) { log.warn(`Following the wrong user: ${username} instead of ${settings.instance_name} (could be a wrong config.baseurl)`) return res.status(404).send('User not found') } // check for duplicate // if (!user.followers.includes(body.actor)) { // await user.addFollowers([req.fedi_user.id]) // await user.update({ followers: [...user.followers, body.actor] }) await res.locals.fedi_user.update({ follower: true }) log.info(`Followed by ${body.actor}`) const guid = crypto.randomBytes(16).toString('hex') const message = { '@context': 'https://www.w3.org/ns/activitystreams', id: `${config.baseurl}/federation/${guid}`, type: 'Accept', actor: `${config.baseurl}/federation/u/${username}`, object: body } Helpers.signAndSend(JSON.stringify(message), res.locals.fedi_user.object.inbox) res.sendStatus(200) }, // unfollow request from fediverse async unfollow (req, res) { const settings = res.locals.settings const body = req.body const username = body.object.object.replace(`${config.baseurl}/federation/u/`, '') if (username !== settings.instance_name) { log.warn(`Unfollowing wrong user: ${username} instead of ${settings.instance_name}`) return res.status(404).send('User not found') } if (body.actor !== body.object.actor || body.actor !== res.locals.fedi_user.ap_id) { log.info('Unfollow an user created by a different actor !?!?') return res.status(400).send('Bad things') } await res.locals.fedi_user.update({ follower: false }) log.info(`Unfollowed by ${body.actor}`) res.sendStatus(200) } }