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 "jingle/notifier/base/gaia_token_pre_xmpp_auth.h"
6
7#include <algorithm>
8
9#include "base/basictypes.h"
10#include "base/logging.h"
11#include "talk/xmpp/constants.h"
12#include "talk/xmpp/saslcookiemechanism.h"
13#include "webrtc/base/socketaddress.h"
14
15namespace notifier {
16
17namespace {
18
19class GaiaCookieMechanism : public buzz::SaslCookieMechanism {
20 public:
21  GaiaCookieMechanism(const std::string & mechanism,
22                      const std::string & username,
23                      const std::string & cookie,
24                      const std::string & token_service)
25      : buzz::SaslCookieMechanism(
26          mechanism, username, cookie, token_service) {}
27
28  virtual ~GaiaCookieMechanism() {}
29
30  virtual buzz::XmlElement* StartSaslAuth() OVERRIDE {
31    buzz::XmlElement* auth = buzz::SaslCookieMechanism::StartSaslAuth();
32    // These attributes are necessary for working with non-gmail gaia
33    // accounts.
34    const std::string NS_GOOGLE_AUTH_PROTOCOL(
35        "http://www.google.com/talk/protocol/auth");
36    const buzz::QName QN_GOOGLE_ALLOW_GENERATED_JID_XMPP_LOGIN(
37        NS_GOOGLE_AUTH_PROTOCOL, "allow-generated-jid");
38    const buzz::QName QN_GOOGLE_AUTH_CLIENT_USES_FULL_BIND_RESULT(
39        NS_GOOGLE_AUTH_PROTOCOL, "client-uses-full-bind-result");
40    auth->SetAttr(QN_GOOGLE_ALLOW_GENERATED_JID_XMPP_LOGIN, "true");
41    auth->SetAttr(QN_GOOGLE_AUTH_CLIENT_USES_FULL_BIND_RESULT, "true");
42    return auth;
43  }
44
45 private:
46  DISALLOW_COPY_AND_ASSIGN(GaiaCookieMechanism);
47};
48
49}  // namespace
50
51GaiaTokenPreXmppAuth::GaiaTokenPreXmppAuth(
52    const std::string& username,
53    const std::string& token,
54    const std::string& token_service,
55    const std::string& auth_mechanism)
56    : username_(username),
57      token_(token),
58      token_service_(token_service),
59      auth_mechanism_(auth_mechanism) {
60  DCHECK(!auth_mechanism_.empty());
61}
62
63GaiaTokenPreXmppAuth::~GaiaTokenPreXmppAuth() { }
64
65void GaiaTokenPreXmppAuth::StartPreXmppAuth(
66    const buzz::Jid& jid,
67    const rtc::SocketAddress& server,
68    const rtc::CryptString& pass,
69    const std::string& auth_mechanism,
70    const std::string& auth_token) {
71  SignalAuthDone();
72}
73
74bool GaiaTokenPreXmppAuth::IsAuthDone() const {
75  return true;
76}
77
78bool GaiaTokenPreXmppAuth::IsAuthorized() const {
79  return true;
80}
81
82bool GaiaTokenPreXmppAuth::HadError() const {
83  return false;
84}
85
86int GaiaTokenPreXmppAuth::GetError() const {
87  return 0;
88}
89
90buzz::CaptchaChallenge GaiaTokenPreXmppAuth::GetCaptchaChallenge() const {
91  return buzz::CaptchaChallenge();
92}
93
94std::string GaiaTokenPreXmppAuth::GetAuthToken() const {
95  return token_;
96}
97
98std::string GaiaTokenPreXmppAuth::GetAuthMechanism() const {
99  return auth_mechanism_;
100}
101
102std::string GaiaTokenPreXmppAuth::ChooseBestSaslMechanism(
103    const std::vector<std::string> & mechanisms, bool encrypted) {
104  return (std::find(mechanisms.begin(), mechanisms.end(), auth_mechanism_) !=
105              mechanisms.end())
106             ? auth_mechanism_
107             : std::string();
108}
109
110buzz::SaslMechanism* GaiaTokenPreXmppAuth::CreateSaslMechanism(
111    const std::string& mechanism) {
112  if (mechanism == auth_mechanism_)
113    return new GaiaCookieMechanism(
114        mechanism, username_, token_, token_service_);
115  return NULL;
116}
117
118}  // namespace notifier
119