OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2009 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 #include "chrome/browser/password_manager/password_store_win.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "base/string_util.h" |
| 9 #include "chrome/browser/password_manager/ie7_password.h" |
| 10 #include "chrome/browser/password_manager/password_manager.h" |
| 11 #include "chrome/browser/profile.h" |
| 12 |
| 13 using std::map; |
| 14 using std::vector; |
| 15 |
| 16 PasswordStoreWin::PasswordStoreWin(WebDataService* web_data_service) |
| 17 : PasswordStoreDefault(web_data_service) { |
| 18 } |
| 19 |
| 20 void PasswordStoreWin::OnWebDataServiceRequestDone( |
| 21 WebDataService::Handle h, const WDTypedResult *result) { |
| 22 // Look up this handle in our request map to get the original |
| 23 // GetLoginsRequest. |
| 24 PendingRequestMap::const_iterator it(pending_requests_.find(h)); |
| 25 DCHECK(it != pending_requests_.end()); |
| 26 |
| 27 GetLoginsRequest* request = (*it).second; |
| 28 pending_requests_.erase(h); |
| 29 |
| 30 DCHECK(result); |
| 31 if (!result) |
| 32 return; |
| 33 |
| 34 switch (result->GetType()) { |
| 35 case PASSWORD_RESULT: { |
| 36 // This is a response from WebDataService::GetLogins. |
| 37 const WDResult<std::vector<PasswordForm*> >* r = |
| 38 static_cast<const WDResult<std::vector<PasswordForm*> >*>(result); |
| 39 std::vector<PasswordForm*> result_value = r->GetValue(); |
| 40 |
| 41 if (result_value.size()) { |
| 42 // If we found some results then return them now. |
| 43 NotifyConsumer(request, result_value); |
| 44 return; |
| 45 } else { |
| 46 // Otherwise try finding IE7 logins. |
| 47 IE7PasswordInfo info; |
| 48 std::wstring url = ASCIIToWide(request->form.origin.spec()); |
| 49 info.url_hash = ie7_password::GetUrlHash(url); |
| 50 |
| 51 WebDataService::Handle web_data_handle = |
| 52 web_data_service_->GetIE7Login(info, this); |
| 53 pending_requests_.insert(PendingRequestMap::value_type( |
| 54 web_data_handle, request)); |
| 55 } |
| 56 break; |
| 57 } |
| 58 |
| 59 case PASSWORD_IE7_RESULT: { |
| 60 // This is a response from WebDataService::GetIE7Login. |
| 61 PasswordForm* ie7_form = GetIE7Result(result, request->form); |
| 62 |
| 63 std::vector<PasswordForm*> forms; |
| 64 if (ie7_form) |
| 65 forms.push_back(ie7_form); |
| 66 |
| 67 NotifyConsumer(request, forms); |
| 68 break; |
| 69 } |
| 70 } |
| 71 } |
| 72 |
| 73 PasswordForm* PasswordStoreWin::GetIE7Result(const WDTypedResult *result, |
| 74 const PasswordForm& form) { |
| 75 const WDResult<IE7PasswordInfo>* r = |
| 76 static_cast<const WDResult<IE7PasswordInfo>*>(result); |
| 77 IE7PasswordInfo info = r->GetValue(); |
| 78 |
| 79 if (!info.encrypted_data.empty()) { |
| 80 // We got a result. |
| 81 // Delete the entry. If it's good we will add it to the real saved password |
| 82 // table. |
| 83 web_data_service_->RemoveIE7Login(info); |
| 84 std::wstring username; |
| 85 std::wstring password; |
| 86 std::wstring url = ASCIIToWide(form.origin.spec()); |
| 87 if (!ie7_password::DecryptPassword(url, info.encrypted_data, |
| 88 &username, &password)) { |
| 89 return NULL; |
| 90 } |
| 91 |
| 92 PasswordForm* auto_fill = new PasswordForm(form); |
| 93 auto_fill->username_value = username; |
| 94 auto_fill->password_value = password; |
| 95 auto_fill->preferred = true; |
| 96 auto_fill->ssl_valid = form.origin.SchemeIsSecure(); |
| 97 auto_fill->date_created = info.date_created; |
| 98 // Add this PasswordForm to the saved password table. |
| 99 AddLogin(*auto_fill); |
| 100 return auto_fill; |
| 101 } |
| 102 return NULL; |
| 103 } |
OLD | NEW |