Files
go-sip/internal/sipcall/config_test.go
T

82 lines
2.7 KiB
Go

package sipcall
import (
"os"
"path/filepath"
"strings"
"testing"
)
const validENV = `SIP_ID=test-line
SIP_SERVER=192.0.2.10
SIP_PORT=5060
SIP_CALLER_ID=BD1234
SIP_PREFIX=7089
SIP_TRANSPORT=udp
SIP_AUTH=ip
SIP_REGISTER=no
SIP_CODEC=alaw
ASTERISK_CONFIG_DIR=/tmp/asterisk-test
ASTERISK_BIN=/usr/local/sbin/asterisk
ASTERISK_LIBRARY_DIR=/usr/local/lib
OUTPUT_DIR=/tmp/sip-call-results
RING_SECONDS=20
HOLD_SECONDS=3
DEBUG_INTERFACE=any
`
func TestConfigAndOriginalNumberAreStrict(t *testing.T) {
c, err := ParseConfig(strings.NewReader(validENV))
if err != nil {
t.Fatal(err)
}
route, err := c.Route("18601010101")
if err != nil || route != "708918601010101" {
t.Fatalf("%s %v", route, err)
}
for _, number := range []string{"", "+8618601010101", "123", "1\n2", strings.Repeat("1", 33)} {
if _, err = c.Route(number); err == nil {
t.Fatalf("invalid number accepted: %q", number)
}
}
for _, change := range [][2]string{{"SIP_PORT=5060", "SIP_PORT=0"}, {"SIP_SERVER=192.0.2.10", "SIP_SERVER=example.com"}, {"SIP_TRANSPORT=udp", "SIP_TRANSPORT=tcp"}, {"SIP_AUTH=ip", "SIP_AUTH=digest"}, {"SIP_REGISTER=no", "SIP_REGISTER=yes"}, {"SIP_CODEC=alaw", "SIP_CODEC=ulaw"}, {"SIP_CALLER_ID=BD1234", "SIP_CALLER_ID=x\";evil"}, {"HOLD_SECONDS=3", "HOLD_SECONDS=0"}, {"RING_SECONDS=20", "RING_SECONDS=121"}, {"OUTPUT_DIR=/tmp/sip-call-results", "OUTPUT_DIR=relative"}, {"SIP_PREFIX=7089", "SIP_PREFIX=$HOME"}, {"SIP_ID=test-line", "SIP_ID=../line"}} {
if _, err = ParseConfig(strings.NewReader(strings.Replace(validENV, change[0], change[1], 1))); err == nil {
t.Fatalf("invalid config accepted: %s", change[1])
}
}
for _, extra := range []string{"UNKNOWN=value\n", "SIP_PORT=5060\n", "export X=yes\n"} {
if _, err = ParseConfig(strings.NewReader(validENV + extra)); err == nil {
t.Fatal("unknown or duplicate key accepted")
}
}
if _, err = ParseConfig(strings.NewReader(strings.Replace(validENV, "SIP_PREFIX=7089\n", "", 1))); err == nil {
t.Fatal("missing explicit empty-capable prefix accepted")
}
if _, err = ParseConfig(strings.NewReader(strings.Replace(validENV, "SIP_PREFIX=7089", "SIP_PREFIX=", 1))); err != nil {
t.Fatal("explicit empty prefix must be accepted")
}
}
func TestConfigFileMustBePrivateAndNotSymlink(t *testing.T) {
path := filepath.Join(t.TempDir(), "sip.env")
if err := os.WriteFile(path, []byte(validENV), 0600); err != nil {
t.Fatal(err)
}
if _, err := LoadConfig(path); err != nil {
t.Fatal(err)
}
if err := os.Chmod(path, 0644); err != nil {
t.Fatal(err)
}
if _, err := LoadConfig(path); err == nil {
t.Fatal("public config accepted")
}
link := path + ".link"
if err := os.Symlink(path, link); err != nil {
t.Fatal(err)
}
if _, err := LoadConfig(link); err == nil {
t.Fatal("symlink accepted")
}
}