Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/sync/sync_setup_flow.h" | 5 #include "chrome/browser/sync/sync_setup_flow.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
| 10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 // Helper function to disable password sync. | 29 // Helper function to disable password sync. |
| 30 void DisablePasswordSync(ProfileSyncService* service) { | 30 void DisablePasswordSync(ProfileSyncService* service) { |
| 31 syncable::ModelTypeSet types; | 31 syncable::ModelTypeSet types; |
| 32 service->GetPreferredDataTypes(&types); | 32 service->GetPreferredDataTypes(&types); |
| 33 types.erase(syncable::PASSWORDS); | 33 types.erase(syncable::PASSWORDS); |
| 34 service->OnUserChoseDatatypes(false, types); | 34 service->OnUserChoseDatatypes(false, types); |
| 35 } | 35 } |
| 36 | 36 |
| 37 // Fills |args| for the enter passphrase screen. | |
| 38 void GetArgsForEnterPassphrase(bool tried_creating_explicit_passphrase, | |
| 39 bool tried_setting_explicit_passphrase, | |
| 40 DictionaryValue* args) { | |
| 41 args->SetBoolean("show_passphrase", true); | |
| 42 args->SetBoolean("passphrase_creation_rejected", | |
| 43 tried_creating_explicit_passphrase); | |
| 44 args->SetBoolean("passphrase_setting_rejected", | |
| 45 tried_setting_explicit_passphrase); | |
| 46 } | |
| 47 | |
| 48 // Returns the next step for the non-fatal error case. | 37 // Returns the next step for the non-fatal error case. |
| 49 SyncSetupWizard::State GetStepForNonFatalError(ProfileSyncService* service) { | 38 SyncSetupWizard::State GetStepForNonFatalError(ProfileSyncService* service) { |
| 50 // TODO(sync): Update this error handling to allow different platforms to | 39 // TODO(sync): Update this error handling to allow different platforms to |
| 51 // display the error appropriately (http://crbug.com/92722) instead of | 40 // display the error appropriately (http://crbug.com/92722) instead of |
| 52 // navigating to a LOGIN state that is not supported on every platform. | 41 // navigating to a LOGIN state that is not supported on every platform. |
| 53 if (service->IsPassphraseRequired()) { | 42 if (service->IsPassphraseRequired()) { |
| 54 if (service->IsUsingSecondaryPassphrase()) | 43 if (service->IsUsingSecondaryPassphrase()) |
| 55 return SyncSetupWizard::ENTER_PASSPHRASE; | 44 return SyncSetupWizard::ENTER_PASSPHRASE; |
| 56 return SyncSetupWizard::GetLoginState(); | 45 return SyncSetupWizard::GetLoginState(); |
| 57 } | 46 } |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 82 flow_handler_->SetFlow(NULL); | 71 flow_handler_->SetFlow(NULL); |
| 83 } | 72 } |
| 84 | 73 |
| 85 // static | 74 // static |
| 86 SyncSetupFlow* SyncSetupFlow::Run(ProfileSyncService* service, | 75 SyncSetupFlow* SyncSetupFlow::Run(ProfileSyncService* service, |
| 87 SyncSetupFlowContainer* container, | 76 SyncSetupFlowContainer* container, |
| 88 SyncSetupWizard::State start, | 77 SyncSetupWizard::State start, |
| 89 SyncSetupWizard::State end) { | 78 SyncSetupWizard::State end) { |
| 90 if (start == SyncSetupWizard::NONFATAL_ERROR) | 79 if (start == SyncSetupWizard::NONFATAL_ERROR) |
| 91 start = GetStepForNonFatalError(service); | 80 start = GetStepForNonFatalError(service); |
| 92 | 81 return new SyncSetupFlow(start, end, container, service); |
| 93 DictionaryValue args; | |
| 94 if (start == SyncSetupWizard::GAIA_LOGIN) | |
| 95 SyncSetupFlow::GetArgsForGaiaLogin(service, &args); | |
| 96 else if (start == SyncSetupWizard::CONFIGURE) | |
| 97 SyncSetupFlow::GetArgsForConfigure(service, &args); | |
| 98 else if (start == SyncSetupWizard::ENTER_PASSPHRASE) | |
| 99 GetArgsForEnterPassphrase(false, false, &args); | |
| 100 | |
| 101 std::string json_args; | |
| 102 base::JSONWriter::Write(&args, false, &json_args); | |
| 103 | |
| 104 return new SyncSetupFlow(start, end, json_args, container, service); | |
| 105 } | 82 } |
| 106 | 83 |
| 107 // static | 84 // static |
| 108 void SyncSetupFlow::GetArgsForGaiaLogin(const ProfileSyncService* service, | 85 void SyncSetupFlow::GetArgsForGaiaLogin(const ProfileSyncService* service, |
| 109 DictionaryValue* args) { | 86 DictionaryValue* args) { |
| 110 const GoogleServiceAuthError& error = service->GetAuthError(); | 87 const GoogleServiceAuthError& error = service->GetAuthError(); |
| 111 if (!service->last_attempted_user_email().empty()) { | 88 if (!service->last_attempted_user_email().empty()) { |
| 112 args->SetString("user", service->last_attempted_user_email()); | 89 args->SetString("user", service->last_attempted_user_email()); |
| 113 args->SetInteger("error", error.state()); | 90 args->SetInteger("error", error.state()); |
| 114 args->SetBoolean("editable_user", true); | 91 args->SetBoolean("editable_user", true); |
| 115 } else { | 92 } else { |
| 116 string16 user; | 93 string16 user; |
| 117 if (!service->cros_user().empty()) | 94 if (!service->cros_user().empty()) |
| 118 user = UTF8ToUTF16(service->cros_user()); | 95 user = UTF8ToUTF16(service->cros_user()); |
| 119 else | 96 else |
| 120 user = service->GetAuthenticatedUsername(); | 97 user = service->GetAuthenticatedUsername(); |
| 121 args->SetString("user", user); | 98 args->SetString("user", user); |
| 122 args->SetInteger("error", 0); | 99 args->SetInteger("error", 0); |
| 123 args->SetBoolean("editable_user", user.empty()); | 100 args->SetBoolean("editable_user", user.empty()); |
| 124 } | 101 } |
| 125 | 102 |
| 126 args->SetString("captchaUrl", error.captcha().image_url.spec()); | 103 args->SetString("captchaUrl", error.captcha().image_url.spec()); |
| 127 } | 104 } |
| 128 | 105 |
| 129 // static | |
| 130 void SyncSetupFlow::GetArgsForConfigure(ProfileSyncService* service, | 106 void SyncSetupFlow::GetArgsForConfigure(ProfileSyncService* service, |
| 131 DictionaryValue* args) { | 107 DictionaryValue* args) { |
| 132 // The SYNC_EVERYTHING case will set this to true. | 108 // The SYNC_EVERYTHING case will set this to true. |
| 133 args->SetBoolean("showSyncEverythingPage", false); | 109 args->SetBoolean("showSyncEverythingPage", false); |
| 134 | 110 |
| 135 args->SetBoolean("keepEverythingSynced", | 111 args->SetBoolean("keepEverythingSynced", |
| 136 service->profile()->GetPrefs()->GetBoolean(prefs::kKeepEverythingSynced)); | 112 service->profile()->GetPrefs()->GetBoolean(prefs::kKeepEverythingSynced)); |
| 137 | 113 |
| 138 // Bookmarks, Preferences, and Themes are launched for good, there's no | 114 // Bookmarks, Preferences, and Themes are launched for good, there's no |
| 139 // going back now. Check if the other data types are registered though. | 115 // going back now. Check if the other data types are registered though. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 syncable::ModelTypeSet encrypted_types; | 152 syncable::ModelTypeSet encrypted_types; |
| 177 service->GetEncryptedDataTypes(&encrypted_types); | 153 service->GetEncryptedDataTypes(&encrypted_types); |
| 178 bool encrypt_all = | 154 bool encrypt_all = |
| 179 encrypted_types.upper_bound(syncable::PASSWORDS) != encrypted_types.end(); | 155 encrypted_types.upper_bound(syncable::PASSWORDS) != encrypted_types.end(); |
| 180 if (service->HasPendingEncryptedTypes()) | 156 if (service->HasPendingEncryptedTypes()) |
| 181 encrypt_all = true; | 157 encrypt_all = true; |
| 182 args->SetBoolean("encryptAllData", encrypt_all); | 158 args->SetBoolean("encryptAllData", encrypt_all); |
| 183 | 159 |
| 184 // Load the parameters for the encryption tab. | 160 // Load the parameters for the encryption tab. |
| 185 args->SetBoolean("usePassphrase", service->IsUsingSecondaryPassphrase()); | 161 args->SetBoolean("usePassphrase", service->IsUsingSecondaryPassphrase()); |
| 162 | |
| 163 // Determine if we need a passphrase or not, and if so, prompt the user. | |
| 164 if (service->IsPassphraseRequiredForDecryption() && | |
| 165 (service->IsUsingSecondaryPassphrase() || cached_passphrase_.empty())) { | |
| 166 // We need a passphrase, and either it's an explicit passphrase, or we | |
| 167 // don't have a cached gaia passphrase, so we have to prompt the user. | |
| 168 args->SetBoolean("show_passphrase", true); | |
| 169 } | |
| 170 args->SetBoolean("passphrase_creation_rejected", | |
| 171 tried_creating_explicit_passphrase_); | |
| 172 args->SetBoolean("passphrase_setting_rejected", | |
| 173 tried_setting_explicit_passphrase_); | |
| 186 } | 174 } |
| 187 | 175 |
| 188 bool SyncSetupFlow::AttachSyncSetupHandler(SyncSetupFlowHandler* handler) { | 176 bool SyncSetupFlow::AttachSyncSetupHandler(SyncSetupFlowHandler* handler) { |
| 189 if (flow_handler_) | 177 if (flow_handler_) |
| 190 return false; | 178 return false; |
| 191 | 179 |
| 192 flow_handler_ = handler; | 180 flow_handler_ = handler; |
| 193 handler->SetFlow(this); | 181 handler->SetFlow(this); |
| 194 ActivateState(current_state_); | 182 ActivateState(current_state_); |
| 195 return true; | 183 return true; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 } | 245 } |
| 258 | 246 |
| 259 service_->OnUserCancelledDialog(); | 247 service_->OnUserCancelledDialog(); |
| 260 delete this; | 248 delete this; |
| 261 } | 249 } |
| 262 | 250 |
| 263 void SyncSetupFlow::OnUserSubmittedAuth(const std::string& username, | 251 void SyncSetupFlow::OnUserSubmittedAuth(const std::string& username, |
| 264 const std::string& password, | 252 const std::string& password, |
| 265 const std::string& captcha, | 253 const std::string& captcha, |
| 266 const std::string& access_code) { | 254 const std::string& access_code) { |
| 255 cached_passphrase_ = password; | |
| 267 service_->OnUserSubmittedAuth(username, password, captcha, access_code); | 256 service_->OnUserSubmittedAuth(username, password, captcha, access_code); |
| 268 } | 257 } |
| 269 | 258 |
| 270 void SyncSetupFlow::OnUserConfigured(const SyncConfiguration& configuration) { | 259 void SyncSetupFlow::OnUserConfigured(const SyncConfiguration& configuration) { |
| 271 // Go to the "loading..." screen. | 260 // Go to the "loading..." screen. |
| 272 Advance(SyncSetupWizard::SETTING_UP); | 261 Advance(SyncSetupWizard::SETTING_UP); |
| 273 | 262 |
| 274 // Note: encryption will not occur until OnUserChoseDatatypes is called. | 263 // Note: encryption will not occur until OnUserChoseDatatypes is called. |
| 275 syncable::ModelTypeSet encrypted_types; | 264 syncable::ModelTypeSet encrypted_types; |
| 276 if (configuration.encrypt_all) { | 265 if (configuration.encrypt_all) { |
| 277 // Encrypt all registered types. | 266 // Encrypt all registered types. |
| 278 service_->GetRegisteredDataTypes(&encrypted_types); | 267 service_->GetRegisteredDataTypes(&encrypted_types); |
| 279 } // Else we clear the pending types for encryption. | 268 } // Else we clear the pending types for encryption. |
| 280 service_->set_pending_types_for_encryption(encrypted_types); | 269 service_->set_pending_types_for_encryption(encrypted_types); |
| 281 | 270 |
| 282 if (!configuration.gaia_passphrase.empty()) { | 271 if (!configuration.gaia_passphrase.empty()) { |
| 283 // Caller passed a gaia passphrase. This is illegal if we are currently | 272 // Caller passed a gaia passphrase. This is illegal if we are currently |
| 284 // using a secondary passphrase. | 273 // using a secondary passphrase. |
| 285 DCHECK(!service_->IsUsingSecondaryPassphrase()); | 274 DCHECK(!service_->IsUsingSecondaryPassphrase()); |
| 286 service_->SetPassphrase(configuration.gaia_passphrase, false, false); | 275 service_->SetPassphrase(configuration.gaia_passphrase, false); |
| 276 } else if (!service_->IsUsingSecondaryPassphrase() && | |
| 277 !cached_passphrase_.empty()) { | |
| 278 // Service needs a GAIA passphrase and we have one cached, so try it. | |
| 279 service_->SetPassphrase(cached_passphrase_, false); | |
| 280 cached_passphrase_.clear(); | |
| 281 } else { | |
| 282 // No gaia passphrase cached or set, so make sure the ProfileSyncService | |
| 283 // wasn't expecting one. | |
| 284 DCHECK(!service_->IsPassphraseRequiredForDecryption() || | |
| 285 service_->IsUsingSecondaryPassphrase()); | |
| 287 } | 286 } |
| 288 | 287 |
| 289 // It's possible the user has to provide a secondary passphrase even when | 288 // It's possible the user has to provide a secondary passphrase even when |
| 290 // they have not set one previously. This occurs when the user has changed | 289 // they have not set one previously. This occurs when the user has changed |
| 291 // their gaia password and then sign in to a new machine for the first time. | 290 // their gaia password and then sign in to a new machine for the first time. |
| 292 // The new machine will download data encrypted with their old gaia password, | 291 // The new machine will download data encrypted with their old gaia password, |
| 293 // which their current gaia password will not be able to decrypt, triggering | 292 // which their current gaia password will not be able to decrypt, triggering |
| 294 // a prompt for a passphrase. At this point, the user must enter their old | 293 // a prompt for a passphrase. At this point, the user must enter their old |
| 295 // password, which we store as a new secondary passphrase. | 294 // password, which we store as a new secondary passphrase. |
| 296 // TODO(zea): eventually use the above gaia_passphrase instead of the | 295 // TODO(zea): eventually use the above gaia_passphrase instead of the |
| 297 // secondary passphrase in this case. | 296 // secondary passphrase in this case. |
| 298 if (configuration.use_secondary_passphrase) { | 297 if (configuration.use_secondary_passphrase) { |
| 299 if (!service_->IsUsingSecondaryPassphrase()) { | 298 service_->SetPassphrase(configuration.secondary_passphrase, true); |
| 300 service_->SetPassphrase(configuration.secondary_passphrase, true, true); | 299 tried_creating_explicit_passphrase_ = true; |
| 301 tried_creating_explicit_passphrase_ = true; | |
| 302 } else { | |
| 303 service_->SetPassphrase(configuration.secondary_passphrase, true, false); | |
| 304 tried_setting_explicit_passphrase_ = true; | |
| 305 } | |
| 306 } | 300 } |
| 307 | 301 |
| 308 service_->OnUserChoseDatatypes(configuration.sync_everything, | 302 service_->OnUserChoseDatatypes(configuration.sync_everything, |
| 309 configuration.data_types); | 303 configuration.data_types); |
| 310 } | 304 } |
| 311 | 305 |
| 312 void SyncSetupFlow::OnPassphraseEntry(const std::string& passphrase) { | 306 void SyncSetupFlow::OnPassphraseEntry(const std::string& passphrase) { |
| 313 Advance(SyncSetupWizard::SETTING_UP); | 307 Advance(SyncSetupWizard::SETTING_UP); |
| 314 service_->SetPassphrase(passphrase, true, false); | 308 service_->SetPassphrase(passphrase, true); |
| 315 tried_setting_explicit_passphrase_ = true; | 309 tried_setting_explicit_passphrase_ = true; |
| 316 } | 310 } |
| 317 | 311 |
| 318 void SyncSetupFlow::OnPassphraseCancel() { | 312 void SyncSetupFlow::OnPassphraseCancel() { |
| 319 // If the user cancels when being asked for the passphrase, | 313 // If the user cancels when being asked for the passphrase, |
| 320 // just disable encrypted sync and continue setting up. | 314 // just disable encrypted sync and continue setting up. |
| 321 if (current_state_ == SyncSetupWizard::ENTER_PASSPHRASE) | 315 if (current_state_ == SyncSetupWizard::ENTER_PASSPHRASE) |
| 322 DisablePasswordSync(service_); | 316 DisablePasswordSync(service_); |
| 323 | 317 |
| 324 Advance(SyncSetupWizard::SETTING_UP); | 318 Advance(SyncSetupWizard::SETTING_UP); |
| 325 } | 319 } |
| 326 | 320 |
| 327 // Use static Run method to get an instance. | 321 // Use static Run method to get an instance. |
| 328 SyncSetupFlow::SyncSetupFlow(SyncSetupWizard::State start_state, | 322 SyncSetupFlow::SyncSetupFlow(SyncSetupWizard::State start_state, |
| 329 SyncSetupWizard::State end_state, | 323 SyncSetupWizard::State end_state, |
| 330 const std::string& args, | |
| 331 SyncSetupFlowContainer* container, | 324 SyncSetupFlowContainer* container, |
| 332 ProfileSyncService* service) | 325 ProfileSyncService* service) |
| 333 : container_(container), | 326 : container_(container), |
| 334 dialog_start_args_(args), | |
| 335 current_state_(start_state), | 327 current_state_(start_state), |
| 336 end_state_(end_state), | 328 end_state_(end_state), |
| 337 login_start_time_(base::TimeTicks::Now()), | 329 login_start_time_(base::TimeTicks::Now()), |
| 338 flow_handler_(NULL), | 330 flow_handler_(NULL), |
| 339 service_(service), | 331 service_(service), |
| 340 tried_creating_explicit_passphrase_(false), | 332 tried_creating_explicit_passphrase_(false), |
| 341 tried_setting_explicit_passphrase_(false) { | 333 tried_setting_explicit_passphrase_(false) { |
| 342 } | 334 } |
| 343 | 335 |
| 344 // Returns true if the flow should advance to |state| based on |current_state_|. | 336 // Returns true if the flow should advance to |state| based on |current_state_|. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 415 } | 407 } |
| 416 case SyncSetupWizard::CONFIGURE: { | 408 case SyncSetupWizard::CONFIGURE: { |
| 417 DictionaryValue args; | 409 DictionaryValue args; |
| 418 SyncSetupFlow::GetArgsForConfigure(service_, &args); | 410 SyncSetupFlow::GetArgsForConfigure(service_, &args); |
| 419 flow_handler_->ShowConfigure(args); | 411 flow_handler_->ShowConfigure(args); |
| 420 break; | 412 break; |
| 421 } | 413 } |
| 422 case SyncSetupWizard::ENTER_PASSPHRASE: { | 414 case SyncSetupWizard::ENTER_PASSPHRASE: { |
| 423 DictionaryValue args; | 415 DictionaryValue args; |
| 424 SyncSetupFlow::GetArgsForConfigure(service_, &args); | 416 SyncSetupFlow::GetArgsForConfigure(service_, &args); |
| 425 GetArgsForEnterPassphrase(tried_creating_explicit_passphrase_, | 417 GetArgsForConfigure(service_, &args); |
| 426 tried_setting_explicit_passphrase_, | 418 // TODO(atwilson): Remove ShowPassphraseEntry (use ShowConfigure()). |
|
Rick Campbell
2011/09/02 18:31:29
Bug number?
Andrew T Wilson (Slow)
2011/09/02 21:40:46
Done.
| |
| 427 &args); | |
| 428 flow_handler_->ShowPassphraseEntry(args); | 419 flow_handler_->ShowPassphraseEntry(args); |
| 429 break; | 420 break; |
| 430 } | 421 } |
| 431 case SyncSetupWizard::SETUP_ABORTED_BY_PENDING_CLEAR: { | 422 case SyncSetupWizard::SETUP_ABORTED_BY_PENDING_CLEAR: { |
| 432 DictionaryValue args; | 423 DictionaryValue args; |
| 433 SyncSetupFlow::GetArgsForConfigure(service_, &args); | 424 SyncSetupFlow::GetArgsForConfigure(service_, &args); |
| 434 args.SetBoolean("was_aborted", true); | 425 args.SetBoolean("was_aborted", true); |
| 435 flow_handler_->ShowConfigure(args); | 426 flow_handler_->ShowConfigure(args); |
| 436 break; | 427 break; |
| 437 } | 428 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 450 break; | 441 break; |
| 451 } | 442 } |
| 452 case SyncSetupWizard::DONE: | 443 case SyncSetupWizard::DONE: |
| 453 flow_handler_->ShowSetupDone( | 444 flow_handler_->ShowSetupDone( |
| 454 UTF16ToWide(service_->GetAuthenticatedUsername())); | 445 UTF16ToWide(service_->GetAuthenticatedUsername())); |
| 455 break; | 446 break; |
| 456 default: | 447 default: |
| 457 NOTREACHED() << "Invalid advance state: " << state; | 448 NOTREACHED() << "Invalid advance state: " << state; |
| 458 } | 449 } |
| 459 } | 450 } |
| OLD | NEW |