package inspect import ( "fmt" "os" "strings" "time" "unicode/utf8" "github.com/logrusorgru/aurora/v4" "src.lwithers.me.uk/go/rsa/pkg/inspect" ) var ( displayedFingerprints = map[string]int{} ) func displayColoured(src string, info []inspect.Info) { // compute max key length, for nicely aligning columns var maxKey int for _, item := range info { for _, section := range item.Info() { for _, field := range section.Fields { l := utf8.RuneCountInString(field.Key) if l > maxKey { maxKey = l } } } } // output options var auroraHyper bool switch os.Getenv("TERM") { case "xterm-kitty": auroraHyper = true } a := aurora.New(aurora.WithColors(true), aurora.WithHyperlinks(auroraHyper)) // display loop for _, item := range info { fmt.Printf("════════ %s:%s ════════\n", a.BrightBlue(src), a.Blue(item.Location())) for _, section := range item.Info() { fmt.Println(aurora.Underline(section.Title)) for _, field := range section.Fields { fmt.Printf(" %*s: ", maxKey, a.Yellow(field.Key)) switch v := field.Value.(type) { case int: fmt.Print(a.Blue(v)) case bool: fmt.Print(a.Blue(v)) case time.Time: var note string switch { case strings.Contains(field.Key, "from"): if v.After(time.Now()) { note = aurora.Red("not valid yet").String() } else { note = aurora.Green("ok").String() } case strings.Contains(field.Key, "until"): if v.After(time.Now()) { note = aurora.Green("ok").String() } else { note = aurora.Red("expired").String() } } fmt.Printf("%s %s", v.Format(time.RFC3339), note) case []string: for i, s := range v { fmt.Print(s) if i < len(v)-1 { fmt.Printf("\n%*s", maxKey+4, "") } } case inspect.Fingerprint: f := v.String() fidx := displayedFingerprints[f] var firstSeen bool if fidx == 0 { firstSeen = true fidx = 1 + len(displayedFingerprints) displayedFingerprints[f] = fidx } var note string if firstSeen { note = fmt.Sprintf("#%d %s", a.Blue(fidx), a.Magenta("first occurrence")) } else { note = fmt.Sprintf("#%d %s", a.Blue(fidx), a.Green("already seen")) } fmt.Printf("%v [%s]", f, note) default: fmt.Print(v) } fmt.Println("") } } fmt.Println("") } }