OLD | NEW |
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_mac.h" | 5 #include "chrome/browser/password_manager/password_store_mac.h" |
6 #include "chrome/browser/password_manager/password_store_mac_internal.h" | 6 #include "chrome/browser/password_manager/password_store_mac_internal.h" |
7 | 7 |
8 #include <CoreServices/CoreServices.h> | 8 #include <CoreServices/CoreServices.h> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/mac/mac_logging.h" | 15 #include "base/mac/mac_logging.h" |
16 #include "base/mac/mac_util.h" | 16 #include "base/mac/mac_util.h" |
17 #include "base/message_loop.h" | 17 #include "base/message_loop.h" |
18 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
19 #include "base/string_util.h" | 19 #include "base/string_util.h" |
20 #include "base/utf_string_conversions.h" | 20 #include "base/utf_string_conversions.h" |
21 #include "chrome/browser/password_manager/login_database.h" | 21 #include "chrome/browser/password_manager/login_database.h" |
22 #include "chrome/browser/password_manager/password_store_change.h" | 22 #include "chrome/browser/password_manager/password_store_change.h" |
23 #include "chrome/common/chrome_notification_types.h" | 23 #include "chrome/common/chrome_notification_types.h" |
24 #include "content/public/browser/notification_service.h" | 24 #include "content/public/browser/notification_service.h" |
25 #include "crypto/keychain_mac.h" | 25 #include "crypto/apple_keychain.h" |
26 | 26 |
27 using crypto::MacKeychain; | 27 using crypto::AppleKeychain; |
28 using webkit::forms::PasswordForm; | 28 using webkit::forms::PasswordForm; |
29 | 29 |
30 // Utility class to handle the details of constructing and running a keychain | 30 // Utility class to handle the details of constructing and running a keychain |
31 // search from a set of attributes. | 31 // search from a set of attributes. |
32 class KeychainSearch { | 32 class KeychainSearch { |
33 public: | 33 public: |
34 explicit KeychainSearch(const MacKeychain& keychain); | 34 explicit KeychainSearch(const AppleKeychain& keychain); |
35 ~KeychainSearch(); | 35 ~KeychainSearch(); |
36 | 36 |
37 // Sets up a keycahin search based on an non "null" (NULL for char*, | 37 // Sets up a keycahin search based on an non "null" (NULL for char*, |
38 // The appropriate "Any" entry for other types) arguments. | 38 // The appropriate "Any" entry for other types) arguments. |
39 // | 39 // |
40 // IMPORTANT: Any paramaters passed in *must* remain valid for as long as the | 40 // IMPORTANT: Any paramaters passed in *must* remain valid for as long as the |
41 // KeychainSearch object, since the search uses them by reference. | 41 // KeychainSearch object, since the search uses them by reference. |
42 void Init(const char* server, const UInt32& port, | 42 void Init(const char* server, const UInt32& port, |
43 const SecProtocolType& protocol, | 43 const SecProtocolType& protocol, |
44 const SecAuthenticationType& auth_type, const char* security_domain, | 44 const SecAuthenticationType& auth_type, const char* security_domain, |
45 const char* path, const char* username, OSType creator); | 45 const char* path, const char* username, OSType creator); |
46 | 46 |
47 // Fills |items| with all Keychain items that match the Init'd search. | 47 // Fills |items| with all Keychain items that match the Init'd search. |
48 // If the search fails for any reason, |items| will be unchanged. | 48 // If the search fails for any reason, |items| will be unchanged. |
49 void FindMatchingItems(std::vector<SecKeychainItemRef>* matches); | 49 void FindMatchingItems(std::vector<SecKeychainItemRef>* matches); |
50 | 50 |
51 private: | 51 private: |
52 const MacKeychain* keychain_; | 52 const AppleKeychain* keychain_; |
53 SecKeychainAttributeList search_attributes_; | 53 SecKeychainAttributeList search_attributes_; |
54 SecKeychainSearchRef search_ref_; | 54 SecKeychainSearchRef search_ref_; |
55 }; | 55 }; |
56 | 56 |
57 KeychainSearch::KeychainSearch(const MacKeychain& keychain) | 57 KeychainSearch::KeychainSearch(const AppleKeychain& keychain) |
58 : keychain_(&keychain), search_ref_(NULL) { | 58 : keychain_(&keychain), search_ref_(NULL) { |
59 search_attributes_.count = 0; | 59 search_attributes_.count = 0; |
60 search_attributes_.attr = NULL; | 60 search_attributes_.attr = NULL; |
61 } | 61 } |
62 | 62 |
63 KeychainSearch::~KeychainSearch() { | 63 KeychainSearch::~KeychainSearch() { |
64 if (search_attributes_.attr) { | 64 if (search_attributes_.attr) { |
65 free(search_attributes_.attr); | 65 free(search_attributes_.attr); |
66 } | 66 } |
67 } | 67 } |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 // Returns the PasswordForm Scheme corresponding to |auth_type|. | 224 // Returns the PasswordForm Scheme corresponding to |auth_type|. |
225 PasswordForm::Scheme SchemeForAuthType(SecAuthenticationType auth_type) { | 225 PasswordForm::Scheme SchemeForAuthType(SecAuthenticationType auth_type) { |
226 switch (auth_type) { | 226 switch (auth_type) { |
227 case kSecAuthenticationTypeHTMLForm: return PasswordForm::SCHEME_HTML; | 227 case kSecAuthenticationTypeHTMLForm: return PasswordForm::SCHEME_HTML; |
228 case kSecAuthenticationTypeHTTPBasic: return PasswordForm::SCHEME_BASIC; | 228 case kSecAuthenticationTypeHTTPBasic: return PasswordForm::SCHEME_BASIC; |
229 case kSecAuthenticationTypeHTTPDigest: return PasswordForm::SCHEME_DIGEST; | 229 case kSecAuthenticationTypeHTTPDigest: return PasswordForm::SCHEME_DIGEST; |
230 default: return PasswordForm::SCHEME_OTHER; | 230 default: return PasswordForm::SCHEME_OTHER; |
231 } | 231 } |
232 } | 232 } |
233 | 233 |
234 bool FillPasswordFormFromKeychainItem(const MacKeychain& keychain, | 234 bool FillPasswordFormFromKeychainItem(const AppleKeychain& keychain, |
235 const SecKeychainItemRef& keychain_item, | 235 const SecKeychainItemRef& keychain_item, |
236 PasswordForm* form) { | 236 PasswordForm* form) { |
237 DCHECK(form); | 237 DCHECK(form); |
238 | 238 |
239 SecKeychainAttributeInfo attrInfo; | 239 SecKeychainAttributeInfo attrInfo; |
240 UInt32 tags[] = { kSecAccountItemAttr, | 240 UInt32 tags[] = { kSecAccountItemAttr, |
241 kSecServerItemAttr, | 241 kSecServerItemAttr, |
242 kSecPortItemAttr, | 242 kSecPortItemAttr, |
243 kSecPathItemAttr, | 243 kSecPathItemAttr, |
244 kSecProtocolItemAttr, | 244 kSecProtocolItemAttr, |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 // Add in the blacklist entries from the database. | 437 // Add in the blacklist entries from the database. |
438 merged_forms->insert(merged_forms->end(), | 438 merged_forms->insert(merged_forms->end(), |
439 database_blacklist_forms.begin(), | 439 database_blacklist_forms.begin(), |
440 database_blacklist_forms.end()); | 440 database_blacklist_forms.end()); |
441 | 441 |
442 // Clear out all the Keychain entries we used. | 442 // Clear out all the Keychain entries we used. |
443 DeleteVectorElementsInSet(keychain_forms, used_keychain_forms); | 443 DeleteVectorElementsInSet(keychain_forms, used_keychain_forms); |
444 } | 444 } |
445 | 445 |
446 std::vector<PasswordForm*> GetPasswordsForForms( | 446 std::vector<PasswordForm*> GetPasswordsForForms( |
447 const MacKeychain& keychain, std::vector<PasswordForm*>* database_forms) { | 447 const AppleKeychain& keychain, |
| 448 std::vector<PasswordForm*>* database_forms) { |
448 MacKeychainPasswordFormAdapter keychain_adapter(&keychain); | 449 MacKeychainPasswordFormAdapter keychain_adapter(&keychain); |
449 | 450 |
450 std::vector<PasswordForm*> merged_forms; | 451 std::vector<PasswordForm*> merged_forms; |
451 for (std::vector<PasswordForm*>::iterator i = database_forms->begin(); | 452 for (std::vector<PasswordForm*>::iterator i = database_forms->begin(); |
452 i != database_forms->end();) { | 453 i != database_forms->end();) { |
453 std::vector<PasswordForm*> db_form_container(1, *i); | 454 std::vector<PasswordForm*> db_form_container(1, *i); |
454 std::vector<PasswordForm*> keychain_matches = | 455 std::vector<PasswordForm*> keychain_matches = |
455 keychain_adapter.PasswordsMergeableWithForm(**i); | 456 keychain_adapter.PasswordsMergeableWithForm(**i); |
456 MergePasswordForms(&keychain_matches, &db_form_container, &merged_forms); | 457 MergePasswordForms(&keychain_matches, &db_form_container, &merged_forms); |
457 if (db_form_container.empty()) { | 458 if (db_form_container.empty()) { |
458 i = database_forms->erase(i); | 459 i = database_forms->erase(i); |
459 } else { | 460 } else { |
460 ++i; | 461 ++i; |
461 } | 462 } |
462 STLDeleteElements(&keychain_matches); | 463 STLDeleteElements(&keychain_matches); |
463 } | 464 } |
464 return merged_forms; | 465 return merged_forms; |
465 } | 466 } |
466 | 467 |
467 } // namespace internal_keychain_helpers | 468 } // namespace internal_keychain_helpers |
468 | 469 |
469 #pragma mark - | 470 #pragma mark - |
470 | 471 |
471 MacKeychainPasswordFormAdapter::MacKeychainPasswordFormAdapter( | 472 MacKeychainPasswordFormAdapter::MacKeychainPasswordFormAdapter( |
472 const MacKeychain* keychain) | 473 const AppleKeychain* keychain) |
473 : keychain_(keychain), finds_only_owned_(false) { | 474 : keychain_(keychain), finds_only_owned_(false) { |
474 } | 475 } |
475 | 476 |
476 std::vector<PasswordForm*> | 477 std::vector<PasswordForm*> |
477 MacKeychainPasswordFormAdapter::PasswordsFillingForm( | 478 MacKeychainPasswordFormAdapter::PasswordsFillingForm( |
478 const PasswordForm& query_form) { | 479 const PasswordForm& query_form) { |
479 std::vector<SecKeychainItemRef> keychain_items = | 480 std::vector<SecKeychainItemRef> keychain_items = |
480 MatchingKeychainItems(query_form.signon_realm, query_form.scheme, | 481 MatchingKeychainItems(query_form.signon_realm, query_form.scheme, |
481 NULL, NULL); | 482 NULL, NULL); |
482 | 483 |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
727 &attrList, 0, NULL); | 728 &attrList, 0, NULL); |
728 return result == noErr; | 729 return result == noErr; |
729 } | 730 } |
730 | 731 |
731 OSType MacKeychainPasswordFormAdapter::CreatorCodeForSearch() { | 732 OSType MacKeychainPasswordFormAdapter::CreatorCodeForSearch() { |
732 return finds_only_owned_ ? base::mac::CreatorCodeForApplication() : 0; | 733 return finds_only_owned_ ? base::mac::CreatorCodeForApplication() : 0; |
733 } | 734 } |
734 | 735 |
735 #pragma mark - | 736 #pragma mark - |
736 | 737 |
737 PasswordStoreMac::PasswordStoreMac(MacKeychain* keychain, | 738 PasswordStoreMac::PasswordStoreMac(AppleKeychain* keychain, |
738 LoginDatabase* login_db) | 739 LoginDatabase* login_db) |
739 : keychain_(keychain), login_metadata_db_(login_db) { | 740 : keychain_(keychain), login_metadata_db_(login_db) { |
740 DCHECK(keychain_.get()); | 741 DCHECK(keychain_.get()); |
741 DCHECK(login_metadata_db_.get()); | 742 DCHECK(login_metadata_db_.get()); |
742 } | 743 } |
743 | 744 |
744 PasswordStoreMac::~PasswordStoreMac() { | 745 PasswordStoreMac::~PasswordStoreMac() { |
745 if (thread_.get()) { | 746 if (thread_.get()) { |
746 thread_->message_loop()->DeleteSoon(FROM_HERE, | 747 thread_->message_loop()->DeleteSoon(FROM_HERE, |
747 notification_service_.release()); | 748 notification_service_.release()); |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1012 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); | 1013 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); |
1013 for (std::vector<PasswordForm*>::const_iterator i = forms.begin(); | 1014 for (std::vector<PasswordForm*>::const_iterator i = forms.begin(); |
1014 i != forms.end(); ++i) { | 1015 i != forms.end(); ++i) { |
1015 owned_keychain_adapter.RemovePassword(**i); | 1016 owned_keychain_adapter.RemovePassword(**i); |
1016 } | 1017 } |
1017 } | 1018 } |
1018 | 1019 |
1019 void PasswordStoreMac::CreateNotificationService() { | 1020 void PasswordStoreMac::CreateNotificationService() { |
1020 notification_service_.reset(content::NotificationService::Create()); | 1021 notification_service_.reset(content::NotificationService::Create()); |
1021 } | 1022 } |
OLD | NEW |