1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chromeos/login/auth/online_attempt_host.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/location.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/auth_attempt_state.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chromeos/login/auth/online_attempt.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/user_context.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/user_manager/user_type.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chromeos {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)OnlineAttemptHost::OnlineAttemptHost(Delegate* delegate)
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : message_loop_(base::MessageLoopProxy::current()),
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      delegate_(delegate),
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      weak_ptr_factory_(this) {
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)OnlineAttemptHost::~OnlineAttemptHost() {
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Reset();
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnlineAttemptHost::Check(net::URLRequestContextGetter* request_context,
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              const UserContext& user_context) {
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (user_context != current_attempt_user_context_) {
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Reset();
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    current_attempt_user_context_ = user_context;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    state_.reset(new AuthAttemptState(user_context,
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      user_manager::USER_TYPE_REGULAR,
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      false,    // unlock
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      false,    // online_complete
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      false));  // user_is_new
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    online_attempt_.reset(new OnlineAttempt(state_.get(), this));
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    online_attempt_->Initiate(request_context);
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void OnlineAttemptHost::Reset() {
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  online_attempt_.reset(NULL);
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  current_attempt_user_context_ = UserContext();
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void OnlineAttemptHost::Resolve() {
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (state_->online_complete()) {
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool success = state_->online_outcome().reason() == AuthFailure::NONE;
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE,
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                            base::Bind(&OnlineAttemptHost::ResolveOnUIThread,
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                       weak_ptr_factory_.GetWeakPtr(),
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                       success));
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void OnlineAttemptHost::ResolveOnUIThread(bool success) {
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->OnChecked(current_attempt_user_context_.GetUserID(), success);
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Reset();
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace chromeos
64