From ac4ea25267be4c3a50d925cee025d6b008a65860 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 Apr 2019 00:09:08 +0900 Subject: Better error handling --- src/remote/activitypub/kernel/like.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/remote/activitypub/kernel/like.ts b/src/remote/activitypub/kernel/like.ts index a08b453a89..23b4aedd15 100644 --- a/src/remote/activitypub/kernel/like.ts +++ b/src/remote/activitypub/kernel/like.ts @@ -2,6 +2,7 @@ import { IRemoteUser } from '../../../models/entities/user'; import { ILike } from '../type'; import create from '../../../services/note/reaction/create'; import { Notes } from '../../../models'; +import { apLogger } from '../logger'; export default async (actor: IRemoteUser, activity: ILike) => { const id = typeof activity.object == 'string' ? activity.object : activity.object.id; @@ -14,7 +15,8 @@ export default async (actor: IRemoteUser, activity: ILike) => { const note = await Notes.findOne(noteId); if (note == null) { - throw new Error(); + apLogger.warn(`Like activity recivied, but no such note: ${id}`, { id }); + return; } await create(actor, note, activity._misskey_reaction); -- cgit v1.3.1-freya From e19ae644f10e402bce8eccb0f3c06b28c97653a9 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 Apr 2019 00:13:31 +0900 Subject: Fix indent --- src/remote/activitypub/kernel/delete/index.ts | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/remote/activitypub/kernel/delete/index.ts b/src/remote/activitypub/kernel/delete/index.ts index fab5e7ab64..199a6a6187 100644 --- a/src/remote/activitypub/kernel/delete/index.ts +++ b/src/remote/activitypub/kernel/delete/index.ts @@ -20,21 +20,21 @@ export default async (actor: IRemoteUser, activity: IDelete): Promise => { const uri = (object as any).id; switch (object.type) { - case 'Note': - case 'Question': - case 'Article': - deleteNote(actor, uri); - break; - - case 'Tombstone': - const note = await Notes.findOne({ uri }); - if (note != null) { + case 'Note': + case 'Question': + case 'Article': deleteNote(actor, uri); - } - break; + break; + + case 'Tombstone': + const note = await Notes.findOne({ uri }); + if (note != null) { + deleteNote(actor, uri); + } + break; - default: - apLogger.warn(`Unknown type: ${object.type}`); - break; + default: + apLogger.warn(`Unknown type: ${object.type}`); + break; } }; -- cgit v1.3.1-freya From 95733c9490db64b4ec583a5ea1a3945f4e9bb414 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 Apr 2019 00:40:56 +0900 Subject: [MFM] Better hashtag parsing --- src/mfm/language.ts | 2 +- test/mfm.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/mfm/language.ts b/src/mfm/language.ts index fc191d0423..207400d6d6 100644 --- a/src/mfm/language.ts +++ b/src/mfm/language.ts @@ -141,7 +141,7 @@ export const mfmLanguage = P.createLanguage({ }, hashtag: () => P((input, i) => { const text = input.substr(i); - const match = text.match(/^#([^\s\.,!\?'"#:\/\[\]]+)/i); + const match = text.match(/^#([^\s\.,!\?'"#:\/\[\]【】]+)/i); if (!match) return P.makeFailure(i, 'not a hashtag'); let hashtag = match[1]; hashtag = removeOrphanedBrackets(hashtag); diff --git a/test/mfm.ts b/test/mfm.ts index 8098102e92..89b414eba8 100644 --- a/test/mfm.ts +++ b/test/mfm.ts @@ -562,6 +562,14 @@ describe('MFM', () => { ]); }); + it('ignore 】', () => { + const tokens = parse('#foo】'); + assert.deepStrictEqual(tokens, [ + leaf('hashtag', { hashtag: 'foo' }), + text('】'), + ]); + }); + it('allow including number', () => { const tokens = parse('#foo123'); assert.deepStrictEqual(tokens, [ -- cgit v1.3.1-freya From 55e97864bd86eaec56b43eff238a40f684dcc109 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Thu, 18 Apr 2019 00:53:00 +0900 Subject: Fix: v11で未認知ユーザーからActivityが飛んできた場合に処理できない (#4733) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix: inboxに未知のユーザーが来ると処理できない * こうかな --- src/queue/processors/inbox.ts | 64 ++++++++++++------------------------------- 1 file changed, 18 insertions(+), 46 deletions(-) (limited to 'src') diff --git a/src/queue/processors/inbox.ts b/src/queue/processors/inbox.ts index 05fed0566d..9b28f93a3c 100644 --- a/src/queue/processors/inbox.ts +++ b/src/queue/processors/inbox.ts @@ -35,37 +35,8 @@ export default async (job: Bull.Job): Promise => { let key: UserPublickey; if (keyIdLower.startsWith('acct:')) { - const acct = parseAcct(keyIdLower.slice('acct:'.length)); - const host = toPunyNullable(acct.host); - const username = toPuny(acct.username); - - if (host === null) { - logger.warn(`request was made by local user: @${username}`); - return; - } - - // アクティビティ内のホストの検証 - try { - ValidateActivity(activity, host); - } catch (e) { - logger.warn(e.message); - return; - } - - // ブロックしてたら中断 - // TODO: いちいちデータベースにアクセスするのはコスト高そうなのでどっかにキャッシュしておく - const meta = await fetchMeta(); - if (meta.blockedHosts.includes(host)) { - logger.info(`Blocked request: ${host}`); - return; - } - - user = await Users.findOne({ - usernameLower: username.toLowerCase(), - host: host - }) as IRemoteUser; - - key = await UserPublickeys.findOne(user.id).then(ensure); + logger.warn(`Old keyId is no longer supported. ${keyIdLower}`); + return; } else { // アクティビティ内のホストの検証 const host = toPuny(new URL(signature.keyId).hostname); @@ -84,19 +55,29 @@ export default async (job: Bull.Job): Promise => { return; } - key = await UserPublickeys.findOne({ + const _key = await UserPublickeys.findOne({ keyId: signature.keyId - }).then(ensure); + }); + + if (_key) { + // 登録済みユーザー + user = await Users.findOne(_key.userId) as IRemoteUser; + key = _key; + } else { + // 未登録ユーザーの場合はリモート解決 + user = await resolvePerson(activity.actor) as IRemoteUser; + if (user == null) { + throw new Error('failed to resolve user'); + } - user = await Users.findOne(key.userId) as IRemoteUser; + key = await UserPublickeys.findOne(user.id).then(ensure); + } } // Update Person activityの場合は、ここで署名検証/更新処理まで実施して終了 if (activity.type === 'Update') { if (activity.object && validActor.includes(activity.object.type)) { - if (user == null) { - logger.warn('Update activity received, but user not registed.'); - } else if (!httpSignature.verifySignature(signature, key.keyPem)) { + if (!httpSignature.verifySignature(signature, key.keyPem)) { logger.warn('Update activity received, but signature verification failed.'); } else { updatePerson(activity.actor, null, activity.object); @@ -105,15 +86,6 @@ export default async (job: Bull.Job): Promise => { } } - // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する - if (user == null) { - user = await resolvePerson(activity.actor) as IRemoteUser; - } - - if (user == null) { - throw new Error('failed to resolve user'); - } - if (!httpSignature.verifySignature(signature, key.keyPem)) { logger.error('signature verification failed'); return; -- cgit v1.3.1-freya From 54a87b25b333000115352d57a20276809ccef715 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 Apr 2019 00:56:10 +0900 Subject: Remove unused imports --- src/queue/processors/inbox.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/queue/processors/inbox.ts b/src/queue/processors/inbox.ts index 9b28f93a3c..08101f11ec 100644 --- a/src/queue/processors/inbox.ts +++ b/src/queue/processors/inbox.ts @@ -1,6 +1,5 @@ import * as Bull from 'bull'; import * as httpSignature from 'http-signature'; -import parseAcct from '../../misc/acct/parse'; import { IRemoteUser } from '../../models/entities/user'; import perform from '../../remote/activitypub/perform'; import { resolvePerson, updatePerson } from '../../remote/activitypub/models/person'; @@ -12,7 +11,7 @@ import { Instances, Users, UserPublickeys } from '../../models'; import { instanceChart } from '../../services/chart'; import { UserPublickey } from '../../models/entities/user-publickey'; import fetchMeta from '../../misc/fetch-meta'; -import { toPuny, toPunyNullable } from '../../misc/convert-host'; +import { toPuny } from '../../misc/convert-host'; import { validActor } from '../../remote/activitypub/type'; import { ensure } from '../../prelude/ensure'; -- cgit v1.3.1-freya From 9b05b6ef285b2205ae8ab6b6c4c29f24a3a196ee Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 Apr 2019 00:57:06 +0900 Subject: Improve readability --- src/queue/processors/inbox.ts | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/queue/processors/inbox.ts b/src/queue/processors/inbox.ts index 08101f11ec..e657859507 100644 --- a/src/queue/processors/inbox.ts +++ b/src/queue/processors/inbox.ts @@ -36,41 +36,41 @@ export default async (job: Bull.Job): Promise => { if (keyIdLower.startsWith('acct:')) { logger.warn(`Old keyId is no longer supported. ${keyIdLower}`); return; - } else { - // アクティビティ内のホストの検証 - const host = toPuny(new URL(signature.keyId).hostname); - try { - ValidateActivity(activity, host); - } catch (e) { - logger.warn(e.message); - return; - } + } - // ブロックしてたら中断 - // TODO: いちいちデータベースにアクセスするのはコスト高そうなのでどっかにキャッシュしておく - const meta = await fetchMeta(); - if (meta.blockedHosts.includes(host)) { - logger.info(`Blocked request: ${host}`); - return; - } + // アクティビティ内のホストの検証 + const host = toPuny(new URL(signature.keyId).hostname); + try { + ValidateActivity(activity, host); + } catch (e) { + logger.warn(e.message); + return; + } - const _key = await UserPublickeys.findOne({ - keyId: signature.keyId - }); + // ブロックしてたら中断 + // TODO: いちいちデータベースにアクセスするのはコスト高そうなのでどっかにキャッシュしておく + const meta = await fetchMeta(); + if (meta.blockedHosts.includes(host)) { + logger.info(`Blocked request: ${host}`); + return; + } - if (_key) { - // 登録済みユーザー - user = await Users.findOne(_key.userId) as IRemoteUser; - key = _key; - } else { - // 未登録ユーザーの場合はリモート解決 - user = await resolvePerson(activity.actor) as IRemoteUser; - if (user == null) { - throw new Error('failed to resolve user'); - } + const _key = await UserPublickeys.findOne({ + keyId: signature.keyId + }); - key = await UserPublickeys.findOne(user.id).then(ensure); + if (_key) { + // 登録済みユーザー + user = await Users.findOne(_key.userId) as IRemoteUser; + key = _key; + } else { + // 未登録ユーザーの場合はリモート解決 + user = await resolvePerson(activity.actor) as IRemoteUser; + if (user == null) { + throw new Error('failed to resolve user'); } + + key = await UserPublickeys.findOne(user.id).then(ensure); } // Update Person activityの場合は、ここで署名検証/更新処理まで実施して終了 -- cgit v1.3.1-freya From 71813e03ee77233ee0184b54767a1c41c60c2b5c Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 18 Apr 2019 01:05:40 +0900 Subject: Fix bug --- src/models/repositories/note.ts | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/models/repositories/note.ts b/src/models/repositories/note.ts index d684b47e48..1d2ce7a9c9 100644 --- a/src/models/repositories/note.ts +++ b/src/models/repositories/note.ts @@ -182,6 +182,7 @@ export class NoteRepository extends Repository { files: DriveFiles.packMany(note.fileIds), replyId: note.replyId, renoteId: note.renoteId, + mentions: note.mentions.length > 0 ? note.mentions : undefined, uri: note.uri || undefined, ...(opts.detail ? { -- cgit v1.3.1-freya