blob: 84e93bde17c341f44185afa5193a734431c79241 [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2020 The Chromium Authors
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:132// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_
6#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_
7
Keishi Hattori0e45c022021-11-27 09:25:528#include "base/memory/raw_ptr.h"
Dominique Fauteux-Chapleaud280fd52021-02-03 20:06:009#include "chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h"
Dominique Fauteux-Chapleau5ae64242020-04-17 13:18:2610#include "chrome/browser/enterprise/connectors/common.h"
Shanthanu Bhardwajadf4f342d2022-07-19 17:16:5511#include "chrome/browser/enterprise/connectors/reporting/extension_install_event_router.h"
Dominique Fauteux-Chapleaud280fd52021-02-03 20:06:0012#include "chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h"
Dominique Fauteux-Chapleau76b366a2020-05-28 17:15:0613#include "chrome/browser/enterprise/connectors/service_provider_config.h"
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:1314#include "components/enterprise/buildflags/buildflags.h"
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3615#include "components/prefs/pref_change_registrar.h"
Dominique Fauteux-Chapleau130242bf2020-12-07 19:07:4816#include "components/prefs/pref_service.h"
Anton Bikineev46bbb972021-05-15 17:53:5317#include "third_party/abseil-cpp/absl/types/optional.h"
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1318#include "url/gurl.h"
19
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:1320#if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao87e5e112023-05-18 16:54:4221#include "chrome/browser/ui/browser_list_observer.h"
22#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:1323#endif // BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao87e5e112023-05-18 16:54:4224
Steffen Seckler6ef24b82022-07-22 08:46:0725namespace storage {
26class FileSystemURL;
27}
28
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1329namespace enterprise_connectors {
Haifan Wang30d3f692022-08-18 14:51:2430class BrowserCrashEventRouter;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1331
Dominique Fauteux-Chapleau130242bf2020-12-07 19:07:4832// Manages access to Connector policies for a given profile. This class is
33// responsible for caching the Connector policies, validate them against
34// approved service providers and provide a simple interface to them.
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:1335#if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao87e5e112023-05-18 16:54:4236class ConnectorsManager : public BrowserListObserver,
37 public TabStripModelObserver {
38#else
Ian Clelland9dc5a0d62023-05-17 19:18:2639class ConnectorsManager {
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:1340#endif // BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao87e5e112023-05-18 16:54:4241
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1342 public:
Roger Tawa445a9972020-05-20 22:44:0243 // Maps used to cache connectors settings.
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4544 using AnalysisConnectorsSettings =
45 std::map<AnalysisConnector, std::vector<AnalysisServiceSettings>>;
Roger Tawa445a9972020-05-20 22:44:0246 using ReportingConnectorsSettings =
47 std::map<ReportingConnector, std::vector<ReportingServiceSettings>>;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4548
Haifan Wang30d3f692022-08-18 14:51:2449 ConnectorsManager(
50 std::unique_ptr<BrowserCrashEventRouter> browser_crash_event_router,
Shanthanu Bhardwaje943c4f2022-12-21 16:32:1351 std::unique_ptr<ExtensionInstallEventRouter> extension_install_router,
Haifan Wang30d3f692022-08-18 14:51:2452 PrefService* pref_service,
53 const ServiceProviderConfig* config,
54 bool observe_prefs = true);
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:1355#if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao87e5e112023-05-18 16:54:4256 ~ConnectorsManager() override;
57#else
Ian Clelland9dc5a0d62023-05-17 19:18:2658 ~ConnectorsManager();
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:1359#endif // BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1360
Roger Tawa445a9972020-05-20 22:44:0261 // Validates which settings should be applied to a reporting event
Dominique Fauteux-Chapleauc088fba2020-10-26 20:34:0862 // against cached policies. Cache the policy value the first time this is
63 // called for every different connector.
Anton Bikineev46bbb972021-05-15 17:53:5364 absl::optional<ReportingSettings> GetReportingSettings(
Roger Tawa445a9972020-05-20 22:44:0265 ReportingConnector connector);
66
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1367 // Validates which settings should be applied to an analysis connector event
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4568 // against cached policies. This function will prioritize new connector
69 // policies over legacy ones if they are set.
Anton Bikineev46bbb972021-05-15 17:53:5370 absl::optional<AnalysisSettings> GetAnalysisSettings(
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2671 const GURL& url,
72 AnalysisConnector connector);
Steffen Seckler6ef24b82022-07-22 08:46:0773#if BUILDFLAG(IS_CHROMEOS_ASH)
74 absl::optional<AnalysisSettings> GetAnalysisSettings(
75 content::BrowserContext* context,
76 const storage::FileSystemURL& source_url,
77 const storage::FileSystemURL& destination_url,
78 AnalysisConnector connector);
79#endif // BUILDFLAG(IS_CHROMEOS_ASH)
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2680
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2681 // Checks if the corresponding connector is enabled.
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0382 bool IsConnectorEnabled(AnalysisConnector connector) const;
83 bool IsConnectorEnabled(ReportingConnector connector) const;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1384
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:1385#if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao8f7c4a32023-04-26 16:16:2786 // Check if the corresponding connector is enabled for any local agent.
87 bool IsConnectorEnabledForLocalAgent(AnalysisConnector connector) const;
88#endif
89
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0390 bool DelayUntilVerdict(AnalysisConnector connector);
Anthony Vallee-Dubois86baa7fc42021-06-29 15:38:5591 absl::optional<std::u16string> GetCustomMessage(AnalysisConnector connector,
92 const std::string& tag);
93 absl::optional<GURL> GetLearnMoreUrl(AnalysisConnector connector,
94 const std::string& tag);
Sneha Nagpaul4325c7852022-07-19 13:51:3895 bool GetBypassJustificationRequired(AnalysisConnector connector,
96 const std::string& tag);
Dominique Fauteux-Chapleauccf53092020-04-08 17:15:2897
Anthony Vallee-Dubois53913ec2021-02-22 16:46:4498 std::vector<std::string> GetAnalysisServiceProviderNames(
99 AnalysisConnector connector);
Anthony Vallee-Dubois9a6a0402021-02-24 14:46:16100 std::vector<std::string> GetReportingServiceProviderNames(
101 ReportingConnector connector);
Anthony Vallee-Dubois53913ec2021-02-22 16:46:44102
Roger Tawa671dc432022-08-23 15:58:21103 std::vector<const AnalysisConfig*> GetAnalysisServiceConfigs(
104 AnalysisConnector connector);
105
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45106 // Public testing functions.
107 const AnalysisConnectorsSettings& GetAnalysisConnectorsSettingsForTesting()
108 const;
Roger Tawa445a9972020-05-20 22:44:02109 const ReportingConnectorsSettings& GetReportingConnectorsSettingsForTesting()
110 const;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45111
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13112 private:
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:13113#if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao87e5e112023-05-18 16:54:42114 // BrowserListObserver overrides:
115 void OnBrowserAdded(Browser* browser) override;
116 void OnBrowserRemoved(Browser* browser) override;
117
118 // TabStripModelObserver overrides:
119 void OnTabStripModelChanged(
120 TabStripModel* tab_strip_model,
121 const TabStripModelChange& change,
122 const TabStripSelectionChange& selection) override;
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:13123#endif // BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao87e5e112023-05-18 16:54:42124
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45125 // Validates which settings should be applied to an analysis connector event
126 // against connector policies. Cache the policy value the first time this is
127 // called for every different connector.
Anton Bikineev46bbb972021-05-15 17:53:53128 absl::optional<AnalysisSettings> GetAnalysisSettingsFromConnectorPolicy(
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45129 const GURL& url,
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:26130 AnalysisConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45131
132 // Read and cache the policy corresponding to |connector|.
Roger Tawa3583e9c2023-02-24 14:48:24133 void CacheAnalysisConnectorPolicy(AnalysisConnector connector) const;
Roger Tawa445a9972020-05-20 22:44:02134 void CacheReportingConnectorPolicy(ReportingConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45135
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:13136#if BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao8f7c4a32023-04-26 16:16:27137 // Close connection with local agent if all the relevant connectors are turned
138 // off for it.
139 void MaybeCloseLocalContentAnalysisAgentConnection();
Dominique Fauteux-Chapleaud991d8752023-08-10 16:44:13140#endif // BUILDFLAG(ENTERPRISE_LOCAL_CONTENT_ANALYSIS)
Nancy Xiao8f7c4a32023-04-26 16:16:27141
142 // Re-cache analysis connector policy and update local agent connection if
143 // needed.
144 void OnPrefChanged(AnalysisConnector connector);
145
Dominique Fauteux-Chapleau130242bf2020-12-07 19:07:48146 // Sets up |pref_change_registrar_|. Used by the constructor and
147 // SetUpForTesting.
148 void StartObservingPrefs(PrefService* pref_service);
Dominique Fauteux-Chapleau045c37d2020-05-05 12:51:40149 void StartObservingPref(AnalysisConnector connector);
Roger Tawa445a9972020-05-20 22:44:02150 void StartObservingPref(ReportingConnector connector);
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36151
Dominique Fauteux-Chapleau12381552020-09-21 18:45:55152 // Validates which settings should be applied to an analysis connector event
153 // against connector policies. Cache the policy value the first time this is
154 // called for every different connector.
Anton Bikineev46bbb972021-05-15 17:53:53155 absl::optional<ReportingSettings> GetReportingSettingsFromConnectorPolicy(
Dominique Fauteux-Chapleau12381552020-09-21 18:45:55156 ReportingConnector connector);
157
Roger Tawa3583e9c2023-02-24 14:48:24158 PrefService* prefs() { return pref_change_registrar_.prefs(); }
159
160 const PrefService* prefs() const { return pref_change_registrar_.prefs(); }
161
Dominique Fauteux-Chapleau76b366a2020-05-28 17:15:06162 // Cached values of available service providers. This information validates
163 // the Connector policies have a valid provider.
Dominique Fauteux-Chapleau5bc510e52022-06-02 12:29:23164 raw_ptr<const ServiceProviderConfig> service_provider_config_;
Dominique Fauteux-Chapleau76b366a2020-05-28 17:15:06165
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45166 // Cached values of the connector policies. Updated when a connector is first
Roger Tawa3583e9c2023-02-24 14:48:24167 // used or when a policy is updated. Analysis connectors settings are
168 // mutable because they maybe updated by a call to IsConnectorEnabled(),
169 // which is a const method.
170 mutable AnalysisConnectorsSettings analysis_connector_settings_;
Roger Tawa445a9972020-05-20 22:44:02171 ReportingConnectorsSettings reporting_connector_settings_;
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36172
173 // Used to track changes of connector policies and propagate them in
174 // |connector_settings_|.
175 PrefChangeRegistrar pref_change_registrar_;
Shanthanu Bhardwajadf4f342d2022-07-19 17:16:55176
Haifan Wang30d3f692022-08-18 14:51:24177 // A router to report browser crash events via the reporting pipeline.
178 std::unique_ptr<BrowserCrashEventRouter> browser_crash_event_router_;
179
Shanthanu Bhardwajadf4f342d2022-07-19 17:16:55180 // An observer to report extension install events via the reporting pipeline.
Shanthanu Bhardwaje943c4f2022-12-21 16:32:13181 std::unique_ptr<ExtensionInstallEventRouter> extension_install_event_router_;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13182};
183
184} // namespace enterprise_connectors
185
186#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_