blob: 8033efffca8f9f51e0e7f03fff415d47de88b33c [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
Hans Wennborgb3e433a2020-04-21 11:21:408#include <set>
9
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1310#include "base/callback_forward.h"
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4511#include "base/feature_list.h"
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1312#include "base/optional.h"
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4513#include "chrome/browser/enterprise/connectors/analysis_service_settings.h"
Dominique Fauteux-Chapleau5ae64242020-04-17 13:18:2614#include "chrome/browser/enterprise/connectors/common.h"
Roger Tawa445a9972020-05-20 22:44:0215#include "chrome/browser/enterprise/connectors/reporting_service_settings.h"
Dominique Fauteux-Chapleau76b366a2020-05-28 17:15:0616#include "chrome/browser/enterprise/connectors/service_provider_config.h"
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3617#include "components/prefs/pref_change_registrar.h"
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1318#include "url/gurl.h"
19
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0320namespace base {
21template <typename T>
22struct DefaultSingletonTraits;
23}
24
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1325namespace enterprise_connectors {
26
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4527// Controls whether the Enterprise Connectors policies should be read by
28// ConnectorsManager. Legacy policies will be read as a fallback if this feature
29// is disabled.
30extern const base::Feature kEnterpriseConnectorsEnabled;
31
Roger Tawa41fe5a92020-05-26 18:04:5632// For the moment, service provider configurations are static and only support
33// google endpoints. Therefore the configurtion is placed here directly.
34// Once the configuation becomes more dynamic this static string will be
35// removed and replaced with a service to keep it up to date.
36extern const char kServiceProviderConfig[];
37
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1338// Manages access to Connector policies. This class is responsible for caching
39// the Connector policies, validate them against approved service providers and
40// provide a simple interface to them.
41class ConnectorsManager {
42 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
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0349 static ConnectorsManager* GetInstance();
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1350
Roger Tawa445a9972020-05-20 22:44:0251 // Validates which settings should be applied to a reporting event
52 // against cached policies. This function will prioritize new connector
53 // policies over legacy ones if they are set.
54 base::Optional<ReportingSettings> GetReportingSettings(
55 ReportingConnector connector);
56
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1357 // Validates which settings should be applied to an analysis connector event
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4558 // against cached policies. This function will prioritize new connector
59 // policies over legacy ones if they are set.
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2660 base::Optional<AnalysisSettings> GetAnalysisSettings(
61 const GURL& url,
62 AnalysisConnector connector);
63
64 // Checks if the corresponding connector is enabled.
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0365 bool IsConnectorEnabled(AnalysisConnector connector) const;
66 bool IsConnectorEnabled(ReportingConnector connector) const;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1367
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0368 bool DelayUntilVerdict(AnalysisConnector connector);
Dominique Fauteux-Chapleauccf53092020-04-08 17:15:2869
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4570 // Public testing functions.
71 const AnalysisConnectorsSettings& GetAnalysisConnectorsSettingsForTesting()
72 const;
Roger Tawa445a9972020-05-20 22:44:0273 const ReportingConnectorsSettings& GetReportingConnectorsSettingsForTesting()
74 const;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4575
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3676 // Helpers to reset the ConnectorManager instance across test since it's a
77 // singleton that would otherwise persist its state.
78 void SetUpForTesting();
79 void TearDownForTesting();
Dominique Fauteux-Chapleau6f15fae2020-05-26 18:25:3580 void ClearCacheForTesting();
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3681
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1382 private:
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0383 friend struct base::DefaultSingletonTraits<ConnectorsManager>;
84
85 // Constructor and destructor are declared as private so callers use
86 // GetInstance instead.
87 ConnectorsManager();
88 ~ConnectorsManager();
89
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4590 // Validates which settings should be applied to an analysis connector event
91 // against connector policies. Cache the policy value the first time this is
92 // called for every different connector.
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2693 base::Optional<AnalysisSettings> GetAnalysisSettingsFromConnectorPolicy(
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4594 const GURL& url,
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2695 AnalysisConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4596
97 // Read and cache the policy corresponding to |connector|.
Roger Tawa445a9972020-05-20 22:44:0298 void CacheAnalysisConnectorPolicy(AnalysisConnector connector);
99 void CacheReportingConnectorPolicy(ReportingConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45100
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36101 // Sets up |pref_change_registrar_| if kEnterpriseConntorsEnabled is true.
102 // Used by the constructor and SetUpForTesting.
103 void StartObservingPrefs();
Dominique Fauteux-Chapleau045c37d2020-05-05 12:51:40104 void StartObservingPref(AnalysisConnector connector);
Roger Tawa445a9972020-05-20 22:44:02105 void StartObservingPref(ReportingConnector connector);
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36106
Dominique Fauteux-Chapleauccf53092020-04-08 17:15:28107 // Private legacy functions.
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13108 // These functions are used to interact with legacy policies and should stay
109 // private. They should be removed once legacy policies are deprecated.
110
111 // Returns analysis settings based on legacy policies.
112 base::Optional<AnalysisSettings> GetAnalysisSettingsFromLegacyPolicies(
113 const GURL& url,
114 AnalysisConnector connector) const;
115
116 BlockUntilVerdict LegacyBlockUntilVerdict(bool upload) const;
117 bool LegacyBlockPasswordProtectedFiles(bool upload) const;
118 bool LegacyBlockLargeFiles(bool upload) const;
119 bool LegacyBlockUnsupportedFileTypes(bool upload) const;
120
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:03121 // Functions that check a url against the corresponding URL patterns policies.
122 bool MatchURLAgainstLegacyDlpPolicies(const GURL& url, bool upload) const;
123 bool MatchURLAgainstLegacyMalwarePolicies(const GURL& url, bool upload) const;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13124 std::set<std::string> MatchURLAgainstLegacyPolicies(const GURL& url,
125 bool upload) const;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45126
Roger Tawa445a9972020-05-20 22:44:02127 // Validates which settings should be applied to an analysis connector event
128 // against connector policies. Cache the policy value the first time this is
129 // called for every different connector.
130 base::Optional<ReportingSettings> GetReportingSettingsFromConnectorPolicy(
131 ReportingConnector connector);
132
133 // Returns reporting settings based on legacy policies.
134 base::Optional<ReportingSettings> GetReportingSettingsFromLegacyPolicies(
135 ReportingConnector connector) const;
136
Dominique Fauteux-Chapleau76b366a2020-05-28 17:15:06137 // Cached values of available service providers. This information validates
138 // the Connector policies have a valid provider.
139 ServiceProviderConfig service_provider_config_ =
140 ServiceProviderConfig(kServiceProviderConfig);
141
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45142 // Cached values of the connector policies. Updated when a connector is first
143 // used or when a policy is updated.
Roger Tawa445a9972020-05-20 22:44:02144 AnalysisConnectorsSettings analysis_connector_settings_;
145 ReportingConnectorsSettings reporting_connector_settings_;
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36146
147 // Used to track changes of connector policies and propagate them in
148 // |connector_settings_|.
149 PrefChangeRegistrar pref_change_registrar_;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13150};
151
152} // namespace enterprise_connectors
153
154#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_