1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/chromeos_export.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class UserContext; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass CHROMEOS_EXPORT AuthFailure { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum FailureReason { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NONE, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COULD_NOT_MOUNT_CRYPTOHOME, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COULD_NOT_MOUNT_TMPFS, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COULD_NOT_UNMOUNT_CRYPTOHOME, 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DATA_REMOVAL_FAILED, // Could not destroy your old data 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOGIN_TIMED_OUT, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNLOCK_FAILED, 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NETWORK_AUTH_FAILED, // Could not authenticate against Google 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OWNER_REQUIRED, // Only the device owner can log-in. 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WHITELIST_CHECK_FAILED, // Login attempt blocked by whitelist. This value 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // is 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // synthesized by the ExistingUserController and 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // passed to the login_status_consumer_ in tests 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // only. It is never generated or seen by any of the 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // other authenticator classes. 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TPM_ERROR, // Critical TPM error encountered. 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch USERNAME_HASH_FAILED, // Could not get username hash. 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NUM_FAILURE_REASONS, // This has to be the last item. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit AuthFailure(FailureReason reason) 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : reason_(reason), error_(GoogleServiceAuthError::NONE) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(reason != NETWORK_AUTH_FAILED); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch inline bool operator==(const AuthFailure& b) const { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reason_ != b.reason_) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reason_ == NETWORK_AUTH_FAILED) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_ == b.error_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static AuthFailure FromNetworkAuthFailure( 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& error) { 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return AuthFailure(NETWORK_AUTH_FAILED, error); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static AuthFailure AuthFailureNone() { return AuthFailure(NONE); } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string GetErrorString() const { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (reason_) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DATA_REMOVAL_FAILED: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Could not destroy your old data."; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case COULD_NOT_MOUNT_CRYPTOHOME: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Could not mount cryptohome."; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case COULD_NOT_UNMOUNT_CRYPTOHOME: 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "Could not unmount cryptohome."; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case COULD_NOT_MOUNT_TMPFS: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Could not mount tmpfs."; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LOGIN_TIMED_OUT: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Login timed out. Please try again."; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNLOCK_FAILED: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Unlock failed."; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NETWORK_AUTH_FAILED: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_.state() == GoogleServiceAuthError::CONNECTION_FAILED) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::ErrorToString(error_.network_error()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Google authentication failed."; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OWNER_REQUIRED: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Login is restricted to the owner's account only."; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WHITELIST_CHECK_FAILED: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "Login attempt blocked by whitelist."; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& error() const { return error_; } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FailureReason& reason() const { return reason_; } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AuthFailure(FailureReason reason, GoogleServiceAuthError error) 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : reason_(reason), error_(error) {} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FailureReason reason_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError error_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface that defines the callbacks for objects that the 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Authenticator class will call to report the success/failure of 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// authentication for Chromium OS. 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass CHROMEOS_EXPORT AuthStatusConsumer { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~AuthStatusConsumer() {} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current login attempt has ended in failure, with error |error|. 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnAuthFailure(const AuthFailure& error) = 0; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The current retail mode login attempt has succeeded. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unless overridden for special processing, this should always call 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OnLoginSuccess with the magic |kRetailModeUserEMail| constant. 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnRetailModeAuthSuccess(const UserContext& user_context); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The current login attempt has succeeded for |user_context|. 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnAuthSuccess(const UserContext& user_context) = 0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current guest login attempt has succeeded. 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnOffTheRecordAuthSuccess() {} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The same password didn't work both online and offline. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPasswordChangeDetected(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_ 129