diff options
Diffstat (limited to 'vendor/github.com/matterbridge/go-xmpp')
3 files changed, 157 insertions, 11 deletions
diff --git a/vendor/github.com/matterbridge/go-xmpp/xmpp.go b/vendor/github.com/matterbridge/go-xmpp/xmpp.go index bb1438e9..3d2f8bf9 100644 --- a/vendor/github.com/matterbridge/go-xmpp/xmpp.go +++ b/vendor/github.com/matterbridge/go-xmpp/xmpp.go @@ -713,15 +713,44 @@ func (c *Client) Recv() (stanza interface{}, err error) { Errors: errsStr, }, nil } - case v.Type == "result" && v.ID == "unsub1": - // Unsubscribing MAY contain a pubsub element. But it does - // not have to - return PubsubUnsubscription{ - SubID: "", - JID: v.From, - Node: "", - Errors: nil, - }, nil + case v.Type == "result": + switch v.ID { + case "unsub1": + // Unsubscribing MAY contain a pubsub element. But it does + // not have to + return PubsubUnsubscription{ + SubID: "", + JID: v.From, + Node: "", + Errors: nil, + }, nil + case "info1": + if v.Query.XMLName.Space == XMPPNS_DISCO_ITEMS { + var itemsQuery clientDiscoItemsQuery + err := xml.Unmarshal(v.InnerXML, &itemsQuery) + if err != nil { + return []DiscoItem{}, err + } + + return DiscoItems{ + Jid: v.From, + Items: clientDiscoItemsToReturn(itemsQuery.Items), + }, nil + } + case "info3": + if v.Query.XMLName.Space == XMPPNS_DISCO_INFO { + var disco clientDiscoQuery + err := xml.Unmarshal(v.InnerXML, &disco) + if err != nil { + return DiscoResult{}, err + } + + return DiscoResult{ + Features: clientFeaturesToReturn(disco.Features), + Identities: clientIdentitiesToReturn(disco.Identities), + }, nil + } + } case v.Query.XMLName.Local == "pubsub": switch v.ID { case "sub1": @@ -1049,6 +1078,8 @@ type clientIQ struct { Query XMLElement `xml:",any"` Error clientError Bind bindBind + + InnerXML []byte `xml:",innerxml"` } type clientError struct { diff --git a/vendor/github.com/matterbridge/go-xmpp/xmpp_disco.go b/vendor/github.com/matterbridge/go-xmpp/xmpp_disco.go new file mode 100644 index 00000000..0bca664a --- /dev/null +++ b/vendor/github.com/matterbridge/go-xmpp/xmpp_disco.go @@ -0,0 +1,99 @@ +package xmpp + +import ( + "encoding/xml" +) + +const ( + XMPPNS_DISCO_ITEMS = "http://jabber.org/protocol/disco#items" + XMPPNS_DISCO_INFO = "http://jabber.org/protocol/disco#info" +) + +type clientDiscoFeature struct { + XMLName xml.Name `xml:"feature"` + Var string `xml:"var,attr"` +} + +type clientDiscoIdentity struct { + XMLName xml.Name `xml:"identity"` + Category string `xml:"category,attr"` + Type string `xml:"type,attr"` + Name string `xml:"name,attr"` +} + +type clientDiscoQuery struct { + XMLName xml.Name `xml:"query"` + Features []clientDiscoFeature `xml:"feature"` + Identities []clientDiscoIdentity `xml:"identity"` +} + +type clientDiscoItem struct { + XMLName xml.Name `xml:"item"` + Jid string `xml:"jid,attr"` + Node string `xml:"node,attr"` + Name string `xml:"name,attr"` +} + +type clientDiscoItemsQuery struct { + XMLName xml.Name `xml:"query"` + Items []clientDiscoItem `xml:"item"` +} + +type DiscoIdentity struct { + Category string + Type string + Name string +} + +type DiscoItem struct { + Jid string + Name string + Node string +} + +type DiscoResult struct { + Features []string + Identities []DiscoIdentity +} + +type DiscoItems struct { + Jid string + Items []DiscoItem +} + +func clientFeaturesToReturn(features []clientDiscoFeature) []string { + var ret []string + + for _, feature := range features { + ret = append(ret, feature.Var) + } + + return ret +} + +func clientIdentitiesToReturn(identities []clientDiscoIdentity) []DiscoIdentity { + var ret []DiscoIdentity + + for _, id := range identities { + ret = append(ret, DiscoIdentity{ + Category: id.Category, + Type: id.Type, + Name: id.Name, + }) + } + + return ret +} + +func clientDiscoItemsToReturn(items []clientDiscoItem) []DiscoItem { + var ret []DiscoItem + for _, item := range items { + ret = append(ret, DiscoItem{ + Jid: item.Jid, + Name: item.Name, + Node: item.Node, + }) + } + + return ret +} diff --git a/vendor/github.com/matterbridge/go-xmpp/xmpp_information_query.go b/vendor/github.com/matterbridge/go-xmpp/xmpp_information_query.go index 2a699222..15114c9f 100644 --- a/vendor/github.com/matterbridge/go-xmpp/xmpp_information_query.go +++ b/vendor/github.com/matterbridge/go-xmpp/xmpp_information_query.go @@ -10,10 +10,26 @@ const IQTypeSet = "set" const IQTypeResult = "result" func (c *Client) Discovery() (string, error) { - const namespace = "http://jabber.org/protocol/disco#items" // use getCookie for a pseudo random id. reqID := strconv.FormatUint(uint64(getCookie()), 10) - return c.RawInformationQuery(c.jid, c.domain, reqID, IQTypeGet, namespace, "") + return c.RawInformationQuery(c.jid, c.domain, reqID, IQTypeGet, XMPPNS_DISCO_ITEMS, "") +} + +// Discover information about a node +func (c *Client) DiscoverNodeInfo(node string) (string, error) { + query := fmt.Sprintf("<query xmlns='%s' node='%s'/>", XMPPNS_DISCO_INFO, node) + return c.RawInformation(c.jid, c.domain, "info3", IQTypeGet, query) +} + +// Discover items that the server exposes +func (c *Client) DiscoverServerItems() (string, error) { + return c.DiscoverEntityItems(c.domain) +} + +// Discover items that an entity exposes +func (c *Client) DiscoverEntityItems(jid string) (string, error) { + query := fmt.Sprintf("<query xmlns='%s'/>", XMPPNS_DISCO_ITEMS) + return c.RawInformation(c.jid, jid, "info1", IQTypeGet, query) } // RawInformationQuery sends an information query request to the server. |