mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2026-04-22 23:57:20 +08:00
Strip Userinfo from log entries and errors #2051
This commit is contained in:
+30
-19
@@ -3,6 +3,7 @@ package creds
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"slices"
|
||||
"strings"
|
||||
"sync"
|
||||
@@ -27,6 +28,7 @@ func AddSecret(value string) {
|
||||
var secrets []string
|
||||
var secretsMu sync.Mutex
|
||||
var secretsReplacer *strings.Replacer
|
||||
var userinfoRegexp *regexp.Regexp
|
||||
|
||||
func getReplacer() *strings.Replacer {
|
||||
secretsMu.Lock()
|
||||
@@ -40,14 +42,33 @@ func getReplacer() *strings.Replacer {
|
||||
secretsReplacer = strings.NewReplacer(oldnew...)
|
||||
}
|
||||
|
||||
if userinfoRegexp == nil {
|
||||
userinfoRegexp = regexp.MustCompile(`://[` + userinfo + `]+@`)
|
||||
}
|
||||
|
||||
return secretsReplacer
|
||||
}
|
||||
|
||||
// Uniform Resource Identifier (URI)
|
||||
// https://datatracker.ietf.org/doc/html/rfc3986
|
||||
const (
|
||||
unreserved = `A-Za-z0-9-._~`
|
||||
subdelims = `!$&'()*+,;=`
|
||||
userinfo = unreserved + subdelims + `%:`
|
||||
)
|
||||
|
||||
func SecretString(s string) string {
|
||||
re := getReplacer()
|
||||
s = userinfoRegexp.ReplaceAllString(s, `://***@`)
|
||||
return re.Replace(s)
|
||||
}
|
||||
|
||||
func SecretWrite(w io.Writer, s string) (n int, err error) {
|
||||
re := getReplacer()
|
||||
s = userinfoRegexp.ReplaceAllString(s, `://***@`)
|
||||
return re.WriteString(w, s)
|
||||
}
|
||||
|
||||
func SecretWriter(w io.Writer) io.Writer {
|
||||
return &secretWriter{w}
|
||||
}
|
||||
@@ -57,27 +78,17 @@ type secretWriter struct {
|
||||
}
|
||||
|
||||
func (s *secretWriter) Write(b []byte) (int, error) {
|
||||
re := getReplacer()
|
||||
return re.WriteString(s.w, string(b))
|
||||
}
|
||||
|
||||
type secretResponse struct {
|
||||
w http.ResponseWriter
|
||||
}
|
||||
|
||||
func (s *secretResponse) Header() http.Header {
|
||||
return s.w.Header()
|
||||
}
|
||||
|
||||
func (s *secretResponse) Write(b []byte) (int, error) {
|
||||
re := getReplacer()
|
||||
return re.WriteString(s.w, string(b))
|
||||
}
|
||||
|
||||
func (s *secretResponse) WriteHeader(statusCode int) {
|
||||
s.w.WriteHeader(statusCode)
|
||||
return SecretWrite(s.w, string(b))
|
||||
}
|
||||
|
||||
func SecretResponse(w http.ResponseWriter) http.ResponseWriter {
|
||||
return &secretResponse{w}
|
||||
}
|
||||
|
||||
type secretResponse struct {
|
||||
http.ResponseWriter
|
||||
}
|
||||
|
||||
func (s *secretResponse) Write(b []byte) (int, error) {
|
||||
return SecretWrite(s.ResponseWriter, string(b))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user