aboutsummaryrefslogblamecommitdiffhomepage
path: root/server/helpers/custom-validators/activitypub/activity.ts
blob: 66e557d39cbf164641d3f2a05e4c05bcccf86926 (plain) (tree)
1
2
3
4
5
6
7
8
9
                                      
                                                                                       
                                                                                                                    
                                            
                                              

                                                                                                                                          
        
                   
                                 

                                    
                 
                                            








                                                                                  

                                           


     










                                                                                      
                                          




                                                 







                                                                              




                                                                              

                                 































                                                       
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 { isViewActivityValid } from './view'

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

const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
  Create: checkCreateActivity,
  Add: checkAddActivity,
  Update: checkUpdateActivity,
  Delete: checkDeleteActivity,
  Follow: checkFollowActivity,
  Accept: checkAcceptActivity,
  Announce: checkAnnounceActivity,
  Undo: checkUndoActivity
}

function isActivityValid (activity: any) {
  const checker = activityCheckers[activity.type]
  // Unknown activity type
  if (!checker) return false

  return checker(activity)
}

// ---------------------------------------------------------------------------

export {
  isRootActivityValid,
  isActivityValid
}

// ---------------------------------------------------------------------------

function checkCreateActivity (activity: any) {
  return isVideoChannelCreateActivityValid(activity) ||
    isVideoFlagValid(activity) ||
    isViewActivityValid(activity)
}

function checkAddActivity (activity: any) {
  return isVideoTorrentAddActivityValid(activity)
}

function checkUpdateActivity (activity: any) {
  return isVideoTorrentUpdateActivityValid(activity) ||
    isVideoChannelUpdateActivityValid(activity)
}

function checkDeleteActivity (activity: any) {
  return isVideoTorrentDeleteActivityValid(activity) ||
    isVideoChannelDeleteActivityValid(activity) ||
    isAccountDeleteActivityValid(activity)
}

function checkFollowActivity (activity: any) {
  return isAccountFollowActivityValid(activity)
}

function checkAcceptActivity (activity: any) {
  return isAccountAcceptActivityValid(activity)
}

function checkAnnounceActivity (activity: any) {
  return isAnnounceValid(activity)
}

function checkUndoActivity (activity: any) {
  return isUndoValid(activity)
}