From 5147a6d945dcac2f15e85acd7db88d41d8bdc768 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 3 Dec 2020 15:03:37 +0100 Subject: [PATCH] Try to fix non HTTPS remote accounts --- server/lib/activitypub/actor.ts | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts index 73406e248..63975021c 100644 --- a/server/lib/activitypub/actor.ts +++ b/server/lib/activitypub/actor.ts @@ -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({ + const [ actorCreated, created ] = await ActorModel.findOrCreate({ 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