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") } }