]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Try to fix non HTTPS remote accounts
authorChocobozzz <me@florianbigard.com>
Thu, 3 Dec 2020 14:03:37 +0000 (15:03 +0100)
committerChocobozzz <me@florianbigard.com>
Thu, 3 Dec 2020 14:21:16 +0000 (15:21 +0100)
server/lib/activitypub/actor.ts

index 73406e248997b9c374b55c1ff59d8e597c394b99..63975021c920fc53cf02db83cde4dbce2cb0308b 100644 (file)
@@ -1,5 +1,5 @@
 import * as Bluebird from 'bluebird'
-import { Transaction } from 'sequelize'
+import { Op, Transaction } from 'sequelize'
 import { URL } from 'url'
 import { v4 as uuidv4 } from 'uuid'
 import { ActivityPubActor, ActivityPubActorType, ActivityPubOrderedCollection } from '../../../shared/models/activitypub'
@@ -384,14 +384,33 @@ function saveActorAndServerAndModelIfNotExist (
 
     // Force the actor creation, sometimes Sequelize skips the save() when it thinks the instance already exists
     // (which could be false in a retried query)
-    const [ actorCreated ] = await ActorModel.findOrCreate<MActorFullActor>({
+    const [ actorCreated, created ] = await ActorModel.findOrCreate<MActorFullActor>({
       defaults: actor.toJSON(),
       where: {
-        url: actor.url
+        [Op.or]: [
+          {
+            url: actor.url
+          },
+          {
+            serverId: actor.serverId,
+            preferredUsername: actor.preferredUsername
+          }
+        ]
       },
       transaction: t
     })
 
+    // Try to fix non HTTPS accounts of remote instances that fixed their URL afterwards
+    if (created !== true && actorCreated.url !== actor.url) {
+      // Only fix http://example.com/account/djidane to https://example.com/account/djidane
+      if (actorCreated.url.replace('http://', '') !== actor.url.replace('https://', '')) {
+        throw new Error(`Actor from DB with URL ${actorCreated.url} does not correspond to actor ${actor.url}`)
+      }
+
+      actorCreated.url = actor.url
+      await actorCreated.save({ transaction: t })
+    }
+
     if (actorCreated.type === 'Person' || actorCreated.type === 'Application') {
       actorCreated.Account = await saveAccount(actorCreated, result, t) as MAccountDefault
       actorCreated.Account.Actor = actorCreated