aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib/activitypub
diff options
context:
space:
mode:
authorChocobozzz <florian.bigard@gmail.com>2017-11-15 15:12:23 +0100
committerChocobozzz <florian.bigard@gmail.com>2017-11-27 19:40:52 +0100
commit8e13fa7d09e9925b4559cbba6c5d72c5ff1bd391 (patch)
treea59070f4dc6b52a5b422bd31a8eb8ea3bff831a0 /server/lib/activitypub
parent59c857da5961e2bcddcfd07832783c1e4afcd01a (diff)
downloadPeerTube-8e13fa7d09e9925b4559cbba6c5d72c5ff1bd391.tar.gz
PeerTube-8e13fa7d09e9925b4559cbba6c5d72c5ff1bd391.tar.zst
PeerTube-8e13fa7d09e9925b4559cbba6c5d72c5ff1bd391.zip
Add video abuse to activity pub
Diffstat (limited to 'server/lib/activitypub')
-rw-r--r--server/lib/activitypub/process-create.ts43
-rw-r--r--server/lib/activitypub/send-request.ts25
2 files changed, 57 insertions, 11 deletions
diff --git a/server/lib/activitypub/process-create.ts b/server/lib/activitypub/process-create.ts
index 471674ead..8d842b822 100644
--- a/server/lib/activitypub/process-create.ts
+++ b/server/lib/activitypub/process-create.ts
@@ -1,11 +1,9 @@
1import { ActivityCreate, VideoChannelObject, VideoTorrentObject } from '../../../shared' 1import { ActivityCreate, VideoChannelObject } from '../../../shared'
2import { ActivityAdd } from '../../../shared/models/activitypub/activity' 2import { VideoAbuseObject } from '../../../shared/models/activitypub/objects/video-abuse-object'
3import { generateThumbnailFromUrl, logger, retryTransactionWrapper } from '../../helpers' 3import { logger, retryTransactionWrapper } from '../../helpers'
4import { getActivityPubUrl, getOrCreateAccount } from '../../helpers/activitypub'
4import { database as db } from '../../initializers' 5import { database as db } from '../../initializers'
5import { videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc'
6import Bluebird = require('bluebird')
7import { AccountInstance } from '../../models/account/account-interface' 6import { AccountInstance } from '../../models/account/account-interface'
8import { getActivityPubUrl, getOrCreateAccount } from '../../helpers/activitypub'
9 7
10async function processCreateActivity (activity: ActivityCreate) { 8async function processCreateActivity (activity: ActivityCreate) {
11 const activityObject = activity.object 9 const activityObject = activity.object
@@ -14,6 +12,8 @@ async function processCreateActivity (activity: ActivityCreate) {
14 12
15 if (activityType === 'VideoChannel') { 13 if (activityType === 'VideoChannel') {
16 return processCreateVideoChannel(account, activityObject as VideoChannelObject) 14 return processCreateVideoChannel(account, activityObject as VideoChannelObject)
15 } else if (activityType === 'Flag') {
16 return processCreateVideoAbuse(account, activityObject as VideoAbuseObject)
17 } 17 }
18 18
19 logger.warn('Unknown activity object type %s when creating activity.', activityType, { activity: activity.id }) 19 logger.warn('Unknown activity object type %s when creating activity.', activityType, { activity: activity.id })
@@ -62,3 +62,34 @@ async function addRemoteVideoChannel (account: AccountInstance, videoChannelToCr
62 62
63 logger.info('Remote video channel with uuid %s inserted.', videoChannelToCreateData.uuid) 63 logger.info('Remote video channel with uuid %s inserted.', videoChannelToCreateData.uuid)
64} 64}
65
66function processCreateVideoAbuse (account: AccountInstance, videoAbuseToCreateData: VideoAbuseObject) {
67 const options = {
68 arguments: [ account, videoAbuseToCreateData ],
69 errorMessage: 'Cannot insert the remote video abuse with many retries.'
70 }
71
72 return retryTransactionWrapper(addRemoteVideoAbuse, options)
73}
74
75async function addRemoteVideoAbuse (account: AccountInstance, videoAbuseToCreateData: VideoAbuseObject) {
76 logger.debug('Reporting remote abuse for video %s.', videoAbuseToCreateData.object)
77
78 return db.sequelize.transaction(async t => {
79 const video = await db.Video.loadByUrl(videoAbuseToCreateData.object, t)
80 if (!video) {
81 logger.warn('Unknown video %s for remote video abuse.', videoAbuseToCreateData.object)
82 return
83 }
84
85 const videoAbuseData = {
86 reporterAccountId: account.id,
87 reason: videoAbuseToCreateData.content,
88 videoId: video.id
89 }
90
91 await db.VideoAbuse.create(videoAbuseData)
92
93 logger.info('Remote abuse for video uuid %s created', videoAbuseToCreateData.object)
94 })
95}
diff --git a/server/lib/activitypub/send-request.ts b/server/lib/activitypub/send-request.ts
index f942a2eba..1a6cebc03 100644
--- a/server/lib/activitypub/send-request.ts
+++ b/server/lib/activitypub/send-request.ts
@@ -9,6 +9,8 @@ import {
9import { httpRequestJobScheduler } from '../jobs' 9import { httpRequestJobScheduler } from '../jobs'
10import { signObject, activityPubContextify } from '../../helpers' 10import { signObject, activityPubContextify } from '../../helpers'
11import { Activity } from '../../../shared' 11import { Activity } from '../../../shared'
12import { VideoAbuseInstance } from '../../models/video/video-abuse-interface'
13import { getActivityPubUrl } from '../../helpers/activitypub'
12 14
13async function sendCreateVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) { 15async function sendCreateVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) {
14 const videoChannelObject = videoChannel.toActivityPubObject() 16 const videoChannelObject = videoChannel.toActivityPubObject()
@@ -56,16 +58,28 @@ async function sendDeleteAccount (account: AccountInstance, t: Sequelize.Transac
56 return broadcastToFollowers(data, account, t) 58 return broadcastToFollowers(data, account, t)
57} 59}
58 60
61async function sendVideoAbuse (
62 fromAccount: AccountInstance,
63 videoAbuse: VideoAbuseInstance,
64 video: VideoInstance,
65 t: Sequelize.Transaction
66) {
67 const url = getActivityPubUrl('videoAbuse', videoAbuse.id.toString())
68 const data = await createActivityData(url, fromAccount, video.url)
69
70 return unicastTo(data, video.VideoChannel.Account.sharedInboxUrl, t)
71}
72
59async function sendAccept (fromAccount: AccountInstance, toAccount: AccountInstance, t: Sequelize.Transaction) { 73async function sendAccept (fromAccount: AccountInstance, toAccount: AccountInstance, t: Sequelize.Transaction) {
60 const data = await acceptActivityData(fromAccount) 74 const data = await acceptActivityData(fromAccount)
61 75
62 return unicastTo(data, toAccount, t) 76 return unicastTo(data, toAccount.inboxUrl, t)
63} 77}
64 78
65async function sendFollow (fromAccount: AccountInstance, toAccount: AccountInstance, t: Sequelize.Transaction) { 79async function sendFollow (fromAccount: AccountInstance, toAccount: AccountInstance, t: Sequelize.Transaction) {
66 const data = await followActivityData(toAccount.url, fromAccount) 80 const data = await followActivityData(toAccount.url, fromAccount)
67 81
68 return unicastTo(data, toAccount, t) 82 return unicastTo(data, toAccount.inboxUrl, t)
69} 83}
70 84
71// --------------------------------------------------------------------------- 85// ---------------------------------------------------------------------------
@@ -79,7 +93,8 @@ export {
79 sendDeleteVideo, 93 sendDeleteVideo,
80 sendDeleteAccount, 94 sendDeleteAccount,
81 sendAccept, 95 sendAccept,
82 sendFollow 96 sendFollow,
97 sendVideoAbuse
83} 98}
84 99
85// --------------------------------------------------------------------------- 100// ---------------------------------------------------------------------------
@@ -95,9 +110,9 @@ async function broadcastToFollowers (data: any, fromAccount: AccountInstance, t:
95 return httpRequestJobScheduler.createJob(t, 'httpRequestBroadcastHandler', jobPayload) 110 return httpRequestJobScheduler.createJob(t, 'httpRequestBroadcastHandler', jobPayload)
96} 111}
97 112
98async function unicastTo (data: any, toAccount: AccountInstance, t: Sequelize.Transaction) { 113async function unicastTo (data: any, toAccountUrl: string, t: Sequelize.Transaction) {
99 const jobPayload = { 114 const jobPayload = {
100 uris: [ toAccount.inboxUrl ], 115 uris: [ toAccountUrl ],
101 body: data 116 body: data
102 } 117 }
103 118