Skip to content

Commit bc2cbec

Browse files
bug fixes example tests and more (#163)
* example test bug fix and more * fix lint error * fix spacing in examples/simple.go
1 parent 6677754 commit bc2cbec

File tree

15 files changed

+112
-64
lines changed

15 files changed

+112
-64
lines changed

.github/workflows/build-test.yml

+4
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,9 @@ jobs:
3232
- name: Race Condition Tests
3333
run: go build -race .
3434
working-directory: cmd/tlsx/
35+
36+
- name: Test Example Code
37+
run: go run .
38+
working-directory: examples/
3539

3640

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<p align="center">
88
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-_red.svg"></a>
99
<a href="https://goreportcard.com/badge/github.com/projectdiscovery/tlsx"><img src="https://goreportcard.com/badge/github.com/projectdiscovery/tlsx"></a>
10+
<a href="https://pkg.go.dev/github.com/projectdiscovery/tlsx/pkg/tlsx"><img src="https://img.shields.io/badge/go-reference-blue"></a>
1011
<a href="https://github.com/projectdiscovery/tlsx/releases"><img src="https://img.shields.io/github/release/projectdiscovery/tlsx"></a>
1112
<a href="https://twitter.com/pdiscoveryio"><img src="https://img.shields.io/twitter/follow/pdiscoveryio.svg?logo=twitter"></a>
1213
<a href="https://discord.gg/projectdiscovery"><img src="https://img.shields.io/discord/695645237418131507.svg?logo=discord"></a>
@@ -124,6 +125,10 @@ OUTPUT:
124125
-version display project version
125126
```
126127

128+
## Using tlsx as library
129+
130+
Examples of using tlsx as library are provided in the [examples](examples/) folder.
131+
127132
## Running tlsx
128133

129134
### Input for tlsx

assets/openssl.include

-13
This file was deleted.

cmd/tlsx/main.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"os"
55
"strings"
66

7-
"github.com/pkg/errors"
87
"github.com/projectdiscovery/goflags"
98
"github.com/projectdiscovery/gologger"
109
"github.com/projectdiscovery/tlsx/internal/runner"
@@ -27,20 +26,20 @@ func main() {
2726

2827
func process() error {
2928
if err := readFlags(); err != nil {
30-
return errors.Wrap(err, "could not read flags")
29+
return errorutils.NewWithErr(err).Msgf("could not read flags")
3130
}
3231
runner, err := runner.New(options)
3332
if err != nil {
34-
return errors.Wrap(err, "could not create runner")
33+
return errorutils.NewWithErr(err).Msgf("could not create runner")
3534
}
3635
if runner == nil {
3736
return nil
3837
}
3938
if err := runner.Execute(); err != nil {
40-
return errors.Wrap(err, "could not execute runner")
39+
return errorutils.NewWithErr(err).Msgf("could not execute runner")
4140
}
4241
if err := runner.Close(); err != nil {
43-
return errors.Wrap(err, "could not close runner")
42+
return errorutils.NewWithErr(err).Msgf("could not close runner")
4443
}
4544
return nil
4645
}
@@ -126,12 +125,12 @@ func readFlags() error {
126125
)
127126

128127
if err := flagSet.Parse(); err != nil {
129-
return errors.Wrap(err, "could not parse flags")
128+
return errorutils.NewWithErr(err).Msgf("could not parse flags")
130129
}
131130

132131
if cfgFile != "" {
133132
if err := flagSet.MergeConfigFile(cfgFile); err != nil {
134-
return errors.Wrap(err, "could not read config file")
133+
return errorutils.NewWithErr(err).Msgf("could not read config file")
135134
}
136135
}
137136
return nil

examples/simple.go

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/projectdiscovery/tlsx/pkg/tlsx"
7+
"github.com/projectdiscovery/tlsx/pkg/tlsx/clients"
8+
)
9+
10+
func main() {
11+
// setup tlsx client with options
12+
// https://pkg.go.dev/github.com/projectdiscovery/tlsx/pkg/tlsx/clients#Options
13+
opts := &clients.Options{
14+
TLSVersion: true,
15+
Retries: 3,
16+
Expired: true,
17+
}
18+
19+
// available scanmodes
20+
allmodes := []string{"auto", "openssl", "ctls", "ztls"}
21+
22+
for _, scanMode := range allmodes {
23+
opts.ScanMode = scanMode
24+
// create tlsx service with options
25+
service, err := tlsx.New(opts)
26+
if err != nil {
27+
panic(err)
28+
}
29+
30+
// connect to any host either with hostname or ip
31+
// service.Connect(hostname, ip , port string)
32+
resp, err := service.Connect("scanme.sh", "", "443")
33+
if err != nil {
34+
panic(err)
35+
}
36+
37+
fmt.Printf("[%v] scan-mode:%-7v tls-version:%v self-signed:%v cipher:%v\n", resp.Host, scanMode, resp.Version, resp.SelfSigned, resp.Cipher)
38+
}
39+
}

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ require (
77
github.com/json-iterator/go v1.1.12
88
github.com/logrusorgru/aurora v2.0.3+incompatible
99
github.com/miekg/dns v1.1.50
10-
github.com/pkg/errors v0.9.1
1110
github.com/projectdiscovery/dnsx v1.1.1
1211
github.com/projectdiscovery/fastdialer v0.0.21
1312
github.com/projectdiscovery/goflags v0.1.6
@@ -56,6 +55,7 @@ require (
5655
github.com/modern-go/reflect2 v1.0.2 // indirect
5756
github.com/nwaples/rardecode v1.1.0 // indirect
5857
github.com/pierrec/lz4 v2.6.0+incompatible // indirect
58+
github.com/pkg/errors v0.9.1 // indirect
5959
github.com/pmezard/go-difflib v1.0.0 // indirect
6060
github.com/projectdiscovery/asnmap v0.0.1 // indirect
6161
github.com/projectdiscovery/blackrock v0.0.0-20220628111055-35616c71b2dc // indirect

internal/runner/banner.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package runner
33
import (
44
"fmt"
55

6-
"github.com/pkg/errors"
76
"github.com/projectdiscovery/gologger"
87
"github.com/projectdiscovery/gologger/levels"
8+
errorutils "github.com/projectdiscovery/utils/errors"
99
fileutil "github.com/projectdiscovery/utils/file"
1010
)
1111

@@ -28,20 +28,20 @@ func (r *Runner) validateOptions() error {
2828
}
2929
probeSpecified := r.options.SO || r.options.TLSVersion || r.options.Cipher || r.options.Expired || r.options.SelfSigned || r.options.Hash != "" || r.options.Jarm || r.options.MisMatched || r.options.Revoked || r.options.WildcardCertCheck
3030
if r.options.RespOnly && probeSpecified {
31-
return errors.New("resp-only flag can only be used with san and cn flags")
31+
return errorutils.New("resp-only flag can only be used with san and cn flags")
3232
}
3333
if (r.options.SAN || r.options.CN) && probeSpecified {
34-
return errors.New("san or cn flag cannot be used with other probes")
34+
return errorutils.New("san or cn flag cannot be used with other probes")
3535
}
3636
if !r.hasStdin && len(r.options.Inputs) == 0 && r.options.InputList == "" {
37-
return errors.New("no input provided for enumeration")
37+
return errorutils.New("no input provided for enumeration")
3838
}
3939
if len(r.options.Ports) == 0 {
4040
// Append port 443 for default ports
4141
r.options.Ports = append(r.options.Ports, "443")
4242
}
4343
if r.options.CertsOnly && !(r.options.ScanMode == "ztls" || r.options.ScanMode == "auto") {
44-
return errors.New("scan-mode must be ztls or auto with certs-only option")
44+
return errorutils.New("scan-mode must be ztls or auto with certs-only option")
4545
}
4646
if r.options.CertsOnly || r.options.Ja3 {
4747
r.options.ScanMode = "ztls" // force setting ztls when using certs-only

internal/runner/runner.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"time"
1111

1212
"github.com/miekg/dns"
13-
"github.com/pkg/errors"
1413
"github.com/projectdiscovery/dnsx/libs/dnsx"
1514
"github.com/projectdiscovery/fastdialer/fastdialer"
1615
"github.com/projectdiscovery/gologger"
@@ -23,6 +22,7 @@ import (
2322
"github.com/projectdiscovery/tlsx/pkg/tlsx"
2423
"github.com/projectdiscovery/tlsx/pkg/tlsx/clients"
2524
"github.com/projectdiscovery/tlsx/pkg/tlsx/openssl"
25+
errorutil "github.com/projectdiscovery/utils/errors"
2626
iputil "github.com/projectdiscovery/utils/ip"
2727
sliceutil "github.com/projectdiscovery/utils/slice"
2828
)
@@ -57,7 +57,7 @@ func New(options *clients.Options) (*Runner, error) {
5757
}
5858
runner := &Runner{options: options}
5959
if err := runner.validateOptions(); err != nil {
60-
return nil, errors.Wrap(err, "could not validate options")
60+
return nil, errorutil.NewWithErr(err).Msgf("could not validate options")
6161
}
6262

6363
dialerOpts := fastdialer.DefaultOptions
@@ -69,7 +69,7 @@ func New(options *clients.Options) (*Runner, error) {
6969
}
7070
fastDialer, err := fastdialer.NewDialer(dialerOpts)
7171
if err != nil {
72-
return nil, errors.Wrap(err, "could not create dialer")
72+
return nil, errorutil.NewWithErr(err).Msgf("could not create dialer")
7373
}
7474
runner.fastDialer = fastDialer
7575
runner.options.Fastdialer = fastDialer
@@ -90,7 +90,7 @@ func New(options *clients.Options) (*Runner, error) {
9090

9191
outputWriter, err := output.New(options)
9292
if err != nil {
93-
return nil, errors.Wrap(err, "could not create output writer")
93+
return nil, errorutil.NewWithErr(err).Msgf("could not create output writer")
9494
}
9595
runner.outputWriter = outputWriter
9696

@@ -184,7 +184,7 @@ func (r *Runner) normalizeAndQueueInputs(inputs chan taskInput) error {
184184
if r.options.InputList != "" {
185185
file, err := os.Open(r.options.InputList)
186186
if err != nil {
187-
return errors.Wrap(err, "could not open input file")
187+
return errorutil.NewWithErr(err).Msgf("could not open input file")
188188
}
189189
defer file.Close()
190190

pkg/output/output.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import (
99

1010
jsoniter "github.com/json-iterator/go"
1111
"github.com/logrusorgru/aurora"
12-
"github.com/pkg/errors"
1312
"github.com/projectdiscovery/tlsx/pkg/tlsx/clients"
13+
errorutil "github.com/projectdiscovery/utils/errors"
1414
"golang.org/x/exp/maps"
1515
)
1616

@@ -40,7 +40,7 @@ func New(options *clients.Options) (Writer, error) {
4040
if options.OutputFile != "" {
4141
output, err := newFileOutputWriter(options.OutputFile)
4242
if err != nil {
43-
return nil, errors.Wrap(err, "could not create output file")
43+
return nil, errorutil.NewWithErr(err).Msgf("could not create output file")
4444
}
4545
outputFile = output
4646
}
@@ -65,7 +65,7 @@ func (w *StandardWriter) Write(event *clients.Response) error {
6565
data, err = w.formatStandard(event)
6666
}
6767
if err != nil {
68-
return errors.Wrap(err, "could not format output")
68+
return errorutil.NewWithErr(err).Msgf("could not format output")
6969
}
7070
data = bytes.TrimSuffix(data, []byte("\n")) // remove last newline
7171

@@ -78,7 +78,7 @@ func (w *StandardWriter) Write(event *clients.Response) error {
7878
data = decolorizerRegex.ReplaceAll(data, []byte(""))
7979
}
8080
if writeErr := w.outputFile.Write(data); writeErr != nil {
81-
return errors.Wrap(err, "could not write to output")
81+
return errorutil.NewWithErr(err).Msgf("could not write to output")
8282
}
8383
}
8484
return nil
@@ -101,11 +101,11 @@ func (w *StandardWriter) formatJSON(output *clients.Response) ([]byte, error) {
101101
// formatStandard formats the output for standard client formatting
102102
func (w *StandardWriter) formatStandard(output *clients.Response) ([]byte, error) {
103103
if output == nil {
104-
return nil, errors.New("empty certificate response")
104+
return nil, errorutil.New("empty certificate response")
105105
}
106106

107107
if output.CertificateResponse == nil {
108-
return nil, errors.New("empty leaf certificate")
108+
return nil, errorutil.New("empty leaf certificate")
109109
}
110110

111111
builder := &bytes.Buffer{}

pkg/tlsx/auto/auto.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
package auto
44

55
import (
6-
"github.com/pkg/errors"
76
"github.com/projectdiscovery/tlsx/pkg/output/stats"
87
"github.com/projectdiscovery/tlsx/pkg/tlsx/clients"
98
"github.com/projectdiscovery/tlsx/pkg/tlsx/openssl"
@@ -56,7 +55,7 @@ func (c *Client) ConnectWithOptions(hostname, ip, port string, options clients.C
5655
stats.IncrementOpensslTLSConnections()
5756
return response, nil
5857
}
59-
if errors.Is(opensslErr, openssl.ErrNotAvailable) {
58+
if errorutils.IsAny(opensslErr, openssl.ErrNotAvailable) {
6059
opensslErr = nil
6160
}
6261
}

pkg/tlsx/openssl/openssl.go

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ func (c *Client) ConnectWithOptions(hostname, ip, port string, options clients.C
3939
} else {
4040
address = net.JoinHostPort(hostname, port)
4141
}
42+
//validation
43+
if (hostname == "" && ip == "") || port == "" {
44+
return nil, errorutils.NewWithTag("openssl", "client requires valid address got port=%v,hostname=%v,ip=%v", port, hostname, ip)
45+
}
4246

4347
// Note: CLI options are omitted if given value is empty
4448
opensslOptions := &Options{

pkg/tlsx/openssl/openssl_exec.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,12 @@ readline:
135135
case strings.HasPrefix(line, "Master-Key"):
136136
osession.MasterKey = parseSessionValue(line)
137137
}
138-
if !strings.HasPrefix(line, "Extended master secret") {
138+
if strings.HasPrefix(line, "Timeout") {
139139
// read until end of session data and return
140140
return osession, nil
141141
}
142-
} else {
143-
goto readline
144142
}
145-
return osession, nil
143+
goto readline
146144
}
147145

148146
// parseCertificate dumped by openssl

0 commit comments

Comments
 (0)