diff --git a/go.mod b/go.mod index 7ad0d49..abef209 100644 --- a/go.mod +++ b/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 +) diff --git a/go.sum b/go.sum index 62760bb..3ce3f96 100644 --- a/go.sum +++ b/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= diff --git a/main.go b/main.go index 8a30528..075e948 100644 --- a/main.go +++ b/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)*/ }