| Index: webrtc/libjingle/xmpp/xmppauth.cc
|
| diff --git a/webrtc/libjingle/xmpp/xmppauth.cc b/webrtc/libjingle/xmpp/xmppauth.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a3d2f678496c3f97f97ce5865a6d59d1a3559079
|
| --- /dev/null
|
| +++ b/webrtc/libjingle/xmpp/xmppauth.cc
|
| @@ -0,0 +1,88 @@
|
| +/*
|
| + * Copyright 2004 The WebRTC Project Authors. All rights reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include "webrtc/libjingle/xmpp/xmppauth.h"
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "webrtc/libjingle/xmpp/constants.h"
|
| +#include "webrtc/libjingle/xmpp/saslcookiemechanism.h"
|
| +#include "webrtc/libjingle/xmpp/saslplainmechanism.h"
|
| +
|
| +XmppAuth::XmppAuth() : done_(false) {
|
| +}
|
| +
|
| +XmppAuth::~XmppAuth() {
|
| +}
|
| +
|
| +void XmppAuth::StartPreXmppAuth(const buzz::Jid& jid,
|
| + const rtc::SocketAddress& server,
|
| + const rtc::CryptString& pass,
|
| + const std::string& auth_mechanism,
|
| + const std::string& auth_token) {
|
| + jid_ = jid;
|
| + passwd_ = pass;
|
| + auth_mechanism_ = auth_mechanism;
|
| + auth_token_ = auth_token;
|
| + done_ = true;
|
| +
|
| + SignalAuthDone();
|
| +}
|
| +
|
| +static bool contains(const std::vector<std::string>& strings,
|
| + const std::string& string) {
|
| + return std::find(strings.begin(), strings.end(), string) != strings.end();
|
| +}
|
| +
|
| +std::string XmppAuth::ChooseBestSaslMechanism(
|
| + const std::vector<std::string>& mechanisms,
|
| + bool encrypted) {
|
| + // First try Oauth2.
|
| + if (GetAuthMechanism() == buzz::AUTH_MECHANISM_OAUTH2 &&
|
| + contains(mechanisms, buzz::AUTH_MECHANISM_OAUTH2)) {
|
| + return buzz::AUTH_MECHANISM_OAUTH2;
|
| + }
|
| +
|
| + // A token is the weakest auth - 15s, service-limited, so prefer it.
|
| + if (GetAuthMechanism() == buzz::AUTH_MECHANISM_GOOGLE_TOKEN &&
|
| + contains(mechanisms, buzz::AUTH_MECHANISM_GOOGLE_TOKEN)) {
|
| + return buzz::AUTH_MECHANISM_GOOGLE_TOKEN;
|
| + }
|
| +
|
| + // A cookie is the next weakest - 14 days.
|
| + if (GetAuthMechanism() == buzz::AUTH_MECHANISM_GOOGLE_COOKIE &&
|
| + contains(mechanisms, buzz::AUTH_MECHANISM_GOOGLE_COOKIE)) {
|
| + return buzz::AUTH_MECHANISM_GOOGLE_COOKIE;
|
| + }
|
| +
|
| + // As a last resort, use plain authentication.
|
| + if (contains(mechanisms, buzz::AUTH_MECHANISM_PLAIN)) {
|
| + return buzz::AUTH_MECHANISM_PLAIN;
|
| + }
|
| +
|
| + // No good mechanism found
|
| + return "";
|
| +}
|
| +
|
| +buzz::SaslMechanism* XmppAuth::CreateSaslMechanism(
|
| + const std::string& mechanism) {
|
| + if (mechanism == buzz::AUTH_MECHANISM_OAUTH2) {
|
| + return new buzz::SaslCookieMechanism(
|
| + mechanism, jid_.Str(), auth_token_, "oauth2");
|
| + } else if (mechanism == buzz::AUTH_MECHANISM_GOOGLE_TOKEN) {
|
| + return new buzz::SaslCookieMechanism(mechanism, jid_.Str(), auth_token_);
|
| + // } else if (mechanism == buzz::AUTH_MECHANISM_GOOGLE_COOKIE) {
|
| + // return new buzz::SaslCookieMechanism(mechanism, jid.Str(), sid_);
|
| + } else if (mechanism == buzz::AUTH_MECHANISM_PLAIN) {
|
| + return new buzz::SaslPlainMechanism(jid_, passwd_);
|
| + } else {
|
| + return NULL;
|
| + }
|
| +}
|
|
|