blob: 7f0e4dc98780224654f65cb4c79fa449e2ae25b2 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_ENTERPRISE_BROWSER_REPORTING_REPORT_SCHEDULER_H_
#define COMPONENTS_ENTERPRISE_BROWSER_REPORTING_REPORT_SCHEDULER_H_
#include <memory>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/wall_clock_timer.h"
#include "components/enterprise/browser/reporting/report_uploader.h"
#include "components/enterprise/browser/reporting/user_security_signals_service.h"
#include "components/policy/core/common/cloud/dm_token.h"
#include "components/prefs/pref_change_registrar.h"
namespace policy {
class CloudPolicyClient;
class DMToken;
} // namespace policy
namespace enterprise_reporting {
class ChromeProfileRequestGenerator;
class RealTimeReportController;
class ReportGenerator;
// Schedules report generation and upload every 24 hours (and upon browser
// update for desktop Chrome) while cloud reporting is enabled via
// administrative policy. If either of these triggers fires while a report is
// being generated, processing is deferred until the existing processing
// completes.
class ReportScheduler {
public:
using ReportTriggerCallback = base::RepeatingCallback<void(ReportTrigger)>;
class Delegate {
public:
Delegate();
Delegate(const Delegate&) = delete;
Delegate& operator=(const Delegate&) = delete;
virtual ~Delegate();
void SetReportTriggerCallback(ReportTriggerCallback callback);
virtual PrefService* GetPrefService() = 0;
// Run once after initialization of the scheduler is complete.
virtual void OnInitializationCompleted();
// Browser version
virtual void StartWatchingUpdatesIfNeeded(
base::Time last_upload,
base::TimeDelta upload_interval) = 0;
virtual void StopWatchingUpdates() = 0;
virtual void OnBrowserVersionUploaded() = 0;
virtual policy::DMToken GetProfileDMToken() = 0;
virtual std::string GetProfileClientId() = 0;
// Security signals
virtual bool AreSecurityReportsEnabled();
virtual bool UseCookiesInUploads();
// Invoked when security signals was uploaded by a report.
virtual void OnSecuritySignalsUploaded();
protected:
ReportTriggerCallback trigger_report_callback_;
// Only set for Profile-level schedulers.
std::unique_ptr<UserSecuritySignalsService> user_security_signals_service_;
};
struct CreateParams {
CreateParams();
CreateParams(const CreateParams&) = delete;
CreateParams& operator=(const CreateParams&) = delete;
CreateParams(CreateParams&& other);
CreateParams& operator=(CreateParams&& other);
~CreateParams();
raw_ptr<policy::CloudPolicyClient> client;
std::unique_ptr<ReportGenerator> report_generator;
std::unique_ptr<RealTimeReportController> real_time_report_controller;
std::unique_ptr<ChromeProfileRequestGenerator> profile_request_generator;
std::unique_ptr<ReportScheduler::Delegate> delegate;
};
explicit ReportScheduler(CreateParams params);
ReportScheduler(const ReportScheduler&) = delete;
ReportScheduler& operator=(const ReportScheduler&) = delete;
~ReportScheduler();
// Returns true if cloud reporting is enabled.
bool IsReportingEnabled() const;
// Returns true if security signals reporting is enabled.
bool AreSecurityReportsEnabled() const;
// Returns true if next report has been scheduled. The report will be
// scheduled only if the previous report is uploaded successfully and the
// reporting policy is still enabled.
bool IsNextReportScheduledForTesting() const;
ReportTrigger GetActiveTriggerForTesting() const;
ReportGenerationConfig GetActiveGenerationConfigForTesting() const;
void QueueReportUploaderForTesting(std::unique_ptr<ReportUploader> uploader);
Delegate* GetDelegateForTesting();
void OnDMTokenUpdated();
void UploadFullReport(base::OnceClosure on_report_uploaded);
private:
// Observes CloudReportingEnabled policy.
void RegisterPrefObserver();
// Handles policy value changes for both kCloudReportingEnabled and
// kUserSecuritySignalsReporting, including the first policy value check
// during startup.
void OnReportEnabledPrefChanged();
// Stops the periodic timer and the update observer.
void Stop();
// Stop the timer if there is any and reschedule the next report based on
// latest report frequency.
void RestartReportTimer();
// Register |cloud_policy_client_| with dm token and client id for desktop
// browser only. (Chrome OS doesn't need this step here.)
bool SetupBrowserPolicyClientRegistration();
// Starts the periodic timer based on the last time a report was uploaded.
void Start(base::Time last_upload_time);
// Starts report generation in response to |trigger|.
void GenerateAndUploadReport(ReportTrigger trigger);
// Continues processing a report (contained in the |requests| collection) by
// sending it to the uploader.
void OnReportGenerated(ReportRequestQueue requests);
// Finishes processing following report upload. |status| indicates the result
// of the attempted upload.
void OnReportUploaded(ReportUploader::ReportStatus status);
// Initiates report generation for any triggers that arrived during generation
// of another report.
void RunPendingTriggers();
// Records that `active_trigger_` was responsible for an upload attempt.
void RecordUploadTrigger();
ReportType TriggerToReportType(ReportTrigger trigger);
policy::DMToken GetDMToken();
std::unique_ptr<Delegate> delegate_;
// Policy value watcher
PrefChangeRegistrar pref_change_registrar_;
raw_ptr<policy::CloudPolicyClient, DanglingUntriaged> cloud_policy_client_;
base::WallClockTimer request_timer_;
std::unique_ptr<ReportUploader> report_uploader_;
std::unique_ptr<ReportGenerator> report_generator_;
std::unique_ptr<ChromeProfileRequestGenerator> profile_request_generator_;
std::unique_ptr<RealTimeReportController> real_time_report_controller_;
// The configuration for active report generation.
// If the configuration has `kTriggerNone` as its trigger, it means there is
// no active report generation/upload in progress.
ReportGenerationConfig active_report_generation_config_ =
ReportGenerationConfig(ReportTrigger::kTriggerNone);
// The set of triggers that have fired while processing a report (a bitfield
// of ReportTrigger values). They will be handled following completion of the
// in-process report.
uint32_t pending_triggers_ = 0;
std::string reporting_pref_name_;
ReportType full_report_type_;
std::vector<std::unique_ptr<ReportUploader>> report_uploaders_for_test_;
base::OnceClosure on_manual_report_uploaded_;
base::WeakPtrFactory<ReportScheduler> weak_ptr_factory_{this};
};
} // namespace enterprise_reporting
#endif // COMPONENTS_ENTERPRISE_BROWSER_REPORTING_REPORT_SCHEDULER_H_