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"
34 // NativeBackend implementation using KWallet.
35 class NativeBackendKWallet
: public PasswordStoreX::NativeBackend
{
37 NativeBackendKWallet(LocalProfileId id
, PrefService
* prefs
);
39 virtual ~NativeBackendKWallet();
41 virtual bool Init() OVERRIDE
;
43 // Implements NativeBackend interface.
44 virtual bool AddLogin(const autofill::PasswordForm
& form
) OVERRIDE
;
45 virtual bool UpdateLogin(const autofill::PasswordForm
& form
) OVERRIDE
;
46 virtual bool RemoveLogin(const autofill::PasswordForm
& form
) OVERRIDE
;
47 virtual bool RemoveLoginsCreatedBetween(
48 const base::Time
& delete_begin
, const base::Time
& delete_end
) OVERRIDE
;
49 virtual bool GetLogins(const autofill::PasswordForm
& form
,
50 PasswordFormList
* forms
) OVERRIDE
;
51 virtual bool GetLoginsCreatedBetween(const base::Time
& get_begin
,
52 const base::Time
& get_end
,
53 PasswordFormList
* forms
) OVERRIDE
;
54 virtual bool GetAutofillableLogins(PasswordFormList
* forms
) OVERRIDE
;
55 virtual bool GetBlacklistLogins(PasswordFormList
* forms
) OVERRIDE
;
58 // Invalid handle returned by WalletHandle().
59 static const int kInvalidKWalletHandle
= -1;
61 // Internally used by Init(), but also for testing to provide a mock bus.
62 bool InitWithBus(scoped_refptr
<dbus::Bus
> optional_bus
);
64 // Deserializes a list of PasswordForms from the wallet.
65 static void DeserializeValue(const std::string
& signon_realm
,
67 PasswordFormList
* forms
);
71 INIT_SUCCESS
, // Init succeeded.
72 TEMPORARY_FAIL
, // Init failed, but might succeed after StartKWalletd().
73 PERMANENT_FAIL
// Init failed, and is not likely to work later either.
78 InitResult
InitWallet();
79 void InitOnDBThread(scoped_refptr
<dbus::Bus
> optional_bus
,
80 base::WaitableEvent
* event
,
83 // Reads PasswordForms from the wallet that match the given signon_realm.
84 bool GetLoginsList(PasswordFormList
* forms
,
85 const std::string
& signon_realm
,
88 // Reads PasswordForms from the wallet with the given autofillability state.
89 bool GetLoginsList(PasswordFormList
* forms
,
93 // Reads PasswordForms from the wallet created in the given time range.
94 bool GetLoginsList(PasswordFormList
* forms
,
95 const base::Time
& begin
,
96 const base::Time
& end
,
99 // Helper for some of the above GetLoginsList() methods.
100 bool GetAllLogins(PasswordFormList
* forms
, int wallet_handle
);
102 // Writes a list of PasswordForms to the wallet with the given signon_realm.
103 // Overwrites any existing list for this signon_realm. Removes the entry if
104 // |forms| is empty. Returns true on success.
105 bool SetLoginsList(const PasswordFormList
& forms
,
106 const std::string
& signon_realm
,
109 // Opens the wallet and ensures that the "Chrome Form Data" folder exists.
110 // Returns kInvalidWalletHandle on error.
113 // Serializes a list of PasswordForms to be stored in the wallet.
114 static void SerializeValue(const PasswordFormList
& forms
, Pickle
* pickle
);
116 // Deserializes a list of PasswordForms from the wallet.
117 // |size_32| controls reading the size field within the pickle as 32 bits.
118 // We used to use Pickle::WriteSize() to write the number of password forms,
119 // but that has a different size on 32- and 64-bit systems. So, now we always
120 // write a 64-bit quantity, but we support trying to read it as either size
121 // when reading old pickles that fail to deserialize using the native size.
122 static bool DeserializeValueSize(const std::string
& signon_realm
,
123 const PickleIterator
& iter
,
124 bool size_32
, bool warn_only
,
125 PasswordFormList
* forms
);
127 // In case the fields in the pickle ever change, version them so we can try to
128 // read old pickles. (Note: do not eat old pickles past the expiration date.)
129 static const int kPickleVersion
= 1;
131 // Generates a profile-specific folder name based on profile_id_.
132 std::string
GetProfileSpecificFolderName() const;
134 // Migrates non-profile-specific logins to be profile-specific.
135 void MigrateToProfileSpecificLogins();
137 // The local profile id, used to generate the folder name.
138 const LocalProfileId profile_id_
;
140 // The pref service to use for persistent migration settings.
143 // The KWallet folder name, possibly based on the local profile id.
144 std::string folder_name_
;
146 // True once MigrateToProfileSpecificLogins() has been attempted.
149 // DBus handle for communication with klauncher and kwalletd.
150 scoped_refptr
<dbus::Bus
> session_bus_
;
151 // Object proxy for kwalletd. We do not own this.
152 dbus::ObjectProxy
* kwallet_proxy_
;
154 // The name of the wallet we've opened. Set during Init().
155 std::string wallet_name_
;
156 // The application name (e.g. "Chromium"), shown in KWallet auth dialogs.
157 const std::string app_name_
;
159 DISALLOW_COPY_AND_ASSIGN(NativeBackendKWallet
);
162 #endif // CHROME_BROWSER_PASSWORD_MANAGER_NATIVE_BACKEND_KWALLET_X_H_