Paul Stewart | e692740 | 2012-01-23 16:11:30 -0800 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 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 "shill/default_profile.h" |
| 6 | |
Alex Vakulenko | 37c5d94 | 2014-06-17 18:17:43 -0700 | [diff] [blame] | 7 | #include <random> |
Chris Masone | 877ff98 | 2011-09-21 16:18:24 -0700 | [diff] [blame] | 8 | #include <vector> |
| 9 | |
Ben Chan | a0ddf46 | 2014-02-06 11:32:42 -0800 | [diff] [blame] | 10 | #include <base/files/file_path.h> |
| 11 | #include <base/strings/string_number_conversions.h> |
| 12 | #include <base/strings/stringprintf.h> |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 13 | #include <chromeos/dbus/service_constants.h> |
| 14 | |
| 15 | #include "shill/adaptor_interfaces.h" |
Rebecca Silberstein | 3d49ea4 | 2014-08-21 11:20:50 -0700 | [diff] [blame] | 16 | #include "shill/connectivity_trial.h" |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 17 | #include "shill/control_interface.h" |
Paul Stewart | 036dba0 | 2012-08-07 12:34:41 -0700 | [diff] [blame] | 18 | #include "shill/link_monitor.h" |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 19 | #include "shill/manager.h" |
Paul Stewart | e692740 | 2012-01-23 16:11:30 -0800 | [diff] [blame] | 20 | #include "shill/portal_detector.h" |
Paul Stewart | bf66761 | 2012-06-29 14:49:54 -0700 | [diff] [blame] | 21 | #include "shill/resolver.h" |
Chris Masone | aa48237 | 2011-09-14 16:40:37 -0700 | [diff] [blame] | 22 | #include "shill/store_interface.h" |
Ben Chan | d6a8b51 | 2014-11-18 10:45:15 -0800 | [diff] [blame] | 23 | #include "shill/wifi/wifi_provider.h" |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 24 | |
Albert Chaulk | 0e1cdea | 2013-02-27 15:32:55 -0800 | [diff] [blame] | 25 | using base::FilePath; |
Paul Stewart | d0a3b81 | 2012-03-28 22:48:22 -0700 | [diff] [blame] | 26 | using std::string; |
Chris Masone | 877ff98 | 2011-09-21 16:18:24 -0700 | [diff] [blame] | 27 | using std::vector; |
| 28 | |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 29 | namespace shill { |
Chris Masone | aa48237 | 2011-09-14 16:40:37 -0700 | [diff] [blame] | 30 | // static |
Chris Masone | 7df0c67 | 2011-07-15 10:24:54 -0700 | [diff] [blame] | 31 | const char DefaultProfile::kDefaultId[] = "default"; |
Chris Masone | aa48237 | 2011-09-14 16:40:37 -0700 | [diff] [blame] | 32 | // static |
| 33 | const char DefaultProfile::kStorageId[] = "global"; |
| 34 | // static |
Paul Stewart | d408fdf | 2012-05-07 17:15:57 -0700 | [diff] [blame] | 35 | const char DefaultProfile::kStorageArpGateway[] = "ArpGateway"; |
| 36 | // static |
Chris Masone | aa48237 | 2011-09-14 16:40:37 -0700 | [diff] [blame] | 37 | const char DefaultProfile::kStorageCheckPortalList[] = "CheckPortalList"; |
| 38 | // static |
Paul Stewart | ff6be29 | 2014-11-24 17:05:03 -0800 | [diff] [blame^] | 39 | const char DefaultProfile::kStorageConnectionIdSalt[] = "ConnectionIdSalt"; |
| 40 | // static |
Paul Stewart | d32f484 | 2012-01-11 16:08:13 -0800 | [diff] [blame] | 41 | const char DefaultProfile::kStorageHostName[] = "HostName"; |
| 42 | // static |
Paul Stewart | 4d5efb7 | 2012-09-17 12:24:34 -0700 | [diff] [blame] | 43 | const char DefaultProfile::kStorageIgnoredDNSSearchPaths[] = |
| 44 | "IgnoredDNSSearchPaths"; |
| 45 | // static |
Paul Stewart | 036dba0 | 2012-08-07 12:34:41 -0700 | [diff] [blame] | 46 | const char DefaultProfile::kStorageLinkMonitorTechnologies[] = |
| 47 | "LinkMonitorTechnologies"; |
| 48 | // static |
Chris Masone | aa48237 | 2011-09-14 16:40:37 -0700 | [diff] [blame] | 49 | const char DefaultProfile::kStorageName[] = "Name"; |
| 50 | // static |
Ben Chan | 8e6b8ef | 2014-07-14 21:50:18 -0700 | [diff] [blame] | 51 | const char DefaultProfile::kStorageNoAutoConnectTechnologies[] = |
| 52 | "NoAutoConnectTechnologies"; |
| 53 | // static |
Chris Masone | aa48237 | 2011-09-14 16:40:37 -0700 | [diff] [blame] | 54 | const char DefaultProfile::kStorageOfflineMode[] = "OfflineMode"; |
Paul Stewart | e692740 | 2012-01-23 16:11:30 -0800 | [diff] [blame] | 55 | // static |
| 56 | const char DefaultProfile::kStoragePortalURL[] = "PortalURL"; |
Paul Stewart | c681fa0 | 2012-03-02 19:40:04 -0800 | [diff] [blame] | 57 | // static |
| 58 | const char DefaultProfile::kStoragePortalCheckInterval[] = |
| 59 | "PortalCheckInterval"; |
Peter Qiu | 9d58193 | 2014-04-14 16:37:37 -0700 | [diff] [blame] | 60 | // static |
Paul Stewart | ff6be29 | 2014-11-24 17:05:03 -0800 | [diff] [blame^] | 61 | const char DefaultProfile::kStorageProhibitedTechnologies[] = |
| 62 | "ProhibitedTechnologies"; |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 63 | |
Chris Masone | 2ae797d | 2011-08-23 20:41:00 -0700 | [diff] [blame] | 64 | DefaultProfile::DefaultProfile(ControlInterface *control, |
Thieu Le | 5133b71 | 2013-02-19 14:47:21 -0800 | [diff] [blame] | 65 | Metrics *metrics, |
Chris Masone | 6791a43 | 2011-07-12 13:23:19 -0700 | [diff] [blame] | 66 | Manager *manager, |
Chris Masone | 2ae797d | 2011-08-23 20:41:00 -0700 | [diff] [blame] | 67 | const FilePath &storage_path, |
Paul Stewart | d0a3b81 | 2012-03-28 22:48:22 -0700 | [diff] [blame] | 68 | const string &profile_id, |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 69 | const Manager::Properties &manager_props) |
Thieu Le | 5133b71 | 2013-02-19 14:47:21 -0800 | [diff] [blame] | 70 | : Profile(control, metrics, manager, Identifier(profile_id), "", true), |
Chris Masone | aa48237 | 2011-09-14 16:40:37 -0700 | [diff] [blame] | 71 | storage_path_(storage_path), |
Paul Stewart | d0a3b81 | 2012-03-28 22:48:22 -0700 | [diff] [blame] | 72 | profile_id_(profile_id), |
Alex Vakulenko | 37c5d94 | 2014-06-17 18:17:43 -0700 | [diff] [blame] | 73 | props_(manager_props), |
| 74 | random_engine_(time(nullptr)) { |
mukesh agrawal | de29fa8 | 2011-09-16 16:16:36 -0700 | [diff] [blame] | 75 | PropertyStore *store = this->mutable_store(); |
Ben Chan | 5dc5881 | 2013-09-20 12:53:25 -0700 | [diff] [blame] | 76 | store->RegisterConstBool(kArpGatewayProperty, &manager_props.arp_gateway); |
| 77 | store->RegisterConstString(kCheckPortalListProperty, |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 78 | &manager_props.check_portal_list); |
Ben Chan | 5dc5881 | 2013-09-20 12:53:25 -0700 | [diff] [blame] | 79 | store->RegisterConstString(kCountryProperty, &manager_props.country); |
Ben Chan | 39a7beb | 2013-09-21 11:28:00 -0700 | [diff] [blame] | 80 | store->RegisterConstString(kIgnoredDNSSearchPathsProperty, |
Paul Stewart | 4d5efb7 | 2012-09-17 12:24:34 -0700 | [diff] [blame] | 81 | &manager_props.ignored_dns_search_paths); |
Ben Chan | 39a7beb | 2013-09-21 11:28:00 -0700 | [diff] [blame] | 82 | store->RegisterConstString(kLinkMonitorTechnologiesProperty, |
Paul Stewart | 036dba0 | 2012-08-07 12:34:41 -0700 | [diff] [blame] | 83 | &manager_props.link_monitor_technologies); |
Ben Chan | 8e6b8ef | 2014-07-14 21:50:18 -0700 | [diff] [blame] | 84 | store->RegisterConstString(kNoAutoConnectTechnologiesProperty, |
| 85 | &manager_props.no_auto_connect_technologies); |
Ben Chan | 5dc5881 | 2013-09-20 12:53:25 -0700 | [diff] [blame] | 86 | store->RegisterConstBool(kOfflineModeProperty, &manager_props.offline_mode); |
| 87 | store->RegisterConstString(kPortalURLProperty, &manager_props.portal_url); |
Ben Chan | 39a7beb | 2013-09-21 11:28:00 -0700 | [diff] [blame] | 88 | store->RegisterConstInt32(kPortalCheckIntervalProperty, |
Paul Stewart | c681fa0 | 2012-03-02 19:40:04 -0800 | [diff] [blame] | 89 | &manager_props.portal_check_interval_seconds); |
Paul Stewart | ff6be29 | 2014-11-24 17:05:03 -0800 | [diff] [blame^] | 90 | store->RegisterConstString(kProhibitedTechnologiesProperty, |
| 91 | &manager_props.prohibited_technologies); |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 92 | } |
| 93 | |
| 94 | DefaultProfile::~DefaultProfile() {} |
| 95 | |
mukesh agrawal | 92496a4 | 2014-04-08 16:04:43 -0700 | [diff] [blame] | 96 | void DefaultProfile::LoadManagerProperties(Manager::Properties *manager_props) { |
Paul Stewart | d408fdf | 2012-05-07 17:15:57 -0700 | [diff] [blame] | 97 | storage()->GetBool(kStorageId, kStorageArpGateway, |
| 98 | &manager_props->arp_gateway); |
Paul Stewart | d32f484 | 2012-01-11 16:08:13 -0800 | [diff] [blame] | 99 | storage()->GetString(kStorageId, kStorageHostName, &manager_props->host_name); |
Paul Stewart | 870523b | 2012-01-11 17:00:42 -0800 | [diff] [blame] | 100 | storage()->GetBool(kStorageId, kStorageOfflineMode, |
| 101 | &manager_props->offline_mode); |
Paul Stewart | f555cf8 | 2012-03-15 14:42:43 -0700 | [diff] [blame] | 102 | if (!storage()->GetString(kStorageId, |
| 103 | kStorageCheckPortalList, |
| 104 | &manager_props->check_portal_list)) { |
| 105 | manager_props->check_portal_list = PortalDetector::kDefaultCheckPortalList; |
| 106 | } |
Paul Stewart | ff6be29 | 2014-11-24 17:05:03 -0800 | [diff] [blame^] | 107 | if (!storage()->GetInt(kStorageId, kStorageConnectionIdSalt, |
| 108 | &manager_props->connection_id_salt)) { |
| 109 | manager_props->connection_id_salt = |
| 110 | std::uniform_int_distribution<int>()(random_engine_); |
| 111 | } |
Paul Stewart | 036dba0 | 2012-08-07 12:34:41 -0700 | [diff] [blame] | 112 | if (!storage()->GetString(kStorageId, |
Paul Stewart | 4d5efb7 | 2012-09-17 12:24:34 -0700 | [diff] [blame] | 113 | kStorageIgnoredDNSSearchPaths, |
| 114 | &manager_props->ignored_dns_search_paths)) { |
| 115 | manager_props->ignored_dns_search_paths = |
| 116 | Resolver::kDefaultIgnoredSearchList; |
| 117 | } |
| 118 | if (!storage()->GetString(kStorageId, |
Paul Stewart | 036dba0 | 2012-08-07 12:34:41 -0700 | [diff] [blame] | 119 | kStorageLinkMonitorTechnologies, |
| 120 | &manager_props->link_monitor_technologies)) { |
| 121 | manager_props->link_monitor_technologies = |
| 122 | LinkMonitor::kDefaultLinkMonitorTechnologies; |
| 123 | } |
Ben Chan | 8e6b8ef | 2014-07-14 21:50:18 -0700 | [diff] [blame] | 124 | if (!storage()->GetString(kStorageId, |
| 125 | kStorageNoAutoConnectTechnologies, |
| 126 | &manager_props->no_auto_connect_technologies)) { |
| 127 | manager_props->no_auto_connect_technologies = ""; |
| 128 | } |
Paul Stewart | e692740 | 2012-01-23 16:11:30 -0800 | [diff] [blame] | 129 | if (!storage()->GetString(kStorageId, kStoragePortalURL, |
| 130 | &manager_props->portal_url)) { |
Rebecca Silberstein | 3d49ea4 | 2014-08-21 11:20:50 -0700 | [diff] [blame] | 131 | manager_props->portal_url = ConnectivityTrial::kDefaultURL; |
Paul Stewart | e692740 | 2012-01-23 16:11:30 -0800 | [diff] [blame] | 132 | } |
Paul Stewart | c681fa0 | 2012-03-02 19:40:04 -0800 | [diff] [blame] | 133 | std::string check_interval; |
| 134 | if (!storage()->GetString(kStorageId, kStoragePortalCheckInterval, |
| 135 | &check_interval) || |
| 136 | !base::StringToInt(check_interval, |
| 137 | &manager_props->portal_check_interval_seconds)) { |
| 138 | manager_props->portal_check_interval_seconds = |
| 139 | PortalDetector::kDefaultCheckIntervalSeconds; |
| 140 | } |
Paul Stewart | ff6be29 | 2014-11-24 17:05:03 -0800 | [diff] [blame^] | 141 | if (!storage()->GetString(kStorageId, |
| 142 | kStorageProhibitedTechnologies, |
| 143 | &manager_props->prohibited_technologies)) { |
| 144 | manager_props->prohibited_technologies = ""; |
Peter Qiu | 9d58193 | 2014-04-14 16:37:37 -0700 | [diff] [blame] | 145 | } |
Paul Stewart | 870523b | 2012-01-11 17:00:42 -0800 | [diff] [blame] | 146 | } |
| 147 | |
Paul Stewart | f284a23 | 2012-05-01 10:24:37 -0700 | [diff] [blame] | 148 | bool DefaultProfile::ConfigureService(const ServiceRefPtr &service) { |
| 149 | if (Profile::ConfigureService(service)) { |
| 150 | return true; |
| 151 | } |
| 152 | if (service->technology() == Technology::kEthernet) { |
| 153 | // Ethernet services should have an affinity towards the default profile, |
| 154 | // so even if a new Ethernet service has no known configuration, accept |
| 155 | // it anyway. |
| 156 | UpdateService(service); |
Philipp Neubeck | 7917360 | 2012-11-13 21:10:09 +0100 | [diff] [blame] | 157 | service->SetProfile(this); |
Paul Stewart | f284a23 | 2012-05-01 10:24:37 -0700 | [diff] [blame] | 158 | return true; |
| 159 | } |
| 160 | return false; |
| 161 | } |
| 162 | |
Chris Masone | b9c0059 | 2011-10-06 13:10:39 -0700 | [diff] [blame] | 163 | bool DefaultProfile::Save() { |
Paul Stewart | d408fdf | 2012-05-07 17:15:57 -0700 | [diff] [blame] | 164 | storage()->SetBool(kStorageId, kStorageArpGateway, props_.arp_gateway); |
Paul Stewart | d32f484 | 2012-01-11 16:08:13 -0800 | [diff] [blame] | 165 | storage()->SetString(kStorageId, kStorageHostName, props_.host_name); |
Chris Masone | b9c0059 | 2011-10-06 13:10:39 -0700 | [diff] [blame] | 166 | storage()->SetString(kStorageId, kStorageName, GetFriendlyName()); |
| 167 | storage()->SetBool(kStorageId, kStorageOfflineMode, props_.offline_mode); |
| 168 | storage()->SetString(kStorageId, |
| 169 | kStorageCheckPortalList, |
| 170 | props_.check_portal_list); |
Paul Stewart | ff6be29 | 2014-11-24 17:05:03 -0800 | [diff] [blame^] | 171 | storage()->SetInt(kStorageId, kStorageConnectionIdSalt, |
| 172 | props_.connection_id_salt); |
Paul Stewart | e692740 | 2012-01-23 16:11:30 -0800 | [diff] [blame] | 173 | storage()->SetString(kStorageId, |
Paul Stewart | 4d5efb7 | 2012-09-17 12:24:34 -0700 | [diff] [blame] | 174 | kStorageIgnoredDNSSearchPaths, |
| 175 | props_.ignored_dns_search_paths); |
| 176 | storage()->SetString(kStorageId, |
Paul Stewart | 036dba0 | 2012-08-07 12:34:41 -0700 | [diff] [blame] | 177 | kStorageLinkMonitorTechnologies, |
| 178 | props_.link_monitor_technologies); |
| 179 | storage()->SetString(kStorageId, |
Ben Chan | 8e6b8ef | 2014-07-14 21:50:18 -0700 | [diff] [blame] | 180 | kStorageNoAutoConnectTechnologies, |
| 181 | props_.no_auto_connect_technologies); |
| 182 | storage()->SetString(kStorageId, |
Paul Stewart | e692740 | 2012-01-23 16:11:30 -0800 | [diff] [blame] | 183 | kStoragePortalURL, |
| 184 | props_.portal_url); |
Paul Stewart | c681fa0 | 2012-03-02 19:40:04 -0800 | [diff] [blame] | 185 | storage()->SetString(kStorageId, |
| 186 | kStoragePortalCheckInterval, |
| 187 | base::IntToString(props_.portal_check_interval_seconds)); |
Paul Stewart | ff6be29 | 2014-11-24 17:05:03 -0800 | [diff] [blame^] | 188 | storage()->SetString(kStorageId, |
| 189 | kStorageProhibitedTechnologies, |
| 190 | props_.prohibited_technologies); |
Chris Masone | b9c0059 | 2011-10-06 13:10:39 -0700 | [diff] [blame] | 191 | return Profile::Save(); |
Chris Masone | aa48237 | 2011-09-14 16:40:37 -0700 | [diff] [blame] | 192 | } |
| 193 | |
Darin Petkov | e7c6ad3 | 2012-06-29 10:22:09 +0200 | [diff] [blame] | 194 | bool DefaultProfile::UpdateDevice(const DeviceRefPtr &device) { |
| 195 | return device->Save(storage()) && storage()->Flush(); |
| 196 | } |
| 197 | |
Wade Guthrie | 60a3706 | 2013-04-02 11:39:09 -0700 | [diff] [blame] | 198 | bool DefaultProfile::UpdateWiFiProvider(const WiFiProvider &wifi_provider) { |
| 199 | return wifi_provider.Save(storage()) && storage()->Flush(); |
| 200 | } |
| 201 | |
Chris Masone | 2ae797d | 2011-08-23 20:41:00 -0700 | [diff] [blame] | 202 | bool DefaultProfile::GetStoragePath(FilePath *path) { |
Paul Stewart | d0a3b81 | 2012-03-28 22:48:22 -0700 | [diff] [blame] | 203 | *path = storage_path_.Append(base::StringPrintf("%s.profile", |
| 204 | profile_id_.c_str())); |
Chris Masone | 2ae797d | 2011-08-23 20:41:00 -0700 | [diff] [blame] | 205 | return true; |
| 206 | } |
| 207 | |
Chris Masone | 88cbd5f | 2011-07-03 14:30:04 -0700 | [diff] [blame] | 208 | } // namespace shill |