blob: ee3df603531113957f2b2d429d11a3d236d9a64b [file] [log] [blame]
[email protected]d6fb67d2010-05-13 18:55:391// Copyright (c) 2010 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]3b073b22009-01-16 03:29:035#include "chrome/browser/ssl/ssl_error_info.h"
initial.commit09911bf2008-07-26 23:55:296
[email protected]4bf41352010-03-08 21:21:367#include "base/utf_string_conversions.h"
initial.commit09911bf2008-07-26 23:55:298#include "chrome/browser/cert_store.h"
initial.commit09911bf2008-07-26 23:55:299#include "chrome/common/time_format.h"
[email protected]34ac8f32009-02-22 23:03:2710#include "googleurl/src/gurl.h"
11#include "grit/chromium_strings.h"
12#include "grit/generated_resources.h"
initial.commit09911bf2008-07-26 23:55:2913#include "net/base/cert_status_flags.h"
14#include "net/base/net_errors.h"
15#include "net/base/ssl_info.h"
[email protected]c051a1b2011-01-21 23:30:1716#include "ui/base/l10n/l10n_util.h"
initial.commit09911bf2008-07-26 23:55:2917
[email protected]42197a22010-12-28 23:29:4218SSLErrorInfo::SSLErrorInfo(const string16& title,
19 const string16& details,
20 const string16& short_description,
21 const std::vector<string16>& extra_info)
initial.commit09911bf2008-07-26 23:55:2922 : title_(title),
23 details_(details),
24 short_description_(short_description),
25 extra_information_(extra_info) {
26}
27
28// static
29SSLErrorInfo SSLErrorInfo::CreateError(ErrorType error_type,
[email protected]8ac1a752008-07-31 19:40:3730 net::X509Certificate* cert,
initial.commit09911bf2008-07-26 23:55:2931 const GURL& request_url) {
[email protected]42197a22010-12-28 23:29:4232 string16 title, details, short_description;
33 std::vector<string16> extra_info;
initial.commit09911bf2008-07-26 23:55:2934 switch (error_type) {
35 case CERT_COMMON_NAME_INVALID: {
[email protected]42197a22010-12-28 23:29:4236 title =
37 l10n_util::GetStringUTF16(IDS_CERT_ERROR_COMMON_NAME_INVALID_TITLE);
initial.commit09911bf2008-07-26 23:55:2938 // If the certificate contains multiple DNS names, we choose the most
39 // representative one -- either the DNS name that's also in the subject
40 // field, or the first one. If this heuristic turns out to be
41 // inadequate, we can consider choosing the DNS name that is the
42 // "closest match" to the host name in the request URL, or listing all
43 // the DNS names with an HTML <ul>.
44 std::vector<std::string> dns_names;
45 cert->GetDNSNames(&dns_names);
46 DCHECK(!dns_names.empty());
47 size_t i = 0;
48 for (; i < dns_names.size(); ++i) {
49 if (dns_names[i] == cert->subject().common_name)
50 break;
51 }
52 if (i == dns_names.size())
53 i = 0;
54 details =
[email protected]42197a22010-12-28 23:29:4255 l10n_util::GetStringFUTF16(IDS_CERT_ERROR_COMMON_NAME_INVALID_DETAILS,
56 UTF8ToUTF16(request_url.host()),
57 UTF8ToUTF16(dns_names[i]),
58 UTF8ToUTF16(request_url.host()));
59 short_description = l10n_util::GetStringUTF16(
60 IDS_CERT_ERROR_COMMON_NAME_INVALID_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:2961 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:4262 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
initial.commit09911bf2008-07-26 23:55:2963 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:4264 l10n_util::GetStringFUTF16(
initial.commit09911bf2008-07-26 23:55:2965 IDS_CERT_ERROR_COMMON_NAME_INVALID_EXTRA_INFO_2,
[email protected]42197a22010-12-28 23:29:4266 UTF8ToUTF16(cert->subject().common_name),
67 UTF8ToUTF16(request_url.host())));
initial.commit09911bf2008-07-26 23:55:2968 break;
69 }
70 case CERT_DATE_INVALID:
71 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:4272 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
initial.commit09911bf2008-07-26 23:55:2973 if (cert->HasExpired()) {
[email protected]42197a22010-12-28 23:29:4274 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXPIRED_TITLE);
75 details = l10n_util::GetStringFUTF16(IDS_CERT_ERROR_EXPIRED_DETAILS,
76 UTF8ToUTF16(request_url.host()),
77 UTF8ToUTF16(request_url.host()));
initial.commit09911bf2008-07-26 23:55:2978 short_description =
[email protected]42197a22010-12-28 23:29:4279 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXPIRED_DESCRIPTION);
80 extra_info.push_back(l10n_util::GetStringUTF16(
81 IDS_CERT_ERROR_EXPIRED_DETAILS_EXTRA_INFO_2));
initial.commit09911bf2008-07-26 23:55:2982 } else {
83 // Then it must be not yet valid. We don't check that it is not yet
84 // valid as there is still a very unlikely chance that the cert might
85 // have become valid since the error occurred.
[email protected]42197a22010-12-28 23:29:4286 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_NOT_YET_VALID_TITLE);
87 details = l10n_util::GetStringFUTF16(
88 IDS_CERT_ERROR_NOT_YET_VALID_DETAILS,
89 UTF8ToUTF16(request_url.host()),
90 UTF8ToUTF16(request_url.host()));
initial.commit09911bf2008-07-26 23:55:2991 short_description =
[email protected]42197a22010-12-28 23:29:4292 l10n_util::GetStringUTF16(IDS_CERT_ERROR_NOT_YET_VALID_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:2993 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:4294 l10n_util::GetStringUTF16(
initial.commit09911bf2008-07-26 23:55:2995 IDS_CERT_ERROR_NOT_YET_VALID_DETAILS_EXTRA_INFO_2));
96 }
97 break;
98 case CERT_AUTHORITY_INVALID:
[email protected]42197a22010-12-28 23:29:4299 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_AUTHORITY_INVALID_TITLE);
100 details = l10n_util::GetStringFUTF16(
101 IDS_CERT_ERROR_AUTHORITY_INVALID_DETAILS,
102 UTF8ToUTF16(request_url.host()));
103 short_description = l10n_util::GetStringUTF16(
104 IDS_CERT_ERROR_AUTHORITY_INVALID_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29105 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42106 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
107 extra_info.push_back(l10n_util::GetStringFUTF16(
108 IDS_CERT_ERROR_AUTHORITY_INVALID_EXTRA_INFO_2,
109 UTF8ToUTF16(request_url.host()),
110 UTF8ToUTF16(request_url.host())));
111 extra_info.push_back(l10n_util::GetStringUTF16(
112 IDS_CERT_ERROR_AUTHORITY_INVALID_EXTRA_INFO_3));
initial.commit09911bf2008-07-26 23:55:29113 break;
114 case CERT_CONTAINS_ERRORS:
[email protected]42197a22010-12-28 23:29:42115 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_CONTAINS_ERRORS_TITLE);
116 details = l10n_util::GetStringFUTF16(
117 IDS_CERT_ERROR_CONTAINS_ERRORS_DETAILS,
118 UTF8ToUTF16(request_url.host()));
initial.commit09911bf2008-07-26 23:55:29119 short_description =
[email protected]42197a22010-12-28 23:29:42120 l10n_util::GetStringUTF16(IDS_CERT_ERROR_CONTAINS_ERRORS_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29121 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42122 l10n_util::GetStringFUTF16(IDS_CERT_ERROR_EXTRA_INFO_1,
123 UTF8ToUTF16(request_url.host())));
124 extra_info.push_back(l10n_util::GetStringUTF16(
125 IDS_CERT_ERROR_CONTAINS_ERRORS_EXTRA_INFO_2));
initial.commit09911bf2008-07-26 23:55:29126 break;
127 case CERT_NO_REVOCATION_MECHANISM:
[email protected]42197a22010-12-28 23:29:42128 title = l10n_util::GetStringUTF16(
129 IDS_CERT_ERROR_NO_REVOCATION_MECHANISM_TITLE);
130 details = l10n_util::GetStringUTF16(
131 IDS_CERT_ERROR_NO_REVOCATION_MECHANISM_DETAILS);
132 short_description = l10n_util::GetStringUTF16(
initial.commit09911bf2008-07-26 23:55:29133 IDS_CERT_ERROR_NO_REVOCATION_MECHANISM_DESCRIPTION);
134 break;
135 case CERT_UNABLE_TO_CHECK_REVOCATION:
[email protected]42197a22010-12-28 23:29:42136 title = l10n_util::GetStringUTF16(
137 IDS_CERT_ERROR_UNABLE_TO_CHECK_REVOCATION_TITLE);
138 details = l10n_util::GetStringUTF16(
initial.commit09911bf2008-07-26 23:55:29139 IDS_CERT_ERROR_UNABLE_TO_CHECK_REVOCATION_DETAILS);
[email protected]42197a22010-12-28 23:29:42140 short_description = l10n_util::GetStringUTF16(
initial.commit09911bf2008-07-26 23:55:29141 IDS_CERT_ERROR_UNABLE_TO_CHECK_REVOCATION_DESCRIPTION);
142 break;
143 case CERT_REVOKED:
[email protected]42197a22010-12-28 23:29:42144 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_REVOKED_CERT_TITLE);
145 details = l10n_util::GetStringFUTF16(IDS_CERT_ERROR_REVOKED_CERT_DETAILS,
146 UTF8ToUTF16(request_url.host()));
initial.commit09911bf2008-07-26 23:55:29147 short_description =
[email protected]42197a22010-12-28 23:29:42148 l10n_util::GetStringUTF16(IDS_CERT_ERROR_REVOKED_CERT_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29149 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42150 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
initial.commit09911bf2008-07-26 23:55:29151 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42152 l10n_util::GetStringUTF16(IDS_CERT_ERROR_REVOKED_CERT_EXTRA_INFO_2));
initial.commit09911bf2008-07-26 23:55:29153 break;
154 case CERT_INVALID:
[email protected]42197a22010-12-28 23:29:42155 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_INVALID_CERT_TITLE);
156 details = l10n_util::GetStringUTF16(IDS_CERT_ERROR_INVALID_CERT_DETAILS);
initial.commit09911bf2008-07-26 23:55:29157 short_description =
[email protected]42197a22010-12-28 23:29:42158 l10n_util::GetStringUTF16(IDS_CERT_ERROR_INVALID_CERT_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29159 break;
[email protected]0374b292009-08-14 23:49:19160 case CERT_WEAK_SIGNATURE_ALGORITHM:
[email protected]42197a22010-12-28 23:29:42161 title = l10n_util::GetStringUTF16(
162 IDS_CERT_ERROR_WEAK_SIGNATURE_ALGORITHM_TITLE);
163 details = l10n_util::GetStringFUTF16(
[email protected]0374b292009-08-14 23:49:19164 IDS_CERT_ERROR_WEAK_SIGNATURE_ALGORITHM_DETAILS,
[email protected]42197a22010-12-28 23:29:42165 UTF8ToUTF16(request_url.host()));
166 short_description = l10n_util::GetStringUTF16(
[email protected]0374b292009-08-14 23:49:19167 IDS_CERT_ERROR_WEAK_SIGNATURE_ALGORITHM_DESCRIPTION);
168 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42169 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
[email protected]0374b292009-08-14 23:49:19170 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42171 l10n_util::GetStringUTF16(
[email protected]0374b292009-08-14 23:49:19172 IDS_CERT_ERROR_WEAK_SIGNATURE_ALGORITHM_EXTRA_INFO_2));
173 break;
[email protected]899c3e92010-08-28 15:53:50174 case CERT_NOT_IN_DNS:
[email protected]42197a22010-12-28 23:29:42175 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_NOT_IN_DNS_TITLE);
176 details = l10n_util::GetStringUTF16(IDS_CERT_ERROR_NOT_IN_DNS_DETAILS);
177 short_description = l10n_util::GetStringUTF16(
[email protected]899c3e92010-08-28 15:53:50178 IDS_CERT_ERROR_NOT_IN_DNS_DESCRIPTION);
179 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42180 l10n_util::GetStringUTF16(IDS_CERT_ERROR_NOT_IN_DNS_EXTRA_INFO));
[email protected]899c3e92010-08-28 15:53:50181 break;
initial.commit09911bf2008-07-26 23:55:29182 case UNKNOWN:
[email protected]42197a22010-12-28 23:29:42183 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_UNKNOWN_ERROR_TITLE);
184 details = l10n_util::GetStringUTF16(IDS_CERT_ERROR_UNKNOWN_ERROR_DETAILS);
initial.commit09911bf2008-07-26 23:55:29185 short_description =
[email protected]42197a22010-12-28 23:29:42186 l10n_util::GetStringUTF16(IDS_CERT_ERROR_UNKNOWN_ERROR_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29187 break;
188 default:
189 NOTREACHED();
190 }
191 return SSLErrorInfo(title, details, short_description, extra_info);
192}
193
194SSLErrorInfo::~SSLErrorInfo() {
195}
196
197// static
198SSLErrorInfo::ErrorType SSLErrorInfo::NetErrorToErrorType(int net_error) {
199 switch (net_error) {
200 case net::ERR_CERT_COMMON_NAME_INVALID:
201 return CERT_COMMON_NAME_INVALID;
202 case net::ERR_CERT_DATE_INVALID:
203 return CERT_DATE_INVALID;
204 case net::ERR_CERT_AUTHORITY_INVALID:
205 return CERT_AUTHORITY_INVALID;
206 case net::ERR_CERT_CONTAINS_ERRORS:
207 return CERT_CONTAINS_ERRORS;
208 case net::ERR_CERT_NO_REVOCATION_MECHANISM:
209 return CERT_NO_REVOCATION_MECHANISM;
210 case net::ERR_CERT_UNABLE_TO_CHECK_REVOCATION:
211 return CERT_UNABLE_TO_CHECK_REVOCATION;
212 case net::ERR_CERT_REVOKED:
213 return CERT_REVOKED;
214 case net::ERR_CERT_INVALID:
215 return CERT_INVALID;
[email protected]0374b292009-08-14 23:49:19216 case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
217 return CERT_WEAK_SIGNATURE_ALGORITHM;
[email protected]899c3e92010-08-28 15:53:50218 case net::ERR_CERT_NOT_IN_DNS:
219 return CERT_NOT_IN_DNS;
initial.commit09911bf2008-07-26 23:55:29220 default:
221 NOTREACHED();
222 return UNKNOWN;
223 }
224}
225
226// static
227int SSLErrorInfo::GetErrorsForCertStatus(int cert_id,
228 int cert_status,
229 const GURL& url,
230 std::vector<SSLErrorInfo>* errors) {
231 const int kErrorFlags[] = {
232 net::CERT_STATUS_COMMON_NAME_INVALID,
233 net::CERT_STATUS_DATE_INVALID,
234 net::CERT_STATUS_AUTHORITY_INVALID,
235 net::CERT_STATUS_NO_REVOCATION_MECHANISM,
236 net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
237 net::CERT_STATUS_REVOKED,
[email protected]0374b292009-08-14 23:49:19238 net::CERT_STATUS_INVALID,
239 net::CERT_STATUS_WEAK_SIGNATURE_ALGORITHM
initial.commit09911bf2008-07-26 23:55:29240 };
241
242 const ErrorType kErrorTypes[] = {
243 CERT_COMMON_NAME_INVALID,
244 CERT_DATE_INVALID,
245 CERT_AUTHORITY_INVALID,
246 CERT_NO_REVOCATION_MECHANISM,
247 CERT_UNABLE_TO_CHECK_REVOCATION,
248 CERT_REVOKED,
[email protected]0374b292009-08-14 23:49:19249 CERT_INVALID,
250 CERT_WEAK_SIGNATURE_ALGORITHM
initial.commit09911bf2008-07-26 23:55:29251 };
252 DCHECK(arraysize(kErrorFlags) == arraysize(kErrorTypes));
253
[email protected]8ac1a752008-07-31 19:40:37254 scoped_refptr<net::X509Certificate> cert = NULL;
initial.commit09911bf2008-07-26 23:55:29255 int count = 0;
[email protected]85e0f1f2008-12-17 18:30:28256 for (size_t i = 0; i < arraysize(kErrorFlags); ++i) {
initial.commit09911bf2008-07-26 23:55:29257 if (cert_status & kErrorFlags[i]) {
258 count++;
259 if (!cert.get()) {
[email protected]8e8bb6d2010-12-13 08:18:55260 bool r = CertStore::GetInstance()->RetrieveCert(cert_id, &cert);
initial.commit09911bf2008-07-26 23:55:29261 DCHECK(r);
262 }
263 if (errors)
264 errors->push_back(SSLErrorInfo::CreateError(kErrorTypes[i], cert, url));
265 }
266 }
267 return count;
268}