X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fhelpers%2Fcustom-validators%2Factivitypub%2Factivity.ts;h=e0d170d9d230d175ad01769f78e11b2c65d0887e;hb=418d092afa81e2c8fe8ac6838fc4b5eb0af6a782;hp=08e5ae0aad6b8e0052187aeb4fabe25f95be3433;hpb=d846501818c2d29e66e6fd141789cb04fd55a437;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/custom-validators/activitypub/activity.ts b/server/helpers/custom-validators/activitypub/activity.ts index 08e5ae0aa..e0d170d9d 100644 --- a/server/helpers/custom-validators/activitypub/activity.ts +++ b/server/helpers/custom-validators/activitypub/activity.ts @@ -1,20 +1,18 @@ import * as validator from 'validator' -import { isAccountAcceptActivityValid, isAccountDeleteActivityValid, isAccountFollowActivityValid } from './account' -import { isActivityPubUrlValid } from './misc' -import { - isVideoAnnounceValid, - isVideoChannelAnnounceValid, - isVideoChannelCreateActivityValid, - isVideoChannelDeleteActivityValid, - isVideoChannelUpdateActivityValid, - isVideoFlagValid, - isVideoTorrentAddActivityValid, - isVideoTorrentDeleteActivityValid, - isVideoTorrentUpdateActivityValid -} from './videos' +import { Activity, ActivityType } from '../../../../shared/models/activitypub' +import { sanitizeAndCheckActorObject } from './actor' +import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc' +import { isDislikeActivityValid } from './rate' +import { sanitizeAndCheckVideoCommentObject } from './video-comments' +import { sanitizeAndCheckVideoTorrentObject } from './videos' +import { isViewActivityValid } from './view' +import { exists } from '../misc' +import { isCacheFileObjectValid } from './cache-file' +import { isFlagActivityValid } from './flag' +import { isPlaylistObjectValid } from './playlist' function isRootActivityValid (activity: any) { - return Array.isArray(activity['@context']) && + return Array.isArray(activity['@context']) && ( ( (activity.type === 'Collection' || activity.type === 'OrderedCollection') && validator.isInt(activity.totalItems, { min: 0 }) && @@ -22,23 +20,33 @@ function isRootActivityValid (activity: any) { ) || ( isActivityPubUrlValid(activity.id) && - isActivityPubUrlValid(activity.actor) + exists(activity.actor) && + (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id)) ) + ) +} + +const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = { + Create: checkCreateActivity, + Update: checkUpdateActivity, + Delete: checkDeleteActivity, + Follow: checkFollowActivity, + Accept: checkAcceptActivity, + Reject: checkRejectActivity, + Announce: checkAnnounceActivity, + Undo: checkUndoActivity, + Like: checkLikeActivity, + View: checkViewActivity, + Flag: checkFlagActivity, + Dislike: checkDislikeActivity } function isActivityValid (activity: any) { - return isVideoTorrentAddActivityValid(activity) || - isVideoChannelCreateActivityValid(activity) || - isVideoTorrentUpdateActivityValid(activity) || - isVideoChannelUpdateActivityValid(activity) || - isVideoTorrentDeleteActivityValid(activity) || - isVideoChannelDeleteActivityValid(activity) || - isAccountDeleteActivityValid(activity) || - isAccountFollowActivityValid(activity) || - isAccountAcceptActivityValid(activity) || - isVideoFlagValid(activity) || - isVideoAnnounceValid(activity) || - isVideoChannelAnnounceValid(activity) + const checker = activityCheckers[activity.type] + // Unknown activity type + if (!checker) return false + + return checker(activity) } // --------------------------------------------------------------------------- @@ -47,3 +55,84 @@ export { isRootActivityValid, isActivityValid } + +// --------------------------------------------------------------------------- + +function checkViewActivity (activity: any) { + return isBaseActivityValid(activity, 'View') && + isViewActivityValid(activity) +} + +function checkFlagActivity (activity: any) { + return isBaseActivityValid(activity, 'Flag') && + isFlagActivityValid(activity) +} + +function checkDislikeActivity (activity: any) { + return isBaseActivityValid(activity, 'Dislike') && + isDislikeActivityValid(activity) +} + +function checkCreateActivity (activity: any) { + return isBaseActivityValid(activity, 'Create') && + ( + isViewActivityValid(activity.object) || + isDislikeActivityValid(activity.object) || + isFlagActivityValid(activity.object) || + isPlaylistObjectValid(activity.object) || + + isCacheFileObjectValid(activity.object) || + sanitizeAndCheckVideoCommentObject(activity.object) || + sanitizeAndCheckVideoTorrentObject(activity.object) + ) +} + +function checkUpdateActivity (activity: any) { + return isBaseActivityValid(activity, 'Update') && + ( + isCacheFileObjectValid(activity.object) || + isPlaylistObjectValid(activity.object) || + sanitizeAndCheckVideoTorrentObject(activity.object) || + sanitizeAndCheckActorObject(activity.object) + ) +} + +function checkDeleteActivity (activity: any) { + // We don't really check objects + return isBaseActivityValid(activity, 'Delete') && + isObjectValid(activity.object) +} + +function checkFollowActivity (activity: any) { + return isBaseActivityValid(activity, 'Follow') && + isObjectValid(activity.object) +} + +function checkAcceptActivity (activity: any) { + return isBaseActivityValid(activity, 'Accept') +} + +function checkRejectActivity (activity: any) { + return isBaseActivityValid(activity, 'Reject') +} + +function checkAnnounceActivity (activity: any) { + return isBaseActivityValid(activity, 'Announce') && + isObjectValid(activity.object) +} + +function checkUndoActivity (activity: any) { + return isBaseActivityValid(activity, 'Undo') && + ( + checkFollowActivity(activity.object) || + checkLikeActivity(activity.object) || + checkDislikeActivity(activity.object) || + checkAnnounceActivity(activity.object) || + checkCreateActivity(activity.object) + ) +} + +function checkLikeActivity (activity: any) { + return isBaseActivityValid(activity, 'Like') && + isObjectValid(activity.object) +}