From c153fafb306d118a610d1a0acc55b54c564ae87d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCri=20Valdmann?= Date: Thu, 13 Aug 2020 15:12:32 +0200 Subject: Fix invalid dbus bus name error in MPRIS Task-number: QTBUG-85626 Change-Id: I67544564d352d86d559cac21448a78ea4de38cb8 Reviewed-by: Allan Sandfeld Jensen --- .../linux/system_media_controls_linux.cc | 23 ++++++++++++++++++---- chromium/dbus/string_util.cc | 16 +++++++++++++++ chromium/dbus/string_util.h | 3 +++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/chromium/components/system_media_controls/linux/system_media_controls_linux.cc b/chromium/components/system_media_controls/linux/system_media_controls_linux.cc index fcaa2fbca0e..5e136979537 100644 --- a/chromium/components/system_media_controls/linux/system_media_controls_linux.cc +++ b/chromium/components/system_media_controls/linux/system_media_controls_linux.cc @@ -25,6 +25,7 @@ #include "dbus/message.h" #include "dbus/object_path.h" #include "dbus/property.h" +#include "dbus/string_util.h" #include "media/audio/audio_manager.h" namespace system_media_controls { @@ -43,6 +44,14 @@ namespace { constexpr int kNumMethodsToExport = 11; +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +const char kMprisAPIServiceNameFallback[] = + "chrome"; +#else +const char kMprisAPIServiceNameFallback[] = + "chromium"; +#endif + } // namespace const char kMprisAPIServiceNamePrefix[] = @@ -57,11 +66,17 @@ SystemMediaControlsLinux* SystemMediaControlsLinux::GetInstance() { return base::Singleton::get(); } +static std::string MakeServiceName() { + std::string baseName = media::AudioManager::GetGlobalAppName(); + if (baseName.size() > 100 || !dbus::IsValidServiceNameElement(baseName)) + baseName = kMprisAPIServiceNameFallback; + return std::string(kMprisAPIServiceNamePrefix) + baseName + + std::string(".instance") + + base::NumberToString(base::Process::Current().Pid()); +} + SystemMediaControlsLinux::SystemMediaControlsLinux() - : service_name_(std::string(kMprisAPIServiceNamePrefix) + - base::ToLowerASCII(media::AudioManager::GetGlobalAppName()) + - std::string(".instance") + - base::NumberToString(base::Process::Current().Pid())) + : service_name_(MakeServiceName()) { } diff --git a/chromium/dbus/string_util.cc b/chromium/dbus/string_util.cc index 7f71015c480..bb2087bee8e 100644 --- a/chromium/dbus/string_util.cc +++ b/chromium/dbus/string_util.cc @@ -45,4 +45,20 @@ bool IsValidObjectPath(const std::string& value) { return true; } +bool IsValidServiceNameElement(const std::string& value) { + if (value.empty()) + return false; + for (size_t i = 0; i < value.size(); ++i) { + const char c = value[i]; + // Each element must only contain "[A-Z][a-z][0-9]_-", but can not start with a digit. + const bool is_valid_character = + ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || + (i > 0 && '0' <= c && c <= '9') || c == '_' || c == '-'; + if (!is_valid_character) + return false; + } + + return true; +} + } // namespace dbus diff --git a/chromium/dbus/string_util.h b/chromium/dbus/string_util.h index 60c02d17418..454b14e5fb6 100644 --- a/chromium/dbus/string_util.h +++ b/chromium/dbus/string_util.h @@ -14,6 +14,9 @@ namespace dbus { // Returns true if the specified string is a valid object path. CHROME_DBUS_EXPORT bool IsValidObjectPath(const std::string& value); +// Returns true if the specified string is a valid element of a service name. +CHROME_DBUS_EXPORT bool IsValidServiceNameElement(const std::string& value); + } // namespace dbus #endif // DBUS_STRING_UTIL_H_ -- cgit v1.2.1