]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
More robust channel change federation
authorChocobozzz <me@florianbigard.com>
Fri, 26 Feb 2021 10:50:18 +0000 (11:50 +0100)
committerChocobozzz <me@florianbigard.com>
Fri, 26 Feb 2021 10:50:18 +0000 (11:50 +0100)
server/lib/activitypub/process/process-update.ts
server/lib/activitypub/videos.ts

index 6d2fff3fece367d1621a083535ce5725cf7d205e..849f70b94536affabbe9ac8aa5eb7903d8c4819e 100644 (file)
@@ -62,7 +62,15 @@ async function processUpdateVideo (actor: MActorSignature, activity: ActivityUpd
     return undefined
   }
 
-  const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoObject.id, allowRefresh: false, fetchType: 'all' })
+  const { video, created } = await getOrCreateVideoAndAccountAndChannel({
+    videoObject: videoObject.id,
+    allowRefresh: false,
+    fetchType: 'all'
+  })
+  // We did not have this video, it has been created so no need to update
+  if (created) return
+
+  // Load new channel
   const channelActor = await getOrCreateVideoChannelFromVideoObject(videoObject)
 
   const account = actor.Account as MAccountIdActor
index c38edad56dad3980d8fde2b15f5fb8147ce981a0..c29bcc52843eeef9302e2009456e28b4453b7aac 100644 (file)
@@ -336,10 +336,15 @@ async function updateVideoFromAP (options: {
 
       videoFieldsSave = video.toJSON()
 
-      // Check actor has the right to update the video
-      const videoChannel = video.VideoChannel
-      if (videoChannel.Account.id !== account.id) {
-        throw new Error('Account ' + account.Actor.url + ' does not own video channel ' + videoChannel.Actor.url)
+      // Check we can update the channel: we trust the remote server
+      const oldVideoChannel = video.VideoChannel
+
+      if (!oldVideoChannel.Actor.serverId || !channel.Actor.serverId) {
+        throw new Error('Cannot check old channel/new channel validity because `serverId` is null')
+      }
+
+      if (oldVideoChannel.Actor.serverId !== channel.Actor.serverId) {
+        throw new Error('New channel ' + channel.Actor.url + ' is not on the same server than new channel ' + oldVideoChannel.Actor.url)
       }
 
       const to = overrideTo || videoObject.to