structured_xades/validation/
ref_name.rs1use super::{ReferenceIdentifier, ReferenceProperty, ResponderIdentifier};
4use crate::{
5 reference::{LexicalSource, VisitError},
6 scalar::{TextValue, TextXml},
7 xml::{Access, AccessError},
8};
9use structured_asn1::ScopedReader;
10use structured_pkix::name::{Name, Selector};
11
12#[derive(Debug)]
14pub enum ReferenceNameError<E, N> {
15 Access(AccessError<E, N>),
17 Xml(E),
19 Index {
21 index: usize,
23 },
24 Content {
26 node: N,
28 },
29 Name {
31 node: N,
34 cause: structured_pkix::Error,
36 },
37}
38
39pub fn matches_reference_name<X: TextXml>(
49 xml: &X,
50 references: &ReferenceProperty<X::Id, X::Document, X::Generation>,
51 index: usize,
52 actual: &Name<'_>,
53 operation: &ScopedReader<'_, '_>,
54) -> Result<Option<bool>, ReferenceNameError<X::Error, X::Id>> {
55 let work = operation.execution();
56 let access = Access::new(xml, references.snapshot(), &work);
57 access
58 .query(references.node(), |_, _, _| Ok(()))
59 .map_err(ReferenceNameError::Access)?;
60 let Some(entry) = references.entries().get(index) else {
61 return Err(ReferenceNameError::Index { index });
62 };
63 let node = match entry.identifier() {
64 ReferenceIdentifier::Crl { issuer, .. } => issuer,
65 ReferenceIdentifier::Ocsp {
66 responder: ResponderIdentifier::Name(node),
67 ..
68 } => node,
69 _ => return Ok(None),
70 };
71 let compared = access
72 .query(node, |xml, snapshot, work| {
73 Ok(xml.with_text(
74 snapshot,
75 node,
76 LexicalSource::SimpleContent,
77 work,
78 |value| {
79 let TextValue::Present(text) = value else {
80 return Err(ReferenceNameError::Content { node });
81 };
82 let selector = Selector::parse_in(text, operation)
83 .map_err(|cause| ReferenceNameError::Name { node, cause })?;
84 selector
85 .matches_name_in(actual, operation)
86 .map(Some)
87 .map_err(|cause| ReferenceNameError::Name { node, cause })
88 },
89 ))
90 })
91 .map_err(ReferenceNameError::Access)?;
92 compared.map_err(|cause| match cause {
93 VisitError::Processing(cause) => ReferenceNameError::Xml(cause),
94 VisitError::Visitor(cause) => cause,
95 })
96}