blob: c44c850d9015bde9f364eaf90141724f1d8ec6bb [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
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1331// Manages access to Connector policies. This class is responsible for caching
32// the Connector policies, validate them against approved service providers and
33// provide a simple interface to them.
34class ConnectorsManager {
35 public:
Roger Tawa445a9972020-05-20 22:44:0236 // Maps used to cache connectors settings.
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4537 using AnalysisConnectorsSettings =
38 std::map<AnalysisConnector, std::vector<AnalysisServiceSettings>>;
Roger Tawa445a9972020-05-20 22:44:0239 using ReportingConnectorsSettings =
40 std::map<ReportingConnector, std::vector<ReportingServiceSettings>>;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4541
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0342 static ConnectorsManager* GetInstance();
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1343
Roger Tawa445a9972020-05-20 22:44:0244 // Validates which settings should be applied to a reporting event
45 // against cached policies. This function will prioritize new connector
46 // policies over legacy ones if they are set.
47 base::Optional<ReportingSettings> GetReportingSettings(
48 ReportingConnector connector);
49
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1350 // Validates which settings should be applied to an analysis connector event
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4551 // against cached policies. This function will prioritize new connector
52 // policies over legacy ones if they are set.
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2653 base::Optional<AnalysisSettings> GetAnalysisSettings(
54 const GURL& url,
55 AnalysisConnector connector);
56
57 // Checks if the corresponding connector is enabled.
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0358 bool IsConnectorEnabled(AnalysisConnector connector) const;
59 bool IsConnectorEnabled(ReportingConnector connector) const;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1360
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:0361 bool DelayUntilVerdict(AnalysisConnector connector);
Dominique Fauteux-Chapleauccf53092020-04-08 17:15:2862
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4563 // Public testing functions.
64 const AnalysisConnectorsSettings& GetAnalysisConnectorsSettingsForTesting()
65 const;
Roger Tawa445a9972020-05-20 22:44:0266 const ReportingConnectorsSettings& GetReportingConnectorsSettingsForTesting()
67 const;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4568
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3669 // Helpers to reset the ConnectorManager instance across test since it's a
70 // singleton that would otherwise persist its state.
71 void SetUpForTesting();
72 void TearDownForTesting();
73
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:1374 private:
Dominique Fauteux-Chapleau8cf113f12020-04-08 18:14:0375 friend struct base::DefaultSingletonTraits<ConnectorsManager>;
76
77 // Constructor and destructor are declared as private so callers use
78 // GetInstance instead.
79 ConnectorsManager();
80 ~ConnectorsManager();
81
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4582 // Validates which settings should be applied to an analysis connector event
83 // against connector policies. Cache the policy value the first time this is
84 // called for every different connector.
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2685 base::Optional<AnalysisSettings> GetAnalysisSettingsFromConnectorPolicy(
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4586 const GURL& url,
Dominique Fauteux-Chapleauc08c8c962020-05-07 18:46:2687 AnalysisConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4588
89 // Read and cache the policy corresponding to |connector|.
Roger Tawa445a9972020-05-20 22:44:0290 void CacheAnalysisConnectorPolicy(AnalysisConnector connector);
91 void CacheReportingConnectorPolicy(ReportingConnector connector);
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:4592
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3693 // Sets up |pref_change_registrar_| if kEnterpriseConntorsEnabled is true.
94 // Used by the constructor and SetUpForTesting.
95 void StartObservingPrefs();
Dominique Fauteux-Chapleau045c37d2020-05-05 12:51:4096 void StartObservingPref(AnalysisConnector connector);
Roger Tawa445a9972020-05-20 22:44:0297 void StartObservingPref(ReportingConnector connector);
Dominique Fauteux-Chapleau29775702020-04-30 15:50:3698
Dominique Fauteux-Chapleauccf53092020-04-08 17:15:2899 // Private legacy functions.
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13100 // These functions are used to interact with legacy policies and should stay
101 // private. They should be removed once legacy policies are deprecated.
102
103 // Returns analysis settings based on legacy policies.
104 base::Optional<AnalysisSettings> GetAnalysisSettingsFromLegacyPolicies(
105 const GURL& url,
106 AnalysisConnector connector) const;
107
108 BlockUntilVerdict LegacyBlockUntilVerdict(bool upload) const;
109 bool LegacyBlockPasswordProtectedFiles(bool upload) const;
110 bool LegacyBlockLargeFiles(bool upload) const;
111 bool LegacyBlockUnsupportedFileTypes(bool upload) const;
112
Dominique Fauteux-Chapleauadf0b112020-05-25 13:24:03113 // Functions that check a url against the corresponding URL patterns policies.
114 bool MatchURLAgainstLegacyDlpPolicies(const GURL& url, bool upload) const;
115 bool MatchURLAgainstLegacyMalwarePolicies(const GURL& url, bool upload) const;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13116 std::set<std::string> MatchURLAgainstLegacyPolicies(const GURL& url,
117 bool upload) const;
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45118
Roger Tawa445a9972020-05-20 22:44:02119 // Validates which settings should be applied to an analysis connector event
120 // against connector policies. Cache the policy value the first time this is
121 // called for every different connector.
122 base::Optional<ReportingSettings> GetReportingSettingsFromConnectorPolicy(
123 ReportingConnector connector);
124
125 // Returns reporting settings based on legacy policies.
126 base::Optional<ReportingSettings> GetReportingSettingsFromLegacyPolicies(
127 ReportingConnector connector) const;
128
Dominique Fauteux-Chapleaucb08fe42020-04-23 19:57:45129 // Cached values of the connector policies. Updated when a connector is first
130 // used or when a policy is updated.
Roger Tawa445a9972020-05-20 22:44:02131 AnalysisConnectorsSettings analysis_connector_settings_;
132 ReportingConnectorsSettings reporting_connector_settings_;
Dominique Fauteux-Chapleau29775702020-04-30 15:50:36133
134 // Used to track changes of connector policies and propagate them in
135 // |connector_settings_|.
136 PrefChangeRegistrar pref_change_registrar_;
Dominique Fauteux-Chapleauc2d0a172020-04-01 20:04:13137};
138
139} // namespace enterprise_connectors
140
141#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONNECTORS_MANAGER_H_