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.
This commit is contained in:
Ingo Oppermann
2024-01-12 15:38:32 +01:00
parent 0ad1ad34d8
commit 4bffbea48e

View File

@@ -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()