From 4bffbea48ef4ef32a60288092d6c7e5fb243304d Mon Sep 17 00:00:00 2001 From: Ingo Oppermann Date: Fri, 12 Jan 2024 15:38:32 +0100 Subject: [PATCH] Add support for SRTv4 clients Older clients (e.g. Makito encoders) don't support streamid and couldn't send a stream. This adds support for v4 clients. Such clients will always be publishing to the resource equal to the client address, e.g. 192.168.1.42:63793 Clients that want to play this stream are required to send a streamid with the respective resource name. --- srt/srt.go | 76 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/srt/srt.go b/srt/srt.go index f81d3a35..81fdb2a4 100644 --- a/srt/srt.go +++ b/srt/srt.go @@ -468,15 +468,44 @@ func (s *server) handleConnect(req srt.ConnRequest) srt.ConnType { client := req.RemoteAddr() streamId := req.StreamId() - si, err := parseStreamId(streamId) - if err != nil { - s.log("CONNECT", "INVALID", "", err.Error(), client) - return srt.REJECT - } + var si streamInfo + var err error - if len(si.resource) == 0 { - s.log("CONNECT", "INVALID", "", "stream resource not provided", client) - return srt.REJECT + if req.Version() == 4 { + si.mode = "publish" + si.resource = client.String() + + if len(s.passphrase) != 0 { + req.SetPassphrase(s.passphrase) + } + } else if req.Version() == 5 { + si, err = parseStreamId(streamId) + if err != nil { + s.log("CONNECT", "INVALID", "", err.Error(), client) + return srt.REJECT + } + + if len(si.resource) == 0 { + s.log("CONNECT", "INVALID", "", "stream resource not provided", client) + return srt.REJECT + } + + if len(s.passphrase) != 0 { + if !req.IsEncrypted() { + s.log("CONNECT", "FORBIDDEN", si.resource, "connection has to be encrypted", client) + return srt.REJECT + } + + if err := req.SetPassphrase(s.passphrase); err != nil { + s.log("CONNECT", "FORBIDDEN", si.resource, err.Error(), client) + return srt.REJECT + } + } else { + if req.IsEncrypted() { + s.log("CONNECT", "INVALID", si.resource, "connection must not be encrypted", client) + return srt.REJECT + } + } } if si.mode == "publish" { @@ -488,26 +517,13 @@ func (s *server) handleConnect(req srt.ConnRequest) srt.ConnType { return srt.REJECT } - if len(s.passphrase) != 0 { - if !req.IsEncrypted() { - s.log("CONNECT", "FORBIDDEN", si.resource, "connection has to be encrypted", client) - return srt.REJECT - } - - if err := req.SetPassphrase(s.passphrase); err != nil { - s.log("CONNECT", "FORBIDDEN", si.resource, err.Error(), client) - return srt.REJECT - } - } else { - if req.IsEncrypted() { - s.log("CONNECT", "INVALID", si.resource, "connection must not be encrypted", client) - return srt.REJECT - } - } - // Check the token if len(s.token) != 0 && s.token != si.token { - s.log("CONNECT", "FORBIDDEN", si.resource, "invalid token ("+si.token+")", client) + if len(si.token) == 0 { + s.log("CONNECT", "FORBIDDEN", si.resource, "token required", client) + } else { + s.log("CONNECT", "FORBIDDEN", si.resource, "invalid token ("+si.token+")", client) + } return srt.REJECT } @@ -532,7 +548,13 @@ func (s *server) handlePublish(conn srt.Conn) { streamId := conn.StreamId() client := conn.RemoteAddr() - si, _ := parseStreamId(streamId) + var si streamInfo + + if len(streamId) == 0 { + si.resource = client.String() + } else { + si, _ = parseStreamId(streamId) + } // Look for the stream s.lock.Lock()