Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1310)

Unified Diff: chrome/browser/password_manager/native_backend_kwallet_x.cc

Issue 335893002: Support to remove passwords by date_synced timestamp. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync integration tests Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698