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/native_backend_kwallet_x.h" | 5 #include "chrome/browser/password_manager/native_backend_kwallet_x.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 << ") with native architecture size; will try alternate " | 95 << ") with native architecture size; will try alternate " |
96 << "size."; | 96 << "size."; |
97 } else { | 97 } else { |
98 LOG(ERROR) << "Failed to deserialize version " << version | 98 LOG(ERROR) << "Failed to deserialize version " << version |
99 << " KWallet entry (realm: " << signon_realm << ")"; | 99 << " KWallet entry (realm: " << signon_realm << ")"; |
100 } | 100 } |
101 } | 101 } |
102 | 102 |
103 } // namespace | 103 } // namespace |
104 | 104 |
105 NativeBackendKWallet::NativeBackendKWallet(LocalProfileId id, | 105 NativeBackendKWallet::NativeBackendKWallet(LocalProfileId id) |
106 PrefService* prefs) | |
107 : profile_id_(id), | 106 : profile_id_(id), |
108 prefs_(prefs), | |
109 kwallet_proxy_(NULL), | 107 kwallet_proxy_(NULL), |
110 app_name_(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)) { | 108 app_name_(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)) { |
111 // TODO(mdm): after a few more releases, remove the code which is now dead due | 109 folder_name_ = GetProfileSpecificFolderName(); |
112 // to the true || here, and simplify this code. We don't do it yet to make it | |
113 // easier to revert if necessary. | |
114 if (true || PasswordStoreX::PasswordsUseLocalProfileId(prefs)) { | |
115 folder_name_ = GetProfileSpecificFolderName(); | |
116 // We already did the migration previously. Don't try again. | |
117 migrate_tried_ = true; | |
118 } else { | |
119 folder_name_ = kKWalletFolder; | |
120 migrate_tried_ = false; | |
121 } | |
122 } | 110 } |
123 | 111 |
124 NativeBackendKWallet::~NativeBackendKWallet() { | 112 NativeBackendKWallet::~NativeBackendKWallet() { |
125 // This destructor is called on the thread that is destroying the Profile | 113 // This destructor is called on the thread that is destroying the Profile |
126 // containing the PasswordStore that owns this NativeBackend. Generally that | 114 // containing the PasswordStore that owns this NativeBackend. Generally that |
127 // won't be the DB thread; it will be the UI thread. So we post a message to | 115 // won't be the DB thread; it will be the UI thread. So we post a message to |
128 // shut it down on the DB thread, and it will be destructed afterward when the | 116 // shut it down on the DB thread, and it will be destructed afterward when the |
129 // scoped_refptr<dbus::Bus> goes out of scope. The NativeBackend will be | 117 // scoped_refptr<dbus::Bus> goes out of scope. The NativeBackend will be |
130 // destroyed before that occurs, but that's OK. | 118 // destroyed before that occurs, but that's OK. |
131 if (session_bus_.get()) { | 119 if (session_bus_.get()) { |
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 LOG(ERROR) << "Error reading response from kwalletd (createFolder): " | 907 LOG(ERROR) << "Error reading response from kwalletd (createFolder): " |
920 << response->ToString(); | 908 << response->ToString(); |
921 return kInvalidKWalletHandle; | 909 return kInvalidKWalletHandle; |
922 } | 910 } |
923 if (!success) { | 911 if (!success) { |
924 LOG(ERROR) << "Error creating KWallet folder"; | 912 LOG(ERROR) << "Error creating KWallet folder"; |
925 return kInvalidKWalletHandle; | 913 return kInvalidKWalletHandle; |
926 } | 914 } |
927 } | 915 } |
928 | 916 |
929 // Successful initialization. Try migration if necessary. | |
930 if (!migrate_tried_) | |
931 MigrateToProfileSpecificLogins(); | |
932 | |
933 return handle; | 917 return handle; |
934 } | 918 } |
935 | 919 |
936 std::string NativeBackendKWallet::GetProfileSpecificFolderName() const { | 920 std::string NativeBackendKWallet::GetProfileSpecificFolderName() const { |
937 // Originally, the folder name was always just "Chrome Form Data". | 921 // Originally, the folder name was always just "Chrome Form Data". |
938 // Now we use it to distinguish passwords for different profiles. | 922 // Now we use it to distinguish passwords for different profiles. |
939 return base::StringPrintf("%s (%d)", kKWalletFolder, profile_id_); | 923 return base::StringPrintf("%s (%d)", kKWalletFolder, profile_id_); |
940 } | 924 } |
941 | |
942 void NativeBackendKWallet::MigrateToProfileSpecificLogins() { | |
943 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | |
944 | |
945 DCHECK(!migrate_tried_); | |
946 DCHECK_EQ(folder_name_, kKWalletFolder); | |
947 | |
948 // Record the fact that we've attempted migration already right away, so that | |
949 // we don't get recursive calls back to MigrateToProfileSpecificLogins(). | |
950 migrate_tried_ = true; | |
951 | |
952 // First get all the logins, using the old folder name. | |
953 int wallet_handle = WalletHandle(); | |
954 if (wallet_handle == kInvalidKWalletHandle) | |
955 return; | |
956 PasswordFormList forms; | |
957 if (!GetAllLogins(&forms, wallet_handle)) | |
958 return; | |
959 | |
960 // Now switch to a profile-specific folder name. | |
961 folder_name_ = GetProfileSpecificFolderName(); | |
962 | |
963 // Try to add all the logins with the new folder name. | |
964 // This could be done more efficiently by grouping by signon realm and using | |
965 // SetLoginsList(), but we do this for simplicity since it is only done once. | |
966 // Note, however, that we do need another call to WalletHandle() to create | |
967 // this folder if necessary. | |
968 bool ok = true; | |
969 for (size_t i = 0; i < forms.size(); ++i) { | |
970 if (!AddLogin(*forms[i])) | |
971 ok = false; | |
972 delete forms[i]; | |
973 } | |
974 if (forms.empty()) { | |
975 // If there were no logins to migrate, we do an extra call to WalletHandle() | |
976 // for its side effect of attempting to create the profile-specific folder. | |
977 // This is not strictly necessary, but it's safe and helps in testing. | |
978 wallet_handle = WalletHandle(); | |
979 if (wallet_handle == kInvalidKWalletHandle) | |
980 ok = false; | |
981 } | |
982 | |
983 if (ok) { | |
984 // All good! Keep the new app string and set a persistent pref. | |
985 // NOTE: We explicitly don't delete the old passwords yet. They are | |
986 // potentially shared with other profiles and other user data dirs! | |
987 // Each other profile must be able to migrate the shared data as well, | |
988 // so we must leave it alone. After a few releases, we'll add code to | |
989 // delete them, and eventually remove this migration code. | |
990 // TODO(mdm): follow through with the plan above. | |
991 PasswordStoreX::SetPasswordsUseLocalProfileId(prefs_); | |
992 } else { | |
993 // We failed to migrate for some reason. Use the old folder name. | |
994 folder_name_ = kKWalletFolder; | |
995 } | |
996 } | |
OLD | NEW |