blob: 27e3259995c49ab916cc1582d9914daab39c2cbe [file] [log] [blame]
Paul Stewarte6927402012-01-23 16:11:30 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masone88cbd5f2011-07-03 14:30:04 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/default_profile.h"
6
Alex Vakulenko37c5d942014-06-17 18:17:43 -07007#include <random>
Chris Masone877ff982011-09-21 16:18:24 -07008#include <vector>
9
Ben Chana0ddf462014-02-06 11:32:42 -080010#include <base/files/file_path.h>
11#include <base/strings/string_number_conversions.h>
12#include <base/strings/stringprintf.h>
Chris Masone88cbd5f2011-07-03 14:30:04 -070013#include <chromeos/dbus/service_constants.h>
14
15#include "shill/adaptor_interfaces.h"
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -070016#include "shill/connectivity_trial.h"
Chris Masone88cbd5f2011-07-03 14:30:04 -070017#include "shill/control_interface.h"
Paul Stewart036dba02012-08-07 12:34:41 -070018#include "shill/link_monitor.h"
Chris Masone88cbd5f2011-07-03 14:30:04 -070019#include "shill/manager.h"
Paul Stewarte6927402012-01-23 16:11:30 -080020#include "shill/portal_detector.h"
Paul Stewartbf667612012-06-29 14:49:54 -070021#include "shill/resolver.h"
Chris Masoneaa482372011-09-14 16:40:37 -070022#include "shill/store_interface.h"
Peter Qiu1a72f542015-04-14 16:31:36 -070023
24#if !defined(DISABLE_WIFI)
Ben Chand6a8b512014-11-18 10:45:15 -080025#include "shill/wifi/wifi_provider.h"
Peter Qiu1a72f542015-04-14 16:31:36 -070026#endif // DISABLE_WIFI
Chris Masone88cbd5f2011-07-03 14:30:04 -070027
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080028using base::FilePath;
Paul Stewartd0a3b812012-03-28 22:48:22 -070029using std::string;
Chris Masone877ff982011-09-21 16:18:24 -070030using std::vector;
31
Chris Masone88cbd5f2011-07-03 14:30:04 -070032namespace shill {
Chris Masoneaa482372011-09-14 16:40:37 -070033// static
Chris Masone7df0c672011-07-15 10:24:54 -070034const char DefaultProfile::kDefaultId[] = "default";
Chris Masoneaa482372011-09-14 16:40:37 -070035// static
36const char DefaultProfile::kStorageId[] = "global";
37// static
Paul Stewartd408fdf2012-05-07 17:15:57 -070038const char DefaultProfile::kStorageArpGateway[] = "ArpGateway";
39// static
Chris Masoneaa482372011-09-14 16:40:37 -070040const char DefaultProfile::kStorageCheckPortalList[] = "CheckPortalList";
41// static
Paul Stewartff6be292014-11-24 17:05:03 -080042const char DefaultProfile::kStorageConnectionIdSalt[] = "ConnectionIdSalt";
43// static
Paul Stewartd32f4842012-01-11 16:08:13 -080044const char DefaultProfile::kStorageHostName[] = "HostName";
45// static
Paul Stewart4d5efb72012-09-17 12:24:34 -070046const char DefaultProfile::kStorageIgnoredDNSSearchPaths[] =
47 "IgnoredDNSSearchPaths";
48// static
Paul Stewart036dba02012-08-07 12:34:41 -070049const char DefaultProfile::kStorageLinkMonitorTechnologies[] =
50 "LinkMonitorTechnologies";
51// static
Chris Masoneaa482372011-09-14 16:40:37 -070052const char DefaultProfile::kStorageName[] = "Name";
53// static
Ben Chan8e6b8ef2014-07-14 21:50:18 -070054const char DefaultProfile::kStorageNoAutoConnectTechnologies[] =
55 "NoAutoConnectTechnologies";
56// static
Chris Masoneaa482372011-09-14 16:40:37 -070057const char DefaultProfile::kStorageOfflineMode[] = "OfflineMode";
Paul Stewarte6927402012-01-23 16:11:30 -080058// static
59const char DefaultProfile::kStoragePortalURL[] = "PortalURL";
Paul Stewartc681fa02012-03-02 19:40:04 -080060// static
61const char DefaultProfile::kStoragePortalCheckInterval[] =
62 "PortalCheckInterval";
Peter Qiu9d581932014-04-14 16:37:37 -070063// static
Paul Stewartff6be292014-11-24 17:05:03 -080064const char DefaultProfile::kStorageProhibitedTechnologies[] =
65 "ProhibitedTechnologies";
Chris Masone88cbd5f2011-07-03 14:30:04 -070066
Paul Stewarta794cd62015-06-16 13:13:10 -070067DefaultProfile::DefaultProfile(ControlInterface* control,
68 Metrics* metrics,
69 Manager* manager,
70 const FilePath& storage_path,
71 const string& profile_id,
72 const Manager::Properties& manager_props)
Thieu Le5133b712013-02-19 14:47:21 -080073 : Profile(control, metrics, manager, Identifier(profile_id), "", true),
Chris Masoneaa482372011-09-14 16:40:37 -070074 storage_path_(storage_path),
Paul Stewartd0a3b812012-03-28 22:48:22 -070075 profile_id_(profile_id),
Alex Vakulenko37c5d942014-06-17 18:17:43 -070076 props_(manager_props),
77 random_engine_(time(nullptr)) {
Paul Stewarta794cd62015-06-16 13:13:10 -070078 PropertyStore* store = this->mutable_store();
Ben Chan5dc58812013-09-20 12:53:25 -070079 store->RegisterConstBool(kArpGatewayProperty, &manager_props.arp_gateway);
80 store->RegisterConstString(kCheckPortalListProperty,
Chris Masone88cbd5f2011-07-03 14:30:04 -070081 &manager_props.check_portal_list);
Ben Chan5dc58812013-09-20 12:53:25 -070082 store->RegisterConstString(kCountryProperty, &manager_props.country);
Ben Chan39a7beb2013-09-21 11:28:00 -070083 store->RegisterConstString(kIgnoredDNSSearchPathsProperty,
Paul Stewart4d5efb72012-09-17 12:24:34 -070084 &manager_props.ignored_dns_search_paths);
Ben Chan39a7beb2013-09-21 11:28:00 -070085 store->RegisterConstString(kLinkMonitorTechnologiesProperty,
Paul Stewart036dba02012-08-07 12:34:41 -070086 &manager_props.link_monitor_technologies);
Ben Chan8e6b8ef2014-07-14 21:50:18 -070087 store->RegisterConstString(kNoAutoConnectTechnologiesProperty,
88 &manager_props.no_auto_connect_technologies);
Ben Chan5dc58812013-09-20 12:53:25 -070089 store->RegisterConstBool(kOfflineModeProperty, &manager_props.offline_mode);
90 store->RegisterConstString(kPortalURLProperty, &manager_props.portal_url);
Ben Chan39a7beb2013-09-21 11:28:00 -070091 store->RegisterConstInt32(kPortalCheckIntervalProperty,
Paul Stewartc681fa02012-03-02 19:40:04 -080092 &manager_props.portal_check_interval_seconds);
Paul Stewartff6be292014-11-24 17:05:03 -080093 store->RegisterConstString(kProhibitedTechnologiesProperty,
94 &manager_props.prohibited_technologies);
Chris Masone88cbd5f2011-07-03 14:30:04 -070095}
96
97DefaultProfile::~DefaultProfile() {}
98
Paul Stewarta794cd62015-06-16 13:13:10 -070099void DefaultProfile::LoadManagerProperties(Manager::Properties* manager_props) {
Paul Stewartd408fdf2012-05-07 17:15:57 -0700100 storage()->GetBool(kStorageId, kStorageArpGateway,
101 &manager_props->arp_gateway);
Paul Stewartd32f4842012-01-11 16:08:13 -0800102 storage()->GetString(kStorageId, kStorageHostName, &manager_props->host_name);
Paul Stewart870523b2012-01-11 17:00:42 -0800103 storage()->GetBool(kStorageId, kStorageOfflineMode,
104 &manager_props->offline_mode);
Paul Stewartf555cf82012-03-15 14:42:43 -0700105 if (!storage()->GetString(kStorageId,
106 kStorageCheckPortalList,
107 &manager_props->check_portal_list)) {
108 manager_props->check_portal_list = PortalDetector::kDefaultCheckPortalList;
109 }
Paul Stewartff6be292014-11-24 17:05:03 -0800110 if (!storage()->GetInt(kStorageId, kStorageConnectionIdSalt,
111 &manager_props->connection_id_salt)) {
112 manager_props->connection_id_salt =
113 std::uniform_int_distribution<int>()(random_engine_);
114 }
Paul Stewart036dba02012-08-07 12:34:41 -0700115 if (!storage()->GetString(kStorageId,
Paul Stewart4d5efb72012-09-17 12:24:34 -0700116 kStorageIgnoredDNSSearchPaths,
117 &manager_props->ignored_dns_search_paths)) {
118 manager_props->ignored_dns_search_paths =
119 Resolver::kDefaultIgnoredSearchList;
120 }
121 if (!storage()->GetString(kStorageId,
Paul Stewart036dba02012-08-07 12:34:41 -0700122 kStorageLinkMonitorTechnologies,
123 &manager_props->link_monitor_technologies)) {
124 manager_props->link_monitor_technologies =
125 LinkMonitor::kDefaultLinkMonitorTechnologies;
126 }
Ben Chan8e6b8ef2014-07-14 21:50:18 -0700127 if (!storage()->GetString(kStorageId,
128 kStorageNoAutoConnectTechnologies,
129 &manager_props->no_auto_connect_technologies)) {
130 manager_props->no_auto_connect_technologies = "";
131 }
Paul Stewarte6927402012-01-23 16:11:30 -0800132 if (!storage()->GetString(kStorageId, kStoragePortalURL,
133 &manager_props->portal_url)) {
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -0700134 manager_props->portal_url = ConnectivityTrial::kDefaultURL;
Paul Stewarte6927402012-01-23 16:11:30 -0800135 }
Paul Stewartc681fa02012-03-02 19:40:04 -0800136 std::string check_interval;
137 if (!storage()->GetString(kStorageId, kStoragePortalCheckInterval,
138 &check_interval) ||
139 !base::StringToInt(check_interval,
140 &manager_props->portal_check_interval_seconds)) {
141 manager_props->portal_check_interval_seconds =
142 PortalDetector::kDefaultCheckIntervalSeconds;
143 }
Paul Stewartff6be292014-11-24 17:05:03 -0800144 if (!storage()->GetString(kStorageId,
145 kStorageProhibitedTechnologies,
146 &manager_props->prohibited_technologies)) {
147 manager_props->prohibited_technologies = "";
Peter Qiu9d581932014-04-14 16:37:37 -0700148 }
Paul Stewart870523b2012-01-11 17:00:42 -0800149}
150
Paul Stewarta794cd62015-06-16 13:13:10 -0700151bool DefaultProfile::ConfigureService(const ServiceRefPtr& service) {
Paul Stewartf284a232012-05-01 10:24:37 -0700152 if (Profile::ConfigureService(service)) {
153 return true;
154 }
155 if (service->technology() == Technology::kEthernet) {
156 // Ethernet services should have an affinity towards the default profile,
157 // so even if a new Ethernet service has no known configuration, accept
158 // it anyway.
159 UpdateService(service);
Philipp Neubeck79173602012-11-13 21:10:09 +0100160 service->SetProfile(this);
Paul Stewartf284a232012-05-01 10:24:37 -0700161 return true;
162 }
163 return false;
164}
165
Chris Masoneb9c00592011-10-06 13:10:39 -0700166bool DefaultProfile::Save() {
Paul Stewartd408fdf2012-05-07 17:15:57 -0700167 storage()->SetBool(kStorageId, kStorageArpGateway, props_.arp_gateway);
Paul Stewartd32f4842012-01-11 16:08:13 -0800168 storage()->SetString(kStorageId, kStorageHostName, props_.host_name);
Chris Masoneb9c00592011-10-06 13:10:39 -0700169 storage()->SetString(kStorageId, kStorageName, GetFriendlyName());
170 storage()->SetBool(kStorageId, kStorageOfflineMode, props_.offline_mode);
171 storage()->SetString(kStorageId,
172 kStorageCheckPortalList,
173 props_.check_portal_list);
Paul Stewartff6be292014-11-24 17:05:03 -0800174 storage()->SetInt(kStorageId, kStorageConnectionIdSalt,
175 props_.connection_id_salt);
Paul Stewarte6927402012-01-23 16:11:30 -0800176 storage()->SetString(kStorageId,
Paul Stewart4d5efb72012-09-17 12:24:34 -0700177 kStorageIgnoredDNSSearchPaths,
178 props_.ignored_dns_search_paths);
179 storage()->SetString(kStorageId,
Paul Stewart036dba02012-08-07 12:34:41 -0700180 kStorageLinkMonitorTechnologies,
181 props_.link_monitor_technologies);
182 storage()->SetString(kStorageId,
Ben Chan8e6b8ef2014-07-14 21:50:18 -0700183 kStorageNoAutoConnectTechnologies,
184 props_.no_auto_connect_technologies);
185 storage()->SetString(kStorageId,
Paul Stewarte6927402012-01-23 16:11:30 -0800186 kStoragePortalURL,
187 props_.portal_url);
Paul Stewartc681fa02012-03-02 19:40:04 -0800188 storage()->SetString(kStorageId,
189 kStoragePortalCheckInterval,
190 base::IntToString(props_.portal_check_interval_seconds));
Paul Stewartff6be292014-11-24 17:05:03 -0800191 storage()->SetString(kStorageId,
192 kStorageProhibitedTechnologies,
193 props_.prohibited_technologies);
Chris Masoneb9c00592011-10-06 13:10:39 -0700194 return Profile::Save();
Chris Masoneaa482372011-09-14 16:40:37 -0700195}
196
Paul Stewarta794cd62015-06-16 13:13:10 -0700197bool DefaultProfile::UpdateDevice(const DeviceRefPtr& device) {
Darin Petkove7c6ad32012-06-29 10:22:09 +0200198 return device->Save(storage()) && storage()->Flush();
199}
200
Peter Qiu1a72f542015-04-14 16:31:36 -0700201#if !defined(DISABLE_WIFI)
Paul Stewarta794cd62015-06-16 13:13:10 -0700202bool DefaultProfile::UpdateWiFiProvider(const WiFiProvider& wifi_provider) {
Wade Guthrie60a37062013-04-02 11:39:09 -0700203 return wifi_provider.Save(storage()) && storage()->Flush();
204}
Peter Qiu1a72f542015-04-14 16:31:36 -0700205#endif // DISABLE_WIFI
Wade Guthrie60a37062013-04-02 11:39:09 -0700206
Paul Stewarta794cd62015-06-16 13:13:10 -0700207bool DefaultProfile::GetStoragePath(FilePath* path) {
Paul Stewartd0a3b812012-03-28 22:48:22 -0700208 *path = storage_path_.Append(base::StringPrintf("%s.profile",
209 profile_id_.c_str()));
Chris Masone2ae797d2011-08-23 20:41:00 -0700210 return true;
211}
212
Chris Masone88cbd5f2011-07-03 14:30:04 -0700213} // namespace shill