Skip to content

Commit

Permalink
Fix domain list generation within public suffix
Browse files Browse the repository at this point in the history
  • Loading branch information
dhaavi committed Feb 26, 2025
1 parent fdca991 commit 83292d7
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 14 deletions.
32 changes: 18 additions & 14 deletions service/intel/entity.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,28 +397,32 @@ func (e *Entity) getDomainLists(ctx context.Context) {
}

func splitDomain(domain string) []string {
domain = strings.Trim(domain, ".")
suffix, _ := publicsuffix.PublicSuffix(domain)
if suffix == domain {
// Get suffix.
d := strings.TrimSuffix(domain, ".")
suffix, icann := publicsuffix.PublicSuffix(d)
if suffix == d {
return []string{domain}
}

domainWithoutSuffix := domain[:len(domain)-len(suffix)]
domainWithoutSuffix = strings.Trim(domainWithoutSuffix, ".")

splitted := strings.FieldsFunc(domainWithoutSuffix, func(r rune) bool {
// Split all subdomain into labels.
labels := strings.FieldsFunc(d[:len(d)-len(suffix)], func(r rune) bool {
return r == '.'
})

domains := make([]string, 0, len(splitted))
for idx := range splitted {
// Build list of all domains up to the public suffix.
domains := make([]string, 0, len(labels)+1)
for idx := range labels {
domains = append(
domains,
strings.Join(labels[idx:], ".")+"."+suffix+".",
)
}

d := strings.Join(splitted[idx:], ".") + "." + suffix
if d[len(d)-1] != '.' {
d += "."
}
domains = append(domains, d)
// If the suffix is not a real TLD, but a public suffix, add it to the list.
if !icann {
domains = append(domains, suffix+".")
}

return domains
}

Expand Down
31 changes: 31 additions & 0 deletions service/intel/entity_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package intel

import (
"testing"

"github.com/stretchr/testify/assert"
)

var splitDomainTestCases = [][]string{
// Regular registered domains and subdomains.
{"example.com."},
{"www.example.com.", "example.com."},
{"sub.domain.example.com.", "domain.example.com.", "example.com."},
{"example.co.uk."},
{"www.example.co.uk.", "example.co.uk."},

// TLD or public suffix: Return as is.
{"com."},
{"googleapis.com."},

// Public suffix domains: Return including public suffix.
{"test.googleapis.com.", "googleapis.com."},
{"sub.domain.googleapis.com.", "domain.googleapis.com.", "googleapis.com."},
}

func TestSplitDomain(t *testing.T) {

Check failure on line 26 in service/intel/entity_test.go

View workflow job for this annotation

GitHub Actions / Linter

Function TestSplitDomain missing the call to method parallel
for _, testCase := range splitDomainTestCases {
splitted := splitDomain(testCase[0])
assert.Equal(t, testCase, splitted, "result must match")
}
}

0 comments on commit 83292d7

Please sign in to comment.