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"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_default.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginDatabase;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PasswordStoreX is used on Linux and other non-Windows, non-Mac OS X
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// operating systems. It uses a "native backend" to actually store the password
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data when such a backend is available, and otherwise falls back to using the
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// login database like PasswordStoreDefault. It also handles automatically
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// migrating password data to a native backend from the login database.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are currently native backends for GNOME Keyring and KWallet.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStoreX : public PasswordStoreDefault {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NativeBackends more or less implement the PaswordStore interface, but
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with return values rather than implicit consumer notification.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class NativeBackend {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    typedef std::vector<autofill::PasswordForm*> PasswordFormList;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~NativeBackend() {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool Init() = 0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool AddLogin(const autofill::PasswordForm& form) = 0;
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool UpdateLogin(const autofill::PasswordForm& form) = 0;
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool RemoveLogin(const autofill::PasswordForm& form) = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool RemoveLoginsCreatedBetween(const base::Time& delete_begin,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const base::Time& delete_end) = 0;
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool GetLogins(const autofill::PasswordForm& form,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           PasswordFormList* forms) = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetLoginsCreatedBetween(const base::Time& get_begin,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const base::Time& get_end,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         PasswordFormList* forms) = 0;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetAutofillableLogins(PasswordFormList* forms) = 0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetBlacklistLogins(PasswordFormList* forms) = 0;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |login_db| and |backend|. |backend| may be NULL in which
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // case this PasswordStoreX will act the same as PasswordStoreDefault.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordStoreX(LoginDatabase* login_db,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 Profile* profile,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 NativeBackend* backend);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) && !defined(OS_CHROMEOS) && defined(OS_POSIX)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the pref setting used for the methods below.
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if passwords have been tagged with the local profile id.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool PasswordsUseLocalProfileId(PrefService* prefs);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the persistent bit indicating that passwords have been tagged with the
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // local profile id. This cannot be unset; passwords get migrated only once.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The caller promises that |prefs| will not be deleted any time soon.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetPasswordsUseLocalProfileId(PrefService* prefs);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX) && !defined(OS_CHROMEOS) && defined(OS_POSIX)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class PasswordStoreXTest;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PasswordStoreX();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implements PasswordStore interface.
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AddLoginImpl(const autofill::PasswordForm& form) OVERRIDE;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateLoginImpl(
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const autofill::PasswordForm& form) OVERRIDE;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveLoginImpl(
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const autofill::PasswordForm& form) OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveLoginsCreatedBetweenImpl(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Time& delete_begin, const base::Time& delete_end) OVERRIDE;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetLoginsImpl(
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const autofill::PasswordForm& form,
89f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)      AuthorizationPromptPolicy prompt_policy,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ConsumerCallbackRunner& callback_runner) OVERRIDE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetAutofillableLoginsImpl(GetLoginsRequest* request) OVERRIDE;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetBlacklistLoginsImpl(GetLoginsRequest* request) OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool FillAutofillableLogins(
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<autofill::PasswordForm*>* forms) OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool FillBlacklistLogins(
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<autofill::PasswordForm*>* forms) OVERRIDE;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sort logins by origin, like the ORDER BY clause in login_database.cc.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SortLoginsByOrigin(NativeBackend::PasswordFormList* list);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check to see whether migration is necessary, and perform it if so.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckMigration();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if we should try using the native backend.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_native_backend() { return !!backend_.get(); }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if we can fall back on the default store, warning the first
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time we call it when falling back is necessary. See |allow_fallback_|.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_default_store();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronously migrates all the passwords stored in the login database to
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the native backend. If successful, the login database will be left with no
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stored passwords, and the number of passwords migrated will be returned.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (This might be 0 if migration was not necessary.) Returns < 0 on failure.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssize_t MigrateLogins();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The native backend in use, or NULL if none.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<NativeBackend> backend_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether we have already attempted migration to the native store.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool migration_checked_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether we should allow falling back to the default store. If there is
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nothing to migrate, then the first attempt to use the native store will
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be the first time we try to use it and we should allow falling back. If
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we have migrated successfully, then we do not allow falling back.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_fallback_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PasswordStoreX);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_X_H_
131