1269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org/*
2269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *
4269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org */
10269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
11269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef WEBRTC_LIBJINGLE_XMPP_PLAINSASLHANDLER_H_
12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#define WEBRTC_LIBJINGLE_XMPP_PLAINSASLHANDLER_H_
13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <algorithm>
15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/saslhandler.h"
16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmpp/saslplainmechanism.h"
17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/cryptstring.h"
18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace buzz {
20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass PlainSaslHandler : public SaslHandler {
22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgpublic:
23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  PlainSaslHandler(const Jid & jid, const rtc::CryptString & password,
24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      bool allow_plain) : jid_(jid), password_(password),
25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                          allow_plain_(allow_plain) {}
26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  virtual ~PlainSaslHandler() {}
28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Should pick the best method according to this handler
30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // returns the empty string if none are suitable
31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  virtual std::string ChooseBestSaslMechanism(const std::vector<std::string> & mechanisms, bool encrypted) {
32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    if (!encrypted && !allow_plain_) {
34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      return "";
35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    }
36269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
37269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    std::vector<std::string>::const_iterator it = std::find(mechanisms.begin(), mechanisms.end(), "PLAIN");
38269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    if (it == mechanisms.end()) {
39269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      return "";
40269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    }
41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    else {
42269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      return "PLAIN";
43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    }
44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  }
45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Creates a SaslMechanism for the given mechanism name (you own it
47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // once you get it).  If not handled, return NULL.
48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  virtual SaslMechanism * CreateSaslMechanism(const std::string & mechanism) {
49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    if (mechanism == "PLAIN") {
50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      return new SaslPlainMechanism(jid_, password_);
51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    }
52269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    return NULL;
53269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  }
54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
55269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgprivate:
56269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  Jid jid_;
57269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::CryptString password_;
58269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool allow_plain_;
59269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org};
60269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
61269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
62269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}
63269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
64269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif  // WEBRTC_LIBJINGLE_XMPP_PLAINSASLHANDLER_H_
65