| Index: components/password_manager/core/browser/site_affiliation/asset_link_retriever.cc
|
| diff --git a/components/password_manager/core/browser/site_affiliation/asset_link_retriever.cc b/components/password_manager/core/browser/site_affiliation/asset_link_retriever.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dabc0e4ce3a54fbd34ba1c9feea96dea75f1af5b
|
| --- /dev/null
|
| +++ b/components/password_manager/core/browser/site_affiliation/asset_link_retriever.cc
|
| @@ -0,0 +1,75 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/password_manager/core/browser/site_affiliation/asset_link_retriever.h"
|
| +
|
| +#include <utility>
|
| +
|
| +#include "base/logging.h"
|
| +#include "net/base/load_flags.h"
|
| +#include "net/http/http_status_code.h"
|
| +#include "net/traffic_annotation/network_traffic_annotation.h"
|
| +#include "net/url_request/url_fetcher.h"
|
| +
|
| +namespace password_manager {
|
| +
|
| +AssetLinkRetriever::AssetLinkRetriever(GURL file_url)
|
| + : url_(std::move(file_url)), state_(State::INACTIVE), error_(false) {
|
| + DCHECK(url_.is_valid());
|
| + DCHECK(url_.SchemeIs(url::kHttpsScheme));
|
| +}
|
| +
|
| +void AssetLinkRetriever::Start(net::URLRequestContextGetter* context_getter) {
|
| + if (state_ != State::INACTIVE)
|
| + return;
|
| + net::NetworkTrafficAnnotationTag traffic_annotation =
|
| + net::DefineNetworkTrafficAnnotation("asset_links", R"(
|
| + semantics {
|
| + sender: "Asset Links Fetcher"
|
| + description:
|
| + "The asset links is a JSON file hosted on "
|
| + "https://<domain>/.well-known/assetlinks.json. It contains "
|
| + "different permissions the site gives to apps/other sites. Chrome "
|
| + "looks for a permission to delegate the credentials from the site "
|
| + "to another domain. It's used for handling the stored credentials "
|
| + "in the password manager."
|
| + trigger:
|
| + "Load a site where it's possible to sign-in. The site can have a "
|
| + "password form or use the Credential Management API."
|
| + data: "None."
|
| + destination: WEBSITE
|
| + }
|
| + policy {
|
| + cookies_allowed: false
|
| + setting: "No setting"
|
| + policy_exception_justification:
|
| + "The file is considered to be a resource of the page loaded."
|
| + })");
|
| + fetcher_ = net::URLFetcher::Create(url_, net::URLFetcher::GET, this,
|
| + traffic_annotation);
|
| + fetcher_->SetRequestContext(context_getter);
|
| + fetcher_->SetLoadFlags(
|
| + net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES |
|
| + net::LOAD_DO_NOT_SEND_AUTH_DATA | net::LOAD_MAYBE_USER_GESTURE);
|
| + fetcher_->SetStopOnRedirect(true);
|
| + fetcher_->Start();
|
| + state_ = State::NETWORK_REQUEST;
|
| +}
|
| +
|
| +AssetLinkRetriever::~AssetLinkRetriever() = default;
|
| +
|
| +void AssetLinkRetriever::OnURLFetchComplete(const net::URLFetcher* source) {
|
| + DCHECK(source == fetcher_.get());
|
| +
|
| + error_ = !source->GetStatus().is_success() ||
|
| + source->GetResponseCode() != net::HTTP_OK;
|
| + if (error_) {
|
| + state_ = State::FINISHED;
|
| + } else {
|
| + // TODO(crbug.com/630555): Start parsing here.
|
| + }
|
| + fetcher_.reset();
|
| +}
|
| +
|
| +} // namespace password_manager
|
|
|