aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChocobozzz <florian.bigard@gmail.com>2017-11-16 17:04:19 +0100
committerChocobozzz <florian.bigard@gmail.com>2017-11-27 19:40:52 +0100
commit21e0727a84734cb0c81c1c9bb22a49b13e46fe5f (patch)
tree088da51cadbffe3ac64414b407e161f58b53bde7
parentd7d5611c8a23de9b483f0437ad3469afef7b8805 (diff)
downloadPeerTube-21e0727a84734cb0c81c1c9bb22a49b13e46fe5f.tar.gz
PeerTube-21e0727a84734cb0c81c1c9bb22a49b13e46fe5f.tar.zst
PeerTube-21e0727a84734cb0c81c1c9bb22a49b13e46fe5f.zip
Federate video abuses
-rw-r--r--server/controllers/api/videos/abuse.ts1
-rw-r--r--server/helpers/custom-validators/activitypub/videos.ts7
-rw-r--r--server/lib/activitypub/misc.ts6
-rw-r--r--server/lib/activitypub/send-request.ts4
-rw-r--r--server/models/video/video-abuse-interface.ts3
-rw-r--r--server/models/video/video-abuse.ts15
-rw-r--r--server/models/video/video.ts4
7 files changed, 28 insertions, 12 deletions
diff --git a/server/controllers/api/videos/abuse.ts b/server/controllers/api/videos/abuse.ts
index d9b4e8772..88b3d538d 100644
--- a/server/controllers/api/videos/abuse.ts
+++ b/server/controllers/api/videos/abuse.ts
@@ -75,6 +75,7 @@ async function reportVideoAbuse (req: express.Request, res: express.Response) {
75 75
76 await db.sequelize.transaction(async t => { 76 await db.sequelize.transaction(async t => {
77 const videoAbuseInstance = await db.VideoAbuse.create(abuseToCreate, { transaction: t }) 77 const videoAbuseInstance = await db.VideoAbuse.create(abuseToCreate, { transaction: t })
78 videoAbuseInstance.Video = videoInstance
78 79
79 // We send the video abuse to the origin server 80 // We send the video abuse to the origin server
80 if (videoInstance.isOwned() === false) { 81 if (videoInstance.isOwned() === false) {
diff --git a/server/helpers/custom-validators/activitypub/videos.ts b/server/helpers/custom-validators/activitypub/videos.ts
index 8486297ad..728511e3d 100644
--- a/server/helpers/custom-validators/activitypub/videos.ts
+++ b/server/helpers/custom-validators/activitypub/videos.ts
@@ -58,9 +58,10 @@ function isVideoTorrentObjectValid (video: any) {
58} 58}
59 59
60function isVideoFlagValid (activity: any) { 60function isVideoFlagValid (activity: any) {
61 return isBaseActivityValid(activity, 'Flag') && 61 return isBaseActivityValid(activity, 'Create') &&
62 isVideoAbuseReasonValid(activity.content) && 62 activity.object.type === 'Flag' &&
63 isActivityPubUrlValid(activity.object) 63 isVideoAbuseReasonValid(activity.object.content) &&
64 isActivityPubUrlValid(activity.object.object)
64} 65}
65 66
66function isAnnounceValid (activity: any) { 67function isAnnounceValid (activity: any) {
diff --git a/server/lib/activitypub/misc.ts b/server/lib/activitypub/misc.ts
index f853d742e..c07d9f654 100644
--- a/server/lib/activitypub/misc.ts
+++ b/server/lib/activitypub/misc.ts
@@ -1,14 +1,12 @@
1import * as magnetUtil from 'magnet-uri' 1import * as magnetUtil from 'magnet-uri'
2import * as Sequelize from 'sequelize'
3import { VideoTorrentObject } from '../../../shared' 2import { VideoTorrentObject } from '../../../shared'
3import { VideoChannelObject } from '../../../shared/models/activitypub/objects/video-channel-object'
4import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos' 4import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos'
5import { database as db } from '../../initializers'
6import { VIDEO_MIMETYPE_EXT } from '../../initializers/constants' 5import { VIDEO_MIMETYPE_EXT } from '../../initializers/constants'
6import { AccountInstance } from '../../models/account/account-interface'
7import { VideoChannelInstance } from '../../models/video/video-channel-interface' 7import { VideoChannelInstance } from '../../models/video/video-channel-interface'
8import { VideoFileAttributes } from '../../models/video/video-file-interface' 8import { VideoFileAttributes } from '../../models/video/video-file-interface'
9import { VideoAttributes, VideoInstance } from '../../models/video/video-interface' 9import { VideoAttributes, VideoInstance } from '../../models/video/video-interface'
10import { VideoChannelObject } from '../../../shared/models/activitypub/objects/video-channel-object'
11import { AccountInstance } from '../../models/account/account-interface'
12 10
13function videoChannelActivityObjectToDBAttributes (videoChannelObject: VideoChannelObject, account: AccountInstance) { 11function videoChannelActivityObjectToDBAttributes (videoChannelObject: VideoChannelObject, account: AccountInstance) {
14 return { 12 return {
diff --git a/server/lib/activitypub/send-request.ts b/server/lib/activitypub/send-request.ts
index d5d07011a..abc1b598d 100644
--- a/server/lib/activitypub/send-request.ts
+++ b/server/lib/activitypub/send-request.ts
@@ -8,7 +8,7 @@ import {
8} from '../../models' 8} from '../../models'
9import { httpRequestJobScheduler } from '../jobs' 9import { httpRequestJobScheduler } from '../jobs'
10import { signObject, activityPubContextify } from '../../helpers' 10import { signObject, activityPubContextify } from '../../helpers'
11import { Activity } from '../../../shared' 11import { Activity, VideoAbuseObject } from '../../../shared'
12import { VideoAbuseInstance } from '../../models/video/video-abuse-interface' 12import { VideoAbuseInstance } from '../../models/video/video-abuse-interface'
13import { getActivityPubUrl } from '../../helpers/activitypub' 13import { getActivityPubUrl } from '../../helpers/activitypub'
14import { logger } from '../../helpers/logger' 14import { logger } from '../../helpers/logger'
@@ -96,7 +96,7 @@ async function sendVideoAbuse (
96 t: Sequelize.Transaction 96 t: Sequelize.Transaction
97) { 97) {
98 const url = getActivityPubUrl('videoAbuse', videoAbuse.id.toString()) 98 const url = getActivityPubUrl('videoAbuse', videoAbuse.id.toString())
99 const data = await createActivityData(url, fromAccount, video.url) 99 const data = await createActivityData(url, fromAccount, videoAbuse.toActivityPubObject())
100 100
101 return unicastTo(data, video.VideoChannel.Account.sharedInboxUrl, t) 101 return unicastTo(data, video.VideoChannel.Account.sharedInboxUrl, t)
102} 102}
diff --git a/server/models/video/video-abuse-interface.ts b/server/models/video/video-abuse-interface.ts
index 96f0fbe4a..feafc4a19 100644
--- a/server/models/video/video-abuse-interface.ts
+++ b/server/models/video/video-abuse-interface.ts
@@ -5,15 +5,18 @@ import { VideoAbuse as FormattedVideoAbuse } from '../../../shared/models/videos
5import { AccountInstance } from '../account/account-interface' 5import { AccountInstance } from '../account/account-interface'
6import { ServerInstance } from '../server/server-interface' 6import { ServerInstance } from '../server/server-interface'
7import { VideoInstance } from './video-interface' 7import { VideoInstance } from './video-interface'
8import { VideoAbuseObject } from '../../../shared/models/activitypub/objects/video-abuse-object'
8 9
9export namespace VideoAbuseMethods { 10export namespace VideoAbuseMethods {
10 export type ToFormattedJSON = (this: VideoAbuseInstance) => FormattedVideoAbuse 11 export type ToFormattedJSON = (this: VideoAbuseInstance) => FormattedVideoAbuse
11 12
12 export type ListForApi = (start: number, count: number, sort: string) => Promise< ResultList<VideoAbuseInstance> > 13 export type ListForApi = (start: number, count: number, sort: string) => Promise< ResultList<VideoAbuseInstance> >
14 export type ToActivityPubObject = () => VideoAbuseObject
13} 15}
14 16
15export interface VideoAbuseClass { 17export interface VideoAbuseClass {
16 listForApi: VideoAbuseMethods.ListForApi 18 listForApi: VideoAbuseMethods.ListForApi
19 toActivityPubObject: VideoAbuseMethods.ToActivityPubObject
17} 20}
18 21
19export interface VideoAbuseAttributes { 22export interface VideoAbuseAttributes {
diff --git a/server/models/video/video-abuse.ts b/server/models/video/video-abuse.ts
index f3fdeab52..e8f4f9a67 100644
--- a/server/models/video/video-abuse.ts
+++ b/server/models/video/video-abuse.ts
@@ -10,10 +10,12 @@ import {
10 10
11 VideoAbuseMethods 11 VideoAbuseMethods
12} from './video-abuse-interface' 12} from './video-abuse-interface'
13import { VideoAbuseObject } from '../../../shared/models/activitypub/objects/video-abuse-object'
13 14
14let VideoAbuse: Sequelize.Model<VideoAbuseInstance, VideoAbuseAttributes> 15let VideoAbuse: Sequelize.Model<VideoAbuseInstance, VideoAbuseAttributes>
15let toFormattedJSON: VideoAbuseMethods.ToFormattedJSON 16let toFormattedJSON: VideoAbuseMethods.ToFormattedJSON
16let listForApi: VideoAbuseMethods.ListForApi 17let listForApi: VideoAbuseMethods.ListForApi
18let toActivityPubObject: VideoAbuseMethods.ToActivityPubObject
17 19
18export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { 20export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
19 VideoAbuse = sequelize.define<VideoAbuseInstance, VideoAbuseAttributes>('VideoAbuse', 21 VideoAbuse = sequelize.define<VideoAbuseInstance, VideoAbuseAttributes>('VideoAbuse',
@@ -47,7 +49,8 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da
47 listForApi 49 listForApi
48 ] 50 ]
49 const instanceMethods = [ 51 const instanceMethods = [
50 toFormattedJSON 52 toFormattedJSON,
53 toActivityPubObject
51 ] 54 ]
52 addMethodsToModel(VideoAbuse, classMethods, instanceMethods) 55 addMethodsToModel(VideoAbuse, classMethods, instanceMethods)
53 56
@@ -80,6 +83,16 @@ toFormattedJSON = function (this: VideoAbuseInstance) {
80 return json 83 return json
81} 84}
82 85
86toActivityPubObject = function (this: VideoAbuseInstance) {
87 const videoAbuseObject: VideoAbuseObject = {
88 type: 'Flag' as 'Flag',
89 content: this.reason,
90 object: this.Video.url
91 }
92
93 return videoAbuseObject
94}
95
83// ------------------------------ STATICS ------------------------------ 96// ------------------------------ STATICS ------------------------------
84 97
85function associate (models) { 98function associate (models) {
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index 5b0377c2e..5fb254b2d 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -26,6 +26,7 @@ import {
26 unlinkPromise, 26 unlinkPromise,
27 writeFilePromise 27 writeFilePromise
28} from '../../helpers' 28} from '../../helpers'
29import { isVideoUrlValid } from '../../helpers/custom-validators/videos'
29import { 30import {
30 API_VERSION, 31 API_VERSION,
31 CONFIG, 32 CONFIG,
@@ -39,14 +40,13 @@ import {
39 VIDEO_LICENCES, 40 VIDEO_LICENCES,
40 VIDEO_PRIVACIES 41 VIDEO_PRIVACIES
41} from '../../initializers' 42} from '../../initializers'
43import { sendDeleteVideo } from '../../lib/activitypub/send-request'
42 44
43import { addMethodsToModel, getSort } from '../utils' 45import { addMethodsToModel, getSort } from '../utils'
44 46
45import { TagInstance } from './tag-interface' 47import { TagInstance } from './tag-interface'
46import { VideoFileInstance, VideoFileModel } from './video-file-interface' 48import { VideoFileInstance, VideoFileModel } from './video-file-interface'
47import { VideoAttributes, VideoInstance, VideoMethods } from './video-interface' 49import { VideoAttributes, VideoInstance, VideoMethods } from './video-interface'
48import { sendDeleteVideo } from '../../lib/activitypub/send-request'
49import { isVideoUrlValid } from '../../helpers/custom-validators/videos'
50 50
51const Buffer = safeBuffer.Buffer 51const Buffer = safeBuffer.Buffer
52 52