From 827c378ac15f52427c6c7eb589fe115891002658 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Mon, 9 Sep 2019 22:46:45 +0900 Subject: AP Lock (#5410) --- src/remote/activitypub/kernel/announce/note.ts | 71 ++++++++++++++------------ src/remote/activitypub/kernel/create/note.ts | 16 ++++-- 2 files changed, 52 insertions(+), 35 deletions(-) (limited to 'src/remote/activitypub/kernel') diff --git a/src/remote/activitypub/kernel/announce/note.ts b/src/remote/activitypub/kernel/announce/note.ts index 2a07f50c8a..f0594a57b7 100644 --- a/src/remote/activitypub/kernel/announce/note.ts +++ b/src/remote/activitypub/kernel/announce/note.ts @@ -7,6 +7,7 @@ import { resolvePerson } from '../../models/person'; import { apLogger } from '../../logger'; import { extractDbHost } from '../../../../misc/convert-host'; import { fetchMeta } from '../../../../misc/fetch-meta'; +import { getApLock } from '../../../../misc/app-lock'; const logger = apLogger; @@ -25,47 +26,53 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity: const meta = await fetchMeta(); if (meta.blockedHosts.includes(extractDbHost(uri))) return; - // 既に同じURIを持つものが登録されていないかチェック - const exist = await fetchNote(uri); - if (exist) { - return; - } + const unlock = await getApLock(uri); - // Announce対象をresolve - let renote; try { - renote = await resolveNote(note); - } catch (e) { - // 対象が4xxならスキップ - if (e.statusCode >= 400 && e.statusCode < 500) { - logger.warn(`Ignored announce target ${note.inReplyTo} - ${e.statusCode}`); + // 既に同じURIを持つものが登録されていないかチェック + const exist = await fetchNote(uri); + if (exist) { return; } - logger.warn(`Error in announce target ${note.inReplyTo} - ${e.statusCode || e}`); - throw e; - } - logger.info(`Creating the (Re)Note: ${uri}`); + // Announce対象をresolve + let renote; + try { + renote = await resolveNote(note); + } catch (e) { + // 対象が4xxならスキップ + if (e.statusCode >= 400 && e.statusCode < 500) { + logger.warn(`Ignored announce target ${note.inReplyTo} - ${e.statusCode}`); + return; + } + logger.warn(`Error in announce target ${note.inReplyTo} - ${e.statusCode || e}`); + throw e; + } + + logger.info(`Creating the (Re)Note: ${uri}`); - //#region Visibility - const to = getApIds(activity.to); - const cc = getApIds(activity.cc); + //#region Visibility + const to = getApIds(activity.to); + const cc = getApIds(activity.cc); - const visibility = getVisibility(to, cc, actor); + const visibility = getVisibility(to, cc, actor); - let visibleUsers: User[] = []; - if (visibility == 'specified') { - visibleUsers = await Promise.all(to.map(uri => resolvePerson(uri))); - } - //#endergion + let visibleUsers: User[] = []; + if (visibility == 'specified') { + visibleUsers = await Promise.all(to.map(uri => resolvePerson(uri))); + } + //#endergion - await post(actor, { - createdAt: activity.published ? new Date(activity.published) : null, - renote, - visibility, - visibleUsers, - uri - }); + await post(actor, { + createdAt: activity.published ? new Date(activity.published) : null, + renote, + visibility, + visibleUsers, + uri + }); + } finally { + unlock(); + } } type visibility = 'public' | 'home' | 'followers' | 'specified'; diff --git a/src/remote/activitypub/kernel/create/note.ts b/src/remote/activitypub/kernel/create/note.ts index 70e61bdf1b..a28eaa11fb 100644 --- a/src/remote/activitypub/kernel/create/note.ts +++ b/src/remote/activitypub/kernel/create/note.ts @@ -1,13 +1,23 @@ import Resolver from '../../resolver'; import { IRemoteUser } from '../../../../models/entities/user'; import { createNote, fetchNote } from '../../models/note'; +import { getApId } from '../../type'; +import { getApLock } from '../../../../misc/app-lock'; /** * 投稿作成アクティビティを捌きます */ export default async function(resolver: Resolver, actor: IRemoteUser, note: any, silent = false): Promise { - const exist = await fetchNote(note); - if (exist == null) { - await createNote(note); + const uri = getApId(note); + + const unlock = await getApLock(uri); + + try { + const exist = await fetchNote(note); + if (exist == null) { + await createNote(note); + } + } finally { + unlock(); } } -- cgit v1.2.3-freya