aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/remake/delta.rs5
-rw-r--r--src/state/mod.rs6
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();