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 // Parse the data returned from the SafeBrowsing v2.1 protocol response. | 5 // Parse the data returned from the SafeBrowsing v2.1 protocol response. |
6 | 6 |
7 // TODOv3(shess): Review these changes carefully. | 7 // TODOv3(shess): Review these changes carefully. |
8 | 8 |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 | 10 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 return true; | 124 return true; |
125 } | 125 } |
126 | 126 |
127 private: | 127 private: |
128 const char* data_; | 128 const char* data_; |
129 size_t length_; | 129 size_t length_; |
130 | 130 |
131 DISALLOW_COPY_AND_ASSIGN(BufferReader); | 131 DISALLOW_COPY_AND_ASSIGN(BufferReader); |
132 }; | 132 }; |
133 | 133 |
134 bool ParseGetHashMetadata(size_t hash_count, BufferReader* reader) { | 134 bool ParseGetHashMetadata(size_t hash_count, |
| 135 BufferReader* reader, |
| 136 std::vector<SBFullHashResult>* full_hashes) { |
135 for (size_t i = 0; i < hash_count; ++i) { | 137 for (size_t i = 0; i < hash_count; ++i) { |
136 base::StringPiece line; | 138 base::StringPiece line; |
137 if (!reader->GetLine(&line)) | 139 if (!reader->GetLine(&line)) |
138 return false; | 140 return false; |
139 | 141 |
140 size_t meta_data_len; | 142 size_t meta_data_len; |
141 if (!base::StringToSizeT(line, &meta_data_len)) | 143 if (!base::StringToSizeT(line, &meta_data_len)) |
142 return false; | 144 return false; |
143 | 145 |
144 const void* meta_data; | 146 const void* meta_data; |
145 if (!reader->RefData(&meta_data, meta_data_len)) | 147 if (!reader->RefData(&meta_data, meta_data_len)) |
146 return false; | 148 return false; |
| 149 |
| 150 if (full_hashes) { |
| 151 (*full_hashes)[full_hashes->size() - hash_count + i].metadata.assign( |
| 152 reinterpret_cast<const char*>(meta_data), meta_data_len); |
| 153 } |
147 } | 154 } |
148 return true; | 155 return true; |
149 } | 156 } |
150 | 157 |
151 } // namespace | 158 } // namespace |
152 | 159 |
153 namespace safe_browsing { | 160 namespace safe_browsing { |
154 | 161 |
155 // BODY = CACHELIFETIME LF HASHENTRY* EOF | 162 // BODY = CACHELIFETIME LF HASHENTRY* EOF |
156 // CACHELIFETIME = DIGIT+ | 163 // CACHELIFETIME = DIGIT+ |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 size_t hash_count; | 223 size_t hash_count; |
217 if (!base::StringToSizeT(hash_count_string, &hash_count)) | 224 if (!base::StringToSizeT(hash_count_string, &hash_count)) |
218 return false; | 225 return false; |
219 | 226 |
220 if (hash_len * hash_count > reader.length()) | 227 if (hash_len * hash_count > reader.length()) |
221 return false; | 228 return false; |
222 | 229 |
223 // Ignore hash results from lists we don't recognize. | 230 // Ignore hash results from lists we don't recognize. |
224 if (full_hash.list_id < 0) { | 231 if (full_hash.list_id < 0) { |
225 reader.Advance(hash_len * hash_count); | 232 reader.Advance(hash_len * hash_count); |
226 if (has_metadata && !ParseGetHashMetadata(hash_count, &reader)) | 233 if (has_metadata && !ParseGetHashMetadata(hash_count, &reader, NULL)) |
227 return false; | 234 return false; |
228 continue; | 235 continue; |
229 } | 236 } |
230 | 237 |
231 for (size_t i = 0; i < hash_count; ++i) { | 238 for (size_t i = 0; i < hash_count; ++i) { |
232 if (!reader.GetData(&full_hash.hash, hash_len)) | 239 if (!reader.GetData(&full_hash.hash, hash_len)) |
233 return false; | 240 return false; |
234 full_hashes->push_back(full_hash); | 241 full_hashes->push_back(full_hash); |
235 } | 242 } |
236 | 243 |
237 // Discard the metadata for now. | 244 if (has_metadata && !ParseGetHashMetadata(hash_count, &reader, full_hashes)) |
238 // TODO(mattm): handle the metadata (see crbug.com/176648). | |
239 if (has_metadata && !ParseGetHashMetadata(hash_count, &reader)) | |
240 return false; | 245 return false; |
241 } | 246 } |
242 | 247 |
243 return reader.empty(); | 248 return reader.empty(); |
244 } | 249 } |
245 | 250 |
246 // BODY = HEADER LF PREFIXES EOF | 251 // BODY = HEADER LF PREFIXES EOF |
247 // HEADER = PREFIXSIZE ":" LENGTH | 252 // HEADER = PREFIXSIZE ":" LENGTH |
248 // PREFIXSIZE = DIGIT+ # Size of each prefix in bytes | 253 // PREFIXSIZE = DIGIT+ # Size of each prefix in bytes |
249 // LENGTH = DIGIT+ # Size of PREFIXES in bytes | 254 // LENGTH = DIGIT+ # Size of PREFIXES in bytes |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 if (!list.adds.empty() && !list.subs.empty()) | 387 if (!list.adds.empty() && !list.subs.empty()) |
383 formatted_results.append(":"); | 388 formatted_results.append(":"); |
384 if (!list.subs.empty()) | 389 if (!list.subs.empty()) |
385 formatted_results.append("s:").append(list.subs); | 390 formatted_results.append("s:").append(list.subs); |
386 formatted_results.append("\n"); | 391 formatted_results.append("\n"); |
387 | 392 |
388 return formatted_results; | 393 return formatted_results; |
389 } | 394 } |
390 | 395 |
391 } // namespace safe_browsing | 396 } // namespace safe_browsing |
OLD | NEW |