summaryrefslogtreecommitdiff
path: root/src/remote/activitypub/kernel
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2019-09-09 22:46:45 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2019-09-09 22:46:45 +0900
commit827c378ac15f52427c6c7eb589fe115891002658 (patch)
treeb61f33bfc0430baf3688a6af659e0c1a6c988731 /src/remote/activitypub/kernel
parentMerge branch 'develop' of https://github.com/syuilo/misskey into develop (diff)
downloadsharkey-827c378ac15f52427c6c7eb589fe115891002658.tar.gz
sharkey-827c378ac15f52427c6c7eb589fe115891002658.tar.bz2
sharkey-827c378ac15f52427c6c7eb589fe115891002658.zip
AP Lock (#5410)
Diffstat (limited to 'src/remote/activitypub/kernel')
-rw-r--r--src/remote/activitypub/kernel/announce/note.ts71
-rw-r--r--src/remote/activitypub/kernel/create/note.ts16
2 files changed, 52 insertions, 35 deletions
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<void> {
- 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();
}
}