Refactor a little bit AP validators

This commit is contained in:
Chocobozzz 2021-03-05 13:49:58 +01:00
parent 452b3bea08
commit 67f87b66fe
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
6 changed files with 72 additions and 113 deletions

View File

@ -1,16 +1,13 @@
import validator from 'validator' import validator from 'validator'
import { Activity, ActivityType } from '../../../../shared/models/activitypub' import { Activity, ActivityType } from '../../../../shared/models/activitypub'
import { isAbuseReasonValid } from '../abuses'
import { exists } from '../misc' import { exists } from '../misc'
import { sanitizeAndCheckActorObject } from './actor' import { sanitizeAndCheckActorObject } from './actor'
import { isCacheFileObjectValid } from './cache-file' import { isCacheFileObjectValid } from './cache-file'
import { isFlagActivityValid } from './flag'
import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc' import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
import { isPlaylistObjectValid } from './playlist' import { isPlaylistObjectValid } from './playlist'
import { isDislikeActivityValid, isLikeActivityValid } from './rate'
import { isShareActivityValid } from './share'
import { sanitizeAndCheckVideoCommentObject } from './video-comments' import { sanitizeAndCheckVideoCommentObject } from './video-comments'
import { sanitizeAndCheckVideoTorrentObject } from './videos' import { sanitizeAndCheckVideoTorrentObject } from './videos'
import { isViewActivityValid } from './view'
function isRootActivityValid (activity: any) { function isRootActivityValid (activity: any) {
return isCollection(activity) || isActivity(activity) return isCollection(activity) || isActivity(activity)
@ -29,56 +26,56 @@ function isActivity (activity: any) {
} }
const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = { const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
Create: checkCreateActivity, Create: isCreateActivityValid,
Update: checkUpdateActivity, Update: isUpdateActivityValid,
Delete: checkDeleteActivity, Delete: isDeleteActivityValid,
Follow: checkFollowActivity, Follow: isFollowActivityValid,
Accept: checkAcceptActivity, Accept: isAcceptActivityValid,
Reject: checkRejectActivity, Reject: isRejectActivityValid,
Announce: checkAnnounceActivity, Announce: isAnnounceActivityValid,
Undo: checkUndoActivity, Undo: isUndoActivityValid,
Like: checkLikeActivity, Like: isLikeActivityValid,
View: checkViewActivity, View: isViewActivityValid,
Flag: checkFlagActivity, Flag: isFlagActivityValid,
Dislike: checkDislikeActivity Dislike: isDislikeActivityValid
} }
function isActivityValid (activity: any) { function isActivityValid (activity: any) {
const checker = activityCheckers[activity.type] const checker = activityCheckers[activity.tswype]
// Unknown activity type // Unknown activity type
if (!checker) return false if (!checker) return false
return checker(activity) return checker(activity)
} }
// --------------------------------------------------------------------------- function isFlagActivityValid (activity: any) {
return isBaseActivityValid(activity.type, 'Flag') &&
export { isAbuseReasonValid(activity.content) &&
isRootActivityValid, isActivityPubUrlValid(activity.object)
isActivityValid
} }
// --------------------------------------------------------------------------- function isLikeActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Like') &&
isObjectValid(activity.object)
}
function checkViewActivity (activity: any) { function isDislikeActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Dislike') &&
isObjectValid(activity.object)
}
function isAnnounceActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Announce') &&
isObjectValid(activity.object)
}
function isViewActivityValid (activity: any) {
return isBaseActivityValid(activity, 'View') && return isBaseActivityValid(activity, 'View') &&
isViewActivityValid(activity) isActivityPubUrlValid(activity.actor) &&
isActivityPubUrlValid(activity.object)
} }
function checkFlagActivity (activity: any) { function isCreateActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Flag') &&
isFlagActivityValid(activity)
}
function checkDislikeActivity (activity: any) {
return isDislikeActivityValid(activity)
}
function checkLikeActivity (activity: any) {
return isLikeActivityValid(activity)
}
function checkCreateActivity (activity: any) {
return isBaseActivityValid(activity, 'Create') && return isBaseActivityValid(activity, 'Create') &&
( (
isViewActivityValid(activity.object) || isViewActivityValid(activity.object) ||
@ -92,7 +89,7 @@ function checkCreateActivity (activity: any) {
) )
} }
function checkUpdateActivity (activity: any) { function isUpdateActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Update') && return isBaseActivityValid(activity, 'Update') &&
( (
isCacheFileObjectValid(activity.object) || isCacheFileObjectValid(activity.object) ||
@ -102,36 +99,51 @@ function checkUpdateActivity (activity: any) {
) )
} }
function checkDeleteActivity (activity: any) { function isDeleteActivityValid (activity: any) {
// We don't really check objects // We don't really check objects
return isBaseActivityValid(activity, 'Delete') && return isBaseActivityValid(activity, 'Delete') &&
isObjectValid(activity.object) isObjectValid(activity.object)
} }
function checkFollowActivity (activity: any) { function isFollowActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Follow') && return isBaseActivityValid(activity, 'Follow') &&
isObjectValid(activity.object) isObjectValid(activity.object)
} }
function checkAcceptActivity (activity: any) { function isAcceptActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Accept') return isBaseActivityValid(activity, 'Accept')
} }
function checkRejectActivity (activity: any) { function isRejectActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Reject') return isBaseActivityValid(activity, 'Reject')
} }
function checkAnnounceActivity (activity: any) { function isUndoActivityValid (activity: any) {
return isShareActivityValid(activity)
}
function checkUndoActivity (activity: any) {
return isBaseActivityValid(activity, 'Undo') && return isBaseActivityValid(activity, 'Undo') &&
( (
checkFollowActivity(activity.object) || isFollowActivityValid(activity.object) ||
checkLikeActivity(activity.object) || isLikeActivityValid(activity.object) ||
checkDislikeActivity(activity.object) || isDislikeActivityValid(activity.object) ||
checkAnnounceActivity(activity.object) || isAnnounceActivityValid(activity.object) ||
checkCreateActivity(activity.object) isCreateActivityValid(activity.object)
) )
} }
// ---------------------------------------------------------------------------
export {
isRootActivityValid,
isActivityValid,
isFlagActivityValid,
isLikeActivityValid,
isDislikeActivityValid,
isAnnounceActivityValid,
isViewActivityValid,
isCreateActivityValid,
isUpdateActivityValid,
isDeleteActivityValid,
isFollowActivityValid,
isAcceptActivityValid,
isRejectActivityValid,
isUndoActivityValid
}

