Chromium Code Reviews| Index: chrome/browser/password_manager/native_backend_kwallet_x.cc |
| diff --git a/chrome/browser/password_manager/native_backend_kwallet_x.cc b/chrome/browser/password_manager/native_backend_kwallet_x.cc |
| index d8816e5756037955322a4dd46976c6ce33a85683..66e8db5e26a163d4443189b8bcc152efc89de6c5 100644 |
| --- a/chrome/browser/password_manager/native_backend_kwallet_x.cc |
| +++ b/chrome/browser/password_manager/native_backend_kwallet_x.cc |
| @@ -356,94 +356,17 @@ bool NativeBackendKWallet::RemoveLogin(const PasswordForm& form) { |
| return ok; |
| } |
| -bool NativeBackendKWallet::RemoveLoginsCreatedBetween( |
| - const base::Time& delete_begin, |
| - const base::Time& delete_end) { |
| - int wallet_handle = WalletHandle(); |
| - if (wallet_handle == kInvalidKWalletHandle) |
| - return false; |
| - |
| - // We could probably also use readEntryList here. |
| - std::vector<std::string> realm_list; |
| - { |
| - dbus::MethodCall method_call(kKWalletInterface, "entryList"); |
| - dbus::MessageWriter builder(&method_call); |
| - builder.AppendInt32(wallet_handle); // handle |
| - builder.AppendString(folder_name_); // folder |
| - builder.AppendString(app_name_); // appid |
| - scoped_ptr<dbus::Response> response( |
| - kwallet_proxy_->CallMethodAndBlock( |
| - &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
| - if (!response.get()) { |
| - LOG(ERROR) << "Error contacting kwalletd (entryList)"; |
| - return false; |
| - } |
| - dbus::MessageReader reader(response.get()); |
| - dbus::MessageReader array(response.get()); |
| - if (!reader.PopArray(&array)) { |
| - LOG(ERROR) << "Error reading response from kwalletd (entryList): " |
| - << response->ToString(); |
| - return false; |
| - } |
| - while (array.HasMoreData()) { |
| - std::string realm; |
| - if (!array.PopString(&realm)) { |
| - LOG(ERROR) << "Error reading response from kwalletd (entryList): " |
| - << response->ToString(); |
| - return false; |
| - } |
| - realm_list.push_back(realm); |
| - } |
| - } |
| - |
| - bool ok = true; |
| - for (size_t i = 0; i < realm_list.size(); ++i) { |
| - const std::string& signon_realm = realm_list[i]; |
| - dbus::MethodCall method_call(kKWalletInterface, "readEntry"); |
| - dbus::MessageWriter builder(&method_call); |
| - builder.AppendInt32(wallet_handle); // handle |
| - builder.AppendString(folder_name_); // folder |
| - builder.AppendString(signon_realm); // key |
| - builder.AppendString(app_name_); // appid |
| - scoped_ptr<dbus::Response> response( |
| - kwallet_proxy_->CallMethodAndBlock( |
| - &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
| - if (!response.get()) { |
| - LOG(ERROR) << "Error contacting kwalletd (readEntry)"; |
| - continue; |
| - } |
| - dbus::MessageReader reader(response.get()); |
| - const uint8_t* bytes = NULL; |
| - size_t length = 0; |
| - if (!reader.PopArrayOfBytes(&bytes, &length)) { |
| - LOG(ERROR) << "Error reading response from kwalletd (readEntry): " |
| - << response->ToString(); |
| - continue; |
| - } |
| - if (!bytes || !CheckSerializedValue(bytes, length, signon_realm)) |
| - continue; |
| - |
| - // Can't we all just agree on whether bytes are signed or not? Please? |
| - Pickle pickle(reinterpret_cast<const char*>(bytes), length); |
| - PasswordFormList all_forms; |
| - DeserializeValue(signon_realm, pickle, &all_forms); |
| - |
| - PasswordFormList kept_forms; |
| - kept_forms.reserve(all_forms.size()); |
| - for (size_t i = 0; i < all_forms.size(); ++i) { |
| - if (delete_begin <= all_forms[i]->date_created && |
| - (delete_end.is_null() || all_forms[i]->date_created < delete_end)) { |
| - delete all_forms[i]; |
| - } else { |
| - kept_forms.push_back(all_forms[i]); |
| - } |
| - } |
| +bool NativeBackendKWallet::RemoveLoginsCreatedBetween(base::Time delete_begin, |
| + base::Time delete_end) { |
| + password_manager::PasswordStoreChangeList changes; |
| + return RemoveLoginsBetween(delete_begin, delete_end, true, &changes); |
| +} |
| - if (!SetLoginsList(kept_forms, signon_realm, wallet_handle)) |
| - ok = false; |
| - STLDeleteElements(&kept_forms); |
| - } |
| - return ok; |
| +bool NativeBackendKWallet::RemoveLoginsSyncedBetween( |
| + base::Time delete_begin, |
| + base::Time delete_end, |
| + password_manager::PasswordStoreChangeList* changes) { |
| + return RemoveLoginsBetween(delete_begin, delete_end, false, changes); |
| } |
| bool NativeBackendKWallet::GetLogins(const PasswordForm& form, |
| @@ -454,13 +377,13 @@ bool NativeBackendKWallet::GetLogins(const PasswordForm& form, |
| return GetLoginsList(forms, form.signon_realm, wallet_handle); |
| } |
| -bool NativeBackendKWallet::GetLoginsCreatedBetween(const base::Time& get_begin, |
| - const base::Time& get_end, |
| +bool NativeBackendKWallet::GetLoginsCreatedBetween(base::Time get_begin, |
| + base::Time get_end, |
| PasswordFormList* forms) { |
| int wallet_handle = WalletHandle(); |
| if (wallet_handle == kInvalidKWalletHandle) |
| return false; |
| - return GetLoginsList(forms, get_begin, get_end, wallet_handle); |
| + return GetLoginsList(forms, get_begin, get_end, wallet_handle, true); |
| } |
| bool NativeBackendKWallet::GetAutofillableLogins(PasswordFormList* forms) { |
| @@ -571,16 +494,20 @@ bool NativeBackendKWallet::GetLoginsList(PasswordFormList* forms, |
| bool NativeBackendKWallet::GetLoginsList(PasswordFormList* forms, |
|
vabr (Chromium)
2014/06/17 15:28:40
This method looks sufficiently similar to NativeBa
vasilii
2014/06/17 17:24:14
PasswordStoreX::NativeBackend is an interface. It
|
| const base::Time& begin, |
| const base::Time& end, |
| - int wallet_handle) { |
| + int wallet_handle, |
| + bool date_is_creation) { |
| PasswordFormList all_forms; |
| if (!GetAllLogins(&all_forms, wallet_handle)) |
| return false; |
| // We have to read all the entries, and then filter them here. |
| + base::Time autofill::PasswordForm::*date_member = date_is_creation ? |
| + &autofill::PasswordForm::date_created : |
| + &autofill::PasswordForm::date_synced; |
| forms->reserve(forms->size() + all_forms.size()); |
| for (size_t i = 0; i < all_forms.size(); ++i) { |
| - if (begin <= all_forms[i]->date_created && |
| - (end.is_null() || all_forms[i]->date_created < end)) { |
| + if (begin <= all_forms[i]->*date_member && |
| + (end.is_null() || all_forms[i]->*date_member < end)) { |
| forms->push_back(all_forms[i]); |
| } else { |
| delete all_forms[i]; |
| @@ -709,6 +636,107 @@ bool NativeBackendKWallet::SetLoginsList(const PasswordFormList& forms, |
| return ret == 0; |
| } |
| +bool NativeBackendKWallet::RemoveLoginsBetween( |
| + base::Time delete_begin, |
| + base::Time delete_end, |
| + bool date_is_creation, |
| + password_manager::PasswordStoreChangeList* changes) { |
| + DCHECK(changes); |
| + changes->clear(); |
| + int wallet_handle = WalletHandle(); |
| + if (wallet_handle == kInvalidKWalletHandle) |
| + return false; |
| + |
| + // We could probably also use readEntryList here. |
| + std::vector<std::string> realm_list; |
| + { |
| + dbus::MethodCall method_call(kKWalletInterface, "entryList"); |
| + dbus::MessageWriter builder(&method_call); |
| + builder.AppendInt32(wallet_handle); // handle |
| + builder.AppendString(folder_name_); // folder |
| + builder.AppendString(app_name_); // appid |
| + scoped_ptr<dbus::Response> response( |
| + kwallet_proxy_->CallMethodAndBlock( |
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
| + if (!response.get()) { |
| + LOG(ERROR) << "Error contacting kwalletd (entryList)"; |
| + return false; |
| + } |
| + dbus::MessageReader reader(response.get()); |
| + dbus::MessageReader array(response.get()); |
| + if (!reader.PopArray(&array)) { |
| + LOG(ERROR) << "Error reading response from kwalletd (entryList): " |
| + << response->ToString(); |
| + return false; |
| + } |
| + while (array.HasMoreData()) { |
| + std::string realm; |
| + if (!array.PopString(&realm)) { |
| + LOG(ERROR) << "Error reading response from kwalletd (entryList): " |
| + << response->ToString(); |
| + return false; |
| + } |
| + realm_list.push_back(realm); |
| + } |
| + } |
| + |
| + bool ok = true; |
| + for (size_t i = 0; i < realm_list.size(); ++i) { |
| + const std::string& signon_realm = realm_list[i]; |
| + dbus::MethodCall method_call(kKWalletInterface, "readEntry"); |
| + dbus::MessageWriter builder(&method_call); |
| + builder.AppendInt32(wallet_handle); // handle |
| + builder.AppendString(folder_name_); // folder |
| + builder.AppendString(signon_realm); // key |
| + builder.AppendString(app_name_); // appid |
| + scoped_ptr<dbus::Response> response( |
| + kwallet_proxy_->CallMethodAndBlock( |
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
| + if (!response.get()) { |
| + LOG(ERROR) << "Error contacting kwalletd (readEntry)"; |
| + continue; |
| + } |
| + dbus::MessageReader reader(response.get()); |
| + const uint8_t* bytes = NULL; |
| + size_t length = 0; |
| + if (!reader.PopArrayOfBytes(&bytes, &length)) { |
| + LOG(ERROR) << "Error reading response from kwalletd (readEntry): " |
| + << response->ToString(); |
| + continue; |
| + } |
| + if (!bytes || !CheckSerializedValue(bytes, length, signon_realm)) |
| + continue; |
| + |
| + // Can't we all just agree on whether bytes are signed or not? Please? |
| + Pickle pickle(reinterpret_cast<const char*>(bytes), length); |
| + PasswordFormList all_forms; |
| + DeserializeValue(signon_realm, pickle, &all_forms); |
| + |
| + PasswordFormList kept_forms; |
| + kept_forms.reserve(all_forms.size()); |
| + base::Time autofill::PasswordForm::*date_member = date_is_creation ? |
| + &autofill::PasswordForm::date_created : |
| + &autofill::PasswordForm::date_synced; |
| + for (size_t i = 0; i < all_forms.size(); ++i) { |
| + if (delete_begin <= all_forms[i]->*date_member && |
| + (delete_end.is_null() || all_forms[i]->*date_member < delete_end)) { |
| + changes->push_back(password_manager::PasswordStoreChange( |
| + password_manager::PasswordStoreChange::REMOVE, *all_forms[i])); |
| + delete all_forms[i]; |
| + } else { |
| + kept_forms.push_back(all_forms[i]); |
| + } |
| + } |
| + |
| + if (!SetLoginsList(kept_forms, signon_realm, wallet_handle)) { |
| + ok = false; |
| + changes->clear(); |
| + } |
| + STLDeleteElements(&kept_forms); |
| + } |
| + return ok; |
| +} |
| + |
| // static |
| void NativeBackendKWallet::SerializeValue(const PasswordFormList& forms, |
| Pickle* pickle) { |