blob: 690fff661cf47fa768425e599436f53bc80acc9c [file] [log] [blame]
Paul Stewart75897df2011-04-27 09:05:53 -07001// Copyright (c) 2011 The Chromium OS 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
Chris Masoneb2e326b2011-07-12 13:28:51 -07005#include "shill/service.h"
6
Paul Stewart75897df2011-04-27 09:05:53 -07007#include <time.h>
Paul Stewart75897df2011-04-27 09:05:53 -07008#include <stdio.h>
Chris Masoneee929b72011-05-10 10:02:18 -07009
Chris Masone8fe2c7e2011-06-09 15:51:19 -070010#include <map>
Paul Stewart75897df2011-04-27 09:05:53 -070011#include <string>
Chris Masone8fe2c7e2011-06-09 15:51:19 -070012#include <vector>
Paul Stewart75897df2011-04-27 09:05:53 -070013
Chris Masoneee929b72011-05-10 10:02:18 -070014#include <base/logging.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070015#include <base/memory/scoped_ptr.h>
mukesh agrawal51a7e932011-07-27 16:18:26 -070016#include <base/string_number_conversions.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070017#include <chromeos/dbus/service_constants.h>
Chris Masoneee929b72011-05-10 10:02:18 -070018
Paul Stewart75897df2011-04-27 09:05:53 -070019#include "shill/control_interface.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070020#include "shill/error.h"
Chris Masone6791a432011-07-12 13:23:19 -070021#include "shill/manager.h"
Chris Masone7aa5f902011-07-11 11:13:35 -070022#include "shill/profile.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070023#include "shill/property_accessor.h"
Chris Masone7aa5f902011-07-11 11:13:35 -070024#include "shill/refptr_types.h"
Chris Masoned7732e42011-05-20 11:08:56 -070025#include "shill/service_dbus_adaptor.h"
Darin Petkovba40dd32011-07-11 20:06:39 -070026#include "shill/store_interface.h"
Paul Stewart75897df2011-04-27 09:05:53 -070027
Chris Masone8fe2c7e2011-06-09 15:51:19 -070028using std::map;
Paul Stewart75897df2011-04-27 09:05:53 -070029using std::string;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070030using std::vector;
Paul Stewart75897df2011-04-27 09:05:53 -070031
32namespace shill {
Darin Petkovba40dd32011-07-11 20:06:39 -070033
34const char Service::kCheckPortalAuto[] = "auto";
35const char Service::kCheckPortalFalse[] = "false";
36const char Service::kCheckPortalTrue[] = "true";
37
38const char Service::kStorageAutoConnect[] = "AutoConnect";
39const char Service::kStorageCheckPortal[] = "CheckPortal";
40const char Service::kStorageEapAnonymousIdentity[] = "EAP.AnonymousIdentity";
41const char Service::kStorageEapCACert[] = "EAP.CACert";
42const char Service::kStorageEapCACertID[] = "EAP.CACertID";
43const char Service::kStorageEapCertID[] = "EAP.CertID";
44const char Service::kStorageEapClientCert[] = "EAP.ClientCert";
45const char Service::kStorageEapEap[] = "EAP.EAP";
46const char Service::kStorageEapIdentity[] = "EAP.Identity";
47const char Service::kStorageEapInnerEap[] = "EAP.InnerEAP";
48const char Service::kStorageEapKeyID[] = "EAP.KeyID";
49const char Service::kStorageEapKeyManagement[] = "EAP.KeyMgmt";
50const char Service::kStorageEapPIN[] = "EAP.PIN";
51const char Service::kStorageEapPassword[] = "EAP.Password";
52const char Service::kStorageEapPrivateKey[] = "EAP.PrivateKey";
53const char Service::kStorageEapPrivateKeyPassword[] = "EAP.PrivateKeyPassword";
54const char Service::kStorageEapUseSystemCAs[] = "EAP.UseSystemCAs";
55const char Service::kStorageFavorite[] = "Favorite";
56const char Service::kStorageName[] = "Name";
57const char Service::kStoragePriority[] = "Priority";
58const char Service::kStorageProxyConfig[] = "ProxyConfig";
59const char Service::kStorageSaveCredentials[] = "SaveCredentials";
60
mukesh agrawal51a7e932011-07-27 16:18:26 -070061// static
62unsigned int Service::serial_number_ = 0;
63
Paul Stewart75897df2011-04-27 09:05:53 -070064Service::Service(ControlInterface *control_interface,
mukesh agrawalb54601c2011-06-07 17:39:22 -070065 EventDispatcher *dispatcher,
mukesh agrawal51a7e932011-07-27 16:18:26 -070066 Manager *manager)
Chris Masone3bd3c8c2011-06-13 08:20:26 -070067 : auto_connect_(false),
Darin Petkovba40dd32011-07-11 20:06:39 -070068 check_portal_(kCheckPortalAuto),
Chris Masone3bd3c8c2011-06-13 08:20:26 -070069 connectable_(false),
70 favorite_(false),
Darin Petkovba40dd32011-07-11 20:06:39 -070071 priority_(kPriorityNone),
72 save_credentials_(true),
Chris Masone3bd3c8c2011-06-13 08:20:26 -070073 dispatcher_(dispatcher),
mukesh agrawal51a7e932011-07-27 16:18:26 -070074 name_(base::UintToString(serial_number_++)),
Chris Masonea82b7112011-05-25 15:16:29 -070075 available_(false),
76 configured_(false),
Chris Masonea82b7112011-05-25 15:16:29 -070077 configuration_(NULL),
78 connection_(NULL),
Chris Masone6791a432011-07-12 13:23:19 -070079 adaptor_(control_interface->CreateServiceAdaptor(this)),
80 manager_(manager) {
Chris Masone3bd3c8c2011-06-13 08:20:26 -070081
Chris Masone27c4aa52011-07-02 13:10:14 -070082 store_.RegisterBool(flimflam::kAutoConnectProperty, &auto_connect_);
Chris Masone4d42df82011-07-02 17:09:39 -070083
84 // flimflam::kActivationStateProperty: Registered in CellularService
85 // flimflam::kCellularApnProperty: Registered in CellularService
86 // flimflam::kCellularLastGoodApnProperty: Registered in CellularService
87 // flimflam::kNetworkTechnologyProperty: Registered in CellularService
Darin Petkov3335b372011-08-22 11:05:32 -070088 // flimflam::kOperatorNameProperty: DEPRECATED
89 // flimflam::kOperatorCodeProperty: DEPRECATED
Chris Masone4d42df82011-07-02 17:09:39 -070090 // flimflam::kRoamingStateProperty: Registered in CellularService
Darin Petkov3335b372011-08-22 11:05:32 -070091 // flimflam::kServingOperatorProperty: Registered in CellularService
Chris Masone4d42df82011-07-02 17:09:39 -070092 // flimflam::kPaymentURLProperty: Registered in CellularService
93
Chris Masone27c4aa52011-07-02 13:10:14 -070094 store_.RegisterString(flimflam::kCheckPortalProperty, &check_portal_);
95 store_.RegisterConstBool(flimflam::kConnectableProperty, &connectable_);
96 HelpRegisterDerivedString(flimflam::kDeviceProperty,
97 &Service::GetDeviceRpcId,
98 NULL);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070099
Chris Masoneb2e326b2011-07-12 13:28:51 -0700100 store_.RegisterString(flimflam::kEapIdentityProperty, &eap_.identity);
101 store_.RegisterString(flimflam::kEAPEAPProperty, &eap_.eap);
102 store_.RegisterString(flimflam::kEapPhase2AuthProperty, &eap_.inner_eap);
Chris Masone27c4aa52011-07-02 13:10:14 -0700103 store_.RegisterString(flimflam::kEapAnonymousIdentityProperty,
Chris Masoneb2e326b2011-07-12 13:28:51 -0700104 &eap_.anonymous_identity);
105 store_.RegisterString(flimflam::kEAPClientCertProperty, &eap_.client_cert);
106 store_.RegisterString(flimflam::kEAPCertIDProperty, &eap_.cert_id);
107 store_.RegisterString(flimflam::kEapPrivateKeyProperty, &eap_.private_key);
Chris Masone27c4aa52011-07-02 13:10:14 -0700108 store_.RegisterString(flimflam::kEapPrivateKeyPasswordProperty,
Chris Masoneb2e326b2011-07-12 13:28:51 -0700109 &eap_.private_key_password);
110 store_.RegisterString(flimflam::kEAPKeyIDProperty, &eap_.key_id);
111 store_.RegisterString(flimflam::kEapCaCertProperty, &eap_.ca_cert);
112 store_.RegisterString(flimflam::kEapCaCertIDProperty, &eap_.ca_cert_id);
113 store_.RegisterString(flimflam::kEAPPINProperty, &eap_.pin);
114 store_.RegisterString(flimflam::kEapPasswordProperty, &eap_.password);
115 store_.RegisterString(flimflam::kEapKeyMgmtProperty, &eap_.key_management);
116 store_.RegisterBool(flimflam::kEapUseSystemCAsProperty, &eap_.use_system_cas);
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700117
Chris Masone27c4aa52011-07-02 13:10:14 -0700118 store_.RegisterConstString(flimflam::kErrorProperty, &error_);
119 store_.RegisterConstBool(flimflam::kFavoriteProperty, &favorite_);
120 HelpRegisterDerivedBool(flimflam::kIsActiveProperty,
Chris Masoneb2e326b2011-07-12 13:28:51 -0700121 &Service::IsActive,
122 NULL);
Chris Masone4d42df82011-07-02 17:09:39 -0700123 // flimflam::kModeProperty: Registered in WiFiService
Chris Masone27c4aa52011-07-02 13:10:14 -0700124 store_.RegisterConstString(flimflam::kNameProperty, &name_);
Chris Masone4d42df82011-07-02 17:09:39 -0700125 // flimflam::kPassphraseProperty: Registered in WiFiService
126 // flimflam::kPassphraseRequiredProperty: Registered in WiFiService
Chris Masone27c4aa52011-07-02 13:10:14 -0700127 store_.RegisterInt32(flimflam::kPriorityProperty, &priority_);
128 HelpRegisterDerivedString(flimflam::kProfileProperty,
129 &Service::GetProfileRpcId,
130 NULL);
Chris Masone4d42df82011-07-02 17:09:39 -0700131 store_.RegisterString(flimflam::kProxyConfigProperty, &proxy_config_);
Chris Masone43b48a12011-07-01 13:37:07 -0700132 // TODO(cmasone): Create VPN Service with this property
Chris Masone27c4aa52011-07-02 13:10:14 -0700133 // store_.RegisterConstStringmap(flimflam::kProviderProperty, &provider_);
Chris Masone4d42df82011-07-02 17:09:39 -0700134
Chris Masoneb2e326b2011-07-12 13:28:51 -0700135 store_.RegisterBool(flimflam::kSaveCredentialsProperty, &save_credentials_);
Chris Masone4d42df82011-07-02 17:09:39 -0700136 // flimflam::kSecurityProperty: Registered in WiFiService
Chris Masone27c4aa52011-07-02 13:10:14 -0700137 HelpRegisterDerivedString(flimflam::kStateProperty,
138 &Service::CalculateState,
139 NULL);
Chris Masone4d42df82011-07-02 17:09:39 -0700140 // flimflam::kSignalStrengthProperty: Registered in WiFi/CellularService
141 // flimflam::kTypeProperty: Registered in all derived classes.
142 // flimflam::kWifiAuthMode: Registered in WiFiService
143 // flimflam::kWifiHiddenSsid: Registered in WiFiService
144 // flimflam::kWifiFrequency: Registered in WiFiService
145 // flimflam::kWifiPhyMode: Registered in WiFiService
146 // flimflam::kWifiHexSsid: Registered in WiFiService
Chris Masoneb07006b2011-05-14 16:10:04 -0700147 VLOG(2) << "Service initialized.";
Paul Stewart75897df2011-04-27 09:05:53 -0700148}
149
Paul Stewartba41b992011-05-26 07:02:46 -0700150Service::~Service() {}
Paul Stewart75897df2011-04-27 09:05:53 -0700151
Darin Petkovc408e692011-08-17 13:47:15 -0700152void Service::ActivateCellularModem(const std::string &carrier) {
153 NOTREACHED() << "Attempt to activate a non-cellular service?";
154}
155
Chris Masone6791a432011-07-12 13:23:19 -0700156string Service::GetRpcIdentifier() const {
Chris Masone3c3f6a12011-07-01 10:01:41 -0700157 return adaptor_->GetRpcIdentifier();
158}
159
Darin Petkovba40dd32011-07-11 20:06:39 -0700160string Service::GetStorageIdentifier() {
161 return UniqueName();
162}
163
Chris Masone27c4aa52011-07-02 13:10:14 -0700164void Service::HelpRegisterDerivedBool(const string &name,
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700165 bool(Service::*get)(void),
166 bool(Service::*set)(const bool&)) {
Chris Masone27c4aa52011-07-02 13:10:14 -0700167 store_.RegisterDerivedBool(
168 name,
169 BoolAccessor(new CustomAccessor<Service, bool>(this, get, set)));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700170}
171
Chris Masone27c4aa52011-07-02 13:10:14 -0700172void Service::HelpRegisterDerivedString(const string &name,
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700173 string(Service::*get)(void),
174 bool(Service::*set)(const string&)) {
Chris Masone27c4aa52011-07-02 13:10:14 -0700175 store_.RegisterDerivedString(
176 name,
177 StringAccessor(new CustomAccessor<Service, string>(this, get, set)));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700178}
179
Darin Petkovba40dd32011-07-11 20:06:39 -0700180void Service::SaveString(StoreInterface *storage,
181 const string &key,
182 const string &value,
183 bool crypted,
184 bool save) {
185 if (value.empty() || !save) {
186 storage->DeleteKey(GetStorageIdentifier(), key);
187 return;
188 }
189 if (crypted) {
190 storage->SetCryptedString(GetStorageIdentifier(), key, value);
191 return;
192 }
193 storage->SetString(GetStorageIdentifier(), key, value);
194}
195
196void Service::LoadEapCredentials(StoreInterface *storage) {
197 const string id = GetStorageIdentifier();
198 storage->GetCryptedString(id, kStorageEapIdentity, &eap_.identity);
199 storage->GetString(id, kStorageEapEap, &eap_.eap);
200 storage->GetString(id, kStorageEapInnerEap, &eap_.inner_eap);
201 storage->GetCryptedString(id,
202 kStorageEapAnonymousIdentity,
203 &eap_.anonymous_identity);
204 storage->GetString(id, kStorageEapClientCert, &eap_.client_cert);
205 storage->GetString(id, kStorageEapCertID, &eap_.cert_id);
206 storage->GetString(id, kStorageEapPrivateKey, &eap_.private_key);
207 storage->GetCryptedString(id,
208 kStorageEapPrivateKeyPassword,
209 &eap_.private_key_password);
210 storage->GetString(id, kStorageEapKeyID, &eap_.key_id);
211 storage->GetString(id, kStorageEapCACert, &eap_.ca_cert);
212 storage->GetString(id, kStorageEapCACertID, &eap_.ca_cert_id);
213 storage->GetBool(id, kStorageEapUseSystemCAs, &eap_.use_system_cas);
214 storage->GetString(id, kStorageEapPIN, &eap_.pin);
215 storage->GetCryptedString(id, kStorageEapPassword, &eap_.password);
216 storage->GetString(id, kStorageEapKeyManagement, &eap_.key_management);
217}
218
219void Service::SaveEapCredentials(StoreInterface *storage) {
220 bool save = save_credentials_;
221 SaveString(storage, kStorageEapIdentity, eap_.identity, true, save);
222 SaveString(storage, kStorageEapEap, eap_.eap, false, true);
223 SaveString(storage, kStorageEapInnerEap, eap_.inner_eap, false, true);
224 SaveString(storage,
225 kStorageEapAnonymousIdentity,
226 eap_.anonymous_identity,
227 true,
228 save);
229 SaveString(storage, kStorageEapClientCert, eap_.client_cert, false, save);
230 SaveString(storage, kStorageEapCertID, eap_.cert_id, false, save);
231 SaveString(storage, kStorageEapPrivateKey, eap_.private_key, false, save);
232 SaveString(storage,
233 kStorageEapPrivateKeyPassword,
234 eap_.private_key_password,
235 true,
236 save);
237 SaveString(storage, kStorageEapKeyID, eap_.key_id, false, save);
238 SaveString(storage, kStorageEapCACert, eap_.ca_cert, false, true);
239 SaveString(storage, kStorageEapCACertID, eap_.ca_cert_id, false, true);
240 storage->SetBool(GetStorageIdentifier(),
241 kStorageEapUseSystemCAs,
242 eap_.use_system_cas);
243 SaveString(storage, kStorageEapPIN, eap_.pin, false, save);
244 SaveString(storage, kStorageEapPassword, eap_.password, true, save);
245 SaveString(storage,
246 kStorageEapKeyManagement,
247 eap_.key_management,
248 false,
249 true);
250}
251
252bool Service::Load(StoreInterface *storage) {
253 const string id = GetStorageIdentifier();
254 if (!storage->ContainsGroup(id)) {
255 LOG(WARNING) << "Service is not available in the persistent store: " << id;
256 return false;
257 }
258 storage->GetBool(id, kStorageAutoConnect, &auto_connect_);
259 storage->GetString(id, kStorageCheckPortal, &check_portal_);
260 storage->GetBool(id, kStorageFavorite, &favorite_);
261 storage->GetInt(id, kStoragePriority, &priority_);
262 storage->GetString(id, kStorageProxyConfig, &proxy_config_);
263 storage->GetBool(id, kStorageSaveCredentials, &save_credentials_);
264
265 LoadEapCredentials(storage);
266
267 // TODO(petkov): Load these:
268
269 // "Name"
270 // "WiFi.HiddenSSID"
271 // "SSID"
272 // "Failure"
273 // "Modified"
274 // "LastAttempt"
275 // WiFiService: "Passphrase"
276 // "APN"
277 // "LastGoodAPN"
278
279 return true;
280}
281
282bool Service::Save(StoreInterface *storage) {
283 const string id = GetStorageIdentifier();
284
285 // TODO(petkov): We could choose to simplify the saving code by removing most
286 // conditionals thus saving even default values.
287 if (favorite_) {
288 storage->SetBool(id, kStorageAutoConnect, auto_connect_);
289 }
290 if (check_portal_ == kCheckPortalAuto) {
291 storage->DeleteKey(id, kStorageCheckPortal);
292 } else {
293 storage->SetString(id, kStorageCheckPortal, check_portal_);
294 }
295 storage->SetBool(id, kStorageFavorite, favorite_);
296 storage->SetString(id, kStorageName, name_);
297 SaveString(storage, kStorageProxyConfig, proxy_config_, false, true);
298 if (priority_ != kPriorityNone) {
299 storage->SetInt(id, kStoragePriority, priority_);
300 } else {
301 storage->DeleteKey(id, kStoragePriority);
302 }
303 if (save_credentials_) {
304 storage->DeleteKey(id, kStorageSaveCredentials);
305 } else {
306 storage->SetBool(id, kStorageSaveCredentials, false);
307 }
308
309 SaveEapCredentials(storage);
310
311 // TODO(petkov): Save these:
312
313 // "WiFi.HiddenSSID"
314 // "SSID"
315 // "Failure"
316 // "Modified"
317 // "LastAttempt"
318 // WiFiService: "Passphrase"
319 // "APN"
320 // "LastGoodAPN"
321
322 return true;
323}
324
Chris Masone6791a432011-07-12 13:23:19 -0700325const ProfileRefPtr &Service::profile() const { return profile_; }
326
327void Service::set_profile(const ProfileRefPtr &p) { profile_ = p; }
328
Paul Stewart75897df2011-04-27 09:05:53 -0700329} // namespace shill