fix error when authenticating with vlc and slashes in paths

This commit is contained in:
aler9
2020-10-31 14:57:14 +01:00
parent d85cfae2ed
commit 071637fde0
4 changed files with 106 additions and 112 deletions

View File

@@ -46,7 +46,7 @@ func TestAuthMethods(t *testing.T) {
}
}
func TestAuthBasePath(t *testing.T) {
func TestAuthVLC(t *testing.T) {
authServer := NewServer("testuser", "testpass",
[]headers.AuthMethod{headers.AuthBasic, headers.AuthDigest})
wwwAuthenticate := authServer.GenerateHeader()
@@ -54,9 +54,9 @@ func TestAuthBasePath(t *testing.T) {
ac, err := NewClient(wwwAuthenticate, "testuser", "testpass")
require.NoError(t, err)
authorization := ac.GenerateHeader(base.ANNOUNCE,
&url.URL{Scheme: "rtsp", Host: "myhost", Path: "mypath/"})
&url.URL{Scheme: "rtsp", Host: "myhost", Path: "/mypath/"})
err = authServer.ValidateHeader(authorization, base.ANNOUNCE,
&url.URL{Scheme: "rtsp", Host: "myhost", Path: "mypath/trackId=0"})
&url.URL{Scheme: "rtsp", Host: "myhost", Path: "/mypath/trackId=0"})
require.NoError(t, err)
}

View File

