| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/remoting/setup_flow_login_step.h" | |
| 6 | |
| 7 #include "base/json/json_reader.h" | |
| 8 #include "base/json/json_writer.h" | |
| 9 #include "base/string_util.h" | |
| 10 #include "base/utf_string_conversions.h" | |
| 11 #include "base/values.h" | |
| 12 #include "chrome/browser/profiles/profile.h" | |
| 13 #include "chrome/browser/remoting/setup_flow_get_status_step.h" | |
| 14 #include "chrome/common/net/gaia/gaia_constants.h" | |
| 15 #include "chrome/common/net/gaia/google_service_auth_error.h" | |
| 16 | |
| 17 namespace remoting { | |
| 18 | |
| 19 static const wchar_t kLoginIFrameXPath[] = L"//iframe[@id='login']"; | |
| 20 | |
| 21 SetupFlowLoginStep::SetupFlowLoginStep() { } | |
| 22 | |
| 23 SetupFlowLoginStep::SetupFlowLoginStep(const string16& error_message) | |
| 24 : error_message_(error_message) { | |
| 25 } | |
| 26 | |
| 27 SetupFlowLoginStep::~SetupFlowLoginStep() { } | |
| 28 | |
| 29 void SetupFlowLoginStep::HandleMessage(const std::string& message, | |
| 30 const Value* arg) { | |
| 31 if (message == "SubmitAuth") { | |
| 32 DCHECK(arg); | |
| 33 | |
| 34 std::string json; | |
| 35 if (!arg->GetAsString(&json) || json.empty()) { | |
| 36 NOTREACHED(); | |
| 37 return; | |
| 38 } | |
| 39 | |
| 40 scoped_ptr<Value> parsed_value(base::JSONReader::Read(json, false)); | |
| 41 if (!parsed_value.get() || !parsed_value->IsType(Value::TYPE_DICTIONARY)) { | |
| 42 NOTREACHED() << "Unable to parse auth data"; | |
| 43 return; | |
| 44 } | |
| 45 | |
| 46 CHECK(parsed_value->IsType(Value::TYPE_DICTIONARY)); | |
| 47 | |
| 48 std::string username, password, captcha, access_code; | |
| 49 const DictionaryValue* result = | |
| 50 static_cast<const DictionaryValue*>(parsed_value.get()); | |
| 51 if (!result->GetString("user", &username) || | |
| 52 !result->GetString("pass", &password) || | |
| 53 !result->GetString("captcha", &captcha) || | |
| 54 !result->GetString("access_code", &access_code)) { | |
| 55 NOTREACHED() << "Unable to parse auth data"; | |
| 56 return; | |
| 57 } | |
| 58 | |
| 59 OnUserSubmittedAuth(username, password, captcha, access_code); | |
| 60 } | |
| 61 } | |
| 62 | |
| 63 void SetupFlowLoginStep::Cancel() { | |
| 64 if (authenticator_.get()) | |
| 65 authenticator_->CancelRequest(); | |
| 66 } | |
| 67 | |
| 68 void SetupFlowLoginStep::OnUserSubmittedAuth(const std::string& user, | |
| 69 const std::string& password, | |
| 70 const std::string& captcha, | |
| 71 const std::string& access_code) { | |
| 72 flow()->context()->login = user; | |
| 73 | |
| 74 // Start the authenticator. | |
| 75 authenticator_.reset( | |
| 76 new GaiaAuthFetcher(this, GaiaConstants::kChromeSource, | |
| 77 flow()->profile()->GetRequestContext())); | |
| 78 | |
| 79 std::string remoting_password; | |
| 80 if (!access_code.empty()) | |
| 81 remoting_password = access_code; | |
| 82 else | |
| 83 remoting_password = password; | |
| 84 | |
| 85 authenticator_->StartClientLogin(user, remoting_password, | |
| 86 GaiaConstants::kRemotingService, | |
| 87 "", captcha, | |
| 88 GaiaAuthFetcher::HostedAccountsAllowed); | |
| 89 } | |
| 90 | |
| 91 void SetupFlowLoginStep::OnClientLoginSuccess( | |
| 92 const GaiaAuthConsumer::ClientLoginResult& credentials) { | |
| 93 // Save the token for remoting. | |
| 94 flow()->context()->remoting_token = credentials.token; | |
| 95 | |
| 96 // After login has succeeded try to fetch the token for sync. | |
| 97 // We need the token for sync to connect to the talk network. | |
| 98 authenticator_->StartIssueAuthToken(credentials.sid, credentials.lsid, | |
| 99 GaiaConstants::kSyncService); | |
| 100 } | |
| 101 | |
| 102 void SetupFlowLoginStep::OnClientLoginFailure( | |
| 103 const GoogleServiceAuthError& error) { | |
| 104 ShowGaiaFailed(error); | |
| 105 authenticator_.reset(); | |
| 106 } | |
| 107 | |
| 108 void SetupFlowLoginStep::OnIssueAuthTokenSuccess( | |
| 109 const std::string& service, const std::string& auth_token) { | |
| 110 // Save the sync token. | |
| 111 flow()->context()->talk_token = auth_token; | |
| 112 authenticator_.reset(); | |
| 113 | |
| 114 FinishStep(new SetupFlowGetStatusStep()); | |
| 115 } | |
| 116 | |
| 117 void SetupFlowLoginStep::OnIssueAuthTokenFailure(const std::string& service, | |
| 118 const GoogleServiceAuthError& error) { | |
| 119 ShowGaiaFailed(error); | |
| 120 authenticator_.reset(); | |
| 121 } | |
| 122 | |
| 123 void SetupFlowLoginStep::DoStart() { | |
| 124 DictionaryValue args; | |
| 125 // TODO(sergeyu): Supply current login name if the service was started before. | |
| 126 args.SetString("user", ""); | |
| 127 args.SetBoolean("editable_user", true); | |
| 128 if (!error_message_.empty()) | |
| 129 args.SetString("error_message", error_message_); | |
| 130 ShowGaiaLogin(args); | |
| 131 } | |
| 132 | |
| 133 void SetupFlowLoginStep::ShowGaiaLogin(const DictionaryValue& args) { | |
| 134 WebUI* web_ui = flow()->web_ui(); | |
| 135 DCHECK(web_ui); | |
| 136 | |
| 137 web_ui->CallJavascriptFunction("showLogin"); | |
| 138 | |
| 139 std::string json; | |
| 140 base::JSONWriter::Write(&args, false, &json); | |
| 141 std::wstring javascript = std::wstring(L"showGaiaLogin(") + | |
| 142 UTF8ToWide(json) + L");"; | |
| 143 ExecuteJavascriptInIFrame(kLoginIFrameXPath, javascript); | |
| 144 } | |
| 145 | |
| 146 void SetupFlowLoginStep::ShowGaiaFailed(const GoogleServiceAuthError& error) { | |
| 147 DictionaryValue args; | |
| 148 args.SetInteger("error", error.state()); | |
| 149 args.SetBoolean("editable_user", true); | |
| 150 args.SetString("captchaUrl", error.captcha().image_url.spec()); | |
| 151 ShowGaiaLogin(args); | |
| 152 } | |
| 153 | |
| 154 } // namespace remoting | |
| OLD | NEW |