From 441ab2b5f8b815a6bce186677affce446a1bb70d Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Wed, 31 Oct 2018 02:16:13 +0900 Subject: Fix: can't recognize rebirthed instance user (#3046) * resync uri from WebFinger * trigger resync on user page * allways update on resync * Revert "trigger resync on user page" This reverts commit 8ff139fb49ee61ad55e4b42c562f8a2c3f8098ac. * background resync --- src/remote/resolve-user.ts | 69 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 11 deletions(-) (limited to 'src/remote') diff --git a/src/remote/resolve-user.ts b/src/remote/resolve-user.ts index 15401557f5..ed259774bd 100644 --- a/src/remote/resolve-user.ts +++ b/src/remote/resolve-user.ts @@ -1,13 +1,18 @@ import { toUnicode, toASCII } from 'punycode'; -import User, { IUser } from '../models/user'; +import User, { IUser, IRemoteUser } from '../models/user'; import webFinger from './webfinger'; import config from '../config'; -import { createPerson } from './activitypub/models/person'; +import { createPerson, updatePerson } from './activitypub/models/person'; +import { URL } from 'url'; +import * as debug from 'debug'; -export default async (username: string, _host: string, option?: any): Promise => { +const log = debug('misskey:remote:resolve-user'); + +export default async (username: string, _host: string, option?: any, resync?: boolean): Promise => { const usernameLower = username.toLowerCase(); if (_host == null) { + log(`return local user: ${usernameLower}`); return await User.findOne({ usernameLower, host: null }); } @@ -15,22 +20,64 @@ export default async (username: string, _host: string, option?: any): Promise AP's Person id(IRemoteUser.uri)) mapping. + log(`uri missmatch: ${acctLower}`); + console.log(`recovery missmatch uri for (username=${username}, host=${host}) from ${(user as IRemoteUser).uri} to ${self.href}`); - const finger = await webFinger(acctLower); - const self = finger.links.find(link => link.rel && link.rel.toLowerCase() === 'self'); - if (!self) { - throw new Error('self link not found'); + // validate uri + const uri = new URL(self.href); + if (uri.hostname !== hostAscii) { + throw new Error(`Invalied uri`); + } + + await User.update({ + usernameLower, + host: host + }, { + $set: { + uri: self.href + } + }); + } else { + log(`uri is fine: ${acctLower}`); } - user = await createPerson(self.href); - } + await updatePerson(self.href); + + log(`return resynced remote user: ${acctLower}`); + return await User.findOne({ uri: self.href }); +} + log(`return existing remote user: ${acctLower}`); return user; }; + +async function resolveSelf(acctLower: string) { + log(`WebFinger for ${acctLower}`); + const finger = await webFinger(acctLower); + const self = finger.links.find(link => link.rel && link.rel.toLowerCase() === 'self'); + if (!self) { + throw new Error('self link not found'); + } + return self; +} -- cgit v1.2.3-freya