Commit c23865d9 authored by Dmitry Timoshkov's avatar Dmitry Timoshkov Committed by Alexandre Julliard

crypt32: Add support for CERT_NAME_STR_NO_QUOTING_FLAG to CertNameToStr().

parent 1252426d
......@@ -144,8 +144,8 @@ static inline BOOL is_spaceW(WCHAR c)
return c <= 0x7f && isspace((char)c);
}
static DWORD quote_rdn_value_to_str_w(DWORD dwValueType,
PCERT_RDN_VALUE_BLOB pValue, LPWSTR psz, DWORD csz)
static DWORD quote_rdn_value_to_str_w(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
DWORD dwStrType, LPWSTR psz, DWORD csz)
{
DWORD ret = 0, len, i, strLen;
BOOL needsQuotes = FALSE;
......@@ -165,6 +165,8 @@ static DWORD quote_rdn_value_to_str_w(DWORD dwValueType,
case CERT_RDN_VISIBLE_STRING:
case CERT_RDN_GENERAL_STRING:
len = pValue->cbData;
if (!(dwStrType & CERT_NAME_STR_NO_QUOTING_FLAG))
{
if (pValue->cbData && isspace(pValue->pbData[0]))
needsQuotes = TRUE;
if (pValue->cbData && isspace(pValue->pbData[pValue->cbData - 1]))
......@@ -178,6 +180,7 @@ static DWORD quote_rdn_value_to_str_w(DWORD dwValueType,
}
if (needsQuotes)
len += 2;
}
if (!psz || !csz)
ret = len;
else
......@@ -189,7 +192,8 @@ static DWORD quote_rdn_value_to_str_w(DWORD dwValueType,
for (i = 0; i < pValue->cbData && ptr - psz < csz; ptr++, i++)
{
*ptr = pValue->pbData[i];
if (pValue->pbData[i] == '"' && ptr - psz < csz - 1)
if (!(dwStrType & CERT_NAME_STR_NO_QUOTING_FLAG) &&
pValue->pbData[i] == '"' && ptr - psz < csz - 1)
*(++ptr) = '"';
}
if (needsQuotes && ptr - psz < csz)
......@@ -200,9 +204,11 @@ static DWORD quote_rdn_value_to_str_w(DWORD dwValueType,
case CERT_RDN_BMP_STRING:
case CERT_RDN_UTF8_STRING:
strLen = len = pValue->cbData / sizeof(WCHAR);
if (!(dwStrType & CERT_NAME_STR_NO_QUOTING_FLAG))
{
if (strLen && is_spaceW(((LPCWSTR)pValue->pbData)[0]))
needsQuotes = TRUE;
if (strLen && _spaceW(((LPCWSTR)pValue->pbData)[strLen - 1]))
if (strLen && is_spaceW(((LPCWSTR)pValue->pbData)[strLen - 1]))
needsQuotes = TRUE;
for (i = 0; i < strLen; i++)
{
......@@ -213,6 +219,7 @@ static DWORD quote_rdn_value_to_str_w(DWORD dwValueType,
}
if (needsQuotes)
len += 2;
}
if (!psz || !csz)
ret = len;
else
......@@ -224,7 +231,8 @@ static DWORD quote_rdn_value_to_str_w(DWORD dwValueType,
for (i = 0; i < strLen && ptr - psz < csz; ptr++, i++)
{
*ptr = ((LPCWSTR)pValue->pbData)[i];
if (((LPCWSTR)pValue->pbData)[i] == '"' && ptr - psz < csz - 1)
if (!(dwStrType & CERT_NAME_STR_NO_QUOTING_FLAG) &&
((LPCWSTR)pValue->pbData)[i] == '"' && ptr - psz < csz - 1)
*(++ptr) = '"';
}
if (needsQuotes && ptr - psz < csz)
......@@ -328,8 +336,7 @@ static const WCHAR indent[] = L" ";
DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel,
const CERT_NAME_BLOB *pName, DWORD dwStrType, LPWSTR psz, DWORD csz)
{
static const DWORD unsupportedFlags = CERT_NAME_STR_NO_QUOTING_FLAG |
CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG;
static const DWORD unsupportedFlags = CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG;
DWORD ret = 0, bytes = 0;
BOOL bRet;
CERT_NAME_INFO *info;
......@@ -419,7 +426,7 @@ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel,
}
if (psz && ret + 1 == csz) break;
chars = quote_rdn_value_to_str_w(rdn->rgRDNAttr[j].dwValueType, &rdn->rgRDNAttr[j].Value,
chars = quote_rdn_value_to_str_w(rdn->rgRDNAttr[j].dwValueType, &rdn->rgRDNAttr[j].Value, dwStrType,
psz ? psz + ret : NULL, psz ? csz - ret - 1 : 0);
ret += chars;
if (j < rdn->cRDNAttr - 1)
......
......@@ -1163,7 +1163,6 @@ static void test_quoted_RDN(void)
ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR | CERT_NAME_STR_NO_QUOTING_FLAG, str, ARRAY_SIZE(str));
ok(ret, "CertNameToStr error %08lx\n", GetLastError());
ok(!wcsncmp(str, L"CN=", 3), "got %s\n", debugstr_w(str));
todo_wine_if(i != 0 && i != 13 && i != 14)
ok(!wcscmp(&str[3], test[i].CN), "got %s, expected %s\n", debugstr_w(&str[3]), debugstr_w(test[i].CN));
LocalFree(buf);
......@@ -1217,7 +1216,6 @@ static void test_quoted_RDN(void)
ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR | CERT_NAME_STR_NO_QUOTING_FLAG, str, ARRAY_SIZE(str));
ok(ret, "CertNameToStr error %08lx\n", GetLastError());
ok(!wcsncmp(str, L"CN=", 3), "got %s\n", debugstr_w(str));
todo_wine_if(i != 0 && i != 13 && i != 14)
ok(!wcscmp(&str[3], test[i].CN), "got %s, expected %s\n", debugstr_w(&str[3]), debugstr_w(test[i].CN));
LocalFree(buf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment