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

Side by Side Diff: chrome/browser/sync/sync_setup_flow.cc

Issue 7792093: Moved the handling of the initial passphrase into SyncSetupFlow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Painful merge after phajdan's last-minute huge bulk file move. Created 9 years, 3 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 | Annotate | Revision Log
OLDNEW
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
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
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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 syncable::ModelTypeSet encrypted_types; 156 syncable::ModelTypeSet encrypted_types;
181 service->GetEncryptedDataTypes(&encrypted_types); 157 service->GetEncryptedDataTypes(&encrypted_types);
182 bool encrypt_all = 158 bool encrypt_all =
183 encrypted_types.upper_bound(syncable::PASSWORDS) != encrypted_types.end(); 159 encrypted_types.upper_bound(syncable::PASSWORDS) != encrypted_types.end();
184 if (service->HasPendingEncryptedTypes()) 160 if (service->HasPendingEncryptedTypes())
185 encrypt_all = true; 161 encrypt_all = true;
186 args->SetBoolean("encryptAllData", encrypt_all); 162 args->SetBoolean("encryptAllData", encrypt_all);
187 163
188 // Load the parameters for the encryption tab. 164 // Load the parameters for the encryption tab.
189 args->SetBoolean("usePassphrase", service->IsUsingSecondaryPassphrase()); 165 args->SetBoolean("usePassphrase", service->IsUsingSecondaryPassphrase());
166
167 // Determine if we need a passphrase or not, and if so, prompt the user.
168 if (service->IsPassphraseRequiredForDecryption() &&
169 (service->IsUsingSecondaryPassphrase() || cached_passphrase_.empty())) {
170 // We need a passphrase, and either it's an explicit passphrase, or we
171 // don't have a cached gaia passphrase, so we have to prompt the user.
172 args->SetBoolean("show_passphrase", true);
173 }
174 args->SetBoolean("passphrase_creation_rejected",
175 tried_creating_explicit_passphrase_);
176 args->SetBoolean("passphrase_setting_rejected",
177 tried_setting_explicit_passphrase_);
190 } 178 }
191 179
192 bool SyncSetupFlow::AttachSyncSetupHandler(SyncSetupFlowHandler* handler) { 180 bool SyncSetupFlow::AttachSyncSetupHandler(SyncSetupFlowHandler* handler) {
193 if (flow_handler_) 181 if (flow_handler_)
194 return false; 182 return false;
195 183
196 flow_handler_ = handler; 184 flow_handler_ = handler;
197 handler->SetFlow(this); 185 handler->SetFlow(this);
198 ActivateState(current_state_); 186 ActivateState(current_state_);
199 return true; 187 return true;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 249 }
262 250
263 service_->OnUserCancelledDialog(); 251 service_->OnUserCancelledDialog();
264 delete this; 252 delete this;
265 } 253 }
266 254
267 void SyncSetupFlow::OnUserSubmittedAuth(const std::string& username, 255 void SyncSetupFlow::OnUserSubmittedAuth(const std::string& username,
268 const std::string& password, 256 const std::string& password,
269 const std::string& captcha, 257 const std::string& captcha,
270 const std::string& access_code) { 258 const std::string& access_code) {
259 cached_passphrase_ = password;
271 service_->OnUserSubmittedAuth(username, password, captcha, access_code); 260 service_->OnUserSubmittedAuth(username, password, captcha, access_code);
272 } 261 }
273 262
274 void SyncSetupFlow::OnUserConfigured(const SyncConfiguration& configuration) { 263 void SyncSetupFlow::OnUserConfigured(const SyncConfiguration& configuration) {
275 // Go to the "loading..." screen. 264 // Go to the "loading..." screen.
276 Advance(SyncSetupWizard::SETTING_UP); 265 Advance(SyncSetupWizard::SETTING_UP);
277 266
278 // Note: encryption will not occur until OnUserChoseDatatypes is called. 267 // Note: encryption will not occur until OnUserChoseDatatypes is called.
279 syncable::ModelTypeSet encrypted_types; 268 syncable::ModelTypeSet encrypted_types;
280 if (configuration.encrypt_all) { 269 if (configuration.encrypt_all) {
281 // Encrypt all registered types. 270 // Encrypt all registered types.
282 service_->GetRegisteredDataTypes(&encrypted_types); 271 service_->GetRegisteredDataTypes(&encrypted_types);
283 } // Else we clear the pending types for encryption. 272 } // Else we clear the pending types for encryption.
284 service_->set_pending_types_for_encryption(encrypted_types); 273 service_->set_pending_types_for_encryption(encrypted_types);
285 274
286 if (!configuration.gaia_passphrase.empty()) { 275 if (!configuration.gaia_passphrase.empty()) {
287 // Caller passed a gaia passphrase. This is illegal if we are currently 276 // Caller passed a gaia passphrase. This is illegal if we are currently
288 // using a secondary passphrase. 277 // using a secondary passphrase.
289 DCHECK(!service_->IsUsingSecondaryPassphrase()); 278 DCHECK(!service_->IsUsingSecondaryPassphrase());
290 service_->SetPassphrase(configuration.gaia_passphrase, false, false); 279 service_->SetPassphrase(configuration.gaia_passphrase, false);
280 } else if (!service_->IsUsingSecondaryPassphrase() &&
281 !cached_passphrase_.empty()) {
282 // Service needs a GAIA passphrase and we have one cached, so try it.
283 service_->SetPassphrase(cached_passphrase_, false);
284 cached_passphrase_.clear();
285 } else {
286 // No gaia passphrase cached or set, so make sure the ProfileSyncService
287 // wasn't expecting one.
288 DCHECK(!service_->IsPassphraseRequiredForDecryption() ||
289 service_->IsUsingSecondaryPassphrase());
291 } 290 }
292 291
293 // It's possible the user has to provide a secondary passphrase even when 292 // It's possible the user has to provide a secondary passphrase even when
294 // they have not set one previously. This occurs when the user has changed 293 // they have not set one previously. This occurs when the user has changed
295 // their gaia password and then sign in to a new machine for the first time. 294 // their gaia password and then sign in to a new machine for the first time.
296 // The new machine will download data encrypted with their old gaia password, 295 // The new machine will download data encrypted with their old gaia password,
297 // which their current gaia password will not be able to decrypt, triggering 296 // which their current gaia password will not be able to decrypt, triggering
298 // a prompt for a passphrase. At this point, the user must enter their old 297 // a prompt for a passphrase. At this point, the user must enter their old
299 // password, which we store as a new secondary passphrase. 298 // password, which we store as a new secondary passphrase.
300 // TODO(zea): eventually use the above gaia_passphrase instead of the 299 // TODO(zea): eventually use the above gaia_passphrase instead of the
301 // secondary passphrase in this case. 300 // secondary passphrase in this case.
302 if (configuration.use_secondary_passphrase) { 301 if (configuration.use_secondary_passphrase) {
303 if (!service_->IsUsingSecondaryPassphrase()) { 302 service_->SetPassphrase(configuration.secondary_passphrase, true);
304 service_->SetPassphrase(configuration.secondary_passphrase, true, true); 303 if (service_->IsUsingSecondaryPassphrase())
304 tried_setting_explicit_passphrase_ = true;
305 else
305 tried_creating_explicit_passphrase_ = true; 306 tried_creating_explicit_passphrase_ = true;
306 } else {
307 service_->SetPassphrase(configuration.secondary_passphrase, true, false);
308 tried_setting_explicit_passphrase_ = true;
309 }
310 } 307 }
311 308
312 service_->OnUserChoseDatatypes(configuration.sync_everything, 309 service_->OnUserChoseDatatypes(configuration.sync_everything,
313 configuration.data_types); 310 configuration.data_types);
314 } 311 }
315 312
316 void SyncSetupFlow::OnPassphraseEntry(const std::string& passphrase) { 313 void SyncSetupFlow::OnPassphraseEntry(const std::string& passphrase) {
317 Advance(SyncSetupWizard::SETTING_UP); 314 Advance(SyncSetupWizard::SETTING_UP);
318 service_->SetPassphrase(passphrase, true, false); 315 service_->SetPassphrase(passphrase, true);
319 tried_setting_explicit_passphrase_ = true; 316 tried_setting_explicit_passphrase_ = true;
320 } 317 }
321 318
322 void SyncSetupFlow::OnPassphraseCancel() { 319 void SyncSetupFlow::OnPassphraseCancel() {
323 // If the user cancels when being asked for the passphrase, 320 // If the user cancels when being asked for the passphrase,
324 // just disable encrypted sync and continue setting up. 321 // just disable encrypted sync and continue setting up.
325 if (current_state_ == SyncSetupWizard::ENTER_PASSPHRASE) 322 if (current_state_ == SyncSetupWizard::ENTER_PASSPHRASE)
326 DisablePasswordSync(service_); 323 DisablePasswordSync(service_);
327 324
328 Advance(SyncSetupWizard::SETTING_UP); 325 Advance(SyncSetupWizard::SETTING_UP);
329 } 326 }
330 327
331 // Use static Run method to get an instance. 328 // Use static Run method to get an instance.
332 SyncSetupFlow::SyncSetupFlow(SyncSetupWizard::State start_state, 329 SyncSetupFlow::SyncSetupFlow(SyncSetupWizard::State start_state,
333 SyncSetupWizard::State end_state, 330 SyncSetupWizard::State end_state,
334 const std::string& args,
335 SyncSetupFlowContainer* container, 331 SyncSetupFlowContainer* container,
336 ProfileSyncService* service) 332 ProfileSyncService* service)
337 : container_(container), 333 : container_(container),
338 dialog_start_args_(args),
339 current_state_(start_state), 334 current_state_(start_state),
340 end_state_(end_state), 335 end_state_(end_state),
341 login_start_time_(base::TimeTicks::Now()), 336 login_start_time_(base::TimeTicks::Now()),
342 flow_handler_(NULL), 337 flow_handler_(NULL),
343 service_(service), 338 service_(service),
344 tried_creating_explicit_passphrase_(false), 339 tried_creating_explicit_passphrase_(false),
345 tried_setting_explicit_passphrase_(false) { 340 tried_setting_explicit_passphrase_(false) {
346 } 341 }
347 342
348 // Returns true if the flow should advance to |state| based on |current_state_|. 343 // 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
419 } 414 }
420 case SyncSetupWizard::CONFIGURE: { 415 case SyncSetupWizard::CONFIGURE: {
421 DictionaryValue args; 416 DictionaryValue args;
422 SyncSetupFlow::GetArgsForConfigure(service_, &args); 417 SyncSetupFlow::GetArgsForConfigure(service_, &args);
423 flow_handler_->ShowConfigure(args); 418 flow_handler_->ShowConfigure(args);
424 break; 419 break;
425 } 420 }
426 case SyncSetupWizard::ENTER_PASSPHRASE: { 421 case SyncSetupWizard::ENTER_PASSPHRASE: {
427 DictionaryValue args; 422 DictionaryValue args;
428 SyncSetupFlow::GetArgsForConfigure(service_, &args); 423 SyncSetupFlow::GetArgsForConfigure(service_, &args);
429 GetArgsForEnterPassphrase(tried_creating_explicit_passphrase_, 424 GetArgsForConfigure(service_, &args);
430 tried_setting_explicit_passphrase_, 425 // TODO(atwilson): Remove ShowPassphraseEntry in favor of using
431 &args); 426 // ShowConfigure() - http://crbug.com/90786.
432 flow_handler_->ShowPassphraseEntry(args); 427 flow_handler_->ShowPassphraseEntry(args);
433 break; 428 break;
434 } 429 }
435 case SyncSetupWizard::SETUP_ABORTED_BY_PENDING_CLEAR: { 430 case SyncSetupWizard::SETUP_ABORTED_BY_PENDING_CLEAR: {
436 DictionaryValue args; 431 DictionaryValue args;
437 SyncSetupFlow::GetArgsForConfigure(service_, &args); 432 SyncSetupFlow::GetArgsForConfigure(service_, &args);
438 args.SetBoolean("was_aborted", true); 433 args.SetBoolean("was_aborted", true);
439 flow_handler_->ShowConfigure(args); 434 flow_handler_->ShowConfigure(args);
440 break; 435 break;
441 } 436 }
(...skipping 12 matching lines...) Expand all
454 break; 449 break;
455 } 450 }
456 case SyncSetupWizard::DONE: 451 case SyncSetupWizard::DONE:
457 flow_handler_->ShowSetupDone( 452 flow_handler_->ShowSetupDone(
458 UTF16ToWide(service_->GetAuthenticatedUsername())); 453 UTF16ToWide(service_->GetAuthenticatedUsername()));
459 break; 454 break;
460 default: 455 default:
461 NOTREACHED() << "Invalid advance state: " << state; 456 NOTREACHED() << "Invalid advance state: " << state;
462 } 457 }
463 } 458 }
OLDNEW
« no previous file with comments | « chrome/browser/sync/sync_setup_flow.h ('k') | chrome/browser/sync/sync_setup_wizard_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698