1// Copyright 2014 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#include "chrome/browser/safe_browsing/incident_reporting/environment_data_collection.h"
6
7#include <string>
8
9#include "base/cpu.h"
10#include "base/sys_info.h"
11#include "chrome/common/chrome_version_info.h"
12#include "chrome/common/safe_browsing/csd.pb.h"
13
14namespace safe_browsing {
15
16// Populates |process| with platform-specific data related to the chrome browser
17// process.
18void CollectPlatformProcessData(
19    ClientIncidentReport_EnvironmentData_Process* process);
20
21namespace {
22
23ClientIncidentReport_EnvironmentData_Process_Channel MapChannelToProtobuf(
24    chrome::VersionInfo::Channel channel) {
25  typedef chrome::VersionInfo VersionInfo;
26  typedef ClientIncidentReport_EnvironmentData_Process Process;
27  switch (channel) {
28    case VersionInfo::CHANNEL_CANARY:
29      return Process::CHANNEL_CANARY;
30    case VersionInfo::CHANNEL_DEV:
31      return Process::CHANNEL_DEV;
32    case VersionInfo::CHANNEL_BETA:
33      return Process::CHANNEL_BETA;
34    case VersionInfo::CHANNEL_STABLE:
35      return Process::CHANNEL_STABLE;
36    default:
37      return Process::CHANNEL_UNKNOWN;
38  }
39}
40
41// Populates |process| with data related to the chrome browser process.
42void CollectProcessData(ClientIncidentReport_EnvironmentData_Process* process) {
43  chrome::VersionInfo version_info;
44  if (version_info.is_valid()) {
45    // TODO(grt): Move this logic into VersionInfo (it also appears in
46    // ChromeMetricsServiceClient).
47    std::string version(version_info.Version());
48#if defined(ARCH_CPU_64_BITS)
49    version += "-64";
50#endif  // defined(ARCH_CPU_64_BITS)
51    if (!version_info.IsOfficialBuild())
52      version += "-devel";
53    process->set_version(version);
54  }
55
56  process->set_chrome_update_channel(
57      MapChannelToProtobuf(chrome::VersionInfo::GetChannel()));
58
59  CollectPlatformProcessData(process);
60}
61
62}  // namespace
63
64void CollectEnvironmentData(ClientIncidentReport_EnvironmentData* data) {
65  // OS
66  {
67    ClientIncidentReport_EnvironmentData_OS* os = data->mutable_os();
68    os->set_os_name(base::SysInfo::OperatingSystemName());
69    os->set_os_version(base::SysInfo::OperatingSystemVersion());
70  }
71
72  // Machine
73  {
74    base::CPU cpu_info;
75    ClientIncidentReport_EnvironmentData_Machine* machine =
76        data->mutable_machine();
77    machine->set_cpu_architecture(base::SysInfo::OperatingSystemArchitecture());
78    machine->set_cpu_vendor(cpu_info.vendor_name());
79    machine->set_cpuid(cpu_info.signature());
80  }
81
82  // Process
83  CollectProcessData(data->mutable_process());
84}
85
86#if !defined(OS_WIN)
87void CollectPlatformProcessData(
88    ClientIncidentReport_EnvironmentData_Process* process) {
89  // Empty implementation for platforms that do not (yet) have their own
90  // implementations.
91}
92#endif
93
94}  // namespace safe_browsing
95