ci / rust (push) Canceled after 0s
ci / web (push) Canceled after 0s
ci / package-preview (push) Canceled after 0s
ci / package-installer (push) Canceled after 0s
ci / linux-agent (push) Canceled after 0s
ci / edge-service (push) Canceled after 0s
ci / coturn-pop (push) Canceled after 0s
ci / package-windows-host (push) Canceled after 0s
112 lines
3.5 KiB
Go
112 lines
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"net"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestOpenWindowsEncodedSessionBindsDescriptorToRequest(t *testing.T) {
|
|
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer listener.Close()
|
|
serverError := make(chan error, 1)
|
|
go func() {
|
|
connection, err := listener.Accept()
|
|
if err != nil {
|
|
serverError <- err
|
|
return
|
|
}
|
|
defer connection.Close()
|
|
if _, err := connection.Write([]byte("{\"kind\":\"windows_agent_hello\"}\n")); err != nil {
|
|
serverError <- err
|
|
return
|
|
}
|
|
var request struct {
|
|
Kind string `json:"kind"`
|
|
SessionID string `json:"session_id"`
|
|
FramesPerSecond uint8 `json:"frames_per_second"`
|
|
AllowSoftwareFallback bool `json:"allow_software_fallback"`
|
|
}
|
|
if err := readBoundedAgentJSON(bufio.NewReader(connection), &request); err != nil {
|
|
serverError <- err
|
|
return
|
|
}
|
|
if request.Kind != "open_encoded_desktop" || request.SessionID != "session-1" || request.FramesPerSecond != 60 || !request.AllowSoftwareFallback {
|
|
serverError <- &testControlError{"encoded desktop request mismatch"}
|
|
return
|
|
}
|
|
response := encodedDesktopOpened{
|
|
Kind: "encoded_desktop_opened", VideoCodec: "h264",
|
|
MediaTransport: "shared_memory_encoded_access_units",
|
|
Ring: mediaRingDescriptor{
|
|
SchemaVersion: 1, SessionID: "session-1", Generation: 7, OwnerPID: 42,
|
|
RingPath: filepath.Join(t.TempDir(), "media.ring"), SlotCount: 16,
|
|
SlotBytes: 8 * 1024 * 1024, VideoTransport: "shared_memory_encoded_access_units",
|
|
AudioTransport: "separate_transport",
|
|
},
|
|
}
|
|
encoded, err := json.Marshal(response)
|
|
if err == nil {
|
|
encoded = append(encoded, '\n')
|
|
_, err = connection.Write(encoded)
|
|
}
|
|
serverError <- err
|
|
}()
|
|
connection, descriptor, err := openWindowsEncodedSession(listener.Addr().String(), "session-1", 60, true)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer connection.Close()
|
|
if descriptor.Generation != 7 || descriptor.SessionID != "session-1" {
|
|
t.Fatalf("unexpected descriptor: %+v", descriptor)
|
|
}
|
|
if err := <-serverError; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestWindowsAgentControlRejectsRemoteAndMismatchedDescriptor(t *testing.T) {
|
|
if validateAgentControlAddress("192.0.2.10:39501") == nil {
|
|
t.Fatal("remote Windows Agent control address was accepted")
|
|
}
|
|
descriptor := mediaRingDescriptor{
|
|
SchemaVersion: 1, SessionID: "other", Generation: 1, OwnerPID: 1,
|
|
RingPath: filepath.Join(t.TempDir(), "media.ring"), SlotCount: 16,
|
|
SlotBytes: 1024, VideoTransport: "shared_memory_encoded_access_units",
|
|
AudioTransport: "separate_transport",
|
|
}
|
|
if validateMediaRingDescriptor(descriptor, "session-1") == nil {
|
|
t.Fatal("descriptor for another session was accepted")
|
|
}
|
|
}
|
|
|
|
func TestWindowsAgentPipeAuthenticationMatchesRustWireVector(t *testing.T) {
|
|
key := make([]byte, 32)
|
|
nonce := make([]byte, 32)
|
|
for index := range key {
|
|
key[index] = byte(index)
|
|
nonce[index] = byte(index + 32)
|
|
}
|
|
actual := base64.RawURLEncoding.EncodeToString(windowsAgentPipeMAC(key, nonce))
|
|
const expected = "KinBDOBvVhz0eRv37iahq8BO0z8QdiI0Qnx7HZmcxIk"
|
|
if actual != expected {
|
|
t.Fatalf("unexpected Agent Pipe MAC: %s", actual)
|
|
}
|
|
if validateAgentControlAddress(`\\.\pipe\RemoteDesk\windows-agent`) != nil {
|
|
t.Fatal("RemoteDesk Agent Pipe was rejected")
|
|
}
|
|
if validateAgentControlAddress(`\\.\pipe\Other\windows-agent`) == nil {
|
|
t.Fatal("Pipe outside the RemoteDesk namespace was accepted")
|
|
}
|
|
}
|
|
|
|
type testControlError struct{ message string }
|
|
|
|
func (e *testControlError) Error() string { return e.message }
|