Redact passwords in error messages (#145)

Fixes #144
This commit is contained in:
Adrian Macneil 2020-07-19 15:04:45 -07:00 committed by GitHub
parent 2b61b4375a
commit 11c251bd25
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 1 deletions

11
main.go
View file

@ -5,6 +5,7 @@ import (
"log" "log"
"net/url" "net/url"
"os" "os"
"regexp"
"github.com/joho/godotenv" "github.com/joho/godotenv"
"github.com/urfave/cli" "github.com/urfave/cli"
@ -19,7 +20,8 @@ func main() {
err := app.Run(os.Args) err := app.Run(os.Args)
if err != nil { if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "Error: %s\n", err) errText := redactLogString(fmt.Sprintf("Error: %s\n", err))
_, _ = fmt.Fprint(os.Stderr, errText)
os.Exit(2) os.Exit(2)
} }
} }
@ -219,3 +221,10 @@ func getDatabaseURL(c *cli.Context) (u *url.URL, err error) {
return url.Parse(value) return url.Parse(value)
} }
// redactLogString attempts to redact passwords from errors
func redactLogString(in string) string {
re := regexp.MustCompile("([a-zA-Z]+://[^:]+:)[^@]+@")
return re.ReplaceAllString(in, "${1}********@")
}

View file

@ -35,3 +35,23 @@ func TestGetDatabaseUrl(t *testing.T) {
require.Equal(t, "example.org", u.Host) require.Equal(t, "example.org", u.Host)
require.Equal(t, "/db", u.Path) require.Equal(t, "/db", u.Path)
} }
func TestRedactLogString(t *testing.T) {
examples := []struct {
in string
expected string
}{
{"normal string",
"normal string"},
// malformed URL example (note forward slash in password)
{"parse \"mysql://username:otS33+tb/e4=@localhost:3306/database\": invalid",
"parse \"mysql://username:********@localhost:3306/database\": invalid"},
// invalid port, but probably not a password since there is no @
{"parse \"mysql://localhost:abc/database\": invalid",
"parse \"mysql://localhost:abc/database\": invalid"},
}
for _, ex := range examples {
require.Equal(t, ex.expected, redactLogString(ex.in))
}
}