From 74a7f96cc2fc97952cb931970934b07a164fca31 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Thu, 18 Sep 2025 13:07:07 -0400 Subject: [PATCH] prevent remote instances from renoting a boost --- packages/backend/src/core/NoteCreateService.ts | 5 +++++ packages/backend/src/core/NoteEditService.ts | 5 +++++ packages/backend/src/server/api/endpoints/notes/create.ts | 2 ++ packages/backend/src/server/api/endpoints/notes/edit.ts | 4 ++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index ea74d3a84e..a3079d9db9 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -57,6 +57,7 @@ import { IdentifiableError } from '@/misc/identifiable-error.js'; import { LatestNoteService } from '@/core/LatestNoteService.js'; import { CollapsedQueue } from '@/misc/collapsed-queue.js'; import { CacheService } from '@/core/CacheService.js'; +import { isPureRenote } from '@/misc/is-renote.js'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; @@ -284,6 +285,10 @@ export class NoteCreateService implements OnApplicationShutdown { } if (data.renote) { + if (isPureRenote(data.renote)) { + throw new IdentifiableError('fd4cc33e-2a37-48dd-99cc-9b806eb2031a', 'Cannot renote a pure renote (boost)'); + } + switch (data.renote.visibility) { case 'public': // public noteは無条件にrenote可能 diff --git a/packages/backend/src/core/NoteEditService.ts b/packages/backend/src/core/NoteEditService.ts index f31b267ad8..d96a835b8a 100644 --- a/packages/backend/src/core/NoteEditService.ts +++ b/packages/backend/src/core/NoteEditService.ts @@ -52,6 +52,7 @@ import { IdentifiableError } from '@/misc/identifiable-error.js'; import { LatestNoteService } from '@/core/LatestNoteService.js'; import { CollapsedQueue } from '@/misc/collapsed-queue.js'; import { NoteCreateService } from '@/core/NoteCreateService.js'; +import { isPureRenote } from '@/misc/is-renote.js'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention' | 'edited'; @@ -303,6 +304,10 @@ export class NoteEditService implements OnApplicationShutdown { } if (this.isRenote(data)) { + if (isPureRenote(data.renote)) { + throw new IdentifiableError('fd4cc33e-2a37-48dd-99cc-9b806eb2031a', 'Cannot renote a pure renote (boost)'); + } + // Check for recursion let renoteId: string | null = data.renote.id; while (renoteId) { diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts index d6fccd1b84..98bf827d25 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.ts @@ -428,6 +428,8 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.containsTooManyMentions); } else if (e.id === '1c0ea108-d1e3-4e8e-aa3f-4d2487626153') { throw new ApiError(meta.errors.quoteDisabledForUser); + } else if (e.id === 'fd4cc33e-2a37-48dd-99cc-9b806eb2031a') { + throw new ApiError(meta.errors.cannotReRenote); } } throw e; diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 08d5d0daac..8a65e016d5 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -358,8 +358,6 @@ export default class extends Endpoint { // eslint- if (renote == null) { throw new ApiError(meta.errors.noSuchRenoteTarget); - } else if (isRenote(renote) && !isQuote(renote)) { - throw new ApiError(meta.errors.cannotReRenote); } // Check blocking @@ -481,6 +479,8 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.quoteDisabledForUser); } else if (e.id === 'ea93b7c2-3d6c-4e10-946b-00d50b1a75cb') { throw new ApiError(meta.errors.cannotQuoteaQuoteOfCurrentPost); + } else if (e.id === 'fd4cc33e-2a37-48dd-99cc-9b806eb2031a') { + throw new ApiError(meta.errors.cannotReRenote); } } throw e;