View File

@ -1,14 +0,0 @@
import { isActivityPubUrlValid } from './misc'
import { isAbuseReasonValid } from '../abuses'
function isFlagActivityValid (activity: any) {
return activity.type === 'Flag' &&
isAbuseReasonValid(activity.content) &&
isActivityPubUrlValid(activity.object)
}
// ---------------------------------------------------------------------------
export {
isFlagActivityValid
}

View File

@ -1,18 +0,0 @@
import { isBaseActivityValid, isObjectValid } from './misc'
function isLikeActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Like') &&
isObjectValid(activity.object)
}
function isDislikeActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Dislike') &&
isObjectValid(activity.object)
}
// ---------------------------------------------------------------------------
export {
isDislikeActivityValid,
isLikeActivityValid
}

View File

@ -1,11 +0,0 @@
import { isBaseActivityValid, isObjectValid } from './misc'
function isShareActivityValid (activity: any) {
return isBaseActivityValid(activity, 'Announce') &&
isObjectValid(activity.object)
}
// ---------------------------------------------------------------------------
export {
isShareActivityValid
}

View File

@ -1,13 +0,0 @@
import { isActivityPubUrlValid } from './misc'
function isViewActivityValid (activity: any) {
return activity.type === 'View' &&
isActivityPubUrlValid(activity.actor) &&
isActivityPubUrlValid(activity.object)
}
// ---------------------------------------------------------------------------
export {
isViewActivityValid
}

View File

@ -1,8 +1,11 @@
import * as Bluebird from 'bluebird' import * as Bluebird from 'bluebird'
import * as Bull from 'bull' import * as Bull from 'bull'
import { checkUrlsSameHost } from '@server/helpers/activitypub' import { checkUrlsSameHost } from '@server/helpers/activitypub'
import { isDislikeActivityValid, isLikeActivityValid } from '@server/helpers/custom-validators/activitypub/rate' import {
import { isShareActivityValid } from '@server/helpers/custom-validators/activitypub/share' isAnnounceActivityValid,
isDislikeActivityValid,
isLikeActivityValid
} from '@server/helpers/custom-validators/activitypub/activity'
import { sanitizeAndCheckVideoCommentObject } from '@server/helpers/custom-validators/activitypub/video-comments' import { sanitizeAndCheckVideoCommentObject } from '@server/helpers/custom-validators/activitypub/video-comments'
import { doRequest } from '@server/helpers/requests' import { doRequest } from '@server/helpers/requests'
import { AP_CLEANER_CONCURRENCY } from '@server/initializers/constants' import { AP_CLEANER_CONCURRENCY } from '@server/initializers/constants'
@ -149,7 +152,7 @@ function rateOptionsFactory () {
function shareOptionsFactory () { function shareOptionsFactory () {
return { return {
bodyValidator: (body: any) => isShareActivityValid(body), bodyValidator: (body: any) => isAnnounceActivityValid(body),
updater: async (url: string, newUrl: string) => { updater: async (url: string, newUrl: string) => {
const share = await VideoShareModel.loadByUrl(url, undefined) const share = await VideoShareModel.loadByUrl(url, undefined)