| 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 // A library to manage RLZ information for access-points shared | 5 // A library to manage RLZ information for access-points shared |
| 6 // across different client applications. | 6 // across different client applications. |
| 7 | 7 |
| 8 #include "rlz/lib/rlz_lib.h" | 8 #include "rlz/lib/rlz_lib.h" |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 | 11 |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
| 15 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 16 #include "rlz/lib/assert.h" | 16 #include "rlz/lib/assert.h" |
| 17 #include "rlz/lib/crc32.h" | |
| 18 #include "rlz/lib/financial_ping.h" | 17 #include "rlz/lib/financial_ping.h" |
| 19 #include "rlz/lib/lib_values.h" | 18 #include "rlz/lib/lib_values.h" |
| 19 #include "rlz/lib/net_response_check.h" |
| 20 #include "rlz/lib/rlz_value_store.h" | 20 #include "rlz/lib/rlz_value_store.h" |
| 21 #include "rlz/lib/string_utils.h" | 21 #include "rlz/lib/string_utils.h" |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 // Event information returned from ping response. | 25 // Event information returned from ping response. |
| 26 struct ReturnedEvent { | 26 struct ReturnedEvent { |
| 27 rlz_lib::AccessPoint access_point; | 27 rlz_lib::AccessPoint access_point; |
| 28 rlz_lib::Event event_type; | 28 rlz_lib::Event event_type; |
| 29 }; | 29 }; |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 return false; | 370 return false; |
| 371 | 371 |
| 372 if (request_string.size() >= request_buffer_size) | 372 if (request_string.size() >= request_buffer_size) |
| 373 return false; | 373 return false; |
| 374 | 374 |
| 375 strncpy(request, request_string.c_str(), request_buffer_size); | 375 strncpy(request, request_string.c_str(), request_buffer_size); |
| 376 request[request_buffer_size - 1] = 0; | 376 request[request_buffer_size - 1] = 0; |
| 377 return true; | 377 return true; |
| 378 } | 378 } |
| 379 | 379 |
| 380 bool IsPingResponseValid(const char* response, int* checksum_idx) { | |
| 381 if (!response || !response[0]) | |
| 382 return false; | |
| 383 | |
| 384 if (checksum_idx) | |
| 385 *checksum_idx = -1; | |
| 386 | |
| 387 if (strlen(response) > kMaxPingResponseLength) { | |
| 388 ASSERT_STRING("IsPingResponseValid: response is too long to parse."); | |
| 389 return false; | |
| 390 } | |
| 391 | |
| 392 // Find the checksum line. | |
| 393 std::string response_string(response); | |
| 394 | |
| 395 std::string checksum_param("\ncrc32: "); | |
| 396 int calculated_crc; | |
| 397 int checksum_index = response_string.find(checksum_param); | |
| 398 if (checksum_index >= 0) { | |
| 399 // Calculate checksum of message preceeding checksum line. | |
| 400 // (+ 1 to include the \n) | |
| 401 std::string message(response_string.substr(0, checksum_index + 1)); | |
| 402 if (!Crc32(message.c_str(), &calculated_crc)) | |
| 403 return false; | |
| 404 } else { | |
| 405 checksum_param = "crc32: "; // Empty response case. | |
| 406 if (!base::StartsWith(response_string, checksum_param, | |
| 407 base::CompareCase::SENSITIVE)) | |
| 408 return false; | |
| 409 | |
| 410 checksum_index = 0; | |
| 411 if (!Crc32("", &calculated_crc)) | |
| 412 return false; | |
| 413 } | |
| 414 | |
| 415 // Find the checksum value on the response. | |
| 416 int checksum_end = response_string.find("\n", checksum_index + 1); | |
| 417 if (checksum_end < 0) | |
| 418 checksum_end = response_string.size(); | |
| 419 | |
| 420 int checksum_begin = checksum_index + checksum_param.size(); | |
| 421 std::string checksum = response_string.substr(checksum_begin, | |
| 422 checksum_end - checksum_begin + 1); | |
| 423 base::TrimWhitespaceASCII(checksum, base::TRIM_ALL, &checksum); | |
| 424 | |
| 425 if (checksum_idx) | |
| 426 *checksum_idx = checksum_index; | |
| 427 | |
| 428 return calculated_crc == HexStringToInteger(checksum.c_str()); | |
| 429 } | |
| 430 | |
| 431 // Complex helpers built on top of other functions. | 380 // Complex helpers built on top of other functions. |
| 432 | 381 |
| 433 bool ParseFinancialPingResponse(Product product, const char* response) { | 382 bool ParseFinancialPingResponse(Product product, const char* response) { |
| 434 // Update the last ping time irrespective of success. | 383 // Update the last ping time irrespective of success. |
| 435 FinancialPing::UpdateLastPingTime(product); | 384 FinancialPing::UpdateLastPingTime(product); |
| 436 // Parse the ping response - update RLZs, clear events. | 385 // Parse the ping response - update RLZs, clear events. |
| 437 return ParsePingResponse(product, response); | 386 return ParsePingResponse(product, response); |
| 438 } | 387 } |
| 439 | 388 |
| 440 bool SendFinancialPing(Product product, const AccessPoint* access_points, | 389 bool SendFinancialPing(Product product, const AccessPoint* access_points, |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 if (cgi_string.size() >= cgi_size) | 576 if (cgi_string.size() >= cgi_size) |
| 628 return false; | 577 return false; |
| 629 | 578 |
| 630 strncpy(cgi, cgi_string.c_str(), cgi_size); | 579 strncpy(cgi, cgi_string.c_str(), cgi_size); |
| 631 cgi[cgi_size - 1] = 0; | 580 cgi[cgi_size - 1] = 0; |
| 632 | 581 |
| 633 return true; | 582 return true; |
| 634 } | 583 } |
| 635 | 584 |
| 636 } // namespace rlz_lib | 585 } // namespace rlz_lib |
| OLD | NEW |