Skip to content
This repository was archived by the owner on Feb 11, 2025. It is now read-only.

Commit 534a993

Browse files
committed
Change hashFiles template function to generate SHA256 hashes
1 parent 7f43131 commit 534a993

File tree

6 files changed

+42
-31
lines changed

6 files changed

+42
-31
lines changed

internal/plugin/plugin.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package plugin
33

44
import (
5+
"crypto/md5" // #nosec
56
"errors"
67
"fmt"
78
"os"
@@ -89,9 +90,9 @@ func (p *Plugin) Exec() error { // nolint: funlen,cyclop
8990
return fmt.Errorf("parse failed, falling back to default, %w", err)
9091
}
9192

92-
options = append(options, cache.WithFallbackGenerator(keygen.NewHash(p.Metadata.Commit.Branch)))
93+
options = append(options, cache.WithFallbackGenerator(keygen.NewHash(md5.New, p.Metadata.Commit.Branch)))
9394
} else {
94-
generator = keygen.NewHash(p.Metadata.Commit.Branch)
95+
generator = keygen.NewHash(md5.New, p.Metadata.Commit.Branch)
9596
options = append(options, cache.WithFallbackGenerator(keygen.NewStatic(p.Metadata.Commit.Branch)))
9697
}
9798

key/generator/hash.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,35 @@ package generator
22

33
import (
44
"fmt"
5+
hash2 "hash"
56
"io"
67
"strings"
78
)
89

9-
// Hash implements a key generator with md5.
10+
// Hash implements a key generator that uses the specified hash algorithm.
1011
type Hash struct {
12+
hasher func() hash2.Hash
1113
defaultParts []string
1214
}
1315

14-
// NewHash creates a new hash kye generator.
15-
func NewHash(defaultParts ...string) *Hash {
16-
return &Hash{defaultParts: defaultParts}
16+
// NewHash creates a new hash key generator.
17+
func NewHash(hasher func() hash2.Hash, defaultParts ...string) *Hash {
18+
return &Hash{
19+
hasher: hasher,
20+
defaultParts: defaultParts,
21+
}
1722
}
1823

1924
// Generate generates key from given parts or templates as parameter.
2025
func (h *Hash) Generate(parts ...string) (string, error) {
21-
key, err := hash(append(parts, h.defaultParts...)...)
26+
parts = append(parts, h.defaultParts...)
27+
readers := make([]io.Reader, len(parts))
28+
29+
for i, p := range parts {
30+
readers[i] = strings.NewReader(p)
31+
}
32+
33+
key, err := readerHasher(h.hasher, readers...)
2234
if err != nil {
2335
return "", fmt.Errorf("generate hash key for mounted, %w", err)
2436
}
@@ -28,13 +40,3 @@ func (h *Hash) Generate(parts ...string) (string, error) {
2840

2941
// Check checks if generator functional.
3042
func (h *Hash) Check() error { return nil }
31-
32-
// hash generates a key based on given strings (ie. filename paths and branch).
33-
func hash(parts ...string) ([]byte, error) {
34-
readers := make([]io.Reader, len(parts))
35-
for i, p := range parts {
36-
readers[i] = strings.NewReader(p)
37-
}
38-
39-
return readerHasher(readers...)
40-
}

key/generator/hash_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package generator
22

33
import (
4+
"crypto/md5"
45
"testing"
56

67
"github.com/meltwater/drone-cache/test"
@@ -9,7 +10,7 @@ import (
910
func TestGenerateHash(t *testing.T) {
1011
t.Parallel()
1112

12-
actual, err := NewHash().Generate("hash")
13+
actual, err := NewHash(md5.New).Generate("hash")
1314
test.Ok(t, err)
1415

1516
expected := "0800fc577294c34e0b28ad2839435945"

key/generator/metadata.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ package generator
22

33
import (
44
"bytes"
5+
"crypto/md5" // #nosec
6+
"crypto/sha256"
57
"errors"
68
"fmt"
9+
hash2 "hash"
710
"io"
811
"os"
912
"path/filepath"
@@ -92,7 +95,7 @@ func (g *Metadata) parseTemplate() (*template.Template, error) {
9295

9396
func checksumFunc(logger log.Logger) func(string) string {
9497
return func(p string) string {
95-
return fmt.Sprintf("%x", fileHash(p, logger))
98+
return fmt.Sprintf("%x", fileHash(p, logger, md5.New))
9699
}
97100
}
98101

@@ -104,49 +107,55 @@ func hashFilesFunc(logger log.Logger) func(...string) string {
104107
paths, err := filepath.Glob(pattern)
105108
if err != nil {
106109
level.Error(logger).Log("could not parse file path as a glob pattern")
110+
107111
continue
108112
}
109113

110114
for _, p := range paths {
111-
readers = append(readers, bytes.NewReader(fileHash(p, logger)))
115+
readers = append(readers, bytes.NewReader(fileHash(p, logger, sha256.New)))
112116
}
113117
}
114118

115119
if len(readers) == 0 {
116120
level.Debug(logger).Log("no matches found for glob")
121+
117122
return ""
118123
}
119124

120125
level.Debug(logger).Log("found %d files to hash", len(readers))
121126

122-
h, err := readerHasher(readers...)
127+
h, err := readerHasher(sha256.New, readers...)
123128
if err != nil {
124129
level.Error(logger).Log("could not generate the hash of the input files: %s", err.Error())
130+
125131
return ""
126132
}
127133

128134
return fmt.Sprintf("%x", h)
129135
}
130136
}
131137

132-
func fileHash(path string, logger log.Logger) []byte {
138+
func fileHash(path string, logger log.Logger, hasher func() hash2.Hash) []byte {
133139
path, err := filepath.Abs(filepath.Clean(path))
134140
if err != nil {
135141
level.Error(logger).Log("could not compute the absolute file path: %s", err.Error())
142+
136143
return []byte{}
137144
}
138145

139146
f, err := os.Open(path)
140147
if err != nil {
141148
level.Error(logger).Log("could not open the file: %s", err.Error())
149+
142150
return []byte{}
143151
}
144152

145153
defer internal.CloseWithErrLogf(logger, f, "checksum close defer")
146154

147-
h, err := readerHasher(f)
155+
h, err := readerHasher(hasher, f)
148156
if err != nil {
149157
level.Error(logger).Log("could not generate the hash of the input file: %s", err.Error())
158+
150159
return []byte{}
151160
}
152161

key/generator/metadata_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ func TestGenerate(t *testing.T) {
2323
{`{{ checksum "checksum_file_test.txt"}}`, "04a29c732ecbce101c1be44c948a50c6"},
2424
{`{{ checksum "../../docs/drone_env_vars.md"}}`, "f8b5b7f96f3ffaa828e4890aab290e59"},
2525
{`{{ hashFiles "" }}`, ""},
26-
{`{{ hashFiles "checksum_file_test.txt" }}`, "5c3544faf206777a2827f5db8fca3a9a"},
27-
{`{{ hashFiles "checksum_file_test.txt" "checksum_file_test.txt" }}`, "1ce4114d3f702eecca6de4fed10250f3"},
28-
{`{{ hashFiles "checksum_file_tes*.txt" }}`, "5c3544faf206777a2827f5db8fca3a9a"},
26+
{`{{ hashFiles "checksum_file_test.txt" }}`, "b9fff559e00dd879bdffee979ee73e08c67dee2117da071083d3b833cbff7bc8"},
27+
{`{{ hashFiles "checksum_file_test.txt" "checksum_file_test.txt" }}`, "fed16eb2e98f501968c74e261feb26a8776b2ae03b205ad7302f949e75ca455f"},
28+
{`{{ hashFiles "checksum_file_tes*.txt" }}`, "b9fff559e00dd879bdffee979ee73e08c67dee2117da071083d3b833cbff7bc8"},
2929
{`{{ epoch }}`, "1550563151"},
3030
{`{{ arch }}`, runtime.GOARCH},
3131
{`{{ os }}`, runtime.GOOS},

key/generator/util.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package generator
22

33
import (
4-
"crypto/md5" // #nosec
54
"fmt"
5+
hash2 "hash"
66
"io"
77
)
88

9-
// readerHasher generic md5 hash generater from io.Reader.
10-
func readerHasher(readers ...io.Reader) ([]byte, error) {
11-
// Use go1.14 new hashmap functions.
12-
h := md5.New() // #nosec
9+
func readerHasher(hasher func() hash2.Hash, readers ...io.Reader) ([]byte, error) {
10+
h := hasher()
1311

1412
for _, r := range readers {
1513
if _, err := io.Copy(h, r); err != nil {

0 commit comments

Comments
 (0)