From 9dc0d849ecd827b4241e462fed7a94d6d0be5563 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Thu, 18 Sep 2025 12:24:40 -0400 Subject: [PATCH] recurse when preventing quote chains --- packages/backend/src/core/NoteEditService.ts | 12 ++++++++++-- .../backend/src/server/api/endpoints/notes/edit.ts | 6 ++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/core/NoteEditService.ts b/packages/backend/src/core/NoteEditService.ts index 9e8bb8b4fd..f31b267ad8 100644 --- a/packages/backend/src/core/NoteEditService.ts +++ b/packages/backend/src/core/NoteEditService.ts @@ -303,8 +303,16 @@ export class NoteEditService implements OnApplicationShutdown { } if (this.isRenote(data)) { - if (data.renote.id === oldnote.id) { - throw new IdentifiableError('ea93b7c2-3d6c-4e10-946b-00d50b1a75cb', `edit failed for ${oldnote.id}: cannot renote itself`); + // Check for recursion + let renoteId: string | null = data.renote.id; + while (renoteId) { + if (renoteId === oldnote.id) { + throw new IdentifiableError('ea93b7c2-3d6c-4e10-946b-00d50b1a75cb', `edit failed for ${oldnote.id}: cannot renote itself`); + } + + // TODO create something like threadId but for quotes, that way we don't need full recursion + const next = await this.notesRepository.findOne({ where: { id: renoteId }, select: { renoteId: true } }); + renoteId = next?.renoteId ?? null; } switch (data.renote.visibility) { diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 717dab59e1..08d5d0daac 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -362,10 +362,6 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.cannotReRenote); } - if (renote.renoteId === ps.editId) { - throw new ApiError(meta.errors.cannotQuoteaQuoteOfCurrentPost); - } - // Check blocking if (renote.userId !== me.id) { const blockExist = await this.blockingsRepository.exists({ @@ -483,6 +479,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 === 'ea93b7c2-3d6c-4e10-946b-00d50b1a75cb') { + throw new ApiError(meta.errors.cannotQuoteaQuoteOfCurrentPost); } } throw e;