2021-06-14 19:20:43 +02:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2017-12-03 17:48:03 -08:00
// 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"
)
2021-06-14 19:20:43 +02:00
const userPlaceholder = "sanitized-credential"
const unparsableURL = "(unparsable url)"
type sanitizedError struct {
err error
replacer * strings . Replacer
2017-12-03 17:48:03 -08:00
}
2021-06-14 19:20:43 +02:00
func ( err sanitizedError ) Error ( ) string {
return err . replacer . Replace ( err . err . Error ( ) )
2017-12-03 17:48:03 -08:00
}
2021-06-14 19:20:43 +02:00
// 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 ... ) }
2017-12-03 17:48:03 -08:00
}
2021-06-14 19:20:43 +02:00
// 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 ) }
2017-12-03 17:48:03 -08:00
}
2021-06-14 19:20:43 +02:00
// 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 ( )
2017-12-03 17:48:03 -08:00
if u . User != nil && usePlaceholder {
2021-06-14 19:20:43 +02:00
u . User = url . User ( userPlaceholder )
2017-12-03 17:48:03 -08:00
} else {
u . User = nil
}
2021-06-14 19:20:43 +02:00
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 )
2017-12-03 17:48:03 -08:00
}