Skip to content

Commit

Permalink
Merge pull request #1087 from sundowndev/feat/filtering
Browse files Browse the repository at this point in the history
Add disable CLI flag
  • Loading branch information
sundowndev committed Jul 23, 2022
2 parents edd21a2 + dff93c5 commit 4df45da
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 12 deletions.
9 changes: 8 additions & 1 deletion cmd/scan.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,22 @@ import (
"github.com/fatih/color"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/sundowndev/phoneinfoga/v2/lib/filter"
"github.com/sundowndev/phoneinfoga/v2/lib/number"
"github.com/sundowndev/phoneinfoga/v2/lib/output"
"github.com/sundowndev/phoneinfoga/v2/lib/remote"
"os"
)

var disabledScanners []string

func init() {
// Register command
rootCmd.AddCommand(scanCmd)

// Register flags
scanCmd.PersistentFlags().StringVarP(&inputNumber, "number", "n", "", "The phone number to scan (E164 or international format)")
scanCmd.PersistentFlags().StringArrayVarP(&disabledScanners, "disable", "D", []string{}, "A list of scanners to skip for this scan.")
// scanCmd.PersistentFlags().StringVarP(&input, "input", "i", "", "Text file containing a list of phone numbers to scan (one per line)")
// scanCmd.PersistentFlags().StringVarP(&output, "output", "o", "", "Output to save scan results")
}
Expand Down Expand Up @@ -48,7 +52,10 @@ func runScan() {
os.Exit(1)
}

remoteLibrary := remote.NewLibrary()
f := filter.NewEngine()
f.AddRule(disabledScanners...)

remoteLibrary := remote.NewLibrary(f)
remote.InitScanners(remoteLibrary)

result, errs := remoteLibrary.Scan(num)
Expand Down
26 changes: 26 additions & 0 deletions lib/filter/filter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package filter

type Filter interface {
Match(string) bool
}

type Engine struct {
rules []string
}

func NewEngine() *Engine {
return &Engine{}
}

func (e *Engine) AddRule(r ...string) {
e.rules = append(e.rules, r...)
}

func (e *Engine) Match(r string) bool {
for _, rule := range e.rules {
if rule == r {
return true
}
}
return false
}
41 changes: 41 additions & 0 deletions lib/filter/filter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package filter

import (
"github.com/stretchr/testify/assert"
"testing"
)

func TestFilterEngine(t *testing.T) {
testcases := []struct {
name string
rules []string
expected map[string]bool
}{
{
name: "test googlesearch is ignored",
rules: []string{"googlesearch"},
expected: map[string]bool{
"googlesearch": true,
"numverify": false,
},
},
{
name: "test none is ignored",
rules: []string{},
expected: map[string]bool{
"googlesearch": false,
"numverify": false,
},
},
}

for _, tt := range testcases {
t.Run(tt.name, func(t *testing.T) {
e := NewEngine()
e.AddRule(tt.rules...)
for r, isIgnored := range tt.expected {
assert.Equal(t, isIgnored, e.Match(r))
}
})
}
}
3 changes: 2 additions & 1 deletion lib/remote/googlesearch_scanner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package remote

