15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/base/gaia_token_pre_xmpp_auth.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/constants.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/saslcookiemechanism.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "webrtc/base/socketaddress.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace notifier {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GaiaCookieMechanism : public buzz::SaslCookieMechanism {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GaiaCookieMechanism(const std::string & mechanism,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string & username,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string & cookie,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string & token_service)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buzz::SaslCookieMechanism(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mechanism, username, cookie, token_service) {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GaiaCookieMechanism() {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual buzz::XmlElement* StartSaslAuth() OVERRIDE {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buzz::XmlElement* auth = buzz::SaslCookieMechanism::StartSaslAuth();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These attributes are necessary for working with non-gmail gaia
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // accounts.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string NS_GOOGLE_AUTH_PROTOCOL(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "http://www.google.com/talk/protocol/auth");
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const buzz::QName QN_GOOGLE_ALLOW_GENERATED_JID_XMPP_LOGIN(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NS_GOOGLE_AUTH_PROTOCOL, "allow-generated-jid");
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const buzz::QName QN_GOOGLE_AUTH_CLIENT_USES_FULL_BIND_RESULT(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NS_GOOGLE_AUTH_PROTOCOL, "client-uses-full-bind-result");
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auth->SetAttr(QN_GOOGLE_ALLOW_GENERATED_JID_XMPP_LOGIN, "true");
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auth->SetAttr(QN_GOOGLE_AUTH_CLIENT_USES_FULL_BIND_RESULT, "true");
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return auth;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GaiaCookieMechanism);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GaiaTokenPreXmppAuth::GaiaTokenPreXmppAuth(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& username,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& token,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& token_service,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& auth_mechanism)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : username_(username),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      token_(token),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      token_service_(token_service),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      auth_mechanism_(auth_mechanism) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!auth_mechanism_.empty());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GaiaTokenPreXmppAuth::~GaiaTokenPreXmppAuth() { }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GaiaTokenPreXmppAuth::StartPreXmppAuth(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const buzz::Jid& jid,
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const rtc::SocketAddress& server,
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const rtc::CryptString& pass,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& auth_mechanism,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& auth_token) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SignalAuthDone();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GaiaTokenPreXmppAuth::IsAuthDone() const {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GaiaTokenPreXmppAuth::IsAuthorized() const {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GaiaTokenPreXmppAuth::HadError() const {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GaiaTokenPreXmppAuth::GetError() const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)buzz::CaptchaChallenge GaiaTokenPreXmppAuth::GetCaptchaChallenge() const {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buzz::CaptchaChallenge();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GaiaTokenPreXmppAuth::GetAuthToken() const {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return token_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GaiaTokenPreXmppAuth::GetAuthMechanism() const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return auth_mechanism_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GaiaTokenPreXmppAuth::ChooseBestSaslMechanism(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string> & mechanisms, bool encrypted) {
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return (std::find(mechanisms.begin(), mechanisms.end(), auth_mechanism_) !=
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              mechanisms.end())
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             ? auth_mechanism_
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             : std::string();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)buzz::SaslMechanism* GaiaTokenPreXmppAuth::CreateSaslMechanism(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& mechanism) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mechanism == auth_mechanism_)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new GaiaCookieMechanism(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mechanism, username_, token_, token_service_);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace notifier
119