mirror of
https://github.com/UNITRONIX/BetterDesk.git
synced 2026-09-11 01:55:43 +00:00
e855f5786d
Add a new betterdesk-server Go codebase (server, api, auth, db, relay, signal, metrics, audit, ratelimit, proto, tools, tests) and related deployment/migration scripts. Add a comprehensive SECURITY_AUDIT_2026-03-01 report and .gitattributes; update copilot-instructions (ALL-IN-ONE v2.4.0), README, VERSION, Dockerfiles, scripts, docker-compose and entrypoint. Large updates to web-nodejs (translations, routes, services, frontend assets and middleware) and numerous new utilities; remove legacy Flask web files and archive hbbs-patch-v2 artifacts. Prepares repository for PostgreSQL support, DB migration tooling and the new Go server as the production backend.
159 lines
3.7 KiB
Go
159 lines
3.7 KiB
Go
package crypto
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
)
|
|
|
|
func TestEncodeDecodeIPv4(t *testing.T) {
|
|
addr := &net.UDPAddr{
|
|
IP: net.ParseIP("192.168.1.100"),
|
|
Port: 21116,
|
|
}
|
|
encoded := EncodeAddr(addr)
|
|
|
|
if len(encoded) != 6 {
|
|
t.Fatalf("expected 6 bytes for IPv4, got %d", len(encoded))
|
|
}
|
|
|
|
// Verify raw bytes
|
|
if encoded[0] != 192 || encoded[1] != 168 || encoded[2] != 1 || encoded[3] != 100 {
|
|
t.Errorf("unexpected IP bytes: %v", encoded[0:4])
|
|
}
|
|
// Port 21116 = 0x527C big-endian
|
|
if encoded[4] != 0x52 || encoded[5] != 0x7C {
|
|
t.Errorf("unexpected port bytes: %02X %02X", encoded[4], encoded[5])
|
|
}
|
|
|
|
decoded, err := DecodeAddr(encoded)
|
|
if err != nil {
|
|
t.Fatalf("decode error: %v", err)
|
|
}
|
|
|
|
if !decoded.IP.Equal(addr.IP) {
|
|
t.Errorf("IP mismatch: got %v, want %v", decoded.IP, addr.IP)
|
|
}
|
|
if decoded.Port != addr.Port {
|
|
t.Errorf("port mismatch: got %d, want %d", decoded.Port, addr.Port)
|
|
}
|
|
}
|
|
|
|
func TestEncodeDecodeIPv6(t *testing.T) {
|
|
addr := &net.UDPAddr{
|
|
IP: net.ParseIP("2001:db8::1"),
|
|
Port: 443,
|
|
}
|
|
encoded := EncodeAddr(addr)
|
|
|
|
if len(encoded) != 18 {
|
|
t.Fatalf("expected 18 bytes for IPv6, got %d", len(encoded))
|
|
}
|
|
|
|
decoded, err := DecodeAddr(encoded)
|
|
if err != nil {
|
|
t.Fatalf("decode error: %v", err)
|
|
}
|
|
|
|
if !decoded.IP.Equal(addr.IP) {
|
|
t.Errorf("IP mismatch: got %v, want %v", decoded.IP, addr.IP)
|
|
}
|
|
if decoded.Port != addr.Port {
|
|
t.Errorf("port mismatch: got %d, want %d", decoded.Port, addr.Port)
|
|
}
|
|
}
|
|
|
|
func TestEncodeDecodeIPv4MappedIPv6(t *testing.T) {
|
|
// IPv4-mapped IPv6 like ::ffff:192.168.1.1 should encode as IPv4 (4 bytes)
|
|
addr := &net.UDPAddr{
|
|
IP: net.ParseIP("::ffff:192.168.1.1"),
|
|
Port: 8080,
|
|
}
|
|
encoded := EncodeAddr(addr)
|
|
|
|
// To4() returns non-nil for IPv4-mapped — so we expect 6 bytes
|
|
if len(encoded) != 6 {
|
|
t.Fatalf("expected 6 bytes for IPv4-mapped IPv6, got %d", len(encoded))
|
|
}
|
|
|
|
decoded, err := DecodeAddr(encoded)
|
|
if err != nil {
|
|
t.Fatalf("decode error: %v", err)
|
|
}
|
|
|
|
expected := net.ParseIP("192.168.1.1").To4()
|
|
if !decoded.IP.Equal(expected) {
|
|
t.Errorf("IP mismatch: got %v, want %v", decoded.IP, expected)
|
|
}
|
|
if decoded.Port != 8080 {
|
|
t.Errorf("port mismatch: got %d, want 8080", decoded.Port)
|
|
}
|
|
}
|
|
|
|
func TestDecodeInvalidLength(t *testing.T) {
|
|
testCases := []int{0, 1, 4, 5, 7, 10, 17, 19, 100}
|
|
for _, n := range testCases {
|
|
b := make([]byte, n)
|
|
_, err := DecodeAddr(b)
|
|
if err == nil {
|
|
t.Errorf("expected error for length %d, got nil", n)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestEncodeDecodeString(t *testing.T) {
|
|
encoded, err := EncodeAddrFromString("10.0.0.1:5000")
|
|
if err != nil {
|
|
t.Fatalf("encode error: %v", err)
|
|
}
|
|
|
|
s, err := DecodeAddrToString(encoded)
|
|
if err != nil {
|
|
t.Fatalf("decode error: %v", err)
|
|
}
|
|
|
|
if s != "10.0.0.1:5000" {
|
|
t.Errorf("got %q, want %q", s, "10.0.0.1:5000")
|
|
}
|
|
}
|
|
|
|
func TestEncodeDecodePort0(t *testing.T) {
|
|
addr := &net.UDPAddr{IP: net.ParseIP("0.0.0.0"), Port: 0}
|
|
encoded := EncodeAddr(addr)
|
|
decoded, err := DecodeAddr(encoded)
|
|
if err != nil {
|
|
t.Fatalf("decode error: %v", err)
|
|
}
|
|
if decoded.Port != 0 {
|
|
t.Errorf("expected port 0, got %d", decoded.Port)
|
|
}
|
|
}
|
|
|
|
func TestEncodeDecodeMaxPort(t *testing.T) {
|
|
addr := &net.UDPAddr{IP: net.ParseIP("255.255.255.255"), Port: 65535}
|
|
encoded := EncodeAddr(addr)
|
|
decoded, err := DecodeAddr(encoded)
|
|
if err != nil {
|
|
t.Fatalf("decode error: %v", err)
|
|
}
|
|
if decoded.Port != 65535 {
|
|
t.Errorf("expected port 65535, got %d", decoded.Port)
|
|
}
|
|
if !decoded.IP.Equal(net.ParseIP("255.255.255.255")) {
|
|
t.Errorf("IP mismatch: got %v", decoded.IP)
|
|
}
|
|
}
|
|
|
|
func BenchmarkEncodeIPv4(b *testing.B) {
|
|
addr := &net.UDPAddr{IP: net.ParseIP("192.168.1.1"), Port: 21116}
|
|
for i := 0; i < b.N; i++ {
|
|
EncodeAddr(addr)
|
|
}
|
|
}
|
|
|
|
func BenchmarkDecodeIPv4(b *testing.B) {
|
|
data := []byte{192, 168, 1, 1, 0x52, 0x7C}
|
|
for i := 0; i < b.N; i++ {
|
|
DecodeAddr(data)
|
|
}
|
|
}
|