import (
"github.com/stretchr/testify/assert"
"github.com/sundowndev/phoneinfoga/v2/lib/filter"
"github.com/sundowndev/phoneinfoga/v2/lib/number"
"testing"
)
Expand Down Expand Up @@ -264,7 +265,7 @@ func TestGoogleSearchScanner(t *testing.T) {
for _, tt := range testcases {
t.Run(tt.name, func(t *testing.T) {
scanner := NewGoogleSearchScanner()
remote := NewLibrary()
remote := NewLibrary(filter.NewEngine())
remote.AddScanner(scanner)

if !scanner.ShouldRun() {
Expand Down
3 changes: 2 additions & 1 deletion lib/remote/local_scanner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package remote

import (
"github.com/stretchr/testify/assert"
"github.com/sundowndev/phoneinfoga/v2/lib/filter"
"github.com/sundowndev/phoneinfoga/v2/lib/number"
"testing"
)
Expand Down Expand Up @@ -35,7 +36,7 @@ func TestLocalScanner(t *testing.T) {
for _, tt := range testcases {
t.Run(tt.name, func(t *testing.T) {
scanner := NewLocalScanner()
remote := NewLibrary()
remote := NewLibrary(filter.NewEngine())
remote.AddScanner(scanner)

if !scanner.ShouldRun() {
Expand Down
3 changes: 2 additions & 1 deletion lib/remote/numverify_scanner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package remote
import (
"errors"
"github.com/stretchr/testify/assert"
"github.com/sundowndev/phoneinfoga/v2/lib/filter"
"github.com/sundowndev/phoneinfoga/v2/lib/number"
"github.com/sundowndev/phoneinfoga/v2/lib/remote/suppliers"
"github.com/sundowndev/phoneinfoga/v2/mocks"
Expand Down Expand Up @@ -91,7 +92,7 @@ func TestNumverifyScanner(t *testing.T) {
tt.mocks(numverifySupplierMock)

scanner := NewNumverifyScanner(numverifySupplierMock)
remote := NewLibrary()
remote := NewLibrary(filter.NewEngine())
remote.AddScanner(scanner)

got, errs := remote.Scan(tt.number)
Expand Down
3 changes: 2 additions & 1 deletion lib/remote/ovh_scanner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package remote
import (
"errors"
"github.com/stretchr/testify/assert"
"github.com/sundowndev/phoneinfoga/v2/lib/filter"
"github.com/sundowndev/phoneinfoga/v2/lib/number"
"github.com/sundowndev/phoneinfoga/v2/lib/remote/suppliers"
"github.com/sundowndev/phoneinfoga/v2/mocks"
Expand Down Expand Up @@ -69,7 +70,7 @@ func TestOVHScanner(t *testing.T) {
tt.mocks(OVHSupplierMock)

scanner := NewOVHScanner(OVHSupplierMock)
remote := NewLibrary()
remote := NewLibrary(filter.NewEngine())
remote.AddScanner(scanner)

got, errs := remote.Scan(tt.number)
Expand Down
11 changes: 10 additions & 1 deletion lib/remote/remote.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package remote

import (
"github.com/sirupsen/logrus"
"github.com/sundowndev/phoneinfoga/v2/lib/filter"
"github.com/sundowndev/phoneinfoga/v2/lib/number"
"sync"
)
Expand All @@ -10,6 +12,7 @@ type Library struct {
scanners []Scanner
results map[string]interface{}
errors map[string]error
filter filter.Filter
}

type Scanner interface {
Expand All @@ -18,12 +21,13 @@ type Scanner interface {
Identifier() string
}

func NewLibrary() *Library {
func NewLibrary(filterEngine filter.Filter) *Library {
return &Library{
m: &sync.RWMutex{},
scanners: []Scanner{},
results: map[string]interface{}{},
errors: map[string]error{},
filter: filterEngine,
}
}

Expand All @@ -50,6 +54,11 @@ func (r *Library) Scan(n *number.Number) (map[string]interface{}, map[string]err
var wg sync.WaitGroup

for _, s := range r.scanners {
if r.filter.Match(s.Identifier()) {
logrus.WithField("scanner", s.Identifier()).Debug("Scanner was ignored by filter")
continue
}

wg.Add(1)

go func(s Scanner) {
Expand Down
13 changes: 7 additions & 6 deletions lib/remote/remote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package remote
import (
"errors"
"github.com/stretchr/testify/assert"
"github.com/sundowndev/phoneinfoga/v2/lib/filter"
"github.com/sundowndev/phoneinfoga/v2/lib/number"
"github.com/sundowndev/phoneinfoga/v2/mocks"
"testing"
Expand All @@ -25,15 +26,15 @@ func TestRemoteLibrarySuccessScan(t *testing.T) {

fakeScanner := &mocks.Scanner{}
fakeScanner.On("ShouldRun").Return(true).Once()
fakeScanner.On("Identifier").Return("fake").Once()
fakeScanner.On("Identifier").Return("fake").Times(2)
fakeScanner.On("Scan", num).Return(fakeScannerResponse{Valid: true}, nil).Once()

fakeScanner2 := &mocks.Scanner{}
fakeScanner2.On("ShouldRun").Return(true).Once()
fakeScanner2.On("Identifier").Return("fake2").Once()
fakeScanner2.On("Identifier").Return("fake2").Times(2)
fakeScanner2.On("Scan", num).Return(fakeScannerResponse{Valid: false}, nil).Once()

lib := NewLibrary()
lib := NewLibrary(filter.NewEngine())

lib.AddScanner(fakeScanner)
lib.AddScanner(fakeScanner2)
Expand All @@ -56,10 +57,10 @@ func TestRemoteLibraryFailedScan(t *testing.T) {

fakeScanner := &mocks.Scanner{}
fakeScanner.On("ShouldRun").Return(true).Once()
fakeScanner.On("Identifier").Return("fake").Once()
fakeScanner.On("Identifier").Return("fake").Times(2)
fakeScanner.On("Scan", num).Return(nil, dummyError).Once()

lib := NewLibrary()
lib := NewLibrary(filter.NewEngine())

lib.AddScanner(fakeScanner)

Expand All @@ -79,7 +80,7 @@ func TestRemoteLibraryEmptyScan(t *testing.T) {
fakeScanner := &mocks.Scanner{}
fakeScanner.On("ShouldRun").Return(false).Once()

lib := NewLibrary()
lib := NewLibrary(filter.NewEngine())

lib.AddScanner(fakeScanner)

Expand Down

0 comments on commit 4df45da

Please sign in to comment.