Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / password_manager / native_backend_kwallet_x.h
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.
4
5 #ifndef CHROME_BROWSER_PASSWORD_MANAGER_NATIVE_BACKEND_KWALLET_X_H_
6 #define CHROME_BROWSER_PASSWORD_MANAGER_NATIVE_BACKEND_KWALLET_X_H_
7
8 #include <string>
9
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"
16
17 class Pickle;
18 class PickleIterator;
19
20 namespace autofill {
21 struct PasswordForm;
22 }
23
24 namespace base {
25 class WaitableEvent;
26 }
27
28 namespace dbus {
29 class Bus;
30 class ObjectProxy;
31 }
32
33 // NativeBackend implementation using KWallet.
34 class NativeBackendKWallet : public PasswordStoreX::NativeBackend {
35  public:
36   explicit NativeBackendKWallet(LocalProfileId id);
37
38   ~NativeBackendKWallet() override;
39
40   bool Init() override;
41
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;
60
61  protected:
62   // Invalid handle returned by WalletHandle().
63   static const int kInvalidKWalletHandle = -1;
64
65   // Internally used by Init(), but also for testing to provide a mock bus.
66   bool InitWithBus(scoped_refptr<dbus::Bus> optional_bus);
67
68   // Deserializes a list of PasswordForms from the wallet.
69   static void DeserializeValue(const std::string& signon_realm,
70                                const Pickle& pickle,
71                                PasswordFormList* forms);
72
73  private:
74   enum InitResult {
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.
78   };
79
80   enum TimestampToCompare {
81     CREATION_TIMESTAMP,
82     SYNC_TIMESTAMP,
83   };
84
85   // Initialization.
86   bool StartKWalletd();
87   InitResult InitWallet();
88   void InitOnDBThread(scoped_refptr<dbus::Bus> optional_bus,
89                       base::WaitableEvent* event,
90                       bool* success);
91
92   // Reads PasswordForms from the wallet that match the given signon_realm.
93   bool GetLoginsList(PasswordFormList* forms,
94                      const std::string& signon_realm,
95                      int wallet_handle);
96
97   // Reads PasswordForms from the wallet with the given autofillability state.
98   bool GetLoginsList(PasswordFormList* forms,
99                      bool autofillable,
100                      int wallet_handle);
101
102   // Helper for some of the above GetLoginsList() methods.
103   bool GetAllLogins(PasswordFormList* forms, int wallet_handle);
104
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,
110                      int wallet_handle);
111
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);
118
119   // Opens the wallet and ensures that the "Chrome Form Data" folder exists.
120   // Returns kInvalidWalletHandle on error.
121   int WalletHandle();
122
123   // Serializes a list of PasswordForms to be stored in the wallet.
124   static void SerializeValue(const PasswordFormList& forms, Pickle* pickle);
125
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);
136
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;
140
141   // Generates a profile-specific folder name based on profile_id_.
142   std::string GetProfileSpecificFolderName() const;
143
144   // The local profile id, used to generate the folder name.
145   const LocalProfileId profile_id_;
146
147   // The KWallet folder name, possibly based on the local profile id.
148   std::string folder_name_;
149
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_;
154
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_;
159
160   DISALLOW_COPY_AND_ASSIGN(NativeBackendKWallet);
161 };
162
163 #endif  // CHROME_BROWSER_PASSWORD_MANAGER_NATIVE_BACKEND_KWALLET_X_H_