kopia lustrzana https://github.com/tmsmr/xmpp-webhook
first tests with mellium-xmpp (WiP)
rodzic
c5c3ff5b37
commit
65d4efe5da
7
go.mod
7
go.mod
|
@ -1,3 +1,8 @@
|
|||
module github.com/opthomas-prime/xmpp-webhook
|
||||
|
||||
require github.com/emgee/go-xmpp v0.0.0-20170414153234-efce8dbb9711
|
||||
require (
|
||||
github.com/emgee/go-xmpp v0.0.0-20170414153234-efce8dbb9711
|
||||
mellium.im/sasl v0.2.1
|
||||
mellium.im/xmlstream v0.13.5
|
||||
mellium.im/xmpp v0.13.0
|
||||
)
|
||||
|
|
22
go.sum
22
go.sum
|
@ -1,2 +1,24 @@
|
|||
github.com/emgee/go-xmpp v0.0.0-20170414153234-efce8dbb9711 h1:BsL4akklVz02bS/nknhPwjwqtOyLjq3ZqUJT+IlqYgE=
|
||||
github.com/emgee/go-xmpp v0.0.0-20170414153234-efce8dbb9711/go.mod h1:MM5R8Ii02ZFUaKj/z80DmESVPuCGJEqdOcGue7NwRmw=
|
||||
golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
|
||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/image v0.0.0-20181116024801-cd38e8056d9b/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk=
|
||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
mellium.im/reader v0.1.0 h1:UUEMev16gdvaxxZC7fC08j7IzuDKh310nB6BlwnxTww=
|
||||
mellium.im/reader v0.1.0/go.mod h1:F+X5HXpkIfJ9EE1zHQG9lM/hO946iYAmU7xjg5dsQHI=
|
||||
mellium.im/sasl v0.2.1 h1:nspKSRg7/SyO0cRGY71OkfHab8tf9kCts6a6oTDut0w=
|
||||
mellium.im/sasl v0.2.1/go.mod h1:ROaEDLQNuf9vjKqE1SrAfnsobm2YKXT1gnN1uDp1PjQ=
|
||||
mellium.im/xmlstream v0.13.5 h1:Y3OBsAT3a5G2B9gEv7ia3SSaLykwFB9SWvRuwd+Fplw=
|
||||
mellium.im/xmlstream v0.13.5/go.mod h1:O7wqreSmFi1LOh4RiK7r2j4H4pYDgzo1qv5ZkYJZ7Ns=
|
||||
mellium.im/xmpp v0.13.0 h1:oYZKgkGOWIn+v9RNL/EHkk1KaDRLQDEQEVAHDFynNRA=
|
||||
mellium.im/xmpp v0.13.0/go.mod h1:ypSrEi/KFrDk9fu4JpQ8HKPFtlkVrhYCk1aObOMAof0=
|
||||
|
|
98
main.go
98
main.go
|
@ -1,41 +1,53 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"net/http"
|
||||
"mellium.im/sasl"
|
||||
"mellium.im/xmpp"
|
||||
"mellium.im/xmpp/dial"
|
||||
mjid "mellium.im/xmpp/jid"
|
||||
"mellium.im/xmpp/stanza"
|
||||
"net"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/emgee/go-xmpp/src/xmpp"
|
||||
)
|
||||
|
||||
// starts xmpp session and returns the xmpp client
|
||||
func xmppLogin(id string, pass string) (*xmpp.XMPP, error) {
|
||||
// parse jid structure
|
||||
jid, err := xmpp.ParseJID(id)
|
||||
func panicOnErr(err error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// extract/generate address:port from jid
|
||||
addr, err := xmpp.HomeServerAddrs(jid)
|
||||
if err != nil {
|
||||
func initXMPP(jid mjid.JID, pass string) (*xmpp.Session, error) {
|
||||
dialer := dial.Dialer{}
|
||||
conn, err := dialer.Dial(context.TODO(), "tcp", jid)
|
||||
switch err.(type) {
|
||||
default:
|
||||
return nil, err
|
||||
case *net.DNSError:
|
||||
dialer = dial.Dialer{NoLookup: true, NoTLS: true}
|
||||
conn, err = dialer.Dial(context.TODO(), "tcp", jid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return xmpp.NegotiateSession(
|
||||
context.TODO(),
|
||||
jid.Domain(),
|
||||
jid,
|
||||
conn,
|
||||
false,
|
||||
xmpp.NewNegotiator(xmpp.StreamConfig{Features: []xmpp.StreamFeature{
|
||||
xmpp.BindResource(),
|
||||
xmpp.StartTLS(true, nil),
|
||||
xmpp.SASL("", pass, sasl.ScramSha1Plus, sasl.ScramSha1, sasl.Plain),
|
||||
}}),
|
||||
)
|
||||
}
|
||||
|
||||
// create xml stream to address
|
||||
stream, err := xmpp.NewStream(addr[0], nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// create client (login)
|
||||
client, err := xmpp.NewClientXMPP(stream, jid, pass, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return client, nil
|
||||
func closeXMPP(session *xmpp.Session) {
|
||||
session.Close()
|
||||
session.Conn().Close()
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
@ -49,33 +61,19 @@ func main() {
|
|||
log.Fatal("XMPP_ID, XMPP_PASS or XMPP_RECEIVERS not set")
|
||||
}
|
||||
|
||||
// connect to xmpp server
|
||||
xc, err := xmppLogin(xi, xp)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
jid, err := mjid.Parse(xi)
|
||||
panicOnErr(err)
|
||||
|
||||
// announce initial presence
|
||||
xc.Out <- xmpp.Presence{}
|
||||
session, err := initXMPP(jid, xp)
|
||||
panicOnErr(err)
|
||||
|
||||
// listen for incoming xmpp stanzas
|
||||
go func() {
|
||||
for stanza := range xc.In {
|
||||
// check if stanza is a message
|
||||
m, ok := stanza.(*xmpp.Message)
|
||||
if ok && len(m.Body) > 0 {
|
||||
// echo the message
|
||||
xc.Out <- xmpp.Message{
|
||||
To: m.From,
|
||||
Body: m.Body,
|
||||
}
|
||||
}
|
||||
}
|
||||
// xc.In is closed when the server closes the stream
|
||||
log.Fatal("connection lost")
|
||||
}()
|
||||
defer closeXMPP(session)
|
||||
|
||||
// create chan for messages (webhooks -> xmpp)
|
||||
panicOnErr(session.Send(context.TODO(), stanza.WrapPresence(mjid.JID{}, stanza.AvailablePresence, nil)))
|
||||
|
||||
panicOnErr(session.Serve(nil))
|
||||
|
||||
/*// create chan for messages (webhooks -> xmpp)
|
||||
messages := make(chan string)
|
||||
|
||||
// wait for messages from the webhooks and send them to all receivers
|
||||
|
@ -98,5 +96,5 @@ func main() {
|
|||
http.Handle("/grafana", newMessageHandler(messages, grafanaParserFunc))
|
||||
|
||||
// listen for requests
|
||||
http.ListenAndServe(":4321", nil)
|
||||
http.ListenAndServe(":4321", nil)*/
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue