blob: e0c891623012d31ef291048952196195f8285018 [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
88 // flimflam::kOperatorNameProperty: Registered in CellularService
89 // flimflam::kOperatorCodeProperty: Registered in CellularService
90 // flimflam::kRoamingStateProperty: Registered in CellularService
91 // flimflam::kPaymentURLProperty: Registered in CellularService
92
Chris Masone27c4aa52011-07-02 13:10:14 -070093 store_.RegisterString(flimflam::kCheckPortalProperty, &check_portal_);
94 store_.RegisterConstBool(flimflam::kConnectableProperty, &connectable_);
95 HelpRegisterDerivedString(flimflam::kDeviceProperty,
96 &Service::GetDeviceRpcId,
97 NULL);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070098
Chris Masoneb2e326b2011-07-12 13:28:51 -070099 store_.RegisterString(flimflam::kEapIdentityProperty, &eap_.identity);
100 store_.RegisterString(flimflam::kEAPEAPProperty, &eap_.eap);
101 store_.RegisterString(flimflam::kEapPhase2AuthProperty, &eap_.inner_eap);
Chris Masone27c4aa52011-07-02 13:10:14 -0700102 store_.RegisterString(flimflam::kEapAnonymousIdentityProperty,
Chris Masoneb2e326b2011-07-12 13:28:51 -0700103 &eap_.anonymous_identity);
104 store_.RegisterString(flimflam::kEAPClientCertProperty, &eap_.client_cert);
105 store_.RegisterString(flimflam::kEAPCertIDProperty, &eap_.cert_id);
106 store_.RegisterString(flimflam::kEapPrivateKeyProperty, &eap_.private_key);
Chris Masone27c4aa52011-07-02 13:10:14 -0700107 store_.RegisterString(flimflam::kEapPrivateKeyPasswordProperty,
Chris Masoneb2e326b2011-07-12 13:28:51 -0700108 &eap_.private_key_password);
109 store_.RegisterString(flimflam::kEAPKeyIDProperty, &eap_.key_id);
110 store_.RegisterString(flimflam::kEapCaCertProperty, &eap_.ca_cert);
111 store_.RegisterString(flimflam::kEapCaCertIDProperty, &eap_.ca_cert_id);
112 store_.RegisterString(flimflam::kEAPPINProperty, &eap_.pin);
113 store_.RegisterString(flimflam::kEapPasswordProperty, &eap_.password);
114 store_.RegisterString(flimflam::kEapKeyMgmtProperty, &eap_.key_management);
115 store_.RegisterBool(flimflam::kEapUseSystemCAsProperty, &eap_.use_system_cas);
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700116
Chris Masone27c4aa52011-07-02 13:10:14 -0700117 store_.RegisterConstString(flimflam::kErrorProperty, &error_);
118 store_.RegisterConstBool(flimflam::kFavoriteProperty, &favorite_);
119 HelpRegisterDerivedBool(flimflam::kIsActiveProperty,
Chris Masoneb2e326b2011-07-12 13:28:51 -0700120 &Service::IsActive,
121 NULL);
Chris Masone4d42df82011-07-02 17:09:39 -0700122 // flimflam::kModeProperty: Registered in WiFiService
Chris Masone27c4aa52011-07-02 13:10:14 -0700123 store_.RegisterConstString(flimflam::kNameProperty, &name_);
Chris Masone4d42df82011-07-02 17:09:39 -0700124 // flimflam::kPassphraseProperty: Registered in WiFiService
125 // flimflam::kPassphraseRequiredProperty: Registered in WiFiService
Chris Masone27c4aa52011-07-02 13:10:14 -0700126 store_.RegisterInt32(flimflam::kPriorityProperty, &priority_);
127 HelpRegisterDerivedString(flimflam::kProfileProperty,
128 &Service::GetProfileRpcId,
129 NULL);
Chris Masone4d42df82011-07-02 17:09:39 -0700130 store_.RegisterString(flimflam::kProxyConfigProperty, &proxy_config_);
Chris Masone43b48a12011-07-01 13:37:07 -0700131 // TODO(cmasone): Create VPN Service with this property
Chris Masone27c4aa52011-07-02 13:10:14 -0700132 // store_.RegisterConstStringmap(flimflam::kProviderProperty, &provider_);
Chris Masone4d42df82011-07-02 17:09:39 -0700133
Chris Masoneb2e326b2011-07-12 13:28:51 -0700134 store_.RegisterBool(flimflam::kSaveCredentialsProperty, &save_credentials_);
Chris Masone4d42df82011-07-02 17:09:39 -0700135 // flimflam::kSecurityProperty: Registered in WiFiService
Chris Masone27c4aa52011-07-02 13:10:14 -0700136 HelpRegisterDerivedString(flimflam::kStateProperty,
137 &Service::CalculateState,
138 NULL);
Chris Masone4d42df82011-07-02 17:09:39 -0700139 // flimflam::kSignalStrengthProperty: Registered in WiFi/CellularService
140 // flimflam::kTypeProperty: Registered in all derived classes.
141 // flimflam::kWifiAuthMode: Registered in WiFiService
142 // flimflam::kWifiHiddenSsid: Registered in WiFiService
143 // flimflam::kWifiFrequency: Registered in WiFiService
144 // flimflam::kWifiPhyMode: Registered in WiFiService
145 // flimflam::kWifiHexSsid: Registered in WiFiService
Chris Masoneb07006b2011-05-14 16:10:04 -0700146 VLOG(2) << "Service initialized.";
Paul Stewart75897df2011-04-27 09:05:53 -0700147}
148
Paul Stewartba41b992011-05-26 07:02:46 -0700149Service::~Service() {}
Paul Stewart75897df2011-04-27 09:05:53 -0700150
Chris Masone6791a432011-07-12 13:23:19 -0700151string Service::GetRpcIdentifier() const {
Chris Masone3c3f6a12011-07-01 10:01:41 -0700152 return adaptor_->GetRpcIdentifier();
153}
154
Darin Petkovba40dd32011-07-11 20:06:39 -0700155string Service::GetStorageIdentifier() {
156 return UniqueName();
157}
158
Chris Masone27c4aa52011-07-02 13:10:14 -0700159void Service::HelpRegisterDerivedBool(const string &name,
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700160 bool(Service::*get)(void),
161 bool(Service::*set)(const bool&)) {
Chris Masone27c4aa52011-07-02 13:10:14 -0700162 store_.RegisterDerivedBool(
163 name,
164 BoolAccessor(new CustomAccessor<Service, bool>(this, get, set)));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700165}
166
Chris Masone27c4aa52011-07-02 13:10:14 -0700167void Service::HelpRegisterDerivedString(const string &name,
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700168 string(Service::*get)(void),
169 bool(Service::*set)(const string&)) {
Chris Masone27c4aa52011-07-02 13:10:14 -0700170 store_.RegisterDerivedString(
171 name,
172 StringAccessor(new CustomAccessor<Service, string>(this, get, set)));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700173}
174
Darin Petkovba40dd32011-07-11 20:06:39 -0700175void Service::SaveString(StoreInterface *storage,
176 const string &key,
177 const string &value,
178 bool crypted,
179 bool save) {
180 if (value.empty() || !save) {
181 storage->DeleteKey(GetStorageIdentifier(), key);
182 return;
183 }
184 if (crypted) {
185 storage->SetCryptedString(GetStorageIdentifier(), key, value);
186 return;
187 }
188 storage->SetString(GetStorageIdentifier(), key, value);
189}
190
191void Service::LoadEapCredentials(StoreInterface *storage) {
192 const string id = GetStorageIdentifier();
193 storage->GetCryptedString(id, kStorageEapIdentity, &eap_.identity);
194 storage->GetString(id, kStorageEapEap, &eap_.eap);
195 storage->GetString(id, kStorageEapInnerEap, &eap_.inner_eap);
196 storage->GetCryptedString(id,
197 kStorageEapAnonymousIdentity,
198 &eap_.anonymous_identity);
199 storage->GetString(id, kStorageEapClientCert, &eap_.client_cert);
200 storage->GetString(id, kStorageEapCertID, &eap_.cert_id);
201 storage->GetString(id, kStorageEapPrivateKey, &eap_.private_key);
202 storage->GetCryptedString(id,
203 kStorageEapPrivateKeyPassword,
204 &eap_.private_key_password);
205 storage->GetString(id, kStorageEapKeyID, &eap_.key_id);
206 storage->GetString(id, kStorageEapCACert, &eap_.ca_cert);
207 storage->GetString(id, kStorageEapCACertID, &eap_.ca_cert_id);
208 storage->GetBool(id, kStorageEapUseSystemCAs, &eap_.use_system_cas);
209 storage->GetString(id, kStorageEapPIN, &eap_.pin);
210 storage->GetCryptedString(id, kStorageEapPassword, &eap_.password);
211 storage->GetString(id, kStorageEapKeyManagement, &eap_.key_management);
212}
213
214void Service::SaveEapCredentials(StoreInterface *storage) {
215 bool save = save_credentials_;
216 SaveString(storage, kStorageEapIdentity, eap_.identity, true, save);
217 SaveString(storage, kStorageEapEap, eap_.eap, false, true);
218 SaveString(storage, kStorageEapInnerEap, eap_.inner_eap, false, true);
219 SaveString(storage,
220 kStorageEapAnonymousIdentity,
221 eap_.anonymous_identity,
222 true,
223 save);
224 SaveString(storage, kStorageEapClientCert, eap_.client_cert, false, save);
225 SaveString(storage, kStorageEapCertID, eap_.cert_id, false, save);
226 SaveString(storage, kStorageEapPrivateKey, eap_.private_key, false, save);
227 SaveString(storage,
228 kStorageEapPrivateKeyPassword,
229 eap_.private_key_password,
230 true,
231 save);
232 SaveString(storage, kStorageEapKeyID, eap_.key_id, false, save);
233 SaveString(storage, kStorageEapCACert, eap_.ca_cert, false, true);
234 SaveString(storage, kStorageEapCACertID, eap_.ca_cert_id, false, true);
235 storage->SetBool(GetStorageIdentifier(),
236 kStorageEapUseSystemCAs,
237 eap_.use_system_cas);
238 SaveString(storage, kStorageEapPIN, eap_.pin, false, save);
239 SaveString(storage, kStorageEapPassword, eap_.password, true, save);
240 SaveString(storage,
241 kStorageEapKeyManagement,
242 eap_.key_management,
243 false,
244 true);
245}
246
247bool Service::Load(StoreInterface *storage) {
248 const string id = GetStorageIdentifier();
249 if (!storage->ContainsGroup(id)) {
250 LOG(WARNING) << "Service is not available in the persistent store: " << id;
251 return false;
252 }
253 storage->GetBool(id, kStorageAutoConnect, &auto_connect_);
254 storage->GetString(id, kStorageCheckPortal, &check_portal_);
255 storage->GetBool(id, kStorageFavorite, &favorite_);
256 storage->GetInt(id, kStoragePriority, &priority_);
257 storage->GetString(id, kStorageProxyConfig, &proxy_config_);
258 storage->GetBool(id, kStorageSaveCredentials, &save_credentials_);
259
260 LoadEapCredentials(storage);
261
262 // TODO(petkov): Load these:
263
264 // "Name"
265 // "WiFi.HiddenSSID"
266 // "SSID"
267 // "Failure"
268 // "Modified"
269 // "LastAttempt"
270 // WiFiService: "Passphrase"
271 // "APN"
272 // "LastGoodAPN"
273
274 return true;
275}
276
277bool Service::Save(StoreInterface *storage) {
278 const string id = GetStorageIdentifier();
279
280 // TODO(petkov): We could choose to simplify the saving code by removing most
281 // conditionals thus saving even default values.
282 if (favorite_) {
283 storage->SetBool(id, kStorageAutoConnect, auto_connect_);
284 }
285 if (check_portal_ == kCheckPortalAuto) {
286 storage->DeleteKey(id, kStorageCheckPortal);
287 } else {
288 storage->SetString(id, kStorageCheckPortal, check_portal_);
289 }
290 storage->SetBool(id, kStorageFavorite, favorite_);
291 storage->SetString(id, kStorageName, name_);
292 SaveString(storage, kStorageProxyConfig, proxy_config_, false, true);
293 if (priority_ != kPriorityNone) {
294 storage->SetInt(id, kStoragePriority, priority_);
295 } else {
296 storage->DeleteKey(id, kStoragePriority);
297 }
298 if (save_credentials_) {
299 storage->DeleteKey(id, kStorageSaveCredentials);
300 } else {
301 storage->SetBool(id, kStorageSaveCredentials, false);
302 }
303
304 SaveEapCredentials(storage);
305
306 // TODO(petkov): Save these:
307
308 // "WiFi.HiddenSSID"
309 // "SSID"
310 // "Failure"
311 // "Modified"
312 // "LastAttempt"
313 // WiFiService: "Passphrase"
314 // "APN"
315 // "LastGoodAPN"
316
317 return true;
318}
319
Chris Masone6791a432011-07-12 13:23:19 -0700320const ProfileRefPtr &Service::profile() const { return profile_; }
321
322void Service::set_profile(const ProfileRefPtr &p) { profile_ = p; }
323
Paul Stewart75897df2011-04-27 09:05:53 -0700324} // namespace shill