| 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_gnome_x.h" | 5 #include "chrome/browser/password_manager/native_backend_gnome_x.h" |
| 6 | 6 |
| 7 #include <dlfcn.h> | 7 #include <dlfcn.h> |
| 8 #include <gnome-keyring.h> | 8 #include <gnome-keyring.h> |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 #include <stdint.h> | 10 #include <stdint.h> |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 using base::UTF8ToUTF16; | 35 using base::UTF8ToUTF16; |
| 36 using base::UTF16ToUTF8; | 36 using base::UTF16ToUTF8; |
| 37 using content::BrowserThread; | 37 using content::BrowserThread; |
| 38 using namespace password_manager::metrics_util; | 38 using namespace password_manager::metrics_util; |
| 39 using password_manager::PasswordStore; | 39 using password_manager::PasswordStore; |
| 40 | 40 |
| 41 namespace { | 41 namespace { |
| 42 const int kMaxPossibleTimeTValue = std::numeric_limits<int>::max(); | 42 const int kMaxPossibleTimeTValue = std::numeric_limits<int>::max(); |
| 43 } | 43 } |
| 44 | 44 |
| 45 #define GNOME_KEYRING_DEFINE_POINTER(name) \ | 45 decltype(&::gnome_keyring_is_available) |
| 46 typeof(&::gnome_keyring_##name) GnomeKeyringLoader::gnome_keyring_##name; | 46 GnomeKeyringLoader::gnome_keyring_is_available_ptr; |
| 47 GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_DEFINE_POINTER) | 47 decltype(&::gnome_keyring_store_password) |
| 48 #undef GNOME_KEYRING_DEFINE_POINTER | 48 GnomeKeyringLoader::gnome_keyring_store_password_ptr; |
| 49 decltype(&::gnome_keyring_delete_password) |
| 50 GnomeKeyringLoader::gnome_keyring_delete_password_ptr; |
| 51 decltype(&::gnome_keyring_find_items) |
| 52 GnomeKeyringLoader::gnome_keyring_find_items_ptr; |
| 53 decltype(&::gnome_keyring_result_to_message) |
| 54 GnomeKeyringLoader::gnome_keyring_result_to_message_ptr; |
| 55 decltype(&::gnome_keyring_attribute_list_free) |
| 56 GnomeKeyringLoader::gnome_keyring_attribute_list_free_ptr; |
| 57 decltype(&::gnome_keyring_attribute_list_new) |
| 58 GnomeKeyringLoader::gnome_keyring_attribute_list_new_ptr; |
| 59 decltype(&::gnome_keyring_attribute_list_append_string) |
| 60 GnomeKeyringLoader::gnome_keyring_attribute_list_append_string_ptr; |
| 61 decltype(&::gnome_keyring_attribute_list_append_uint32) |
| 62 GnomeKeyringLoader::gnome_keyring_attribute_list_append_uint32_ptr; |
| 49 | 63 |
| 50 bool GnomeKeyringLoader::keyring_loaded = false; | 64 bool GnomeKeyringLoader::keyring_loaded = false; |
| 51 | 65 |
| 52 #define GNOME_KEYRING_FUNCTION_INFO(name) \ | |
| 53 {"gnome_keyring_"#name, reinterpret_cast<void**>(&gnome_keyring_##name)}, | |
| 54 const GnomeKeyringLoader::FunctionInfo GnomeKeyringLoader::functions[] = { | 66 const GnomeKeyringLoader::FunctionInfo GnomeKeyringLoader::functions[] = { |
| 55 GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_FUNCTION_INFO) | 67 {"gnome_keyring_is_available", |
| 56 {nullptr, nullptr} | 68 reinterpret_cast<void**>(&gnome_keyring_is_available_ptr)}, |
| 57 }; | 69 {"gnome_keyring_store_password", |
| 58 #undef GNOME_KEYRING_FUNCTION_INFO | 70 reinterpret_cast<void**>(&gnome_keyring_store_password_ptr)}, |
| 71 {"gnome_keyring_delete_password", |
| 72 reinterpret_cast<void**>(&gnome_keyring_delete_password_ptr)}, |
| 73 {"gnome_keyring_find_items", |
| 74 reinterpret_cast<void**>(&gnome_keyring_find_items_ptr)}, |
| 75 {"gnome_keyring_result_to_message", |
| 76 reinterpret_cast<void**>(&gnome_keyring_result_to_message_ptr)}, |
| 77 {"gnome_keyring_attribute_list_free", |
| 78 reinterpret_cast<void**>(&gnome_keyring_attribute_list_free_ptr)}, |
| 79 {"gnome_keyring_attribute_list_new", |
| 80 reinterpret_cast<void**>(&gnome_keyring_attribute_list_new_ptr)}, |
| 81 {"gnome_keyring_attribute_list_append_string", |
| 82 reinterpret_cast<void**>(&gnome_keyring_attribute_list_append_string_ptr)}, |
| 83 {"gnome_keyring_attribute_list_append_uint32", |
| 84 reinterpret_cast<void**>( |
| 85 &gnome_keyring_attribute_list_append_uint32_ptr)}}; |
| 59 | 86 |
| 60 /* Load the library and initialize the function pointers. */ | 87 /* Load the library and initialize the function pointers. */ |
| 61 bool GnomeKeyringLoader::LoadGnomeKeyring() { | 88 bool GnomeKeyringLoader::LoadGnomeKeyring() { |
| 62 if (keyring_loaded) | 89 if (keyring_loaded) |
| 63 return true; | 90 return true; |
| 64 | 91 |
| 65 void* handle = dlopen("libgnome-keyring.so.0", RTLD_NOW | RTLD_GLOBAL); | 92 void* handle = dlopen("libgnome-keyring.so.0", RTLD_NOW | RTLD_GLOBAL); |
| 66 if (!handle) { | 93 if (!handle) { |
| 67 // We wanted to use GNOME Keyring, but we couldn't load it. Warn, because | 94 // We wanted to use GNOME Keyring, but we couldn't load it. Warn, because |
| 68 // either the user asked for this, or we autodetected it incorrectly. (Or | 95 // either the user asked for this, or we autodetected it incorrectly. (Or |
| 69 // the system has broken libraries, which is also good to warn about.) | 96 // the system has broken libraries, which is also good to warn about.) |
| 70 LOG(WARNING) << "Could not load libgnome-keyring.so.0: " << dlerror(); | 97 LOG(WARNING) << "Could not load libgnome-keyring.so.0: " << dlerror(); |
| 71 return false; | 98 return false; |
| 72 } | 99 } |
| 73 | 100 |
| 74 for (size_t i = 0; functions[i].name; ++i) { | 101 for (size_t i = 0; i < arraysize(functions); ++i) { |
| 75 dlerror(); | 102 dlerror(); |
| 76 *functions[i].pointer = dlsym(handle, functions[i].name); | 103 *functions[i].pointer = dlsym(handle, functions[i].name); |
| 77 const char* error = dlerror(); | 104 const char* error = dlerror(); |
| 78 if (error) { | 105 if (error) { |
| 79 LOG(ERROR) << "Unable to load symbol " | 106 LOG(ERROR) << "Unable to load symbol " |
| 80 << functions[i].name << ": " << error; | 107 << functions[i].name << ": " << error; |
| 81 dlclose(handle); | 108 dlclose(handle); |
| 82 return false; | 109 return false; |
| 83 } | 110 } |
| 84 } | 111 } |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 // Use after AddLogin, RemoveLogin. | 309 // Use after AddLogin, RemoveLogin. |
| 283 GnomeKeyringResult WaitResult(); | 310 GnomeKeyringResult WaitResult(); |
| 284 | 311 |
| 285 // Use after LoginSearch, GetLogins, GetLoginsList, GetAllLogins. Replaces the | 312 // Use after LoginSearch, GetLogins, GetLoginsList, GetAllLogins. Replaces the |
| 286 // content of |forms| with found logins. | 313 // content of |forms| with found logins. |
| 287 GnomeKeyringResult WaitResult(ScopedVector<PasswordForm>* forms); | 314 GnomeKeyringResult WaitResult(ScopedVector<PasswordForm>* forms); |
| 288 | 315 |
| 289 private: | 316 private: |
| 290 struct GnomeKeyringAttributeListFreeDeleter { | 317 struct GnomeKeyringAttributeListFreeDeleter { |
| 291 inline void operator()(void* list) const { | 318 inline void operator()(void* list) const { |
| 292 gnome_keyring_attribute_list_free( | 319 gnome_keyring_attribute_list_free_ptr( |
| 293 static_cast<GnomeKeyringAttributeList*>(list)); | 320 static_cast<GnomeKeyringAttributeList*>(list)); |
| 294 } | 321 } |
| 295 }; | 322 }; |
| 296 | 323 |
| 297 typedef std::unique_ptr<GnomeKeyringAttributeList, | 324 typedef std::unique_ptr<GnomeKeyringAttributeList, |
| 298 GnomeKeyringAttributeListFreeDeleter> | 325 GnomeKeyringAttributeListFreeDeleter> |
| 299 ScopedAttributeList; | 326 ScopedAttributeList; |
| 300 | 327 |
| 301 // Helper methods to abbreviate Gnome Keyring long API names. | 328 // Helper methods to abbreviate Gnome Keyring long API names. |
| 302 static void AppendString(ScopedAttributeList* list, | 329 static void AppendString(ScopedAttributeList* list, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 362 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 336 int64_t date_created = form.date_created.ToInternalValue(); | 363 int64_t date_created = form.date_created.ToInternalValue(); |
| 337 // If we are asked to save a password with 0 date, use the current time. | 364 // If we are asked to save a password with 0 date, use the current time. |
| 338 // We don't want to actually save passwords as though on January 1, 1601. | 365 // We don't want to actually save passwords as though on January 1, 1601. |
| 339 if (!date_created) | 366 if (!date_created) |
| 340 date_created = base::Time::Now().ToInternalValue(); | 367 date_created = base::Time::Now().ToInternalValue(); |
| 341 int64_t date_synced = form.date_synced.ToInternalValue(); | 368 int64_t date_synced = form.date_synced.ToInternalValue(); |
| 342 std::string form_data; | 369 std::string form_data; |
| 343 SerializeFormDataToBase64String(form.form_data, &form_data); | 370 SerializeFormDataToBase64String(form.form_data, &form_data); |
| 344 // clang-format off | 371 // clang-format off |
| 345 gnome_keyring_store_password( | 372 gnome_keyring_store_password_ptr( |
| 346 &kGnomeSchema, | 373 &kGnomeSchema, |
| 347 nullptr, // Default keyring. | 374 nullptr, // Default keyring. |
| 348 form.origin.spec().c_str(), // Display name. | 375 form.origin.spec().c_str(), // Display name. |
| 349 UTF16ToUTF8(form.password_value).c_str(), OnOperationDone, | 376 UTF16ToUTF8(form.password_value).c_str(), OnOperationDone, |
| 350 this, // data | 377 this, // data |
| 351 nullptr, // destroy_data | 378 nullptr, // destroy_data |
| 352 "origin_url", form.origin.spec().c_str(), | 379 "origin_url", form.origin.spec().c_str(), |
| 353 "action_url", form.action.spec().c_str(), | 380 "action_url", form.action.spec().c_str(), |
| 354 "username_element", UTF16ToUTF8(form.username_element).c_str(), | 381 "username_element", UTF16ToUTF8(form.username_element).c_str(), |
| 355 "username_value", UTF16ToUTF8(form.username_value).c_str(), | 382 "username_value", UTF16ToUTF8(form.username_value).c_str(), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 376 "application", app_string, | 403 "application", app_string, |
| 377 nullptr); | 404 nullptr); |
| 378 // clang-format on | 405 // clang-format on |
| 379 } | 406 } |
| 380 | 407 |
| 381 void GKRMethod::LoginSearch(const PasswordForm& form, | 408 void GKRMethod::LoginSearch(const PasswordForm& form, |
| 382 const char* app_string) { | 409 const char* app_string) { |
| 383 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 410 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 384 lookup_form_.reset(nullptr); | 411 lookup_form_.reset(nullptr); |
| 385 // Search GNOME Keyring for matching passwords to update. | 412 // Search GNOME Keyring for matching passwords to update. |
| 386 ScopedAttributeList attrs(gnome_keyring_attribute_list_new()); | 413 ScopedAttributeList attrs(gnome_keyring_attribute_list_new_ptr()); |
| 387 AppendString(&attrs, "origin_url", form.origin.spec()); | 414 AppendString(&attrs, "origin_url", form.origin.spec()); |
| 388 AppendString(&attrs, "username_element", UTF16ToUTF8(form.username_element)); | 415 AppendString(&attrs, "username_element", UTF16ToUTF8(form.username_element)); |
| 389 AppendString(&attrs, "username_value", UTF16ToUTF8(form.username_value)); | 416 AppendString(&attrs, "username_value", UTF16ToUTF8(form.username_value)); |
| 390 AppendString(&attrs, "password_element", UTF16ToUTF8(form.password_element)); | 417 AppendString(&attrs, "password_element", UTF16ToUTF8(form.password_element)); |
| 391 AppendString(&attrs, "signon_realm", form.signon_realm); | 418 AppendString(&attrs, "signon_realm", form.signon_realm); |
| 392 AppendString(&attrs, "application", app_string); | 419 AppendString(&attrs, "application", app_string); |
| 393 gnome_keyring_find_items(GNOME_KEYRING_ITEM_GENERIC_SECRET, | 420 gnome_keyring_find_items_ptr(GNOME_KEYRING_ITEM_GENERIC_SECRET, attrs.get(), |
| 394 attrs.get(), | 421 OnOperationGetList, |
| 395 OnOperationGetList, | 422 /*data=*/this, |
| 396 /*data=*/this, | 423 /*destroy_data=*/nullptr); |
| 397 /*destroy_data=*/nullptr); | |
| 398 } | 424 } |
| 399 | 425 |
| 400 void GKRMethod::RemoveLogin(const PasswordForm& form, const char* app_string) { | 426 void GKRMethod::RemoveLogin(const PasswordForm& form, const char* app_string) { |
| 401 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 427 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 402 // We find forms using the same fields as LoginDatabase::RemoveLogin(). | 428 // We find forms using the same fields as LoginDatabase::RemoveLogin(). |
| 403 gnome_keyring_delete_password( | 429 gnome_keyring_delete_password_ptr( |
| 404 &kGnomeSchema, | 430 &kGnomeSchema, |
| 405 OnOperationDone, | 431 OnOperationDone, |
| 406 this, // data | 432 this, // data |
| 407 nullptr, // destroy_data | 433 nullptr, // destroy_data |
| 408 "origin_url", form.origin.spec().c_str(), | 434 "origin_url", form.origin.spec().c_str(), |
| 409 "username_element", UTF16ToUTF8(form.username_element).c_str(), | 435 "username_element", UTF16ToUTF8(form.username_element).c_str(), |
| 410 "username_value", UTF16ToUTF8(form.username_value).c_str(), | 436 "username_value", UTF16ToUTF8(form.username_value).c_str(), |
| 411 "password_element", UTF16ToUTF8(form.password_element).c_str(), | 437 "password_element", UTF16ToUTF8(form.password_element).c_str(), |
| 412 "signon_realm", form.signon_realm.c_str(), | 438 "signon_realm", form.signon_realm.c_str(), |
| 413 "application", app_string, | 439 "application", app_string, |
| 414 nullptr); | 440 nullptr); |
| 415 } | 441 } |
| 416 | 442 |
| 417 void GKRMethod::GetLogins(const PasswordStore::FormDigest& form, | 443 void GKRMethod::GetLogins(const PasswordStore::FormDigest& form, |
| 418 const char* app_string) { | 444 const char* app_string) { |
| 419 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 445 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 420 lookup_form_.reset(new PasswordStore::FormDigest(form)); | 446 lookup_form_.reset(new PasswordStore::FormDigest(form)); |
| 421 // Search GNOME Keyring for matching passwords. | 447 // Search GNOME Keyring for matching passwords. |
| 422 ScopedAttributeList attrs(gnome_keyring_attribute_list_new()); | 448 ScopedAttributeList attrs(gnome_keyring_attribute_list_new_ptr()); |
| 423 if (!password_manager::ShouldPSLDomainMatchingApply( | 449 if (!password_manager::ShouldPSLDomainMatchingApply( |
| 424 password_manager::GetRegistryControlledDomain( | 450 password_manager::GetRegistryControlledDomain( |
| 425 GURL(form.signon_realm))) && | 451 GURL(form.signon_realm))) && |
| 426 form.scheme != PasswordForm::SCHEME_HTML) { | 452 form.scheme != PasswordForm::SCHEME_HTML) { |
| 427 // Don't retrieve the PSL matched and federated credentials. | 453 // Don't retrieve the PSL matched and federated credentials. |
| 428 AppendString(&attrs, "signon_realm", form.signon_realm); | 454 AppendString(&attrs, "signon_realm", form.signon_realm); |
| 429 } | 455 } |
| 430 AppendString(&attrs, "application", app_string); | 456 AppendString(&attrs, "application", app_string); |
| 431 gnome_keyring_find_items(GNOME_KEYRING_ITEM_GENERIC_SECRET, | 457 gnome_keyring_find_items_ptr(GNOME_KEYRING_ITEM_GENERIC_SECRET, attrs.get(), |
| 432 attrs.get(), | 458 OnOperationGetList, |
| 433 OnOperationGetList, | 459 /*data=*/this, |
| 434 /*data=*/this, | 460 /*destroy_data=*/nullptr); |
| 435 /*destroy_data=*/nullptr); | |
| 436 } | 461 } |
| 437 | 462 |
| 438 void GKRMethod::GetLoginsList(uint32_t blacklisted_by_user, | 463 void GKRMethod::GetLoginsList(uint32_t blacklisted_by_user, |
| 439 const char* app_string) { | 464 const char* app_string) { |
| 440 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 465 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 441 lookup_form_.reset(nullptr); | 466 lookup_form_.reset(nullptr); |
| 442 // Search GNOME Keyring for matching passwords. | 467 // Search GNOME Keyring for matching passwords. |
| 443 ScopedAttributeList attrs(gnome_keyring_attribute_list_new()); | 468 ScopedAttributeList attrs(gnome_keyring_attribute_list_new_ptr()); |
| 444 AppendUint32(&attrs, "blacklisted_by_user", blacklisted_by_user); | 469 AppendUint32(&attrs, "blacklisted_by_user", blacklisted_by_user); |
| 445 AppendString(&attrs, "application", app_string); | 470 AppendString(&attrs, "application", app_string); |
| 446 gnome_keyring_find_items(GNOME_KEYRING_ITEM_GENERIC_SECRET, | 471 gnome_keyring_find_items_ptr(GNOME_KEYRING_ITEM_GENERIC_SECRET, attrs.get(), |
| 447 attrs.get(), | 472 OnOperationGetList, |
| 448 OnOperationGetList, | 473 /*data=*/this, |
| 449 /*data=*/this, | 474 /*destroy_data=*/nullptr); |
| 450 /*destroy_data=*/nullptr); | |
| 451 } | 475 } |
| 452 | 476 |
| 453 void GKRMethod::GetAllLogins(const char* app_string) { | 477 void GKRMethod::GetAllLogins(const char* app_string) { |
| 454 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 478 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 455 lookup_form_.reset(nullptr); | 479 lookup_form_.reset(nullptr); |
| 456 // We need to search for something, otherwise we get no results - so | 480 // We need to search for something, otherwise we get no results - so |
| 457 // we search for the fixed application string. | 481 // we search for the fixed application string. |
| 458 ScopedAttributeList attrs(gnome_keyring_attribute_list_new()); | 482 ScopedAttributeList attrs(gnome_keyring_attribute_list_new_ptr()); |
| 459 AppendString(&attrs, "application", app_string); | 483 AppendString(&attrs, "application", app_string); |
| 460 gnome_keyring_find_items(GNOME_KEYRING_ITEM_GENERIC_SECRET, | 484 gnome_keyring_find_items_ptr(GNOME_KEYRING_ITEM_GENERIC_SECRET, attrs.get(), |
| 461 attrs.get(), | 485 OnOperationGetList, |
| 462 OnOperationGetList, | 486 /*data=*/this, |
| 463 /*data=*/this, | 487 /*destroy_data=*/nullptr); |
| 464 /*destroy_data=*/nullptr); | |
| 465 } | 488 } |
| 466 | 489 |
| 467 GnomeKeyringResult GKRMethod::WaitResult() { | 490 GnomeKeyringResult GKRMethod::WaitResult() { |
| 468 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 491 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 469 event_.Wait(); | 492 event_.Wait(); |
| 470 return result_; | 493 return result_; |
| 471 } | 494 } |
| 472 | 495 |
| 473 GnomeKeyringResult GKRMethod::WaitResult(ScopedVector<PasswordForm>* forms) { | 496 GnomeKeyringResult GKRMethod::WaitResult(ScopedVector<PasswordForm>* forms) { |
| 474 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 497 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 475 event_.Wait(); | 498 event_.Wait(); |
| 476 *forms = std::move(forms_); | 499 *forms = std::move(forms_); |
| 477 return result_; | 500 return result_; |
| 478 } | 501 } |
| 479 | 502 |
| 480 // static | 503 // static |
| 481 void GKRMethod::AppendString(GKRMethod::ScopedAttributeList* list, | 504 void GKRMethod::AppendString(GKRMethod::ScopedAttributeList* list, |
| 482 const char* name, | 505 const char* name, |
| 483 const char* value) { | 506 const char* value) { |
| 484 gnome_keyring_attribute_list_append_string(list->get(), name, value); | 507 gnome_keyring_attribute_list_append_string_ptr(list->get(), name, value); |
| 485 } | 508 } |
| 486 | 509 |
| 487 // static | 510 // static |
| 488 void GKRMethod::AppendString(GKRMethod::ScopedAttributeList* list, | 511 void GKRMethod::AppendString(GKRMethod::ScopedAttributeList* list, |
| 489 const char* name, | 512 const char* name, |
| 490 const std::string& value) { | 513 const std::string& value) { |
| 491 AppendString(list, name, value.c_str()); | 514 AppendString(list, name, value.c_str()); |
| 492 } | 515 } |
| 493 | 516 |
| 494 // static | 517 // static |
| 495 void GKRMethod::AppendUint32(GKRMethod::ScopedAttributeList* list, | 518 void GKRMethod::AppendUint32(GKRMethod::ScopedAttributeList* list, |
| 496 const char* name, | 519 const char* name, |
| 497 guint32 value) { | 520 guint32 value) { |
| 498 gnome_keyring_attribute_list_append_uint32(list->get(), name, value); | 521 gnome_keyring_attribute_list_append_uint32_ptr(list->get(), name, value); |
| 499 } | 522 } |
| 500 | 523 |
| 501 // static | 524 // static |
| 502 void GKRMethod::OnOperationDone(GnomeKeyringResult result, gpointer data) { | 525 void GKRMethod::OnOperationDone(GnomeKeyringResult result, gpointer data) { |
| 503 GKRMethod* method = static_cast<GKRMethod*>(data); | 526 GKRMethod* method = static_cast<GKRMethod*>(data); |
| 504 method->result_ = result; | 527 method->result_ = result; |
| 505 method->event_.Signal(); | 528 method->event_.Signal(); |
| 506 } | 529 } |
| 507 | 530 |
| 508 // static | 531 // static |
| (...skipping 21 matching lines...) Expand all Loading... |
| 530 } // namespace | 553 } // namespace |
| 531 | 554 |
| 532 NativeBackendGnome::NativeBackendGnome(LocalProfileId id) | 555 NativeBackendGnome::NativeBackendGnome(LocalProfileId id) |
| 533 : app_string_(GetProfileSpecificAppString(id)) { | 556 : app_string_(GetProfileSpecificAppString(id)) { |
| 534 } | 557 } |
| 535 | 558 |
| 536 NativeBackendGnome::~NativeBackendGnome() { | 559 NativeBackendGnome::~NativeBackendGnome() { |
| 537 } | 560 } |
| 538 | 561 |
| 539 bool NativeBackendGnome::Init() { | 562 bool NativeBackendGnome::Init() { |
| 540 return LoadGnomeKeyring() && gnome_keyring_is_available(); | 563 return LoadGnomeKeyring() && gnome_keyring_is_available_ptr(); |
| 541 } | 564 } |
| 542 | 565 |
| 543 bool NativeBackendGnome::RawAddLogin(const PasswordForm& form) { | 566 bool NativeBackendGnome::RawAddLogin(const PasswordForm& form) { |
| 544 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 567 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 545 GKRMethod method; | 568 GKRMethod method; |
| 546 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 569 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 547 base::Bind(&GKRMethod::AddLogin, | 570 base::Bind(&GKRMethod::AddLogin, |
| 548 base::Unretained(&method), | 571 base::Unretained(&method), |
| 549 form, app_string_.c_str())); | 572 form, app_string_.c_str())); |
| 550 GnomeKeyringResult result = method.WaitResult(); | 573 GnomeKeyringResult result = method.WaitResult(); |
| 551 if (result != GNOME_KEYRING_RESULT_OK) { | 574 if (result != GNOME_KEYRING_RESULT_OK) { |
| 552 LOG(ERROR) << "Keyring save failed: " | 575 LOG(ERROR) << "Keyring save failed: " |
| 553 << gnome_keyring_result_to_message(result); | 576 << gnome_keyring_result_to_message_ptr(result); |
| 554 return false; | 577 return false; |
| 555 } | 578 } |
| 556 return true; | 579 return true; |
| 557 } | 580 } |
| 558 | 581 |
| 559 password_manager::PasswordStoreChangeList NativeBackendGnome::AddLogin( | 582 password_manager::PasswordStoreChangeList NativeBackendGnome::AddLogin( |
| 560 const PasswordForm& form) { | 583 const PasswordForm& form) { |
| 561 // Based on LoginDatabase::AddLogin(), we search for an existing match based | 584 // Based on LoginDatabase::AddLogin(), we search for an existing match based |
| 562 // on origin_url, username_element, username_value, password_element, submit | 585 // on origin_url, username_element, username_value, password_element, submit |
| 563 // element, and signon_realm first, remove that, and then add the new entry. | 586 // element, and signon_realm first, remove that, and then add the new entry. |
| 564 // We'd add the new one first, and then delete the original, but then the | 587 // We'd add the new one first, and then delete the original, but then the |
| 565 // delete might actually delete the newly-added entry! | 588 // delete might actually delete the newly-added entry! |
| 566 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 589 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| 567 GKRMethod method; | 590 GKRMethod method; |
| 568 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 591 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 569 base::Bind(&GKRMethod::LoginSearch, | 592 base::Bind(&GKRMethod::LoginSearch, |
| 570 base::Unretained(&method), | 593 base::Unretained(&method), |
| 571 form, app_string_.c_str())); | 594 form, app_string_.c_str())); |
| 572 ScopedVector<PasswordForm> forms; | 595 ScopedVector<PasswordForm> forms; |
| 573 GnomeKeyringResult result = method.WaitResult(&forms); | 596 GnomeKeyringResult result = method.WaitResult(&forms); |
| 574 if (result != GNOME_KEYRING_RESULT_OK && | 597 if (result != GNOME_KEYRING_RESULT_OK && |
| 575 result != GNOME_KEYRING_RESULT_NO_MATCH) { | 598 result != GNOME_KEYRING_RESULT_NO_MATCH) { |
| 576 LOG(ERROR) << "Keyring find failed: " | 599 LOG(ERROR) << "Keyring find failed: " |
| 577 << gnome_keyring_result_to_message(result); | 600 << gnome_keyring_result_to_message_ptr(result); |
| 578 return password_manager::PasswordStoreChangeList(); | 601 return password_manager::PasswordStoreChangeList(); |
| 579 } | 602 } |
| 580 password_manager::PasswordStoreChangeList changes; | 603 password_manager::PasswordStoreChangeList changes; |
| 581 if (forms.size() > 0) { | 604 if (forms.size() > 0) { |
| 582 password_manager::PasswordStoreChangeList temp_changes; | 605 password_manager::PasswordStoreChangeList temp_changes; |
| 583 if (forms.size() > 1) { | 606 if (forms.size() > 1) { |
| 584 LOG(WARNING) << "Adding login when there are " << forms.size() | 607 LOG(WARNING) << "Adding login when there are " << forms.size() |
| 585 << " matching logins already!"; | 608 << " matching logins already!"; |
| 586 } | 609 } |
| 587 for (const PasswordForm* old_form : forms) { | 610 for (const PasswordForm* old_form : forms) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 613 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 636 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 614 base::Bind(&GKRMethod::LoginSearch, | 637 base::Bind(&GKRMethod::LoginSearch, |
| 615 base::Unretained(&method), | 638 base::Unretained(&method), |
| 616 form, app_string_.c_str())); | 639 form, app_string_.c_str())); |
| 617 ScopedVector<PasswordForm> forms; | 640 ScopedVector<PasswordForm> forms; |
| 618 GnomeKeyringResult result = method.WaitResult(&forms); | 641 GnomeKeyringResult result = method.WaitResult(&forms); |
| 619 if (result == GNOME_KEYRING_RESULT_NO_MATCH) | 642 if (result == GNOME_KEYRING_RESULT_NO_MATCH) |
| 620 return true; | 643 return true; |
| 621 if (result != GNOME_KEYRING_RESULT_OK) { | 644 if (result != GNOME_KEYRING_RESULT_OK) { |
| 622 LOG(ERROR) << "Keyring find failed: " | 645 LOG(ERROR) << "Keyring find failed: " |
| 623 << gnome_keyring_result_to_message(result); | 646 << gnome_keyring_result_to_message_ptr(result); |
| 624 return false; | 647 return false; |
| 625 } | 648 } |
| 626 if (forms.size() == 1 && *forms.front() == form) | 649 if (forms.size() == 1 && *forms.front() == form) |
| 627 return true; | 650 return true; |
| 628 | 651 |
| 629 password_manager::PasswordStoreChangeList temp_changes; | 652 password_manager::PasswordStoreChangeList temp_changes; |
| 630 for (const PasswordForm* keychain_form : forms) { | 653 for (const PasswordForm* keychain_form : forms) { |
| 631 // Remove all the obsolete forms. Note that RemoveLogin can remove any form | 654 // Remove all the obsolete forms. Note that RemoveLogin can remove any form |
| 632 // matching the unique key. Thus, it's important to call it the right number | 655 // matching the unique key. Thus, it's important to call it the right number |
| 633 // of times. | 656 // of times. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 653 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 676 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 654 base::Bind(&GKRMethod::RemoveLogin, | 677 base::Bind(&GKRMethod::RemoveLogin, |
| 655 base::Unretained(&method), | 678 base::Unretained(&method), |
| 656 form, app_string_.c_str())); | 679 form, app_string_.c_str())); |
| 657 GnomeKeyringResult result = method.WaitResult(); | 680 GnomeKeyringResult result = method.WaitResult(); |
| 658 if (result == GNOME_KEYRING_RESULT_NO_MATCH) | 681 if (result == GNOME_KEYRING_RESULT_NO_MATCH) |
| 659 return true; | 682 return true; |
| 660 | 683 |
| 661 if (result != GNOME_KEYRING_RESULT_OK) { | 684 if (result != GNOME_KEYRING_RESULT_OK) { |
| 662 LOG(ERROR) << "Keyring delete failed: " | 685 LOG(ERROR) << "Keyring delete failed: " |
| 663 << gnome_keyring_result_to_message(result); | 686 << gnome_keyring_result_to_message_ptr(result); |
| 664 return false; | 687 return false; |
| 665 } | 688 } |
| 666 changes->push_back(password_manager::PasswordStoreChange( | 689 changes->push_back(password_manager::PasswordStoreChange( |
| 667 password_manager::PasswordStoreChange::REMOVE, form)); | 690 password_manager::PasswordStoreChange::REMOVE, form)); |
| 668 return true; | 691 return true; |
| 669 } | 692 } |
| 670 | 693 |
| 671 bool NativeBackendGnome::RemoveLoginsCreatedBetween( | 694 bool NativeBackendGnome::RemoveLoginsCreatedBetween( |
| 672 base::Time delete_begin, | 695 base::Time delete_begin, |
| 673 base::Time delete_end, | 696 base::Time delete_end, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 707 GKRMethod method; | 730 GKRMethod method; |
| 708 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 731 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 709 base::Bind(&GKRMethod::GetLogins, | 732 base::Bind(&GKRMethod::GetLogins, |
| 710 base::Unretained(&method), | 733 base::Unretained(&method), |
| 711 form, app_string_.c_str())); | 734 form, app_string_.c_str())); |
| 712 GnomeKeyringResult result = method.WaitResult(forms); | 735 GnomeKeyringResult result = method.WaitResult(forms); |
| 713 if (result == GNOME_KEYRING_RESULT_NO_MATCH) | 736 if (result == GNOME_KEYRING_RESULT_NO_MATCH) |
| 714 return true; | 737 return true; |
| 715 if (result != GNOME_KEYRING_RESULT_OK) { | 738 if (result != GNOME_KEYRING_RESULT_OK) { |
| 716 LOG(ERROR) << "Keyring find failed: " | 739 LOG(ERROR) << "Keyring find failed: " |
| 717 << gnome_keyring_result_to_message(result); | 740 << gnome_keyring_result_to_message_ptr(result); |
| 718 return false; | 741 return false; |
| 719 } | 742 } |
| 720 return true; | 743 return true; |
| 721 } | 744 } |
| 722 | 745 |
| 723 bool NativeBackendGnome::GetAutofillableLogins( | 746 bool NativeBackendGnome::GetAutofillableLogins( |
| 724 ScopedVector<PasswordForm>* forms) { | 747 ScopedVector<PasswordForm>* forms) { |
| 725 return GetLoginsList(true, forms); | 748 return GetLoginsList(true, forms); |
| 726 } | 749 } |
| 727 | 750 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 738 GKRMethod method; | 761 GKRMethod method; |
| 739 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 762 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 740 base::Bind(&GKRMethod::GetLoginsList, | 763 base::Bind(&GKRMethod::GetLoginsList, |
| 741 base::Unretained(&method), | 764 base::Unretained(&method), |
| 742 blacklisted_by_user, app_string_.c_str())); | 765 blacklisted_by_user, app_string_.c_str())); |
| 743 GnomeKeyringResult result = method.WaitResult(forms); | 766 GnomeKeyringResult result = method.WaitResult(forms); |
| 744 if (result == GNOME_KEYRING_RESULT_NO_MATCH) | 767 if (result == GNOME_KEYRING_RESULT_NO_MATCH) |
| 745 return true; | 768 return true; |
| 746 if (result != GNOME_KEYRING_RESULT_OK) { | 769 if (result != GNOME_KEYRING_RESULT_OK) { |
| 747 LOG(ERROR) << "Keyring find failed: " | 770 LOG(ERROR) << "Keyring find failed: " |
| 748 << gnome_keyring_result_to_message(result); | 771 << gnome_keyring_result_to_message_ptr(result); |
| 749 return false; | 772 return false; |
| 750 } | 773 } |
| 751 | 774 |
| 752 // Get rid of the forms with the same sync tags. | 775 // Get rid of the forms with the same sync tags. |
| 753 ScopedVector<autofill::PasswordForm> duplicates; | 776 ScopedVector<autofill::PasswordForm> duplicates; |
| 754 std::vector<std::vector<autofill::PasswordForm*>> tag_groups; | 777 std::vector<std::vector<autofill::PasswordForm*>> tag_groups; |
| 755 password_manager_util::FindDuplicates(forms, &duplicates, &tag_groups); | 778 password_manager_util::FindDuplicates(forms, &duplicates, &tag_groups); |
| 756 if (duplicates.empty()) | 779 if (duplicates.empty()) |
| 757 return true; | 780 return true; |
| 758 for (const auto& group : tag_groups) { | 781 for (const auto& group : tag_groups) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 772 GKRMethod method; | 795 GKRMethod method; |
| 773 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 796 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 774 base::Bind(&GKRMethod::GetAllLogins, | 797 base::Bind(&GKRMethod::GetAllLogins, |
| 775 base::Unretained(&method), | 798 base::Unretained(&method), |
| 776 app_string_.c_str())); | 799 app_string_.c_str())); |
| 777 GnomeKeyringResult result = method.WaitResult(forms); | 800 GnomeKeyringResult result = method.WaitResult(forms); |
| 778 if (result == GNOME_KEYRING_RESULT_NO_MATCH) | 801 if (result == GNOME_KEYRING_RESULT_NO_MATCH) |
| 779 return true; | 802 return true; |
| 780 if (result != GNOME_KEYRING_RESULT_OK) { | 803 if (result != GNOME_KEYRING_RESULT_OK) { |
| 781 LOG(ERROR) << "Keyring find failed: " | 804 LOG(ERROR) << "Keyring find failed: " |
| 782 << gnome_keyring_result_to_message(result); | 805 << gnome_keyring_result_to_message_ptr(result); |
| 783 return false; | 806 return false; |
| 784 } | 807 } |
| 785 return true; | 808 return true; |
| 786 } | 809 } |
| 787 | 810 |
| 788 bool NativeBackendGnome::GetLoginsBetween(base::Time get_begin, | 811 bool NativeBackendGnome::GetLoginsBetween(base::Time get_begin, |
| 789 base::Time get_end, | 812 base::Time get_end, |
| 790 TimestampToCompare date_to_compare, | 813 TimestampToCompare date_to_compare, |
| 791 ScopedVector<PasswordForm>* forms) { | 814 ScopedVector<PasswordForm>* forms) { |
| 792 DCHECK_CURRENTLY_ON(BrowserThread::DB); | 815 DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 824 ScopedVector<PasswordForm> forms; | 847 ScopedVector<PasswordForm> forms; |
| 825 if (!GetLoginsBetween(get_begin, get_end, date_to_compare, &forms)) | 848 if (!GetLoginsBetween(get_begin, get_end, date_to_compare, &forms)) |
| 826 return false; | 849 return false; |
| 827 | 850 |
| 828 for (size_t i = 0; i < forms.size(); ++i) { | 851 for (size_t i = 0; i < forms.size(); ++i) { |
| 829 if (!RemoveLogin(*forms[i], changes)) | 852 if (!RemoveLogin(*forms[i], changes)) |
| 830 return false; | 853 return false; |
| 831 } | 854 } |
| 832 return true; | 855 return true; |
| 833 } | 856 } |
| OLD | NEW |