2017-12-17 13:31:02 +01:00
|
|
|
package extension
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/xml"
|
|
|
|
|
|
|
|
"github.com/genofire/yaja/messages"
|
|
|
|
"github.com/genofire/yaja/server/utils"
|
|
|
|
)
|
|
|
|
|
2017-12-17 15:39:36 +01:00
|
|
|
type IQExtensionDiscovery struct {
|
2017-12-17 13:31:02 +01:00
|
|
|
IQExtension
|
|
|
|
GetSpaces func() []string
|
|
|
|
}
|
|
|
|
|
2017-12-17 15:39:36 +01:00
|
|
|
func (ex *IQExtensionDiscovery) Spaces() []string { return []string{} }
|
2017-12-17 13:31:02 +01:00
|
|
|
|
2017-12-17 15:39:36 +01:00
|
|
|
func (ex *IQExtensionDiscovery) Get(msg *messages.IQ, client *utils.Client) bool {
|
2017-12-17 13:31:02 +01:00
|
|
|
log := client.Log.WithField("extension", "roster").WithField("id", msg.ID)
|
|
|
|
|
|
|
|
// query encode
|
|
|
|
type query struct {
|
|
|
|
XMLName xml.Name `xml:"http://jabber.org/protocol/disco#info query"`
|
|
|
|
Body []byte `xml:",innerxml"`
|
|
|
|
}
|
|
|
|
q := &query{}
|
2017-12-17 17:50:51 +01:00
|
|
|
if err := xml.Unmarshal(msg.Body, q); err != nil {
|
2017-12-17 13:31:02 +01:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// answer query
|
|
|
|
q.Body = []byte{}
|
|
|
|
|
|
|
|
// build answer body
|
|
|
|
type feature struct {
|
|
|
|
XMLName xml.Name `xml:"feature"`
|
|
|
|
Var string `xml:"var,attr"`
|
|
|
|
}
|
|
|
|
for _, namespace := range ex.GetSpaces() {
|
|
|
|
if namespace == "" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
itemByte, err := xml.Marshal(&feature{
|
|
|
|
Var: namespace,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
log.Warn(err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
q.Body = append(q.Body, itemByte...)
|
|
|
|
}
|
|
|
|
|
|
|
|
// decode query
|
|
|
|
queryByte, err := xml.Marshal(q)
|
|
|
|
if err != nil {
|
|
|
|
log.Warn(err)
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// replay
|
2017-12-17 15:39:36 +01:00
|
|
|
client.Messages <- &messages.IQ{
|
2017-12-17 13:31:02 +01:00
|
|
|
Type: messages.IQTypeResult,
|
|
|
|
To: client.JID.String(),
|
|
|
|
From: client.JID.Domain,
|
|
|
|
ID: msg.ID,
|
|
|
|
Body: queryByte,
|
2017-12-17 15:39:36 +01:00
|
|
|
}
|
2017-12-17 13:31:02 +01:00
|
|
|
|
|
|
|
log.Debug("send")
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|