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