diff options
-rw-r--r-- | server/helpers/custom-validators/activitypub/activity.ts | 10 | ||||
-rw-r--r-- | server/helpers/custom-validators/activitypub/actor.ts | 5 | ||||
-rw-r--r-- | server/lib/activitypub/process/process-reject.ts | 32 | ||||
-rw-r--r-- | server/lib/activitypub/process/process.ts | 2 | ||||
-rw-r--r-- | shared/models/activitypub/activity.ts | 9 |
5 files changed, 55 insertions, 3 deletions
diff --git a/server/helpers/custom-validators/activitypub/activity.ts b/server/helpers/custom-validators/activitypub/activity.ts index 577cf4b52..632f14223 100644 --- a/server/helpers/custom-validators/activitypub/activity.ts +++ b/server/helpers/custom-validators/activitypub/activity.ts | |||
@@ -1,6 +1,9 @@ | |||
1 | import * as validator from 'validator' | 1 | import * as validator from 'validator' |
2 | import { Activity, ActivityType } from '../../../../shared/models/activitypub' | 2 | import { Activity, ActivityType } from '../../../../shared/models/activitypub' |
3 | import { isActorAcceptActivityValid, isActorDeleteActivityValid, isActorFollowActivityValid, isActorUpdateActivityValid } from './actor' | 3 | import { |
4 | isActorAcceptActivityValid, isActorDeleteActivityValid, isActorFollowActivityValid, isActorRejectActivityValid, | ||
5 | isActorUpdateActivityValid | ||
6 | } from './actor' | ||
4 | import { isAnnounceActivityValid } from './announce' | 7 | import { isAnnounceActivityValid } from './announce' |
5 | import { isActivityPubUrlValid } from './misc' | 8 | import { isActivityPubUrlValid } from './misc' |
6 | import { isDislikeActivityValid, isLikeActivityValid } from './rate' | 9 | import { isDislikeActivityValid, isLikeActivityValid } from './rate' |
@@ -33,6 +36,7 @@ const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean | |||
33 | Delete: checkDeleteActivity, | 36 | Delete: checkDeleteActivity, |
34 | Follow: checkFollowActivity, | 37 | Follow: checkFollowActivity, |
35 | Accept: checkAcceptActivity, | 38 | Accept: checkAcceptActivity, |
39 | Reject: checkRejectActivity, | ||
36 | Announce: checkAnnounceActivity, | 40 | Announce: checkAnnounceActivity, |
37 | Undo: checkUndoActivity, | 41 | Undo: checkUndoActivity, |
38 | Like: checkLikeActivity | 42 | Like: checkLikeActivity |
@@ -82,6 +86,10 @@ function checkAcceptActivity (activity: any) { | |||
82 | return isActorAcceptActivityValid(activity) | 86 | return isActorAcceptActivityValid(activity) |
83 | } | 87 | } |
84 | 88 | ||
89 | function checkRejectActivity (activity: any) { | ||
90 | return isActorRejectActivityValid(activity) | ||
91 | } | ||
92 | |||
85 | function checkAnnounceActivity (activity: any) { | 93 | function checkAnnounceActivity (activity: any) { |
86 | return isAnnounceActivityValid(activity) | 94 | return isAnnounceActivityValid(activity) |
87 | } | 95 | } |
diff --git a/server/helpers/custom-validators/activitypub/actor.ts b/server/helpers/custom-validators/activitypub/actor.ts index e1a4b5b8f..df0edc30e 100644 --- a/server/helpers/custom-validators/activitypub/actor.ts +++ b/server/helpers/custom-validators/activitypub/actor.ts | |||
@@ -78,6 +78,10 @@ function isActorAcceptActivityValid (activity: any) { | |||
78 | return isBaseActivityValid(activity, 'Accept') | 78 | return isBaseActivityValid(activity, 'Accept') |
79 | } | 79 | } |
80 | 80 | ||
81 | function isActorRejectActivityValid (activity: any) { | ||
82 | return isBaseActivityValid(activity, 'Reject') | ||
83 | } | ||
84 | |||
81 | function isActorUpdateActivityValid (activity: any) { | 85 | function isActorUpdateActivityValid (activity: any) { |
82 | return isBaseActivityValid(activity, 'Update') && | 86 | return isBaseActivityValid(activity, 'Update') && |
83 | isActorObjectValid(activity.object) | 87 | isActorObjectValid(activity.object) |
@@ -97,6 +101,7 @@ export { | |||
97 | isActorFollowersCountValid, | 101 | isActorFollowersCountValid, |
98 | isActorFollowActivityValid, | 102 | isActorFollowActivityValid, |
99 | isActorAcceptActivityValid, | 103 | isActorAcceptActivityValid, |
104 | isActorRejectActivityValid, | ||
100 | isActorDeleteActivityValid, | 105 | isActorDeleteActivityValid, |
101 | isActorUpdateActivityValid | 106 | isActorUpdateActivityValid |
102 | } | 107 | } |
diff --git a/server/lib/activitypub/process/process-reject.ts b/server/lib/activitypub/process/process-reject.ts new file mode 100644 index 000000000..b2de28d79 --- /dev/null +++ b/server/lib/activitypub/process/process-reject.ts | |||
@@ -0,0 +1,32 @@ | |||
1 | import { ActivityReject } from '../../../../shared/models/activitypub/activity' | ||
2 | import { sequelizeTypescript } from '../../../initializers' | ||
3 | import { ActorModel } from '../../../models/activitypub/actor' | ||
4 | import { ActorFollowModel } from '../../../models/activitypub/actor-follow' | ||
5 | |||
6 | async function processRejectActivity (activity: ActivityReject, inboxActor?: ActorModel) { | ||
7 | if (inboxActor === undefined) throw new Error('Need to reject on explicit inbox.') | ||
8 | |||
9 | const targetActor = await ActorModel.loadByUrl(activity.actor) | ||
10 | |||
11 | return processReject(inboxActor, targetActor) | ||
12 | } | ||
13 | |||
14 | // --------------------------------------------------------------------------- | ||
15 | |||
16 | export { | ||
17 | processRejectActivity | ||
18 | } | ||
19 | |||
20 | // --------------------------------------------------------------------------- | ||
21 | |||
22 | async function processReject (actor: ActorModel, targetActor: ActorModel) { | ||
23 | return sequelizeTypescript.transaction(async t => { | ||
24 | const actorFollow = await ActorFollowModel.loadByActorAndTarget(actor.id, targetActor.id, t) | ||
25 | |||
26 | if (!actorFollow) throw new Error(`'Unknown actor follow ${actor.id} -> ${targetActor.id}.`) | ||
27 | |||
28 | await actorFollow.destroy({ transaction: t }) | ||
29 | |||
30 | return undefined | ||
31 | }) | ||
32 | } | ||
diff --git a/server/lib/activitypub/process/process.ts b/server/lib/activitypub/process/process.ts index 62d310f21..810c28e26 100644 --- a/server/lib/activitypub/process/process.ts +++ b/server/lib/activitypub/process/process.ts | |||
@@ -7,6 +7,7 @@ import { processCreateActivity } from './process-create' | |||
7 | import { processDeleteActivity } from './process-delete' | 7 | import { processDeleteActivity } from './process-delete' |
8 | import { processFollowActivity } from './process-follow' | 8 | import { processFollowActivity } from './process-follow' |
9 | import { processLikeActivity } from './process-like' | 9 | import { processLikeActivity } from './process-like' |
10 | import { processRejectActivity } from './process-reject' | ||
10 | import { processUndoActivity } from './process-undo' | 11 | import { processUndoActivity } from './process-undo' |
11 | import { processUpdateActivity } from './process-update' | 12 | import { processUpdateActivity } from './process-update' |
12 | 13 | ||
@@ -16,6 +17,7 @@ const processActivity: { [ P in ActivityType ]: (activity: Activity, inboxActor? | |||
16 | Delete: processDeleteActivity, | 17 | Delete: processDeleteActivity, |
17 | Follow: processFollowActivity, | 18 | Follow: processFollowActivity, |
18 | Accept: processAcceptActivity, | 19 | Accept: processAcceptActivity, |
20 | Reject: processRejectActivity, | ||
19 | Announce: processAnnounceActivity, | 21 | Announce: processAnnounceActivity, |
20 | Undo: processUndoActivity, | 22 | Undo: processUndoActivity, |
21 | Like: processLikeActivity | 23 | Like: processLikeActivity |
diff --git a/shared/models/activitypub/activity.ts b/shared/models/activitypub/activity.ts index 8cede49a0..aa25db446 100644 --- a/shared/models/activitypub/activity.ts +++ b/shared/models/activitypub/activity.ts | |||
@@ -8,9 +8,9 @@ import { ViewObject } from './objects/view-object' | |||
8 | 8 | ||
9 | export type Activity = ActivityCreate | ActivityUpdate | | 9 | export type Activity = ActivityCreate | ActivityUpdate | |
10 | ActivityDelete | ActivityFollow | ActivityAccept | ActivityAnnounce | | 10 | ActivityDelete | ActivityFollow | ActivityAccept | ActivityAnnounce | |
11 | ActivityUndo | ActivityLike | 11 | ActivityUndo | ActivityLike | ActivityReject |
12 | 12 | ||
13 | export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 13 | export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 'Reject' |
14 | 14 | ||
15 | export interface ActivityAudience { | 15 | export interface ActivityAudience { |
16 | to: string[] | 16 | to: string[] |
@@ -52,6 +52,11 @@ export interface ActivityAccept extends BaseActivity { | |||
52 | object: ActivityFollow | 52 | object: ActivityFollow |
53 | } | 53 | } |
54 | 54 | ||
55 | export interface ActivityReject extends BaseActivity { | ||
56 | type: 'Reject' | ||
57 | object: ActivityFollow | ||
58 | } | ||
59 | |||
55 | export interface ActivityAnnounce extends BaseActivity { | 60 | export interface ActivityAnnounce extends BaseActivity { |
56 | type: 'Announce' | 61 | type: 'Announce' |
57 | object: ActivityCreate | string | 62 | object: ActivityCreate | string |