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