summaryrefslogtreecommitdiffstats
path: root/modules/util/sanitize.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/util/sanitize.go')
-rw-r--r--modules/util/sanitize.go63
1 files changed, 38 insertions, 25 deletions
diff --git a/modules/util/sanitize.go b/modules/util/sanitize.go
index a4f5479dfb..de59ffaa2e 100644
--- a/modules/util/sanitize.go
+++ b/modules/util/sanitize.go
@@ -1,4 +1,4 @@
-// Copyright 2017 The Gitea Authors. All rights reserved.
+// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
@@ -9,40 +9,53 @@ import (
"strings"
)
-// urlSafeError wraps an error whose message may contain a sensitive URL
-type urlSafeError struct {
- err error
- unsanitizedURL string
+const userPlaceholder = "sanitized-credential"
+const unparsableURL = "(unparsable url)"
+
+type sanitizedError struct {
+ err error
+ replacer *strings.Replacer
}
-func (err urlSafeError) Error() string {
- return SanitizeMessage(err.err.Error(), err.unsanitizedURL)
+func (err sanitizedError) Error() string {
+ return err.replacer.Replace(err.err.Error())
}
-// URLSanitizedError returns the sanitized version an error whose message may
-// contain a sensitive URL
-func URLSanitizedError(err error, unsanitizedURL string) error {
- return urlSafeError{err: err, unsanitizedURL: unsanitizedURL}
+// NewSanitizedError wraps an error and replaces all old, new string pairs in the message text.
+func NewSanitizedError(err error, oldnew ...string) error {
+ return sanitizedError{err: err, replacer: strings.NewReplacer(oldnew...)}
}
-// SanitizeMessage sanitizes a message which may contains a sensitive URL
-func SanitizeMessage(message, unsanitizedURL string) string {
- sanitizedURL := SanitizeURLCredentials(unsanitizedURL, true)
- return strings.ReplaceAll(message, unsanitizedURL, sanitizedURL)
+// NewURLSanitizedError wraps an error and replaces the url credential or removes them.
+func NewURLSanitizedError(err error, u *url.URL, usePlaceholder bool) error {
+ return sanitizedError{err: err, replacer: NewURLSanitizer(u, usePlaceholder)}
}
-// SanitizeURLCredentials sanitizes a url, either removing user credentials
-// or replacing them with a placeholder.
-func SanitizeURLCredentials(unsanitizedURL string, usePlaceholder bool) string {
- u, err := url.Parse(unsanitizedURL)
- if err != nil {
- // don't log the error, since it might contain unsanitized URL.
- return "(unparsable url)"
- }
+// NewStringURLSanitizedError wraps an error and replaces the url credential or removes them.
+// If the url can't get parsed it gets replaced with a placeholder string.
+func NewStringURLSanitizedError(err error, unsanitizedURL string, usePlaceholder bool) error {
+ return sanitizedError{err: err, replacer: NewStringURLSanitizer(unsanitizedURL, usePlaceholder)}
+}
+
+// NewURLSanitizer creates a replacer for the url with the credential sanitized or removed.
+func NewURLSanitizer(u *url.URL, usePlaceholder bool) *strings.Replacer {
+ old := u.String()
+
if u.User != nil && usePlaceholder {
- u.User = url.User("<credentials>")
+ u.User = url.User(userPlaceholder)
} else {
u.User = nil
}
- return u.String()
+ return strings.NewReplacer(old, u.String())
+}
+
+// NewStringURLSanitizer creates a replacer for the url with the credential sanitized or removed.
+// If the url can't get parsed it gets replaced with a placeholder string
+func NewStringURLSanitizer(unsanitizedURL string, usePlaceholder bool) *strings.Replacer {
+ u, err := url.Parse(unsanitizedURL)
+ if err != nil {
+ // don't log the error, since it might contain unsanitized URL.
+ return strings.NewReplacer(unsanitizedURL, unparsableURL)
+ }
+ return NewURLSanitizer(u, usePlaceholder)
}