1
0
Fork 0
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:
Chocobozzz 2019-02-11 14:09:23 +01:00
commit b718fd2237
No known key found for this signature in database
GPG key ID: 583A612D890159BE
387 changed files with 18290 additions and 10001 deletions

View file

@ -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)
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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)
}

View 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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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 {

View file

@ -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,

View file

@ -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)
}