82 lines
2.7 KiB
Go
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")
|
|
}
|
|
}
|