diff options
| author | MeiMei <30769358+mei23@users.noreply.github.com> | 2018-10-31 02:16:13 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2018-10-31 02:16:13 +0900 |
| commit | 441ab2b5f8b815a6bce186677affce446a1bb70d (patch) | |
| tree | 827b74e1213935e17f9c830ef0d8c9ecb1f70b7a /src/remote/resolve-user.ts | |
| parent | Add Crowdin info to translate docs (#3044) (diff) | |
| download | sharkey-441ab2b5f8b815a6bce186677affce446a1bb70d.tar.gz sharkey-441ab2b5f8b815a6bce186677affce446a1bb70d.tar.bz2 sharkey-441ab2b5f8b815a6bce186677affce446a1bb70d.zip | |
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
Diffstat (limited to 'src/remote/resolve-user.ts')
| -rw-r--r-- | src/remote/resolve-user.ts | 69 |
1 files changed, 58 insertions, 11 deletions
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<IUser> => { +const log = debug('misskey:remote:resolve-user'); + +export default async (username: string, _host: string, option?: any, resync?: boolean): Promise<IUser> => { 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<IU const host = toUnicode(hostAscii); if (config.host == host) { + log(`return local user: ${usernameLower}`); return await User.findOne({ usernameLower, host: null }); } - let user = await User.findOne({ usernameLower, host }, option); + const user = await User.findOne({ usernameLower, host }, option); + + const acctLower = `${usernameLower}@${hostAscii}`; if (user === null) { - const acctLower = `${usernameLower}@${hostAscii}`; + const self = await resolveSelf(acctLower); + + log(`return new remote user: ${acctLower}`); + return await createPerson(self.href); + } + + if (resync) { + log(`try resync: ${acctLower}`); + const self = await resolveSelf(acctLower); + + if ((user as IRemoteUser).uri !== self.href) { + // if uri mismatch, Fix (user@host <=> 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; +} |