1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_LOGIN_STATUS_CONSUMER_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_LOGIN_LOGIN_STATUS_CONSUMER_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/logging.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/gaia/gaia_auth_consumer.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/net/gaia/google_service_auth_error.h" 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/net_errors.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos { 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass LoginFailure { 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick enum FailureReason { 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NONE, 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick COULD_NOT_MOUNT_CRYPTOHOME, 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick COULD_NOT_MOUNT_TMPFS, 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick COULD_NOT_UNMOUNT_CRYPTOHOME, 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DATA_REMOVAL_FAILED, // Could not destroy your old data 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LOGIN_TIMED_OUT, 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UNLOCK_FAILED, 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NETWORK_AUTH_FAILED, // Could not authenticate against Google 2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NUM_FAILURE_REASONS, // This has to be the last item. 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick explicit LoginFailure(FailureReason reason) 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : reason_(reason), 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick error_(GoogleServiceAuthError::NONE) { 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(reason != NETWORK_AUTH_FAILED); 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick inline bool operator==(const LoginFailure &b) const { 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (reason_ != b.reason_) { 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (reason_ == NETWORK_AUTH_FAILED) { 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return error_ == b.error_; 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static LoginFailure FromNetworkAuthFailure( 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GoogleServiceAuthError& error) { 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return LoginFailure(NETWORK_AUTH_FAILED, error); 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static LoginFailure None() { 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return LoginFailure(NONE); 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string GetErrorString() const { 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick switch (reason_) { 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case DATA_REMOVAL_FAILED: 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return "Could not destroy your old data."; 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case COULD_NOT_MOUNT_CRYPTOHOME: 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return "Could not mount cryptohome."; 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case COULD_NOT_UNMOUNT_CRYPTOHOME: 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return "Could not mount cryptohome."; 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case COULD_NOT_MOUNT_TMPFS: 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return "Could not mount tmpfs."; 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case LOGIN_TIMED_OUT: 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return "Login timed out. Please try again."; 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case UNLOCK_FAILED: 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return "Unlock failed."; 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick case NETWORK_AUTH_FAILED: 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (error_.state() == GoogleServiceAuthError::CONNECTION_FAILED) { 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return net::ErrorToString(error_.network_error()); 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return "Google authentication failed."; 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick default: 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED(); 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return std::string(); 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GoogleServiceAuthError& error() const { return error_; } 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const FailureReason& reason() const { return reason_; } 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LoginFailure(FailureReason reason, GoogleServiceAuthError error) 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : reason_(reason), 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick error_(error) { 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick FailureReason reason_; 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GoogleServiceAuthError error_; 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An interface that defines the callbacks for objects that the 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Authenticator class will call to report the success/failure of 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// authentication for Chromium OS. 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LoginStatusConsumer { 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~LoginStatusConsumer() {} 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The current login attempt has ended in failure, with error |error|. 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnLoginFailure(const LoginFailure& error) = 0; 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The current login attempt has succeeded for 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // |username|/|password|, returning |credentials|. If 105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // |pending_requests| is false, we're totally done. If it's true, 106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // we will still have some more results to report later. 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void OnLoginSuccess( 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& username, 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const std::string& password, 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const GaiaAuthConsumer::ClientLoginResult& credentials, 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool pending_requests) = 0; 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The current guest login attempt has succeeded. 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnOffTheRecordLoginSuccess() {} 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The same password didn't work both online and offline. 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnPasswordChangeDetected( 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GaiaAuthConsumer::ClientLoginResult& credentials) { 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace chromeos 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_CHROMEOS_LOGIN_LOGIN_STATUS_CONSUMER_H_ 124