Home | History | Annotate | Download | only in password_manager
      1 // Copyright (c) 2011 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_PASSWORD_STORE_X_H_
      6 #define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_X_H_
      7 #pragma once
      8 
      9 #include <vector>
     10 
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/time.h"
     13 #include "chrome/browser/password_manager/password_store_default.h"
     14 
     15 class LoginDatabase;
     16 class Profile;
     17 class WebDataService;
     18 
     19 // PasswordStoreX is used on Linux and other non-Windows, non-Mac OS X
     20 // operating systems. It uses a "native backend" to actually store the password
     21 // data when such a backend is available, and otherwise falls back to using the
     22 // login database like PasswordStoreDefault. It also handles automatically
     23 // migrating password data to a native backend from the login database.
     24 //
     25 // There are currently native backends for GNOME Keyring and KWallet.
     26 class PasswordStoreX : public PasswordStoreDefault {
     27  public:
     28   // NativeBackends more or less implement the PaswordStore interface, but
     29   // with return values rather than implicit consumer notification.
     30   class NativeBackend {
     31    public:
     32     typedef std::vector<webkit_glue::PasswordForm*> PasswordFormList;
     33 
     34     virtual ~NativeBackend() {}
     35 
     36     virtual bool Init() = 0;
     37 
     38     virtual bool AddLogin(const webkit_glue::PasswordForm& form) = 0;
     39     virtual bool UpdateLogin(const webkit_glue::PasswordForm& form) = 0;
     40     virtual bool RemoveLogin(const webkit_glue::PasswordForm& form) = 0;
     41     virtual bool RemoveLoginsCreatedBetween(const base::Time& delete_begin,
     42                                             const base::Time& delete_end) = 0;
     43     virtual bool GetLogins(const webkit_glue::PasswordForm& form,
     44                            PasswordFormList* forms) = 0;
     45     virtual bool GetLoginsCreatedBetween(const base::Time& get_begin,
     46                                          const base::Time& get_end,
     47                                          PasswordFormList* forms) = 0;
     48     virtual bool GetAutofillableLogins(PasswordFormList* forms) = 0;
     49     virtual bool GetBlacklistLogins(PasswordFormList* forms) = 0;
     50   };
     51 
     52   // Takes ownership of |login_db| and |backend|. |backend| may be NULL in which
     53   // case this PasswordStoreX will act the same as PasswordStoreDefault.
     54   PasswordStoreX(LoginDatabase* login_db,
     55                    Profile* profile,
     56                    WebDataService* web_data_service,
     57                    NativeBackend* backend);
     58 
     59  private:
     60   friend class PasswordStoreXTest;
     61 
     62   virtual ~PasswordStoreX();
     63 
     64   // Implements PasswordStore interface.
     65   virtual void AddLoginImpl(const webkit_glue::PasswordForm& form);
     66   virtual void UpdateLoginImpl(const webkit_glue::PasswordForm& form);
     67   virtual void RemoveLoginImpl(const webkit_glue::PasswordForm& form);
     68   virtual void RemoveLoginsCreatedBetweenImpl(const base::Time& delete_begin,
     69                                               const base::Time& delete_end);
     70   virtual void GetLoginsImpl(GetLoginsRequest* request,
     71                              const webkit_glue::PasswordForm& form);
     72   virtual void GetAutofillableLoginsImpl(GetLoginsRequest* request);
     73   virtual void GetBlacklistLoginsImpl(GetLoginsRequest* request);
     74   virtual bool FillAutofillableLogins(
     75       std::vector<webkit_glue::PasswordForm*>* forms);
     76   virtual bool FillBlacklistLogins(
     77       std::vector<webkit_glue::PasswordForm*>* forms);
     78 
     79   // Check to see whether migration is necessary, and perform it if so.
     80   void CheckMigration();
     81 
     82   // Return true if we should try using the native backend.
     83   bool use_native_backend() { return !!backend_.get(); }
     84 
     85   // Return true if we can fall back on the default store, warning the first
     86   // time we call it when falling back is necessary. See |allow_fallback_|.
     87   bool allow_default_store();
     88 
     89   // Synchronously migrates all the passwords stored in the login database to
     90   // the native backend. If successful, the login database will be left with no
     91   // stored passwords, and the number of passwords migrated will be returned.
     92   // (This might be 0 if migration was not necessary.) Returns < 0 on failure.
     93   ssize_t MigrateLogins();
     94 
     95   // The native backend in use, or NULL if none.
     96   scoped_ptr<NativeBackend> backend_;
     97   // Whether we have already attempted migration to the native store.
     98   bool migration_checked_;
     99   // Whether we should allow falling back to the default store. If there is
    100   // nothing to migrate, then the first attempt to use the native store will
    101   // be the first time we try to use it and we should allow falling back. If
    102   // we have migrated successfully, then we do not allow falling back.
    103   bool allow_fallback_;
    104 
    105   DISALLOW_COPY_AND_ASSIGN(PasswordStoreX);
    106 };
    107 
    108 #endif  // CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_X_H_
    109