Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1604)

Side by Side Diff: chrome/browser/password_manager/password_store_win.cc

Issue 26465006: Fix IE password import (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Renaming ie7_password to ie7_password_win Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "chrome/browser/password_manager/password_store_win.h" 5 #include "chrome/browser/password_manager/password_store_win.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/password_manager/password_manager.h" 14 #include "chrome/browser/password_manager/password_manager.h"
15 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/webdata/web_data_service.h" 16 #include "chrome/browser/webdata/web_data_service.h"
17 #include "components/webdata/encryptor/ie7_password.h" 17 #include "components/webdata/encryptor/ie7_password_win.h"
18 18
19 using autofill::PasswordForm; 19 using autofill::PasswordForm;
20 using content::BrowserThread; 20 using content::BrowserThread;
21 21
22 // Handles requests to WebDataService. 22 // Handles requests to WebDataService.
23 class PasswordStoreWin::DBHandler : public WebDataServiceConsumer { 23 class PasswordStoreWin::DBHandler : public WebDataServiceConsumer {
24 public: 24 public:
25 DBHandler(WebDataService* web_data_service, 25 DBHandler(WebDataService* web_data_service,
26 PasswordStoreWin* password_store) 26 PasswordStoreWin* password_store)
27 : web_data_service_(web_data_service), 27 : web_data_service_(web_data_service),
(...skipping 19 matching lines...) Expand all
47 47
48 PasswordForm* form; 48 PasswordForm* form;
49 PasswordStoreWin::ConsumerCallbackRunner callback_runner; 49 PasswordStoreWin::ConsumerCallbackRunner callback_runner;
50 }; 50 };
51 51
52 // Holds info associated with in-flight GetIE7Login requests. 52 // Holds info associated with in-flight GetIE7Login requests.
53 typedef std::map<WebDataService::Handle, RequestInfo> PendingRequestMap; 53 typedef std::map<WebDataService::Handle, RequestInfo> PendingRequestMap;
54 54
55 // Gets logins from IE7 if no others are found. Also copies them into 55 // Gets logins from IE7 if no others are found. Also copies them into
56 // Chrome's WebDatabase so we don't need to look next time. 56 // Chrome's WebDatabase so we don't need to look next time.
57 PasswordForm* GetIE7Result(const WDTypedResult* result, 57 std::vector<autofill::PasswordForm*> GetIE7Results(
58 const PasswordForm& form); 58 const WDTypedResult* result,
59 const PasswordForm& form);
59 60
60 // WebDataServiceConsumer implementation. 61 // WebDataServiceConsumer implementation.
61 virtual void OnWebDataServiceRequestDone( 62 virtual void OnWebDataServiceRequestDone(
62 WebDataService::Handle handle, 63 WebDataService::Handle handle,
63 const WDTypedResult* result) OVERRIDE; 64 const WDTypedResult* result) OVERRIDE;
64 65
65 scoped_refptr<WebDataService> web_data_service_; 66 scoped_refptr<WebDataService> web_data_service_;
66 67
67 // This creates a cycle between us and PasswordStore. The cycle is broken 68 // This creates a cycle between us and PasswordStore. The cycle is broken
68 // from PasswordStoreWin::Shutdown, which deletes us. 69 // from PasswordStoreWin::Shutdown, which deletes us.
(...skipping 18 matching lines...) Expand all
87 const PasswordForm& form, 88 const PasswordForm& form,
88 const PasswordStoreWin::ConsumerCallbackRunner& callback_runner) { 89 const PasswordStoreWin::ConsumerCallbackRunner& callback_runner) {
89 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 90 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
90 IE7PasswordInfo info; 91 IE7PasswordInfo info;
91 info.url_hash = ie7_password::GetUrlHash(UTF8ToWide(form.origin.spec())); 92 info.url_hash = ie7_password::GetUrlHash(UTF8ToWide(form.origin.spec()));
92 WebDataService::Handle handle = web_data_service_->GetIE7Login(info, this); 93 WebDataService::Handle handle = web_data_service_->GetIE7Login(info, this);
93 pending_requests_[handle] = 94 pending_requests_[handle] =
94 RequestInfo(new PasswordForm(form), callback_runner); 95 RequestInfo(new PasswordForm(form), callback_runner);
95 } 96 }
96 97
97 PasswordForm* PasswordStoreWin::DBHandler::GetIE7Result( 98 std::vector<PasswordForm*> PasswordStoreWin::DBHandler::GetIE7Results(
98 const WDTypedResult *result, 99 const WDTypedResult *result,
99 const PasswordForm& form) { 100 const PasswordForm& form) {
100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
102 std::vector<PasswordForm*> matching_forms;
101 103
102 const WDResult<IE7PasswordInfo>* r = 104 const WDResult<IE7PasswordInfo>* r =
103 static_cast<const WDResult<IE7PasswordInfo>*>(result); 105 static_cast<const WDResult<IE7PasswordInfo>*>(result);
104 IE7PasswordInfo info = r->GetValue(); 106 IE7PasswordInfo info = r->GetValue();
105 107
106 if (!info.encrypted_data.empty()) { 108 if (!info.encrypted_data.empty()) {
107 // We got a result. 109 // We got a result.
108 // Delete the entry. If it's good we will add it to the real saved password 110 // Delete the entry. If it's good we will add it to the real saved password
109 // table. 111 // table.
110 web_data_service_->RemoveIE7Login(info); 112 web_data_service_->RemoveIE7Login(info);
111 std::wstring username; 113 std::vector<ie7_password::DecryptedCredentials> credentials;
112 std::wstring password;
113 std::wstring url = ASCIIToWide(form.origin.spec()); 114 std::wstring url = ASCIIToWide(form.origin.spec());
114 if (!ie7_password::DecryptPassword(url, info.encrypted_data, 115 if (ie7_password::DecryptPasswords(url,
115 &username, &password)) { 116 info.encrypted_data,
116 return NULL; 117 &credentials)) {
118 for (size_t i = 0; i < credentials.size(); ++i) {
119 PasswordForm* autofill = new PasswordForm(form);
120 autofill->username_value = credentials[i].username;
121 autofill->password_value = credentials[i].password;
122 autofill->preferred = true;
123 autofill->ssl_valid = form.origin.SchemeIsSecure();
124 autofill->date_created = info.date_created;
125 matching_forms.push_back(autofill);
126 // Add this PasswordForm to the saved password table. We're on the DB
127 // thread already, so we use AddLoginImpl.
128 password_store_->AddLoginImpl(*autofill);
129 }
117 } 130 }
118
119 PasswordForm* autofill = new PasswordForm(form);
120 autofill->username_value = username;
121 autofill->password_value = password;
122 autofill->preferred = true;
123 autofill->ssl_valid = form.origin.SchemeIsSecure();
124 autofill->date_created = info.date_created;
125 // Add this PasswordForm to the saved password table. We're on the DB thread
126 // already, so we use AddLoginImpl.
127 password_store_->AddLoginImpl(*autofill);
128 return autofill;
129 } 131 }
130 return NULL; 132 return matching_forms;
131 } 133 }
132 134
133 void PasswordStoreWin::DBHandler::OnWebDataServiceRequestDone( 135 void PasswordStoreWin::DBHandler::OnWebDataServiceRequestDone(
134 WebDataService::Handle handle, 136 WebDataService::Handle handle,
135 const WDTypedResult* result) { 137 const WDTypedResult* result) {
136 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
137 139
138 PendingRequestMap::iterator i = pending_requests_.find(handle); 140 PendingRequestMap::iterator i = pending_requests_.find(handle);
139 DCHECK(i != pending_requests_.end()); 141 DCHECK(i != pending_requests_.end());
140 142
141 scoped_ptr<PasswordForm> form(i->second.form); 143 scoped_ptr<PasswordForm> form(i->second.form);
142 PasswordStoreWin::ConsumerCallbackRunner callback_runner( 144 PasswordStoreWin::ConsumerCallbackRunner callback_runner(
143 i->second.callback_runner); 145 i->second.callback_runner);
144 pending_requests_.erase(i); 146 pending_requests_.erase(i);
145 147
146 std::vector<autofill::PasswordForm*> matched_forms;
147
148 if (!result) { 148 if (!result) {
149 // The WDS returns NULL if it is shutting down. Run callback with empty 149 // The WDS returns NULL if it is shutting down. Run callback with empty
150 // result. 150 // result.
151 callback_runner.Run(matched_forms); 151 callback_runner.Run(std::vector<autofill::PasswordForm*>());
152 return; 152 return;
153 } 153 }
154 154
155 DCHECK_EQ(PASSWORD_IE7_RESULT, result->GetType()); 155 DCHECK_EQ(PASSWORD_IE7_RESULT, result->GetType());
156 PasswordForm* ie7_form = GetIE7Result(result, *form); 156 std::vector<autofill::PasswordForm*> matched_forms =
157 157 GetIE7Results(result, *form);
158 if (ie7_form)
159 matched_forms.push_back(ie7_form);
160 158
161 callback_runner.Run(matched_forms); 159 callback_runner.Run(matched_forms);
162 } 160 }
163 161
164 PasswordStoreWin::PasswordStoreWin(LoginDatabase* login_database, 162 PasswordStoreWin::PasswordStoreWin(LoginDatabase* login_database,
165 Profile* profile, 163 Profile* profile,
166 WebDataService* web_data_service) 164 WebDataService* web_data_service)
167 : PasswordStoreDefault(login_database, profile) { 165 : PasswordStoreDefault(login_database, profile) {
168 db_handler_.reset(new DBHandler(web_data_service, this)); 166 db_handler_.reset(new DBHandler(web_data_service, this));
169 } 167 }
(...skipping 27 matching lines...) Expand all
197 } 195 }
198 196
199 void PasswordStoreWin::GetLoginsImpl( 197 void PasswordStoreWin::GetLoginsImpl(
200 const PasswordForm& form, 198 const PasswordForm& form,
201 const ConsumerCallbackRunner& callback_runner) { 199 const ConsumerCallbackRunner& callback_runner) {
202 ConsumerCallbackRunner get_ie7_login = 200 ConsumerCallbackRunner get_ie7_login =
203 base::Bind(&PasswordStoreWin::GetIE7LoginIfNecessary, 201 base::Bind(&PasswordStoreWin::GetIE7LoginIfNecessary,
204 this, form, callback_runner); 202 this, form, callback_runner);
205 PasswordStoreDefault::GetLoginsImpl(form, get_ie7_login); 203 PasswordStoreDefault::GetLoginsImpl(form, get_ie7_login);
206 } 204 }
OLDNEW
« no previous file with comments | « chrome/browser/importer/in_process_importer_bridge.cc ('k') | chrome/browser/password_manager/password_store_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698