blob: 183add7414ad58c1eb79f5d06b1581d88f6629fa [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sync/base/sync_util.h"
#include <string_view>
#include "base/command_line.h"
#include "base/logging.h"
#include "base/strings/strcat.h"
#include "base/strings/stringize_macros.h"
#include "build/build_config.h"
#include "components/sync/base/command_line_switches.h"
#include "components/version_info/version_info.h"
#include "google_apis/gaia/gaia_config.h"
#include "ui/base/device_form_factor.h"
#include "url/gurl.h"
namespace {
// Returns string that represents system in UserAgent.
std::string GetSystemString() {
std::string system;
#if BUILDFLAG(IS_CHROMEOS)
system = "CROS ";
#elif BUILDFLAG(IS_ANDROID)
if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) {
system = "ANDROID-TABLET ";
} else {
system = "ANDROID-PHONE ";
}
#elif BUILDFLAG(IS_IOS)
if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) {
system = "IOS-TABLET ";
} else {
system = "IOS-PHONE ";
}
#elif BUILDFLAG(IS_WIN)
system = "WIN ";
#elif BUILDFLAG(IS_LINUX)
system = "LINUX ";
#elif BUILDFLAG(IS_FREEBSD)
system = "FREEBSD ";
#elif BUILDFLAG(IS_OPENBSD)
system = "OPENBSD ";
#elif BUILDFLAG(IS_MAC)
system = "MAC ";
#endif
return system;
}
} // namespace
namespace syncer {
namespace internal {
std::string FormatUserAgentForSync(const std::string& system,
version_info::Channel channel) {
#ifndef SYNC_USER_AGENT_PRODUCT
#error SYNC_USER_AGENT_PRODUCT not defined, check BUILD.gn.
#endif
constexpr std::string_view kProduct = STRINGIZE(SYNC_USER_AGENT_PRODUCT);
return base::StrCat(
{kProduct, " ", system, version_info::GetVersionNumber(), " (",
version_info::GetLastChange(), ")",
version_info::IsOfficialBuild()
? base::StrCat(
{" channel(", version_info::GetChannelString(channel), ")"})
: std::string("-devel")});
}
} // namespace internal
GURL GetSyncServiceURL(const base::CommandLine& command_line,
version_info::Channel channel) {
// Priorities for determining the sync URL:
// 1. Explicitly specified --sync-url
// 2. Specified as part of the --gaia-config
// 3. Default URL (different for Stable/Beta vs. Dev/Canary/unbranded)
// 1. Get the sync server URL from the --sync-url command-line param, if
// specified.
if (command_line.HasSwitch(kSyncServiceURL)) {
std::string value(command_line.GetSwitchValueASCII(kSyncServiceURL));
if (!value.empty()) {
GURL custom_sync_url(value);
if (custom_sync_url.is_valid()) {
return custom_sync_url;
} else {
LOG(WARNING) << "The following sync URL specified at the command-line "
<< "is invalid: " << value;
}
}
}
// 2. Get the sync server URL from the --gaia-config, if the config exists and
// contains a sync URL.
GaiaConfig* gaia_config = GaiaConfig::GetInstance();
if (gaia_config) {
GURL url;
if (gaia_config->GetURLIfExists("sync_url", &url)) {
return url;
}
}
// 3. By default, dev, canary, and unbranded Chromium users will go to the
// development servers. Development servers have more features than standard
// sync servers. Users with officially-branded Chrome stable and beta builds
// will go to the standard sync servers.
if (channel == version_info::Channel::STABLE ||
channel == version_info::Channel::BETA) {
return GURL(internal::kSyncServerUrl);
}
return GURL(internal::kSyncDevServerUrl);
}
std::string MakeUserAgentForSync(version_info::Channel channel) {
return internal::FormatUserAgentForSync(GetSystemString(), channel);
}
} // namespace syncer