15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_X_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_X_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_store_default.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace password_manager {
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass LoginDatabase;
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PasswordStoreX is used on Linux and other non-Windows, non-Mac OS X
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// operating systems. It uses a "native backend" to actually store the password
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data when such a backend is available, and otherwise falls back to using the
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// login database like PasswordStoreDefault. It also handles automatically
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// migrating password data to a native backend from the login database.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are currently native backends for GNOME Keyring and KWallet.
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass PasswordStoreX : public password_manager::PasswordStoreDefault {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NativeBackends more or less implement the PaswordStore interface, but
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with return values rather than implicit consumer notification.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class NativeBackend {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    typedef std::vector<autofill::PasswordForm*> PasswordFormList;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~NativeBackend() {}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool Init() = 0;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual password_manager::PasswordStoreChangeList AddLogin(
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        const autofill::PasswordForm& form) = 0;
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual bool UpdateLogin(
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        const autofill::PasswordForm& form,
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        password_manager::PasswordStoreChangeList* changes) = 0;
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool RemoveLogin(const autofill::PasswordForm& form) = 0;
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Removes all logins created/synced from |delete_begin| onwards (inclusive)
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // and before |delete_end|. You may use a null Time value to do an unbounded
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // delete in either direction.
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    virtual bool RemoveLoginsCreatedBetween(
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        base::Time delete_begin,
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        base::Time delete_end,
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        password_manager::PasswordStoreChangeList* changes) = 0;
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual bool RemoveLoginsSyncedBetween(
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Time delete_begin,
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Time delete_end,
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        password_manager::PasswordStoreChangeList* changes) = 0;
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool GetLogins(const autofill::PasswordForm& form,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           PasswordFormList* forms) = 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetAutofillableLogins(PasswordFormList* forms) = 0;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetBlacklistLogins(PasswordFormList* forms) = 0;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |login_db| and |backend|. |backend| may be NULL in which
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // case this PasswordStoreX will act the same as PasswordStoreDefault.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PasswordStoreX(scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner,
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner,
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                 password_manager::LoginDatabase* login_db,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 NativeBackend* backend);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class PasswordStoreXTest;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PasswordStoreX();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implements PasswordStore interface.
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual password_manager::PasswordStoreChangeList AddLoginImpl(
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const autofill::PasswordForm& form) OVERRIDE;
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual password_manager::PasswordStoreChangeList UpdateLoginImpl(
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const autofill::PasswordForm& form) OVERRIDE;
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual password_manager::PasswordStoreChangeList RemoveLoginImpl(
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const autofill::PasswordForm& form) OVERRIDE;
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual password_manager::PasswordStoreChangeList
886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      RemoveLoginsCreatedBetweenImpl(base::Time delete_begin,
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                     base::Time delete_end) OVERRIDE;
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual password_manager::PasswordStoreChangeList
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      RemoveLoginsSyncedBetweenImpl(base::Time delete_begin,
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    base::Time delete_end) OVERRIDE;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetLoginsImpl(
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const autofill::PasswordForm& form,
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AuthorizationPromptPolicy prompt_policy,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ConsumerCallbackRunner& callback_runner) OVERRIDE;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAutofillableLoginsImpl(GetLoginsRequest* request) OVERRIDE;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetBlacklistLoginsImpl(GetLoginsRequest* request) OVERRIDE;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool FillAutofillableLogins(
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<autofill::PasswordForm*>* forms) OVERRIDE;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool FillBlacklistLogins(
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<autofill::PasswordForm*>* forms) OVERRIDE;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sort logins by origin, like the ORDER BY clause in login_database.cc.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SortLoginsByOrigin(NativeBackend::PasswordFormList* list);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check to see whether migration is necessary, and perform it if so.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckMigration();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if we should try using the native backend.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_native_backend() { return !!backend_.get(); }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if we can fall back on the default store, warning the first
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time we call it when falling back is necessary. See |allow_fallback_|.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_default_store();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronously migrates all the passwords stored in the login database to
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the native backend. If successful, the login database will be left with no
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stored passwords, and the number of passwords migrated will be returned.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (This might be 0 if migration was not necessary.) Returns < 0 on failure.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssize_t MigrateLogins();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The native backend in use, or NULL if none.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<NativeBackend> backend_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether we have already attempted migration to the native store.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool migration_checked_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether we should allow falling back to the default store. If there is
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nothing to migrate, then the first attempt to use the native store will
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be the first time we try to use it and we should allow falling back. If
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we have migrated successfully, then we do not allow falling back.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_fallback_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PasswordStoreX);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_X_H_
137