nss: upgrade to release 3.73
[LibreOffice.git] / xmlsecurity / source / helper / xsecparser.cxx
blob326515ba5b392095efa45f909731227fc9445826
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include "xsecparser.hxx"
22 #include <xsecctl.hxx>
23 #include <xmlsignaturehelper.hxx>
25 #include <xmloff/xmlnamespace.hxx>
26 #include <xmloff/xmlimp.hxx>
28 #include <com/sun/star/xml/sax/SAXException.hpp>
29 #include <cppuhelper/exc_hlp.hxx>
30 #include <sal/log.hxx>
32 class XSecParser::Context
34 protected:
35 friend class XSecParser;
36 XSecParser & m_rParser;
37 private:
38 std::unique_ptr<SvXMLNamespaceMap> m_pOldNamespaceMap;
40 public:
41 Context(XSecParser & rParser,
42 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
43 : m_rParser(rParser)
44 , m_pOldNamespaceMap(std::move(pOldNamespaceMap))
48 virtual ~Context() = default;
50 virtual void StartElement(
51 css::uno::Reference<css::xml::sax::XAttributeList> const& /*xAttrs*/)
55 virtual void EndElement()
59 virtual std::unique_ptr<Context> CreateChildContext(
60 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
61 sal_uInt16 const /*nNamespace*/, OUString const& /*rName*/);
63 virtual void Characters(OUString const& /*rChars*/)
68 // it's possible that an unsupported element has an Id attribute and a
69 // ds:Reference digesting it - probably this means XSecController needs to know
70 // about it. (For known elements, the Id attribute is only processed according
71 // to the schema.)
72 class XSecParser::UnknownContext
73 : public XSecParser::Context
75 public:
76 UnknownContext(XSecParser & rParser,
77 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
78 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
82 virtual void StartElement(
83 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
85 m_rParser.HandleIdAttr(xAttrs);
89 auto XSecParser::Context::CreateChildContext(
90 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
91 sal_uInt16 const /*nNamespace*/, OUString const& /*rName*/)
92 -> std::unique_ptr<Context>
94 // default: create new base context
95 return std::make_unique<UnknownContext>(m_rParser, std::move(pOldNamespaceMap));
98 /**
99 note: anything in ds:Object should be trusted *only* if there is a ds:Reference
100 to it so it is signed (exception: the xades:EncapsulatedX509Certificate).
101 ds:SignedInfo precedes all ds:Object.
103 There may be multiple ds:Signature for purpose of counter-signatures
104 but the way XAdES describes these, only the ds:SignatureValue element
105 would be referenced, so requiring a ds:Reference for anything in
106 ds:Object shouldn't cause issues.
108 class XSecParser::ReferencedContextImpl
109 : public XSecParser::Context
111 protected:
112 bool m_isReferenced;
114 public:
115 ReferencedContextImpl(XSecParser & rParser,
116 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
117 bool const isReferenced)
118 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
119 , m_isReferenced(isReferenced)
123 OUString CheckIdAttrReferenced(css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs)
125 OUString const id(m_rParser.HandleIdAttr(xAttrs));
126 if (!id.isEmpty() && m_rParser.m_pXSecController->haveReferenceForId(id))
128 m_isReferenced = true;
130 return id;
134 class XSecParser::LoPGPOwnerContext
135 : public XSecParser::Context
137 private:
138 OUString m_Value;
140 public:
141 LoPGPOwnerContext(XSecParser & rParser,
142 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
143 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
147 virtual void EndElement() override
149 m_rParser.m_pXSecController->setGpgOwner(m_Value);
152 virtual void Characters(OUString const& rChars) override
154 m_Value += rChars;
158 class XSecParser::DsPGPKeyPacketContext
159 : public XSecParser::Context
161 private:
162 OUString m_Value;
164 public:
165 DsPGPKeyPacketContext(XSecParser & rParser,
166 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
167 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
171 virtual void EndElement() override
173 m_rParser.m_pXSecController->setGpgCertificate(m_Value);
176 virtual void Characters(OUString const& rChars) override
178 m_Value += rChars;
182 class XSecParser::DsPGPKeyIDContext
183 : public XSecParser::Context
185 private:
186 OUString m_Value;
188 public:
189 DsPGPKeyIDContext(XSecParser & rParser,
190 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
191 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
195 virtual void EndElement() override
197 m_rParser.m_pXSecController->setGpgKeyID(m_Value);
200 virtual void Characters(OUString const& rChars) override
202 m_Value += rChars;
206 class XSecParser::DsPGPDataContext
207 : public XSecParser::Context
209 public:
210 DsPGPDataContext(XSecParser & rParser,
211 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
212 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
216 virtual void StartElement(
217 css::uno::Reference<css::xml::sax::XAttributeList> const& /*xAttrs*/) override
219 m_rParser.m_pXSecController->switchGpgSignature();
222 virtual std::unique_ptr<Context> CreateChildContext(
223 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
224 sal_uInt16 const nNamespace, OUString const& rName) override
226 if (nNamespace == XML_NAMESPACE_DS && rName == "PGPKeyID")
228 return std::make_unique<DsPGPKeyIDContext>(m_rParser, std::move(pOldNamespaceMap));
230 if (nNamespace == XML_NAMESPACE_DS && rName == "PGPKeyPacket")
232 return std::make_unique<DsPGPKeyPacketContext>(m_rParser, std::move(pOldNamespaceMap));
234 if (nNamespace == XML_NAMESPACE_LO_EXT && rName == "PGPOwner")
236 return std::make_unique<LoPGPOwnerContext>(m_rParser, std::move(pOldNamespaceMap));
238 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
242 class XSecParser::DsX509CertificateContext
243 : public XSecParser::Context
245 private:
246 OUString & m_rValue;
248 public:
249 DsX509CertificateContext(XSecParser & rParser,
250 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
251 OUString & rValue)
252 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
253 , m_rValue(rValue)
257 virtual void Characters(OUString const& rChars) override
259 m_rValue += rChars;
263 class XSecParser::DsX509SerialNumberContext
264 : public XSecParser::Context
266 private:
267 OUString & m_rValue;
269 public:
270 DsX509SerialNumberContext(XSecParser & rParser,
271 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
272 OUString & rValue)
273 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
274 , m_rValue(rValue)
278 virtual void Characters(OUString const& rChars) override
280 m_rValue += rChars;
284 class XSecParser::DsX509IssuerNameContext
285 : public XSecParser::Context
287 private:
288 OUString & m_rValue;
290 public:
291 DsX509IssuerNameContext(XSecParser & rParser,
292 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
293 OUString & rValue)
294 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
295 , m_rValue(rValue)
299 virtual void Characters(OUString const& rChars) override
301 m_rValue += rChars;
305 class XSecParser::DsX509IssuerSerialContext
306 : public XSecParser::Context
308 private:
309 OUString & m_rX509IssuerName;
310 OUString & m_rX509SerialNumber;
312 public:
313 DsX509IssuerSerialContext(XSecParser & rParser,
314 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
315 OUString & rIssuerName, OUString & rSerialNumber)
316 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
317 , m_rX509IssuerName(rIssuerName)
318 , m_rX509SerialNumber(rSerialNumber)
322 virtual std::unique_ptr<Context> CreateChildContext(
323 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
324 sal_uInt16 const nNamespace, OUString const& rName) override
326 if (nNamespace == XML_NAMESPACE_DS && rName == "X509IssuerName")
328 return std::make_unique<DsX509IssuerNameContext>(m_rParser, std::move(pOldNamespaceMap), m_rX509IssuerName);
330 if (nNamespace == XML_NAMESPACE_DS && rName == "X509SerialNumber")
332 return std::make_unique<DsX509SerialNumberContext>(m_rParser, std::move(pOldNamespaceMap), m_rX509SerialNumber);
334 // missing: ds:X509SKI, ds:X509SubjectName, ds:X509CRL
335 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
339 /// can't be sure what is supposed to happen here because the spec is clear as mud
340 class XSecParser::DsX509DataContext
341 : public XSecParser::Context
343 private:
344 // sigh... "No ordering is implied by the above constraints."
345 // so store the ball of mud in vectors and try to figure it out later.
346 std::vector<std::pair<OUString, OUString>> m_X509IssuerSerials;
347 std::vector<OUString> m_X509Certificates;
349 public:
350 DsX509DataContext(XSecParser & rParser,
351 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
352 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
356 virtual void EndElement() override
358 m_rParser.m_pXSecController->setX509Data(m_X509IssuerSerials, m_X509Certificates);
361 virtual std::unique_ptr<Context> CreateChildContext(
362 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
363 sal_uInt16 const nNamespace, OUString const& rName) override
365 if (nNamespace == XML_NAMESPACE_DS && rName == "X509IssuerSerial")
367 m_X509IssuerSerials.emplace_back();
368 return std::make_unique<DsX509IssuerSerialContext>(m_rParser, std::move(pOldNamespaceMap), m_X509IssuerSerials.back().first, m_X509IssuerSerials.back().second);
370 if (nNamespace == XML_NAMESPACE_DS && rName == "X509Certificate")
372 m_X509Certificates.emplace_back();
373 return std::make_unique<DsX509CertificateContext>(m_rParser, std::move(pOldNamespaceMap), m_X509Certificates.back());
375 // missing: ds:X509SKI, ds:X509SubjectName, ds:X509CRL
376 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
380 class XSecParser::DsKeyInfoContext
381 : public XSecParser::Context
383 public:
384 DsKeyInfoContext(XSecParser & rParser,
385 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
386 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
390 virtual void StartElement(
391 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
393 m_rParser.HandleIdAttr(xAttrs);
396 virtual std::unique_ptr<Context> CreateChildContext(
397 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
398 sal_uInt16 const nNamespace, OUString const& rName) override
400 if (nNamespace == XML_NAMESPACE_DS && rName == "X509Data")
402 return std::make_unique<DsX509DataContext>(m_rParser, std::move(pOldNamespaceMap));
404 if (nNamespace == XML_NAMESPACE_DS && rName == "PGPData")
406 return std::make_unique<DsPGPDataContext>(m_rParser, std::move(pOldNamespaceMap));
408 // missing: ds:KeyName, ds:KeyValue, ds:RetrievalMethod, ds:SPKIData, ds:MgmtData
409 // (old code would read ds:Transform inside ds:RetrievalMethod but
410 // presumably that was a bug)
411 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
416 class XSecParser::DsSignatureValueContext
417 : public XSecParser::Context
419 private:
420 OUString m_Value;
422 public:
423 DsSignatureValueContext(XSecParser & rParser,
424 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
425 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
429 virtual void StartElement(
430 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
432 m_rParser.HandleIdAttr(xAttrs);
435 virtual void EndElement() override
437 m_rParser.m_pXSecController->setSignatureValue(m_Value);
440 virtual void Characters(OUString const& rChars) override
442 m_Value += rChars;
446 class XSecParser::DsDigestValueContext
447 : public XSecParser::Context
449 private:
450 OUString & m_rValue;
452 public:
453 DsDigestValueContext(XSecParser & rParser,
454 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
455 OUString & rValue)
456 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
457 , m_rValue(rValue)
461 virtual void StartElement(
462 css::uno::Reference<css::xml::sax::XAttributeList> const& /*xAttrs*/) override
464 m_rValue.clear();
467 virtual void Characters(OUString const& rChars) override
469 m_rValue += rChars;
473 class XSecParser::DsDigestMethodContext
474 : public XSecParser::Context
476 private:
477 sal_Int32 & m_rReferenceDigestID;
479 public:
480 DsDigestMethodContext(XSecParser & rParser,
481 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
482 sal_Int32 & rReferenceDigestID)
483 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
484 , m_rReferenceDigestID(rReferenceDigestID)
488 virtual void StartElement(
489 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
491 OUString ouAlgorithm = xAttrs->getValueByName("Algorithm");
493 SAL_WARN_IF( ouAlgorithm.isEmpty(), "xmlsecurity.helper", "no Algorithm in Reference" );
494 if (!ouAlgorithm.isEmpty())
496 SAL_WARN_IF( ouAlgorithm != ALGO_XMLDSIGSHA1
497 && ouAlgorithm != ALGO_XMLDSIGSHA256
498 && ouAlgorithm != ALGO_XMLDSIGSHA512,
499 "xmlsecurity.helper", "Algorithm neither SHA1, SHA256 nor SHA512");
500 if (ouAlgorithm == ALGO_XMLDSIGSHA1)
501 m_rReferenceDigestID = css::xml::crypto::DigestID::SHA1;
502 else if (ouAlgorithm == ALGO_XMLDSIGSHA256)
503 m_rReferenceDigestID = css::xml::crypto::DigestID::SHA256;
504 else if (ouAlgorithm == ALGO_XMLDSIGSHA512)
505 m_rReferenceDigestID = css::xml::crypto::DigestID::SHA512;
506 else
507 m_rReferenceDigestID = 0;
512 class XSecParser::DsTransformContext
513 : public XSecParser::Context
515 private:
516 bool & m_rIsC14N;
518 public:
519 DsTransformContext(XSecParser & rParser,
520 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
521 bool & rIsC14N)
522 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
523 , m_rIsC14N(rIsC14N)
527 virtual void StartElement(
528 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
530 OUString ouAlgorithm = xAttrs->getValueByName("Algorithm");
532 if (ouAlgorithm == ALGO_C14N)
534 * a xml stream
537 m_rIsC14N = true;
542 class XSecParser::DsTransformsContext
543 : public XSecParser::Context
545 private:
546 bool & m_rIsC14N;
548 public:
549 DsTransformsContext(XSecParser & rParser,
550 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
551 bool & rIsC14N)
552 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
553 , m_rIsC14N(rIsC14N)
557 virtual std::unique_ptr<Context> CreateChildContext(
558 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
559 sal_uInt16 const nNamespace, OUString const& rName) override
561 if (nNamespace == XML_NAMESPACE_DS && rName == "Transform")
563 return std::make_unique<DsTransformContext>(m_rParser, std::move(pOldNamespaceMap), m_rIsC14N);
565 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
569 class XSecParser::DsReferenceContext
570 : public XSecParser::Context
572 private:
573 OUString m_URI;
574 OUString m_Type;
575 OUString m_DigestValue;
576 bool m_IsC14N = false;
577 // Relevant for ODF. The digest algorithm selected by the DigestMethod
578 // element's Algorithm attribute. @see css::xml::crypto::DigestID.
579 sal_Int32 m_nReferenceDigestID = css::xml::crypto::DigestID::SHA1;
581 public:
582 DsReferenceContext(XSecParser & rParser,
583 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
584 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
588 virtual void StartElement(
589 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
591 m_rParser.HandleIdAttr(xAttrs);
593 m_URI = xAttrs->getValueByName("URI");
594 SAL_WARN_IF(m_URI.isEmpty(), "xmlsecurity.helper", "URI is empty");
595 // Remember the type of this reference.
596 m_Type = xAttrs->getValueByName("Type");
599 virtual void EndElement() override
601 if (m_URI.startsWith("#"))
604 * remove the first character '#' from the attribute value
606 m_rParser.m_pXSecController->addReference(m_URI.copy(1), m_nReferenceDigestID, m_Type);
608 else
610 if (m_IsC14N) // this is determined by nested ds:Transform
612 m_rParser.m_pXSecController->addStreamReference(m_URI, false, m_nReferenceDigestID);
614 else
616 * it must be an octet stream
619 m_rParser.m_pXSecController->addStreamReference(m_URI, true, m_nReferenceDigestID);
623 m_rParser.m_pXSecController->setDigestValue(m_nReferenceDigestID, m_DigestValue);
626 virtual std::unique_ptr<Context> CreateChildContext(
627 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
628 sal_uInt16 const nNamespace, OUString const& rName) override
630 if (nNamespace == XML_NAMESPACE_DS && rName == "Transforms")
632 return std::make_unique<DsTransformsContext>(m_rParser, std::move(pOldNamespaceMap), m_IsC14N);
634 if (nNamespace == XML_NAMESPACE_DS && rName == "DigestMethod")
636 return std::make_unique<DsDigestMethodContext>(m_rParser, std::move(pOldNamespaceMap), m_nReferenceDigestID);
638 if (nNamespace == XML_NAMESPACE_DS && rName == "DigestValue")
640 return std::make_unique<DsDigestValueContext>(m_rParser, std::move(pOldNamespaceMap), m_DigestValue);
642 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
646 class XSecParser::DsSignatureMethodContext
647 : public XSecParser::Context
649 public:
650 DsSignatureMethodContext(XSecParser & rParser,
651 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
652 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
656 virtual void StartElement(
657 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
659 OUString ouAlgorithm = xAttrs->getValueByName("Algorithm");
660 if (ouAlgorithm == ALGO_ECDSASHA1 || ouAlgorithm == ALGO_ECDSASHA256
661 || ouAlgorithm == ALGO_ECDSASHA512)
663 m_rParser.m_pXSecController->setSignatureMethod(svl::crypto::SignatureMethodAlgorithm::ECDSA);
668 class XSecParser::DsSignedInfoContext
669 : public XSecParser::Context
671 public:
672 DsSignedInfoContext(XSecParser & rParser,
673 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
674 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
678 virtual void StartElement(
679 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
681 m_rParser.HandleIdAttr(xAttrs);
684 virtual void EndElement() override
686 m_rParser.m_pXSecController->setReferenceCount();
689 virtual std::unique_ptr<Context> CreateChildContext(
690 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
691 sal_uInt16 const nNamespace, OUString const& rName) override
693 if (nNamespace == XML_NAMESPACE_DS && rName == "SignatureMethod")
695 return std::make_unique<DsSignatureMethodContext>(m_rParser, std::move(pOldNamespaceMap));
697 if (nNamespace == XML_NAMESPACE_DS && rName == "Reference")
699 return std::make_unique<DsReferenceContext>(m_rParser, std::move(pOldNamespaceMap));
701 // missing: ds:CanonicalizationMethod
702 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
706 class XSecParser::XadesEncapsulatedX509CertificateContext
707 : public XSecParser::Context
709 private:
710 OUString m_Value;
712 public:
713 XadesEncapsulatedX509CertificateContext(XSecParser & rParser,
714 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
715 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
719 virtual void StartElement(
720 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
722 m_rParser.HandleIdAttr(xAttrs);
725 virtual void EndElement() override
727 m_rParser.m_pXSecController->addEncapsulatedX509Certificate(m_Value);
730 virtual void Characters(OUString const& rChars) override
732 m_Value += rChars;
736 class XSecParser::XadesCertificateValuesContext
737 : public XSecParser::Context
739 public:
740 XadesCertificateValuesContext(XSecParser & rParser,
741 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
742 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
746 virtual void StartElement(
747 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
749 m_rParser.HandleIdAttr(xAttrs);
752 virtual std::unique_ptr<Context> CreateChildContext(
753 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
754 sal_uInt16 const nNamespace, OUString const& rName) override
756 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "EncapsulatedX509Certificate")
758 return std::make_unique<XadesEncapsulatedX509CertificateContext>(m_rParser, std::move(pOldNamespaceMap));
760 // missing: xades:OtherCertificate
761 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
765 class XSecParser::XadesUnsignedSignaturePropertiesContext
766 : public XSecParser::Context
768 public:
769 XadesUnsignedSignaturePropertiesContext(XSecParser & rParser,
770 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
771 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
775 virtual void StartElement(
776 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
778 m_rParser.HandleIdAttr(xAttrs);
781 virtual std::unique_ptr<Context> CreateChildContext(
782 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
783 sal_uInt16 const nNamespace, OUString const& rName) override
785 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "CertificateValues")
787 return std::make_unique<XadesCertificateValuesContext>(m_rParser, std::move(pOldNamespaceMap));
789 // missing:
790 // xades:CounterSignature
791 // ^ old code would read a ds:Signature inside it?
792 // xades:SignatureTimeStamp
793 // xades:CompleteCertificateRefs
794 // xades:CompleteRevocationRefs
795 // xades:AttributeCertificateRefs
796 // xades:AttributeRevocationRefs
797 // xades:SigAndRefsTimeStamp
798 // xades:RefsOnlyTimeStamp
799 // xades:RevocationValues
800 // xades:AttrAuthoritiesCertValues
801 // ^ old code: was equivalent to CertificateValues ???
802 // xades:AttributeRevocationValues
803 // xades:ArchiveTimeStamp
804 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
808 class XSecParser::XadesUnsignedPropertiesContext
809 : public XSecParser::Context
811 public:
812 XadesUnsignedPropertiesContext(XSecParser & rParser,
813 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
814 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
818 virtual void StartElement(
819 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
821 m_rParser.HandleIdAttr(xAttrs);
824 virtual std::unique_ptr<Context> CreateChildContext(
825 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
826 sal_uInt16 const nNamespace, OUString const& rName) override
828 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "UnsignedSignatureProperties")
830 return std::make_unique<XadesUnsignedSignaturePropertiesContext>(m_rParser, std::move(pOldNamespaceMap));
832 // missing: xades:UnsignedDataObjectProperties
833 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
837 class XSecParser::LoSignatureLineIdContext
838 : public XSecParser::ReferencedContextImpl
840 private:
841 OUString m_Value;
843 public:
844 LoSignatureLineIdContext(XSecParser & rParser,
845 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
846 bool const isReferenced)
847 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
851 virtual void EndElement() override
853 if (m_isReferenced)
855 m_rParser.m_pXSecController->setSignatureLineId(m_Value);
857 else
859 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SignatureLineId");
863 virtual void Characters(OUString const& rChars) override
865 m_Value += rChars;
869 class XSecParser::LoSignatureLineValidImageContext
870 : public XSecParser::ReferencedContextImpl
872 private:
873 OUString m_Value;
875 public:
876 LoSignatureLineValidImageContext(XSecParser & rParser,
877 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
878 bool const isReferenced)
879 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
883 virtual void EndElement() override
885 if (m_isReferenced)
887 m_rParser.m_pXSecController->setValidSignatureImage(m_Value);
889 else
891 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SignatureLineValidImage");
895 virtual void Characters(OUString const& rChars) override
897 m_Value += rChars;
901 class XSecParser::LoSignatureLineInvalidImageContext
902 : public XSecParser::ReferencedContextImpl
904 private:
905 OUString m_Value;
907 public:
908 LoSignatureLineInvalidImageContext(XSecParser & rParser,
909 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
910 bool const isReferenced)
911 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
915 virtual void EndElement() override
917 if (m_isReferenced)
919 m_rParser.m_pXSecController->setInvalidSignatureImage(m_Value);
921 else
923 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SignatureLineInvalidImage");
927 virtual void Characters(OUString const& rChars) override
929 m_Value += rChars;
933 class XSecParser::LoSignatureLineContext
934 : public XSecParser::ReferencedContextImpl
936 public:
937 LoSignatureLineContext(XSecParser & rParser,
938 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
939 bool const isReferenced)
940 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
944 virtual std::unique_ptr<Context> CreateChildContext(
945 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
946 sal_uInt16 const nNamespace, OUString const& rName) override
948 if (nNamespace == XML_NAMESPACE_LO_EXT && rName == "SignatureLineId")
950 return std::make_unique<LoSignatureLineIdContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
952 if (nNamespace == XML_NAMESPACE_LO_EXT && rName == "SignatureLineValidImage")
954 return std::make_unique<LoSignatureLineValidImageContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
956 if (nNamespace == XML_NAMESPACE_LO_EXT && rName == "SignatureLineInvalidImage")
958 return std::make_unique<LoSignatureLineInvalidImageContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
960 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
964 class XSecParser::XadesCertDigestContext
965 : public XSecParser::Context
967 private:
968 OUString & m_rDigestValue;
969 sal_Int32 & m_rReferenceDigestID;
971 public:
972 XadesCertDigestContext(XSecParser & rParser,
973 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
974 OUString & rDigestValue, sal_Int32 & rReferenceDigestID)
975 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
976 , m_rDigestValue(rDigestValue)
977 , m_rReferenceDigestID(rReferenceDigestID)
981 virtual std::unique_ptr<Context> CreateChildContext(
982 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
983 sal_uInt16 const nNamespace, OUString const& rName) override
985 if (nNamespace == XML_NAMESPACE_DS && rName == "DigestMethod")
987 return std::make_unique<DsDigestMethodContext>(m_rParser, std::move(pOldNamespaceMap), m_rReferenceDigestID);
989 if (nNamespace == XML_NAMESPACE_DS && rName == "DigestValue")
991 return std::make_unique<DsDigestValueContext>(m_rParser, std::move(pOldNamespaceMap), m_rDigestValue);
993 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
997 class XSecParser::XadesCertContext
998 : public XSecParser::ReferencedContextImpl
1000 private:
1001 sal_Int32 m_nReferenceDigestID = css::xml::crypto::DigestID::SHA1;
1002 OUString m_CertDigest;
1003 OUString m_X509IssuerName;
1004 OUString m_X509SerialNumber;
1006 public:
1007 XadesCertContext(XSecParser & rParser,
1008 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1009 bool const isReferenced)
1010 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
1014 virtual void EndElement() override
1016 if (m_isReferenced)
1018 m_rParser.m_pXSecController->setX509CertDigest(m_CertDigest, m_nReferenceDigestID, m_X509IssuerName, m_X509SerialNumber);
1020 else
1022 SAL_INFO("xmlsecurity.helper", "ignoring unsigned xades:Cert");
1026 virtual std::unique_ptr<Context> CreateChildContext(
1027 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1028 sal_uInt16 const nNamespace, OUString const& rName) override
1030 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "CertDigest")
1032 return std::make_unique<XadesCertDigestContext>(m_rParser, std::move(pOldNamespaceMap), m_CertDigest, m_nReferenceDigestID);
1034 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "IssuerSerial")
1036 return std::make_unique<DsX509IssuerSerialContext>(m_rParser, std::move(pOldNamespaceMap), m_X509IssuerName, m_X509SerialNumber);
1038 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1042 class XSecParser::XadesSigningCertificateContext
1043 : public XSecParser::ReferencedContextImpl
1045 public:
1046 XadesSigningCertificateContext(XSecParser & rParser,
1047 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1048 bool const isReferenced)
1049 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
1053 virtual std::unique_ptr<Context> CreateChildContext(
1054 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1055 sal_uInt16 const nNamespace, OUString const& rName) override
1057 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "Cert")
1059 return std::make_unique<XadesCertContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1061 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1065 class XSecParser::XadesSigningTimeContext
1066 : public XSecParser::ReferencedContextImpl
1068 private:
1069 OUString m_Value;
1071 public:
1072 XadesSigningTimeContext(XSecParser & rParser,
1073 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1074 bool const isReferenced)
1075 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
1079 virtual void EndElement() override
1081 if (m_isReferenced)
1083 m_rParser.m_pXSecController->setDate("", m_Value);
1085 else
1087 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SigningTime");
1091 virtual void Characters(OUString const& rChars) override
1093 m_Value += rChars;
1097 class XSecParser::XadesSignedSignaturePropertiesContext
1098 : public XSecParser::ReferencedContextImpl
1100 public:
1101 XadesSignedSignaturePropertiesContext(XSecParser & rParser,
1102 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1103 bool const isReferenced)
1104 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
1108 virtual void StartElement(
1109 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
1111 CheckIdAttrReferenced(xAttrs);
1114 virtual std::unique_ptr<Context> CreateChildContext(
1115 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1116 sal_uInt16 const nNamespace, OUString const& rName) override
1118 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "SigningTime")
1120 return std::make_unique<XadesSigningTimeContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1122 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "SigningCertificate")
1124 return std::make_unique<XadesSigningCertificateContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1126 if (nNamespace == XML_NAMESPACE_LO_EXT && rName == "SignatureLine")
1128 return std::make_unique<LoSignatureLineContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1130 // missing: xades:SignaturePolicyIdentifier, xades:SignatureProductionPlace, xades:SignerRole
1131 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1135 class XSecParser::XadesSignedPropertiesContext
1136 : public XSecParser::ReferencedContextImpl
1138 public:
1139 XadesSignedPropertiesContext(XSecParser & rParser,
1140 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1141 bool const isReferenced)
1142 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
1146 virtual void StartElement(
1147 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
1149 CheckIdAttrReferenced(xAttrs);
1152 virtual std::unique_ptr<Context> CreateChildContext(
1153 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1154 sal_uInt16 const nNamespace, OUString const& rName) override
1156 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "SignedSignatureProperties")
1158 return std::make_unique<XadesSignedSignaturePropertiesContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1160 // missing: xades:SignedDataObjectProperties
1161 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1165 class XSecParser::XadesQualifyingPropertiesContext
1166 : public XSecParser::ReferencedContextImpl
1168 public:
1169 XadesQualifyingPropertiesContext(XSecParser & rParser,
1170 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1171 bool const isReferenced)
1172 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
1176 virtual void StartElement(
1177 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
1179 CheckIdAttrReferenced(xAttrs);
1182 virtual std::unique_ptr<Context> CreateChildContext(
1183 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1184 sal_uInt16 const nNamespace, OUString const& rName) override
1186 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "SignedProperties")
1188 return std::make_unique<XadesSignedPropertiesContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1190 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "UnsignedProperties")
1192 return std::make_unique<XadesUnsignedPropertiesContext>(m_rParser, std::move(pOldNamespaceMap));
1194 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1198 class XSecParser::DcDateContext
1199 : public XSecParser::Context
1201 private:
1202 OUString & m_rValue;
1204 public:
1205 DcDateContext(XSecParser & rParser,
1206 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1207 OUString & rValue)
1208 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
1209 , m_rValue(rValue)
1213 virtual void Characters(OUString const& rChars) override
1215 m_rValue += rChars;
1219 class XSecParser::DcDescriptionContext
1220 : public XSecParser::Context
1222 private:
1223 OUString & m_rValue;
1225 public:
1226 DcDescriptionContext(XSecParser & rParser,
1227 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1228 OUString & rValue)
1229 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
1230 , m_rValue(rValue)
1234 virtual void Characters(OUString const& rChars) override
1236 m_rValue += rChars;
1240 class XSecParser::DsSignaturePropertyContext
1241 : public XSecParser::ReferencedContextImpl
1243 private:
1244 enum class SignatureProperty { Unknown, Date, Description };
1245 SignatureProperty m_Property = SignatureProperty::Unknown;
1246 OUString m_Id;
1247 OUString m_Value;
1249 public:
1250 DsSignaturePropertyContext(XSecParser & rParser,
1251 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1252 bool const isReferenced)
1253 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
1257 virtual void StartElement(
1258 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
1260 m_Id = CheckIdAttrReferenced(xAttrs);
1263 virtual void EndElement() override
1265 if (m_isReferenced)
1267 switch (m_Property)
1269 case SignatureProperty::Unknown:
1270 SAL_INFO("xmlsecurity.helper", "Unknown property in ds:Object ignored");
1271 break;
1272 case SignatureProperty::Date:
1273 m_rParser.m_pXSecController->setDate(m_Id, m_Value);
1274 break;
1275 case SignatureProperty::Description:
1276 m_rParser.m_pXSecController->setDescription(m_Id, m_Value);
1277 break;
1280 else
1282 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SignatureProperty");
1286 virtual std::unique_ptr<Context> CreateChildContext(
1287 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1288 sal_uInt16 const nNamespace, OUString const& rName) override
1290 if (nNamespace == XML_NAMESPACE_DC && rName == "date")
1292 m_Property = SignatureProperty::Date;
1293 return std::make_unique<DcDateContext>(m_rParser, std::move(pOldNamespaceMap), m_Value);
1295 if (nNamespace == XML_NAMESPACE_DC && rName == "description")
1297 m_Property = SignatureProperty::Description;
1298 return std::make_unique<DcDescriptionContext>(m_rParser, std::move(pOldNamespaceMap), m_Value);
1300 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1304 class XSecParser::DsSignaturePropertiesContext
1305 : public XSecParser::ReferencedContextImpl
1307 public:
1308 DsSignaturePropertiesContext(XSecParser & rParser,
1309 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1310 bool const isReferenced)
1311 : ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), isReferenced)
1315 virtual void StartElement(
1316 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
1318 CheckIdAttrReferenced(xAttrs);
1321 virtual std::unique_ptr<Context> CreateChildContext(
1322 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1323 sal_uInt16 const nNamespace, OUString const& rName) override
1325 if (nNamespace == XML_NAMESPACE_DS && rName == "SignatureProperty")
1327 return std::make_unique<DsSignaturePropertyContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1329 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1333 class XSecParser::DsObjectContext
1334 : public XSecParser::ReferencedContextImpl
1336 public:
1337 DsObjectContext(XSecParser & rParser,
1338 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
1339 // init with "false" here - the Signature element can't be referenced by its child
1340 : XSecParser::ReferencedContextImpl(rParser, std::move(pOldNamespaceMap), false)
1344 virtual void StartElement(
1345 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
1347 CheckIdAttrReferenced(xAttrs);
1350 virtual std::unique_ptr<Context> CreateChildContext(
1351 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1352 sal_uInt16 const nNamespace, OUString const& rName) override
1354 if (nNamespace == XML_NAMESPACE_DS && rName == "SignatureProperties")
1356 return std::make_unique<DsSignaturePropertiesContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1358 if (nNamespace == XML_NAMESPACE_XADES132 && rName == "QualifyingProperties")
1360 return std::make_unique<XadesQualifyingPropertiesContext>(m_rParser, std::move(pOldNamespaceMap), m_isReferenced);
1362 // missing: ds:Manifest
1363 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1367 class XSecParser::DsSignatureContext
1368 : public XSecParser::Context
1370 public:
1371 DsSignatureContext(XSecParser & rParser,
1372 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
1373 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
1377 virtual void StartElement(
1378 css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs) override
1380 OUString const ouIdAttr(m_rParser.HandleIdAttr(xAttrs));
1381 m_rParser.m_rXMLSignatureHelper.StartVerifySignatureElement();
1382 m_rParser.m_pXSecController->addSignature();
1383 if (!ouIdAttr.isEmpty())
1385 m_rParser.m_pXSecController->setId( ouIdAttr );
1389 virtual std::unique_ptr<Context> CreateChildContext(
1390 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1391 sal_uInt16 const nNamespace, OUString const& rName) override
1393 if (nNamespace == XML_NAMESPACE_DS && rName == "SignedInfo")
1395 return std::make_unique<DsSignedInfoContext>(m_rParser, std::move(pOldNamespaceMap));
1397 if (nNamespace == XML_NAMESPACE_DS && rName == "SignatureValue")
1399 return std::make_unique<DsSignatureValueContext>(m_rParser, std::move(pOldNamespaceMap));
1401 if (nNamespace == XML_NAMESPACE_DS && rName == "KeyInfo")
1403 return std::make_unique<DsKeyInfoContext>(m_rParser, std::move(pOldNamespaceMap));
1405 if (nNamespace == XML_NAMESPACE_DS && rName == "Object")
1407 return std::make_unique<DsObjectContext>(m_rParser, std::move(pOldNamespaceMap));
1409 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1413 class XSecParser::DsigSignaturesContext
1414 : public XSecParser::Context
1416 public:
1417 DsigSignaturesContext(XSecParser & rParser,
1418 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap)
1419 : XSecParser::Context(rParser, std::move(pOldNamespaceMap))
1423 virtual std::unique_ptr<Context> CreateChildContext(
1424 std::unique_ptr<SvXMLNamespaceMap> pOldNamespaceMap,
1425 sal_uInt16 const nNamespace, OUString const& rName) override
1427 if (nNamespace == XML_NAMESPACE_DS && rName == "Signature")
1429 return std::make_unique<DsSignatureContext>(m_rParser, std::move(pOldNamespaceMap));
1431 return XSecParser::Context::CreateChildContext(std::move(pOldNamespaceMap), nNamespace, rName);
1436 XSecParser::XSecParser(XMLSignatureHelper& rXMLSignatureHelper,
1437 XSecController* pXSecController)
1438 : m_pNamespaceMap(new SvXMLNamespaceMap)
1439 , m_pXSecController(pXSecController)
1440 , m_rXMLSignatureHelper(rXMLSignatureHelper)
1442 using namespace xmloff::token;
1443 m_pNamespaceMap->Add( GetXMLToken(XML_XML), GetXMLToken(XML_N_XML), XML_NAMESPACE_XML );
1444 m_pNamespaceMap->Add( "_dsig_ooo", GetXMLToken(XML_N_DSIG_OOO), XML_NAMESPACE_DSIG_OOO );
1445 m_pNamespaceMap->Add( "_dsig", GetXMLToken(XML_N_DSIG), XML_NAMESPACE_DSIG );
1446 m_pNamespaceMap->Add( "_ds", GetXMLToken(XML_N_DS), XML_NAMESPACE_DS );
1447 m_pNamespaceMap->Add( "_xades132", GetXMLToken(XML_N_XADES132), XML_NAMESPACE_XADES132);
1448 m_pNamespaceMap->Add( "_xades141", GetXMLToken(XML_N_XADES141), XML_NAMESPACE_XADES141);
1449 m_pNamespaceMap->Add( "_dc", GetXMLToken(XML_N_DC), XML_NAMESPACE_DC );
1450 m_pNamespaceMap->Add( "_office_libo",
1451 GetXMLToken(XML_N_LO_EXT), XML_NAMESPACE_LO_EXT);
1454 OUString XSecParser::HandleIdAttr(css::uno::Reference<css::xml::sax::XAttributeList> const& xAttrs)
1456 OUString ouIdAttr = getIdAttr(xAttrs);
1457 if (!ouIdAttr.isEmpty())
1459 m_pXSecController->collectToVerify( ouIdAttr );
1461 return ouIdAttr;
1464 OUString XSecParser::getIdAttr(const css::uno::Reference< css::xml::sax::XAttributeList >& xAttribs )
1466 OUString ouIdAttr = xAttribs->getValueByName("id");
1468 if (ouIdAttr.isEmpty())
1470 ouIdAttr = xAttribs->getValueByName("Id");
1473 return ouIdAttr;
1477 * XDocumentHandler
1479 void SAL_CALL XSecParser::startDocument( )
1481 if (m_xNextHandler.is())
1483 m_xNextHandler->startDocument();
1487 void SAL_CALL XSecParser::endDocument( )
1489 if (m_xNextHandler.is())
1491 m_xNextHandler->endDocument();
1495 void SAL_CALL XSecParser::startElement(
1496 const OUString& rName,
1497 const css::uno::Reference< css::xml::sax::XAttributeList >& xAttribs )
1499 assert(m_pNamespaceMap);
1500 std::unique_ptr<SvXMLNamespaceMap> pRewindMap(
1501 SvXMLImport::processNSAttributes(m_pNamespaceMap, nullptr, xAttribs));
1503 OUString localName;
1504 sal_uInt16 const nPrefix(m_pNamespaceMap->GetKeyByAttrName(rName, &localName));
1506 std::unique_ptr<Context> pContext;
1508 if (m_ContextStack.empty())
1510 if ((nPrefix == XML_NAMESPACE_DSIG || nPrefix == XML_NAMESPACE_DSIG_OOO)
1511 && localName == "document-signatures")
1513 pContext.reset(new DsigSignaturesContext(*this, std::move(pRewindMap)));
1515 else
1517 throw css::xml::sax::SAXException(
1518 "xmlsecurity: unexpected root element", nullptr,
1519 css::uno::Any());
1522 else
1524 pContext = m_ContextStack.top()->CreateChildContext(
1525 std::move(pRewindMap), nPrefix, localName);
1528 m_ContextStack.push(std::move(pContext));
1529 assert(!pRewindMap);
1533 m_ContextStack.top()->StartElement(xAttribs);
1535 if (m_xNextHandler.is())
1537 m_xNextHandler->startElement(rName, xAttribs);
1540 catch (css::uno::Exception& )
1541 {//getCaughtException MUST be the first line in the catch block
1542 css::uno::Any exc = cppu::getCaughtException();
1543 throw css::xml::sax::SAXException(
1544 "xmlsecurity: Exception in XSecParser::startElement",
1545 nullptr, exc);
1547 catch (...)
1549 throw css::xml::sax::SAXException(
1550 "xmlsecurity: unexpected exception in XSecParser::startElement", nullptr,
1551 css::uno::Any());
1555 void SAL_CALL XSecParser::endElement(const OUString& rName)
1557 assert(!m_ContextStack.empty()); // this should be checked by sax parser?
1561 m_ContextStack.top()->EndElement();
1563 if (m_xNextHandler.is())
1565 m_xNextHandler->endElement(rName);
1568 catch (css::uno::Exception& )
1569 {//getCaughtException MUST be the first line in the catch block
1570 css::uno::Any exc = cppu::getCaughtException();
1571 throw css::xml::sax::SAXException(
1572 "xmlsecurity: Exception in XSecParser::endElement",
1573 nullptr, exc);
1575 catch (...)
1577 throw css::xml::sax::SAXException(
1578 "xmlsecurity: unexpected exception in XSecParser::endElement", nullptr,
1579 css::uno::Any());
1582 if (m_ContextStack.top()->m_pOldNamespaceMap)
1584 m_pNamespaceMap = std::move(m_ContextStack.top()->m_pOldNamespaceMap);
1586 m_ContextStack.pop();
1589 void SAL_CALL XSecParser::characters(const OUString& rChars)
1591 assert(!m_ContextStack.empty()); // this should be checked by sax parser?
1592 m_ContextStack.top()->Characters(rChars);
1594 if (m_xNextHandler.is())
1596 m_xNextHandler->characters(rChars);
1600 void SAL_CALL XSecParser::ignorableWhitespace( const OUString& aWhitespaces )
1602 if (m_xNextHandler.is())
1604 m_xNextHandler->ignorableWhitespace( aWhitespaces );
1608 void SAL_CALL XSecParser::processingInstruction( const OUString& aTarget, const OUString& aData )
1610 if (m_xNextHandler.is())
1612 m_xNextHandler->processingInstruction(aTarget, aData);
1616 void SAL_CALL XSecParser::setDocumentLocator( const css::uno::Reference< css::xml::sax::XLocator >& xLocator )
1618 if (m_xNextHandler.is())
1620 m_xNextHandler->setDocumentLocator( xLocator );
1625 * XInitialization
1627 void SAL_CALL XSecParser::initialize(
1628 const css::uno::Sequence< css::uno::Any >& aArguments )
1630 aArguments[0] >>= m_xNextHandler;
1633 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */