Passed
Push — master ( 2ef00d...5ef32b )
by Stefano
02:10
created

scan.buildClientFrom   B

Complexity

Conditions 6

Size

Total Lines 28
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 17
nop 1
dl 0
loc 28
rs 8.6166
c 0
b 0
f 0
1
package scan
2
3
import (
4
	"context"
5
	"net"
6
	"net/http"
7
	"net/http/cookiejar"
8
	"net/url"
9
	"time"
10
11
	"github.com/chuckpreslar/emission"
12
	"github.com/pkg/errors"
13
	"github.com/sirupsen/logrus"
14
	"github.com/stefanoj3/dirstalk/pkg/dictionary"
15
	"golang.org/x/net/proxy"
16
)
17
18
// StartScan is a convenience method that wires together all the dependencies needed to start a scan
19
func StartScan(logger *logrus.Logger, eventManager *emission.Emitter, cnf *Config, u *url.URL) error {
20
	c, err := buildClientFrom(cnf)
21
	if err != nil {
22
		return errors.Wrap(err, "failed to build client")
23
	}
24
25
	s := NewScanner(
26
		c,
27
		eventManager,
28
		logger,
29
	)
30
31
	dict, err := dictionary.NewDictionaryFrom(cnf.DictionaryPath, c)
32
	if err != nil {
33
		return errors.Wrap(err, "failed to build dictionary")
34
	}
35
36
	r := NewReProcessor(eventManager, cnf.HTTPMethods, dict)
37
38
	eventManager.On(EventResultFound, r.ReProcess)
39
	eventManager.On(EventTargetProduced, s.AddTarget)
40
	eventManager.On(EventProducerFinished, s.Release)
41
42
	targetProducer := NewTargetProducer(
43
		eventManager,
44
		cnf.HTTPMethods,
45
		dict,
46
		cnf.ScanDepth,
47
	)
48
49
	go targetProducer.Run()
50
51
	logger.WithFields(logrus.Fields{
52
		"url":               u.String(),
53
		"threads":           cnf.Threads,
54
		"dictionary.length": len(dict),
55
	}).Info("Starting scan")
56
57
	s.Scan(u, cnf.Threads)
58
59
	logger.Info("Finished scan")
60
61
	return nil
62
}
63
64
func buildClientFrom(cnf *Config) (Doer, error) {
65
	c := &http.Client{
66
		Timeout: time.Millisecond * time.Duration(cnf.TimeoutInMilliseconds),
67
	}
68
69
	if cnf.UseCookieJar {
70
		jar, err := cookiejar.New(nil)
71
		if err != nil {
72
			return nil, err
73
		}
74
		c.Jar = jar
75
	}
76
77
	if cnf.Socks5Url != nil {
78
		tbDialer, err := proxy.FromURL(cnf.Socks5Url, proxy.Direct)
79
		if err != nil {
80
			return nil, err
81
		}
82
83
		tbTransport := &http.Transport{
84
			DialContext: func(ctx context.Context, network, addr string) (conn net.Conn, e error) {
85
				return tbDialer.Dial(network, addr)
86
			},
87
		}
88
		c.Transport = tbTransport
89
	}
90
91
	return newUserAgentDoerDecorator(c, cnf.UserAgent), nil
92
}
93