diff --git a/src/commons/error.rs b/src/commons/error.rs index 959c3db6..e7021c59 100644 --- a/src/commons/error.rs +++ b/src/commons/error.rs @@ -115,7 +115,7 @@ pub enum Error { #[display(fmt = "CA '{}' already has a parent named '{}'", _0, _1)] CaParentDuplicate(Handle, ParentHandle), - #[display(fmt = "CA '{}' does not have parent named '{}'", _0, _1)] + #[display(fmt = "CA '{}' does not have a parent named '{}'", _0, _1)] CaParentUnknown(Handle, ParentHandle), #[display(fmt = "CA '{}' got error from parent '{}': {}", _0, _1, _2)] @@ -143,12 +143,15 @@ pub enum Error { #[display(fmt = "CA '{}' already has a child named '{}'", _0, _1)] CaChildDuplicate(Handle, ChildHandle), - #[display(fmt = "CA '{}' does not have child named '{}'", _0, _1)] + #[display(fmt = "CA '{}' does not have a child named '{}'", _0, _1)] CaChildUnknown(Handle, ChildHandle), #[display(fmt = "Child '{}' for CA '{}' MUST have resources specified", _1, _0)] CaChildMustHaveResources(Handle, ChildHandle), + #[display(fmt = "Child '{}' cannot have resources not held by CA '{}'", _1, _0)] + CaChildExtraResources(Handle, ChildHandle), + #[display(fmt = "CA '{}' does not know id certificate for child '{}'", _0, _1)] CaChildUnauthorised(Handle, ChildHandle), @@ -438,6 +441,11 @@ impl Error { .with_ca(ca) .with_child(child) } + Error::CaChildExtraResources(ca, child) => { + ErrorResponse::new("ca-child-resources-extra", &self) + .with_ca(ca) + .with_child(child) + } Error::CaChildUnauthorised(ca, child) => { ErrorResponse::new("ca-child-unauthorised", &self) .with_ca(ca) @@ -734,6 +742,10 @@ mod tests { include_str!("../../test-resources/errors/ca-child-resources-required.json"), Error::CaChildMustHaveResources(ca.clone(), child.clone()), ); + verify( + include_str!("../../test-resources/errors/ca-child-resources-extra.json"), + Error::CaChildExtraResources(ca.clone(), child.clone()), + ); verify( include_str!("../../test-resources/errors/ca-child-unauthorised.json"), Error::CaChildUnauthorised(ca.clone(), child), diff --git a/src/daemon/ca/certauth.rs b/src/daemon/ca/certauth.rs index 01e7d8ad..b19567f1 100644 --- a/src/daemon/ca/certauth.rs +++ b/src/daemon/ca/certauth.rs @@ -667,6 +667,8 @@ impl CertAuth { ) -> KrillResult> { if resources.is_empty() { Err(Error::CaChildMustHaveResources(self.handle.clone(), child)) + } else if !self.all_resources().contains(&resources) { + Err(Error::CaChildExtraResources(self.handle.clone(), child)) } else if self.has_child(&child) { Err(Error::CaChildDuplicate(self.handle.clone(), child)) } else { diff --git a/test-resources/errors/ca-child-resources-extra.json b/test-resources/errors/ca-child-resources-extra.json new file mode 100644 index 00000000..bd1ca33c --- /dev/null +++ b/test-resources/errors/ca-child-resources-extra.json @@ -0,0 +1 @@ +{"label":"ca-child-resources-extra","msg":"Child 'child' cannot have resources not held by CA 'ca'", "args":{"child":"child","ca":"ca"}} \ No newline at end of file diff --git a/test-resources/errors/ca-child-unknown.json b/test-resources/errors/ca-child-unknown.json index 95b3ca96..6effb2fe 100644 --- a/test-resources/errors/ca-child-unknown.json +++ b/test-resources/errors/ca-child-unknown.json @@ -1 +1 @@ -{"label":"ca-child-unknown","msg":"CA 'ca' does not have child named 'child'","args":{"child":"child","ca":"ca"}} \ No newline at end of file +{"label":"ca-child-unknown","msg":"CA 'ca' does not have a child named 'child'","args":{"child":"child","ca":"ca"}} \ No newline at end of file diff --git a/test-resources/errors/ca-parent-unknown.json b/test-resources/errors/ca-parent-unknown.json index e0b475bd..67bef6c2 100644 --- a/test-resources/errors/ca-parent-unknown.json +++ b/test-resources/errors/ca-parent-unknown.json @@ -1 +1 @@ -{"label":"ca-parent-unknown","msg":"CA 'ca' does not have parent named 'parent'","args":{"ca":"ca","parent":"parent"}} \ No newline at end of file +{"label":"ca-parent-unknown","msg":"CA 'ca' does not have a parent named 'parent'","args":{"ca":"ca","parent":"parent"}} \ No newline at end of file