]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/helpers/custom-validators/activitypub/activity.ts
Feature/filter already watched videos (#5739)
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / activitypub / activity.ts
index 9305e092c91a7bbd43fd730dbc7a1eab9db98b8f..90a9185234e5bd3e09bdf50b8407bf69043a717a 100644 (file)
@@ -1,39 +1,44 @@
-import * as validator from 'validator'
-import { Activity, ActivityType } from '../../../../shared/models/activitypub/activity'
-import { isAccountAcceptActivityValid, isAccountDeleteActivityValid, isAccountFollowActivityValid } from './account'
-import { isAnnounceValid } from './announce'
-import { isActivityPubUrlValid } from './misc'
-import { isUndoValid } from './undo'
-import { isVideoChannelCreateActivityValid, isVideoChannelDeleteActivityValid, isVideoChannelUpdateActivityValid } from './video-channels'
-import {
-  isVideoFlagValid,
-  isVideoTorrentAddActivityValid,
-  isVideoTorrentDeleteActivityValid,
-  isVideoTorrentUpdateActivityValid
-} from './videos'
+import validator from 'validator'
+import { Activity, ActivityType } from '../../../../shared/models/activitypub'
+import { isAbuseReasonValid } from '../abuses'
+import { exists } from '../misc'
+import { sanitizeAndCheckActorObject } from './actor'
+import { isCacheFileObjectValid } from './cache-file'
+import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
+import { isPlaylistObjectValid } from './playlist'
+import { sanitizeAndCheckVideoCommentObject } from './video-comments'
+import { sanitizeAndCheckVideoTorrentObject } from './videos'
+import { isWatchActionObjectValid } from './watch-action'
 
 function isRootActivityValid (activity: any) {
-  return Array.isArray(activity['@context']) &&
-    (
-      (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
-      validator.isInt(activity.totalItems, { min: 0 }) &&
-      Array.isArray(activity.items)
-    ) ||
-    (
-      isActivityPubUrlValid(activity.id) &&
-      isActivityPubUrlValid(activity.actor)
-    )
+  return isCollection(activity) || isActivity(activity)
+}
+
+function isCollection (activity: any) {
+  return (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
+    validator.isInt(activity.totalItems, { min: 0 }) &&
+    Array.isArray(activity.items)
+}
+
+function isActivity (activity: any) {
+  return isActivityPubUrlValid(activity.id) &&
+    exists(activity.actor) &&
+    (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id))
 }
 
 const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
-  Create: checkCreateActivity,
-  Add: checkAddActivity,
-  Update: checkUpdateActivity,
-  Delete: checkDeleteActivity,
-  Follow: checkFollowActivity,
-  Accept: checkAcceptActivity,
-  Announce: checkAnnounceActivity,
-  Undo: checkUndoActivity
+  Create: isCreateActivityValid,
+  Update: isUpdateActivityValid,
+  Delete: isDeleteActivityValid,
+  Follow: isFollowActivityValid,
+  Accept: isAcceptActivityValid,
+  Reject: isRejectActivityValid,
+  Announce: isAnnounceActivityValid,
+  Undo: isUndoActivityValid,
+  Like: isLikeActivityValid,
+  View: isViewActivityValid,
+  Flag: isFlagActivityValid,
+  Dislike: isDislikeActivityValid
 }
 
 function isActivityValid (activity: any) {
@@ -44,47 +49,103 @@ function isActivityValid (activity: any) {
   return checker(activity)
 }
 
-// ---------------------------------------------------------------------------
+function isFlagActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Flag') &&
+    isAbuseReasonValid(activity.content) &&
+    isActivityPubUrlValid(activity.object)
+}
 
-export {
-  isRootActivityValid,
-  isActivityValid
+function isLikeActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Like') &&
+    isObjectValid(activity.object)
 }
 
-// ---------------------------------------------------------------------------
+function isDislikeActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Dislike') &&
+    isObjectValid(activity.object)
+}
+
+function isAnnounceActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Announce') &&
+    isObjectValid(activity.object)
+}
 
-function checkCreateActivity (activity: any) {
-  return isVideoChannelCreateActivityValid(activity) ||
-    isVideoFlagValid(activity)
+function isViewActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'View') &&
+    isActivityPubUrlValid(activity.actor) &&
+    isActivityPubUrlValid(activity.object)
 }
 
-function checkAddActivity (activity: any) {
-  return isVideoTorrentAddActivityValid(activity)
+function isCreateActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Create') &&
+    (
+      isViewActivityValid(activity.object) ||
+      isDislikeActivityValid(activity.object) ||
+      isFlagActivityValid(activity.object) ||
+      isPlaylistObjectValid(activity.object) ||
+      isWatchActionObjectValid(activity.object) ||
+
+      isCacheFileObjectValid(activity.object) ||
+      sanitizeAndCheckVideoCommentObject(activity.object) ||
+      sanitizeAndCheckVideoTorrentObject(activity.object)
+    )
+}
+
+function isUpdateActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Update') &&
+    (
+      isCacheFileObjectValid(activity.object) ||
+      isPlaylistObjectValid(activity.object) ||
+      sanitizeAndCheckVideoTorrentObject(activity.object) ||
+      sanitizeAndCheckActorObject(activity.object)
+    )
 }
 
-function checkUpdateActivity (activity: any) {
-  return isVideoTorrentUpdateActivityValid(activity) ||
-    isVideoChannelUpdateActivityValid(activity)
+function isDeleteActivityValid (activity: any) {
+  // We don't really check objects
+  return isBaseActivityValid(activity, 'Delete') &&
+    isObjectValid(activity.object)
 }
 
-function checkDeleteActivity (activity: any) {
-  return isVideoTorrentDeleteActivityValid(activity) ||
-    isVideoChannelDeleteActivityValid(activity) ||
-    isAccountDeleteActivityValid(activity)
+function isFollowActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Follow') &&
+    isObjectValid(activity.object)
 }
 
-function checkFollowActivity (activity: any) {
-  return isAccountFollowActivityValid(activity)
+function isAcceptActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Accept')
 }
 
-function checkAcceptActivity (activity: any) {
-  return isAccountAcceptActivityValid(activity)
+function isRejectActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Reject')
 }
 
-function checkAnnounceActivity (activity: any) {
-  return isAnnounceValid(activity)
+function isUndoActivityValid (activity: any) {
+  return isBaseActivityValid(activity, 'Undo') &&
+    (
+      isFollowActivityValid(activity.object) ||
+      isLikeActivityValid(activity.object) ||
+      isDislikeActivityValid(activity.object) ||
+      isAnnounceActivityValid(activity.object) ||
+      isCreateActivityValid(activity.object)
+    )
 }
 
-function checkUndoActivity (activity: any) {
-  return isUndoValid(activity)
+// ---------------------------------------------------------------------------
+
+export {
+  isRootActivityValid,
+  isActivityValid,
+  isFlagActivityValid,
+  isLikeActivityValid,
+  isDislikeActivityValid,
+  isAnnounceActivityValid,
+  isViewActivityValid,
+  isCreateActivityValid,
+  isUpdateActivityValid,
+  isDeleteActivityValid,
+  isFollowActivityValid,
+  isAcceptActivityValid,
+  isRejectActivityValid,
+  isUndoActivityValid
 }