aboutsummaryrefslogtreecommitdiff
path: root/xmpp/extensions
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp/extensions')
-rw-r--r--xmpp/extensions/extensions.go213
1 files changed, 213 insertions, 0 deletions
diff --git a/xmpp/extensions/extensions.go b/xmpp/extensions/extensions.go
index fac5e7b..8e2f743 100644
--- a/xmpp/extensions/extensions.go
+++ b/xmpp/extensions/extensions.go
@@ -2,6 +2,7 @@ package extensions
import (
"encoding/xml"
+ "strconv"
"gosrc.io/xmpp/stanza"
)
@@ -111,6 +112,107 @@ type IqVcardDesc struct {
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"`
+}
+
// Namespace is a namespace!
func (c PresenceNickExtension) Namespace() string {
return c.XMLName.Space
@@ -131,6 +233,69 @@ 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
+}
+
+// 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{
@@ -149,4 +314,52 @@ func init() {
"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{})
}