summaryrefslogtreecommitdiff
path: root/src/remote/resolve-user.ts
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2018-10-31 02:16:13 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2018-10-31 02:16:13 +0900
commit441ab2b5f8b815a6bce186677affce446a1bb70d (patch)
tree827b74e1213935e17f9c830ef0d8c9ecb1f70b7a /src/remote/resolve-user.ts
parentAdd Crowdin info to translate docs (#3044) (diff)
downloadsharkey-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.ts69
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;
+}