Skip to content

Commit ba93a2e

Browse files
authored
Merge pull request #27 from tchaurasiya/fix-getAsBase64
fix issues for getAsBase64 template
2 parents 604c0b4 + 471bb86 commit ba93a2e

File tree

3 files changed

+91
-12
lines changed

3 files changed

+91
-12
lines changed

task/expression/custom_resolver.go

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

33
import (
4+
"bytes"
45
"encoding/json"
56

67
"github.com/drone/go-task/task/common"
@@ -36,10 +37,16 @@ func (r *CustomResolver) Resolve(data []byte) ([]byte, error) {
3637
// evaluate the expressions
3738
evaler.Eval(v, r.secrets)
3839

39-
// encode the map back to []byte
40-
resolved, err := json.Marshal(v)
40+
// encode the map back to []byte using a custom encoder that doesn't escape HTML
41+
buf := &bytes.Buffer{}
42+
encoder := json.NewEncoder(buf)
43+
encoder.SetEscapeHTML(false)
44+
err = encoder.Encode(v)
4145
if err != nil {
4246
return nil, err
4347
}
48+
49+
// trim the trailing newline that Encode adds
50+
resolved := bytes.TrimSpace(buf.Bytes())
4451
return resolved, nil
4552
}

task/expression/resolver_ifc.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,25 @@ func New(secrets []*common.Secret) *Resolver {
1919
}
2020

2121
func (r *Resolver) Resolve(taskData []byte) ([]byte, error) {
22-
if bytes.Contains(taskData, []byte("${{secrets")) {
23-
resolver := newCustomResolver(r.secrets)
24-
resolvedTaskData, err := resolver.Resolve(taskData)
22+
// Start with the original task data
23+
currentData := taskData
24+
25+
// First pass: Handle custom secrets syntax (${{secrets...}})
26+
if bytes.Contains(currentData, []byte("${{secrets")) {
27+
customResolver := newCustomResolver(r.secrets)
28+
resolvedData, err := customResolver.Resolve(currentData)
2529
if err != nil {
2630
return nil, err
2731
}
28-
return resolvedTaskData, nil
32+
currentData = resolvedData // Update current data with resolved result
2933
}
30-
//return taskData, nil
31-
resolver := newTemplateResolver(r.secrets)
32-
resolvedTaskData, err := resolver.Resolve(taskData)
34+
35+
// Second pass: Handle template resolver syntax
36+
templateResolver := newTemplateResolver(r.secrets)
37+
finalResolvedData, err := templateResolver.Resolve(currentData)
3338
if err != nil {
3439
return nil, err
3540
}
36-
return resolvedTaskData, nil
41+
42+
return finalResolvedData, nil
3743
}

task/expression/template_resolver.go

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

33
import (
44
"bytes"
5+
"strings"
56
"text/template"
67

78
"github.com/drone/go-task/task/common"
@@ -27,11 +28,77 @@ func (r *TemplateResolver) Resolve(data []byte) ([]byte, error) {
2728
secretMap[secret.ID] = secret.Value
2829
}
2930

31+
// Extract and process template expressions
32+
input := string(data)
33+
start := 0
34+
processed := ""
35+
36+
for {
37+
// Find start of template expression
38+
startIdx := strings.Index(input[start:], RESOLVER_DELIM_START)
39+
if startIdx == -1 {
40+
// No more template expressions found
41+
processed += input[start:]
42+
break
43+
}
44+
startIdx += start
45+
46+
// Find end of template expression
47+
endIdx := strings.Index(input[startIdx:], RESOLVER_DELIM_END)
48+
if endIdx == -1 {
49+
// No matching end delimiter found
50+
processed += input[start:]
51+
break
52+
}
53+
endIdx += startIdx + len(RESOLVER_DELIM_END)
54+
55+
// Add everything before the template expression
56+
processed += input[start:startIdx]
57+
58+
// Get the template expression content
59+
expr := input[startIdx:endIdx]
60+
if strings.Contains(expr, "getAsBase64") {
61+
// Extract content between delimiters
62+
content := expr[len(RESOLVER_DELIM_START) : len(expr)-len(RESOLVER_DELIM_END)]
63+
// Split by pipe operator
64+
parts := strings.Split(content, "|")
65+
if len(parts) > 0 {
66+
// Get the quoted string part and trim spaces
67+
quotedStr := strings.TrimSpace(parts[0])
68+
69+
// Handle the quoted string
70+
var unescaped string
71+
72+
// handl case use input contains quotes i.e. "abcd"
73+
if strings.HasPrefix(quotedStr, "\\\"") && strings.HasSuffix(quotedStr, "\\\"") {
74+
// Remove only first and last escaped quotes
75+
unescaped = "\"" + quotedStr[2:len(quotedStr)-2] + "\""
76+
} else if strings.HasPrefix(quotedStr, "\"") && strings.HasSuffix(quotedStr, "\"") {
77+
unescaped = quotedStr
78+
}else{
79+
unescaped = "\"" + quotedStr + "\""
80+
}
81+
82+
// Reconstruct the expression
83+
expr = RESOLVER_DELIM_START + " " + unescaped
84+
if len(parts) > 1 {
85+
expr += " |" + parts[1]
86+
}
87+
expr += RESOLVER_DELIM_END
88+
}
89+
}
90+
processed += expr
91+
92+
// Move start to after this template expression
93+
start = endIdx
94+
}
95+
3096
// Parse the template with custom delimiters
3197
tmpl, err := template.New("resolver").
3298
Delims(RESOLVER_DELIM_START, RESOLVER_DELIM_END).
3399
Funcs(TemplateFunctions()). // Include template functions
34-
Parse(string(data))
100+
Parse(processed)
101+
35102
if err != nil {
36103
return nil, err
37104
}
@@ -42,6 +109,5 @@ func (r *TemplateResolver) Resolve(data []byte) ([]byte, error) {
42109
if err != nil {
43110
return nil, err
44111
}
45-
46112
return buf.Bytes(), nil
47113
}

0 commit comments

Comments
 (0)