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:
@@ -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 '\0': // i.e., EOF
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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?
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()));
|
||||
|
||||
Reference in New Issue
Block a user