blob: fc52dd20d24b6ce87058edef0563ae1a739bc954 [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-Chapleau29775702020-04-30 15:50:3616#include "components/prefs/pref_change_registrar.h"
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1317#include "url/gurl.h"
18
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0319namespace base {
20template <typename T>
21struct DefaultSingletonTraits;
22}
23
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1324namespace enterprise_connectors {
25
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4526// Controls whether the Enterprise Connectors policies should be read by
27// ConnectorsManager. Legacy policies will be read as a fallback if this feature
28// is disabled.
29extern const base::Feature kEnterpriseConnectorsEnabled;
30
Roger Tawa41fe5a92020-05-26 18:04:5631// For the moment, service provider configurations are static and only support
32// google endpoints. Therefore the configurtion is placed here directly.
33// Once the configuation becomes more dynamic this static string will be
34// removed and replaced with a service to keep it up to date.
35extern const char kServiceProviderConfig[];
36
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1337// Manages access to Connector policies. This class is responsible for caching
38// the Connector policies, validate them against approved service providers and
39// provide a simple interface to them.
40class ConnectorsManager {
41 public:
Roger Tawa445a9972020-05-20 22:44:0242 // Maps used to cache connectors settings.
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4543 using AnalysisConnectorsSettings =
44 std::map<AnalysisConnector, std::vector<AnalysisServiceSettings>>;
Roger Tawa445a9972020-05-20 22:44:0245 using ReportingConnectorsSettings =
46 std::map<ReportingConnector, std::vector<ReportingServiceSettings>>;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4547
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0348 static ConnectorsManager* GetInstance();
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1349
Roger Tawa445a9972020-05-20 22:44:0250 // Validates which settings should be applied to a reporting event
51 // against cached policies. This function will prioritize new connector
52 // policies over legacy ones if they are set.
53 base::Optional<ReportingSettings> GetReportingSettings(
54 ReportingConnector connector);
55
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1356 // Validates which settings should be applied to an analysis connector event
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4557 // against cached policies. This function will prioritize new connector
58 // policies over legacy ones if they are set.
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2659 base::Optional<AnalysisSettings> GetAnalysisSettings(
60 const GURL& url,
61 AnalysisConnector connector);
62
63 // Checks if the corresponding connector is enabled.
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0364 bool IsConnectorEnabled(AnalysisConnector connector) const;
65 bool IsConnectorEnabled(ReportingConnector connector) const;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1366
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0367 bool DelayUntilVerdict(AnalysisConnector connector);
Dominique Fauteux-Chapleauccf53092020-04-08 17:15:2868
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4569 // Public testing functions.
70 const AnalysisConnectorsSettings& GetAnalysisConnectorsSettingsForTesting()
71 const;
Roger Tawa445a9972020-05-20 22:44:0272 const ReportingConnectorsSettings& GetReportingConnectorsSettingsForTesting()
73 const;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4574
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3675 // Helpers to reset the ConnectorManager instance across test since it's a
76 // singleton that would otherwise persist its state.
77 void SetUpForTesting();
78 void TearDownForTesting();
Dominique Fauteux-Chapleau6f15fae2020-05-26 18:25:3579 void ClearCacheForTesting();
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3680
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1381 private:
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0382 friend struct base::DefaultSingletonTraits<ConnectorsManager>;
83
84 // Constructor and destructor are declared as private so callers use
85 // GetInstance instead.
86 ConnectorsManager();
87 ~ConnectorsManager();
88
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4589 // Validates which settings should be applied to an analysis connector event
90 // against connector policies. Cache the policy value the first time this is
91 // called for every different connector.
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2692 base::Optional<AnalysisSettings> GetAnalysisSettingsFromConnectorPolicy(
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4593 const GURL& url,
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2694 AnalysisConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4595
96 // Read and cache the policy corresponding to |connector|.
Roger Tawa445a9972020-05-20 22:44:0297 void CacheAnalysisConnectorPolicy(AnalysisConnector connector);
98 void CacheReportingConnectorPolicy(ReportingConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4599
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36100 // Sets up |pref_change_registrar_| if kEnterpriseConntorsEnabled is true.
101 // Used by the constructor and SetUpForTesting.
102 void StartObservingPrefs();
Dominique Fauteux-Chapleau045c37d2020-05-05 12:51:40103 void StartObservingPref(AnalysisConnector connector);
Roger Tawa445a9972020-05-20 22:44:02104 void StartObservingPref(ReportingConnector connector);
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36105
Dominique Fauteux-Chapleauccf53092020-04-08 17:15:28106 // Private legacy functions.
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13107 // These functions are used to interact with legacy policies and should stay
108 // private. They should be removed once legacy policies are deprecated.
109
110 // Returns analysis settings based on legacy policies.
111 base::Optional<AnalysisSettings> GetAnalysisSettingsFromLegacyPolicies(
112 const GURL& url,
113 AnalysisConnector connector) const;
114
115 BlockUntilVerdict LegacyBlockUntilVerdict(bool upload) const;
116 bool LegacyBlockPasswordProtectedFiles(bool upload) const;
117 bool LegacyBlockLargeFiles(bool upload) const;
118 bool LegacyBlockUnsupportedFileTypes(bool upload) const;
119
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:03120 // Functions that check a url against the corresponding URL patterns policies.
121 bool MatchURLAgainstLegacyDlpPolicies(const GURL& url, bool upload) const;
122 bool MatchURLAgainstLegacyMalwarePolicies(const GURL& url, bool upload) const;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13123 std::set<std::string> MatchURLAgainstLegacyPolicies(const GURL& url,
124 bool upload) const;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45125
Roger Tawa445a9972020-05-20 22:44:02126 // Validates which settings should be applied to an analysis connector event
127 // against connector policies. Cache the policy value the first time this is
128 // called for every different connector.
129 base::Optional<ReportingSettings> GetReportingSettingsFromConnectorPolicy(
130 ReportingConnector connector);
131
132 // Returns reporting settings based on legacy policies.
133 base::Optional<ReportingSettings> GetReportingSettingsFromLegacyPolicies(
134 ReportingConnector connector) const;
135
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45136 // Cached values of the connector policies. Updated when a connector is first
137 // used or when a policy is updated.
Roger Tawa445a9972020-05-20 22:44:02138 AnalysisConnectorsSettings analysis_connector_settings_;
139 ReportingConnectorsSettings reporting_connector_settings_;
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36140
141 // Used to track changes of connector policies and propagate them in
142 // |connector_settings_|.
143 PrefChangeRegistrar pref_change_registrar_;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13144};
145
146} // namespace enterprise_connectors
147
148#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_