Skip to content

Commit 8b713be

Browse files
committed
add []byte function
1 parent 63cdb28 commit 8b713be

File tree

11 files changed

+268
-91
lines changed

11 files changed

+268
-91
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
.vscode
44
cert-fetcher
55
dist
6-
coverage.out
6+
coverage.out
7+
.idea

Makefile

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Run go fmt against code
2+
fmt:
3+
go fmt ./...
4+
gofmt -s -w .
5+
6+
# Run go vet against code
7+
vet:
8+
go vet ./...
9+
10+
# Run go mod tidy
11+
tidy:
12+
go mod tidy
13+
14+
# Run tests
15+
test: tidy fmt vet
16+
go test ./... -coverprofile=coverage.out
17+
go tool cover -func=coverage.out
18+
19+
# Run ci tests
20+
test-ci: test
21+
goveralls -service=travis-ci -v -coverprofile=coverage.out
22+
23+
release: tools
24+
goreleaser --rm-dist
25+
26+
test-release: tools
27+
goreleaser --skip-publish --snapshot --rm-dist
28+
29+
tools:
30+
ifeq (, $(shell which goreleaser))
31+
$(shell go get github.com/goreleaser/goreleaser)
32+
endif

cert/cert.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ func Print(targetURL string) error {
3232
return err
3333
}
3434
for i, cert := range certs {
35-
fmt.Fprintf(out, certTemplate, i, cert.Subject.CommonName, cert.Issuer.CommonName, cert.NotBefore.In(loc).String(), cert.NotAfter.In(loc).String())
35+
if _, err = fmt.Fprintf(out, certTemplate, i, cert.Subject.CommonName, cert.Issuer.CommonName, cert.NotBefore.In(loc).String(), cert.NotAfter.In(loc).String()); err != nil {
36+
return err
37+
}
3638
}
3739
return nil
3840
}
@@ -51,7 +53,7 @@ func FetchCertificates(targetURL string) ([]*x509.Certificate, error) {
5153
if resp.TLS != nil {
5254
return resp.TLS.PeerCertificates, err
5355
}
54-
return nil, fmt.Errorf("Could not find any certificates")
56+
return nil, fmt.Errorf("could not find any certificates")
5557
}
5658

5759
// IsToExport check whether the current index is to be exported
@@ -69,7 +71,7 @@ func IsToExport(certIndexes []int, i int) bool {
6971

7072
// PrintAdd print an add statement
7173
func PrintAdd(i int, cert *x509.Certificate) {
72-
fmt.Fprintf(out, " + Adding certificate #%d: %s\n", i, cert.Subject.CommonName)
74+
_, _ = fmt.Fprintf(out, " + Adding certificate #%d: %s\n", i, cert.Subject.CommonName)
7375
}
7476

7577
// PrintSkip print an skip statement
@@ -79,5 +81,5 @@ func PrintSkip(i int, cert *x509.Certificate) {
7981

8082
// PrintSkipDetailed print an skip statement
8183
func PrintSkipDetailed(i int, cert *x509.Certificate, detail string) {
82-
fmt.Fprintf(out, " - Skipping certificate #%d: %s %s\n", i, cert.Subject.CommonName, detail)
84+
_, _ = fmt.Fprintf(out, " - Skipping certificate #%d: %s %s\n", i, cert.Subject.CommonName, detail)
8385
}

cert/jks/jks.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ func exportCerts(certs []*x509.Certificate, targetURL string, certIndexes []int,
3636
if err != nil {
3737
return err
3838
}
39-
defer s.Close()
39+
defer closeIt(s)
4040
ks, err = keystore.Decode(s, []byte(jksPassword))
4141
if err != nil {
4242
return err
4343
}
4444
additional = " additional"
45-
fmt.Fprintf(out, "Using existing java keystore %s to add the new certificates\n", jksSource)
45+
_, _ = fmt.Fprintf(out, "Using existing java keystore %s to add the new certificates\n", jksSource)
4646
} else {
4747
ks = keystore.KeyStore{}
4848
}
@@ -79,10 +79,12 @@ func exportCerts(certs []*x509.Certificate, targetURL string, certIndexes []int,
7979
}
8080

8181
k, _ := os.Create(fileName)
82-
defer k.Close()
83-
keystore.Encode(k, ks, []byte(jksPassword))
84-
fmt.Fprintf(out, "java keystore file %s with %d%s certificate(s) created.\n", fileName, cnt, additional)
85-
return nil
82+
defer closeIt(k)
83+
if err := keystore.Encode(k, ks, []byte(jksPassword)); err != nil {
84+
return err
85+
}
86+
_, err := fmt.Fprintf(out, "java keystore file %s with %d%s certificate(s) created.\n", fileName, cnt, additional)
87+
return err
8688
}
8789

8890
func alias(cert *x509.Certificate) string {
@@ -101,3 +103,7 @@ func alreadyContained(ks keystore.KeyStore, cert *x509.Certificate, index int) b
101103
}
102104
return false
103105
}
106+
107+
func closeIt(s *os.File) {
108+
_ = s.Close()
109+
}

cert/pem/pem.go

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,42 @@ var (
1616
out io.Writer = os.Stdout // modified during testing
1717
)
1818

19-
// Export Export the certificates from the target URL into a pem file
20-
func Export(targetURL string, certIndexes []int, outputFile string) error {
21-
certs, err := c.FetchCertificates(targetURL)
19+
// ExportTo ExportTo the certificates from the target URL into a pem file
20+
func ExportTo(targetURL string, certIndexes []int, outputFile string) error {
21+
data, cnt, err := Export(targetURL, certIndexes)
22+
23+
if err != nil {
24+
return err
25+
}
26+
var fileName string
27+
if outputFile != "" {
28+
fileName = outputFile
29+
} else {
30+
u, _ := url.Parse(targetURL)
31+
fileName = u.Host + ".pem"
32+
}
33+
f, err := os.Create(fileName)
34+
2235
if err != nil {
2336
return err
2437
}
25-
return exportCerts(certs, targetURL, certIndexes, outputFile)
38+
39+
defer func() { _ = f.Close() }()
40+
_, _ = f.Write(data)
41+
_, _ = fmt.Fprintf(out, "pem file %s with %d certificate(s) created.\n", fileName, cnt)
42+
return nil
2643
}
2744

28-
func exportCerts(certs []*x509.Certificate, targetURL string, certIndexes []int, outputFile string) error {
45+
// Export Export the certificates from the target URL
46+
func Export(targetURL string, certIndexes []int) ([]byte, int, error) {
47+
certs, err := c.FetchCertificates(targetURL)
48+
if err != nil {
49+
return nil, 0, err
50+
}
51+
return exportCerts(certs, certIndexes)
52+
}
53+
54+
func exportCerts(certs []*x509.Certificate, certIndexes []int) ([]byte, int, error) {
2955

3056
var pemBytes bytes.Buffer
3157
cnt := 0
@@ -34,31 +60,15 @@ func exportCerts(certs []*x509.Certificate, targetURL string, certIndexes []int,
3460
c.PrintAdd(i, cert)
3561
err := toPEM(&pemBytes, cert)
3662
if err != nil {
37-
return err
63+
return nil, 0, err
3864
}
3965
cnt++
4066
} else {
4167
c.PrintSkip(i, cert)
4268
}
4369
}
4470

45-
var fileName string
46-
if outputFile != "" {
47-
fileName = outputFile
48-
} else {
49-
u, _ := url.Parse(targetURL)
50-
fileName = u.Host + ".pem"
51-
}
52-
f, err := os.Create(fileName)
53-
54-
if err != nil {
55-
return err
56-
}
57-
58-
defer f.Close()
59-
f.Write(pemBytes.Bytes())
60-
fmt.Fprintf(out, "pem file %s with %d certificate(s) created.\n", fileName, cnt)
61-
return nil
71+
return pemBytes.Bytes(), cnt, nil
6272
}
6373

6474
func toPEM(pemBytes *bytes.Buffer, cert *x509.Certificate) error {

cert/pem/pem_public_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func Test_Export(t *testing.T) {
1616
defer ts.Close()
1717

1818
outFile := "test-cert.pem"
19-
err := pem.Export(ts.URL, []int{0}, outFile)
19+
err := pem.ExportTo(ts.URL, []int{0}, outFile)
2020
assert.NoError(t, err)
21-
os.Remove("test-cert.pem")
21+
_ = os.Remove("test-cert.pem")
2222
}

cert/pem/pem_test.go

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,27 @@
11
package pem
22

33
import (
4-
"bytes"
54
"crypto/x509"
6-
"os"
75
"testing"
86

97
"github.com/bakito/cert-fetcher/cert/test"
108
"github.com/stretchr/testify/assert"
119
)
1210

1311
func Test_exportCerts_min(t *testing.T) {
14-
15-
out, revert := mockPrintTarget()
16-
defer revert()
17-
18-
err := exportCerts([]*x509.Certificate{test.NewCert(t)}, "https://foo.bar", nil, "")
12+
_, cnt, err := exportCerts([]*x509.Certificate{test.NewCert(t)}, nil)
1913
assert.NoError(t, err)
20-
assert.Equal(t, "pem file foo.bar.pem with 1 certificate(s) created.\n", out.String())
21-
os.Remove("foo.bar.pem")
14+
assert.Equal(t, 1, cnt)
2215
}
2316

2417
func Test_exportCerts_cert_0_with_name(t *testing.T) {
25-
26-
out, revert := mockPrintTarget()
27-
defer revert()
28-
29-
err := exportCerts([]*x509.Certificate{test.NewCert(t)}, "https://foo.bar", []int{0}, "file-name.pem")
18+
_, cnt, err := exportCerts([]*x509.Certificate{test.NewCert(t)}, []int{0})
3019
assert.NoError(t, err)
31-
assert.Equal(t, "pem file file-name.pem with 1 certificate(s) created.\n", out.String())
32-
os.Remove("file-name.pem")
20+
assert.Equal(t, 1, cnt)
3321
}
3422

3523
func Test_exportCerts_cert_1(t *testing.T) {
36-
37-
out, revert := mockPrintTarget()
38-
defer revert()
39-
40-
err := exportCerts([]*x509.Certificate{test.NewCert(t)}, "https://foo.bar", []int{1}, "")
24+
_, cnt, err := exportCerts([]*x509.Certificate{test.NewCert(t)}, []int{1})
4125
assert.NoError(t, err)
42-
assert.Equal(t, "pem file foo.bar.pem with 0 certificate(s) created.\n", out.String())
43-
os.Remove("foo.bar.pem")
44-
}
45-
46-
func mockPrintTarget() (*bytes.Buffer, func()) {
47-
bak := out
48-
mock := new(bytes.Buffer)
49-
out = mock
50-
return mock, func() {
51-
out = bak
52-
}
26+
assert.Equal(t, 0, cnt)
5327
}

cmd/pem.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ var pemCmd = &cobra.Command{
1313
Long: "store the certificates as pem file",
1414

1515
RunE: func(cmd *cobra.Command, args []string) error {
16-
return pem.Export(targetURL, certIndexes, outputFile)
16+
return pem.ExportTo(targetURL, certIndexes, outputFile)
1717
},
1818
}
1919

cmd/root.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ var rootCmd = &cobra.Command{
2222
Short: "Fetch client certificates from https urls",
2323
Long: "A go application that fetches public certificates from https sites and stores them into different output formates.",
2424
RunE: func(cmd *cobra.Command, args []string) error {
25-
2625
return cert.Print(targetURL)
2726
},
2827
}
@@ -38,7 +37,7 @@ func Execute() {
3837

3938
func init() {
4039
rootCmd.PersistentFlags().StringVarP(&targetURL, "url", "u", "", "the URL to fetch the certificate from")
41-
rootCmd.MarkPersistentFlagRequired("url")
40+
_ = rootCmd.MarkPersistentFlagRequired("url")
4241
rootCmd.PersistentFlags().StringVarP(&outputFile, "out-file", "o", "", "the output file")
4342
rootCmd.PersistentFlags().IntSliceVarP(&certIndexes, "import-at", "i", make([]int, 0), "import the certificates at the given indexes")
4443
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
module github.com/bakito/cert-fetcher
22

3-
go 1.13
3+
go 1.15
44

55
require (
66
github.com/pavel-v-chernykh/keystore-go v2.1.0+incompatible
7-
github.com/spf13/cobra v0.0.7
7+
github.com/spf13/cobra v1.1.1
88
github.com/stretchr/testify v1.6.1
99
)

0 commit comments

Comments
 (0)