From 877ac1fd5eed0f4cf7bfc97358f423bffe0e7604 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Wed, 28 Oct 2026 15:38:32 +0100 Subject: [PATCH] Reject non-page ids in page.duplicate Found while testing crates/engine/src/cmd/page.rs:96 (page.duplicate, `let src = id(p, "id").unwrap_or(s.page()?)`) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/engine/src/cmd/page.rs | 2 +- crates/engine/src/page_target_tests.rs | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/cmd/page.rs b/crates/engine/src/cmd/page.rs index 08e65b0b..dab21122 100644 --- a/crates/engine/src/cmd/page.rs +++ b/crates/engine/src/cmd/page.rs @@ -93,7 +93,7 @@ pub fn specs() -> Vec { ok() }), spec!("page.duplicate", "Duplicate page", "{id?}", true, |s, p| { - let src = id(p, "id").unwrap_or(s.page()?); + let src = page_target(s, "page.duplicate", p)?; let doc = s.doc_mut()?; let name = format!("Copy of {}", doc.get(src)?.name); let np = doc.add_page(&name); diff --git a/crates/engine/src/page_target_tests.rs b/crates/engine/src/page_target_tests.rs index fd88685d..348ffdf3 100644 --- a/crates/engine/src/page_target_tests.rs +++ b/crates/engine/src/page_target_tests.rs @@ -61,3 +61,13 @@ fn page_commands_still_work_on_pages() { assert!(!s.doc().unwrap().contains(second)); assert!(s.execute("page.delete", &json!({"id": first})).is_err(), "the last ordinary page stays"); } + +#[test] +fn page_duplicate_rejects_a_frame() { + let mut s = Session::new(); + let f = id_of(&ex(&mut s, "frame.create", json!({"x": 0, "y": 0, "width": 100, "height": 100}))); + let pages = s.doc().unwrap().pages.clone(); + let err = s.execute("page.duplicate", &json!({"id": f})).expect_err("duplicate refuses a layer"); + assert!(err.to_string().contains("is not a page"), "{err}"); + assert_eq!(s.doc().unwrap().pages, pages, "no page was added"); +}