56 lines
1.6 KiB
Go
56 lines
1.6 KiB
Go
package rtsp
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"net"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.ilapage.cn/ila/yovision/Sense/server/app/sense/onvif"
|
|
)
|
|
|
|
func TestVerifierUsesCredentialHeaderWithoutPuttingItInURI(t *testing.T) {
|
|
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer listener.Close()
|
|
requestChannel := make(chan string, 1)
|
|
go func() {
|
|
connection, _ := listener.Accept()
|
|
if connection == nil {
|
|
return
|
|
}
|
|
defer connection.Close()
|
|
reader := bufio.NewReader(connection)
|
|
request, _ := reader.ReadString('\n')
|
|
headers := request
|
|
for {
|
|
line, _ := reader.ReadString('\n')
|
|
headers += line
|
|
if line == "\r\n" || line == "" {
|
|
break
|
|
}
|
|
}
|
|
requestChannel <- headers
|
|
_, _ = connection.Write([]byte("RTSP/1.0 200 OK\r\nCSeq: 1\r\n\r\n"))
|
|
}()
|
|
policy, _ := onvif.ParsePolicy("127.0.0.0/8")
|
|
result, err := (NetVerifier{Timeout: time.Second, Policy: policy}).Verify(context.Background(), "rtsp://"+listener.Addr().String()+"/live", Credential{Username: "synthetic", Password: "synthetic"})
|
|
if err != nil || result.Status != "ready" {
|
|
t.Fatalf("result=%#v err=%v", result, err)
|
|
}
|
|
request := <-requestChannel
|
|
if strings.Contains(strings.Split(request, "\r\n")[0], "synthetic") {
|
|
t.Fatal("credentials leaked into request URI")
|
|
}
|
|
if !strings.Contains(request, "Authorization: Basic ") {
|
|
t.Fatal("authorization header missing")
|
|
}
|
|
if _, err = (NetVerifier{Policy: policy}).Verify(context.Background(), "rtsp://user:pass@"+listener.Addr().String()+"/live", Credential{}); err == nil {
|
|
t.Fatal("credential-bearing URI accepted")
|
|
}
|
|
}
|