OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/ssl_errors/error_info.h" | 5 #include "components/ssl_errors/error_info.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/i18n/message_formatter.h" | 9 #include "base/i18n/message_formatter.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 const base::string16& short_description) | 25 const base::string16& short_description) |
26 : details_(details), short_description_(short_description) {} | 26 : details_(details), short_description_(short_description) {} |
27 | 27 |
28 // static | 28 // static |
29 ErrorInfo ErrorInfo::CreateError(ErrorType error_type, | 29 ErrorInfo ErrorInfo::CreateError(ErrorType error_type, |
30 net::X509Certificate* cert, | 30 net::X509Certificate* cert, |
31 const GURL& request_url) { | 31 const GURL& request_url) { |
32 base::string16 details, short_description; | 32 base::string16 details, short_description; |
33 switch (error_type) { | 33 switch (error_type) { |
34 case CERT_COMMON_NAME_INVALID: { | 34 case CERT_COMMON_NAME_INVALID: { |
35 // If the certificate contains multiple DNS names, we choose the most | |
36 // representative one -- either the DNS name that's also in the subject | |
37 // field, or the first one. If this heuristic turns out to be | |
38 // inadequate, we can consider choosing the DNS name that is the | |
39 // "closest match" to the host name in the request URL, or listing all | |
40 // the DNS names with an HTML <ul>. | |
41 std::vector<std::string> dns_names; | 35 std::vector<std::string> dns_names; |
42 cert->GetDNSNames(&dns_names); | 36 cert->GetSubjectAltName(&dns_names, nullptr); |
43 DCHECK(!dns_names.empty()); | 37 |
44 size_t i = 0; | 38 size_t i = 0; |
45 for (; i < dns_names.size(); ++i) { | 39 if (dns_names.empty()) { |
46 if (dns_names[i] == cert->subject().common_name) | 40 // The certificate had no DNS names, display an explanatory string. |
47 break; | 41 // TODO(elawrence): Change the error messsage instead of just the |
| 42 // placeholder string; see https://crbug.com/708268 |
| 43 dns_names.push_back("[missing_subjectAltName]"); |
| 44 } else { |
| 45 // If the certificate contains multiple DNS names, we choose the most |
| 46 // representative one -- either the DNS name that's also in the subject |
| 47 // field, or the first one. If this heuristic turns out to be |
| 48 // inadequate, we can consider choosing the DNS name that is the |
| 49 // "closest match" to the host name in the request URL, or listing all |
| 50 // the DNS names with an HTML <ul>. |
| 51 for (; i < dns_names.size(); ++i) { |
| 52 if (dns_names[i] == cert->subject().common_name) |
| 53 break; |
| 54 } |
| 55 if (i == dns_names.size()) |
| 56 i = 0; |
48 } | 57 } |
49 if (i == dns_names.size()) | 58 |
50 i = 0; | |
51 details = l10n_util::GetStringFUTF16( | 59 details = l10n_util::GetStringFUTF16( |
52 IDS_CERT_ERROR_COMMON_NAME_INVALID_DETAILS, | 60 IDS_CERT_ERROR_COMMON_NAME_INVALID_DETAILS, |
53 UTF8ToUTF16(request_url.host()), | 61 UTF8ToUTF16(request_url.host()), |
54 net::EscapeForHTML(UTF8ToUTF16(dns_names[i]))); | 62 net::EscapeForHTML(UTF8ToUTF16(dns_names[i]))); |
55 short_description = l10n_util::GetStringUTF16( | 63 short_description = l10n_util::GetStringUTF16( |
56 IDS_CERT_ERROR_COMMON_NAME_INVALID_DESCRIPTION); | 64 IDS_CERT_ERROR_COMMON_NAME_INVALID_DESCRIPTION); |
57 break; | 65 break; |
58 } | 66 } |
59 case CERT_DATE_INVALID: | 67 case CERT_DATE_INVALID: |
60 if (cert->HasExpired()) { | 68 if (cert->HasExpired()) { |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 | 260 |
253 for (size_t i = 0; i < arraysize(kErrorFlags); ++i) { | 261 for (size_t i = 0; i < arraysize(kErrorFlags); ++i) { |
254 if ((cert_status & kErrorFlags[i]) && errors) { | 262 if ((cert_status & kErrorFlags[i]) && errors) { |
255 errors->push_back( | 263 errors->push_back( |
256 ErrorInfo::CreateError(kErrorTypes[i], cert.get(), url)); | 264 ErrorInfo::CreateError(kErrorTypes[i], cert.get(), url)); |
257 } | 265 } |
258 } | 266 } |
259 } | 267 } |
260 | 268 |
261 } // namespace ssl_errors | 269 } // namespace ssl_errors |
OLD | NEW |