diff options
| -rw-r--r-- | src/remake/delta.rs | 5 | ||||
| -rw-r--r-- | src/state/mod.rs | 6 |
2 files changed, 9 insertions, 2 deletions
diff --git a/src/remake/delta.rs b/src/remake/delta.rs index dd5df4f..a152861 100644 --- a/src/remake/delta.rs +++ b/src/remake/delta.rs @@ -203,7 +203,10 @@ fn judged( epoch: crate::document::replica::Epoch, before: &[ChangeHash], ) -> Result<(), String> { - if !crate::access::policy::of(doc).enforced() { + // By the policy it was written under, as receivers judge it. + let enforced = crate::document::at::At::new(doc, before) + .is_some_and(|at| crate::access::policy::of(&at).enforced()); + if !enforced { return Ok(()); } match doc.get_heads()[..] { diff --git a/src/state/mod.rs b/src/state/mod.rs index ed93fda..441cdaf 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -250,7 +250,11 @@ fn judged_here( replica: &crate::document::replica::Replica, before: &[crate::document::ChangeHash], ) -> Result<(), String> { - if !crate::access::policy::of(&replica.doc).enforced() { + // By the policy it was written under, as receivers judge it: one removing or + // changing the policy is judged too. + let enforced = crate::document::at::At::new(&replica.doc, before) + .is_some_and(|at| crate::access::policy::of(&at).enforced()); + if !enforced { return Ok(()); } let after = replica.doc.get_heads(); |
