aboutsummaryrefslogblamecommitdiff
path: root/xmpp/extensions/extensions.go
blob: 78de47d4c0cc8c22ba0e90ecda8c723c68a50ff5 (plain) (tree)
1
2
3
4
5
                  


                      
                 





















                                                                     

                               





                                                   
                             
                                                         






































































                                           





                                          






                                                       

                            



                                                                      



                                
                                                         





                                           
                                                            



                                           






































                                                                                                









                                                           




                                         
                  



                                                 




                                   




                                      



















                                                






                                                                     
                                                                   




                          











                                                                      





                                                                





                                                                     





                                                                     

















                                                                     
 
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 ComponentPrivilege struct {
	XMLName   xml.Name         `xml:"urn:xmpp:privilege:1 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"`
}

// 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 ComponentPrivilege) 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
	stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{
		"urn:xmpp:privilege:1",
		"privilege",
	}, ComponentPrivilege{})
}