Skip to content

Commit 8de1a51

Browse files
committed
Merge pull request #56 from adnanh/development
Bugfixes
2 parents a7aa7f2 + ed9d557 commit 8de1a51

File tree

5 files changed

+97
-17
lines changed

5 files changed

+97
-17
lines changed

hook/hook.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"crypto/sha1"
66
"encoding/hex"
77
"encoding/json"
8-
"errors"
98
"fmt"
109
"io/ioutil"
1110
"reflect"
@@ -31,8 +30,17 @@ const (
3130
EnvNamespace string = "HOOK_"
3231
)
3332

34-
// ErrInvalidPayloadSignature describes an invalid payload signature.
35-
var ErrInvalidPayloadSignature = errors.New("invalid payload signature")
33+
// SignatureError describes an invalid payload signature passed to Hook.
34+
type SignatureError struct {
35+
Signature string
36+
}
37+
38+
func (e *SignatureError) Error() string {
39+
if e == nil {
40+
return "<nil>"
41+
}
42+
return fmt.Sprintf("invalid payload signature %s", e.Signature)
43+
}
3644

3745
// ArgumentError describes an invalid argument passed to Hook.
3846
type ArgumentError struct {
@@ -84,7 +92,7 @@ func CheckPayloadSignature(payload []byte, secret string, signature string) (str
8492
expectedMAC := hex.EncodeToString(mac.Sum(nil))
8593

8694
if !hmac.Equal([]byte(signature), []byte(expectedMAC)) {
87-
err = ErrInvalidPayloadSignature
95+
return expectedMAC, &SignatureError{expectedMAC}
8896
}
8997
return expectedMAC, err
9098
}
@@ -302,6 +310,7 @@ func (h *Hook) ExtractCommandArguments(headers, query, payload *map[string]inter
302310
if arg, ok := h.PassArgumentsToCommand[i].Get(headers, query, payload); ok {
303311
args = append(args, arg)
304312
} else {
313+
args = append(args, "")
305314
return args, &ArgumentError{h.PassArgumentsToCommand[i]}
306315
}
307316
}

hook/hook_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ var hookExtractCommandArgumentsTests = []struct {
123123
}{
124124
{"test", []Argument{Argument{"header", "a"}}, &map[string]interface{}{"a": "z"}, nil, nil, []string{"test", "z"}, true},
125125
// failures
126-
{"fail", []Argument{Argument{"payload", "a"}}, &map[string]interface{}{"a": "z"}, nil, nil, []string{"fail"}, false},
126+
{"fail", []Argument{Argument{"payload", "a"}}, &map[string]interface{}{"a": "z"}, nil, nil, []string{"fail", ""}, false},
127127
}
128128

129129
func TestHookExtractCommandArguments(t *testing.T) {

test/hooks.json.tmpl

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
[
99
{
1010
"source": "payload",
11-
"name": "pusher.email"
11+
"name": "head_commit.timestamp"
1212
}
1313
],
1414
"pass-arguments-to-command":
@@ -19,11 +19,7 @@
1919
},
2020
{
2121
"source": "payload",
22-
"name": "pusher.name"
23-
},
24-
{
25-
"source": "payload",
26-
"name": "pusher.email"
22+
"name": "head_commit.author.email"
2723
}
2824
],
2925
"trigger-rule":

webhook.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,16 +238,16 @@ func handleHook(h *hook.Hook, headers, query, payload *map[string]interface{}, b
238238
cmd.Args, err = h.ExtractCommandArguments(headers, query, payload)
239239
if err != nil {
240240
log.Printf("error extracting command arguments: %s", err)
241-
return ""
242241
}
243242

244-
cmd.Env, err = h.ExtractCommandArgumentsForEnv(headers, query, payload)
243+
var envs []string
244+
envs, err = h.ExtractCommandArgumentsForEnv(headers, query, payload)
245245
if err != nil {
246-
log.Printf("error extracting command arguments: %s", err)
247-
return ""
246+
log.Printf("error extracting command arguments for environment: %s", err)
248247
}
248+
cmd.Env = append(os.Environ(), envs...)
249249

250-
log.Printf("executing %s (%s) with arguments %s and environment %s using %s as cwd\n", h.ExecuteCommand, cmd.Path, cmd.Args, cmd.Env, cmd.Dir)
250+
log.Printf("executing %s (%s) with arguments %q and environment %s using %s as cwd\n", h.ExecuteCommand, cmd.Path, cmd.Args, envs, cmd.Dir)
251251

252252
out, err := cmd.CombinedOutput()
253253

webhook_test.go

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ var hookHandlerTests = []struct {
372372
}`,
373373
false,
374374
http.StatusOK,
375-
`{"output":"arg: 1481a2de7b2a7d02428ad93446ab166be7793fbb Garen Torikian [email protected]\nenv: [email protected]\n"}`,
375+
`{"output":"arg: 1481a2de7b2a7d02428ad93446ab166be7793fbb [email protected]\nenv: HOOK_head_commit.timestamp=2013-03-12T08:14:29-07:00\n"}`,
376376
},
377377
{
378378
"bitbucket", // bitbucket sends their payload using uriencoded params.
@@ -434,5 +434,80 @@ var hookHandlerTests = []struct {
434434
`{"message":"success","output":"arg: b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327 John Smith [email protected]\n"}`,
435435
},
436436

437+
{
438+
"missing-cmd-arg", // missing head_commit.author.email
439+
"github",
440+
map[string]string{"X-Hub-Signature": "ab03955b9377f530aa298b1b6d273ae9a47e1e40"},
441+
`{
442+
"head_commit":{
443+
"added":[
444+
"words/madame-bovary.txt"
445+
],
446+
"author":{
447+
"email":"[email protected]",
448+
"name":"Garen Torikian",
449+
"username":"octokitty"
450+
},
451+
"committer":{
452+
"email":"[email protected]",
453+
"name":"Garen Torikian",
454+
"username":"octokitty"
455+
},
456+
"distinct":true,
457+
"id":"1481a2de7b2a7d02428ad93446ab166be7793fbb",
458+
"message":"Rename madame-bovary.txt to words/madame-bovary.txt",
459+
"modified":[
460+
461+
],
462+
"removed":[
463+
"madame-bovary.txt"
464+
],
465+
"timestamp":"2013-03-12T08:14:29-07:00",
466+
"url":"https://github.com/octokitty/testing/commit/1481a2de7b2a7d02428ad93446ab166be7793fbb"
467+
},
468+
"ref":"refs/heads/master"
469+
}`,
470+
false,
471+
http.StatusOK,
472+
`{"output":"arg: 1481a2de7b2a7d02428ad93446ab166be7793fbb [email protected]\nenv: HOOK_head_commit.timestamp=2013-03-12T08:14:29-07:00\n"}`,
473+
},
474+
475+
{
476+
"missing-env-arg", // missing head_commit.timestamp
477+
"github",
478+
map[string]string{"X-Hub-Signature": "2cf8b878cb6b74a25090a140fa4a474be04b97fa"},
479+
`{
480+
"head_commit":{
481+
"added":[
482+
"words/madame-bovary.txt"
483+
],
484+
"author":{
485+
"email":"[email protected]",
486+
"name":"Garen Torikian",
487+
"username":"octokitty"
488+
},
489+
"committer":{
490+
"email":"[email protected]",
491+
"name":"Garen Torikian",
492+
"username":"octokitty"
493+
},
494+
"distinct":true,
495+
"id":"1481a2de7b2a7d02428ad93446ab166be7793fbb",
496+
"message":"Rename madame-bovary.txt to words/madame-bovary.txt",
497+
"modified":[
498+
499+
],
500+
"removed":[
501+
"madame-bovary.txt"
502+
],
503+
"url":"https://github.com/octokitty/testing/commit/1481a2de7b2a7d02428ad93446ab166be7793fbb"
504+
},
505+
"ref":"refs/heads/master"
506+
}`,
507+
false,
508+
http.StatusOK,
509+
`{"output":"arg: 1481a2de7b2a7d02428ad93446ab166be7793fbb [email protected]\n"}`,
510+
},
511+
437512
{"empty payload", "github", nil, `{}`, false, http.StatusOK, `Hook rules were not satisfied.`},
438513
}

0 commit comments

Comments
 (0)