OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/x509_user_cert_resource_handler.h" | 5 #include "content/browser/renderer_host/x509_user_cert_resource_handler.h" |
6 | 6 |
7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
8 #include "content/browser/renderer_host/resource_request_info_impl.h" | 8 #include "content/browser/renderer_host/resource_request_info_impl.h" |
9 #include "content/public/browser/content_browser_client.h" | 9 #include "content/public/browser/content_browser_client.h" |
10 #include "content/public/common/resource_response.h" | 10 #include "content/public/common/resource_response.h" |
11 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
12 #include "net/base/mime_sniffer.h" | 12 #include "net/base/mime_sniffer.h" |
13 #include "net/base/mime_util.h" | 13 #include "net/base/mime_util.h" |
14 #include "net/base/x509_certificate.h" | 14 #include "net/base/x509_certificate.h" |
15 #include "net/http/http_response_headers.h" | 15 #include "net/http/http_response_headers.h" |
16 #include "net/url_request/url_request.h" | 16 #include "net/url_request/url_request.h" |
17 #include "net/url_request/url_request_status.h" | 17 #include "net/url_request/url_request_status.h" |
18 | 18 |
19 namespace content { | 19 namespace content { |
20 | 20 |
21 X509UserCertResourceHandler::X509UserCertResourceHandler( | 21 X509UserCertResourceHandler::X509UserCertResourceHandler( |
22 net::URLRequest* request, | 22 net::URLRequest* request, |
23 int render_process_host_id, | 23 int render_process_host_id, |
24 int render_view_id) | 24 int render_view_id) |
25 : request_(request), | 25 : request_(request), |
26 content_length_(0), | 26 content_length_(0), |
27 read_buffer_(NULL), | 27 read_buffer_(NULL), |
28 resource_buffer_(NULL), | 28 resource_buffer_(NULL), |
29 render_process_host_id_(render_process_host_id), | 29 render_process_host_id_(render_process_host_id), |
30 render_view_id_(render_view_id) { | 30 render_view_id_(render_view_id), |
| 31 is_pkcs12_(false) { |
31 } | 32 } |
32 | 33 |
33 X509UserCertResourceHandler::~X509UserCertResourceHandler() { | 34 X509UserCertResourceHandler::~X509UserCertResourceHandler() { |
34 } | 35 } |
35 | 36 |
36 bool X509UserCertResourceHandler::OnUploadProgress(int request_id, | 37 bool X509UserCertResourceHandler::OnUploadProgress(int request_id, |
37 uint64 position, | 38 uint64 position, |
38 uint64 size) { | 39 uint64 size) { |
39 return true; | 40 return true; |
40 } | 41 } |
41 | 42 |
42 bool X509UserCertResourceHandler::OnRequestRedirected(int request_id, | 43 bool X509UserCertResourceHandler::OnRequestRedirected(int request_id, |
43 const GURL& url, | 44 const GURL& url, |
44 ResourceResponse* resp, | 45 ResourceResponse* resp, |
45 bool* defer) { | 46 bool* defer) { |
46 url_ = url; | 47 url_ = url; |
47 return true; | 48 return true; |
48 } | 49 } |
49 | 50 |
50 bool X509UserCertResourceHandler::OnResponseStarted(int request_id, | 51 bool X509UserCertResourceHandler::OnResponseStarted(int request_id, |
51 ResourceResponse* resp, | 52 ResourceResponse* resp, |
52 bool* defer) { | 53 bool* defer) { |
| 54 #if defined(OS_ANDROID) |
| 55 is_pkcs12_ = (resp->head.mime_type == "application/x-pkcs12"); |
| 56 return (is_pkcs12_ || |
| 57 resp->head.mime_type == "application/x-x509-user-cert" || |
| 58 resp->head.mime_type == "application/x-x509-ca-cert"); |
| 59 #else |
53 return (resp->head.mime_type == "application/x-x509-user-cert"); | 60 return (resp->head.mime_type == "application/x-x509-user-cert"); |
| 61 #endif |
54 } | 62 } |
55 | 63 |
56 bool X509UserCertResourceHandler::OnWillStart(int request_id, | 64 bool X509UserCertResourceHandler::OnWillStart(int request_id, |
57 const GURL& url, | 65 const GURL& url, |
58 bool* defer) { | 66 bool* defer) { |
59 return true; | 67 return true; |
60 } | 68 } |
61 | 69 |
62 bool X509UserCertResourceHandler::OnWillRead(int request_id, | 70 bool X509UserCertResourceHandler::OnWillRead(int request_id, |
63 net::IOBuffer** buf, | 71 net::IOBuffer** buf, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 } | 105 } |
98 | 106 |
99 bool X509UserCertResourceHandler::OnResponseCompleted( | 107 bool X509UserCertResourceHandler::OnResponseCompleted( |
100 int request_id, | 108 int request_id, |
101 const net::URLRequestStatus& urs, | 109 const net::URLRequestStatus& urs, |
102 const std::string& sec_info) { | 110 const std::string& sec_info) { |
103 if (urs.status() != net::URLRequestStatus::SUCCESS) | 111 if (urs.status() != net::URLRequestStatus::SUCCESS) |
104 return false; | 112 return false; |
105 | 113 |
106 AssembleResource(); | 114 AssembleResource(); |
| 115 #if defined(OS_ANDROID) |
| 116 if (resource_buffer_ && content_length_ > 0) { |
| 117 std::string cert_data(resource_buffer_->data(), content_length_); |
| 118 content::GetContentClient()->browser()->AddNewCertificateOrKeychainAndroid( |
| 119 request_, cert_data.c_str(), cert_data.length(), is_pkcs12_); |
| 120 } |
| 121 #else // OS_ANDROID |
107 scoped_refptr<net::X509Certificate> cert; | 122 scoped_refptr<net::X509Certificate> cert; |
108 if (resource_buffer_) { | 123 if (resource_buffer_) { |
109 cert = net::X509Certificate::CreateFromBytes(resource_buffer_->data(), | 124 cert = net::X509Certificate::CreateFromBytes(resource_buffer_->data(), |
110 content_length_); | 125 content_length_); |
111 } | 126 } |
112 GetContentClient()->browser()->AddNewCertificate( | 127 GetContentClient()->browser()->AddNewCertificate( |
113 request_, cert, render_process_host_id_, render_view_id_); | 128 request_, cert, render_process_host_id_, render_view_id_); |
| 129 #endif // OS_ANDROID |
114 return true; | 130 return true; |
115 } | 131 } |
116 | 132 |
117 void X509UserCertResourceHandler::AssembleResource() { | 133 void X509UserCertResourceHandler::AssembleResource() { |
118 // 0-length IOBuffers are not allowed. | 134 // 0-length IOBuffers are not allowed. |
119 if (content_length_ == 0) { | 135 if (content_length_ == 0) { |
120 resource_buffer_ = NULL; | 136 resource_buffer_ = NULL; |
121 return; | 137 return; |
122 } | 138 } |
123 | 139 |
124 // Create the new buffer. | 140 // Create the new buffer. |
125 resource_buffer_ = new net::IOBuffer(content_length_); | 141 resource_buffer_ = new net::IOBuffer(content_length_); |
126 | 142 |
127 // Copy the data into it. | 143 // Copy the data into it. |
128 size_t bytes_copied = 0; | 144 size_t bytes_copied = 0; |
129 for (size_t i = 0; i < buffer_.size(); ++i) { | 145 for (size_t i = 0; i < buffer_.size(); ++i) { |
130 net::IOBuffer* data = buffer_[i].first; | 146 net::IOBuffer* data = buffer_[i].first; |
131 size_t data_len = buffer_[i].second; | 147 size_t data_len = buffer_[i].second; |
132 DCHECK(data != NULL); | 148 DCHECK(data != NULL); |
133 DCHECK_LE(bytes_copied + data_len, content_length_); | 149 DCHECK_LE(bytes_copied + data_len, content_length_); |
134 memcpy(resource_buffer_->data() + bytes_copied, data->data(), data_len); | 150 memcpy(resource_buffer_->data() + bytes_copied, data->data(), data_len); |
135 bytes_copied += data_len; | 151 bytes_copied += data_len; |
136 } | 152 } |
137 DCHECK_EQ(content_length_, bytes_copied); | 153 DCHECK_EQ(content_length_, bytes_copied); |
138 } | 154 } |
139 | 155 |
140 } // namespace content | 156 } // namespace content |
OLD | NEW |