@@ -20,19 +20,16 @@ import (
2020
2121type Crawler struct {
2222 // any necessary fields specific
23- outputDir string
24- done chan bool
25- depth int
26- domains map[string]bool // Store unique domains
23+ outputDir string
24+ done chan bool
25+ depth int
26+ websiteDetails []WebsiteDetails
2727}
2828
2929func (c *Crawler) ScanWebsites(domains []string) ([]WebsiteDetails, error) {
3030 helper.InfoPrintln("[+] Scanning URLs in domain:", domains)
3131 c.outputDir = lib.Config.Tmpfolder + "result/crawler/websites"
3232 c.depth = lib.Config.LevelOfDepth
33- c.domains = make(map[string]bool) // Initialize domains map
34-
35- var websiteDetails []WebsiteDetails
3633
3734 // Create the output directory and its parent directories
3835 if err := os.MkdirAll(c.outputDir, 0755); err != nil {
@@ -131,13 +128,13 @@ func (c *Crawler) ScanWebsites(domains []string) ([]WebsiteDetails, error) {
131128 helper.ErrorPrintln("[!] Error on diff directory", err)
132129 }
133130
134- websiteDetails = append(websiteDetails, *websiteDetail)
131+ c. websiteDetails = append(c. websiteDetails, *websiteDetail)
135132
136133 // Stop loading animation
137134 c.done <- true
138135 }
139136
140- return websiteDetails, nil
137+ return c. websiteDetails, nil
141138}
142139
143140func (c *Crawler) startLoadingAnimation() {
@@ -208,14 +205,36 @@ func (c *Crawler) fetchAndParseURLs(isHttps bool, domain string, urlString strin
208205 }
209206
210207 // Store the discovered domain if it's new
211- if parsedURL.Host != "" && !c.domains[parsedURL.Host] {
212- c.domains[parsedURL.Host] = true
213- // Append to last-fetched-domains.txt file
214- if domainsFile, err := os.OpenFile(filepath.Join(c.outputDir, "last-fetched-domains.txt"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err == nil {
215- fmt.Fprintln(domainsFile, parsedURL.Host)
216- domainsFile.Close()
208+ if parsedURL.Host != "" {
209+ // Check if we've already seen this domain
210+ domainExists := false
211+ for _, detail := range c.websiteDetails {
212+ if detail.DomainName == parsedURL.Host {
213+ domainExists = true
214+ break
215+ }
216+ }
217+
218+ if !domainExists {
219+ // Append to last-fetched-domains.txt file
220+ if domainsFile, err := os.OpenFile(filepath.Join(c.outputDir, "last-fetched-domains.txt"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err == nil {
221+ fmt.Fprintln(domainsFile, parsedURL.Host)
222+ domainsFile.Close()
223+ }
224+ helper.InfoPrintln("[+] Discovered new domain:", parsedURL.Host)
225+
226+ // Create new WebsiteDetails for the discovered domain
227+ newDetail := WebsiteDetails{
228+ DomainName: parsedURL.Host,
229+ CrawlDirectory: filepath.Join(c.outputDir, parsedURL.Host),
230+ }
231+ c.websiteDetails = append(c.websiteDetails, newDetail)
232+
233+ // Create directory for the new domain
234+ if err := os.MkdirAll(newDetail.CrawlDirectory, 0755); err != nil {
235+ helper.ErrorPrintln("[!] Error creating directory for new domain:", err)
236+ }
217237 }
218- helper.InfoPrintln("[+] Discovered new domain:", parsedURL.Host)
219238 }
220239
221240 // Use the actual host for storage directory
0 commit comments