mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-10-04 10:19:35 +02:00
Merge branch 'develop' into pr/1285
This commit is contained in:
commit
b718fd2237
387 changed files with 18290 additions and 10001 deletions
|
@ -1,26 +1,14 @@
|
|||
import * as validator from 'validator'
|
||||
import { Activity, ActivityType } from '../../../../shared/models/activitypub'
|
||||
import {
|
||||
isActorAcceptActivityValid,
|
||||
isActorDeleteActivityValid,
|
||||
isActorFollowActivityValid,
|
||||
isActorRejectActivityValid,
|
||||
isActorUpdateActivityValid
|
||||
} from './actor'
|
||||
import { isAnnounceActivityValid } from './announce'
|
||||
import { isActivityPubUrlValid } from './misc'
|
||||
import { isDislikeActivityValid, isLikeActivityValid } from './rate'
|
||||
import { isUndoActivityValid } from './undo'
|
||||
import { isVideoCommentCreateActivityValid, isVideoCommentDeleteActivityValid } from './video-comments'
|
||||
import {
|
||||
isVideoFlagValid,
|
||||
isVideoTorrentDeleteActivityValid,
|
||||
sanitizeAndCheckVideoTorrentCreateActivity,
|
||||
sanitizeAndCheckVideoTorrentUpdateActivity
|
||||
} from './videos'
|
||||
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 { isCacheFileCreateActivityValid, isCacheFileUpdateActivityValid } from './cache-file'
|
||||
import { isCacheFileObjectValid } from './cache-file'
|
||||
import { isFlagActivityValid } from './flag'
|
||||
|
||||
function isRootActivityValid (activity: any) {
|
||||
return Array.isArray(activity['@context']) && (
|
||||
|
@ -46,7 +34,10 @@ const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean
|
|||
Reject: checkRejectActivity,
|
||||
Announce: checkAnnounceActivity,
|
||||
Undo: checkUndoActivity,
|
||||
Like: checkLikeActivity
|
||||
Like: checkLikeActivity,
|
||||
View: checkViewActivity,
|
||||
Flag: checkFlagActivity,
|
||||
Dislike: checkDislikeActivity
|
||||
}
|
||||
|
||||
function isActivityValid (activity: any) {
|
||||
|
@ -66,47 +57,79 @@ export {
|
|||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
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 isViewActivityValid(activity) ||
|
||||
isDislikeActivityValid(activity) ||
|
||||
sanitizeAndCheckVideoTorrentCreateActivity(activity) ||
|
||||
isVideoFlagValid(activity) ||
|
||||
isVideoCommentCreateActivityValid(activity) ||
|
||||
isCacheFileCreateActivityValid(activity)
|
||||
return isBaseActivityValid(activity, 'Create') &&
|
||||
(
|
||||
isViewActivityValid(activity.object) ||
|
||||
isDislikeActivityValid(activity.object) ||
|
||||
isFlagActivityValid(activity.object) ||
|
||||
|
||||
isCacheFileObjectValid(activity.object) ||
|
||||
sanitizeAndCheckVideoCommentObject(activity.object) ||
|
||||
sanitizeAndCheckVideoTorrentObject(activity.object)
|
||||
)
|
||||
}
|
||||
|
||||
function checkUpdateActivity (activity: any) {
|
||||
return isCacheFileUpdateActivityValid(activity) ||
|
||||
sanitizeAndCheckVideoTorrentUpdateActivity(activity) ||
|
||||
isActorUpdateActivityValid(activity)
|
||||
return isBaseActivityValid(activity, 'Update') &&
|
||||
(
|
||||
isCacheFileObjectValid(activity.object) ||
|
||||
sanitizeAndCheckVideoTorrentObject(activity.object) ||
|
||||
sanitizeAndCheckActorObject(activity.object)
|
||||
)
|
||||
}
|
||||
|
||||
function checkDeleteActivity (activity: any) {
|
||||
return isVideoTorrentDeleteActivityValid(activity) ||
|
||||
isActorDeleteActivityValid(activity) ||
|
||||
isVideoCommentDeleteActivityValid(activity)
|
||||
// We don't really check objects
|
||||
return isBaseActivityValid(activity, 'Delete') &&
|
||||
isObjectValid(activity.object)
|
||||
}
|
||||
|
||||
function checkFollowActivity (activity: any) {
|
||||
return isActorFollowActivityValid(activity)
|
||||
return isBaseActivityValid(activity, 'Follow') &&
|
||||
isObjectValid(activity.object)
|
||||
}
|
||||
|
||||
function checkAcceptActivity (activity: any) {
|
||||
return isActorAcceptActivityValid(activity)
|
||||
return isBaseActivityValid(activity, 'Accept')
|
||||
}
|
||||
|
||||
function checkRejectActivity (activity: any) {
|
||||
return isActorRejectActivityValid(activity)
|
||||
return isBaseActivityValid(activity, 'Reject')
|
||||
}
|
||||
|
||||
function checkAnnounceActivity (activity: any) {
|
||||
return isAnnounceActivityValid(activity)
|
||||
return isBaseActivityValid(activity, 'Announce') &&
|
||||
isObjectValid(activity.object)
|
||||
}
|
||||
|
||||
function checkUndoActivity (activity: any) {
|
||||
return isUndoActivityValid(activity)
|
||||
return isBaseActivityValid(activity, 'Undo') &&
|
||||
(
|
||||
checkFollowActivity(activity.object) ||
|
||||
checkLikeActivity(activity.object) ||
|
||||
checkDislikeActivity(activity.object) ||
|
||||
checkAnnounceActivity(activity.object) ||
|
||||
checkCreateActivity(activity.object)
|
||||
)
|
||||
}
|
||||
|
||||
function checkLikeActivity (activity: any) {
|
||||
return isLikeActivityValid(activity)
|
||||
return isBaseActivityValid(activity, 'Like') &&
|
||||
isObjectValid(activity.object)
|
||||
}
|
||||
|
|
|
@ -73,24 +73,10 @@ function isActorDeleteActivityValid (activity: any) {
|
|||
return isBaseActivityValid(activity, 'Delete')
|
||||
}
|
||||
|
||||
function isActorFollowActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Follow') &&
|
||||
isActivityPubUrlValid(activity.object)
|
||||
}
|
||||
function sanitizeAndCheckActorObject (object: any) {
|
||||
normalizeActor(object)
|
||||
|
||||
function isActorAcceptActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Accept')
|
||||
}
|
||||
|
||||
function isActorRejectActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Reject')
|
||||
}
|
||||
|
||||
function isActorUpdateActivityValid (activity: any) {
|
||||
normalizeActor(activity.object)
|
||||
|
||||
return isBaseActivityValid(activity, 'Update') &&
|
||||
isActorObjectValid(activity.object)
|
||||
return isActorObjectValid(object)
|
||||
}
|
||||
|
||||
function normalizeActor (actor: any) {
|
||||
|
@ -139,10 +125,7 @@ export {
|
|||
isActorObjectValid,
|
||||
isActorFollowingCountValid,
|
||||
isActorFollowersCountValid,
|
||||
isActorFollowActivityValid,
|
||||
isActorAcceptActivityValid,
|
||||
isActorRejectActivityValid,
|
||||
isActorDeleteActivityValid,
|
||||
isActorUpdateActivityValid,
|
||||
sanitizeAndCheckActorObject,
|
||||
isValidActorHandle
|
||||
}
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
|
||||
|
||||
function isAnnounceActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Announce') &&
|
||||
(
|
||||
isActivityPubUrlValid(activity.object) ||
|
||||
(activity.object && isActivityPubUrlValid(activity.object.id))
|
||||
)
|
||||
}
|
||||
|
||||
export {
|
||||
isAnnounceActivityValid
|
||||
}
|
|
@ -1,28 +1,26 @@
|
|||
import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
|
||||
import { isActivityPubUrlValid } from './misc'
|
||||
import { isRemoteVideoUrlValid } from './videos'
|
||||
import { isDateValid, exists } from '../misc'
|
||||
import { exists, isDateValid } from '../misc'
|
||||
import { CacheFileObject } from '../../../../shared/models/activitypub/objects'
|
||||
|
||||
function isCacheFileCreateActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Create') &&
|
||||
isCacheFileObjectValid(activity.object)
|
||||
}
|
||||
|
||||
function isCacheFileUpdateActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Update') &&
|
||||
isCacheFileObjectValid(activity.object)
|
||||
}
|
||||
|
||||
function isCacheFileObjectValid (object: CacheFileObject) {
|
||||
return exists(object) &&
|
||||
object.type === 'CacheFile' &&
|
||||
isDateValid(object.expires) &&
|
||||
isActivityPubUrlValid(object.object) &&
|
||||
isRemoteVideoUrlValid(object.url)
|
||||
(isRemoteVideoUrlValid(object.url) || isPlaylistRedundancyUrlValid(object.url))
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
isCacheFileUpdateActivityValid,
|
||||
isCacheFileCreateActivityValid,
|
||||
isCacheFileObjectValid
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function isPlaylistRedundancyUrlValid (url: any) {
|
||||
return url.type === 'Link' &&
|
||||
(url.mediaType || url.mimeType) === 'application/x-mpegURL' &&
|
||||
isActivityPubUrlValid(url.href)
|
||||
}
|
||||
|
|
14
server/helpers/custom-validators/activitypub/flag.ts
Normal file
14
server/helpers/custom-validators/activitypub/flag.ts
Normal file
|
@ -0,0 +1,14 @@
|
|||
import { isActivityPubUrlValid } from './misc'
|
||||
import { isVideoAbuseReasonValid } from '../video-abuses'
|
||||
|
||||
function isFlagActivityValid (activity: any) {
|
||||
return activity.type === 'Flag' &&
|
||||
isVideoAbuseReasonValid(activity.content) &&
|
||||
isActivityPubUrlValid(activity.object)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
isFlagActivityValid
|
||||
}
|
|
@ -28,15 +28,20 @@ function isBaseActivityValid (activity: any, type: string) {
|
|||
return (activity['@context'] === undefined || Array.isArray(activity['@context'])) &&
|
||||
activity.type === type &&
|
||||
isActivityPubUrlValid(activity.id) &&
|
||||
exists(activity.actor) &&
|
||||
(isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id)) &&
|
||||
isObjectValid(activity.actor) &&
|
||||
isUrlCollectionValid(activity.to) &&
|
||||
isUrlCollectionValid(activity.cc)
|
||||
}
|
||||
|
||||
function isUrlCollectionValid (collection: any) {
|
||||
return collection === undefined ||
|
||||
(Array.isArray(collection) && collection.every(t => isActivityPubUrlValid(t)))
|
||||
}
|
||||
|
||||
function isObjectValid (object: any) {
|
||||
return exists(object) &&
|
||||
(
|
||||
activity.to === undefined ||
|
||||
(Array.isArray(activity.to) && activity.to.every(t => isActivityPubUrlValid(t)))
|
||||
) &&
|
||||
(
|
||||
activity.cc === undefined ||
|
||||
(Array.isArray(activity.cc) && activity.cc.every(t => isActivityPubUrlValid(t)))
|
||||
isActivityPubUrlValid(object) || isActivityPubUrlValid(object.id)
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -57,5 +62,6 @@ export {
|
|||
isUrlValid,
|
||||
isActivityPubUrlValid,
|
||||
isBaseActivityValid,
|
||||
setValidAttributedTo
|
||||
setValidAttributedTo,
|
||||
isObjectValid
|
||||
}
|
||||
|
|
|
@ -1,20 +1,13 @@
|
|||
import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
|
||||
|
||||
function isLikeActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Like') &&
|
||||
isActivityPubUrlValid(activity.object)
|
||||
}
|
||||
import { isActivityPubUrlValid, isObjectValid } from './misc'
|
||||
|
||||
function isDislikeActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Create') &&
|
||||
activity.object.type === 'Dislike' &&
|
||||
isActivityPubUrlValid(activity.object.actor) &&
|
||||
isActivityPubUrlValid(activity.object.object)
|
||||
return activity.type === 'Dislike' &&
|
||||
isActivityPubUrlValid(activity.actor) &&
|
||||
isObjectValid(activity.object)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
isLikeActivityValid,
|
||||
isDislikeActivityValid
|
||||
}
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
import { isActorFollowActivityValid } from './actor'
|
||||
import { isBaseActivityValid } from './misc'
|
||||
import { isDislikeActivityValid, isLikeActivityValid } from './rate'
|
||||
import { isAnnounceActivityValid } from './announce'
|
||||
import { isCacheFileCreateActivityValid } from './cache-file'
|
||||
|
||||
function isUndoActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Undo') &&
|
||||
(
|
||||
isActorFollowActivityValid(activity.object) ||
|
||||
isLikeActivityValid(activity.object) ||
|
||||
isDislikeActivityValid(activity.object) ||
|
||||
isAnnounceActivityValid(activity.object) ||
|
||||
isCacheFileCreateActivityValid(activity.object)
|
||||
)
|
||||
}
|
||||
|
||||
export {
|
||||
isUndoActivityValid
|
||||
}
|
|
@ -3,11 +3,6 @@ import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers'
|
|||
import { exists, isArray, isDateValid } from '../misc'
|
||||
import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
|
||||
|
||||
function isVideoCommentCreateActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Create') &&
|
||||
sanitizeAndCheckVideoCommentObject(activity.object)
|
||||
}
|
||||
|
||||
function sanitizeAndCheckVideoCommentObject (comment: any) {
|
||||
if (!comment || comment.type !== 'Note') return false
|
||||
|
||||
|
@ -25,15 +20,9 @@ function sanitizeAndCheckVideoCommentObject (comment: any) {
|
|||
) // Only accept public comments
|
||||
}
|
||||
|
||||
function isVideoCommentDeleteActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Delete')
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
isVideoCommentCreateActivityValid,
|
||||
isVideoCommentDeleteActivityValid,
|
||||
sanitizeAndCheckVideoCommentObject
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import * as validator from 'validator'
|
||||
import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers'
|
||||
import { peertubeTruncate } from '../../core-utils'
|
||||
import { exists, isBooleanValid, isDateValid, isUUIDValid } from '../misc'
|
||||
import { exists, isArray, isBooleanValid, isDateValid, isUUIDValid } from '../misc'
|
||||
import {
|
||||
isVideoDurationValid,
|
||||
isVideoNameValid,
|
||||
|
@ -12,29 +12,12 @@ import {
|
|||
} from '../videos'
|
||||
import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc'
|
||||
import { VideoState } from '../../../../shared/models/videos'
|
||||
import { isVideoAbuseReasonValid } from '../video-abuses'
|
||||
|
||||
function sanitizeAndCheckVideoTorrentCreateActivity (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Create') &&
|
||||
sanitizeAndCheckVideoTorrentObject(activity.object)
|
||||
}
|
||||
|
||||
function sanitizeAndCheckVideoTorrentUpdateActivity (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Update') &&
|
||||
sanitizeAndCheckVideoTorrentObject(activity.object)
|
||||
}
|
||||
|
||||
function isVideoTorrentDeleteActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Delete')
|
||||
}
|
||||
|
||||
function isVideoFlagValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Create') &&
|
||||
activity.object.type === 'Flag' &&
|
||||
isVideoAbuseReasonValid(activity.object.content) &&
|
||||
isActivityPubUrlValid(activity.object.object)
|
||||
}
|
||||
|
||||
function isActivityPubVideoDurationValid (value: string) {
|
||||
// https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration
|
||||
return exists(value) &&
|
||||
|
@ -56,6 +39,7 @@ function sanitizeAndCheckVideoTorrentObject (video: any) {
|
|||
// Default attributes
|
||||
if (!isVideoStateValid(video.state)) video.state = VideoState.PUBLISHED
|
||||
if (!isBooleanValid(video.waitTranscoding)) video.waitTranscoding = false
|
||||
if (!isBooleanValid(video.downloadEnabled)) video.downloadEnabled = true
|
||||
|
||||
return isActivityPubUrlValid(video.id) &&
|
||||
isVideoNameValid(video.name) &&
|
||||
|
@ -67,6 +51,7 @@ function sanitizeAndCheckVideoTorrentObject (video: any) {
|
|||
isVideoViewsValid(video.views) &&
|
||||
isBooleanValid(video.sensitive) &&
|
||||
isBooleanValid(video.commentsEnabled) &&
|
||||
isBooleanValid(video.downloadEnabled) &&
|
||||
isDateValid(video.published) &&
|
||||
isDateValid(video.updated) &&
|
||||
(!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) &&
|
||||
|
@ -97,17 +82,19 @@ function isRemoteVideoUrlValid (url: any) {
|
|||
ACTIVITY_PUB.URL_MIME_TYPES.MAGNET.indexOf(url.mediaType || url.mimeType) !== -1 &&
|
||||
validator.isLength(url.href, { min: 5 }) &&
|
||||
validator.isInt(url.height + '', { min: 0 })
|
||||
) ||
|
||||
(
|
||||
(url.mediaType || url.mimeType) === 'application/x-mpegURL' &&
|
||||
isActivityPubUrlValid(url.href) &&
|
||||
isArray(url.tag)
|
||||
)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
sanitizeAndCheckVideoTorrentCreateActivity,
|
||||
sanitizeAndCheckVideoTorrentUpdateActivity,
|
||||
isVideoTorrentDeleteActivityValid,
|
||||
isRemoteStringIdentifierValid,
|
||||
isVideoFlagValid,
|
||||
sanitizeAndCheckVideoTorrentObject,
|
||||
isRemoteVideoUrlValid
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
|
||||
import { isActivityPubUrlValid } from './misc'
|
||||
|
||||
function isViewActivityValid (activity: any) {
|
||||
return isBaseActivityValid(activity, 'Create') &&
|
||||
activity.object.type === 'View' &&
|
||||
isActivityPubUrlValid(activity.object.actor) &&
|
||||
isActivityPubUrlValid(activity.object.object)
|
||||
return activity.type === 'View' &&
|
||||
isActivityPubUrlValid(activity.actor) &&
|
||||
isActivityPubUrlValid(activity.object)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export {
|
||||
|
|
|
@ -13,6 +13,10 @@ function isNotEmptyIntArray (value: any) {
|
|||
return Array.isArray(value) && value.every(v => validator.isInt('' + v)) && value.length !== 0
|
||||
}
|
||||
|
||||
function isArrayOf (value: any, validator: (value: any) => boolean) {
|
||||
return isArray(value) && value.every(v => validator(v))
|
||||
}
|
||||
|
||||
function isDateValid (value: string) {
|
||||
return exists(value) && validator.isISO8601(value)
|
||||
}
|
||||
|
@ -82,6 +86,7 @@ function isFileValid (
|
|||
|
||||
export {
|
||||
exists,
|
||||
isArrayOf,
|
||||
isNotEmptyIntArray,
|
||||
isArray,
|
||||
isIdValid,
|
||||
|
|
|
@ -88,8 +88,8 @@ function isVideoFileExtnameValid (value: string) {
|
|||
|
||||
function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
|
||||
const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
|
||||
.map(m => `(${m})`)
|
||||
.join('|')
|
||||
.map(m => `(${m})`)
|
||||
.join('|')
|
||||
|
||||
return isFileValid(files, videoFileTypesRegex, 'videofile', null)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue