Skip to content

Commit fa59de8

Browse files
committed
add secret token support
1 parent de0d103 commit fa59de8

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed

README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ Usage of basichttpdebugger:
4444
save filename format of raw http (default "%Y-%m-%d-%H%i%s-{hostname}-{url}.raw")
4545
-save-raw-http-request
4646
enable saving of raw http request
47+
-secret-token string
48+
your secret token value
49+
-secret-token-header-name string
50+
name of your secret token header, e.g. X-Gitlab-Token
4751
-version
4852
display version information
4953
```
@@ -67,6 +71,14 @@ basichttpdebugger -listen ":8000" -hmac-secret "<secret>" -hmac-header-name "<X-
6771
basichttpdebugger -color -listen ":8000" -hmac-secret "<secret>" -hmac-header-name "<X-HEADER-NAME>"
6872
```
6973

74+
Instead of HMAC validation, you can check against secret token/secret token
75+
header name. Consider you are testing GitLab webhooks and you’ll receive
76+
`X-Gitlab-Token` with a value `test`:
77+
78+
```bash
79+
basichttpdebugger -listen ":8000" -secret-token-header-name "X-Gitlab-Token" -secret-token "test"
80+
```
81+
7082
Instead of standard output, pipe everything to file!
7183

7284
```bash
@@ -134,9 +146,13 @@ go run . -listen ":8000" # listens at :8000
134146
# or if you have ruby installed, use rake tasks!
135147
rake # listens at :9002
136148
LISTEN=":8000" rake # listens at :8000
149+
137150
LISTEN=":8000" HMAC_SECRET="<secret>" HMAC_HEADER_NAME="<X-HEADER-NAME>" rake
138151
LISTEN=":8000" HMAC_SECRET="<secret>" HMAC_HEADER_NAME="<X-HEADER-NAME>" COLOR=1 rake
139152
LISTEN=":8000" HMAC_SECRET="<secret>" HMAC_HEADER_NAME="<X-HEADER-NAME>" OUTPUT="/tmp/foo" rake
153+
154+
LISTEN=":8000" SECRET_TOKEN="<secret>" SECRET_TOKEN_HEADER_NAME="<X-HEADER-NAME>" rake
155+
140156
SAVE_RAW_HTTP_REQUEST=t rake
141157
SAVE_RAW_HTTP_REQUEST=t SAVE_FORMAT="~/Desktop/%Y-%m-%d-%H%i%s-test.raw" rake
142158
```
@@ -149,6 +165,8 @@ SAVE_RAW_HTTP_REQUEST=t SAVE_FORMAT="~/Desktop/%Y-%m-%d-%H%i%s-test.raw" rake
149165
|:-----|:---------------------|---------------|
150166
| `-hmac-header-name` | `HMAC_HEADER_NAME` | Not set |
151167
| `-hmac-secret` | `HMAC_SECRET` | Not set |
168+
| `-secret-token` | `SECRET_TOKEN` | Not set |
169+
| `-secret-token-header-name` | `SECRET_TOKEN_HEADER_NAME` | Not set |
152170
| `-color` | `COLOR` | `false` |
153171
| `-listen` | `LISTEN` | `:9002` |
154172
| `-output` | `OUTPUT` | `stdout` |
@@ -305,6 +323,16 @@ Here is how it looks, a GitHub webhook (trimmed, masked due to it’s huge/priva
305323
{"action":"created","issue":{"url": ...} ... }
306324
----------------------------------------------------------------------------------------------------
307325

326+
If you are checking secret token/secret token header (`test`, `X-Gitlab-Token`),
327+
you’ll see something like this in Payload section:
328+
329+
+-----------------------------------+-----------------------------+
330+
| Payload | |
331+
+-----------------------------------+-----------------------------+
332+
| Secret Token | test |
333+
| Secret Token Header Name | X-Gitlab-Token |
334+
| Secret Token Matches? | true |
335+
+-----------------------------------+-----------------------------+
308336

309337
---
310338

@@ -318,6 +346,7 @@ docker build -t <your-image> .
318346
docker run -p 9002:9002 <your-image> # run from default port
319347
docker run -p 8400:8400 <your-image> -listen ":8400" # run from 8400
320348
docker run -p 8400:8400 <your-image> -listen ":8400" -hmac-secret "<secret>" -hmac-header-name "<X-HEADER-NAME>"
349+
docker run -p 8400:8400 <your-image> -listen ":8400" -secret-token "<secret>" -secret-token-header-name "<X-HEADER-NAME>"
321350
```
322351

323352
You can download/use from docker hub or ghcr:
@@ -334,6 +363,9 @@ docker run -p 8400:8400 vigo/basichttpdebugger -listen ":8400" # run from 840
334363
# run from docker hub on port 9100 with hmac support
335364
docker run -p 9100:9100 vigo/basichttpdebugger -listen ":9100" -hmac-secret "<secret>" -hmac-header-name "<X-HEADER-NAME>"
336365

366+
# run from docker hub on port 9100 with secret token/secret token header name support
367+
docker run -p 9100:9100 vigo/basichttpdebugger -listen ":9100" -secret-token "<secret>" -secret-token-header-name "<X-HEADER-NAME>"
368+
337369
# run from ghcr on default port
338370
docker run -p 9002:9002 ghcr.io/vbyazilim/basichttpdebugger/basichttpdebugger:latest
339371

@@ -363,6 +395,11 @@ rake test # run test
363395

364396
## Change Log
365397

398+
**2025-02-02**
399+
400+
- improve `stringutils` tests
401+
- add secret token/secret token header name support
402+
366403
**2024-12-24**
367404

368405
- refactor from scratch

internal/httpserver/httpserver.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ type DebugServer struct {
5656
HMACSecret string
5757
HMACHeaderName string
5858
RawHTTPRequestFileSaveFormat string
59+
SecretToken string
60+
SecretTokenHeaderName string
5961
ReadTimeout time.Duration
6062
ReadHeaderTimeout time.Duration
6163
WriteTimeout time.Duration
@@ -158,6 +160,21 @@ func WithHMACHeaderName(s string) Option {
158160
}
159161
}
160162

163+
// WithSecretToken sets the secret value for secret token.
164+
func WithSecretToken(s string) Option {
165+
return func(d *DebugServer) {
166+
d.SecretToken = s
167+
}
168+
}
169+
170+
// WithSecretTokenHeaderName sets secret token header name value, will check this
171+
// http header name in request header.
172+
func WithSecretTokenHeaderName(s string) Option {
173+
return func(d *DebugServer) {
174+
d.SecretTokenHeaderName = s
175+
}
176+
}
177+
161178
// WithColor enables/disables colorful output.
162179
func WithColor(b bool) Option {
163180
return func(d *DebugServer) {
@@ -183,6 +200,8 @@ type debugHandlerOptions struct {
183200
writer io.WriteCloser
184201
hmacSecret string
185202
hmacHeaderName string
203+
secretToken string
204+
secretTokenHeaderName string
186205
rawHTTPRequestFileSaveFormat string
187206
color bool
188207
saveRawHTTPRequest bool
@@ -277,6 +296,20 @@ func debugHandlerFunc(options *debugHandlerOptions) http.HandlerFunc {
277296
}
278297
defer func() { _ = r.Body.Close() }()
279298

299+
if options.secretToken != "" {
300+
t.AppendRow(table.Row{"Secret Token", options.secretToken})
301+
}
302+
if options.secretTokenHeaderName != "" {
303+
t.AppendRow(table.Row{"Secret Token Header Name", options.secretTokenHeaderName})
304+
}
305+
306+
if options.secretToken != "" && options.secretTokenHeaderName != "" {
307+
t.AppendRows([]table.Row{
308+
{"Secret Token Matches?", r.Header.Get(options.secretTokenHeaderName) == options.secretToken},
309+
})
310+
t.AppendSeparator()
311+
}
312+
280313
if options.hmacSecret != "" {
281314
t.AppendRow(table.Row{"HMAC Secret", options.hmacSecret})
282315
}
@@ -420,6 +453,8 @@ func New(options ...Option) (*DebugServer, error) {
420453
writer: opts.OutputWriter,
421454
hmacSecret: opts.HMACSecret,
422455
hmacHeaderName: opts.HMACHeaderName,
456+
secretToken: opts.SecretToken,
457+
secretTokenHeaderName: opts.SecretTokenHeaderName,
423458
color: opts.Color,
424459
rawHTTPRequestFileSaveFormat: opts.RawHTTPRequestFileSaveFormat,
425460
saveRawHTTPRequest: opts.SaveRawHTTPRequest,

internal/httpserver/run.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,28 @@ import (
1414

1515
const (
1616
helpHMACHeaderName = "name of your signature header, e.g. X-Hub-Signature-256"
17+
helpSecretTokenHeaderName = "name of your secret token header, e.g. X-Gitlab-Token"
1718
defRawHTTPRequestFileSaveFormat = "%Y-%m-%d-%H%i%s-{hostname}-{url}.raw"
1819
)
1920

2021
// Run creates server instance and runs.
2122
func Run() error {
2223
listenAddr := flag.String("listen", envutils.GetenvOrDefault("LISTEN", defListenAddr), "listen addr")
24+
25+
hmacSecretValue := flag.String("hmac-secret", envutils.GetenvOrDefault("HMAC_SECRET", ""), "your HMAC secret value")
2326
hmacHeaderName := flag.String(
2427
"hmac-header-name",
2528
envutils.GetenvOrDefault("HMAC_HEADER_NAME", ""),
2629
helpHMACHeaderName,
2730
)
28-
hmacSecretValue := flag.String("hmac-secret", envutils.GetenvOrDefault("HMAC_SECRET", ""), "your HMAC secret value")
31+
32+
secretToken := flag.String("secret-token", envutils.GetenvOrDefault("SECRET_TOKEN", ""), "your secret token value")
33+
secretTokenHeaderName := flag.String(
34+
"secret-token-header-name",
35+
envutils.GetenvOrDefault("SECRET_TOKEN_HEADER_NAME", ""),
36+
helpSecretTokenHeaderName,
37+
)
38+
2939
output := flag.String("output", envutils.GetenvOrDefault("OUTPUT", "stdout"), "output/write responses to")
3040
color := flag.Bool("color", envutils.GetenvOrDefault("COLOR", false), "enable color")
3141
saveRawHTTPRequest := flag.Bool(
@@ -51,6 +61,8 @@ func Run() error {
5161
WithListenAddr(*listenAddr),
5262
WithHMACHeaderName(*hmacHeaderName),
5363
WithHMACSecret(*hmacSecretValue),
64+
WithSecretToken(*secretToken),
65+
WithSecretTokenHeaderName(*secretTokenHeaderName),
5466
WithOutputWriter(*output),
5567
WithColor(*color),
5668
WithSaveRawHTTPRequest(*saveRawHTTPRequest),

0 commit comments

Comments
 (0)