Index: remoting/protocol/jingle_messages.cc |
diff --git a/remoting/protocol/jingle_messages.cc b/remoting/protocol/jingle_messages.cc |
index 2c31b81f96c0d4eb49a681a87a9db510aa2f9485..bbc468da675046bea506f822803f1ec72433c581 100644 |
--- a/remoting/protocol/jingle_messages.cc |
+++ b/remoting/protocol/jingle_messages.cc |
@@ -11,7 +11,6 @@ |
#include "remoting/base/remoting_bot.h" |
#include "remoting/protocol/content_description.h" |
#include "remoting/protocol/session_plugin.h" |
-#include "remoting/signaling/jid_util.h" |
#include "third_party/libjingle_xmpp/xmllite/xmlelement.h" |
using buzz::QName; |
@@ -36,11 +35,6 @@ const char kXmlNamespace[] = "http://www.w3.org/XML/1998/namespace"; |
const int kPortMin = 1000; |
const int kPortMax = 65535; |
-const NameMapElement<SignalingAddress::Channel> kChannelTypes[] = { |
- {SignalingAddress::Channel::LCS, "lcs"}, |
- {SignalingAddress::Channel::XMPP, "xmpp"}, |
-}; |
- |
const NameMapElement<JingleMessage::ActionType> kActionTypes[] = { |
{ JingleMessage::SESSION_INITIATE, "session-initiate" }, |
{ JingleMessage::SESSION_ACCEPT, "session-accept" }, |
@@ -151,135 +145,8 @@ XmlElement* FormatIceCandidate( |
return result; |
} |
-// Represents the XML attrbute names for the various address fields in the |
-// iq stanza. |
-enum class Field { JID, CHANNEL, ENDPOINT_ID }; |
- |
-buzz::QName GetQNameByField(Field attr, bool from) { |
- std::string attribute_name; |
- switch (attr) { |
- case Field::JID: |
- attribute_name = (from) ? "from" : "to"; |
- break; |
- case Field::ENDPOINT_ID: |
- attribute_name = (from) ? "from-endpoint-id" : "to-endpoint-id"; |
- break; |
- case Field::CHANNEL: |
- attribute_name = (from) ? "from-channel" : "to-channel"; |
- break; |
- default: |
- NOTREACHED(); |
- } |
- return QName(kEmptyNamespace, attribute_name); |
-} |
- |
-SignalingAddress ParseAddress( |
- const buzz::XmlElement* iq, bool from, std::string* error) { |
- std::string jid(iq->Attr(GetQNameByField(Field::JID, from))); |
- if (jid.empty()) { |
- return SignalingAddress(); |
- } |
- |
- const XmlElement* jingle = iq->FirstNamed(QName(kJingleNamespace, "jingle")); |
- |
- if (!jingle) { |
- return SignalingAddress(jid); |
- } |
- |
- std::string type(iq->Attr(QName(std::string(), "type"))); |
- // For error IQs, flips the |from| flag as the jingle node represents the |
- // original request. |
- if (type == "error") { |
- from = !from; |
- } |
- |
- std::string endpoint_id( |
- jingle->Attr(GetQNameByField(Field::ENDPOINT_ID, from))); |
- std::string channel_str(jingle->Attr(GetQNameByField(Field::CHANNEL, from))); |
- SignalingAddress::Channel channel; |
- |
- if (channel_str.empty()) { |
- channel = SignalingAddress::Channel::XMPP; |
- } else if (!NameToValue(kChannelTypes, channel_str, &channel)) { |
- *error = "Unknown channel: " + channel_str; |
- return SignalingAddress(); |
- } |
- |
- bool is_lcs = (channel == SignalingAddress::Channel::LCS); |
- |
- if (is_lcs == endpoint_id.empty()) { |
- *error = (is_lcs ? "Missing |endpoint-id| for LCS channel" |
- : "|endpoint_id| should be empty for XMPP channel"); |
- return SignalingAddress(); |
- } |
- |
- if (from && is_lcs && !IsValidBotJid(jid)) { |
- *error = "Reject LCS message from untrusted sender: " + jid; |
- return SignalingAddress(); |
- } |
- |
- return SignalingAddress(jid, endpoint_id, channel); |
-} |
- |
-void SetAddress(buzz::XmlElement* iq, |
- buzz::XmlElement* jingle, |
- const SignalingAddress& address, |
- bool from) { |
- if (address.empty()) { |
- return; |
- } |
- |
- // Always set the JID. |
- iq->SetAttr(GetQNameByField(Field::JID, from), address.jid()); |
- |
- // Do not tamper the routing-info in the jingle tag for error IQ's, as |
- // it corresponds to the original message. |
- std::string type(iq->Attr(QName(std::string(), "type"))); |
- if (type == "error") { |
- return; |
- } |
- |
- // Start from a fresh slate regardless of the previous address format. |
- jingle->ClearAttr(GetQNameByField(Field::CHANNEL, from)); |
- jingle->ClearAttr(GetQNameByField(Field::ENDPOINT_ID, from)); |
- |
- // Only set the channel and endpoint_id in the LCS channel. |
- if (address.channel() == SignalingAddress::Channel::LCS) { |
- jingle->AddAttr(GetQNameByField(Field::ENDPOINT_ID, from), |
- address.endpoint_id()); |
- jingle->AddAttr(GetQNameByField(Field::CHANNEL, from), |
- ValueToName(kChannelTypes, address.channel())); |
- } |
-} |
- |
} // namespace |
-SignalingAddress::SignalingAddress() |
- : channel_(SignalingAddress::Channel::XMPP) {} |
- |
-SignalingAddress::SignalingAddress(const std::string& jid) |
- : jid_(NormalizeJid(jid)), channel_(SignalingAddress::Channel::XMPP) { |
- DCHECK(!jid.empty()); |
-} |
- |
-SignalingAddress::SignalingAddress(const std::string& jid, |
- const std::string& endpoint_id, |
- Channel channel) |
- : jid_(NormalizeJid(jid)), |
- endpoint_id_(NormalizeJid(endpoint_id)), |
- channel_(channel) { |
- DCHECK(!jid.empty()); |
-} |
- |
-bool SignalingAddress::operator==(const SignalingAddress& other) const { |
- return (other.jid_ == jid_) && (other.endpoint_id_ == endpoint_id_) && |
- (other.channel_ == channel_); |
-} |
- |
-bool SignalingAddress::operator!=(const SignalingAddress& other) const { |
- return !(*this == other); |
-} |
- |
// static |
bool JingleMessage::IsJingleMessage(const buzz::XmlElement* stanza) { |
return stanza->Name() == QName(kJabberNamespace, "iq") && |
@@ -315,13 +182,9 @@ bool JingleMessage::ParseXml(const buzz::XmlElement* stanza, |
return false; |
} |
- from = ParseAddress(stanza, true, error); |
- if (!error->empty()) { |
- return false; |
- } |
- |
- to = ParseAddress(stanza, false, error); |
- if (!error->empty()) { |
+ from = SignalingAddress::Parse(stanza, SignalingAddress::FROM, error); |
+ to = SignalingAddress::Parse(stanza, SignalingAddress::TO, error); |
+ if (from.empty() || to.empty()) { |
return false; |
} |
@@ -450,8 +313,10 @@ std::unique_ptr<buzz::XmlElement> JingleMessage::ToXml() const { |
new XmlElement(QName(kJingleNamespace, "jingle"), true); |
root->AddElement(jingle_tag); |
jingle_tag->AddAttr(QName(kEmptyNamespace, "sid"), sid); |
- SetAddress(root.get(), jingle_tag, to, false); |
- SetAddress(root.get(), jingle_tag, from, true); |
+ |
+ to.SetInMessage(root.get(), SignalingAddress::TO); |
+ if (!from.empty()) |
+ from.SetInMessage(root.get(), SignalingAddress::FROM); |
const char* action_attr = ValueToName(kActionTypes, action); |
if (!action_attr) { |
@@ -550,22 +415,23 @@ std::unique_ptr<buzz::XmlElement> JingleMessageReply::ToXml( |
SignalingAddress original_from; |
std::string error_message; |
- original_from = ParseAddress(request_stanza, true, &error_message); |
- DCHECK(error_message.empty()); |
+ original_from = SignalingAddress::Parse( |
+ request_stanza, SignalingAddress::FROM, &error_message); |
+ DCHECK(!original_from.empty()); |
if (type == REPLY_RESULT) { |
iq->SetAttr(QName(kEmptyNamespace, "type"), "result"); |
XmlElement* jingle = |
new XmlElement(QName(kJingleNamespace, "jingle"), true); |
iq->AddElement(jingle); |
- SetAddress(iq.get(), jingle, original_from, false); |
+ original_from.SetInMessage(iq.get(), SignalingAddress::TO); |
return iq; |
} |
DCHECK_EQ(type, REPLY_ERROR); |
iq->SetAttr(QName(kEmptyNamespace, "type"), "error"); |
- SetAddress(iq.get(), nullptr, original_from, false); |
+ original_from.SetInMessage(iq.get(), SignalingAddress::TO); |
for (const buzz::XmlElement* child = request_stanza->FirstElement(); |
child != nullptr; child = child->NextElement()) { |