@@ -12,7 +12,7 @@ import (
"github.com/aler9/gortsplib/headers"
)
// Server is an object that helps a server to authenticate a client.
// Server allows a server to authenticate a client.
type Server struct {
user string
pass string
@@ -126,18 +126,12 @@ func (as *Server) ValidateHeader(v base.HeaderValue, method base.Method, ur *url
uri := ur.String()
if *auth.URI != uri {
// VLC strips the subpath
newUrl := *ur
newUrl.Path = func() string {
ret := newUrl.Path
if n := strings.Index(ret[1:], "/"); n >= 0 {
ret = ret[:n+2]
}
return ret
}()
uri = newUrl.String()
// VLC strips the control path; do another try without the control path
base, _, ok := base.URLGetBaseControlPath(ur)
if ok {
ur.Path = "/" + base + "/"
uri = ur.String()
}
if *auth.URI != uri {
return fmt.Errorf("wrong url")

View File

@@ -1,8 +1,8 @@
package base
import (
"strings"
"net/url"
"strings"
)
func stringsReverseIndexByte(s string, c byte) int {

View File

@@ -1,109 +1,109 @@
package base
import (
"net/url"
"testing"
"net/url"
"testing"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
)
func TestURLGetBasePath(t *testing.T) {
for _, ca := range []struct{
u *url.URL
b string
} {
{
urlMustParse("rtsp://localhost:8554/teststream"),
"teststream",
},
{
urlMustParse("rtsp://localhost:8554/test/stream"),
"test/stream",
},
{
urlMustParse("rtsp://192.168.1.99:554/test?user=tmp&password=BagRep1&channel=1&stream=0.sdp"),
"test",
},
{
urlMustParse("rtsp://192.168.1.99:554/te!st?user=tmp&password=BagRep1!&channel=1&stream=0.sdp"),
"te!st",
},
{
urlMustParse("rtsp://192.168.1.99:554/user=tmp&password=BagRep1!&channel=1&stream=0.sdp"),
"user=tmp&password=BagRep1!&channel=1&stream=0.sdp",
},
} {
b := URLGetBasePath(ca.u)
require.Equal(t, ca.b, b)
}
for _, ca := range []struct {
u *url.URL
b string
}{
{
urlMustParse("rtsp://localhost:8554/teststream"),
"teststream",
},
{
urlMustParse("rtsp://localhost:8554/test/stream"),
"test/stream",
},
{
urlMustParse("rtsp://192.168.1.99:554/test?user=tmp&password=BagRep1&channel=1&stream=0.sdp"),
"test",
},
{
urlMustParse("rtsp://192.168.1.99:554/te!st?user=tmp&password=BagRep1!&channel=1&stream=0.sdp"),
"te!st",
},
{
urlMustParse("rtsp://192.168.1.99:554/user=tmp&password=BagRep1!&channel=1&stream=0.sdp"),
"user=tmp&password=BagRep1!&channel=1&stream=0.sdp",
},
} {
b := URLGetBasePath(ca.u)
require.Equal(t, ca.b, b)
}
}
func TestURLGetBaseControlPath(t *testing.T) {
for _, ca := range []struct{
u *url.URL
b string
c string
} {
{
urlMustParse("rtsp://localhost:8554/teststream/trackID=1"),
"teststream",
"trackID=1",
},
{
urlMustParse("rtsp://localhost:8554/test/stream/trackID=1"),
"test/stream",
"trackID=1",
},
{
urlMustParse("rtsp://192.168.1.99:554/test?user=tmp&password=BagRep1&channel=1&stream=0.sdp/trackID=1"),
"test",
"trackID=1",
},
{
urlMustParse("rtsp://192.168.1.99:554/te!st?user=tmp&password=BagRep1!&channel=1&stream=0.sdp/trackID=1"),
"te!st",
"trackID=1",
},
{
urlMustParse("rtsp://192.168.1.99:554/user=tmp&password=BagRep1!&channel=1&stream=0.sdp/trackID=1"),
"user=tmp&password=BagRep1!&channel=1&stream=0.sdp",
"trackID=1",
},
} {
b, c, ok := URLGetBaseControlPath(ca.u)
require.Equal(t, true, ok)
require.Equal(t, ca.b, b)
require.Equal(t, ca.c, c)
}
for _, ca := range []struct {
u *url.URL
b string
c string
}{
{
urlMustParse("rtsp://localhost:8554/teststream/trackID=1"),
"teststream",
"trackID=1",
},
{
urlMustParse("rtsp://localhost:8554/test/stream/trackID=1"),
"test/stream",
"trackID=1",
},
{
urlMustParse("rtsp://192.168.1.99:554/test?user=tmp&password=BagRep1&channel=1&stream=0.sdp/trackID=1"),
"test",
"trackID=1",
},
{
urlMustParse("rtsp://192.168.1.99:554/te!st?user=tmp&password=BagRep1!&channel=1&stream=0.sdp/trackID=1"),
"te!st",
"trackID=1",
},
{
urlMustParse("rtsp://192.168.1.99:554/user=tmp&password=BagRep1!&channel=1&stream=0.sdp/trackID=1"),
"user=tmp&password=BagRep1!&channel=1&stream=0.sdp",
"trackID=1",
},
} {
b, c, ok := URLGetBaseControlPath(ca.u)
require.Equal(t, true, ok)
require.Equal(t, ca.b, b)
require.Equal(t, ca.c, c)
}
}
func TestURLAddControlPath(t *testing.T) {
for _, ca := range []struct{
u *url.URL
ou *url.URL
} {
{
urlMustParse("rtsp://localhost:8554/teststream"),
urlMustParse("rtsp://localhost:8554/teststream/trackID=1"),
},
{
urlMustParse("rtsp://localhost:8554/test/stream"),
urlMustParse("rtsp://localhost:8554/test/stream/trackID=1"),
},
{
urlMustParse("rtsp://192.168.1.99:554/test?user=tmp&password=BagRep1&channel=1&stream=0.sdp"),
urlMustParse("rtsp://192.168.1.99:554/test?user=tmp&password=BagRep1&channel=1&stream=0.sdp/trackID=1"),
},
{
urlMustParse("rtsp://192.168.1.99:554/te!st?user=tmp&password=BagRep1!&channel=1&stream=0.sdp"),
urlMustParse("rtsp://192.168.1.99:554/te!st?user=tmp&password=BagRep1!&channel=1&stream=0.sdp/trackID=1"),
},
{
urlMustParse("rtsp://192.168.1.99:554/user=tmp&password=BagRep1!&channel=1&stream=0.sdp"),
urlMustParse("rtsp://192.168.1.99:554/user=tmp&password=BagRep1!&channel=1&stream=0.sdp/trackID=1"),
},
} {
URLAddControlPath(ca.u, "trackID=1")
require.Equal(t, ca.ou, ca.u)
}
for _, ca := range []struct {
u *url.URL
ou *url.URL
}{
{
urlMustParse("rtsp://localhost:8554/teststream"),
urlMustParse("rtsp://localhost:8554/teststream/trackID=1"),
},
{
urlMustParse("rtsp://localhost:8554/test/stream"),
urlMustParse("rtsp://localhost:8554/test/stream/trackID=1"),
},
{
urlMustParse("rtsp://192.168.1.99:554/test?user=tmp&password=BagRep1&channel=1&stream=0.sdp"),
urlMustParse("rtsp://192.168.1.99:554/test?user=tmp&password=BagRep1&channel=1&stream=0.sdp/trackID=1"),
},
{
urlMustParse("rtsp://192.168.1.99:554/te!st?user=tmp&password=BagRep1!&channel=1&stream=0.sdp"),
urlMustParse("rtsp://192.168.1.99:554/te!st?user=tmp&password=BagRep1!&channel=1&stream=0.sdp/trackID=1"),
},
{
urlMustParse("rtsp://192.168.1.99:554/user=tmp&password=BagRep1!&channel=1&stream=0.sdp"),
urlMustParse("rtsp://192.168.1.99:554/user=tmp&password=BagRep1!&channel=1&stream=0.sdp/trackID=1"),
},
} {
URLAddControlPath(ca.u, "trackID=1")
require.Equal(t, ca.ou, ca.u)
}
}