]>
Commit | Line | Data |
---|---|---|
3fd3ab2d | 1 | import { ActivityFollow } from '../../../../shared/models/activitypub' |
da854ddd C |
2 | import { retryTransactionWrapper } from '../../../helpers/database-utils' |
3 | import { logger } from '../../../helpers/logger' | |
6dd9de95 | 4 | import { sequelizeTypescript } from '../../../initializers' |
50d6de9c C |
5 | import { ActorModel } from '../../../models/activitypub/actor' |
6 | import { ActorFollowModel } from '../../../models/activitypub/actor-follow' | |
5b9c965d | 7 | import { sendAccept, sendReject } from '../send' |
f7cc67b4 | 8 | import { Notifier } from '../../notifier' |
848f499d | 9 | import { getAPId } from '../../../helpers/activitypub' |
5b9c965d | 10 | import { getServerActor } from '../../../helpers/utils' |
6dd9de95 | 11 | import { CONFIG } from '../../../initializers/config' |
1198edf4 | 12 | import { APProcessorOptions } from '../../../typings/activitypub-processor.model' |
7a7724e6 | 13 | |
1198edf4 C |
14 | async function processFollowActivity (options: APProcessorOptions<ActivityFollow>) { |
15 | const { activity, byActor } = options | |
848f499d | 16 | const activityObject = getAPId(activity.object) |
7a7724e6 | 17 | |
e587e0ec | 18 | return retryTransactionWrapper(processFollow, byActor, activityObject) |
7a7724e6 C |
19 | } |
20 | ||
21 | // --------------------------------------------------------------------------- | |
22 | ||
23 | export { | |
24 | processFollowActivity | |
25 | } | |
26 | ||
27 | // --------------------------------------------------------------------------- | |
28 | ||
90d4bb81 | 29 | async function processFollow (actor: ActorModel, targetActorURL: string) { |
883993c8 | 30 | const { actorFollow, created, isFollowingInstance } = await sequelizeTypescript.transaction(async t => { |
e587e0ec | 31 | const targetActor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(targetActorURL, t) |
ce548a10 | 32 | |
50d6de9c C |
33 | if (!targetActor) throw new Error('Unknown actor') |
34 | if (targetActor.isOwned() === false) throw new Error('This is not a local actor.') | |
7a7724e6 | 35 | |
5b9c965d | 36 | const serverActor = await getServerActor() |
883993c8 C |
37 | const isFollowingInstance = targetActor.id === serverActor.id |
38 | ||
39 | if (isFollowingInstance && CONFIG.FOLLOWERS.INSTANCE.ENABLED === false) { | |
14893eb7 C |
40 | logger.info('Rejecting %s because instance followers are disabled.', targetActor.url) |
41 | ||
1735c825 C |
42 | await sendReject(actor, targetActor) |
43 | ||
44 | return { actorFollow: undefined } | |
5b9c965d C |
45 | } |
46 | ||
f7cc67b4 | 47 | const [ actorFollow, created ] = await ActorFollowModel.findOrCreate({ |
350e31d6 | 48 | where: { |
50d6de9c C |
49 | actorId: actor.id, |
50 | targetActorId: targetActor.id | |
350e31d6 C |
51 | }, |
52 | defaults: { | |
50d6de9c C |
53 | actorId: actor.id, |
54 | targetActorId: targetActor.id, | |
14893eb7 | 55 | state: CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL ? 'pending' : 'accepted' |
350e31d6 | 56 | }, |
ce548a10 | 57 | transaction: t |
350e31d6 | 58 | }) |
40ff5707 | 59 | |
14893eb7 | 60 | if (actorFollow.state !== 'accepted' && CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL === false) { |
50d6de9c C |
61 | actorFollow.state = 'accepted' |
62 | await actorFollow.save({ transaction: t }) | |
40ff5707 C |
63 | } |
64 | ||
50d6de9c C |
65 | actorFollow.ActorFollower = actor |
66 | actorFollow.ActorFollowing = targetActor | |
ce548a10 | 67 | |
50d6de9c | 68 | // Target sends to actor he accepted the follow request |
14893eb7 | 69 | if (actorFollow.state === 'accepted') await sendAccept(actorFollow) |
f7cc67b4 | 70 | |
883993c8 | 71 | return { actorFollow, created, isFollowingInstance } |
7a7724e6 | 72 | }) |
ce548a10 | 73 | |
883993c8 C |
74 | // Rejected |
75 | if (!actorFollow) return | |
76 | ||
77 | if (created) { | |
78 | if (isFollowingInstance) Notifier.Instance.notifyOfNewInstanceFollow(actorFollow) | |
79 | else Notifier.Instance.notifyOfNewUserFollow(actorFollow) | |
80 | } | |
f7cc67b4 | 81 | |
85414add | 82 | logger.info('Actor %s is followed by actor %s.', targetActorURL, actor.url) |
7a7724e6 | 83 | } |