From 4bbc373f134ecbf53f0198277663a25b26a19cc8 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 11 Jan 2018 17:37:49 +0100 Subject: Add reject processing for activitypub --- .../custom-validators/activitypub/activity.ts | 10 ++++++- .../helpers/custom-validators/activitypub/actor.ts | 5 ++++ server/lib/activitypub/process/process-reject.ts | 32 ++++++++++++++++++++++ server/lib/activitypub/process/process.ts | 2 ++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 server/lib/activitypub/process/process-reject.ts (limited to 'server') 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 -- cgit v1.2.3