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
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_PASSWORD_MANAGER_NATIVE_BACKEND_KWALLET_X_H_
6 #define CHROME_BROWSER_PASSWORD_MANAGER_NATIVE_BACKEND_KWALLET_X_H_
10 #include "base/basictypes.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/time/time.h"
13 #include "chrome/browser/password_manager/password_store_factory.h"
14 #include "chrome/browser/password_manager/password_store_x.h"
15 #include "chrome/browser/profiles/profile.h"
33 // NativeBackend implementation using KWallet.
34 class NativeBackendKWallet : public PasswordStoreX::NativeBackend {
36 explicit NativeBackendKWallet(LocalProfileId id);
38 ~NativeBackendKWallet() override;
42 // Implements NativeBackend interface.
43 password_manager::PasswordStoreChangeList AddLogin(
44 const autofill::PasswordForm& form) override;
45 bool UpdateLogin(const autofill::PasswordForm& form,
46 password_manager::PasswordStoreChangeList* changes) override;
47 bool RemoveLogin(const autofill::PasswordForm& form) override;
48 bool RemoveLoginsCreatedBetween(
49 base::Time delete_begin,
50 base::Time delete_end,
51 password_manager::PasswordStoreChangeList* changes) override;
52 bool RemoveLoginsSyncedBetween(
53 base::Time delete_begin,
54 base::Time delete_end,
55 password_manager::PasswordStoreChangeList* changes) override;
56 bool GetLogins(const autofill::PasswordForm& form,
57 PasswordFormList* forms) override;
58 bool GetAutofillableLogins(PasswordFormList* forms) override;
59 bool GetBlacklistLogins(PasswordFormList* forms) override;
62 // Invalid handle returned by WalletHandle().
63 static const int kInvalidKWalletHandle = -1;
65 // Internally used by Init(), but also for testing to provide a mock bus.
66 bool InitWithBus(scoped_refptr<dbus::Bus> optional_bus);
68 // Deserializes a list of PasswordForms from the wallet.
69 static void DeserializeValue(const std::string& signon_realm,
71 PasswordFormList* forms);
75 INIT_SUCCESS, // Init succeeded.
76 TEMPORARY_FAIL, // Init failed, but might succeed after StartKWalletd().
77 PERMANENT_FAIL // Init failed, and is not likely to work later either.
80 enum TimestampToCompare {
87 InitResult InitWallet();
88 void InitOnDBThread(scoped_refptr<dbus::Bus> optional_bus,
89 base::WaitableEvent* event,
92 // Reads PasswordForms from the wallet that match the given signon_realm.
93 bool GetLoginsList(PasswordFormList* forms,
94 const std::string& signon_realm,
97 // Reads PasswordForms from the wallet with the given autofillability state.
98 bool GetLoginsList(PasswordFormList* forms,
102 // Helper for some of the above GetLoginsList() methods.
103 bool GetAllLogins(PasswordFormList* forms, int wallet_handle);
105 // Writes a list of PasswordForms to the wallet with the given signon_realm.
106 // Overwrites any existing list for this signon_realm. Removes the entry if
107 // |forms| is empty. Returns true on success.
108 bool SetLoginsList(const PasswordFormList& forms,
109 const std::string& signon_realm,
112 // Removes password created/synced in the time interval. Returns |true| if the
113 // operation succeeded. |changes| will contain the changes applied.
114 bool RemoveLoginsBetween(base::Time delete_begin,
115 base::Time delete_end,
116 TimestampToCompare date_to_compare,
117 password_manager::PasswordStoreChangeList* changes);
119 // Opens the wallet and ensures that the "Chrome Form Data" folder exists.
120 // Returns kInvalidWalletHandle on error.
123 // Serializes a list of PasswordForms to be stored in the wallet.
124 static void SerializeValue(const PasswordFormList& forms, Pickle* pickle);
126 // Deserializes a list of PasswordForms from the wallet.
127 // |size_32| controls reading the size field within the pickle as 32 bits.
128 // We used to use Pickle::WriteSize() to write the number of password forms,
129 // but that has a different size on 32- and 64-bit systems. So, now we always
130 // write a 64-bit quantity, but we support trying to read it as either size
131 // when reading old pickles that fail to deserialize using the native size.
132 static bool DeserializeValueSize(const std::string& signon_realm,
133 const PickleIterator& iter,
134 int version, bool size_32, bool warn_only,
135 PasswordFormList* forms);
137 // In case the fields in the pickle ever change, version them so we can try to
138 // read old pickles. (Note: do not eat old pickles past the expiration date.)
139 static const int kPickleVersion = 4;
141 // Generates a profile-specific folder name based on profile_id_.
142 std::string GetProfileSpecificFolderName() const;
144 // The local profile id, used to generate the folder name.
145 const LocalProfileId profile_id_;
147 // The KWallet folder name, possibly based on the local profile id.
148 std::string folder_name_;
150 // DBus handle for communication with klauncher and kwalletd.
151 scoped_refptr<dbus::Bus> session_bus_;
152 // Object proxy for kwalletd. We do not own this.
153 dbus::ObjectProxy* kwallet_proxy_;
155 // The name of the wallet we've opened. Set during Init().
156 std::string wallet_name_;
157 // The application name (e.g. "Chromium"), shown in KWallet auth dialogs.
158 const std::string app_name_;
160 DISALLOW_COPY_AND_ASSIGN(NativeBackendKWallet);
163 #endif // CHROME_BROWSER_PASSWORD_MANAGER_NATIVE_BACKEND_KWALLET_X_H_