Skip to content

Commit 44842dd

Browse files
authored
fix: remove duplicate subdomain takeover call and add config tests (#46)
- remove duplicate SubdomainTakeover call that ran twice when both dns scan and --st flag were enabled - add comprehensive tests for config settings defaults and behavior - fix formatting in dork.go closes #1
1 parent 2cfdc51 commit 44842dd

2 files changed

Lines changed: 157 additions & 11 deletions

File tree

pkg/config/config_test.go

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
/*
2+
·━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━·
3+
: :
4+
: █▀ █ █▀▀ · Blazing-fast pentesting suite :
5+
: ▄█ █ █▀ · BSD 3-Clause License :
6+
: :
7+
: (c) 2022-2025 vmfunc (Celeste Hickenlooper), xyzeva, :
8+
: lunchcat alumni & contributors :
9+
: :
10+
·━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━·
11+
*/
12+
13+
package config
14+
15+
import (
16+
"testing"
17+
"time"
18+
)
19+
20+
func TestSettingsDefaults(t *testing.T) {
21+
settings := &Settings{}
22+
23+
// noscan should default to false (base scan runs by default)
24+
if settings.NoScan != false {
25+
t.Errorf("expected NoScan default to be false, got %v", settings.NoScan)
26+
}
27+
28+
// other scan flags should default to false
29+
if settings.Dorking != false {
30+
t.Errorf("expected Dorking default to be false, got %v", settings.Dorking)
31+
}
32+
if settings.Git != false {
33+
t.Errorf("expected Git default to be false, got %v", settings.Git)
34+
}
35+
if settings.Nuclei != false {
36+
t.Errorf("expected Nuclei default to be false, got %v", settings.Nuclei)
37+
}
38+
if settings.JavaScript != false {
39+
t.Errorf("expected JavaScript default to be false, got %v", settings.JavaScript)
40+
}
41+
if settings.CMS != false {
42+
t.Errorf("expected CMS default to be false, got %v", settings.CMS)
43+
}
44+
if settings.Headers != false {
45+
t.Errorf("expected Headers default to be false, got %v", settings.Headers)
46+
}
47+
if settings.CloudStorage != false {
48+
t.Errorf("expected CloudStorage default to be false, got %v", settings.CloudStorage)
49+
}
50+
if settings.SubdomainTakeover != false {
51+
t.Errorf("expected SubdomainTakeover default to be false, got %v", settings.SubdomainTakeover)
52+
}
53+
54+
// enum settings should default to empty string
55+
if settings.Dirlist != "" {
56+
t.Errorf("expected Dirlist default to be empty, got %v", settings.Dirlist)
57+
}
58+
if settings.Dnslist != "" {
59+
t.Errorf("expected Dnslist default to be empty, got %v", settings.Dnslist)
60+
}
61+
if settings.Ports != "" {
62+
t.Errorf("expected Ports default to be empty, got %v", settings.Ports)
63+
}
64+
}
65+
66+
func TestSettingsNoScanBehavior(t *testing.T) {
67+
tests := []struct {
68+
name string
69+
noScan bool
70+
shouldBaseScan bool
71+
}{
72+
{
73+
name: "default - base scan should run",
74+
noScan: false,
75+
shouldBaseScan: true,
76+
},
77+
{
78+
name: "noscan enabled - base scan should not run",
79+
noScan: true,
80+
shouldBaseScan: false,
81+
},
82+
}
83+
84+
for _, tt := range tests {
85+
t.Run(tt.name, func(t *testing.T) {
86+
settings := &Settings{NoScan: tt.noScan}
87+
88+
// the condition in sif.go is: if !app.settings.NoScan { scan.Scan(...) }
89+
shouldRun := !settings.NoScan
90+
if shouldRun != tt.shouldBaseScan {
91+
t.Errorf("expected shouldBaseScan=%v, got %v", tt.shouldBaseScan, shouldRun)
92+
}
93+
})
94+
}
95+
}
96+
97+
func TestSettingsTimeoutDefault(t *testing.T) {
98+
settings := &Settings{}
99+
100+
// timeout defaults to zero value, actual default (10s) is set in Parse()
101+
if settings.Timeout != 0 {
102+
t.Errorf("expected Timeout zero value, got %v", settings.Timeout)
103+
}
104+
}
105+
106+
func TestSettingsThreadsDefault(t *testing.T) {
107+
settings := &Settings{}
108+
109+
// threads defaults to zero value, actual default (10) is set in Parse()
110+
if settings.Threads != 0 {
111+
t.Errorf("expected Threads zero value, got %v", settings.Threads)
112+
}
113+
}
114+
115+
func TestSettingsWithValues(t *testing.T) {
116+
settings := &Settings{
117+
NoScan: true,
118+
Dorking: true,
119+
Git: true,
120+
Nuclei: true,
121+
JavaScript: true,
122+
CMS: true,
123+
Headers: true,
124+
CloudStorage: true,
125+
SubdomainTakeover: true,
126+
Dirlist: "medium",
127+
Dnslist: "large",
128+
Ports: "common",
129+
Timeout: 30 * time.Second,
130+
Threads: 20,
131+
Debug: true,
132+
LogDir: "/tmp/logs",
133+
ApiMode: true,
134+
}
135+
136+
if !settings.NoScan {
137+
t.Error("expected NoScan to be true")
138+
}
139+
if !settings.Dorking {
140+
t.Error("expected Dorking to be true")
141+
}
142+
if settings.Dirlist != "medium" {
143+
t.Errorf("expected Dirlist 'medium', got '%s'", settings.Dirlist)
144+
}
145+
if settings.Dnslist != "large" {
146+
t.Errorf("expected Dnslist 'large', got '%s'", settings.Dnslist)
147+
}
148+
if settings.Ports != "common" {
149+
t.Errorf("expected Ports 'common', got '%s'", settings.Ports)
150+
}
151+
if settings.Timeout != 30*time.Second {
152+
t.Errorf("expected Timeout 30s, got %v", settings.Timeout)
153+
}
154+
if settings.Threads != 20 {
155+
t.Errorf("expected Threads 20, got %d", settings.Threads)
156+
}
157+
}

sif.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -257,17 +257,6 @@ func (app *App) Run() error {
257257
}
258258
}
259259

260-
if app.settings.SubdomainTakeover {
261-
// Pass the dnsResults to the SubdomainTakeover function
262-
result, err := scan.SubdomainTakeover(url, dnsResults, app.settings.Timeout, app.settings.Threads, app.settings.LogDir)
263-
if err != nil {
264-
log.Errorf("Error while running Subdomain Takeover Vulnerability Check: %s", err)
265-
} else {
266-
moduleResults = append(moduleResults, ModuleResult{"subdomain_takeover", result})
267-
scansRun = append(scansRun, "Subdomain Takeover")
268-
}
269-
}
270-
271260
if app.settings.ApiMode {
272261
result := UrlResult{
273262
Url: url,

0 commit comments

Comments
 (0)