X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=server%2Flib%2Factivitypub%2Fprocess%2Fprocess-follow.ts;h=7eb7e828d00b91d87b6d45571ad3e94746768b5e;hb=26d6bf6533023326fa017812cf31bbe20c752d36;hp=ac3dd6ac403b8b4e4c29dc3848fa91cf01b0197a;hpb=6dd9de95dfa39bd5c1faed00d1dbd52cd112bae0;p=oweals%2Fpeertube.git diff --git a/server/lib/activitypub/process/process-follow.ts b/server/lib/activitypub/process/process-follow.ts index ac3dd6ac4..7eb7e828d 100644 --- a/server/lib/activitypub/process/process-follow.ts +++ b/server/lib/activitypub/process/process-follow.ts @@ -1,16 +1,20 @@ import { ActivityFollow } from '../../../../shared/models/activitypub' import { retryTransactionWrapper } from '../../../helpers/database-utils' import { logger } from '../../../helpers/logger' -import { sequelizeTypescript } from '../../../initializers' +import { sequelizeTypescript } from '../../../initializers/database' import { ActorModel } from '../../../models/activitypub/actor' import { ActorFollowModel } from '../../../models/activitypub/actor-follow' import { sendAccept, sendReject } from '../send' import { Notifier } from '../../notifier' import { getAPId } from '../../../helpers/activitypub' -import { getServerActor } from '../../../helpers/utils' import { CONFIG } from '../../../initializers/config' +import { APProcessorOptions } from '../../../types/activitypub-processor.model' +import { MActorFollowActors, MActorSignature } from '../../../types/models' +import { autoFollowBackIfNeeded } from '../follow' +import { getServerActor } from '@server/models/application/application' -async function processFollowActivity (activity: ActivityFollow, byActor: ActorModel) { +async function processFollowActivity (options: APProcessorOptions) { + const { activity, byActor } = options const activityObject = getAPId(activity.object) return retryTransactionWrapper(processFollow, byActor, activityObject) @@ -24,8 +28,8 @@ export { // --------------------------------------------------------------------------- -async function processFollow (actor: ActorModel, targetActorURL: string) { - const { actorFollow, created, isFollowingInstance } = await sequelizeTypescript.transaction(async t => { +async function processFollow (byActor: MActorSignature, targetActorURL: string) { + const { actorFollow, created, isFollowingInstance, targetActor } = await sequelizeTypescript.transaction(async t => { const targetActor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(targetActorURL, t) if (!targetActor) throw new Error('Unknown actor') @@ -37,43 +41,56 @@ async function processFollow (actor: ActorModel, targetActorURL: string) { if (isFollowingInstance && CONFIG.FOLLOWERS.INSTANCE.ENABLED === false) { logger.info('Rejecting %s because instance followers are disabled.', targetActor.url) - return sendReject(actor, targetActor) + await sendReject(byActor, targetActor) + + return { actorFollow: undefined as MActorFollowActors } } - const [ actorFollow, created ] = await ActorFollowModel.findOrCreate({ + const [ actorFollow, created ] = await ActorFollowModel.findOrCreate({ where: { - actorId: actor.id, + actorId: byActor.id, targetActorId: targetActor.id }, defaults: { - actorId: actor.id, + actorId: byActor.id, targetActorId: targetActor.id, state: CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL ? 'pending' : 'accepted' }, transaction: t }) - if (actorFollow.state !== 'accepted' && CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL === false) { + // Set the follow as accepted if the remote actor follows a channel or account + // Or if the instance automatically accepts followers + if (actorFollow.state !== 'accepted' && (isFollowingInstance === false || CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL === false)) { actorFollow.state = 'accepted' await actorFollow.save({ transaction: t }) } - actorFollow.ActorFollower = actor + actorFollow.ActorFollower = byActor 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) { - if (isFollowingInstance) Notifier.Instance.notifyOfNewInstanceFollow(actorFollow) - else Notifier.Instance.notifyOfNewUserFollow(actorFollow) + const follower = await ActorModel.loadFull(byActor.id) + const actorFollowFull = Object.assign(actorFollow, { ActorFollowing: targetActor, ActorFollower: follower }) + + if (isFollowingInstance) { + Notifier.Instance.notifyOfNewInstanceFollow(actorFollowFull) + } else { + Notifier.Instance.notifyOfNewUserFollow(actorFollowFull) + } } - logger.info('Actor %s is followed by actor %s.', targetActorURL, actor.url) + logger.info('Actor %s is followed by actor %s.', targetActorURL, byActor.url) }