summaryrefslogtreecommitdiff
path: root/logging/middleware.go
diff options
context:
space:
mode:
authortjpcc <tjp@ctrl-c.club>2023-05-03 19:37:26 -0600
committertjpcc <tjp@ctrl-c.club>2023-05-03 19:50:56 -0600
commit91218665d27e39ccf799fdd4c6f7c8bb8e4ca4cf (patch)
tree9e2fdbd7c7a48041411d8f229513e92bee9039b9 /logging/middleware.go
parent5c9655a1bb2af0f23ca6d9daf96aed44cd01c3c8 (diff)
use sha256 for client cert fingerprints, and log them when available
Diffstat (limited to 'logging/middleware.go')
-rw-r--r--logging/middleware.go28
1 files changed, 24 insertions, 4 deletions
diff --git a/logging/middleware.go b/logging/middleware.go
index 750f987..693cb2f 100644
--- a/logging/middleware.go
+++ b/logging/middleware.go
@@ -2,6 +2,8 @@ package logging
import (
"context"
+ "crypto/sha256"
+ "encoding/hex"
"errors"
"io"
"time"
@@ -18,13 +20,17 @@ func LogRequests(logger Logger) sr.Middleware {
response.Body = loggingBody(logger, request, response, start)
} else {
end := time.Now()
- _ = logger.Log(
+ params := []any{
"msg", "request",
"ts", end.UTC(),
"dur", end.Sub(start),
"url", request.URL,
"status", "(not found)",
- )
+ }
+ if fingerprint, ok := clientFingerprint(request); ok {
+ params = append(params, "client_ident", fingerprint)
+ }
+ _ = logger.Log(params...)
}
return response
@@ -32,6 +38,15 @@ func LogRequests(logger Logger) sr.Middleware {
}
}
+func clientFingerprint(request *sr.Request) (string, bool) {
+ if request.TLSState == nil || len(request.TLSState.PeerCertificates) == 0 {
+ return "", false
+ }
+
+ digest := sha256.Sum256(request.TLSState.PeerCertificates[0].Raw)
+ return hex.EncodeToString(digest[:]), true
+}
+
type loggedResponseBody struct {
request *sr.Request
response *sr.Response
@@ -45,14 +60,19 @@ type loggedResponseBody struct {
func (lr *loggedResponseBody) log() {
end := time.Now()
- _ = lr.logger.Log(
+ params := []any{
"msg", "request",
"ts", end.UTC(),
"dur", end.Sub(lr.start),
"url", lr.request.URL,
"status", lr.response.Status,
"bodylen", lr.written,
- )
+ }
+ if fingerprint, ok := clientFingerprint(lr.request); ok {
+ params = append(params, "client_ident", fingerprint)
+ }
+
+ _ = lr.logger.Log(params...)
}
func (lr *loggedResponseBody) Read(b []byte) (int, error) {