1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
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
35 friend class XSecParser
;
36 XSecParser
& m_rParser
;
38 std::unique_ptr
<SvXMLNamespaceMap
> m_pOldNamespaceMap
;
41 Context(XSecParser
& rParser
,
42 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
)
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
72 class XSecParser::UnknownContext
73 : public XSecParser::Context
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
));
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
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;
134 class XSecParser::LoPGPOwnerContext
135 : public XSecParser::Context
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
158 class XSecParser::DsPGPKeyPacketContext
159 : public XSecParser::Context
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
182 class XSecParser::DsPGPKeyIDContext
183 : public XSecParser::Context
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
206 class XSecParser::DsPGPDataContext
207 : public XSecParser::Context
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
249 DsX509CertificateContext(XSecParser
& rParser
,
250 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
,
252 : XSecParser::Context(rParser
, std::move(pOldNamespaceMap
))
257 virtual void Characters(OUString
const& rChars
) override
263 class XSecParser::DsX509SerialNumberContext
264 : public XSecParser::Context
270 DsX509SerialNumberContext(XSecParser
& rParser
,
271 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
,
273 : XSecParser::Context(rParser
, std::move(pOldNamespaceMap
))
278 virtual void Characters(OUString
const& rChars
) override
284 class XSecParser::DsX509IssuerNameContext
285 : public XSecParser::Context
291 DsX509IssuerNameContext(XSecParser
& rParser
,
292 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
,
294 : XSecParser::Context(rParser
, std::move(pOldNamespaceMap
))
299 virtual void Characters(OUString
const& rChars
) override
305 class XSecParser::DsX509IssuerSerialContext
306 : public XSecParser::Context
309 OUString
& m_rX509IssuerName
;
310 OUString
& m_rX509SerialNumber
;
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
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
;
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
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
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
446 class XSecParser::DsDigestValueContext
447 : public XSecParser::Context
453 DsDigestValueContext(XSecParser
& rParser
,
454 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
,
456 : XSecParser::Context(rParser
, std::move(pOldNamespaceMap
))
461 virtual void StartElement(
462 css::uno::Reference
<css::xml::sax::XAttributeList
> const& /*xAttrs*/) override
467 virtual void Characters(OUString
const& rChars
) override
473 class XSecParser::DsDigestMethodContext
474 : public XSecParser::Context
477 sal_Int32
& m_rReferenceDigestID
;
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
;
507 m_rReferenceDigestID
= 0;
512 class XSecParser::DsTransformContext
513 : public XSecParser::Context
519 DsTransformContext(XSecParser
& rParser
,
520 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
,
522 : XSecParser::Context(rParser
, std::move(pOldNamespaceMap
))
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
)
542 class XSecParser::DsTransformsContext
543 : public XSecParser::Context
549 DsTransformsContext(XSecParser
& rParser
,
550 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
,
552 : XSecParser::Context(rParser
, std::move(pOldNamespaceMap
))
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
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
;
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
);
610 if (m_IsC14N
) // this is determined by nested ds:Transform
612 m_rParser
.m_pXSecController
->addStreamReference(m_URI
, false, m_nReferenceDigestID
);
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
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
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
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
736 class XSecParser::XadesCertificateValuesContext
737 : public XSecParser::Context
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
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
));
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
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
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
855 m_rParser
.m_pXSecController
->setSignatureLineId(m_Value
);
859 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SignatureLineId");
863 virtual void Characters(OUString
const& rChars
) override
869 class XSecParser::LoSignatureLineValidImageContext
870 : public XSecParser::ReferencedContextImpl
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
887 m_rParser
.m_pXSecController
->setValidSignatureImage(m_Value
);
891 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SignatureLineValidImage");
895 virtual void Characters(OUString
const& rChars
) override
901 class XSecParser::LoSignatureLineInvalidImageContext
902 : public XSecParser::ReferencedContextImpl
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
919 m_rParser
.m_pXSecController
->setInvalidSignatureImage(m_Value
);
923 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SignatureLineInvalidImage");
927 virtual void Characters(OUString
const& rChars
) override
933 class XSecParser::LoSignatureLineContext
934 : public XSecParser::ReferencedContextImpl
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
968 OUString
& m_rDigestValue
;
969 sal_Int32
& m_rReferenceDigestID
;
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
1001 sal_Int32 m_nReferenceDigestID
= css::xml::crypto::DigestID::SHA1
;
1002 OUString m_CertDigest
;
1003 OUString m_X509IssuerName
;
1004 OUString m_X509SerialNumber
;
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
1018 m_rParser
.m_pXSecController
->setX509CertDigest(m_CertDigest
, m_nReferenceDigestID
, m_X509IssuerName
, m_X509SerialNumber
);
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
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
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
1083 m_rParser
.m_pXSecController
->setDate("", m_Value
);
1087 SAL_INFO("xmlsecurity.helper", "ignoring unsigned SigningTime");
1091 virtual void Characters(OUString
const& rChars
) override
1097 class XSecParser::XadesSignedSignaturePropertiesContext
1098 : public XSecParser::ReferencedContextImpl
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
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
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
1202 OUString
& m_rValue
;
1205 DcDateContext(XSecParser
& rParser
,
1206 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
,
1208 : XSecParser::Context(rParser
, std::move(pOldNamespaceMap
))
1213 virtual void Characters(OUString
const& rChars
) override
1219 class XSecParser::DcDescriptionContext
1220 : public XSecParser::Context
1223 OUString
& m_rValue
;
1226 DcDescriptionContext(XSecParser
& rParser
,
1227 std::unique_ptr
<SvXMLNamespaceMap
> pOldNamespaceMap
,
1229 : XSecParser::Context(rParser
, std::move(pOldNamespaceMap
))
1234 virtual void Characters(OUString
const& rChars
) override
1240 class XSecParser::DsSignaturePropertyContext
1241 : public XSecParser::ReferencedContextImpl
1244 enum class SignatureProperty
{ Unknown
, Date
, Description
};
1245 SignatureProperty m_Property
= SignatureProperty::Unknown
;
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
1269 case SignatureProperty::Unknown
:
1270 SAL_INFO("xmlsecurity.helper", "Unknown property in ds:Object ignored");
1272 case SignatureProperty::Date
:
1273 m_rParser
.m_pXSecController
->setDate(m_Id
, m_Value
);
1275 case SignatureProperty::Description
:
1276 m_rParser
.m_pXSecController
->setDescription(m_Id
, m_Value
);
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
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
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
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
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
);
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");
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
));
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
)));
1517 throw css::xml::sax::SAXException(
1518 "xmlsecurity: unexpected root element", nullptr,
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",
1549 throw css::xml::sax::SAXException(
1550 "xmlsecurity: unexpected exception in XSecParser::startElement", nullptr,
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",
1577 throw css::xml::sax::SAXException(
1578 "xmlsecurity: unexpected exception in XSecParser::endElement", nullptr,
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
);
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: */