Log actual flags rather than args+env

This commit is contained in:
Tim Hockin 2023-05-11 22:42:29 -07:00
parent 9318041657
commit 7797e5d0e3
1 changed files with 19 additions and 51 deletions

70
main.go
View File

@ -722,8 +722,7 @@ func main() {
"uid", os.Getuid(), "uid", os.Getuid(),
"gid", os.Getgid(), "gid", os.Getgid(),
"home", os.Getenv("HOME"), "home", os.Getenv("HOME"),
"args", logSafeArgs(os.Args), "flags", logSafeFlags())
"env", logSafeEnv(os.Environ()))
if _, err := exec.LookPath(*flGitCmd); err != nil { if _, err := exec.LookPath(*flGitCmd); err != nil {
log.Error(err, "ERROR: git executable not found", "git", *flGitCmd) log.Error(err, "ERROR: git executable not found", "git", *flGitCmd)
@ -1089,61 +1088,30 @@ func redactURL(urlstr string) string {
return u.String() return u.String()
} }
// logSafeArgs makes sure any sensitive args (e.g. passwords) are redacted // logSafeFlags makes sure any sensitive args (e.g. passwords) are redacted
// before logging. // before logging. This returns a slice rather than a map so it is always
func logSafeArgs(args []string) []string { // sorted.
ret := make([]string, len(args)) func logSafeFlags() []string {
redactWholeArg := false ret := []string{}
readactURLArg := false pflag.VisitAll(func(fl *pflag.Flag) {
for i, arg := range args { arg := fl.Name
if redactWholeArg { val := fl.Value.String()
ret[i] = redactedString
redactWholeArg = false
continue
}
if readactURLArg {
ret[i] = redactURL(arg)
readactURLArg = false
continue
}
// Handle --password // Handle --password
if arg == "--password" { if arg == "password" {
redactWholeArg = true val = redactedString
}
if strings.HasPrefix(arg, "--password=") {
arg = "--password=" + redactedString
} }
// Handle password embedded in --repo // Handle password embedded in --repo
if arg == "--repo" { if arg == "repo" {
readactURLArg = true val = redactURL(val)
} }
if strings.HasPrefix(arg, "--repo=") { // Don't log empty values
arg = "--repo=" + redactURL(arg[7:]) if val == "" {
return
} }
ret[i] = arg
}
return ret
}
// logSafeEnv makes sure any sensitive env vars (e.g. passwords) are redacted ret = append(ret, "--"+arg+"="+val)
// before logging. })
func logSafeEnv(env []string) []string {
ret := make([]string, len(env))
for i, ev := range env {
if strings.HasPrefix(ev, "GITSYNC_PASSWORD=") {
ev = "GITSYNC_PASSWORD=" + redactedString
}
if strings.HasPrefix(ev, "GIT_SYNC_PASSWORD=") {
ev = "GIT_SYNC_PASSWORD=" + redactedString
}
if strings.HasPrefix(ev, "GITSYNC_REPO=") {
ev = "GITSYNC_REPO=" + redactURL(ev[14:])
}
if strings.HasPrefix(ev, "GIT_SYNC_REPO=") {
ev = "GIT_SYNC_REPO=" + redactURL(ev[14:])
}
ret[i] = ev
}
return ret return ret
} }