90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/binary"
|
|
"encoding/json"
|
|
"io"
|
|
"net"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.ipao.vip/rogee/creator-hub/internal/hub"
|
|
)
|
|
|
|
func TestSOCKS4DialerUsesBoundProxy(t *testing.T) {
|
|
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer listener.Close()
|
|
done := make(chan error, 1)
|
|
go func() {
|
|
connection, err := listener.Accept()
|
|
if err != nil {
|
|
done <- err
|
|
return
|
|
}
|
|
defer connection.Close()
|
|
header := make([]byte, 8)
|
|
if _, err := io.ReadFull(connection, header); err != nil {
|
|
done <- err
|
|
return
|
|
}
|
|
user := make([]byte, 0, 16)
|
|
for {
|
|
var value [1]byte
|
|
if _, err := io.ReadFull(connection, value[:]); err != nil {
|
|
done <- err
|
|
return
|
|
}
|
|
if value[0] == 0 {
|
|
break
|
|
}
|
|
user = append(user, value[0])
|
|
}
|
|
if header[0] != 4 || header[1] != 1 || binary.BigEndian.Uint16(header[2:4]) != 443 ||
|
|
net.IP(header[4:8]).String() != "203.0.113.1" || string(user) != "operator" {
|
|
done <- io.ErrUnexpectedEOF
|
|
return
|
|
}
|
|
_, err = connection.Write([]byte{0, 90, 0, 0, 0, 0, 0, 0})
|
|
done <- err
|
|
}()
|
|
|
|
connection, err := socks4DialContext(listener.Addr().String(), "operator")(context.Background(), "tcp", "203.0.113.1:443")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
_ = connection.Close()
|
|
if err := <-done; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestGatewayNetworkExitResolvesCredentialWithoutPersistingIt(t *testing.T) {
|
|
exit := hub.NetworkExitAccess{NetworkExit: hub.NetworkExit{
|
|
Protocol: "socks5", Host: "proxy.example", Port: 1080,
|
|
CredentialReference: &hub.CredentialReference{ID: "credential-a", Provider: "os_keyring"},
|
|
}}
|
|
gatewayExit, err := gatewayNetworkExitFor(exit, func(hub.NetworkExitAccess) (string, error) {
|
|
return "operator:ephemeral-value", nil
|
|
})
|
|
if err != nil || gatewayExit.Username != "operator" || gatewayExit.Password != "ephemeral-value" || gatewayExit.Host != "proxy.example" {
|
|
t.Fatalf("credential was not resolved into the request-local gateway payload: %#v err=%v", gatewayExit, err)
|
|
}
|
|
encoded := string(mustJSON(t, exit.NetworkExit))
|
|
if strings.Contains(encoded, "ephemeral-value") {
|
|
t.Fatalf("network exit persistence model contains resolved credential: %s", encoded)
|
|
}
|
|
}
|
|
|
|
func mustJSON(t *testing.T, value any) []byte {
|
|
t.Helper()
|
|
encoded, err := json.Marshal(value)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return encoded
|
|
}
|