| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ | 5 #ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ |
| 6 #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ | 6 #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 // should fail without side effects, return no data, and send no notifications. | 59 // should fail without side effects, return no data, and send no notifications. |
| 60 // PasswordStoreSync is a hidden base class because only PasswordSyncableService | 60 // PasswordStoreSync is a hidden base class because only PasswordSyncableService |
| 61 // needs to access these methods. | 61 // needs to access these methods. |
| 62 class PasswordStore : protected PasswordStoreSync, | 62 class PasswordStore : protected PasswordStoreSync, |
| 63 public base::RefCountedThreadSafe<PasswordStore> { | 63 public base::RefCountedThreadSafe<PasswordStore> { |
| 64 public: | 64 public: |
| 65 // Whether or not it's acceptable for Chrome to request access to locked | 65 // Whether or not it's acceptable for Chrome to request access to locked |
| 66 // passwords, which requires prompting the user for permission. | 66 // passwords, which requires prompting the user for permission. |
| 67 enum AuthorizationPromptPolicy { ALLOW_PROMPT, DISALLOW_PROMPT }; | 67 enum AuthorizationPromptPolicy { ALLOW_PROMPT, DISALLOW_PROMPT }; |
| 68 | 68 |
| 69 // PasswordForm vector elements are meant to be owned by the | |
| 70 // PasswordStoreConsumer. However, if the request is canceled after the | |
| 71 // allocation, then the request must take care of the deletion. | |
| 72 class GetLoginsRequest { | |
| 73 public: | |
| 74 explicit GetLoginsRequest(PasswordStoreConsumer* consumer); | |
| 75 virtual ~GetLoginsRequest(); | |
| 76 | |
| 77 void set_ignore_logins_cutoff(base::Time cutoff) { | |
| 78 ignore_logins_cutoff_ = cutoff; | |
| 79 } | |
| 80 | |
| 81 // Removes any logins in the result list that were saved before the cutoff. | |
| 82 void ApplyIgnoreLoginsCutoff(); | |
| 83 | |
| 84 // Forward the result to the consumer on the original message loop. | |
| 85 void ForwardResult(); | |
| 86 | |
| 87 std::vector<autofill::PasswordForm*>* result() const { | |
| 88 return result_.get(); | |
| 89 } | |
| 90 | |
| 91 private: | |
| 92 // See GetLogins(). Logins older than this will be removed from the reply. | |
| 93 base::Time ignore_logins_cutoff_; | |
| 94 | |
| 95 base::WeakPtr<PasswordStoreConsumer> consumer_weak_; | |
| 96 | |
| 97 // The result of the request. It is filled in on the PasswordStore's task | |
| 98 // thread and consumed on the UI thread. | |
| 99 // TODO(dubroy): Remove this, and instead pass the vector directly to the | |
| 100 // backend methods. | |
| 101 scoped_ptr<std::vector<autofill::PasswordForm*>> result_; | |
| 102 | |
| 103 base::ThreadChecker thread_checker_; | |
| 104 scoped_refptr<base::MessageLoopProxy> origin_loop_; | |
| 105 | |
| 106 DISALLOW_COPY_AND_ASSIGN(GetLoginsRequest); | |
| 107 }; | |
| 108 | |
| 109 // An interface used to notify clients (observers) of this object that data in | 69 // An interface used to notify clients (observers) of this object that data in |
| 110 // the password store has changed. Register the observer via | 70 // the password store has changed. Register the observer via |
| 111 // PasswordStore::AddObserver. | 71 // PasswordStore::AddObserver. |
| 112 class Observer { | 72 class Observer { |
| 113 public: | 73 public: |
| 114 // Notifies the observer that password data changed. Will be called from | 74 // Notifies the observer that password data changed. Will be called from |
| 115 // the UI thread. | 75 // the UI thread. |
| 116 virtual void OnLoginsChanged(const PasswordStoreChangeList& changes) = 0; | 76 virtual void OnLoginsChanged(const PasswordStoreChangeList& changes) = 0; |
| 117 | 77 |
| 118 protected: | 78 protected: |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 #if defined(PASSWORD_MANAGER_ENABLE_SYNC) | 145 #if defined(PASSWORD_MANAGER_ENABLE_SYNC) |
| 186 base::WeakPtr<syncer::SyncableService> GetPasswordSyncableService(); | 146 base::WeakPtr<syncer::SyncableService> GetPasswordSyncableService(); |
| 187 #endif | 147 #endif |
| 188 | 148 |
| 189 protected: | 149 protected: |
| 190 friend class base::RefCountedThreadSafe<PasswordStore>; | 150 friend class base::RefCountedThreadSafe<PasswordStore>; |
| 191 FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, IgnoreOldWwwGoogleLogins); | 151 FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, IgnoreOldWwwGoogleLogins); |
| 192 | 152 |
| 193 typedef base::Callback<PasswordStoreChangeList(void)> ModificationTask; | 153 typedef base::Callback<PasswordStoreChangeList(void)> ModificationTask; |
| 194 | 154 |
| 155 // PasswordForm vector elements are meant to be owned by the |
| 156 // PasswordStoreConsumer. However, if the request is canceled after the |
| 157 // allocation, then the request must take care of the deletion. |
| 158 class GetLoginsRequest { |
| 159 public: |
| 160 explicit GetLoginsRequest(PasswordStoreConsumer* consumer); |
| 161 virtual ~GetLoginsRequest(); |
| 162 |
| 163 void set_ignore_logins_cutoff(base::Time cutoff) { |
| 164 ignore_logins_cutoff_ = cutoff; |
| 165 } |
| 166 |
| 167 // Removes any logins in the result list that were saved before the cutoff. |
| 168 void ApplyIgnoreLoginsCutoff(); |
| 169 |
| 170 // Forward the result to the consumer on the original message loop. |
| 171 void ForwardResult(); |
| 172 |
| 173 ScopedVector<autofill::PasswordForm>* result() { return &result_; } |
| 174 |
| 175 private: |
| 176 // See GetLogins(). Logins older than this will be removed from the reply. |
| 177 base::Time ignore_logins_cutoff_; |
| 178 |
| 179 base::WeakPtr<PasswordStoreConsumer> consumer_weak_; |
| 180 |
| 181 // The result of the request. It is filled in on the PasswordStore's task |
| 182 // thread and consumed on the UI thread. |
| 183 ScopedVector<autofill::PasswordForm> result_; |
| 184 |
| 185 base::ThreadChecker thread_checker_; |
| 186 scoped_refptr<base::MessageLoopProxy> origin_loop_; |
| 187 |
| 188 DISALLOW_COPY_AND_ASSIGN(GetLoginsRequest); |
| 189 }; |
| 190 |
| 195 ~PasswordStore() override; | 191 ~PasswordStore() override; |
| 196 | 192 |
| 197 // Get the TaskRunner to use for PasswordStore background tasks. | 193 // Get the TaskRunner to use for PasswordStore background tasks. |
| 198 // By default, a SingleThreadTaskRunner on the DB thread is used, but | 194 // By default, a SingleThreadTaskRunner on the DB thread is used, but |
| 199 // subclasses can override. | 195 // subclasses can override. |
| 200 virtual scoped_refptr<base::SingleThreadTaskRunner> GetBackgroundTaskRunner(); | 196 virtual scoped_refptr<base::SingleThreadTaskRunner> GetBackgroundTaskRunner(); |
| 201 | 197 |
| 202 // Methods below will be run in PasswordStore's own thread. | 198 // Methods below will be run in PasswordStore's own thread. |
| 203 // Synchronous implementation that reports usage metrics. | 199 // Synchronous implementation that reports usage metrics. |
| 204 virtual void ReportMetricsImpl(const std::string& sync_username, | 200 virtual void ReportMetricsImpl(const std::string& sync_username, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 228 ConsumerCallbackRunner; | 224 ConsumerCallbackRunner; |
| 229 | 225 |
| 230 // Should find all PasswordForms with the same signon_realm. The results | 226 // Should find all PasswordForms with the same signon_realm. The results |
| 231 // will then be scored by the PasswordFormManager. Once they are found | 227 // will then be scored by the PasswordFormManager. Once they are found |
| 232 // (or not), the consumer should be notified. | 228 // (or not), the consumer should be notified. |
| 233 virtual void GetLoginsImpl(const autofill::PasswordForm& form, | 229 virtual void GetLoginsImpl(const autofill::PasswordForm& form, |
| 234 AuthorizationPromptPolicy prompt_policy, | 230 AuthorizationPromptPolicy prompt_policy, |
| 235 const ConsumerCallbackRunner& callback_runner) = 0; | 231 const ConsumerCallbackRunner& callback_runner) = 0; |
| 236 | 232 |
| 237 // Finds all non-blacklist PasswordForms, and notifies the consumer. | 233 // Finds all non-blacklist PasswordForms, and notifies the consumer. |
| 238 virtual void GetAutofillableLoginsImpl(GetLoginsRequest* request) = 0; | 234 virtual void GetAutofillableLoginsImpl( |
| 235 scoped_ptr<GetLoginsRequest> request) = 0; |
| 239 | 236 |
| 240 // Finds all blacklist PasswordForms, and notifies the consumer. | 237 // Finds all blacklist PasswordForms, and notifies the consumer. |
| 241 virtual void GetBlacklistLoginsImpl(GetLoginsRequest* request) = 0; | 238 virtual void GetBlacklistLoginsImpl(scoped_ptr<GetLoginsRequest> request) = 0; |
| 242 | 239 |
| 243 // Dispatches the result to the PasswordStoreConsumer on the original caller's | 240 // Dispatches the result to the PasswordStoreConsumer on the original caller's |
| 244 // thread so the callback can be executed there. This should be the UI thread. | 241 // thread so the callback can be executed there. This should be the UI thread. |
| 245 static void ForwardLoginsResult(GetLoginsRequest* request); | 242 static void ForwardLoginsResult(scoped_ptr<GetLoginsRequest> request); |
| 246 | 243 |
| 247 // Log UMA stats for number of bulk deletions. | 244 // Log UMA stats for number of bulk deletions. |
| 248 void LogStatsForBulkDeletion(int num_deletions); | 245 void LogStatsForBulkDeletion(int num_deletions); |
| 249 | 246 |
| 250 // Log UMA stats for password deletions happening on clear browsing data | 247 // Log UMA stats for password deletions happening on clear browsing data |
| 251 // since first sync during rollback. | 248 // since first sync during rollback. |
| 252 void LogStatsForBulkDeletionDuringRollback(int num_deletions); | 249 void LogStatsForBulkDeletionDuringRollback(int num_deletions); |
| 253 | 250 |
| 254 // PasswordStoreSync: | 251 // PasswordStoreSync: |
| 255 // Called by WrapModificationTask() once the underlying data-modifying | 252 // Called by WrapModificationTask() once the underlying data-modifying |
| 256 // operation has been performed. Notifies observers that password store data | 253 // operation has been performed. Notifies observers that password store data |
| 257 // may have been changed. | 254 // may have been changed. |
| 258 void NotifyLoginsChanged(const PasswordStoreChangeList& changes) override; | 255 void NotifyLoginsChanged(const PasswordStoreChangeList& changes) override; |
| 259 | 256 |
| 260 // TaskRunner for tasks that run on the main thread (usually the UI thread). | 257 // TaskRunner for tasks that run on the main thread (usually the UI thread). |
| 261 scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner_; | 258 scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner_; |
| 262 | 259 |
| 263 // TaskRunner for the DB thread. By default, this is the task runner used for | 260 // TaskRunner for the DB thread. By default, this is the task runner used for |
| 264 // background tasks -- see |GetBackgroundTaskRunner|. | 261 // background tasks -- see |GetBackgroundTaskRunner|. |
| 265 scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner_; | 262 scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner_; |
| 266 | 263 |
| 267 private: | 264 private: |
| 268 // Schedule the given |func| to be run in the PasswordStore's own thread with | 265 // Schedule the given |func| to be run in the PasswordStore's own thread with |
| 269 // responses delivered to |consumer| on the current thread. | 266 // responses delivered to |consumer| on the current thread. |
| 270 template <typename BackendFunc> | 267 void Schedule(void (PasswordStore::*func)(scoped_ptr<GetLoginsRequest>), |
| 271 void Schedule(BackendFunc func, PasswordStoreConsumer* consumer); | 268 PasswordStoreConsumer* consumer); |
| 272 | 269 |
| 273 // Wrapper method called on the destination thread (DB for non-mac) that | 270 // Wrapper method called on the destination thread (DB for non-mac) that |
| 274 // invokes |task| and then calls back into the source thread to notify | 271 // invokes |task| and then calls back into the source thread to notify |
| 275 // observers that the password store may have been modified via | 272 // observers that the password store may have been modified via |
| 276 // NotifyLoginsChanged(). Note that there is no guarantee that the called | 273 // NotifyLoginsChanged(). Note that there is no guarantee that the called |
| 277 // method will actually modify the password store data. | 274 // method will actually modify the password store data. |
| 278 void WrapModificationTask(ModificationTask task); | 275 void WrapModificationTask(ModificationTask task); |
| 279 | 276 |
| 280 // Temporary specializations of WrapModificationTask for a better stack trace. | 277 // Temporary specializations of WrapModificationTask for a better stack trace. |
| 281 void AddLoginInternal(const autofill::PasswordForm& form); | 278 void AddLoginInternal(const autofill::PasswordForm& form); |
| 282 void UpdateLoginInternal(const autofill::PasswordForm& form); | 279 void UpdateLoginInternal(const autofill::PasswordForm& form); |
| 283 void RemoveLoginInternal(const autofill::PasswordForm& form); | 280 void RemoveLoginInternal(const autofill::PasswordForm& form); |
| 284 void RemoveLoginsCreatedBetweenInternal(base::Time delete_begin, | 281 void RemoveLoginsCreatedBetweenInternal(base::Time delete_begin, |
| 285 base::Time delete_end); | 282 base::Time delete_end); |
| 286 void RemoveLoginsSyncedBetweenInternal(base::Time delete_begin, | 283 void RemoveLoginsSyncedBetweenInternal(base::Time delete_begin, |
| 287 base::Time delete_end); | 284 base::Time delete_end); |
| 288 | 285 |
| 289 // Copies |matched_forms| into the request's result vector, then calls | 286 // Copies |matched_forms| into the request's result vector, then calls |
| 290 // |ForwardLoginsResult|. Temporarily used as an adapter between the API of | 287 // |ForwardLoginsResult|. Temporarily used as an adapter between the API of |
| 291 // |GetLoginsImpl| and |PasswordStoreConsumer|. | 288 // |GetLoginsImpl| and |PasswordStoreConsumer|. |
| 292 // TODO(dubroy): Get rid of this. | 289 // TODO(dubroy): Get rid of this. |
| 293 static void CopyAndForwardLoginsResult( | 290 static void CopyAndForwardLoginsResult( |
| 294 PasswordStore::GetLoginsRequest* request, | 291 scoped_ptr<PasswordStore::GetLoginsRequest> request, |
| 295 ScopedVector<autofill::PasswordForm> matched_forms); | 292 ScopedVector<autofill::PasswordForm> matched_forms); |
| 296 | 293 |
| 297 #if defined(PASSWORD_MANAGER_ENABLE_SYNC) | 294 #if defined(PASSWORD_MANAGER_ENABLE_SYNC) |
| 298 // Creates PasswordSyncableService instance on the background thread. | 295 // Creates PasswordSyncableService instance on the background thread. |
| 299 void InitSyncableService( | 296 void InitSyncableService( |
| 300 const syncer::SyncableService::StartSyncFlare& flare); | 297 const syncer::SyncableService::StartSyncFlare& flare); |
| 301 | 298 |
| 302 // Deletes PasswordSyncableService instance on the background thread. | 299 // Deletes PasswordSyncableService instance on the background thread. |
| 303 void DestroySyncableService(); | 300 void DestroySyncableService(); |
| 304 #endif | 301 #endif |
| 305 | 302 |
| 306 // The observers. | 303 // The observers. |
| 307 scoped_refptr<ObserverListThreadSafe<Observer>> observers_; | 304 scoped_refptr<ObserverListThreadSafe<Observer>> observers_; |
| 308 | 305 |
| 309 scoped_ptr<PasswordSyncableService> syncable_service_; | 306 scoped_ptr<PasswordSyncableService> syncable_service_; |
| 310 | 307 |
| 311 bool shutdown_called_; | 308 bool shutdown_called_; |
| 312 | 309 |
| 313 DISALLOW_COPY_AND_ASSIGN(PasswordStore); | 310 DISALLOW_COPY_AND_ASSIGN(PasswordStore); |
| 314 }; | 311 }; |
| 315 | 312 |
| 316 } // namespace password_manager | 313 } // namespace password_manager |
| 317 | 314 |
| 318 #endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ | 315 #endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_H_ |
| OLD | NEW |