// renderTemplate read template and render to file func renderTemplate(doc *Document) { projectDir := env.Get().GetS("GOPATH") templateFile := path.Join( projectDir, "src/github.com/essentialkaos/shdoc/templates", arg.GetS(ARG_TEMPLATE)+".tpl", ) if !fsutil.CheckPerms("FRS", templateFile) { printError("Can't read template %s - file is not exist or empty", templateFile) os.Exit(1) } outputFile := arg.GetS(ARG_OUTPUT) if fsutil.IsExist(outputFile) { os.Remove(outputFile) } fd, err := os.OpenFile(outputFile, os.O_CREATE|os.O_WRONLY, 0644) if err != nil { printError(err.Error()) os.Exit(1) } defer fd.Close() tpl, err := ioutil.ReadFile(templateFile) if err != nil { printError(err.Error()) os.Exit(1) } t := template.New("Template") t, err = t.Parse(string(tpl[:])) err = t.Execute(fd, doc) if err != nil { printError(err.Error()) os.Exit(1) } fmtutil.Separator(false, doc.Title) fmtc.Printf(" {*}Constants:{!} %d\n", len(doc.Constants)) fmtc.Printf(" {*}Variables:{!} %d\n", len(doc.Variables)) fmtc.Printf(" {*}Methods:{!} %d\n", len(doc.Methods)) fmtc.NewLine() fmtc.Printf( " {*}Output:{!} %s {s-}(%s){!}\n", outputFile, fmtutil.PrettySize(fsutil.GetSize(outputFile)), ) fmtutil.Separator(false) }
// simpleRender print all document info to console func simpleRender(doc *Document) { if doc.HasAbout() { fmtutil.Separator(false, "ABOUT") for _, l := range doc.About { fmtc.Printf(" %s\n", l) } } if doc.HasConstants() { fmtutil.Separator(false, "CONSTANTS") totalConstants := len(doc.Constants) for i, c := range doc.Constants { renderConstant(c) if i < totalConstants-1 { fmtc.NewLine() } } } if doc.HasVariables() { fmtutil.Separator(false, "GLOBAL VARIABLES") totalVariables := len(doc.Variables) for i, v := range doc.Variables { renderVariable(v) if i < totalVariables-1 { fmtc.NewLine() } } } if doc.HasMethods() { fmtutil.Separator(false, "METHODS") totalMethods := len(doc.Methods) for i, m := range doc.Methods { renderMethod(m, false) if i < totalMethods-1 { fmtc.NewLine() fmtc.NewLine() } } } fmtutil.Separator(false) }
// printCertificationPathsInfo print info about certificates in chain func printCertificationPathsInfo(details *sslscan.EndpointDetails) { printCategoryHeader("Certification Paths") fmtc.Printf(" %-24s {s}|{!} %d\n", "Certificates provided", len(details.Chain.Certs)) fmtc.Printf(" %-24s {s}|{!} ", "Chain issues") if details.Chain.Issues == 0 { fmtc.Println("None") } else { fmtc.Printf("{y}%s{!}\n", getChainIssuesDesc(details.Chain.Issues)) } if len(details.Chain.Certs) > 1 { fmtutil.Separator(true) lastCertIndex := len(details.Chain.Certs) - 2 for index, cert := range details.Chain.Certs[1:] { validUntilDate := time.Unix(cert.NotAfter/1000, 0) fmtc.Printf(" %-24s {s}|{!} %s\n", "Subject", cert.Label) fmtc.Printf(" %-24s {s}|{!} %s\n", "Valid until", timeutil.Format(validUntilDate, "%Y/%m/%d %H:%M:%S")) fmtc.Printf(" %-24s {s}|{!} ", "Key") if cert.KeyAlg == "RSA" && cert.KeyStrength < 2048 { fmtc.Printf("{y}%s %d bits (WEAK){!}\n", cert.KeyAlg, cert.KeySize) } else { fmtc.Printf("%s %d bits\n", cert.KeyAlg, cert.KeySize) } fmtc.Printf(" %-24s {s}|{!} %s\n", "Issuer", cert.IssuerLabel) fmtc.Printf(" %-24s {s}|{!} ", "Signature algorithm") if weakAlgorithms[cert.SigAlg] { fmtc.Printf("{y}%s (WEAK){!}\n", cert.SigAlg) } else { fmtc.Printf("%s\n", cert.SigAlg) } if index < lastCertIndex { fmtutil.Separator(true) } } } }
// printDetailedEndpointInfo fetch and print detailed info for one endpoint func printDetailedEndpointInfo(ap *sslscan.AnalyzeProgress, ip string) { info, err := ap.DetailedInfo(ip) if err != nil { fmtc.Printf("\n{r}Can't fetch detailed info for %s{!}\n\n", ip) return } if strings.ToUpper(info.StatusMessage) != "READY" { fmtc.Printf("\n{r}%s{!}\n\n", info.StatusMessage) return } details := info.Details fmtc.NewLine() printCertificateInfo(details) printCertificationPathsInfo(details) printProtocolsInfo(details) suiteIndex := printCipherSuitesInfo(details) printHandshakeSimulationInfo(details, suiteIndex) printProtocolDetailsInfo(details) printMiscellaneousInfo(info) fmtutil.Separator(true) fmtc.NewLine() }
// printCategoryHeader print category name and separators func printCategoryHeader(name string) { fmtutil.Separator(true) fmtc.Printf(" ▾ {*}%s{!}\n", strings.ToUpper(name)) fmtutil.Separator(true) }