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 <hossein@libreoffice.org>
This commit is contained in:
Pragat Pandya
2025-12-29 19:39:46 +01:00
committed by Hossein
parent 9e7f751ef6
commit 89559c8bc7
8 changed files with 75 additions and 70 deletions
+44 -44
View File
@@ -495,42 +495,42 @@ Span XmlReader::handleAttributeValue(
--end; --end;
} }
char const * p = begin; 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, // a single true space character can go into the current span,
// everything else breaks the span // everything else breaks the span
Space space = SPACE_NONE; Space space = Space::None;
while (p != end) { while (p != end) {
switch (*p) { switch (*p) {
case '\x09': case '\x09':
case '\x0A': case '\x0A':
case '\x0D': case '\x0D':
switch (space) { switch (space) {
case SPACE_NONE: case Space::None:
pad_.add(begin, p - begin); pad_.add(begin, p - begin);
pad_.add(" "); pad_.add(" ");
space = SPACE_BREAK; space = Space::Break;
break; break;
case SPACE_SPAN: case Space::Span:
pad_.add(begin, p - begin); pad_.add(begin, p - begin);
space = SPACE_BREAK; space = Space::Break;
break; break;
case SPACE_BREAK: case Space::Break:
break; break;
} }
begin = ++p; begin = ++p;
break; break;
case ' ': case ' ':
switch (space) { switch (space) {
case SPACE_NONE: case Space::None:
++p; ++p;
space = SPACE_SPAN; space = Space::Span;
break; break;
case SPACE_SPAN: case Space::Span:
pad_.add(begin, p - begin); pad_.add(begin, p - begin);
begin = ++p; begin = ++p;
space = SPACE_BREAK; space = Space::Break;
break; break;
case SPACE_BREAK: case Space::Break:
begin = ++p; begin = ++p;
break; break;
} }
@@ -539,11 +539,11 @@ Span XmlReader::handleAttributeValue(
pad_.add(begin, p - begin); pad_.add(begin, p - begin);
p = handleReference(p, end); p = handleReference(p, end);
begin = p; begin = p;
space = SPACE_NONE; space = Space::None;
break; break;
default: default:
++p; ++p;
space = SPACE_NONE; space = Space::None;
break; break;
} }
} }
@@ -800,10 +800,10 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) {
pad_.clear(); pad_.clear();
char const * flowBegin = pos_; char const * flowBegin = pos_;
char const * flowEnd = 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, // a single true space character can go into the current flow,
// everything else breaks the flow // everything else breaks the flow
Space space = SPACE_START; Space space = Space::Start;
for (;;) { for (;;) {
switch (peek()) { switch (peek()) {
case '\0': // i.e., EOF case '\0': // i.e., EOF
@@ -813,39 +813,39 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) {
case '\x0A': case '\x0A':
case '\x0D': case '\x0D':
switch (space) { switch (space) {
case SPACE_START: case Space::Start:
case SPACE_BREAK: case Space::Break:
break; break;
case SPACE_NONE: case Space::None:
case SPACE_SPAN: case Space::Span:
space = SPACE_BREAK; space = Space::Break;
break; break;
} }
++pos_; ++pos_;
break; break;
case ' ': case ' ':
switch (space) { switch (space) {
case SPACE_START: case Space::Start:
case SPACE_BREAK: case Space::Break:
break; break;
case SPACE_NONE: case Space::None:
space = SPACE_SPAN; space = Space::Span;
break; break;
case SPACE_SPAN: case Space::Span:
space = SPACE_BREAK; space = Space::Break;
break; break;
} }
++pos_; ++pos_;
break; break;
case '&': case '&':
switch (space) { switch (space) {
case SPACE_START: case Space::Start:
break; break;
case SPACE_NONE: case Space::None:
case SPACE_SPAN: case Space::Span:
pad_.add(flowBegin, pos_ - flowBegin); pad_.add(flowBegin, pos_ - flowBegin);
break; break;
case SPACE_BREAK: case Space::Break:
pad_.add(flowBegin, flowEnd - flowBegin); pad_.add(flowBegin, flowEnd - flowBegin);
pad_.add(" "); pad_.add(" ");
break; break;
@@ -853,7 +853,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) {
pos_ = handleReference(pos_, end_); pos_ = handleReference(pos_, end_);
flowBegin = pos_; flowBegin = pos_;
flowEnd = pos_; flowEnd = pos_;
space = SPACE_NONE; space = Space::None;
break; break;
case '<': case '<':
++pos_; ++pos_;
@@ -861,7 +861,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) {
case '!': case '!':
++pos_; ++pos_;
if (skipComment()) { if (skipComment()) {
space = SPACE_BREAK; space = Space::Break;
} else { } else {
Span cdata(scanCdataSection()); Span cdata(scanCdataSection());
if (cdata.is()) { if (cdata.is()) {
@@ -869,13 +869,13 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) {
// references; it keeps the code simple), but it might // references; it keeps the code simple), but it might
// arguably be better to normalize it: // arguably be better to normalize it:
switch (space) { switch (space) {
case SPACE_START: case Space::Start:
break; break;
case SPACE_NONE: case Space::None:
case SPACE_SPAN: case Space::Span:
pad_.add(flowBegin, pos_ - flowBegin); pad_.add(flowBegin, pos_ - flowBegin);
break; break;
case SPACE_BREAK: case Space::Break:
pad_.add(flowBegin, flowEnd - flowBegin); pad_.add(flowBegin, flowEnd - flowBegin);
pad_.add(" "); pad_.add(" ");
break; break;
@@ -883,7 +883,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) {
normalizeLineEnds(cdata); normalizeLineEnds(cdata);
flowBegin = pos_; flowBegin = pos_;
flowEnd = pos_; flowEnd = pos_;
space = SPACE_NONE; space = Space::None;
} else { } else {
skipDocumentTypeDeclaration(); skipDocumentTypeDeclaration();
} }
@@ -898,7 +898,7 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) {
case '?': case '?':
++pos_; ++pos_;
skipProcessingInstruction(); skipProcessingInstruction();
space = SPACE_BREAK; space = Space::Break;
break; break;
default: default:
pad_.add(flowBegin, flowEnd - flowBegin); pad_.add(flowBegin, flowEnd - flowBegin);
@@ -909,20 +909,20 @@ XmlReader::Result XmlReader::handleNormalizedText(Span * text) {
break; break;
default: default:
switch (space) { switch (space) {
case SPACE_START: case Space::Start:
flowBegin = pos_; flowBegin = pos_;
break; break;
case SPACE_NONE: case Space::None:
case SPACE_SPAN: case Space::Span:
break; break;
case SPACE_BREAK: case Space::Break:
pad_.add(flowBegin, flowEnd - flowBegin); pad_.add(flowBegin, flowEnd - flowBegin);
pad_.add(" "); pad_.add(" ");
flowBegin = pos_; flowBegin = pos_;
break; break;
} }
flowEnd = ++pos_; flowEnd = ++pos_;
space = SPACE_NONE; space = Space::None;
break; break;
} }
} }
+4 -4
View File
@@ -38,11 +38,11 @@ numericStringToBigInteger(std::u16string_view serialNumber);
// DNs read as strings from XML files may need to be mangled for compatibility // 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 // 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. // from an XCertificate it's "native" already and doesn't need to be mangled.
enum EqualMode enum class EqualMode
{ {
NOCOMPAT, NoCompat,
COMPAT_2ND, Compat2nd,
COMPAT_BOTH CompatBoth
}; };
XSECXMLSEC_DLLPUBLIC bool EqualDistinguishedNames(std::u16string_view rName1, XSECXMLSEC_DLLPUBLIC bool EqualDistinguishedNames(std::u16string_view rName1,
std::u16string_view rName2, EqualMode eMode); std::u16string_view rName2, EqualMode eMode);
+8 -4
View File
@@ -612,13 +612,17 @@ CPPUNIT_TEST_FIXTURE(SigningTest, testDNCompatibility)
static constexpr OUString msDN(u"CN=\"\"\"ABC\"\".\", O=\"Enterprise \"\"ABC\"\"\""_ustr); static constexpr OUString msDN(u"CN=\"\"\"ABC\"\".\", O=\"Enterprise \"\"ABC\"\"\""_ustr);
static constexpr OUString nssDN(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 // this is just the status quo, possibly either NSS or CryptoAPI might change
CPPUNIT_ASSERT(!xmlsecurity::EqualDistinguishedNames(msDN, nssDN, xmlsecurity::NOCOMPAT)); CPPUNIT_ASSERT(
CPPUNIT_ASSERT(!xmlsecurity::EqualDistinguishedNames(nssDN, msDN, xmlsecurity::NOCOMPAT)); !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 // with compat flag it should work, with the string one 2nd and the native one 1st
#ifdef _WIN32 #ifdef _WIN32
CPPUNIT_ASSERT(xmlsecurity::EqualDistinguishedNames(msDN, nssDN, xmlsecurity::COMPAT_2ND)); CPPUNIT_ASSERT(
xmlsecurity::EqualDistinguishedNames(msDN, nssDN, xmlsecurity::EqualMode::Compat2nd));
#else #else
CPPUNIT_ASSERT(xmlsecurity::EqualDistinguishedNames(nssDN, msDN, xmlsecurity::COMPAT_2ND)); CPPUNIT_ASSERT(
xmlsecurity::EqualDistinguishedNames(nssDN, msDN, xmlsecurity::EqualMode::Compat2nd));
#endif #endif
} }
@@ -625,7 +625,7 @@ sal_Bool DocumentDigitalSignatures::isAuthorTrusted(
return std::any_of(aTrustedAuthors.begin(), aTrustedAuthors.end(), return std::any_of(aTrustedAuthors.begin(), aTrustedAuthors.end(),
[this, &xAuthor, &sSerialNum](const SvtSecurityOptions::Certificate& rAuthor) { [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; return false;
if (rAuthor.SerialNumber != sSerialNum) if (rAuthor.SerialNumber != sSerialNum)
return false; return false;
@@ -608,7 +608,7 @@ static auto CheckX509Data(
start = i; // issuer isn't in the list start = i; // issuer isn't in the list
break; 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 if (i == j) // self signed
{ {
@@ -641,7 +641,7 @@ static auto CheckX509Data(
if (chain[i] != j) if (chain[i] != j)
{ {
if (xmlsecurity::EqualDistinguishedNames( 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? if (chain.size() != i + 1) // already found issue?
{ {
+3 -3
View File
@@ -265,7 +265,7 @@ void XSecController::setX509Data(
OUString const serialNumber(xmlsecurity::bigIntegerToNumericString(xCert->getSerialNumber())); OUString const serialNumber(xmlsecurity::bigIntegerToNumericString(xCert->getSerialNumber()));
auto const iter = std::find_if(rX509IssuerSerials.begin(), rX509IssuerSerials.end(), auto const iter = std::find_if(rX509IssuerSerials.begin(), rX509IssuerSerials.end(),
[&](auto const& rX509IssuerSerial) { [&](auto const& rX509IssuerSerial) {
return xmlsecurity::EqualDistinguishedNames(issuerName, rX509IssuerSerial.first, xmlsecurity::COMPAT_2ND) return xmlsecurity::EqualDistinguishedNames(issuerName, rX509IssuerSerial.first, xmlsecurity::EqualMode::Compat2nd)
&& serialNumber == rX509IssuerSerial.second; && serialNumber == rX509IssuerSerial.second;
}); });
if (iter != rX509IssuerSerials.end()) if (iter != rX509IssuerSerials.end())
@@ -412,7 +412,7 @@ void XSecController::setX509CertDigest(
{ {
for (auto & it : rData) 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.X509SerialNumber == rX509SerialNumber)
{ {
it.CertDigest = rCertDigest; it.CertDigest = rCertDigest;
@@ -435,7 +435,7 @@ void XSecController::setX509CertDigest(
{ {
SAL_INFO("xmlsecurity.helper", "cannot parse X509Certificate"); 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) && xmlsecurity::bigIntegerToNumericString(xCert->getSerialNumber()) == rX509SerialNumber)
{ {
it.CertDigest = rCertDigest; it.CertDigest = rCertDigest;
@@ -859,7 +859,7 @@ bool EqualDistinguishedNames(
std::u16string_view const rName1, std::u16string_view const rName2, std::u16string_view const rName1, std::u16string_view const rName2,
EqualMode const eMode) 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 { // handle case where both need to be converted
return true; return true;
} }
@@ -876,7 +876,7 @@ bool EqualDistinguishedNames(
&blob1, &blob2) == TRUE; &blob1, &blob2) == TRUE;
delete[] blob2.pbData; delete[] blob2.pbData;
} }
if (!ret && eMode == COMPAT_2ND) if (!ret && eMode == EqualMode::Compat2nd)
{ {
CERT_NAME_BLOB blob2compat; CERT_NAME_BLOB blob2compat;
if (!EncodeDistinguishedName(CompatDNNSS(OUString(rName2)), blob2compat)) if (!EncodeDistinguishedName(CompatDNNSS(OUString(rName2)), blob2compat))
@@ -502,10 +502,11 @@ namespace xmlsecurity {
static OUString CompatDNCryptoAPI(std::u16string_view rDN) static OUString CompatDNCryptoAPI(std::u16string_view rDN)
{ {
OUStringBuffer buf(rDN.size()); 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) for (size_t i = 0; i < rDN.size(); ++i)
{ {
if (state == DEFAULT) if (state == State::Default)
{ {
buf.append(rDN[i]); buf.append(rDN[i]);
if (rDN[i] == '=') if (rDN[i] == '=')
@@ -518,25 +519,25 @@ static OUString CompatDNCryptoAPI(std::u16string_view rDN)
{ {
buf.append(rDN[i+1]); buf.append(rDN[i+1]);
++i; ++i;
state = INQUOTE; state = State::InQuote;
} }
else else
{ {
state = INVALUE; state = State::InValue;
} }
} }
} }
else if (state == INVALUE) else if (state == State::InValue)
{ {
if (rDN[i] == '+' || rDN[i] == ',' || rDN[i] == ';') if (rDN[i] == '+' || rDN[i] == ',' || rDN[i] == ';')
{ {
state = DEFAULT; state = State::Default;
} }
buf.append(rDN[i]); buf.append(rDN[i]);
} }
else else
{ {
assert(state == INQUOTE); assert(state == State::InQuote);
if (rDN[i] == '"') if (rDN[i] == '"')
{ {
if (rDN.size() != i+1 && rDN[i+1] == '"') if (rDN.size() != i+1 && rDN[i+1] == '"')
@@ -547,7 +548,7 @@ static OUString CompatDNCryptoAPI(std::u16string_view rDN)
else else
{ {
buf.append(rDN[i]); buf.append(rDN[i]);
state = DEFAULT; state = State::Default;
} }
} }
else else
@@ -563,7 +564,7 @@ bool EqualDistinguishedNames(
std::u16string_view const rName1, std::u16string_view const rName2, std::u16string_view const rName1, std::u16string_view const rName2,
EqualMode const eMode) 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 { // handle case where both need to be converted
return true; return true;
} }
@@ -579,7 +580,7 @@ bool EqualDistinguishedNames(
ret = (CERT_CompareName(pName1, pName2) == SECEqual); ret = (CERT_CompareName(pName1, pName2) == SECEqual);
CERT_DestroyName(pName2); CERT_DestroyName(pName2);
} }
if (!ret && eMode == COMPAT_2ND) if (!ret && eMode == EqualMode::Compat2nd)
{ {
CERTName *const pName2Compat(CERT_AsciiToName(OUStringToOString( CERTName *const pName2Compat(CERT_AsciiToName(OUStringToOString(
CompatDNCryptoAPI(rName2), RTL_TEXTENCODING_UTF8).getStr())); CompatDNCryptoAPI(rName2), RTL_TEXTENCODING_UTF8).getStr()));