From 4bbc373f134ecbf53f0198277663a25b26a19cc8 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 11 Jan 2018 17:37:49 +0100 Subject: [PATCH] Add reject processing for activitypub --- .../custom-validators/activitypub/activity.ts | 10 +++++- .../custom-validators/activitypub/actor.ts | 5 +++ .../lib/activitypub/process/process-reject.ts | 32 +++++++++++++++++++ server/lib/activitypub/process/process.ts | 2 ++ shared/models/activitypub/activity.ts | 9 ++++-- 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 server/lib/activitypub/process/process-reject.ts 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 @@ import * as validator from 'validator' import { Activity, ActivityType } from '../../../../shared/models/activitypub' -import { isActorAcceptActivityValid, isActorDeleteActivityValid, isActorFollowActivityValid, isActorUpdateActivityValid } from './actor' +import { + isActorAcceptActivityValid, isActorDeleteActivityValid, isActorFollowActivityValid, isActorRejectActivityValid, + isActorUpdateActivityValid +} from './actor' import { isAnnounceActivityValid } from './announce' import { isActivityPubUrlValid } from './misc' import { isDislikeActivityValid, isLikeActivityValid } from './rate' @@ -33,6 +36,7 @@ const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean Delete: checkDeleteActivity, Follow: checkFollowActivity, Accept: checkAcceptActivity, + Reject: checkRejectActivity, Announce: checkAnnounceActivity, Undo: checkUndoActivity, Like: checkLikeActivity @@ -82,6 +86,10 @@ function checkAcceptActivity (activity: any) { return isActorAcceptActivityValid(activity) } +function checkRejectActivity (activity: any) { + return isActorRejectActivityValid(activity) +} + function checkAnnounceActivity (activity: any) { return isAnnounceActivityValid(activity) } 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) { return isBaseActivityValid(activity, 'Accept') } +function isActorRejectActivityValid (activity: any) { + return isBaseActivityValid(activity, 'Reject') +} + function isActorUpdateActivityValid (activity: any) { return isBaseActivityValid(activity, 'Update') && isActorObjectValid(activity.object) @@ -97,6 +101,7 @@ export { isActorFollowersCountValid, isActorFollowActivityValid, isActorAcceptActivityValid, + isActorRejectActivityValid, isActorDeleteActivityValid, isActorUpdateActivityValid } 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 @@ +import { ActivityReject } from '../../../../shared/models/activitypub/activity' +import { sequelizeTypescript } from '../../../initializers' +import { ActorModel } from '../../../models/activitypub/actor' +import { ActorFollowModel } from '../../../models/activitypub/actor-follow' + +async function processRejectActivity (activity: ActivityReject, inboxActor?: ActorModel) { + if (inboxActor === undefined) throw new Error('Need to reject on explicit inbox.') + + const targetActor = await ActorModel.loadByUrl(activity.actor) + + return processReject(inboxActor, targetActor) +} + +// --------------------------------------------------------------------------- + +export { + processRejectActivity +} + +// --------------------------------------------------------------------------- + +async function processReject (actor: ActorModel, targetActor: ActorModel) { + return sequelizeTypescript.transaction(async t => { + const actorFollow = await ActorFollowModel.loadByActorAndTarget(actor.id, targetActor.id, t) + + if (!actorFollow) throw new Error(`'Unknown actor follow ${actor.id} -> ${targetActor.id}.`) + + await actorFollow.destroy({ transaction: t }) + + return undefined + }) +} 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' import { processDeleteActivity } from './process-delete' import { processFollowActivity } from './process-follow' import { processLikeActivity } from './process-like' +import { processRejectActivity } from './process-reject' import { processUndoActivity } from './process-undo' import { processUpdateActivity } from './process-update' @@ -16,6 +17,7 @@ const processActivity: { [ P in ActivityType ]: (activity: Activity, inboxActor? Delete: processDeleteActivity, Follow: processFollowActivity, Accept: processAcceptActivity, + Reject: processRejectActivity, Announce: processAnnounceActivity, Undo: processUndoActivity, 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' export type Activity = ActivityCreate | ActivityUpdate | ActivityDelete | ActivityFollow | ActivityAccept | ActivityAnnounce | - ActivityUndo | ActivityLike + ActivityUndo | ActivityLike | ActivityReject -export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' +export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 'Reject' export interface ActivityAudience { to: string[] @@ -52,6 +52,11 @@ export interface ActivityAccept extends BaseActivity { object: ActivityFollow } +export interface ActivityReject extends BaseActivity { + type: 'Reject' + object: ActivityFollow +} + export interface ActivityAnnounce extends BaseActivity { type: 'Announce' object: ActivityCreate | string -- 2.25.1