fix(page-templates): tree marker (#38), embed chrome (#39), embed refresh (#40) #45

Merged
Ghost merged 12 commits from fix/page-template-demo-issues into develop 2026-06-21 01:51:54 +03:00
3 changed files with 10 additions and 0 deletions
Showing only changes of commit 79d096ed7a - Show all commits

View File

@@ -67,6 +67,12 @@ export class PageTemplateController {
throw new NotFoundException('Page not found');
}
if (page.workspaceId !== user.workspaceId) {
// Defense-in-depth: never act on a page outside the caller's workspace.
// Use NotFound (not Forbidden) to avoid leaking cross-workspace existence.
throw new NotFoundException('Page not found');
}
await this.pageAccessService.validateCanEdit(page, user);
const isTemplate =

View File

@@ -317,6 +317,7 @@ export class TransclusionService {
if (toDelete.length > 0) {
await this.pageTemplateReferencesRepo.deleteByReferenceAndSources(
referencePageId,
workspaceId,
toDelete,
trx,
);

View File

@@ -38,12 +38,15 @@ export class PageTemplateReferencesRepo {
async deleteByReferenceAndSources(
referencePageId: string,
workspaceId: string,
sourcePageIds: string[],
trx?: KyselyTransaction,
): Promise<void> {
if (sourcePageIds.length === 0) return;
await dbOrTx(this.db, trx)
.deleteFrom('pageTemplateReferences')
// Defense-in-depth: scope deletes to the caller's workspace.
.where('workspaceId', '=', workspaceId)
.where('referencePageId', '=', referencePageId)
.where('sourcePageId', 'in', sourcePageIds)
.execute();