]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/cache-file.ts
Don't inject untrusted input
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / cache-file.ts
1 import { Transaction } from 'sequelize'
2 import { MActorId, MVideoRedundancy, MVideoWithAllFiles } from '@server/types/models'
3 import { CacheFileObject, VideoStreamingPlaylistType } from '@shared/models'
4 import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
5
6 async function createOrUpdateCacheFile (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId, t: Transaction) {
7 const redundancyModel = await VideoRedundancyModel.loadByUrl(cacheFileObject.id, t)
8
9 if (redundancyModel) {
10 return updateCacheFile(cacheFileObject, redundancyModel, video, byActor, t)
11 }
12
13 return createCacheFile(cacheFileObject, video, byActor, t)
14 }
15
16 // ---------------------------------------------------------------------------
17
18 export {
19 createOrUpdateCacheFile
20 }
21
22 // ---------------------------------------------------------------------------
23
24 function createCacheFile (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId, t: Transaction) {
25 const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor)
26
27 return VideoRedundancyModel.create(attributes, { transaction: t })
28 }
29
30 function updateCacheFile (
31 cacheFileObject: CacheFileObject,
32 redundancyModel: MVideoRedundancy,
33 video: MVideoWithAllFiles,
34 byActor: MActorId,
35 t: Transaction
36 ) {
37 if (redundancyModel.actorId !== byActor.id) {
38 throw new Error('Cannot update redundancy ' + redundancyModel.url + ' of another actor.')
39 }
40
41 const attributes = cacheFileActivityObjectToDBAttributes(cacheFileObject, video, byActor)
42
43 redundancyModel.expiresOn = attributes.expiresOn
44 redundancyModel.fileUrl = attributes.fileUrl
45
46 return redundancyModel.save({ transaction: t })
47 }
48
49 function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: MVideoWithAllFiles, byActor: MActorId) {
50
51 if (cacheFileObject.url.mediaType === 'application/x-mpegURL') {
52 const url = cacheFileObject.url
53
54 const playlist = video.VideoStreamingPlaylists.find(t => t.type === VideoStreamingPlaylistType.HLS)
55 if (!playlist) throw new Error('Cannot find HLS playlist of video ' + video.url)
56
57 return {
58 expiresOn: cacheFileObject.expires ? new Date(cacheFileObject.expires) : null,
59 url: cacheFileObject.id,
60 fileUrl: url.href,
61 strategy: null,
62 videoStreamingPlaylistId: playlist.id,
63 actorId: byActor.id
64 }
65 }
66
67 const url = cacheFileObject.url
68 const videoFile = video.VideoFiles.find(f => {
69 return f.resolution === url.height && f.fps === url.fps
70 })
71
72 if (!videoFile) throw new Error(`Cannot find video file ${url.height} ${url.fps} of video ${video.url}`)
73
74 return {
75 expiresOn: cacheFileObject.expires ? new Date(cacheFileObject.expires) : null,
76 url: cacheFileObject.id,
77 fileUrl: url.href,
78 strategy: null,
79 videoFileId: videoFile.id,
80 actorId: byActor.id
81 }
82 }