From 54141398354e6e7b94aa3065a705a1251390111c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 20 Nov 2017 09:43:39 +0100 Subject: Refractor activity pub lib/helpers --- server/helpers/activitypub.ts | 65 +++++++++++++++---- .../custom-validators/activitypub/activity.ts | 73 +++++++++++++++++----- .../custom-validators/activitypub/announce.ts | 15 +++++ .../helpers/custom-validators/activitypub/index.ts | 4 +- .../helpers/custom-validators/activitypub/undo.ts | 13 ++++ .../activitypub/video-channels.ts | 36 +++++++++++ .../custom-validators/activitypub/videos.ts | 54 +++------------- 7 files changed, 187 insertions(+), 73 deletions(-) create mode 100644 server/helpers/custom-validators/activitypub/announce.ts create mode 100644 server/helpers/custom-validators/activitypub/undo.ts create mode 100644 server/helpers/custom-validators/activitypub/video-channels.ts (limited to 'server/helpers') diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts index aff58515a..9622a1801 100644 --- a/server/helpers/activitypub.ts +++ b/server/helpers/activitypub.ts @@ -9,18 +9,20 @@ import { VideoChannelObject } from '../../shared/models/activitypub/objects/vide import { ResultList } from '../../shared/models/result-list.model' import { database as db, REMOTE_SCHEME } from '../initializers' import { ACTIVITY_PUB, CONFIG, STATIC_PATHS } from '../initializers/constants' -import { videoChannelActivityObjectToDBAttributes } from '../lib/activitypub/misc' -import { sendVideoAnnounce } from '../lib/activitypub/send-request' +import { videoChannelActivityObjectToDBAttributes } from '../lib/activitypub/process/misc' +import { sendVideoAnnounce } from '../lib/activitypub/send/send-announce' import { sendVideoChannelAnnounce } from '../lib/index' +import { AccountFollowInstance } from '../models/account/account-follow-interface' import { AccountInstance } from '../models/account/account-interface' +import { VideoAbuseInstance } from '../models/video/video-abuse-interface' import { VideoChannelInstance } from '../models/video/video-channel-interface' import { VideoInstance } from '../models/video/video-interface' import { isRemoteAccountValid } from './custom-validators' -import { isVideoChannelObjectValid } from './custom-validators/activitypub/videos' import { logger } from './logger' import { signObject } from './peertube-crypto' import { doRequest, doRequestAndSaveToFile } from './requests' import { getServerAccount } from './utils' +import { isVideoChannelObjectValid } from './custom-validators/activitypub/video-channels' function generateThumbnailFromUrl (video: VideoInstance, icon: ActivityIconObject) { const thumbnailName = video.getThumbnailName() @@ -55,13 +57,46 @@ async function shareVideoByServer (video: VideoInstance, t: Sequelize.Transactio return sendVideoAnnounce(serverAccount, video, t) } -function getActivityPubUrl (type: 'video' | 'videoChannel' | 'account' | 'videoAbuse', id: string) { - if (type === 'video') return CONFIG.WEBSERVER.URL + '/videos/watch/' + id - else if (type === 'videoChannel') return CONFIG.WEBSERVER.URL + '/video-channels/' + id - else if (type === 'account') return CONFIG.WEBSERVER.URL + '/account/' + id - else if (type === 'videoAbuse') return CONFIG.WEBSERVER.URL + '/admin/video-abuses/' + id +function getVideoActivityPubUrl (video: VideoInstance) { + return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid +} + +function getVideoChannelActivityPubUrl (videoChannel: VideoChannelInstance) { + return CONFIG.WEBSERVER.URL + '/video-channels/' + videoChannel.uuid +} + +function getAccountActivityPubUrl (accountName: string) { + return CONFIG.WEBSERVER.URL + '/account/' + accountName +} + +function getVideoAbuseActivityPubUrl (videoAbuse: VideoAbuseInstance) { + return CONFIG.WEBSERVER.URL + '/admin/video-abuses/' + videoAbuse.id +} + +function getAccountFollowActivityPubUrl (accountFollow: AccountFollowInstance) { + const me = accountFollow.AccountFollower + const following = accountFollow.AccountFollowing + + return me.url + '#follows/' + following.id +} + +function getAccountFollowAcceptActivityPubUrl (accountFollow: AccountFollowInstance) { + const follower = accountFollow.AccountFollower + const me = accountFollow.AccountFollowing + + return follower.url + '#accepts/follows/' + me.id +} + +function getAnnounceActivityPubUrl (originalUrl: string, byAccount: AccountInstance) { + return originalUrl + '#announces/' + byAccount.id +} + +function getUpdateActivityPubUrl (originalUrl: string, updatedAt: string) { + return originalUrl + '#updates/' + updatedAt +} - return '' +function getUndoActivityPubUrl (originalUrl: string) { + return originalUrl + '/undo' } async function getOrCreateAccount (accountUrl: string) { @@ -257,7 +292,6 @@ export { fetchRemoteAccountAndCreateServer, activityPubContextify, activityPubCollectionPagination, - getActivityPubUrl, generateThumbnailFromUrl, getOrCreateAccount, fetchRemoteVideoPreview, @@ -265,7 +299,16 @@ export { shareVideoChannelByServer, shareVideoByServer, getOrCreateVideoChannel, - buildSignedActivity + buildSignedActivity, + getVideoActivityPubUrl, + getVideoChannelActivityPubUrl, + getAccountActivityPubUrl, + getVideoAbuseActivityPubUrl, + getAccountFollowActivityPubUrl, + getAccountFollowAcceptActivityPubUrl, + getAnnounceActivityPubUrl, + getUpdateActivityPubUrl, + getUndoActivityPubUrl } // --------------------------------------------------------------------------- diff --git a/server/helpers/custom-validators/activitypub/activity.ts b/server/helpers/custom-validators/activitypub/activity.ts index 8084cf7b0..9305e092c 100644 --- a/server/helpers/custom-validators/activitypub/activity.ts +++ b/server/helpers/custom-validators/activitypub/activity.ts @@ -1,11 +1,11 @@ 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 { - isAnnounceValid, - isVideoChannelCreateActivityValid, - isVideoChannelDeleteActivityValid, - isVideoChannelUpdateActivityValid, isVideoFlagValid, isVideoTorrentAddActivityValid, isVideoTorrentDeleteActivityValid, @@ -25,18 +25,23 @@ function isRootActivityValid (activity: any) { ) } +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) { - return isVideoTorrentAddActivityValid(activity) || - isVideoChannelCreateActivityValid(activity) || - isVideoTorrentUpdateActivityValid(activity) || - isVideoChannelUpdateActivityValid(activity) || - isVideoTorrentDeleteActivityValid(activity) || - isVideoChannelDeleteActivityValid(activity) || - isAccountDeleteActivityValid(activity) || - isAccountFollowActivityValid(activity) || - isAccountAcceptActivityValid(activity) || - isVideoFlagValid(activity) || - isAnnounceValid(activity) + const checker = activityCheckers[activity.type] + // Unknown activity type + if (!checker) return false + + return checker(activity) } // --------------------------------------------------------------------------- @@ -45,3 +50,41 @@ export { isRootActivityValid, isActivityValid } + +// --------------------------------------------------------------------------- + +function checkCreateActivity (activity: any) { + return isVideoChannelCreateActivityValid(activity) || + isVideoFlagValid(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) +} diff --git a/server/helpers/custom-validators/activitypub/announce.ts b/server/helpers/custom-validators/activitypub/announce.ts new file mode 100644 index 000000000..4ba99d1ea --- /dev/null +++ b/server/helpers/custom-validators/activitypub/announce.ts @@ -0,0 +1,15 @@ +import { isBaseActivityValid } from './misc' +import { isVideoTorrentAddActivityValid } from './videos' +import { isVideoChannelCreateActivityValid } from './video-channels' + +function isAnnounceValid (activity: any) { + return isBaseActivityValid(activity, 'Announce') && + ( + isVideoChannelCreateActivityValid(activity.object) || + isVideoTorrentAddActivityValid(activity.object) + ) +} + +export { + isAnnounceValid +} diff --git a/server/helpers/custom-validators/activitypub/index.ts b/server/helpers/custom-validators/activitypub/index.ts index 0eba06a7b..6685b269f 100644 --- a/server/helpers/custom-validators/activitypub/index.ts +++ b/server/helpers/custom-validators/activitypub/index.ts @@ -1,5 +1,7 @@ export * from './account' export * from './activity' -export * from './signature' export * from './misc' +export * from './signature' +export * from './undo' +export * from './video-channels' export * from './videos' diff --git a/server/helpers/custom-validators/activitypub/undo.ts b/server/helpers/custom-validators/activitypub/undo.ts new file mode 100644 index 000000000..a9a2a3a41 --- /dev/null +++ b/server/helpers/custom-validators/activitypub/undo.ts @@ -0,0 +1,13 @@ +import { isAccountFollowActivityValid } from './account' +import { isBaseActivityValid } from './misc' + +function isUndoValid (activity: any) { + return isBaseActivityValid(activity, 'Undo') && + ( + isAccountFollowActivityValid(activity.object) + ) +} + +export { + isUndoValid +} diff --git a/server/helpers/custom-validators/activitypub/video-channels.ts b/server/helpers/custom-validators/activitypub/video-channels.ts new file mode 100644 index 000000000..9fd3bb149 --- /dev/null +++ b/server/helpers/custom-validators/activitypub/video-channels.ts @@ -0,0 +1,36 @@ +import { isDateValid, isUUIDValid } from '../misc' +import { isVideoChannelDescriptionValid, isVideoChannelNameValid } from '../video-channels' +import { isActivityPubUrlValid, isBaseActivityValid } from './misc' + +function isVideoChannelCreateActivityValid (activity: any) { + return isBaseActivityValid(activity, 'Create') && + isVideoChannelObjectValid(activity.object) +} + +function isVideoChannelUpdateActivityValid (activity: any) { + return isBaseActivityValid(activity, 'Update') && + isVideoChannelObjectValid(activity.object) +} + +function isVideoChannelDeleteActivityValid (activity: any) { + return isBaseActivityValid(activity, 'Delete') +} + +function isVideoChannelObjectValid (videoChannel: any) { + return videoChannel.type === 'VideoChannel' && + isActivityPubUrlValid(videoChannel.id) && + isVideoChannelNameValid(videoChannel.name) && + isVideoChannelDescriptionValid(videoChannel.content) && + isDateValid(videoChannel.published) && + isDateValid(videoChannel.updated) && + isUUIDValid(videoChannel.uuid) +} + +// --------------------------------------------------------------------------- + +export { + isVideoChannelCreateActivityValid, + isVideoChannelUpdateActivityValid, + isVideoChannelDeleteActivityValid, + isVideoChannelObjectValid +} diff --git a/server/helpers/custom-validators/activitypub/videos.ts b/server/helpers/custom-validators/activitypub/videos.ts index 728511e3d..faeedd3df 100644 --- a/server/helpers/custom-validators/activitypub/videos.ts +++ b/server/helpers/custom-validators/activitypub/videos.ts @@ -1,7 +1,6 @@ import * as validator from 'validator' import { ACTIVITY_PUB } from '../../../initializers' import { exists, isDateValid, isUUIDValid } from '../misc' -import { isVideoChannelDescriptionValid, isVideoChannelNameValid } from '../video-channels' import { isVideoAbuseReasonValid, isVideoDurationValid, @@ -28,6 +27,13 @@ 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) && @@ -57,57 +63,13 @@ function isVideoTorrentObjectValid (video: any) { video.url.length !== 0 } -function isVideoFlagValid (activity: any) { - return isBaseActivityValid(activity, 'Create') && - activity.object.type === 'Flag' && - isVideoAbuseReasonValid(activity.object.content) && - isActivityPubUrlValid(activity.object.object) -} - -function isAnnounceValid (activity: any) { - return isBaseActivityValid(activity, 'Announce') && - ( - isVideoChannelCreateActivityValid(activity.object) || - isVideoTorrentAddActivityValid(activity.object) - ) -} - -function isVideoChannelCreateActivityValid (activity: any) { - return isBaseActivityValid(activity, 'Create') && - isVideoChannelObjectValid(activity.object) -} - -function isVideoChannelUpdateActivityValid (activity: any) { - return isBaseActivityValid(activity, 'Update') && - isVideoChannelObjectValid(activity.object) -} - -function isVideoChannelDeleteActivityValid (activity: any) { - return isBaseActivityValid(activity, 'Delete') -} - -function isVideoChannelObjectValid (videoChannel: any) { - return videoChannel.type === 'VideoChannel' && - isActivityPubUrlValid(videoChannel.id) && - isVideoChannelNameValid(videoChannel.name) && - isVideoChannelDescriptionValid(videoChannel.content) && - isDateValid(videoChannel.published) && - isDateValid(videoChannel.updated) && - isUUIDValid(videoChannel.uuid) -} - // --------------------------------------------------------------------------- export { isVideoTorrentAddActivityValid, - isVideoChannelCreateActivityValid, isVideoTorrentUpdateActivityValid, - isVideoChannelUpdateActivityValid, - isVideoChannelDeleteActivityValid, isVideoTorrentDeleteActivityValid, - isVideoFlagValid, - isAnnounceValid, - isVideoChannelObjectValid + isVideoFlagValid } // --------------------------------------------------------------------------- -- cgit v1.2.3