diff options
Diffstat (limited to 'modules/util/sanitize.go')
-rw-r--r-- | modules/util/sanitize.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/modules/util/sanitize.go b/modules/util/sanitize.go new file mode 100644 index 0000000000..b1c17b29cf --- /dev/null +++ b/modules/util/sanitize.go @@ -0,0 +1,48 @@ +// Copyright 2017 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. + +package util + +import ( + "net/url" + "strings" +) + +// urlSafeError wraps an error whose message may contain a sensitive URL +type urlSafeError struct { + err error + unsanitizedURL string +} + +func (err urlSafeError) Error() string { + return SanitizeMessage(err.err.Error(), err.unsanitizedURL) +} + +// 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} +} + +// SanitizeMessage sanitizes a message which may contains a sensitive URL +func SanitizeMessage(message, unsanitizedURL string) string { + sanitizedURL := SanitizeURLCredentials(unsanitizedURL, true) + return strings.Replace(message, unsanitizedURL, sanitizedURL, -1) +} + +// 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)" + } + if u.User != nil && usePlaceholder { + u.User = url.User("<credentials>") + } else { + u.User = nil + } + return u.String() +} |