trial_group_checker.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright (c) 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/components/trial_group/trial_group_checker.h"
  5. #include "base/bind.h"
  6. #include "base/json/json_reader.h"
  7. #include "base/json/json_writer.h"
  8. #include "base/values.h"
  9. #include "net/base/load_flags.h"
  10. #include "services/network/public/cpp/resource_request.h"
  11. #include "services/network/public/cpp/shared_url_loader_factory.h"
  12. #include "services/network/public/cpp/simple_url_loader.h"
  13. #include "services/network/public/mojom/url_response_head.mojom.h"
  14. namespace {
  15. constexpr int kIsMember = 1;
  16. constexpr char kServerUrl[] =
  17. "https://crosdogpack-pa.googleapis.com/v1/isMember";
  18. } // namespace
  19. namespace ash {
  20. namespace trial_group {
  21. TrialGroupChecker::TrialGroupChecker(GroupId group_id)
  22. : server_url_(GURL(kServerUrl)), group_id_(group_id) {}
  23. TrialGroupChecker::~TrialGroupChecker() = default;
  24. void TrialGroupChecker::SetServerUrl(GURL server_url) {
  25. server_url_ = server_url;
  26. }
  27. void TrialGroupChecker::OnRequestComplete(
  28. std::unique_ptr<std::string> response_body) {
  29. const int net_error = loader_->NetError();
  30. int response_code = 0;
  31. if (loader_->ResponseInfo()) {
  32. response_code = loader_->ResponseInfo()->headers->response_code();
  33. }
  34. loader_.reset();
  35. const bool server_error =
  36. net_error != net::OK || (response_code >= 500 && response_code < 600);
  37. if (server_error || response_body->empty()) {
  38. std::move(callback_).Run(false);
  39. return;
  40. }
  41. auto membership_info = base::JSONReader::ReadAndReturnValueWithError(
  42. *response_body, base::JSON_PARSE_RFC);
  43. if (!membership_info.has_value() || !membership_info->is_dict()) {
  44. std::move(callback_).Run(false);
  45. return;
  46. }
  47. base::Value* member_status = membership_info->FindKey("membership_info");
  48. if (member_status == nullptr || !member_status->is_int()) {
  49. std::move(callback_).Run(false);
  50. return;
  51. }
  52. bool is_member = (member_status->GetInt() == kIsMember);
  53. std::move(callback_).Run(is_member);
  54. }
  55. TrialGroupChecker::Status TrialGroupChecker::LookUpMembership(
  56. scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
  57. base::OnceCallback<void(bool is_member)> callback) {
  58. // OnRequestComplete has not completed from a previous call, so exit.
  59. if (loader_)
  60. return TrialGroupChecker::PREVIOUS_CALL_RUNNING;
  61. callback_ = std::move(callback);
  62. std::string upload_data;
  63. {
  64. base::DictionaryValue request;
  65. request.SetIntKey("group", static_cast<int>(group_id_));
  66. base::JSONWriter::Write(request, &upload_data);
  67. }
  68. net::NetworkTrafficAnnotationTag traffic_annotation =
  69. net::DefineNetworkTrafficAnnotation("trial_group_lookup",
  70. R"(
  71. semantics {
  72. sender: "Trial Group Lookup"
  73. description:
  74. "Obtains whether user is in the Google group for a dogfood trial."
  75. trigger: "On boot."
  76. data: "Dogfood enum identifier and credentials."
  77. destination: GOOGLE_OWNED_SERVICE
  78. }
  79. policy {
  80. cookies_allowed: NO
  81. }
  82. )");
  83. auto resource_request = std::make_unique<network::ResourceRequest>();
  84. resource_request->url = server_url_;
  85. DCHECK(resource_request->url.is_valid());
  86. resource_request->method = "POST";
  87. resource_request->load_flags =
  88. net::LOAD_BYPASS_CACHE | net::LOAD_DISABLE_CACHE;
  89. resource_request->credentials_mode =
  90. network::mojom::CredentialsMode::kInclude;
  91. loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
  92. traffic_annotation);
  93. loader_->AttachStringForUpload(upload_data, "application/json");
  94. loader_->DownloadToString(
  95. url_loader_factory.get(),
  96. base::BindOnce(&TrialGroupChecker::OnRequestComplete,
  97. weak_factory_.GetWeakPtr()),
  98. 1024 /* 1 kiB */);
  99. return TrialGroupChecker::OK;
  100. }
  101. } // namespace trial_group
  102. } // namespace ash