blob: 7194051bd90cd577f5e5b7a149085abbd34ac1cd [file] [log] [blame]
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:131// Copyright 2020 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
5#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_
6#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_
7
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:138#include "base/callback_forward.h"
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:459#include "base/feature_list.h"
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1310#include "base/optional.h"
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4511#include "chrome/browser/enterprise/connectors/analysis_service_settings.h"
Dominique Fauteux-Chapleau5ae64242020-04-17 13:18:2612#include "chrome/browser/enterprise/connectors/common.h"
Roger Tawa445a9972020-05-20 22:44:0213#include "chrome/browser/enterprise/connectors/reporting_service_settings.h"
Dominique Fauteux-Chapleau76b366a2020-05-28 17:15:0614#include "chrome/browser/enterprise/connectors/service_provider_config.h"
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3615#include "components/prefs/pref_change_registrar.h"
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1316#include "url/gurl.h"
17
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0318namespace base {
19template <typename T>
Dominique Fauteux-Chapleau32f30dd02020-07-06 17:38:2220class NoDestructor;
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0321}
22
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1323namespace enterprise_connectors {
24
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4525// Controls whether the Enterprise Connectors policies should be read by
Dominique Fauteux-Chapleau2cd7ba22020-10-23 14:51:0326// ConnectorsManager.
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4527extern const base::Feature kEnterpriseConnectorsEnabled;
28
Roger Tawa41fe5a92020-05-26 18:04:5629// For the moment, service provider configurations are static and only support
30// google endpoints. Therefore the configurtion is placed here directly.
31// Once the configuation becomes more dynamic this static string will be
32// removed and replaced with a service to keep it up to date.
33extern const char kServiceProviderConfig[];
34
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1335// Manages access to Connector policies. This class is responsible for caching
36// the Connector policies, validate them against approved service providers and
37// provide a simple interface to them.
38class ConnectorsManager {
39 public:
Roger Tawa445a9972020-05-20 22:44:0240 // Maps used to cache connectors settings.
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4541 using AnalysisConnectorsSettings =
42 std::map<AnalysisConnector, std::vector<AnalysisServiceSettings>>;
Roger Tawa445a9972020-05-20 22:44:0243 using ReportingConnectorsSettings =
44 std::map<ReportingConnector, std::vector<ReportingServiceSettings>>;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4545
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0346 static ConnectorsManager* GetInstance();
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1347
Roger Tawa445a9972020-05-20 22:44:0248 // Validates which settings should be applied to a reporting event
Dominique Fauteux-Chapleauc088fba2020-10-26 20:34:0849 // against cached policies. Cache the policy value the first time this is
50 // called for every different connector.
Roger Tawa445a9972020-05-20 22:44:0251 base::Optional<ReportingSettings> GetReportingSettings(
52 ReportingConnector connector);
53
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1354 // Validates which settings should be applied to an analysis connector event
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4555 // against cached policies. This function will prioritize new connector
56 // policies over legacy ones if they are set.
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2657 base::Optional<AnalysisSettings> GetAnalysisSettings(
58 const GURL& url,
59 AnalysisConnector connector);
60
61 // Checks if the corresponding connector is enabled.
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0362 bool IsConnectorEnabled(AnalysisConnector connector) const;
63 bool IsConnectorEnabled(ReportingConnector connector) const;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1364
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0365 bool DelayUntilVerdict(AnalysisConnector connector);
Dominique Fauteux-Chapleauccf53092020-04-08 17:15:2866
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4567 // Public testing functions.
68 const AnalysisConnectorsSettings& GetAnalysisConnectorsSettingsForTesting()
69 const;
Roger Tawa445a9972020-05-20 22:44:0270 const ReportingConnectorsSettings& GetReportingConnectorsSettingsForTesting()
71 const;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4572
Dominique Fauteux-Chapleau32f30dd02020-07-06 17:38:2273 // Helpers to reset the ConnectorManager instance across test since it would
74 // otherwise persist its state.
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3675 void SetUpForTesting();
76 void TearDownForTesting();
Dominique Fauteux-Chapleau6f15fae2020-05-26 18:25:3577 void ClearCacheForTesting();
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3678
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1379 private:
Dominique Fauteux-Chapleau32f30dd02020-07-06 17:38:2280 friend class base::NoDestructor<ConnectorsManager>;
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0381
82 // Constructor and destructor are declared as private so callers use
83 // GetInstance instead.
84 ConnectorsManager();
85 ~ConnectorsManager();
86
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4587 // Validates which settings should be applied to an analysis connector event
88 // against connector policies. Cache the policy value the first time this is
89 // called for every different connector.
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2690 base::Optional<AnalysisSettings> GetAnalysisSettingsFromConnectorPolicy(
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4591 const GURL& url,
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2692 AnalysisConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4593
94 // Read and cache the policy corresponding to |connector|.
Roger Tawa445a9972020-05-20 22:44:0295 void CacheAnalysisConnectorPolicy(AnalysisConnector connector);
96 void CacheReportingConnectorPolicy(ReportingConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4597
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3698 // Sets up |pref_change_registrar_| if kEnterpriseConntorsEnabled is true.
99 // Used by the constructor and SetUpForTesting.
100 void StartObservingPrefs();
Dominique Fauteux-Chapleau045c37d2020-05-05 12:51:40101 void StartObservingPref(AnalysisConnector connector);
Roger Tawa445a9972020-05-20 22:44:02102 void StartObservingPref(ReportingConnector connector);
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36103
Dominique Fauteux-Chapleau12381552020-09-21 18:45:55104 // Validates which settings should be applied to an analysis connector event
105 // against connector policies. Cache the policy value the first time this is
106 // called for every different connector.
107 base::Optional<ReportingSettings> GetReportingSettingsFromConnectorPolicy(
108 ReportingConnector connector);
109
Dominique Fauteux-Chapleau76b366a2020-05-28 17:15:06110 // Cached values of available service providers. This information validates
111 // the Connector policies have a valid provider.
112 ServiceProviderConfig service_provider_config_ =
113 ServiceProviderConfig(kServiceProviderConfig);
114
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45115 // Cached values of the connector policies. Updated when a connector is first
116 // used or when a policy is updated.
Roger Tawa445a9972020-05-20 22:44:02117 AnalysisConnectorsSettings analysis_connector_settings_;
118 ReportingConnectorsSettings reporting_connector_settings_;
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36119
120 // Used to track changes of connector policies and propagate them in
121 // |connector_settings_|.
122 PrefChangeRegistrar pref_change_registrar_;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13123};
124
125} // namespace enterprise_connectors
126
127#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_