OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/password_manager/native_backend_kwallet_x.h" | 5 #include "chrome/browser/password_manager/native_backend_kwallet_x.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 // In case the fields in the pickle ever change, version them so we can try to | 32 // In case the fields in the pickle ever change, version them so we can try to |
33 // read old pickles. (Note: do not eat old pickles past the expiration date.) | 33 // read old pickles. (Note: do not eat old pickles past the expiration date.) |
34 const int kPickleVersion = 7; | 34 const int kPickleVersion = 7; |
35 | 35 |
36 // We could localize this string, but then changing your locale would cause | 36 // We could localize this string, but then changing your locale would cause |
37 // you to lose access to all your stored passwords. Maybe best not to do that. | 37 // you to lose access to all your stored passwords. Maybe best not to do that. |
38 // Name of the folder to store passwords in. | 38 // Name of the folder to store passwords in. |
39 const char kKWalletFolder[] = "Chrome Form Data"; | 39 const char kKWalletFolder[] = "Chrome Form Data"; |
40 | 40 |
41 // DBus service, path, and interface names for klauncher and kwalletd. | 41 // DBus service, path, and interface names for klauncher and kwalletd. |
| 42 const char kKWalletDName[] = "kwalletd"; |
| 43 const char kKWalletD5Name[] = "kwalletd5"; |
42 const char kKWalletServiceName[] = "org.kde.kwalletd"; | 44 const char kKWalletServiceName[] = "org.kde.kwalletd"; |
| 45 const char kKWallet5ServiceName[] = "org.kde.kwalletd5"; |
43 const char kKWalletPath[] = "/modules/kwalletd"; | 46 const char kKWalletPath[] = "/modules/kwalletd"; |
| 47 const char kKWallet5Path[] = "/modules/kwalletd5"; |
44 const char kKWalletInterface[] = "org.kde.KWallet"; | 48 const char kKWalletInterface[] = "org.kde.KWallet"; |
45 const char kKLauncherServiceName[] = "org.kde.klauncher"; | 49 const char kKLauncherServiceName[] = "org.kde.klauncher"; |
46 const char kKLauncherPath[] = "/KLauncher"; | 50 const char kKLauncherPath[] = "/KLauncher"; |
47 const char kKLauncherInterface[] = "org.kde.KLauncher"; | 51 const char kKLauncherInterface[] = "org.kde.KLauncher"; |
48 | 52 |
49 // Checks a serialized list of PasswordForms for sanity. Returns true if OK. | 53 // Checks a serialized list of PasswordForms for sanity. Returns true if OK. |
50 // Note that |realm| is only used for generating a useful warning message. | 54 // Note that |realm| is only used for generating a useful warning message. |
51 bool CheckSerializedValue(const uint8_t* byte_array, | 55 bool CheckSerializedValue(const uint8_t* byte_array, |
52 size_t length, | 56 size_t length, |
53 const std::string& realm) { | 57 const std::string& realm) { |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 second.weak_clear(); | 265 second.weak_clear(); |
262 } | 266 } |
263 | 267 |
264 void UMALogDeserializationStatus(bool success) { | 268 void UMALogDeserializationStatus(bool success) { |
265 UMA_HISTOGRAM_BOOLEAN("PasswordManager.KWalletDeserializationStatus", | 269 UMA_HISTOGRAM_BOOLEAN("PasswordManager.KWalletDeserializationStatus", |
266 success); | 270 success); |
267 } | 271 } |
268 | 272 |
269 } // namespace | 273 } // namespace |
270 | 274 |
271 NativeBackendKWallet::NativeBackendKWallet(LocalProfileId id) | 275 NativeBackendKWallet::NativeBackendKWallet( |
| 276 LocalProfileId id, base::nix::DesktopEnvironment desktop_env) |
272 : profile_id_(id), | 277 : profile_id_(id), |
273 kwallet_proxy_(nullptr), | 278 kwallet_proxy_(nullptr), |
274 app_name_(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)) { | 279 app_name_(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)) { |
275 folder_name_ = GetProfileSpecificFolderName(); | 280 folder_name_ = GetProfileSpecificFolderName(); |
| 281 |
| 282 if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE5) { |
| 283 dbus_service_name_ = kKWallet5ServiceName; |
| 284 dbus_path_ = kKWallet5Path; |
| 285 kwalletd_name_ = kKWalletD5Name; |
| 286 } else { |
| 287 dbus_service_name_ = kKWalletServiceName; |
| 288 dbus_path_ = kKWalletPath; |
| 289 kwalletd_name_ = kKWalletDName; |
| 290 } |
276 } | 291 } |
277 | 292 |
278 NativeBackendKWallet::~NativeBackendKWallet() { | 293 NativeBackendKWallet::~NativeBackendKWallet() { |
279 // This destructor is called on the thread that is destroying the Profile | 294 // This destructor is called on the thread that is destroying the Profile |
280 // containing the PasswordStore that owns this NativeBackend. Generally that | 295 // containing the PasswordStore that owns this NativeBackend. Generally that |
281 // won't be the DB thread; it will be the UI thread. So we post a message to | 296 // won't be the DB thread; it will be the UI thread. So we post a message to |
282 // shut it down on the DB thread, and it will be destructed afterward when the | 297 // shut it down on the DB thread, and it will be destructed afterward when the |
283 // scoped_refptr<dbus::Bus> goes out of scope. The NativeBackend will be | 298 // scoped_refptr<dbus::Bus> goes out of scope. The NativeBackend will be |
284 // destroyed before that occurs, but that's OK. | 299 // destroyed before that occurs, but that's OK. |
285 if (session_bus_.get()) { | 300 if (session_bus_.get()) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 // The optional_bus parameter is given when this method is called in tests. | 337 // The optional_bus parameter is given when this method is called in tests. |
323 session_bus_ = optional_bus; | 338 session_bus_ = optional_bus; |
324 } else { | 339 } else { |
325 // Get a (real) connection to the session bus. | 340 // Get a (real) connection to the session bus. |
326 dbus::Bus::Options options; | 341 dbus::Bus::Options options; |
327 options.bus_type = dbus::Bus::SESSION; | 342 options.bus_type = dbus::Bus::SESSION; |
328 options.connection_type = dbus::Bus::PRIVATE; | 343 options.connection_type = dbus::Bus::PRIVATE; |
329 session_bus_ = new dbus::Bus(options); | 344 session_bus_ = new dbus::Bus(options); |
330 } | 345 } |
331 kwallet_proxy_ = | 346 kwallet_proxy_ = |
332 session_bus_->GetObjectProxy(kKWalletServiceName, | 347 session_bus_->GetObjectProxy(dbus_service_name_, |
333 dbus::ObjectPath(kKWalletPath)); | 348 dbus::ObjectPath(dbus_path_)); |
334 // kwalletd may not be running. If we get a temporary failure initializing it, | 349 // kwalletd may not be running. If we get a temporary failure initializing it, |
335 // try to start it and then try again. (Note the short-circuit evaluation.) | 350 // try to start it and then try again. (Note the short-circuit evaluation.) |
336 const InitResult result = InitWallet(); | 351 const InitResult result = InitWallet(); |
337 *success = (result == INIT_SUCCESS || | 352 *success = (result == INIT_SUCCESS || |
338 (result == TEMPORARY_FAIL && | 353 (result == TEMPORARY_FAIL && |
339 StartKWalletd() && InitWallet() == INIT_SUCCESS)); | 354 StartKWalletd() && InitWallet() == INIT_SUCCESS)); |
340 event->Signal(); | 355 event->Signal(); |
341 } | 356 } |
342 | 357 |
343 bool NativeBackendKWallet::StartKWalletd() { | 358 bool NativeBackendKWallet::StartKWalletd() { |
344 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 359 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
345 // Sadly kwalletd doesn't use DBus activation, so we have to make a call to | 360 // Sadly kwalletd doesn't use DBus activation, so we have to make a call to |
346 // klauncher to start it. | 361 // klauncher to start it. |
347 dbus::ObjectProxy* klauncher = | 362 dbus::ObjectProxy* klauncher = |
348 session_bus_->GetObjectProxy(kKLauncherServiceName, | 363 session_bus_->GetObjectProxy(kKLauncherServiceName, |
349 dbus::ObjectPath(kKLauncherPath)); | 364 dbus::ObjectPath(kKLauncherPath)); |
350 | 365 |
351 dbus::MethodCall method_call(kKLauncherInterface, | 366 dbus::MethodCall method_call(kKLauncherInterface, |
352 "start_service_by_desktop_name"); | 367 "start_service_by_desktop_name"); |
353 dbus::MessageWriter builder(&method_call); | 368 dbus::MessageWriter builder(&method_call); |
354 std::vector<std::string> empty; | 369 std::vector<std::string> empty; |
355 builder.AppendString("kwalletd"); // serviceName | 370 builder.AppendString(kwalletd_name_); // serviceName |
356 builder.AppendArrayOfStrings(empty); // urls | 371 builder.AppendArrayOfStrings(empty); // urls |
357 builder.AppendArrayOfStrings(empty); // envs | 372 builder.AppendArrayOfStrings(empty); // envs |
358 builder.AppendString(std::string()); // startup_id | 373 builder.AppendString(std::string()); // startup_id |
359 builder.AppendBool(false); // blind | 374 builder.AppendBool(false); // blind |
360 scoped_ptr<dbus::Response> response( | 375 scoped_ptr<dbus::Response> response( |
361 klauncher->CallMethodAndBlock( | 376 klauncher->CallMethodAndBlock( |
362 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 377 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
363 if (!response.get()) { | 378 if (!response.get()) { |
364 LOG(ERROR) << "Error contacting klauncher to start kwalletd"; | 379 LOG(ERROR) << "Error contacting klauncher to start " << kwalletd_name_; |
365 return false; | 380 return false; |
366 } | 381 } |
367 dbus::MessageReader reader(response.get()); | 382 dbus::MessageReader reader(response.get()); |
368 int32_t ret = -1; | 383 int32_t ret = -1; |
369 std::string dbus_name; | 384 std::string dbus_name; |
370 std::string error; | 385 std::string error; |
371 int32_t pid = -1; | 386 int32_t pid = -1; |
372 if (!reader.PopInt32(&ret) || !reader.PopString(&dbus_name) || | 387 if (!reader.PopInt32(&ret) || !reader.PopString(&dbus_name) || |
373 !reader.PopString(&error) || !reader.PopInt32(&pid)) { | 388 !reader.PopString(&error) || !reader.PopInt32(&pid)) { |
374 LOG(ERROR) << "Error reading response from klauncher to start kwalletd: " | 389 LOG(ERROR) << "Error reading response from klauncher to start " |
375 << response->ToString(); | 390 << kwalletd_name_ << ": " << response->ToString(); |
376 return false; | 391 return false; |
377 } | 392 } |
378 if (!error.empty() || ret) { | 393 if (!error.empty() || ret) { |
379 LOG(ERROR) << "Error launching kwalletd: error '" << error << "' " | 394 LOG(ERROR) << "Error launching " << kwalletd_name_ << ": error '" << error |
380 << " (code " << ret << ")"; | 395 << "' (code " << ret << ")"; |
381 return false; | 396 return false; |
382 } | 397 } |
383 | 398 |
384 return true; | 399 return true; |
385 } | 400 } |
386 | 401 |
387 NativeBackendKWallet::InitResult NativeBackendKWallet::InitWallet() { | 402 NativeBackendKWallet::InitResult NativeBackendKWallet::InitWallet() { |
388 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 403 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
389 { | 404 { |
390 // Check that KWallet is enabled. | 405 // Check that KWallet is enabled. |
391 dbus::MethodCall method_call(kKWalletInterface, "isEnabled"); | 406 dbus::MethodCall method_call(kKWalletInterface, "isEnabled"); |
392 scoped_ptr<dbus::Response> response( | 407 scoped_ptr<dbus::Response> response( |
393 kwallet_proxy_->CallMethodAndBlock( | 408 kwallet_proxy_->CallMethodAndBlock( |
394 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 409 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
395 if (!response.get()) { | 410 if (!response.get()) { |
396 LOG(ERROR) << "Error contacting kwalletd (isEnabled)"; | 411 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (isEnabled)"; |
397 return TEMPORARY_FAIL; | 412 return TEMPORARY_FAIL; |
398 } | 413 } |
399 dbus::MessageReader reader(response.get()); | 414 dbus::MessageReader reader(response.get()); |
400 bool enabled = false; | 415 bool enabled = false; |
401 if (!reader.PopBool(&enabled)) { | 416 if (!reader.PopBool(&enabled)) { |
402 LOG(ERROR) << "Error reading response from kwalletd (isEnabled): " | 417 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
403 << response->ToString(); | 418 << " (isEnabled): " << response->ToString(); |
404 return PERMANENT_FAIL; | 419 return PERMANENT_FAIL; |
405 } | 420 } |
406 // Not enabled? Don't use KWallet. But also don't warn here. | 421 // Not enabled? Don't use KWallet. But also don't warn here. |
407 if (!enabled) { | 422 if (!enabled) { |
408 VLOG(1) << "kwalletd reports that KWallet is not enabled."; | 423 VLOG(1) << kwalletd_name_ << " reports that KWallet is not enabled."; |
409 return PERMANENT_FAIL; | 424 return PERMANENT_FAIL; |
410 } | 425 } |
411 } | 426 } |
412 | 427 |
413 { | 428 { |
414 // Get the wallet name. | 429 // Get the wallet name. |
415 dbus::MethodCall method_call(kKWalletInterface, "networkWallet"); | 430 dbus::MethodCall method_call(kKWalletInterface, "networkWallet"); |
416 scoped_ptr<dbus::Response> response( | 431 scoped_ptr<dbus::Response> response( |
417 kwallet_proxy_->CallMethodAndBlock( | 432 kwallet_proxy_->CallMethodAndBlock( |
418 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 433 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
419 if (!response.get()) { | 434 if (!response.get()) { |
420 LOG(ERROR) << "Error contacting kwalletd (networkWallet)"; | 435 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (networkWallet)"; |
421 return TEMPORARY_FAIL; | 436 return TEMPORARY_FAIL; |
422 } | 437 } |
423 dbus::MessageReader reader(response.get()); | 438 dbus::MessageReader reader(response.get()); |
424 if (!reader.PopString(&wallet_name_)) { | 439 if (!reader.PopString(&wallet_name_)) { |
425 LOG(ERROR) << "Error reading response from kwalletd (networkWallet): " | 440 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
426 << response->ToString(); | 441 << " (networkWallet): " << response->ToString(); |
427 return PERMANENT_FAIL; | 442 return PERMANENT_FAIL; |
428 } | 443 } |
429 } | 444 } |
430 | 445 |
431 return INIT_SUCCESS; | 446 return INIT_SUCCESS; |
432 } | 447 } |
433 | 448 |
434 password_manager::PasswordStoreChangeList NativeBackendKWallet::AddLogin( | 449 password_manager::PasswordStoreChangeList NativeBackendKWallet::AddLogin( |
435 const PasswordForm& form) { | 450 const PasswordForm& form) { |
436 int wallet_handle = WalletHandle(); | 451 int wallet_handle = WalletHandle(); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 dbus::MethodCall method_call(kKWalletInterface, "hasEntry"); | 590 dbus::MethodCall method_call(kKWalletInterface, "hasEntry"); |
576 dbus::MessageWriter builder(&method_call); | 591 dbus::MessageWriter builder(&method_call); |
577 builder.AppendInt32(wallet_handle); // handle | 592 builder.AppendInt32(wallet_handle); // handle |
578 builder.AppendString(folder_name_); // folder | 593 builder.AppendString(folder_name_); // folder |
579 builder.AppendString(signon_realm); // key | 594 builder.AppendString(signon_realm); // key |
580 builder.AppendString(app_name_); // appid | 595 builder.AppendString(app_name_); // appid |
581 scoped_ptr<dbus::Response> response( | 596 scoped_ptr<dbus::Response> response( |
582 kwallet_proxy_->CallMethodAndBlock( | 597 kwallet_proxy_->CallMethodAndBlock( |
583 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 598 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
584 if (!response.get()) { | 599 if (!response.get()) { |
585 LOG(ERROR) << "Error contacting kwalletd (hasEntry)"; | 600 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (hasEntry)"; |
586 return false; | 601 return false; |
587 } | 602 } |
588 dbus::MessageReader reader(response.get()); | 603 dbus::MessageReader reader(response.get()); |
589 bool has_entry = false; | 604 bool has_entry = false; |
590 if (!reader.PopBool(&has_entry)) { | 605 if (!reader.PopBool(&has_entry)) { |
591 LOG(ERROR) << "Error reading response from kwalletd (hasEntry): " | 606 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
592 << response->ToString(); | 607 << " (hasEntry): " << response->ToString(); |
593 return false; | 608 return false; |
594 } | 609 } |
595 if (!has_entry) { | 610 if (!has_entry) { |
596 // This is not an error. There just isn't a matching entry. | 611 // This is not an error. There just isn't a matching entry. |
597 return true; | 612 return true; |
598 } | 613 } |
599 } | 614 } |
600 | 615 |
601 { | 616 { |
602 dbus::MethodCall method_call(kKWalletInterface, "readEntry"); | 617 dbus::MethodCall method_call(kKWalletInterface, "readEntry"); |
603 dbus::MessageWriter builder(&method_call); | 618 dbus::MessageWriter builder(&method_call); |
604 builder.AppendInt32(wallet_handle); // handle | 619 builder.AppendInt32(wallet_handle); // handle |
605 builder.AppendString(folder_name_); // folder | 620 builder.AppendString(folder_name_); // folder |
606 builder.AppendString(signon_realm); // key | 621 builder.AppendString(signon_realm); // key |
607 builder.AppendString(app_name_); // appid | 622 builder.AppendString(app_name_); // appid |
608 scoped_ptr<dbus::Response> response( | 623 scoped_ptr<dbus::Response> response( |
609 kwallet_proxy_->CallMethodAndBlock( | 624 kwallet_proxy_->CallMethodAndBlock( |
610 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 625 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
611 if (!response.get()) { | 626 if (!response.get()) { |
612 LOG(ERROR) << "Error contacting kwalletd (readEntry)"; | 627 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (readEntry)"; |
613 return false; | 628 return false; |
614 } | 629 } |
615 dbus::MessageReader reader(response.get()); | 630 dbus::MessageReader reader(response.get()); |
616 const uint8_t* bytes = nullptr; | 631 const uint8_t* bytes = nullptr; |
617 size_t length = 0; | 632 size_t length = 0; |
618 if (!reader.PopArrayOfBytes(&bytes, &length)) { | 633 if (!reader.PopArrayOfBytes(&bytes, &length)) { |
619 LOG(ERROR) << "Error reading response from kwalletd (readEntry): " | 634 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
620 << response->ToString(); | 635 << " (readEntry): " << response->ToString(); |
621 return false; | 636 return false; |
622 } | 637 } |
623 if (!bytes) | 638 if (!bytes) |
624 return false; | 639 return false; |
625 if (!CheckSerializedValue(bytes, length, signon_realm)) { | 640 if (!CheckSerializedValue(bytes, length, signon_realm)) { |
626 // This is weird, but we choose not to call it an error. There is an | 641 // This is weird, but we choose not to call it an error. There is an |
627 // invalid entry somehow, but by just ignoring it, we make it easier to | 642 // invalid entry somehow, but by just ignoring it, we make it easier to |
628 // repair without having to delete it using kwalletmanager (that is, by | 643 // repair without having to delete it using kwalletmanager (that is, by |
629 // just saving a new password within this realm to overwrite it). | 644 // just saving a new password within this realm to overwrite it). |
630 return true; | 645 return true; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 { | 707 { |
693 dbus::MethodCall method_call(kKWalletInterface, "entryList"); | 708 dbus::MethodCall method_call(kKWalletInterface, "entryList"); |
694 dbus::MessageWriter builder(&method_call); | 709 dbus::MessageWriter builder(&method_call); |
695 builder.AppendInt32(wallet_handle); // handle | 710 builder.AppendInt32(wallet_handle); // handle |
696 builder.AppendString(folder_name_); // folder | 711 builder.AppendString(folder_name_); // folder |
697 builder.AppendString(app_name_); // appid | 712 builder.AppendString(app_name_); // appid |
698 scoped_ptr<dbus::Response> response( | 713 scoped_ptr<dbus::Response> response( |
699 kwallet_proxy_->CallMethodAndBlock( | 714 kwallet_proxy_->CallMethodAndBlock( |
700 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 715 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
701 if (!response.get()) { | 716 if (!response.get()) { |
702 LOG(ERROR) << "Error contacting kwalletd (entryList)"; | 717 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (entryList)"; |
703 return false; | 718 return false; |
704 } | 719 } |
705 dbus::MessageReader reader(response.get()); | 720 dbus::MessageReader reader(response.get()); |
706 if (!reader.PopArrayOfStrings(&realm_list)) { | 721 if (!reader.PopArrayOfStrings(&realm_list)) { |
707 LOG(ERROR) << "Error reading response from kwalletd (entryList): " | 722 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
708 << response->ToString(); | 723 << "(entryList): " << response->ToString(); |
709 return false; | 724 return false; |
710 } | 725 } |
711 } | 726 } |
712 | 727 |
713 forms->clear(); | 728 forms->clear(); |
714 for (const std::string& signon_realm : realm_list) { | 729 for (const std::string& signon_realm : realm_list) { |
715 dbus::MethodCall method_call(kKWalletInterface, "readEntry"); | 730 dbus::MethodCall method_call(kKWalletInterface, "readEntry"); |
716 dbus::MessageWriter builder(&method_call); | 731 dbus::MessageWriter builder(&method_call); |
717 builder.AppendInt32(wallet_handle); // handle | 732 builder.AppendInt32(wallet_handle); // handle |
718 builder.AppendString(folder_name_); // folder | 733 builder.AppendString(folder_name_); // folder |
719 builder.AppendString(signon_realm); // key | 734 builder.AppendString(signon_realm); // key |
720 builder.AppendString(app_name_); // appid | 735 builder.AppendString(app_name_); // appid |
721 scoped_ptr<dbus::Response> response( | 736 scoped_ptr<dbus::Response> response( |
722 kwallet_proxy_->CallMethodAndBlock( | 737 kwallet_proxy_->CallMethodAndBlock( |
723 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 738 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
724 if (!response.get()) { | 739 if (!response.get()) { |
725 LOG(ERROR) << "Error contacting kwalletd (readEntry)"; | 740 LOG(ERROR) << "Error contacting " << kwalletd_name_ << "(readEntry)"; |
726 return false; | 741 return false; |
727 } | 742 } |
728 dbus::MessageReader reader(response.get()); | 743 dbus::MessageReader reader(response.get()); |
729 const uint8_t* bytes = nullptr; | 744 const uint8_t* bytes = nullptr; |
730 size_t length = 0; | 745 size_t length = 0; |
731 if (!reader.PopArrayOfBytes(&bytes, &length)) { | 746 if (!reader.PopArrayOfBytes(&bytes, &length)) { |
732 LOG(ERROR) << "Error reading response from kwalletd (readEntry): " | 747 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
733 << response->ToString(); | 748 << " (readEntry): " << response->ToString(); |
734 return false; | 749 return false; |
735 } | 750 } |
736 if (!bytes || !CheckSerializedValue(bytes, length, signon_realm)) | 751 if (!bytes || !CheckSerializedValue(bytes, length, signon_realm)) |
737 continue; | 752 continue; |
738 | 753 |
739 // Can't we all just agree on whether bytes are signed or not? Please? | 754 // Can't we all just agree on whether bytes are signed or not? Please? |
740 base::Pickle pickle(reinterpret_cast<const char*>(bytes), length); | 755 base::Pickle pickle(reinterpret_cast<const char*>(bytes), length); |
741 AppendSecondToFirst(forms, DeserializeValue(signon_realm, pickle)); | 756 AppendSecondToFirst(forms, DeserializeValue(signon_realm, pickle)); |
742 } | 757 } |
743 return true; | 758 return true; |
744 } | 759 } |
745 | 760 |
746 bool NativeBackendKWallet::SetLoginsList( | 761 bool NativeBackendKWallet::SetLoginsList( |
747 const std::vector<autofill::PasswordForm*>& forms, | 762 const std::vector<autofill::PasswordForm*>& forms, |
748 const std::string& signon_realm, | 763 const std::string& signon_realm, |
749 int wallet_handle) { | 764 int wallet_handle) { |
750 if (forms.empty()) { | 765 if (forms.empty()) { |
751 // No items left? Remove the entry from the wallet. | 766 // No items left? Remove the entry from the wallet. |
752 dbus::MethodCall method_call(kKWalletInterface, "removeEntry"); | 767 dbus::MethodCall method_call(kKWalletInterface, "removeEntry"); |
753 dbus::MessageWriter builder(&method_call); | 768 dbus::MessageWriter builder(&method_call); |
754 builder.AppendInt32(wallet_handle); // handle | 769 builder.AppendInt32(wallet_handle); // handle |
755 builder.AppendString(folder_name_); // folder | 770 builder.AppendString(folder_name_); // folder |
756 builder.AppendString(signon_realm); // key | 771 builder.AppendString(signon_realm); // key |
757 builder.AppendString(app_name_); // appid | 772 builder.AppendString(app_name_); // appid |
758 scoped_ptr<dbus::Response> response( | 773 scoped_ptr<dbus::Response> response( |
759 kwallet_proxy_->CallMethodAndBlock( | 774 kwallet_proxy_->CallMethodAndBlock( |
760 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 775 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
761 if (!response.get()) { | 776 if (!response.get()) { |
762 LOG(ERROR) << "Error contacting kwalletd (removeEntry)"; | 777 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (removeEntry)"; |
763 return kInvalidKWalletHandle; | 778 return kInvalidKWalletHandle; |
764 } | 779 } |
765 dbus::MessageReader reader(response.get()); | 780 dbus::MessageReader reader(response.get()); |
766 int ret = 0; | 781 int ret = 0; |
767 if (!reader.PopInt32(&ret)) { | 782 if (!reader.PopInt32(&ret)) { |
768 LOG(ERROR) << "Error reading response from kwalletd (removeEntry): " | 783 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
769 << response->ToString(); | 784 << " (removeEntry): " << response->ToString(); |
770 return false; | 785 return false; |
771 } | 786 } |
772 if (ret != 0) | 787 if (ret != 0) |
773 LOG(ERROR) << "Bad return code " << ret << " from KWallet removeEntry"; | 788 LOG(ERROR) << "Bad return code " << ret << " from KWallet removeEntry"; |
774 return ret == 0; | 789 return ret == 0; |
775 } | 790 } |
776 | 791 |
777 base::Pickle value; | 792 base::Pickle value; |
778 SerializeValue(forms, &value); | 793 SerializeValue(forms, &value); |
779 | 794 |
780 dbus::MethodCall method_call(kKWalletInterface, "writeEntry"); | 795 dbus::MethodCall method_call(kKWalletInterface, "writeEntry"); |
781 dbus::MessageWriter builder(&method_call); | 796 dbus::MessageWriter builder(&method_call); |
782 builder.AppendInt32(wallet_handle); // handle | 797 builder.AppendInt32(wallet_handle); // handle |
783 builder.AppendString(folder_name_); // folder | 798 builder.AppendString(folder_name_); // folder |
784 builder.AppendString(signon_realm); // key | 799 builder.AppendString(signon_realm); // key |
785 builder.AppendArrayOfBytes(static_cast<const uint8_t*>(value.data()), | 800 builder.AppendArrayOfBytes(static_cast<const uint8_t*>(value.data()), |
786 value.size()); // value | 801 value.size()); // value |
787 builder.AppendString(app_name_); // appid | 802 builder.AppendString(app_name_); // appid |
788 scoped_ptr<dbus::Response> response( | 803 scoped_ptr<dbus::Response> response( |
789 kwallet_proxy_->CallMethodAndBlock( | 804 kwallet_proxy_->CallMethodAndBlock( |
790 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 805 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
791 if (!response.get()) { | 806 if (!response.get()) { |
792 LOG(ERROR) << "Error contacting kwalletd (writeEntry)"; | 807 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (writeEntry)"; |
793 return kInvalidKWalletHandle; | 808 return kInvalidKWalletHandle; |
794 } | 809 } |
795 dbus::MessageReader reader(response.get()); | 810 dbus::MessageReader reader(response.get()); |
796 int ret = 0; | 811 int ret = 0; |
797 if (!reader.PopInt32(&ret)) { | 812 if (!reader.PopInt32(&ret)) { |
798 LOG(ERROR) << "Error reading response from kwalletd (writeEntry): " | 813 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
799 << response->ToString(); | 814 << " (writeEntry): " << response->ToString(); |
800 return false; | 815 return false; |
801 } | 816 } |
802 if (ret != 0) | 817 if (ret != 0) |
803 LOG(ERROR) << "Bad return code " << ret << " from KWallet writeEntry"; | 818 LOG(ERROR) << "Bad return code " << ret << " from KWallet writeEntry"; |
804 return ret == 0; | 819 return ret == 0; |
805 } | 820 } |
806 | 821 |
807 bool NativeBackendKWallet::RemoveLoginsBetween( | 822 bool NativeBackendKWallet::RemoveLoginsBetween( |
808 base::Time delete_begin, | 823 base::Time delete_begin, |
809 base::Time delete_end, | 824 base::Time delete_end, |
810 TimestampToCompare date_to_compare, | 825 TimestampToCompare date_to_compare, |
811 password_manager::PasswordStoreChangeList* changes) { | 826 password_manager::PasswordStoreChangeList* changes) { |
812 DCHECK(changes); | 827 DCHECK(changes); |
813 changes->clear(); | 828 changes->clear(); |
814 int wallet_handle = WalletHandle(); | 829 int wallet_handle = WalletHandle(); |
815 if (wallet_handle == kInvalidKWalletHandle) | 830 if (wallet_handle == kInvalidKWalletHandle) |
816 return false; | 831 return false; |
817 | 832 |
818 // We could probably also use readEntryList here. | 833 // We could probably also use readEntryList here. |
819 std::vector<std::string> realm_list; | 834 std::vector<std::string> realm_list; |
820 { | 835 { |
821 dbus::MethodCall method_call(kKWalletInterface, "entryList"); | 836 dbus::MethodCall method_call(kKWalletInterface, "entryList"); |
822 dbus::MessageWriter builder(&method_call); | 837 dbus::MessageWriter builder(&method_call); |
823 builder.AppendInt32(wallet_handle); // handle | 838 builder.AppendInt32(wallet_handle); // handle |
824 builder.AppendString(folder_name_); // folder | 839 builder.AppendString(folder_name_); // folder |
825 builder.AppendString(app_name_); // appid | 840 builder.AppendString(app_name_); // appid |
826 scoped_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( | 841 scoped_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
827 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 842 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
828 if (!response.get()) { | 843 if (!response.get()) { |
829 LOG(ERROR) << "Error contacting kwalletd (entryList)"; | 844 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (entryList)"; |
830 return false; | 845 return false; |
831 } | 846 } |
832 dbus::MessageReader reader(response.get()); | 847 dbus::MessageReader reader(response.get()); |
833 dbus::MessageReader array(response.get()); | 848 dbus::MessageReader array(response.get()); |
834 if (!reader.PopArray(&array)) { | 849 if (!reader.PopArray(&array)) { |
835 LOG(ERROR) << "Error reading response from kwalletd (entryList): " | 850 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
836 << response->ToString(); | 851 << " (entryList): " << response->ToString(); |
837 return false; | 852 return false; |
838 } | 853 } |
839 while (array.HasMoreData()) { | 854 while (array.HasMoreData()) { |
840 std::string realm; | 855 std::string realm; |
841 if (!array.PopString(&realm)) { | 856 if (!array.PopString(&realm)) { |
842 LOG(ERROR) << "Error reading response from kwalletd (entryList): " | 857 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
843 << response->ToString(); | 858 << " (entryList): " << response->ToString(); |
844 return false; | 859 return false; |
845 } | 860 } |
846 realm_list.push_back(realm); | 861 realm_list.push_back(realm); |
847 } | 862 } |
848 } | 863 } |
849 | 864 |
850 bool ok = true; | 865 bool ok = true; |
851 for (size_t i = 0; i < realm_list.size(); ++i) { | 866 for (size_t i = 0; i < realm_list.size(); ++i) { |
852 const std::string& signon_realm = realm_list[i]; | 867 const std::string& signon_realm = realm_list[i]; |
853 dbus::MethodCall method_call(kKWalletInterface, "readEntry"); | 868 dbus::MethodCall method_call(kKWalletInterface, "readEntry"); |
854 dbus::MessageWriter builder(&method_call); | 869 dbus::MessageWriter builder(&method_call); |
855 builder.AppendInt32(wallet_handle); // handle | 870 builder.AppendInt32(wallet_handle); // handle |
856 builder.AppendString(folder_name_); // folder | 871 builder.AppendString(folder_name_); // folder |
857 builder.AppendString(signon_realm); // key | 872 builder.AppendString(signon_realm); // key |
858 builder.AppendString(app_name_); // appid | 873 builder.AppendString(app_name_); // appid |
859 scoped_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( | 874 scoped_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
860 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 875 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
861 if (!response.get()) { | 876 if (!response.get()) { |
862 LOG(ERROR) << "Error contacting kwalletd (readEntry)"; | 877 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (readEntry)"; |
863 continue; | 878 continue; |
864 } | 879 } |
865 dbus::MessageReader reader(response.get()); | 880 dbus::MessageReader reader(response.get()); |
866 const uint8_t* bytes = nullptr; | 881 const uint8_t* bytes = nullptr; |
867 size_t length = 0; | 882 size_t length = 0; |
868 if (!reader.PopArrayOfBytes(&bytes, &length)) { | 883 if (!reader.PopArrayOfBytes(&bytes, &length)) { |
869 LOG(ERROR) << "Error reading response from kwalletd (readEntry): " | 884 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
870 << response->ToString(); | 885 << " (readEntry): " << response->ToString(); |
871 continue; | 886 continue; |
872 } | 887 } |
873 if (!bytes || !CheckSerializedValue(bytes, length, signon_realm)) | 888 if (!bytes || !CheckSerializedValue(bytes, length, signon_realm)) |
874 continue; | 889 continue; |
875 | 890 |
876 // Can't we all just agree on whether bytes are signed or not? Please? | 891 // Can't we all just agree on whether bytes are signed or not? Please? |
877 base::Pickle pickle(reinterpret_cast<const char*>(bytes), length); | 892 base::Pickle pickle(reinterpret_cast<const char*>(bytes), length); |
878 ScopedVector<autofill::PasswordForm> all_forms = | 893 ScopedVector<autofill::PasswordForm> all_forms = |
879 DeserializeValue(signon_realm, pickle); | 894 DeserializeValue(signon_realm, pickle); |
880 | 895 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
950 { | 965 { |
951 dbus::MethodCall method_call(kKWalletInterface, "open"); | 966 dbus::MethodCall method_call(kKWalletInterface, "open"); |
952 dbus::MessageWriter builder(&method_call); | 967 dbus::MessageWriter builder(&method_call); |
953 builder.AppendString(wallet_name_); // wallet | 968 builder.AppendString(wallet_name_); // wallet |
954 builder.AppendInt64(0); // wid | 969 builder.AppendInt64(0); // wid |
955 builder.AppendString(app_name_); // appid | 970 builder.AppendString(app_name_); // appid |
956 scoped_ptr<dbus::Response> response( | 971 scoped_ptr<dbus::Response> response( |
957 kwallet_proxy_->CallMethodAndBlock( | 972 kwallet_proxy_->CallMethodAndBlock( |
958 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 973 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
959 if (!response.get()) { | 974 if (!response.get()) { |
960 LOG(ERROR) << "Error contacting kwalletd (open)"; | 975 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (open)"; |
961 return kInvalidKWalletHandle; | 976 return kInvalidKWalletHandle; |
962 } | 977 } |
963 dbus::MessageReader reader(response.get()); | 978 dbus::MessageReader reader(response.get()); |
964 if (!reader.PopInt32(&handle)) { | 979 if (!reader.PopInt32(&handle)) { |
965 LOG(ERROR) << "Error reading response from kwalletd (open): " | 980 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
966 << response->ToString(); | 981 << " (open): " << response->ToString(); |
967 return kInvalidKWalletHandle; | 982 return kInvalidKWalletHandle; |
968 } | 983 } |
969 if (handle == kInvalidKWalletHandle) { | 984 if (handle == kInvalidKWalletHandle) { |
970 LOG(ERROR) << "Error obtaining KWallet handle"; | 985 LOG(ERROR) << "Error obtaining KWallet handle"; |
971 return kInvalidKWalletHandle; | 986 return kInvalidKWalletHandle; |
972 } | 987 } |
973 } | 988 } |
974 | 989 |
975 // Check if our folder exists. | 990 // Check if our folder exists. |
976 bool has_folder = false; | 991 bool has_folder = false; |
977 { | 992 { |
978 dbus::MethodCall method_call(kKWalletInterface, "hasFolder"); | 993 dbus::MethodCall method_call(kKWalletInterface, "hasFolder"); |
979 dbus::MessageWriter builder(&method_call); | 994 dbus::MessageWriter builder(&method_call); |
980 builder.AppendInt32(handle); // handle | 995 builder.AppendInt32(handle); // handle |
981 builder.AppendString(folder_name_); // folder | 996 builder.AppendString(folder_name_); // folder |
982 builder.AppendString(app_name_); // appid | 997 builder.AppendString(app_name_); // appid |
983 scoped_ptr<dbus::Response> response( | 998 scoped_ptr<dbus::Response> response( |
984 kwallet_proxy_->CallMethodAndBlock( | 999 kwallet_proxy_->CallMethodAndBlock( |
985 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 1000 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
986 if (!response.get()) { | 1001 if (!response.get()) { |
987 LOG(ERROR) << "Error contacting kwalletd (hasFolder)"; | 1002 LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (hasFolder)"; |
988 return kInvalidKWalletHandle; | 1003 return kInvalidKWalletHandle; |
989 } | 1004 } |
990 dbus::MessageReader reader(response.get()); | 1005 dbus::MessageReader reader(response.get()); |
991 if (!reader.PopBool(&has_folder)) { | 1006 if (!reader.PopBool(&has_folder)) { |
992 LOG(ERROR) << "Error reading response from kwalletd (hasFolder): " | 1007 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
993 << response->ToString(); | 1008 << " (hasFolder): " << response->ToString(); |
994 return kInvalidKWalletHandle; | 1009 return kInvalidKWalletHandle; |
995 } | 1010 } |
996 } | 1011 } |
997 | 1012 |
998 // Create it if it didn't. | 1013 // Create it if it didn't. |
999 if (!has_folder) { | 1014 if (!has_folder) { |
1000 dbus::MethodCall method_call(kKWalletInterface, "createFolder"); | 1015 dbus::MethodCall method_call(kKWalletInterface, "createFolder"); |
1001 dbus::MessageWriter builder(&method_call); | 1016 dbus::MessageWriter builder(&method_call); |
1002 builder.AppendInt32(handle); // handle | 1017 builder.AppendInt32(handle); // handle |
1003 builder.AppendString(folder_name_); // folder | 1018 builder.AppendString(folder_name_); // folder |
1004 builder.AppendString(app_name_); // appid | 1019 builder.AppendString(app_name_); // appid |
1005 scoped_ptr<dbus::Response> response( | 1020 scoped_ptr<dbus::Response> response( |
1006 kwallet_proxy_->CallMethodAndBlock( | 1021 kwallet_proxy_->CallMethodAndBlock( |
1007 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | 1022 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
1008 if (!response.get()) { | 1023 if (!response.get()) { |
1009 LOG(ERROR) << "Error contacting kwalletd (createFolder)"; | 1024 LOG(ERROR) << "Error contacting << " << kwalletd_name_ |
| 1025 << " (createFolder)"; |
1010 return kInvalidKWalletHandle; | 1026 return kInvalidKWalletHandle; |
1011 } | 1027 } |
1012 dbus::MessageReader reader(response.get()); | 1028 dbus::MessageReader reader(response.get()); |
1013 bool success = false; | 1029 bool success = false; |
1014 if (!reader.PopBool(&success)) { | 1030 if (!reader.PopBool(&success)) { |
1015 LOG(ERROR) << "Error reading response from kwalletd (createFolder): " | 1031 LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
1016 << response->ToString(); | 1032 << " (createFolder): " << response->ToString(); |
1017 return kInvalidKWalletHandle; | 1033 return kInvalidKWalletHandle; |
1018 } | 1034 } |
1019 if (!success) { | 1035 if (!success) { |
1020 LOG(ERROR) << "Error creating KWallet folder"; | 1036 LOG(ERROR) << "Error creating KWallet folder"; |
1021 return kInvalidKWalletHandle; | 1037 return kInvalidKWalletHandle; |
1022 } | 1038 } |
1023 } | 1039 } |
1024 | 1040 |
1025 return handle; | 1041 return handle; |
1026 } | 1042 } |
1027 | 1043 |
1028 std::string NativeBackendKWallet::GetProfileSpecificFolderName() const { | 1044 std::string NativeBackendKWallet::GetProfileSpecificFolderName() const { |
1029 // Originally, the folder name was always just "Chrome Form Data". | 1045 // Originally, the folder name was always just "Chrome Form Data". |
1030 // Now we use it to distinguish passwords for different profiles. | 1046 // Now we use it to distinguish passwords for different profiles. |
1031 return base::StringPrintf("%s (%d)", kKWalletFolder, profile_id_); | 1047 return base::StringPrintf("%s (%d)", kKWalletFolder, profile_id_); |
1032 } | 1048 } |
OLD | NEW |