blob: bf852a6177c0f5674e77b984658b0d43ba0d613d [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_POLICY_MESSAGING_LAYER_UPLOAD_FILE_UPLOAD_IMPL_H_
#define CHROME_BROWSER_POLICY_MESSAGING_LAYER_UPLOAD_FILE_UPLOAD_IMPL_H_
#include <string>
#include <string_view>
#include <vector>
#include "base/files/file.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "base/thread_annotations.h"
#include "chrome/browser/policy/messaging_layer/upload/file_upload_job.h"
#include "components/reporting/resources/resource_manager.h"
#include "components/reporting/util/status.h"
#include "google_apis/gaia/core_account_id.h"
#include "google_apis/gaia/oauth2_access_token_manager.h"
#include "net/http/http_response_headers.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "services/network/public/cpp/simple_url_loader.h"
#include "url/gurl.h"
namespace reporting {
class FileUploadDelegate : public FileUploadJob::Delegate {
public:
static constexpr int64_t kMaxUploadBufferSize = 1L * 1024L * 1024L; // 1 MiB
FileUploadDelegate();
~FileUploadDelegate() override;
static std::string GetFileUploadUrl();
private:
// Helper classes.
class AccessTokenRetriever;
class InitContext;
class NextStepContext;
class FinalContext;
friend class FileUploadDelegateTest;
// FileUploadJob::Delegate:
void DoInitiate(
std::string_view origin_path,
std::string_view upload_parameters,
base::OnceCallback<void(
StatusOr<std::pair<int64_t /*total*/,
std::string /*session_token*/>>)> cb) override;
void DoNextStep(
int64_t total,
int64_t uploaded,
std::string_view session_token,
ScopedReservation scoped_reservation,
base::OnceCallback<void(
StatusOr<std::pair<int64_t /*uploaded*/,
std::string /*session_token*/>>)> cb) override;
void DoFinalize(
std::string_view session_token,
base::OnceCallback<void(StatusOr<std::string /*access_parameters*/>)> cb)
override;
void DoDeleteFile(std::string_view origin_path) override;
// Called once authentication is finished (with token or failure status).
void OnAccessTokenResult(
std::string_view origin_path,
std::string_view upload_parameters,
base::OnceCallback<void(
StatusOr<
std::pair<int64_t /*total*/, std::string /*session_token*/>>)> cb,
StatusOr<std::string> access_token_result);
// Initializes the delegate once, lazily - when the first API is called.
// On later API calls this method immediately returns.
void InitializeOnce();
// Helper method starts OAuth2 token request.
[[nodiscard]] std::unique_ptr<OAuth2AccessTokenManager::Request>
StartOAuth2Request(
OAuth2AccessTokenManager::Consumer* consumer // owned by the caller!
) const;
// Helper method populates rest of request and creates SimpleURLLoader
// instance.
[[nodiscard]] std::unique_ptr<::network::SimpleURLLoader> CreatePostLoader(
std::unique_ptr<::network::ResourceRequest> resource_request) const;
// Helper method sends request and hands the response headers to `response_cb`
// (on the current task runner).
void SendAndGetResponse(
::network::SimpleURLLoader* url_loader, // owned by the caller!
base::OnceCallback<void(scoped_refptr<::net::HttpResponseHeaders>
headers)> response_cb) const;
base::WeakPtr<FileUploadDelegate> GetWeakPtr();
SEQUENCE_CHECKER(sequence_checker_);
// The URL to which the POST request should be directed.
GURL upload_url_ GUARDED_BY_CONTEXT(sequence_checker_);
// The account ID that will be used for the access token fetch.
CoreAccountId account_id_ GUARDED_BY_CONTEXT(sequence_checker_);
// The token manager used to retrieve the access token (not owned).
raw_ptr<OAuth2AccessTokenManager> access_token_manager_
GUARDED_BY_CONTEXT(sequence_checker_);
// This is used to initialize the network::SimpleURLLoader object.
scoped_refptr<::network::SharedURLLoaderFactory> url_loader_factory_
GUARDED_BY_CONTEXT(sequence_checker_);
// Network traffic annotation set by the delegate describing what kind of data
// is uploaded.
std::unique_ptr<net::NetworkTrafficAnnotationTag> traffic_annotation_
GUARDED_BY_CONTEXT(sequence_checker_);
// Maximum upload size allowed for a single request.
int64_t max_upload_buffer_size_ GUARDED_BY_CONTEXT(sequence_checker_);
// Weak pointer factory used by this delegate.
// Note that weak pointers here are all dereferenced on UI task runner, and so
// the factory needs to be reset there as well - because of that we make it
// moveable by using smart pointer.
std::unique_ptr<base::WeakPtrFactory<FileUploadDelegate>> weak_ptr_factory_{
new base::WeakPtrFactory<FileUploadDelegate>{this}};
};
} // namespace reporting
#endif // CHROME_BROWSER_POLICY_MESSAGING_LAYER_UPLOAD_FILE_UPLOAD_IMPL_H_