From 8424c4026afd7304880a4ce8138a04ffb3d8c938 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 30 Aug 2019 16:50:12 +0200 Subject: Add auto follow back support for instances --- server/lib/activitypub/follow.ts | 36 ++++++++++++++++++++++++ server/lib/activitypub/process/process-accept.ts | 2 +- server/lib/activitypub/process/process-follow.ts | 20 +++++++------ server/lib/activitypub/send/send-follow.ts | 1 - 4 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 server/lib/activitypub/follow.ts (limited to 'server/lib/activitypub') diff --git a/server/lib/activitypub/follow.ts b/server/lib/activitypub/follow.ts new file mode 100644 index 000000000..c57e43c91 --- /dev/null +++ b/server/lib/activitypub/follow.ts @@ -0,0 +1,36 @@ +import { MActorFollowActors } from '../../typings/models' +import { CONFIG } from '../../initializers/config' +import { SERVER_ACTOR_NAME } from '../../initializers/constants' +import { JobQueue } from '../job-queue' +import { logger } from '../../helpers/logger' +import { getServerActor } from '../../helpers/utils' +import { ServerModel } from '@server/models/server/server' + +async function autoFollowBackIfNeeded (actorFollow: MActorFollowActors) { + if (!CONFIG.FOLLOWINGS.INSTANCE.AUTO_FOLLOW_BACK.ENABLED) return + + const follower = actorFollow.ActorFollower + + if (follower.type === 'Application' && follower.preferredUsername === SERVER_ACTOR_NAME) { + logger.info('Auto follow back %s.', follower.url) + + const me = await getServerActor() + + const server = await ServerModel.load(follower.serverId) + const host = server.host + + const payload = { + host, + name: SERVER_ACTOR_NAME, + followerActorId: me.id, + isAutoFollow: true + } + + JobQueue.Instance.createJob({ type: 'activitypub-follow', payload }) + .catch(err => logger.error('Cannot create auto follow back job for %s.', host, err)) + } +} + +export { + autoFollowBackIfNeeded +} diff --git a/server/lib/activitypub/process/process-accept.ts b/server/lib/activitypub/process/process-accept.ts index 86f7c764d..dcfbb2c84 100644 --- a/server/lib/activitypub/process/process-accept.ts +++ b/server/lib/activitypub/process/process-accept.ts @@ -24,7 +24,7 @@ async function processAccept (actor: MActorDefault, targetActor: MActorSignature if (!follow) throw new Error('Cannot find associated follow.') if (follow.state !== 'accepted') { - follow.set('state', 'accepted') + follow.state = 'accepted' await follow.save() await addFetchOutboxJob(targetActor) diff --git a/server/lib/activitypub/process/process-follow.ts b/server/lib/activitypub/process/process-follow.ts index bc5660395..85f22d654 100644 --- a/server/lib/activitypub/process/process-follow.ts +++ b/server/lib/activitypub/process/process-follow.ts @@ -10,7 +10,8 @@ import { getAPId } from '../../../helpers/activitypub' import { getServerActor } from '../../../helpers/utils' import { CONFIG } from '../../../initializers/config' import { APProcessorOptions } from '../../../typings/activitypub-processor.model' -import { MAccount, MActorFollowActors, MActorFollowFull, MActorSignature } from '../../../typings/models' +import { MActorFollowActors, MActorSignature } from '../../../typings/models' +import { autoFollowBackIfNeeded } from '../follow' async function processFollowActivity (options: APProcessorOptions) { const { activity, byActor } = options @@ -28,7 +29,7 @@ export { // --------------------------------------------------------------------------- async function processFollow (byActor: MActorSignature, targetActorURL: string) { - const { actorFollow, created, isFollowingInstance } = await sequelizeTypescript.transaction(async t => { + const { actorFollow, created, isFollowingInstance, targetActor } = await sequelizeTypescript.transaction(async t => { const targetActor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(targetActorURL, t) if (!targetActor) throw new Error('Unknown actor') @@ -67,21 +68,24 @@ async function processFollow (byActor: MActorSignature, targetActorURL: string) actorFollow.ActorFollowing = targetActor // Target sends to actor he accepted the follow request - if (actorFollow.state === 'accepted') await sendAccept(actorFollow) + if (actorFollow.state === 'accepted') { + await sendAccept(actorFollow) + await autoFollowBackIfNeeded(actorFollow) + } - return { actorFollow, created, isFollowingInstance } + return { actorFollow, created, isFollowingInstance, targetActor } }) // Rejected if (!actorFollow) return if (created) { + const follower = await ActorModel.loadFull(byActor.id) + const actorFollowFull = Object.assign(actorFollow, { ActorFollowing: targetActor, ActorFollower: follower }) + if (isFollowingInstance) { - Notifier.Instance.notifyOfNewInstanceFollow(actorFollow) + Notifier.Instance.notifyOfNewInstanceFollow(actorFollowFull) } else { - const actorFollowFull = actorFollow as MActorFollowFull - actorFollowFull.ActorFollower.Account = await actorFollow.ActorFollower.$get('Account') as MAccount - Notifier.Instance.notifyOfNewUserFollow(actorFollowFull) } } diff --git a/server/lib/activitypub/send/send-follow.ts b/server/lib/activitypub/send/send-follow.ts index 6b17b25da..ce400d8ff 100644 --- a/server/lib/activitypub/send/send-follow.ts +++ b/server/lib/activitypub/send/send-follow.ts @@ -1,5 +1,4 @@ import { ActivityFollow } from '../../../../shared/models/activitypub' -import { ActorFollowModel } from '../../../models/activitypub/actor-follow' import { getActorFollowActivityPubUrl } from '../url' import { unicastTo } from './utils' import { logger } from '../../../helpers/logger' -- cgit v1.2.3