459 lines
11 KiB
Go
459 lines
11 KiB
Go
package extensions
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"strconv"
|
|
|
|
"gosrc.io/xmpp/stanza"
|
|
)
|
|
|
|
// PresenceNickExtension is from XEP-0172
|
|
type PresenceNickExtension struct {
|
|
XMLName xml.Name `xml:"http://jabber.org/protocol/nick nick"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// PresenceXVCardUpdateExtension is from XEP-0153
|
|
type PresenceXVCardUpdateExtension struct {
|
|
XMLName xml.Name `xml:"vcard-temp:x:update x"`
|
|
Photo PresenceXVCardUpdatePhoto
|
|
}
|
|
|
|
// PresenceXVCardUpdatePhoto is from XEP-0153
|
|
type PresenceXVCardUpdatePhoto struct {
|
|
XMLName xml.Name `xml:"photo"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardTemp is from XEP-0054
|
|
type IqVcardTemp struct {
|
|
XMLName xml.Name `xml:"vcard-temp vCard"`
|
|
Fn IqVcardFn
|
|
Nickname IqVcardNickname
|
|
N IqVcardN
|
|
Tel IqVcardTel
|
|
Photo IqVcardPhoto
|
|
Desc IqVcardDesc
|
|
ResultSet *stanza.ResultSet `xml:"set,omitempty"`
|
|
}
|
|
|
|
// IqVcardFn is vCard/FN
|
|
type IqVcardFn struct {
|
|
XMLName xml.Name `xml:"FN"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardNickname is vCard/NICKNAME
|
|
type IqVcardNickname struct {
|
|
XMLName xml.Name `xml:"NICKNAME"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardN is vCard/N
|
|
type IqVcardN struct {
|
|
XMLName xml.Name `xml:"N"`
|
|
Family IqVcardNFamily
|
|
Given IqVcardNGiven
|
|
Middle IqVcardNMiddle
|
|
}
|
|
|
|
// IqVcardNFamily is vCard/N/FAMILY
|
|
type IqVcardNFamily struct {
|
|
XMLName xml.Name `xml:"FAMILY"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardNGiven is vCard/N/GIVEN
|
|
type IqVcardNGiven struct {
|
|
XMLName xml.Name `xml:"GIVEN"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardNMiddle is vCard/N/MIDDLE
|
|
type IqVcardNMiddle struct {
|
|
XMLName xml.Name `xml:"MIDDLE"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardTel is vCard/TEL
|
|
type IqVcardTel struct {
|
|
XMLName xml.Name `xml:"TEL"`
|
|
Number IqVcardTelNumber
|
|
}
|
|
|
|
// IqVcardTelNumber is vCard/TEL/NUMBER
|
|
type IqVcardTelNumber struct {
|
|
XMLName xml.Name `xml:"NUMBER"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardPhoto is vCard/PHOTO
|
|
type IqVcardPhoto struct {
|
|
XMLName xml.Name `xml:"PHOTO"`
|
|
Type IqVcardPhotoType
|
|
Binval IqVcardPhotoBinval
|
|
}
|
|
|
|
// IqVcardPhotoType is vCard/PHOTO/TYPE
|
|
type IqVcardPhotoType struct {
|
|
XMLName xml.Name `xml:"TYPE"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardPhotoBinval is vCard/PHOTO/BINVAL
|
|
type IqVcardPhotoBinval struct {
|
|
XMLName xml.Name `xml:"BINVAL"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// IqVcardDesc is vCard/DESC
|
|
type IqVcardDesc struct {
|
|
XMLName xml.Name `xml:"DESC"`
|
|
Text string `xml:",chardata"`
|
|
}
|
|
|
|
// Reply is from XEP-0461
|
|
type Reply struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:reply:0 reply"`
|
|
To string `xml:"to,attr"`
|
|
Id string `xml:"id,attr"`
|
|
}
|
|
|
|
// Fallback is from XEP-0428
|
|
type Fallback struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:fallback:0 fallback"`
|
|
For string `xml:"for,attr"`
|
|
Body []FallbackBody `xml:"urn:xmpp:fallback:0 body"`
|
|
Subject []FallbackSubject `xml:"urn:xmpp:fallback:0 subject"`
|
|
}
|
|
|
|
// FallbackBody is from XEP-0428
|
|
type FallbackBody struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:fallback:0 body"`
|
|
Start string `xml:"start,attr"`
|
|
End string `xml:"end,attr"`
|
|
}
|
|
|
|
// FallbackSubject is from XEP-0428
|
|
type FallbackSubject struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:fallback:0 subject"`
|
|
Start string `xml:"start,attr"`
|
|
End string `xml:"end,attr"`
|
|
}
|
|
|
|
// CarbonReceived is from XEP-0280
|
|
type CarbonReceived struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:carbons:2 received"`
|
|
Forwarded stanza.Forwarded `xml:"urn:xmpp:forward:0 forwarded"`
|
|
}
|
|
|
|
// CarbonSent is from XEP-0280
|
|
type CarbonSent struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:carbons:2 sent"`
|
|
Forwarded stanza.Forwarded `xml:"urn:xmpp:forward:0 forwarded"`
|
|
}
|
|
|
|
// ComponentPrivilege is from XEP-0356
|
|
type ComponentPrivilege1 struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:privilege:1 privilege"`
|
|
Perms []ComponentPerm `xml:"perm"`
|
|
Forwarded stanza.Forwarded `xml:"urn:xmpp:forward:0 forwarded"`
|
|
}
|
|
|
|
// ComponentPrivilege is from XEP-0356
|
|
type ComponentPrivilege2 struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:privilege:2 privilege"`
|
|
Perms []ComponentPerm `xml:"perm"`
|
|
Forwarded stanza.Forwarded `xml:"urn:xmpp:forward:0 forwarded"`
|
|
}
|
|
|
|
// ComponentPerm is from XEP-0356
|
|
type ComponentPerm struct {
|
|
XMLName xml.Name `xml:"perm"`
|
|
Access string `xml:"access,attr"`
|
|
Type string `xml:"type,attr"`
|
|
Push bool `xml:"push,attr"`
|
|
}
|
|
|
|
// ClientMessage is a jabber:client NS message compatible with Prosody's XEP-0356 implementation
|
|
type ClientMessage struct {
|
|
XMLName xml.Name `xml:"jabber:client message"`
|
|
stanza.Attrs
|
|
|
|
Subject string `xml:"subject,omitempty"`
|
|
Body string `xml:"body,omitempty"`
|
|
Thread string `xml:"thread,omitempty"`
|
|
Error stanza.Err `xml:"error,omitempty"`
|
|
Extensions []stanza.MsgExtension `xml:",omitempty"`
|
|
}
|
|
|
|
// Replace is from XEP-0308
|
|
type Replace struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:message-correct:0 replace"`
|
|
Id string `xml:"id,attr"`
|
|
}
|
|
|
|
// QueryRegister is from XEP-0077
|
|
type QueryRegister struct {
|
|
XMLName xml.Name `xml:"jabber:iq:register query"`
|
|
Instructions string `xml:"instructions"`
|
|
Username string `xml:"username"`
|
|
Registered *QueryRegisterRegistered `xml:"registered"`
|
|
Remove *QueryRegisterRemove `xml:"remove"`
|
|
ResultSet *stanza.ResultSet `xml:"set,omitempty"`
|
|
}
|
|
|
|
// QueryRegisterRegistered is a child element from XEP-0077
|
|
type QueryRegisterRegistered struct {
|
|
XMLName xml.Name `xml:"registered"`
|
|
}
|
|
|
|
// QueryRegisterRemove is a child element from XEP-0077
|
|
type QueryRegisterRemove struct {
|
|
XMLName xml.Name `xml:"remove"`
|
|
}
|
|
|
|
// PresenceXMucUserExtension is from XEP-0045
|
|
type PresenceXMucUserExtension struct {
|
|
XMLName xml.Name `xml:"http://jabber.org/protocol/muc#user x"`
|
|
Item PresenceXMucUserItem
|
|
Statuses []PresenceXMucUserStatus
|
|
}
|
|
|
|
// PresenceXMucUserItem is from XEP-0045
|
|
type PresenceXMucUserItem struct {
|
|
XMLName xml.Name `xml:"item"`
|
|
Affiliation string `xml:"affiliation,attr"`
|
|
Jid string `xml:"jid,attr"`
|
|
Nick string `xml:"nick,attr,omitempty"`
|
|
Role string `xml:"role,attr"`
|
|
}
|
|
|
|
// PresenceXMucUserStatus is from XEP-0045
|
|
type PresenceXMucUserStatus struct {
|
|
XMLName xml.Name `xml:"status"`
|
|
Code uint16 `xml:"code,attr"`
|
|
}
|
|
|
|
// MessageDelay is from XEP-0203
|
|
type MessageDelay struct {
|
|
XMLName xml.Name `xml:"urn:xmpp:delay delay"`
|
|
From string `xml:"from,attr"`
|
|
Stamp string `xml:"stamp,attr"`
|
|
}
|
|
|
|
// MessageDelayLegacy is from XEP-0203
|
|
type MessageDelayLegacy struct {
|
|
XMLName xml.Name `xml:"jabber:x:delay x"`
|
|
From string `xml:"from,attr"`
|
|
Stamp string `xml:"stamp,attr"`
|
|
}
|
|
|
|
// MessageAddresses is from XEP-0033
|
|
type MessageAddresses struct {
|
|
XMLName xml.Name `xml:"http://jabber.org/protocol/address addresses"`
|
|
Addresses []MessageAddress
|
|
}
|
|
|
|
// MessageAddress is from XEP-0033
|
|
type MessageAddress struct {
|
|
XMLName xml.Name `xml:"address"`
|
|
Type string `xml:"type,attr"`
|
|
Jid string `xml:"jid,attr"`
|
|
}
|
|
|
|
// EmptySubject is a dummy for MUCs to circumvent omitempty. Not registered as it would conflict with Subject field
|
|
type EmptySubject struct {
|
|
XMLName xml.Name `xml:"subject"`
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c PresenceNickExtension) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c PresenceXVCardUpdateExtension) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c IqVcardTemp) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// GetSet getsets!
|
|
func (c IqVcardTemp) GetSet() *stanza.ResultSet {
|
|
return c.ResultSet
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c Reply) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c Fallback) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c CarbonReceived) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c CarbonSent) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c ComponentPrivilege1) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c ComponentPrivilege2) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c Replace) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c QueryRegister) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// GetSet getsets!
|
|
func (c QueryRegister) GetSet() *stanza.ResultSet {
|
|
return c.ResultSet
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c PresenceXMucUserExtension) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c MessageDelay) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Namespace is a namespace!
|
|
func (c MessageDelayLegacy) Namespace() string {
|
|
return c.XMLName.Space
|
|
}
|
|
|
|
// Name is a packet name
|
|
func (ClientMessage) Name() string {
|
|
return "message"
|
|
}
|
|
|
|
// NewReplyFallback initializes a fallback range
|
|
func NewReplyFallback(start uint64, end uint64) Fallback {
|
|
return Fallback{
|
|
For: "urn:xmpp:reply:0",
|
|
Body: []FallbackBody{
|
|
FallbackBody{
|
|
Start: strconv.FormatUint(start, 10),
|
|
End: strconv.FormatUint(end, 10),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func init() {
|
|
// presence nick
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTPresence, xml.Name{
|
|
"http://jabber.org/protocol/nick",
|
|
"nick",
|
|
}, PresenceNickExtension{})
|
|
|
|
// presence vcard update
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTPresence, xml.Name{
|
|
"vcard-temp:x:update",
|
|
"x",
|
|
}, PresenceXVCardUpdateExtension{})
|
|
|
|
// iq vcard request
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTIQ, xml.Name{
|
|
"vcard-temp",
|
|
"vCard",
|
|
}, IqVcardTemp{})
|
|
|
|
// reply
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"urn:xmpp:reply:0",
|
|
"reply",
|
|
}, Reply{})
|
|
|
|
// fallback
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"urn:xmpp:fallback:0",
|
|
"fallback",
|
|
}, Fallback{})
|
|
|
|
// carbon received
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"urn:xmpp:carbons:2",
|
|
"received",
|
|
}, CarbonReceived{})
|
|
|
|
// carbon sent
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"urn:xmpp:carbons:2",
|
|
"sent",
|
|
}, CarbonSent{})
|
|
|
|
// component privilege v1
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"urn:xmpp:privilege:1",
|
|
"privilege",
|
|
}, ComponentPrivilege1{})
|
|
|
|
// component privilege v2
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"urn:xmpp:privilege:2",
|
|
"privilege",
|
|
}, ComponentPrivilege2{})
|
|
|
|
// message edit
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"urn:xmpp:message-correct:0",
|
|
"replace",
|
|
}, Replace{})
|
|
|
|
// register query
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTIQ, xml.Name{
|
|
"jabber:iq:register",
|
|
"query",
|
|
}, QueryRegister{})
|
|
|
|
// presence muc user
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTPresence, xml.Name{
|
|
"http://jabber.org/protocol/muc#user",
|
|
"x",
|
|
}, PresenceXMucUserExtension{})
|
|
|
|
// message delay
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"urn:xmpp:delay",
|
|
"delay",
|
|
}, MessageDelay{})
|
|
|
|
// legacy message delay
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"jabber:x:delay",
|
|
"x",
|
|
}, MessageDelayLegacy{})
|
|
|
|
// message addresses
|
|
stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
|
|
"http://jabber.org/protocol/address",
|
|
"addresses",
|
|
}, MessageAddresses{})
|
|
}
|