diff --git a/go.mod b/go.mod index 2a5e03ed5..61148cfb7 100644 --- a/go.mod +++ b/go.mod @@ -15,8 +15,7 @@ require ( require ( github.com/mattermost/logr/v2 v2.0.15 github.com/mattermost/mattermost-plugin-api v0.0.27 - github.com/mattermost/rtcd v0.4.0 - github.com/pion/stun v0.3.5 + github.com/mattermost/rtcd v0.4.1-0.20220510065451-52a5335634f5 github.com/rudderlabs/analytics-go v3.3.2+incompatible golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 ) @@ -73,6 +72,7 @@ require ( github.com/pion/sctp v1.8.2 // indirect github.com/pion/sdp/v3 v3.0.4 // indirect github.com/pion/srtp/v2 v2.0.6-0.20211031173006-1d7627ee3ca0 // indirect + github.com/pion/stun v0.3.5 // indirect github.com/pion/transport v0.13.0 // indirect github.com/pion/turn/v2 v2.0.8 // indirect github.com/pion/udp v0.1.1 // indirect diff --git a/go.sum b/go.sum index 54724f75e..5e195cc75 100644 --- a/go.sum +++ b/go.sum @@ -974,8 +974,8 @@ github.com/mattermost/mattermost-server/v6 v6.6.0 h1:47XbXSJu9fdbhZWG5bQ5dj3ySrI github.com/mattermost/mattermost-server/v6 v6.6.0/go.mod h1:oR6UCRo+SEvnfN2FEOdzHs1UljrskyCKU8tWeKlxgMo= github.com/mattermost/morph v0.0.0-20220401091636-39f834798da8/go.mod h1:jxM3g1bx+k2Thz7jofcHguBS8TZn5Pc+o5MGmORObhw= github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0/go.mod h1:nV5bfVpT//+B1RPD2JvRnxbkLmJEYXmRaaVl15fsXjs= -github.com/mattermost/rtcd v0.4.0 h1:ljshFDTKUMKq0LvgDEv+zGDkvKn5elSyghU6emo7bqo= -github.com/mattermost/rtcd v0.4.0/go.mod h1:yjK6nfY+CPzAXBKGrHPOiX8o1PY5eJjPUpQIbtCE8HU= +github.com/mattermost/rtcd v0.4.1-0.20220510065451-52a5335634f5 h1:uI/RlPBk/ODljOVUm/c2wp8tYtPxSJmyFVvVlSaxuRo= +github.com/mattermost/rtcd v0.4.1-0.20220510065451-52a5335634f5/go.mod h1:yjK6nfY+CPzAXBKGrHPOiX8o1PY5eJjPUpQIbtCE8HU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= diff --git a/server/activate.go b/server/activate.go index 6f57c9531..53d922144 100644 --- a/server/activate.go +++ b/server/activate.go @@ -85,19 +85,10 @@ func (p *Plugin) OnActivate() error { }() } - var err error - publicHost := cfg.ICEHostOverride - if publicHost == "" { - publicHost, err = getPublicIP(*cfg.UDPServerPort, cfg.ICEServers) - if err != nil { - p.LogError(err.Error()) - return err - } - } - rtcServer, err := rtc.NewServer(rtc.ServerConfig{ ICEPortUDP: *cfg.UDPServerPort, - ICEHostOverride: publicHost, + ICEHostOverride: cfg.ICEHostOverride, + ICEServers: cfg.ICEServers, }, newLogger(p), p.metrics.RTCMetrics()) if err != nil { p.LogError(err.Error()) @@ -112,12 +103,11 @@ func (p *Plugin) OnActivate() error { p.mut.Lock() p.nodeID = status.ClusterId p.rtcServer = rtcServer - p.hostIP = publicHost p.mut.Unlock() go p.clusterEventsHandler() - p.LogDebug("activate", "ClusterID", status.ClusterId, "publicHost", publicHost) + p.LogDebug("activate", "ClusterID", status.ClusterId) } go p.wsWriter() diff --git a/server/plugin.go b/server/plugin.go index 32b8a89dc..b5221dd27 100644 --- a/server/plugin.go +++ b/server/plugin.go @@ -35,7 +35,6 @@ type Plugin struct { stopCh chan struct{} clusterEvCh chan model.PluginClusterEvent sessions map[string]*session - hostIP string rtcServer *rtc.Server rtcdClient *rtcd.Client diff --git a/server/utils.go b/server/utils.go index dc2ee3109..f31a17881 100644 --- a/server/utils.go +++ b/server/utils.go @@ -5,12 +5,8 @@ import ( "compress/zlib" "fmt" "io" - "net" "net/url" - "strings" "time" - - "github.com/pion/stun" ) const ( @@ -66,89 +62,6 @@ func (p *Plugin) kvSetAtomic(key string, cb func(data []byte) ([]byte, error)) e } } -func getPublicIP(port int, iceServers []string) (string, error) { - conn, err := net.ListenUDP("udp4", &net.UDPAddr{ - Port: port, - }) - if err != nil { - return "", err - } - defer conn.Close() - - var stunURL string - for _, u := range iceServers { - if strings.HasPrefix(u, "stun:") { - stunURL = u - } - } - if stunURL == "" { - return "", fmt.Errorf("no STUN server URL was found") - } - serverURL := stunURL[strings.Index(stunURL, ":")+1:] - serverAddr, err := net.ResolveUDPAddr("udp", serverURL) - if err != nil { - return "", fmt.Errorf("failed to resolve stun host: %w", err) - } - - xoraddr, err := getXORMappedAddr(conn, serverAddr, 5*time.Second) - if err != nil { - return "", fmt.Errorf("failed to get public address: %w", err) - } - - return xoraddr.IP.String(), nil -} - -func getXORMappedAddr(conn net.PacketConn, serverAddr net.Addr, deadline time.Duration) (*stun.XORMappedAddress, error) { - if deadline > 0 { - if err := conn.SetReadDeadline(time.Now().Add(deadline)); err != nil { - return nil, err - } - } - defer func() { - if deadline > 0 { - _ = conn.SetReadDeadline(time.Time{}) - } - }() - resp, err := stunRequest( - func(p []byte) (int, error) { - n, _, errr := conn.ReadFrom(p) - return n, errr - }, - func(b []byte) (int, error) { - return conn.WriteTo(b, serverAddr) - }, - ) - if err != nil { - return nil, err - } - var addr stun.XORMappedAddress - if err = addr.GetFrom(resp); err != nil { - return nil, err - } - return &addr, nil -} - -func stunRequest(read func([]byte) (int, error), write func([]byte) (int, error)) (*stun.Message, error) { - req, err := stun.Build(stun.BindingRequest, stun.TransactionID) - if err != nil { - return nil, err - } - if _, err = write(req.Raw); err != nil { - return nil, err - } - const maxMessageSize = 1280 - bs := make([]byte, maxMessageSize) - n, err := read(bs) - if err != nil { - return nil, err - } - res := &stun.Message{Raw: bs[:n]} - if err := res.Decode(); err != nil { - return nil, err - } - return res, nil -} - func unpackSDPData(data []byte) ([]byte, error) { buf := bytes.NewBuffer(data) rd, err := zlib.NewReader(buf)