xmlreader/source/xmlreader.cxx | 88 +++++----- xmlsecurity/inc/biginteger.hxx | 8 xmlsecurity/qa/unit/signing/signing.cxx | 12 - xmlsecurity/source/component/documentdigitalsignatures.cxx | 2 xmlsecurity/source/helper/xmlsignaturehelper.cxx | 4 xmlsecurity/source/helper/xsecverify.cxx | 6 xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx | 4 xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx | 21 +- 8 files changed, 75 insertions(+), 70 deletions(-)
New commits: commit 89559c8bc7fe8afd9e8d99d6ef8bac5a57bf6e04 Author: Pragat Pandya <[email protected]> AuthorDate: Thu Dec 25 10:59:32 2025 +0530 Commit: Hossein <[email protected]> CommitDate: Mon Dec 29 19:39:46 2025 +0100 tdf#168771 Convert enum to enum class in xmlreader and xmlsecurity Converted plain enums to enum class for better type safety: - xmlreader: Converted two local Space enums to enum class and removed redundant SPACE_ prefix from enum values (NONE, SPAN, BREAK, START) - xmlsecurity: Converted EqualMode enum to enum class - xmlsecurity: Converted local State enum in CompatDNCryptoAPI to enum class Updated all usages across 8 files to use scoped enum syntax. Change-Id: I27fd7280bccad72a43cda3b669b1f0926c34271c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196207 Tested-by: Jenkins Reviewed-by: Hossein <[email protected]> diff --git a/xmlreader/source/xmlreader.cxx b/xmlreader/source/xmlreader.cxx index ac4f9ad3b325..2b16ee207fcf 100644 --- a/xmlreader/source/xmlreader.cxx +++ b/xmlreader/source/xmlreader.cxx @@ -495,42 +495,42 @@ Span XmlReader::handleAttributeValue( --end; } char const * p = begin; - enum Space { SPACE_NONE, SPACE_SPAN, SPACE_BREAK }; + enum class Space { None, Span, Break }; // a single true space character can go into the current span, // everything else breaks the span - Space space = SPACE_NONE; + Space space = Space::None; while (p != end) { switch (*p) { case '\x09': case '\x0A': case '\x0D': switch (space) { - case SPACE_NONE: + case Space::None: pad_.add(begin, p - begin); pad_.add(" "); - space = SPACE_BREAK; + space = Space::Break; break; - case SPACE_SPAN: + case Space::Span: pad_.add(begin, p - begin); - space = SPACE_BREAK; + space = Space::Break; break; - case SPACE_BREAK: + case Space::Break: break; } begin = ++p; break; case ' ': switch (space) { - case SPACE_NONE: + case Space::None: ++p; - space = SPACE_SPAN; + space = Space::Span; break; - case SPACE_SPAN: + case Space::Span: pad_.add(begin, p - begin); begin = ++p; - space = SPACE_BREAK; + space = Space::Break; break; - case SPACE_BREAK: + case Space::Break: begin = ++p; break; } @@ -539,11 +539,11 @@ Span XmlReader::handleAttributeValue( pad_.add(begin, p - begin); p = handleReference(p, end); begin = p; - space = SPACE_NONE; + space = Space::None; break; default: ++p; - space = SPACE_NONE; + space = Space::None; break; } } @@ -800,10 +800,10 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) { pad_.clear(); char const * flowBegin = pos_; char const * flowEnd = pos_; - enum Space { SPACE_START, SPACE_NONE, SPACE_SPAN, SPACE_BREAK }; + enum class Space { Start, None, Span, Break }; // a single true space character can go into the current flow, // everything else breaks the flow - Space space = SPACE_START; + Space space = Space::Start; for (;;) { switch (peek()) { case ' @@ -813,39 +813,39 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) { case '\x0A': case '\x0D': switch (space) { - case SPACE_START: - case SPACE_BREAK: + case Space::Start: + case Space::Break: break; - case SPACE_NONE: - case SPACE_SPAN: - space = SPACE_BREAK; + case Space::None: + case Space::Span: + space = Space::Break; break; } ++pos_; break; case ' ': switch (space) { - case SPACE_START: - case SPACE_BREAK: + case Space::Start: + case Space::Break: break; - case SPACE_NONE: - space = SPACE_SPAN; + case Space::None: + space = Space::Span; break; - case SPACE_SPAN: - space = SPACE_BREAK; + case Space::Span: + space = Space::Break; break; } ++pos_; break; case '&': switch (space) { - case SPACE_START: + case Space::Start: break; - case SPACE_NONE: - case SPACE_SPAN: + case Space::None: + case Space::Span: pad_.add(flowBegin, pos_ - flowBegin); break; - case SPACE_BREAK: + case Space::Break: pad_.add(flowBegin, flowEnd - flowBegin); pad_.add(" "); break; @@ -853,7 +853,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) { pos_ = handleReference(pos_, end_); flowBegin = pos_; flowEnd = pos_; - space = SPACE_NONE; + space = Space::None; break; case '<': ++pos_; @@ -861,7 +861,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) { case '!': ++pos_; if (skipComment()) { - space = SPACE_BREAK; + space = Space::Break; } else { Span cdata(scanCdataSection()); if (cdata.is()) { @@ -869,13 +869,13 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) { // references; it keeps the code simple), but it might // arguably be better to normalize it: switch (space) { - case SPACE_START: + case Space::Start: break; - case SPACE_NONE: - case SPACE_SPAN: + case Space::None: + case Space::Span: pad_.add(flowBegin, pos_ - flowBegin); break; - case SPACE_BREAK: + case Space::Break: pad_.add(flowBegin, flowEnd - flowBegin); pad_.add(" "); break; @@ -883,7 +883,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) { normalizeLineEnds(cdata); flowBegin = pos_; flowEnd = pos_; - space = SPACE_NONE; + space = Space::None; } else { skipDocumentTypeDeclaration(); } @@ -898,7 +898,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) { case '?': ++pos_; skipProcessingInstruction(); - space = SPACE_BREAK; + space = Space::Break; break; default: pad_.add(flowBegin, flowEnd - flowBegin); @@ -909,20 +909,20 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) { break; default: switch (space) { - case SPACE_START: + case Space::Start: flowBegin = pos_; break; - case SPACE_NONE: - case SPACE_SPAN: + case Space::None: + case Space::Span: break; - case SPACE_BREAK: + case Space::Break: pad_.add(flowBegin, flowEnd - flowBegin); pad_.add(" "); flowBegin = pos_; break; } flowEnd = ++pos_; - space = SPACE_NONE; + space = Space::None; break; } } diff --git a/xmlsecurity/inc/biginteger.hxx b/xmlsecurity/inc/biginteger.hxx index fc99320c7ea2..5a5e599a369c 100644 --- a/xmlsecurity/inc/biginteger.hxx +++ b/xmlsecurity/inc/biginteger.hxx @@ -38,11 +38,11 @@ numericStringToBigInteger(std::u16string_view serialNumber); // DNs read as strings from XML files may need to be mangled for compatibility // as NSS and MS CryptoAPI have different string serialisations; if the DN is // from an XCertificate it's "native" already and doesn't need to be mangled. -enum EqualMode +enum class EqualMode { - NOCOMPAT, - COMPAT_2ND, - COMPAT_BOTH + NoCompat, + Compat2nd, + CompatBoth }; XSECXMLSEC_DLLPUBLIC bool EqualDistinguishedNames(std::u16string_view rName1, std::u16string_view rName2, EqualMode eMode); diff --git a/xmlsecurity/qa/unit/signing/signing.cxx b/xmlsecurity/qa/unit/signing/signing.cxx index 91a0f95b719c..9938780541f7 100644 --- a/xmlsecurity/qa/unit/signing/signing.cxx +++ b/xmlsecurity/qa/unit/signing/signing.cxx @@ -612,13 +612,17 @@ CPPUNIT_TEST_FIXTURE(SigningTest, testDNCompatibility) static constexpr OUString msDN(u"CN=\"\"\"ABC\"\".\", O=\"Enterprise \"\"ABC\"\"\""_ustr); static constexpr OUString nssDN(u"CN=\\"ABC\\".,O=Enterprise \\"ABC\\""_ustr); // this is just the status quo, possibly either NSS or CryptoAPI might change - CPPUNIT_ASSERT(!xmlsecurity::EqualDistinguishedNames(msDN, nssDN, xmlsecurity::NOCOMPAT)); - CPPUNIT_ASSERT(!xmlsecurity::EqualDistinguishedNames(nssDN, msDN, xmlsecurity::NOCOMPAT)); + CPPUNIT_ASSERT( + !xmlsecurity::EqualDistinguishedNames(msDN, nssDN, xmlsecurity::EqualMode::NoCompat)); + CPPUNIT_ASSERT( + !xmlsecurity::EqualDistinguishedNames(nssDN, msDN, xmlsecurity::EqualMode::NoCompat)); // with compat flag it should work, with the string one 2nd and the native one 1st #ifdef _WIN32 - CPPUNIT_ASSERT(xmlsecurity::EqualDistinguishedNames(msDN, nssDN, xmlsecurity::COMPAT_2ND)); + CPPUNIT_ASSERT( + xmlsecurity::EqualDistinguishedNames(msDN, nssDN, xmlsecurity::EqualMode::Compat2nd)); #else - CPPUNIT_ASSERT(xmlsecurity::EqualDistinguishedNames(nssDN, msDN, xmlsecurity::COMPAT_2ND)); + CPPUNIT_ASSERT( + xmlsecurity::EqualDistinguishedNames(nssDN, msDN, xmlsecurity::EqualMode::Compat2nd)); #endif } diff --git a/xmlsecurity/source/component/documentdigitalsignatures.cxx b/xmlsecurity/source/component/documentdigitalsignatures.cxx index 22dc147e6c33..a43cec7dc6bb 100644 --- a/xmlsecurity/source/component/documentdigitalsignatures.cxx +++ b/xmlsecurity/source/component/documentdigitalsignatures.cxx @@ -625,7 +625,7 @@ sal_Bool DocumentDigitalSignatures::isAuthorTrusted( return std::any_of(aTrustedAuthors.begin(), aTrustedAuthors.end(), [this, &xAuthor, &sSerialNum](const SvtSecurityOptions::Certificate& rAuthor) { - if (!xmlsecurity::EqualDistinguishedNames(rAuthor.SubjectName, xAuthor->getIssuerName(), xmlsecurity::NOCOMPAT)) + if (!xmlsecurity::EqualDistinguishedNames(rAuthor.SubjectName, xAuthor->getIssuerName(), xmlsecurity::EqualMode::NoCompat)) return false; if (rAuthor.SerialNumber != sSerialNum) return false; diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx b/xmlsecurity/source/helper/xmlsignaturehelper.cxx index 1510af12a83a..929de6773a06 100644 --- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx +++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx @@ -608,7 +608,7 @@ static auto CheckX509Data( start = i; // issuer isn't in the list break; } - if (xmlsecurity::EqualDistinguishedNames(certs[i]->getIssuerName(), certs[j]->getSubjectName(), xmlsecurity::NOCOMPAT)) + if (xmlsecurity::EqualDistinguishedNames(certs[i]->getIssuerName(), certs[j]->getSubjectName(), xmlsecurity::EqualMode::NoCompat)) { if (i == j) // self signed { @@ -641,7 +641,7 @@ static auto CheckX509Data( if (chain[i] != j) { if (xmlsecurity::EqualDistinguishedNames( - certs[chain[i]]->getSubjectName(), certs[j]->getIssuerName(), xmlsecurity::NOCOMPAT)) + certs[chain[i]]->getSubjectName(), certs[j]->getIssuerName(), xmlsecurity::EqualMode::NoCompat)) { if (chain.size() != i + 1) // already found issue? { diff --git a/xmlsecurity/source/helper/xsecverify.cxx b/xmlsecurity/source/helper/xsecverify.cxx index 055b7aad3a0b..c191cddb318d 100644 --- a/xmlsecurity/source/helper/xsecverify.cxx +++ b/xmlsecurity/source/helper/xsecverify.cxx @@ -265,7 +265,7 @@ void XSecController::setX509Data( OUString const serialNumber(xmlsecurity::bigIntegerToNumericString(xCert->getSerialNumber())); auto const iter = std::find_if(rX509IssuerSerials.begin(), rX509IssuerSerials.end(), [&](auto const& rX509IssuerSerial) { - return xmlsecurity::EqualDistinguishedNames(issuerName, rX509IssuerSerial.first, xmlsecurity::COMPAT_2ND) + return xmlsecurity::EqualDistinguishedNames(issuerName, rX509IssuerSerial.first, xmlsecurity::EqualMode::Compat2nd) && serialNumber == rX509IssuerSerial.second; }); if (iter != rX509IssuerSerials.end()) @@ -412,7 +412,7 @@ void XSecController::setX509CertDigest( { for (auto & it : rData) { - if (xmlsecurity::EqualDistinguishedNames(it.X509IssuerName, rX509IssuerName, xmlsecurity::COMPAT_BOTH) + if (xmlsecurity::EqualDistinguishedNames(it.X509IssuerName, rX509IssuerName, xmlsecurity::EqualMode::CompatBoth) && it.X509SerialNumber == rX509SerialNumber) { it.CertDigest = rCertDigest; @@ -435,7 +435,7 @@ void XSecController::setX509CertDigest( { SAL_INFO("xmlsecurity.helper", "cannot parse X509Certificate"); } - else if (xmlsecurity::EqualDistinguishedNames(xCert->getIssuerName(), rX509IssuerName, xmlsecurity::COMPAT_2ND) + else if (xmlsecurity::EqualDistinguishedNames(xCert->getIssuerName(), rX509IssuerName, xmlsecurity::EqualMode::Compat2nd) && xmlsecurity::bigIntegerToNumericString(xCert->getSerialNumber()) == rX509SerialNumber) { it.CertDigest = rCertDigest; diff --git a/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx b/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx index ab2ca947fda9..01fcb90a2635 100644 --- a/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx +++ b/xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx @@ -859,7 +859,7 @@ bool EqualDistinguishedNames( std::u16string_view const rName1, std::u16string_view const rName2, EqualMode const eMode) { - if (eMode == COMPAT_BOTH && !rName1.empty() && rName1 == rName2) + if (eMode == EqualMode::CompatBoth && !rName1.empty() && rName1 == rName2) { // handle case where both need to be converted return true; } @@ -876,7 +876,7 @@ bool EqualDistinguishedNames( &blob1, &blob2) == TRUE; delete[] blob2.pbData; } - if (!ret && eMode == COMPAT_2ND) + if (!ret && eMode == EqualMode::Compat2nd) { CERT_NAME_BLOB blob2compat; if (!EncodeDistinguishedName(CompatDNNSS(OUString(rName2)), blob2compat)) diff --git a/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx b/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx index bed7772c5791..7983078012ad 100644 --- a/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx +++ b/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx @@ -502,10 +502,11 @@ namespace xmlsecurity { static OUString CompatDNCryptoAPI(std::u16string_view rDN) { OUStringBuffer buf(rDN.size()); - enum { DEFAULT, INVALUE, INQUOTE } state(DEFAULT); + enum class State { Default, InValue, InQuote }; + State state(State::Default); for (size_t i = 0; i < rDN.size(); ++i) { - if (state == DEFAULT) + if (state == State::Default) { buf.append(rDN[i]); if (rDN[i] == '=') @@ -518,25 +519,25 @@ static OUString CompatDNCryptoAPI(std::u16string_view rDN) { buf.append(rDN[i+1]); ++i; - state = INQUOTE; + state = State::InQuote; } else { - state = INVALUE; + state = State::InValue; } } } - else if (state == INVALUE) + else if (state == State::InValue) { if (rDN[i] == '+' || rDN[i] == ',' || rDN[i] == ';') { - state = DEFAULT; + state = State::Default; } buf.append(rDN[i]); } else { - assert(state == INQUOTE); + assert(state == State::InQuote); if (rDN[i] == '"') { if (rDN.size() != i+1 && rDN[i+1] == '"') @@ -547,7 +548,7 @@ static OUString CompatDNCryptoAPI(std::u16string_view rDN) else { buf.append(rDN[i]); - state = DEFAULT; + state = State::Default; } } else @@ -563,7 +564,7 @@ bool EqualDistinguishedNames( std::u16string_view const rName1, std::u16string_view const rName2, EqualMode const eMode) { - if (eMode == COMPAT_BOTH && !rName1.empty() && rName1 == rName2) + if (eMode == EqualMode::CompatBoth && !rName1.empty() && rName1 == rName2) { // handle case where both need to be converted return true; } @@ -579,7 +580,7 @@ bool EqualDistinguishedNames( ret = (CERT_CompareName(pName1, pName2) == SECEqual); CERT_DestroyName(pName2); } - if (!ret && eMode == COMPAT_2ND) + if (!ret && eMode == EqualMode::Compat2nd) { CERTName *const pName2Compat(CERT_AsciiToName(OUStringToOString( CompatDNCryptoAPI(rName2), RTL_TEXTENCODING_UTF8).getStr()));
