Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package xmpp-dns for openSUSE:Factory checked in at 2024-08-22 18:10:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xmpp-dns (Old) and /work/SRC/openSUSE:Factory/.xmpp-dns.new.2698 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xmpp-dns" Thu Aug 22 18:10:46 2024 rev:13 rq:1194991 version:0.4.1 Changes: -------- --- /work/SRC/openSUSE:Factory/xmpp-dns/xmpp-dns.changes 2024-08-19 23:45:21.717781395 +0200 +++ /work/SRC/openSUSE:Factory/.xmpp-dns.new.2698/xmpp-dns.changes 2024-08-22 18:11:13.680563161 +0200 @@ -1,0 +2,8 @@ +Wed Aug 21 06:00:12 UTC 2024 - Michael Vetter <mvet...@suse.com> + +- Update to 0.4.1: + * Also check connection to BOSH endpoints. + * Add more verbose version information to --version (requires xmppsrv >= 0.3.2). + * Also respect custom resolver setting for host-meta(2) (via xmppsrv 0.3.1). + +------------------------------------------------------------------- Old: ---- xmpp-dns-0.4.0.tar.gz New: ---- xmpp-dns-0.4.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xmpp-dns.spec ++++++ --- /var/tmp/diff_new_pack.E9Xlzl/_old 2024-08-22 18:11:14.128581768 +0200 +++ /var/tmp/diff_new_pack.E9Xlzl/_new 2024-08-22 18:11:14.132581933 +0200 @@ -17,7 +17,7 @@ Name: xmpp-dns -Version: 0.4.0 +Version: 0.4.1 Release: 0 Summary: A CLI tool to check XMPP SRV records License: BSD-2-Clause ++++++ _service ++++++ --- /var/tmp/diff_new_pack.E9Xlzl/_old 2024-08-22 18:11:14.160583097 +0200 +++ /var/tmp/diff_new_pack.E9Xlzl/_new 2024-08-22 18:11:14.164583262 +0200 @@ -3,7 +3,7 @@ <param name="url">https://salsa.debian.org/mdosch/xmpp-dns.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.4.0</param> + <param name="revision">v0.4.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">disable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ vendor.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/modules.txt new/vendor/modules.txt --- old/vendor/modules.txt 2024-08-19 07:51:29.000000000 +0200 +++ new/vendor/modules.txt 2024-08-21 08:00:07.000000000 +0200 @@ -4,6 +4,6 @@ # golang.org/x/net v0.28.0 ## explicit golang.org/x/net/websocket -# salsa.debian.org/mdosch/xmppsrv v0.2.6 +# salsa.debian.org/mdosch/xmppsrv v0.3.2 ## explicit salsa.debian.org/mdosch/xmppsrv diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/salsa.debian.org/mdosch/xmppsrv/CHANGELOG.md new/vendor/salsa.debian.org/mdosch/xmppsrv/CHANGELOG.md --- old/vendor/salsa.debian.org/mdosch/xmppsrv/CHANGELOG.md 2024-08-19 07:51:29.000000000 +0200 +++ new/vendor/salsa.debian.org/mdosch/xmppsrv/CHANGELOG.md 2024-08-21 08:00:07.000000000 +0200 @@ -1,5 +1,15 @@ # Changelog +## [0.3.2] 2024-08-20 +## Added +- Add constant including version. + +## [0.3.1] 2024-08-18 +- Create a new release as v0.3.0 missed the fix from v0.2.6. + +## [0.3.0] 2024-08-18 +- Add function to request IP addresses using the custom resolvers. + ## [0.2.6] 2024-01-19 ### Changed - Don't return an error if either of the xmpp or xmpps look ups returns a result. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/salsa.debian.org/mdosch/xmppsrv/xmppsrv.go new/vendor/salsa.debian.org/mdosch/xmppsrv/xmppsrv.go --- old/vendor/salsa.debian.org/mdosch/xmppsrv/xmppsrv.go 2024-08-19 07:51:29.000000000 +0200 +++ new/vendor/salsa.debian.org/mdosch/xmppsrv/xmppsrv.go 2024-08-21 08:00:07.000000000 +0200 @@ -16,6 +16,8 @@ "time" ) +const Version = "0.3.2" + // The Config type is used to configure which resolver is used. // Set Resolver to an IP address and DoT to false to use the // DNS resolver on port 53 on the given IP address. @@ -140,8 +142,50 @@ return cname, errors.New("CNAME loop detected") } -func getSRVDoT(server string, srvType string, - resolver string, +func getIPDoT(server string, resolver string) ([]net.IP, error) { + var err error + var d tls.Dialer + var addr []net.IP + s := strings.Split(resolver, "#") + if len(s) != 2 { + return addr, errors.New("wrong DoT server syntax") + } + ip := net.ParseIP(s[0]) + if ip == nil { + return addr, errors.New("invalid resolver IP") + } + dnsServer := net.JoinHostPort(s[0], "853") + d.Config = &tls.Config{ + ServerName: s[1], + } + r := &net.Resolver{ + Dial: func(cont context.Context, network, address string) (net.Conn, error) { + return d.DialContext(cont, "tcp", dnsServer) + }, + } + addr, err = r.LookupIP(context.Background(), "ip", server) + return addr, err +} + +func getIPCustomResolver(server string, resolver string) ([]net.IP, error) { + var addr []net.IP + var err error + var d net.Dialer + ip := net.ParseIP(resolver) + if ip == nil { + return addr, errors.New("invalid resolver IP") + } + dnsServer := net.JoinHostPort(resolver, "53") + r := &net.Resolver{ + Dial: func(cont context.Context, network, address string) (net.Conn, error) { + return d.DialContext(cont, "tcp", dnsServer) + }, + } + addr, err = r.LookupIP(context.Background(), "ip", server) + return addr, err +} + +func getSRVDoT(server string, srvType string, resolver string, ) ([]SRV, error) { var records []SRV var err error @@ -179,8 +223,7 @@ return records, err } -func getSRVCustomResolver(server string, srvType string, - resolver string, +func getSRVCustomResolver(server string, srvType string, resolver string, ) ([]SRV, error) { var records []SRV var err error @@ -239,6 +282,24 @@ return records, err } +// GetIP returns the IP records for a given domain. +func (c *Config) GetIP(server string) ([]net.IP, error) { + var addr []net.IP + var err error + // Look up IPs + switch { + case c.Resolver == "": + addr, err = net.LookupIP(server) + case c.Resolver != "" && !c.DoT: + addr, err = getIPCustomResolver(server, c.Resolver) + case c.Resolver != "" && c.DoT: + addr, err = getIPDoT(server, c.Resolver) + default: + return addr, errors.New("xmppsrv: invalid resolver setting") + } + return addr, err +} + // LookupXmppServer returns the xmpp-server SRV records. func (c *Config) LookupXmppServer(server string) ([]SRV, error) { var records []SRV ++++++ xmpp-dns-0.4.0.tar.gz -> xmpp-dns-0.4.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmpp-dns-0.4.0/CHANGELOG.md new/xmpp-dns-0.4.1/CHANGELOG.md --- old/xmpp-dns-0.4.0/CHANGELOG.md 2024-08-18 12:32:15.000000000 +0200 +++ new/xmpp-dns-0.4.1/CHANGELOG.md 2024-08-20 21:09:06.000000000 +0200 @@ -1,5 +1,13 @@ # Changelog +## [0.4.1] 2024-08-20 +### Added +- Also check connection to BOSH endpoints. +- Add more verbose version information to `--version` (requires xmppsrv >= 0.3.2). + +### Changed +- Also respect custom resolver setting for host-meta(2) (via xmppsrv 0.3.1). + ## [0.4.0] 2024-08-18 ### Added - Support for XEP-0487 (Host Meta 2). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmpp-dns-0.4.0/go.mod new/xmpp-dns-0.4.1/go.mod --- old/xmpp-dns-0.4.0/go.mod 2024-08-18 12:32:15.000000000 +0200 +++ new/xmpp-dns-0.4.1/go.mod 2024-08-20 21:09:06.000000000 +0200 @@ -5,5 +5,5 @@ require ( github.com/pborman/getopt/v2 v2.1.0 golang.org/x/net v0.28.0 - salsa.debian.org/mdosch/xmppsrv v0.2.6 + salsa.debian.org/mdosch/xmppsrv v0.3.2 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmpp-dns-0.4.0/go.sum new/xmpp-dns-0.4.1/go.sum --- old/xmpp-dns-0.4.0/go.sum 2024-08-18 12:32:15.000000000 +0200 +++ new/xmpp-dns-0.4.1/go.sum 2024-08-20 21:09:06.000000000 +0200 @@ -66,5 +66,5 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -salsa.debian.org/mdosch/xmppsrv v0.2.6 h1:+S7ZxRP7BQwQHGJvYhr408UD0XGAd7+RZaVA/xN4EIc= -salsa.debian.org/mdosch/xmppsrv v0.2.6/go.mod h1:udWXnWFa9zkcyN9YSB/u44BCnnRDpeQ0eDy3MVLjHZQ= +salsa.debian.org/mdosch/xmppsrv v0.3.2 h1:c83iqkp/GnsPYqQ12dTw8MQBzI+Dtw9mQOFSuL3GjaQ= +salsa.debian.org/mdosch/xmppsrv v0.3.2/go.mod h1:udWXnWFa9zkcyN9YSB/u44BCnnRDpeQ0eDy3MVLjHZQ= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmpp-dns-0.4.0/main.go new/xmpp-dns-0.4.1/main.go --- old/xmpp-dns-0.4.0/main.go 2024-08-18 12:32:15.000000000 +0200 +++ new/xmpp-dns-0.4.1/main.go 2024-08-20 21:09:06.000000000 +0200 @@ -5,13 +5,16 @@ package main import ( + "bytes" "context" + "crypto/rand" "crypto/tls" "encoding/json" "encoding/xml" "fmt" "io" "log" + "math/big" "net" "net/http" "net/url" @@ -26,9 +29,12 @@ ) const ( - version = "0.4.0" - nsWebsocket = "urn:xmpp:alt-connections:websocket" - nsBOSH = "urn:xmpp:alt-connections:xbosh" + version = "0.4.1" + nsBOSH = "urn:xmpp:alt-connections:xbosh" + nsHTTPBind = "http://jabber.org/protocol/httpbind" + nsStartTLS = "urn:ietf:params:xml:ns:xmpp-tls" + nsWebsocket = "urn:xmpp:alt-connections:websocket" + nsXMPPFraming = "urn:ietf:params:xml:ns:xmpp-framing" ) // Created with https://github.com/miku/zek @@ -55,9 +61,9 @@ var ( // statusOK will print [OK] in green color. - statusOK = "[\033[32mOK\033[00m]" + statusOK = "Test: [\033[32mOK\033[00m]" // statusNOK will print [Not OK] in red color. - statusNOK = "[\033[31mNot OK\033[00m]" + statusNOK = "Test: [\033[31mNot OK\033[00m]" ) func main() { @@ -91,14 +97,17 @@ // If requested, show version and quit. if *flagVersion { - fmt.Println("xmpp-dns", version) + fmt.Println("Xmpp-dns", version) + fmt.Println("Xmppsrv library version:", xmppsrv.Version) + system := runtime.GOOS + "/" + runtime.GOARCH + fmt.Println("System:", system, runtime.Version()) fmt.Println("License: BSD-2-clause") os.Exit(0) } if *flagNoColor || runtime.GOOS == "windows" { - statusOK = "[OK]" - statusNOK = "[Not OK]" + statusOK = "Test: [OK]" + statusNOK = "Test: [Not OK]" } // If connection test is required we'll also show IPs. @@ -186,7 +195,7 @@ &tlsConfig, timeout) checkHostmeta(server[0], *flagVerbose, *flagV4, - *flagV6, *flagTest, &tlsConfig, timeout) + *flagV6, *flagTest, &tlsConfig, timeout, c) } if *flagServer { @@ -287,7 +296,7 @@ func connectionTest(server string, transport string, timeout time.Duration) (net.Conn, error) { c, err := net.DialTimeout(transport, server, timeout) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return c, err } @@ -323,7 +332,7 @@ tlsConfig.ServerName + "' version='1.0'>" _, err := c.Write([]byte(startStream)) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } @@ -339,7 +348,7 @@ case <-ctx.Done(): return default: - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) if err.Error() == "EOF" { err = xml.Unmarshal(buf, &serverStreamError) if err == nil { @@ -362,28 +371,28 @@ case <-time.After(timeout): } if buf == nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Timeout while waiting for server reply.") cancel() return } _ = xml.Unmarshal(buf, &serverFailure) if serverFailure.XMLName.Local == "failure" { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Server sent failure.") return } - _, err = c.Write([]byte("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>")) + _, err = c.Write([]byte(fmt.Sprintf("<starttls xmlns='%s'/>", nsStartTLS))) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } for !(serverProceed.XMLName.Local == "proceed" && - serverProceed.Xmlns == "urn:ietf:params:xml:ns:xmpp-tls") { + serverProceed.Xmlns == nsStartTLS) { _, err = c.Read(buf) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) if err.Error() == "EOF" { err = xml.Unmarshal(buf, &serverStreamError) if err == nil { @@ -401,7 +410,7 @@ _ = xml.Unmarshal(buf, &serverProceed) _ = xml.Unmarshal(buf, &serverFailure) if serverFailure.XMLName.Local == "failure" { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Server sent failure.") return } @@ -413,13 +422,13 @@ if err != nil { switch err.Error() { case "EOF": - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Server closed connection during handshake.") case "context deadline exceeded": - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Timeout during handshake.") default: - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) } } else { @@ -438,13 +447,13 @@ if err != nil { switch err.Error() { case "EOF": - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Server closed connection during handshake.") case "context deadline exceeded": - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Timeout during handshake.") default: - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) } } else { @@ -459,7 +468,7 @@ tlsConfig.ServerName + "' version='1.0'>" _, err := c.Write([]byte(startStream)) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } @@ -470,7 +479,7 @@ for { _, err = c.Read(buf) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) if err.Error() == "EOF" { err = xml.Unmarshal(buf, &serverStreamError) if err == nil { @@ -501,13 +510,13 @@ select { case <-ctx3.Done(): case <-time.After(timeout): - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Timeout during XMPP stream negotiation.") } } } -func checkHostmeta(server string, verbose bool, ipv4 bool, ipv6 bool, test bool, tlsConfig *tls.Config, timeout time.Duration) { +func checkHostmeta(server string, verbose bool, ipv4 bool, ipv6 bool, test bool, tlsConfig *tls.Config, timeout time.Duration, dnsConfig xmppsrv.Config) { type hostmetaXML struct { XMLName xml.Name `xml:"XRD"` Text string `xml:",chardata"` @@ -526,32 +535,15 @@ } var hostmeta hostmetaXML - var connType string - switch { - case ipv4: - connType = "tcp4" - case ipv6: - connType = "tcp6" - default: - connType = "tcp" - } - httpTLSConfig := &tls.Config{ - MinVersion: tlsConfig.MinVersion, - ServerName: server, - InsecureSkipVerify: false, - } - httpTransport := &http.Transport{ - DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { - return net.Dial(connType, net.JoinHostPort(server, "443")) - }, - IdleConnTimeout: timeout, - TLSClientConfig: httpTLSConfig, - TLSHandshakeTimeout: timeout, + + httpClient, err := getHTTPClient(server, "443", ipv4, ipv6, timeout, tlsConfig, dnsConfig) + if err != nil { + fmt.Printf("\nHost-meta: failed to create HTTP client: %v\n", err) + return } - httpClient := &http.Client{Transport: httpTransport} resp, err := httpClient.Get("https://" + server + "/.well-known/host-meta") if err != nil { - fmt.Printf("Host-meta: failed to request host-meta file: %v\n", err) + fmt.Printf("\nHost-meta: failed to request host-meta file: %v\n", err) return } if resp.StatusCode == 404 { @@ -577,7 +569,8 @@ case nsBOSH: fmt.Println("BOSH:", link.Href) if test { - fmt.Println("Testing BOSH is currently not supported.") + checkBOSH(server, link.Href, ipv4, ipv6, tlsConfig, + dnsConfig, timeout) } } } @@ -610,12 +603,105 @@ case nsBOSH: fmt.Println("BOSH:", link.Href) if test { - fmt.Println("Testing BOSH is currently not supported.") + checkBOSH(server, link.Href, ipv4, ipv6, tlsConfig, + dnsConfig, timeout) } } } } +func checkBOSH(server string, target string, ipv4 bool, ipv6 bool, tlsConfig *tls.Config, + srvConfig xmppsrv.Config, timeout time.Duration, +) { + type boshFailXML struct { + XMLName xml.Name `xml:"body"` + Text string `xml:",chardata"` + Type string `xml:"type,attr"` + Condition string `xml:"condition,attr"` + Xmlns string `xml:"xmlns,attr"` + Stream string `xml:"stream,attr"` + } + type boshOpenXML struct { + XMLName xml.Name `xml:"body"` + Text string `xml:",chardata"` + Wait string `xml:"wait,attr"` + Inactivity string `xml:"inactivity,attr"` + Polling string `xml:"polling,attr"` + Requests string `xml:"requests,attr"` + Hold string `xml:"hold,attr"` + Ack string `xml:"ack,attr"` + Accept string `xml:"accept,attr"` + Maxpause string `xml:"maxpause,attr"` + Sid string `xml:"sid,attr"` + Charsets string `xml:"charsets,attr"` + Ver string `xml:"ver,attr"` + From string `xml:"from,attr"` + Xmlns string `xml:"xmlns,attr"` + } + + var boshFail boshFailXML + var boshOpen boshOpenXML + + boshURI, err := url.ParseRequestURI(target) + if err != nil { + fmt.Println(statusNOK) + fmt.Println(err) + return + } + bodyXML := `<body content='text/xml; charset=utf-8' hold='1' rid='` + getID() + + `' to='` + server + `' ver='1.6' wait='` + + fmt.Sprintf("%.0f", timeout.Seconds()) + + `' ack='1' xml:lang='en' xmlns='` + nsHTTPBind + `'/>` + body := []byte(bodyXML) + req, err := http.NewRequest("POST", target, bytes.NewBuffer(body)) + if err != nil { + fmt.Println(statusNOK) + fmt.Println(err) + return + } + httpClient, err := getHTTPClient(boshURI.Hostname(), boshURI.Port(), ipv4, ipv6, timeout, tlsConfig, srvConfig) + if err != nil { + fmt.Println(statusNOK) + fmt.Println(err) + return + } + resp, err := httpClient.Do(req) + if err != nil { + fmt.Println(statusNOK) + fmt.Println(err) + return + } + defer resp.Body.Close() + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return + } + err = xml.Unmarshal(respBody, &boshFail) + if err != nil { + fmt.Println(statusNOK) + fmt.Println(err) + return + } + if boshFail.Type == "terminate" { + fmt.Println(statusNOK) + fmt.Printf("Server terminated: %s\n", boshFail.Condition) + return + } + err = xml.Unmarshal(respBody, &boshOpen) + if err != nil { + fmt.Println(statusNOK) + fmt.Println(err) + return + } + if boshOpen.From != server { + fmt.Println(statusNOK) + fmt.Printf("Server identifies as %s instead of %s.\n", + boshOpen.From, server) + return + } + fmt.Println(statusOK) +} + func checkWebSocket(server string, target string, tlsConfig *tls.Config, timeout time.Duration) { type wsOpenXML struct { XMLName xml.Name `xml:"open"` @@ -629,13 +715,13 @@ var wsOpen wsOpenXML wsURI, err := url.ParseRequestURI(target) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } origURI, err := url.ParseRequestURI("https://" + server) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } @@ -644,70 +730,118 @@ ServerName: server, InsecureSkipVerify: false, } - wsConf := &websocket.Config{ + wsConfig := &websocket.Config{ Location: wsURI, Origin: origURI, Version: 13, TlsConfig: wsTLSConfig, } - wsConf.Protocol = append(wsConf.Protocol, "xmpp") + wsConfig.Protocol = append(wsConfig.Protocol, "xmpp") ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - wsConn, err := wsConf.DialContext(ctx) + wsConn, err := wsConfig.DialContext(ctx) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } _, err = wsConn.Write([]byte(fmt.Sprintf( - `<open xmlns="urn:ietf:params:xml:ns:xmpp-framing" to="%s" version="1.0" />`, server))) + `<open xmlns="%s" to="%s" version="1.0" />`, nsXMPPFraming, server))) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } buf := make([]byte, 4096) _, err = wsConn.Read(buf) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } err = xml.Unmarshal(buf, &wsOpen) if err != nil { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println(err) return } if wsOpen.From != server { _ = wsConn.Close() - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Printf("Server identifies as %s instead of %s.\n", wsOpen.From, server) return } else { if !wsConn.IsClientConn() { _ = wsConn.Close() - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("WS connection is no client connection.") return } } - fmt.Println("Test:", statusOK) + fmt.Println(statusOK) err = wsConn.Close() if err != nil { fmt.Println(err) } } +func getHTTPClient(server string, port string, ipv4 bool, ipv6 bool, timeout time.Duration, + tlsConfig *tls.Config, dnsConfig xmppsrv.Config, +) (*http.Client, error) { + var ipAddr, connType string + addresses, err := dnsConfig.GetIP(server) + switch { + case err != nil: + return &http.Client{}, fmt.Errorf("no IP addresses found for %s: %v", server, err) + case len(addresses) == 0: + return &http.Client{}, fmt.Errorf("no IP addresses found for %s", server) + default: + addresses = removeDuplicates(addresses) + connType = "tcp" + for _, address := range addresses { + if (address.To4() != nil) && ipv4 { + connType = "tcp4" + ipAddr = address.To4().String() + } + if (address.To4() == nil) && ipv6 { + connType = "tcp6" + ipAddr = address.To16().String() + } + } + } + httpTLSConfig := &tls.Config{ + MinVersion: tlsConfig.MinVersion, + ServerName: server, + InsecureSkipVerify: false, + } + if port == "" { + port = "443" + } + target := net.JoinHostPort(ipAddr, port) + httpTransport := &http.Transport{ + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + dialer := net.Dialer{} + ctx2, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + return dialer.DialContext(ctx2, connType, target) + }, + IdleConnTimeout: timeout, + TLSClientConfig: httpTLSConfig, + TLSHandshakeTimeout: timeout, + } + httpClient := &http.Client{Transport: httpTransport} + return httpClient, nil +} + func checkCertExpiry(c *tls.Conn) { expiry := c.ConnectionState().PeerCertificates[0].NotAfter start := c.ConnectionState().PeerCertificates[0].NotBefore now := time.Now() if now.Before(expiry) && now.After(start) { - fmt.Println("Test:", statusOK) + fmt.Println(statusOK) } else { - fmt.Println("Test:", statusNOK) + fmt.Println(statusNOK) fmt.Println("Valid from", start, "to", expiry) } } @@ -730,3 +864,17 @@ } return false } + +func getID() string { + idRunes := []rune("0123456789") + max := big.NewInt(int64(len(idRunes))) + id := make([]rune, 10) + for i := range id { + randInt, err := rand.Int(rand.Reader, max) + if err != nil { + log.Fatal(err) + } + id[i] = idRunes[randInt.Int64()] + } + return string(id) +}