Use Chrome to provide remote logging permission
The Google-branded updater should use stable Chrome to infer remote
logging opt-in. Inject the permission provides as an external constant
so that it may be overridden in integration tests.
Bug: 371595849
Change-Id: Icc2c4f68d06d2bffa8543fab8292146382ea421e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6612962
Commit-Queue: Noah Rose Ledesma <[email protected]>
Reviewed-by: Joshua Pawlicki <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1468771}
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn
index e8716897..4582e54 100644
--- a/chrome/updater/BUILD.gn
+++ b/chrome/updater/BUILD.gn
@@ -474,6 +474,7 @@
":branding_header",
":constants_header",
"//base",
+ "//build:branding_buildflags",
"//components/crx_file",
"//url",
]
diff --git a/chrome/updater/apply_updater_branding.gni b/chrome/updater/apply_updater_branding.gni
index 5a45eeca..c8c7527 100644
--- a/chrome/updater/apply_updater_branding.gni
+++ b/chrome/updater/apply_updater_branding.gni
@@ -21,6 +21,8 @@
"-e",
"BROWSER_PRODUCT_NAME=\"$browser_product_name\"",
"-e",
+ "BROWSER_APPID=\"$browser_appid\"",
+ "-e",
"COMPANY_FULLNAME=\"$updater_company_full_name\"",
"-e",
"COMPANY_SHORTNAME=\"$updater_company_short_name\"",
diff --git a/chrome/updater/branding.gni b/chrome/updater/branding.gni
index d9e28c39..43539ce 100644
--- a/chrome/updater/branding.gni
+++ b/chrome/updater/branding.gni
@@ -32,6 +32,7 @@
updater_metainstaller_name = "Chromium Installer"
mac_team_identifier = "PLACEHOLDER"
updater_appid = "{6e8ffa8f-e7e2-4000-9884-589283c27015}"
+ browser_appid = "{5d8d08af-2df9-4da2-86c1-eac353a0ca32}"
qualification_appid = "{43f3a046-04b3-4443-a770-d67dae90e440}"
legacy_service_name_prefix = "cupdate"
prefs_access_mutex = "{A6B9ECD5-772A-4D3F-BFEB-CF9340534A3E}"
diff --git a/chrome/updater/constants.h b/chrome/updater/constants.h
index 150a6c4..a84b5a6 100644
--- a/chrome/updater/constants.h
+++ b/chrome/updater/constants.h
@@ -5,6 +5,8 @@
#ifndef CHROME_UPDATER_CONSTANTS_H_
#define CHROME_UPDATER_CONSTANTS_H_
+#include <optional>
+
#include "base/time/time.h"
#include "build/build_config.h"
#include "components/update_client/update_client_errors.h"
@@ -261,6 +263,8 @@
"crx_verifier_format";
inline constexpr char kDevOverrideKeyMinumumEventLoggingCooldownSeconds[] =
"minimum_event_logging_cooldown_seconds";
+inline constexpr char kDevOverrideKeyEventLoggingPermissionProvider[] =
+ "event_logging_permission_provider";
inline constexpr char kDevOverrideKeyDictPolicies[] = "dict_policies";
// TODO(crbug.com/389965546): remove this once the checked-in old updater builds
diff --git a/chrome/updater/external_constants.h b/chrome/updater/external_constants.h
index bbc5966..c3c459b 100644
--- a/chrome/updater/external_constants.h
+++ b/chrome/updater/external_constants.h
@@ -60,6 +60,13 @@
// Minimum amount of time between successive event logging transmissions.
virtual base::TimeDelta MinimumEventLoggingCooldown() const = 0;
+ // Indicates which application remote event logging permissions should be
+ // inferred from. Nullopt indicates that logging is unconditionally disabled.
+ // The meaning of the provider is platform specific; on macOS it is the
+ // basename of an application directory, on Windows it is an AppId.
+ virtual std::optional<std::string> GetEventLoggingPermissionProvider()
+ const = 0;
+
// Policies for the `PolicyManager` surfaced by external constants.
virtual base::Value::Dict DictPolicies() const = 0;
diff --git a/chrome/updater/external_constants_default.cc b/chrome/updater/external_constants_default.cc
index 551de40..690899d 100644
--- a/chrome/updater/external_constants_default.cc
+++ b/chrome/updater/external_constants_default.cc
@@ -10,6 +10,8 @@
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "base/values.h"
+#include "build/branding_buildflags.h"
+#include "build/build_config.h"
#include "chrome/updater/constants.h"
#include "chrome/updater/external_constants.h"
#include "chrome/updater/updater_branding.h"
@@ -68,6 +70,17 @@
return kMinimumEventLoggingCooldown;
}
+ std::optional<std::string> GetEventLoggingPermissionProvider()
+ const override {
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_MAC)
+ return BROWSER_NAME_STRING;
+#elif BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_WIN)
+ return BROWSER_APP_ID;
+#else
+ return std::nullopt;
+#endif
+ }
+
private:
~DefaultExternalConstants() override = default;
};
diff --git a/chrome/updater/external_constants_override.cc b/chrome/updater/external_constants_override.cc
index 47e5dc7..7e952a1 100644
--- a/chrome/updater/external_constants_override.cc
+++ b/chrome/updater/external_constants_override.cc
@@ -214,6 +214,22 @@
return base::Seconds(minimum_event_logging_cooldown_seconds->GetInt());
}
+std::optional<std::string>
+ExternalConstantsOverrider::GetEventLoggingPermissionProvider() const {
+ if (!override_values_.contains(
+ kDevOverrideKeyEventLoggingPermissionProvider)) {
+ return next_provider_->GetEventLoggingPermissionProvider();
+ }
+
+ const base::Value* event_logging_permission_provider =
+ override_values_.Find(kDevOverrideKeyEventLoggingPermissionProvider);
+ CHECK(event_logging_permission_provider->is_string())
+ << "Unexpected type of override["
+ << kDevOverrideKeyEventLoggingPermissionProvider << "]: "
+ << base::Value::GetTypeName(event_logging_permission_provider->type());
+ return event_logging_permission_provider->GetString();
+}
+
base::Value::Dict ExternalConstantsOverrider::DictPolicies() const {
if (!override_values_.contains(kDevOverrideKeyDictPolicies)) {
return next_provider_->DictPolicies();
diff --git a/chrome/updater/external_constants_override.h b/chrome/updater/external_constants_override.h
index be03c71..9757fea 100644
--- a/chrome/updater/external_constants_override.h
+++ b/chrome/updater/external_constants_override.h
@@ -56,6 +56,7 @@
base::TimeDelta ServerKeepAliveTime() const override;
crx_file::VerifierFormat CrxVerifierFormat() const override;
base::TimeDelta MinimumEventLoggingCooldown() const override;
+ std::optional<std::string> GetEventLoggingPermissionProvider() const override;
base::Value::Dict DictPolicies() const override;
base::TimeDelta OverinstallTimeout() const override;
base::TimeDelta IdleCheckPeriod() const override;
diff --git a/chrome/updater/update_usage_stats_task.h b/chrome/updater/update_usage_stats_task.h
index 845061b1..0ffc409 100644
--- a/chrome/updater/update_usage_stats_task.h
+++ b/chrome/updater/update_usage_stats_task.h
@@ -39,14 +39,16 @@
// Returns true if the updater is allowed to send detailed event logs to an
// external endpoint. Logging is allowed only if the following conditions are
// all met:
-// 1) The updater manages an app (an "event logging permission provider")
+// 1) The updater manages an app (an `event_logging_permission_provider`)
// responsible for granting the updater permission to send remote
// logging events.
-// 2) The event logging permission provider app has usage stats enabled.
+// 2) The `event_logging_permission_provider` app has usage stats enabled.
// 3) The updater manages no other apps. That is, the apps managed by the
// updater are a subset of {Updater, Enterprise Companion App,
-// _event logging permission provider_}.
-bool RemoteEventLoggingAllowed(UpdaterScope scope);
+// `event_logging_permission_provider`}.
+bool RemoteEventLoggingAllowed(
+ UpdaterScope scope,
+ std::optional<std::string> event_logging_permission_provider);
#if BUILDFLAG(IS_MAC)
bool AnyAppEnablesUsageStats(
diff --git a/chrome/updater/update_usage_stats_task_linux.cc b/chrome/updater/update_usage_stats_task_linux.cc
index 954f21d..1391bdad 100644
--- a/chrome/updater/update_usage_stats_task_linux.cc
+++ b/chrome/updater/update_usage_stats_task_linux.cc
@@ -5,6 +5,7 @@
#include "chrome/updater/update_usage_stats_task.h"
#include <memory>
+#include <optional>
#include <utility>
#include "base/functional/bind.h"
@@ -20,7 +21,7 @@
return false;
}
-bool RemoteEventLoggingAllowed(UpdaterScope) {
+bool RemoteEventLoggingAllowed(UpdaterScope, std::optional<std::string>) {
return false;
}
diff --git a/chrome/updater/update_usage_stats_task_mac.mm b/chrome/updater/update_usage_stats_task_mac.mm
index 7b3d902a..a0c96626 100644
--- a/chrome/updater/update_usage_stats_task_mac.mm
+++ b/chrome/updater/update_usage_stats_task_mac.mm
@@ -15,6 +15,7 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "chrome/enterprise_companion/installer_paths.h"
+#include "chrome/updater/external_constants.h"
#include "chrome/updater/updater_branding.h"
#include "chrome/updater/updater_scope.h"
#include "chrome/updater/util/mac_util.h"
@@ -102,11 +103,12 @@
GetApplicationSupportDirectoriesForUsers(scope));
}
-bool RemoteEventLoggingAllowed(UpdaterScope scope) {
- // TODO(crbug.com/371595849): Inject the permission provider.
+bool RemoteEventLoggingAllowed(
+ UpdaterScope scope,
+ std::optional<std::string> event_logging_permission_provider) {
return RemoteEventLoggingAllowed(
GetApplicationSupportDirectoriesForUsers(scope),
- /*event_logging_permission_provider=*/std::nullopt);
+ std::move(event_logging_permission_provider));
}
} // namespace updater
diff --git a/chrome/updater/update_usage_stats_task_unittest.cc b/chrome/updater/update_usage_stats_task_unittest.cc
index 2034f10c..54a6e546 100644
--- a/chrome/updater/update_usage_stats_task_unittest.cc
+++ b/chrome/updater/update_usage_stats_task_unittest.cc
@@ -173,7 +173,7 @@
#if BUILDFLAG(IS_LINUX)
TEST_F(UpdateUsageStatsTaskTest, LinuxAlwaysFalse) {
ASSERT_FALSE(AnyAppEnablesUsageStats(scope_));
- ASSERT_FALSE(RemoteEventLoggingAllowed(scope_));
+ ASSERT_FALSE(RemoteEventLoggingAllowed(scope_, fake_permission_provider_));
}
#else
diff --git a/chrome/updater/update_usage_stats_task_win.cc b/chrome/updater/update_usage_stats_task_win.cc
index 667bdac..dd1eea6 100644
--- a/chrome/updater/update_usage_stats_task_win.cc
+++ b/chrome/updater/update_usage_stats_task_win.cc
@@ -17,6 +17,7 @@
#include "base/win/registry.h"
#include "base/win/windows_types.h"
#include "chrome/updater/app/app_utils.h"
+#include "chrome/updater/external_constants.h"
#include "chrome/updater/persisted_data.h"
#include "chrome/updater/updater_scope.h"
#include "chrome/updater/util/win_util.h"
@@ -109,11 +110,12 @@
GetClientStatePathsForScope(scope));
}
-bool RemoteEventLoggingAllowed(UpdaterScope scope) {
- // TODO(crbug.com/371595849): Inject the permission provider.
+bool RemoteEventLoggingAllowed(
+ UpdaterScope scope,
+ std::optional<std::string> event_logging_permission_provider) {
return RemoteEventLoggingAllowed(
UpdaterScopeToHKeyRoot(scope), GetClientStatePathsForScope(scope),
- /*event_logging_permission_provider=*/std::nullopt);
+ std::move(event_logging_permission_provider));
}
} // namespace updater
diff --git a/chrome/updater/updater_branding.h.in b/chrome/updater/updater_branding.h.in
index 109e64fd..fa282e9d 100644
--- a/chrome/updater/updater_branding.h.in
+++ b/chrome/updater/updater_branding.h.in
@@ -5,6 +5,7 @@
// Branding Information
#define BROWSER_NAME_STRING "@BROWSER_NAME@"
#define BROWSER_PRODUCT_NAME_STRING "@BROWSER_PRODUCT_NAME@"
+#define BROWSER_APP_ID "@BROWSER_APP_ID@"
#define COMPANY_SHORTNAME_STRING "@COMPANY_SHORTNAME@"
#define COMPANY_SHORTNAME_LOWERCASE_STRING "@COMPANY_SHORTNAME_LOWERCASE@"
#define COMPANY_SHORTNAME_UPPERCASE_STRING "@COMPANY_SHORTNAME_UPPERCASE@"