connection_manager.cc revision efb7c4c605440fdc6297deed8fa9d1aecb77235e
14348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Use of this source code is governed by a BSD-style license that can be
3d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// found in the LICENSE file.
4d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
54348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/connection_manager.h"
6d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
7d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <string>
8d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
94348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <base/stl_util.h>
10d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <base/string_util.h>
114348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include <chromeos/dbus/service_constants.h>
12d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <dbus/dbus-glib.h>
13d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include <glib.h>
14d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
15f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo#include "update_engine/prefs.h"
164348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/system_state.h"
17d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes#include "update_engine/utils.h"
18d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
194348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing std::set;
20d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesusing std::string;
21d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
22d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesnamespace chromeos_update_engine {
23d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
24d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesnamespace {
25d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
26d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Gets the DbusGProxy for FlimFlam. Must be free'd with ProxyUnref()
27d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesbool GetFlimFlamProxy(DbusGlibInterface* dbus_iface,
28d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                      const char* path,
29d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                      const char* interface,
30d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                      DBusGProxy** out_proxy) {
31d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  DBusGConnection* bus;
32d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  DBusGProxy* proxy;
33d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GError* error = NULL;
34d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
35d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bus = dbus_iface->BusGet(DBUS_BUS_SYSTEM, &error);
36d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (!bus) {
37d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    LOG(ERROR) << "Failed to get system bus";
38d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return false;
39d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
40d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  proxy = dbus_iface->ProxyNewForNameOwner(bus,
414348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                           flimflam::kFlimflamServiceName,
42d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           path,
43d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           interface,
44d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           &error);
45d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (!proxy) {
46d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    LOG(ERROR) << "Error getting FlimFlam proxy: "
47a0b9e777e2c571546bd6ab55356acb023834cbc3Darin Petkov               << utils::GetAndFreeGError(&error);
48d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return false;
49d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
50d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  *out_proxy = proxy;
51d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return true;
52d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
53d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
54d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// On success, caller owns the GHashTable at out_hash_table.
55d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Returns true on success.
56d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesbool GetProperties(DbusGlibInterface* dbus_iface,
57d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                   const char* path,
58d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                   const char* interface,
59d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                   GHashTable** out_hash_table) {
60d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  DBusGProxy* proxy;
61d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GError* error = NULL;
62d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
63d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetFlimFlamProxy(dbus_iface,
64d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                         path,
65d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                         interface,
66d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                         &proxy));
67d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
68d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  gboolean rc = dbus_iface->ProxyCall(proxy,
69d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      "GetProperties",
70d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      &error,
71d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      G_TYPE_INVALID,
72d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      dbus_g_type_get_map("GHashTable",
73d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                                          G_TYPE_STRING,
74d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                                          G_TYPE_VALUE),
75d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      out_hash_table,
76d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      G_TYPE_INVALID);
77d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  dbus_iface->ProxyUnref(proxy);
78d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (rc == FALSE) {
79d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    LOG(ERROR) << "dbus_g_proxy_call failed";
80d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return false;
81d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
82d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
83d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return true;
84d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
85d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
86d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Returns (via out_path) the default network path, or empty string if
87d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// there's no network up.
88d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes// Returns true on success.
89d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesbool GetDefaultServicePath(DbusGlibInterface* dbus_iface, string* out_path) {
90d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GHashTable* hash_table = NULL;
91d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
92d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetProperties(dbus_iface,
934348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                      flimflam::kFlimflamServicePath,
944348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                      flimflam::kFlimflamManagerInterface,
95d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      &hash_table));
96d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
97d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GValue* value = reinterpret_cast<GValue*>(g_hash_table_lookup(hash_table,
98d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                                                "Services"));
99d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GArray* array = NULL;
100d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool success = false;
10188226ff9674d5d6250a0c919082e9bd1c93c35bfmukesh agrawal  if (G_VALUE_HOLDS(value, DBUS_TYPE_G_OBJECT_PATH_ARRAY) &&
102d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes      (array = reinterpret_cast<GArray*>(g_value_get_boxed(value))) &&
103d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes      (array->len > 0)) {
104d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    *out_path = g_array_index(array, const char*, 0);
105d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    success = true;
106d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
10788226ff9674d5d6250a0c919082e9bd1c93c35bfmukesh agrawal
108d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  g_hash_table_unref(hash_table);
109d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return success;
110d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
111d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
112d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los ReyesNetworkConnectionType ParseConnectionType(const char* type_str) {
1134348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  if (!strcmp(type_str, flimflam::kTypeEthernet)) {
114d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetEthernet;
1154348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  } else if (!strcmp(type_str, flimflam::kTypeWifi)) {
116d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetWifi;
1174348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  } else if (!strcmp(type_str, flimflam::kTypeWimax)) {
118d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetWimax;
1194348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  } else if (!strcmp(type_str, flimflam::kTypeBluetooth)) {
120d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetBluetooth;
1214348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  } else if (!strcmp(type_str, flimflam::kTypeCellular)) {
122d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return kNetCellular;
123d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
124d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return kNetUnknown;
125d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
126d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
127d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyesbool GetServicePathType(DbusGlibInterface* dbus_iface,
128d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                        const string& path,
129d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                        NetworkConnectionType* out_type) {
130d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GHashTable* hash_table = NULL;
131d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
132d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetProperties(dbus_iface,
133d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      path.c_str(),
1344348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                      flimflam::kFlimflamServiceInterface,
135d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                      &hash_table));
136d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
137d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  GValue* value = (GValue*)g_hash_table_lookup(hash_table, "Type");
138d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  const char* type_str = NULL;
139d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  bool success = false;
140d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (value != NULL && (type_str = g_value_get_string(value)) != NULL) {
141d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    *out_type = ParseConnectionType(type_str);
142d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    success = true;
143d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
144d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  g_hash_table_unref(hash_table);
145d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return success;
146d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
147d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
148d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}  // namespace {}
149d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
1504348879380222dc8c74b0976e527bf3da66ba08fJay SrinivasanConnectionManager::ConnectionManager(SystemState *system_state)
1514348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    :  system_state_(system_state) {}
1524348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1534348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanbool ConnectionManager::IsUpdateAllowedOver(NetworkConnectionType type) const {
1544348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  switch (type) {
1554348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    case kNetBluetooth:
1564348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      return false;
1574348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
1584348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    case kNetCellular: {
1594348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      set<string> allowed_types;
1604348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      const policy::DevicePolicy* device_policy =
1616f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan          system_state_->device_policy();
162f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
163f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      // A device_policy is loaded in a lazy way right before an update check,
164f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      // so the device_policy should be already loaded at this point. If it's
165f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      // not, return a safe value for this setting.
1664348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      if (!device_policy) {
167f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        LOG(INFO) << "Disabling updates over cellular networks as there's no "
168f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo                     "device policy loaded yet.";
1694348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan        return false;
1704348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      }
1714348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
172f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      if (device_policy->GetAllowedConnectionTypesForUpdate(&allowed_types)) {
173f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        // The update setting is enforced by the device policy.
174f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
175f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        if ((type == kNetCellular &&
176f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo            !ContainsKey(allowed_types, flimflam::kTypeCellular))) {
177f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          LOG(INFO) << "Disabling updates over cellular connection as it's not "
178f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo                       "allowed in the device policy.";
179f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          return false;
180f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        }
181f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
182f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        LOG(INFO) << "Allowing updates over cellular per device policy.";
183f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        return true;
184f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo      } else {
185f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        // There's no update setting in the device policy, using the local user
186f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        // setting.
187f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        PrefsInterface* prefs = system_state_->prefs();
188f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
189f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        if (!prefs || !prefs->Exists(kPrefsUpdateOverCellularPermission)) {
190f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          LOG(INFO) << "Disabling updates over cellular connection as there's "
191f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo                       "no device policy setting nor user preference present.";
192f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          return false;
193f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        }
194f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
195efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo        bool stored_value;
196efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo        if (!prefs->GetBoolean(kPrefsUpdateOverCellularPermission,
197efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo                               &stored_value)) {
198f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          return false;
199efb7c4c605440fdc6297deed8fa9d1aecb77235eAlex Deymo        }
200f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo
201f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        if (!stored_value) {
202f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          LOG(INFO) << "Disabling updates over cellular connection per user "
203f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo                       "setting.";
204f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo          return false;
205f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        }
206f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        LOG(INFO) << "Allowing updates over cellular per user setting.";
207f4867c4dab4d1ca566f1aa3f585bd16d87b911ddAlex Deymo        return true;
2084348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      }
2094348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    }
2104348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2114348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    default:
2124348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan      return true;
2134348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  }
2144348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan}
2154348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan
2164348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanconst char* ConnectionManager::StringForConnectionType(
2174348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    NetworkConnectionType type) const {
2184348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  static const char* const kValues[] = {flimflam::kTypeEthernet,
2194348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                        flimflam::kTypeWifi,
2204348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                        flimflam::kTypeWimax,
2214348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                        flimflam::kTypeBluetooth,
2224348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan                                        flimflam::kTypeCellular};
223d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  if (type < 0 || type >= static_cast<int>(arraysize(kValues))) {
224d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes    return "Unknown";
225d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  }
226d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return kValues[type];
227d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
228d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
2294348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanbool ConnectionManager::GetConnectionType(
2304348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    DbusGlibInterface* dbus_iface,
2314348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan    NetworkConnectionType* out_type) const {
232d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  string default_service_path;
233d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetDefaultServicePath(dbus_iface,
234d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                              &default_service_path));
235d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  TEST_AND_RETURN_FALSE(GetServicePathType(dbus_iface,
236d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           default_service_path,
237d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes                                           out_type));
238d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes  return true;
239d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}
240d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes
241d57d1474a7bb152adf10d8c31d7ef6d40d27f7ccAndrew de los Reyes}  // namespace chromeos_update_engine
242