Disable view source for Developer Tools.
[chromium-blink-merge.git] / chrome / browser / password_manager / native_backend_kwallet_x.h
blob55a9c421a35501d5c2d819fa8a307a97abbf4d32
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_
8 #include <string>
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"
17 class Pickle;
18 class PickleIterator;
19 class PrefService;
21 namespace autofill {
22 struct PasswordForm;
25 namespace base {
26 class WaitableEvent;
29 namespace dbus {
30 class Bus;
31 class ObjectProxy;
34 // NativeBackend implementation using KWallet.
35 class NativeBackendKWallet : public PasswordStoreX::NativeBackend {
36 public:
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;
57 protected:
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,
66 const Pickle& pickle,
67 PasswordFormList* forms);
69 private:
70 enum InitResult {
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.
76 // Initialization.
77 bool StartKWalletd();
78 InitResult InitWallet();
79 void InitOnDBThread(scoped_refptr<dbus::Bus> optional_bus,
80 base::WaitableEvent* event,
81 bool* success);
83 // Reads PasswordForms from the wallet that match the given signon_realm.
84 bool GetLoginsList(PasswordFormList* forms,
85 const std::string& signon_realm,
86 int wallet_handle);
88 // Reads PasswordForms from the wallet with the given autofillability state.
89 bool GetLoginsList(PasswordFormList* forms,
90 bool autofillable,
91 int wallet_handle);
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,
97 int wallet_handle);
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,
107 int wallet_handle);
109 // Opens the wallet and ensures that the "Chrome Form Data" folder exists.
110 // Returns kInvalidWalletHandle on error.
111 int WalletHandle();
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.
141 PrefService* prefs_;
143 // The KWallet folder name, possibly based on the local profile id.
144 std::string folder_name_;
146 // True once MigrateToProfileSpecificLogins() has been attempted.
147 bool migrate_tried_;
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_