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