Path: blob/dev/pkg/protocols/utils/variables_test.go
2070 views
package utils12import (3"context"4"reflect"5"testing"67"github.com/projectdiscovery/nuclei/v3/pkg/protocols/common/contextargs"8urlutil "github.com/projectdiscovery/utils/url"9"github.com/stretchr/testify/require"10)1112func TestHTTPVariables(t *testing.T) {13baseURL := "http://localhost:9001/test/123"14parsed, _ := urlutil.Parse(baseURL)15// trailing slash is only true when both target/inputURL and payload {{BaseURL}}/xyz both have slash16values := GenerateVariables(parsed, false, nil)1718require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")19require.Equal(t, values["RootURL"], "http://localhost:9001", "incorrect rootURL")20require.Equal(t, values["Host"], "localhost", "incorrect domain name")21require.Equal(t, values["Path"], "/test", "incorrect path")22require.Equal(t, values["File"], "123", "incorrect file")23require.Equal(t, values["Port"], "9001", "incorrect port number")24require.Equal(t, values["Scheme"], "http", "incorrect scheme")25require.Equal(t, values["Hostname"], "localhost:9001", "incorrect hostname")2627baseURL = "https://example.com"28parsed, _ = urlutil.Parse(baseURL)29values = GenerateVariables(parsed, false, nil)3031require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")32require.Equal(t, values["Host"], "example.com", "incorrect domain name")33require.Equal(t, values["RootURL"], "https://example.com", "incorrect rootURL")34require.Equal(t, values["Path"], "", "incorrect path")35require.Equal(t, values["Port"], "443", "incorrect port number")36require.Equal(t, values["Scheme"], "https", "incorrect scheme")37require.Equal(t, values["Hostname"], "example.com", "incorrect hostname")3839baseURL = "ftp://foobar.com/"40parsed, _ = urlutil.Parse(baseURL)41values = GenerateVariables(parsed, false, nil)4243require.Equal(t, values["BaseURL"], parsed.String(), "incorrect baseurl")44require.Equal(t, values["Host"], "foobar.com", "incorrect domain name")45require.Equal(t, values["RootURL"], "ftp://foobar.com", "incorrect rootURL")46require.Equal(t, values["Path"], "/", "incorrect path")47require.Equal(t, values["Port"], "", "incorrect port number") // Unsupported protocol results in a blank port48require.Equal(t, values["Scheme"], "ftp", "incorrect scheme")49require.Equal(t, values["Hostname"], "foobar.com", "incorrect hostname")5051baseURL = "http://scanme.sh"52ctxArgs := contextargs.NewWithInput(context.Background(), baseURL)53ctxArgs.MetaInput.CustomIP = "1.2.3.4"54values = GenerateVariablesWithContextArgs(ctxArgs, true)5556require.Equal(t, values["BaseURL"], baseURL, "incorrect baseurl")57require.Equal(t, values["Host"], "scanme.sh", "incorrect domain name")58require.Equal(t, values["RootURL"], "http://scanme.sh", "incorrect rootURL")59require.Equal(t, values["Path"], "", "incorrect path")60require.Equal(t, values["Port"], "80", "incorrect port number")61require.Equal(t, values["Scheme"], "http", "incorrect scheme")62require.Equal(t, values["Hostname"], "scanme.sh", "incorrect hostname")63require.Equal(t, values["ip"], "1.2.3.4", "incorrect ip")64}6566func TestGenerateDNSVariables(t *testing.T) {67vars := GenerateDNSVariables("www.projectdiscovery.io")68require.Equal(t, map[string]interface{}{69"FQDN": "www.projectdiscovery.io",70"RDN": "projectdiscovery.io",71"DN": "projectdiscovery",72"TLD": "io",73"SD": "www",74}, vars, "could not get dns variables")75}7677func TestGenerateVariablesForDNS(t *testing.T) {78vars := GenerateVariables("www.projectdiscovery.io", false, nil)79expected := map[string]interface{}{80"FQDN": "www.projectdiscovery.io",81"RDN": "projectdiscovery.io",82"DN": "projectdiscovery",83"TLD": "io",84"SD": "www",85}86checkResults(t, vars, expected)87}8889func TestGenerateVariablesForTCP(t *testing.T) {90vars := GenerateVariables("127.0.0.1:5431", false, nil)91expected := map[string]interface{}{92"Host": "127.0.0.1",93"Port": "5431",94"Hostname": "127.0.0.1:5431",95}96checkResults(t, vars, expected)9798vars = GenerateVariables("127.0.0.1", false, nil)99expected = map[string]interface{}{100"Host": "127.0.0.1",101"Hostname": "127.0.0.1",102}103checkResults(t, vars, expected)104}105106func TestGenerateWhoISVariables(t *testing.T) {107vars := GenerateVariables("https://example.com", false, nil)108expected := map[string]interface{}{109"Host": "example.com", "Hostname": "example.com", "Input": "https://example.com",110}111checkResults(t, vars, expected)112113vars = GenerateVariables("https://example.com:8080", false, nil)114expected = map[string]interface{}{115"Host": "example.com", "Hostname": "example.com:8080", "Input": "https://example.com:8080",116}117checkResults(t, vars, expected)118}119120func TestGetWebsocketVariables(t *testing.T) {121baseURL := "ws://127.0.0.1:40221"122parsed, _ := urlutil.Parse(baseURL)123vars := GenerateVariables(parsed, false, nil)124expected := map[string]interface{}{125"Host": "127.0.0.1",126"Hostname": "127.0.0.1:40221",127"Scheme": "ws",128"Path": "",129}130checkResults(t, vars, expected)131132baseURL = "ws://127.0.0.1:40221/test?var=test"133parsed, _ = urlutil.Parse(baseURL)134vars = GenerateVariables(parsed, false, nil)135expected = map[string]interface{}{136"Host": "127.0.0.1",137"Hostname": "127.0.0.1:40221",138"Scheme": "ws",139"Path": "/test?var=test",140}141checkResults(t, vars, expected)142}143144// checkResults returns true if mapSubset is a subset of mapSet otherwise false145func checkResults(t *testing.T, mapSet interface{}, mapSubset interface{}) {146147got := reflect.ValueOf(mapSet)148expected := reflect.ValueOf(mapSubset)149150require.Greater(t, len(expected.MapKeys()), 0, "failed expected value is empty")151require.Greater(t, len(got.MapKeys()), 0, "failed expected value is empty")152153require.LessOrEqual(t, len(expected.MapKeys()), len(got.MapKeys()), "failed return value more than expected")154155iterMapSubset := expected.MapRange()156157for iterMapSubset.Next() {158k := iterMapSubset.Key()159v := iterMapSubset.Value()160161value := got.MapIndex(k)162163if !value.IsValid() || v.Interface() != value.Interface() {164require.Equal(t, value, v, "failed return value is not equal to expected")165}166}167}168169170