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)
+}

Reply via email to