mirror of
https://github.com/edoardottt/cariddi.git
synced 2026-08-20 22:52:32 +02:00
235 lines
5.9 KiB
Go
235 lines
5.9 KiB
Go
/*
|
||
==========
|
||
Cariddi
|
||
==========
|
||
|
||
This program is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see http://www.gnu.org/licenses/.
|
||
|
||
@Repository: https://github.com/edoardottt/cariddi
|
||
|
||
@Author: edoardottt, https://edoardottt.com
|
||
|
||
@License: https://github.com/edoardottt/cariddi/blob/main/LICENSE
|
||
|
||
*/
|
||
|
||
package output
|
||
|
||
import (
|
||
"fmt"
|
||
"html"
|
||
"log"
|
||
"os"
|
||
"time"
|
||
|
||
fileUtils "github.com/edoardottt/cariddi/internal/file"
|
||
)
|
||
|
||
const (
|
||
HTMLBanner = `<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Cariddi Scan Results</title>
|
||
<link href="https://fonts.googleapis.com/css2?family=Fira+Code&family=Inter:wght@400;600&display=swap" rel="stylesheet">
|
||
<style>
|
||
body {
|
||
margin: 0;
|
||
font-family: 'Inter', sans-serif;
|
||
background-color: #f9fafb;
|
||
color: #111827;
|
||
}
|
||
.header {
|
||
background-color: #0ea5e9;
|
||
color: white;
|
||
padding: 2rem;
|
||
text-align: center;
|
||
}
|
||
.header h1 {
|
||
margin: 0;
|
||
font-size: 2rem;
|
||
}
|
||
.header a {
|
||
color: white;
|
||
text-decoration: underline;
|
||
}
|
||
.container {
|
||
padding: 2rem;
|
||
max-width: 960px;
|
||
margin: auto;
|
||
}
|
||
ul.meta {
|
||
list-style: none;
|
||
padding: 0;
|
||
margin-top: 1rem;
|
||
}
|
||
ul.meta li {
|
||
margin: 0.5rem 0;
|
||
}
|
||
code {
|
||
font-family: 'Fira Code', monospace;
|
||
background: #e2e8f0;
|
||
padding: 2px 4px;
|
||
border-radius: 4px;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="header">
|
||
<h1>Cariddi - Security Scanner Report</h1>
|
||
<ul class="meta">
|
||
<li><a href="https://github.com/edoardottt/cariddi" target="_blank" rel="noopener noreferrer">github.com/edoardottt/cariddi</a></li>
|
||
<li>by edoardottt - <a href="https://edoardottt.com" target="_blank" rel="noopener noreferrer">edoardottt.com</a></li>
|
||
<li>Released under <a href="https://github.com/edoardottt/cariddi/blob/main/LICENSE" target="_blank" rel="noopener noreferrer">GPLv3 License</a></li>
|
||
</ul>
|
||
</div>
|
||
<div class="container">`
|
||
HTMLBannerFooter = `</div> <!-- End of .container -->
|
||
<footer style="background-color: #e2e8f0; text-align: center; padding: 1.5rem; font-size: 0.9rem; color: #4b5563;">
|
||
<p>Generated by <a href="https://github.com/edoardottt/cariddi" style="color: #0ea5e9; text-decoration: none;">Cariddi</a> – Stay safe out there! 🐙</p>
|
||
</footer>
|
||
</body>
|
||
</html>`
|
||
)
|
||
|
||
// BannerHTML appends the initial banner to html file.
|
||
func BannerHTML(filename string) {
|
||
file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
|
||
if err != nil {
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
_, err = file.WriteString(HTMLBanner)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
file.Close()
|
||
}
|
||
|
||
// WriteSummaryCard adds a summary card.
|
||
func WriteSummaryCard(filename string, results, secrets, endpoints, extensions, errors, infos int) {
|
||
file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
|
||
if err != nil {
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
content := fmt.Sprintf(`<div class="summary-card">
|
||
<h2>Scan Summary</h2>
|
||
<p>Scan timestamp: %s</p>
|
||
<ul>
|
||
<li><strong>Results:</strong> %d</li>
|
||
<li><strong>Secrets:</strong> %d</li>
|
||
<li><strong>Endpoints:</strong> %d</li>
|
||
<li><strong>Extensions:</strong> %d</li>
|
||
<li><strong>Errors:</strong> %d</li>
|
||
<li><strong>Info:</strong> %d</li>
|
||
</ul>
|
||
</div>
|
||
`, time.Now().Format("2006-01-02 15:04:05"), results, secrets, endpoints, extensions, errors, infos)
|
||
|
||
_, err = file.WriteString(content)
|
||
if err != nil {
|
||
file.Close()
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
file.Close()
|
||
}
|
||
|
||
// AppendOutputToHTML appends the output to html file.
|
||
func AppendOutputToHTML(output string, status string, filename string, isLink bool) {
|
||
file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
|
||
if err != nil {
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
if isLink {
|
||
var statusColor string
|
||
|
||
if status != "" {
|
||
if string(status[0]) == "2" || string(status[0]) == "3" {
|
||
statusColor = "<p style='color:green;display:inline'>" + html.EscapeString(status) + "</p>"
|
||
} else {
|
||
statusColor = "<p style='color:red;display:inline'>" + html.EscapeString(status) + "</p>"
|
||
}
|
||
} else {
|
||
statusColor = status
|
||
}
|
||
|
||
if _, err := file.WriteString("<li><a target='_blank' href='" +
|
||
html.EscapeString(output) + "'>" +
|
||
html.EscapeString(output) +
|
||
"</a> " + html.EscapeString(statusColor) + "</li>\n"); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
} else {
|
||
if _, err := file.WriteString("<li>" + html.EscapeString(output) + "</li>\n"); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
}
|
||
|
||
file.Close()
|
||
}
|
||
|
||
// HeaderHTML appends the html header.
|
||
func HeaderHTML(header string, filename string) {
|
||
file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
|
||
if err != nil {
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
if _, err := file.WriteString("<h3>" + html.EscapeString(header) + "</h3><ul>\n"); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
file.Close()
|
||
}
|
||
|
||
// FooterHTML appends the footer.
|
||
func FooterHTML(filename string) {
|
||
file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
|
||
if err != nil {
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
if _, err := file.WriteString("</ul>\n"); err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
file.Close()
|
||
}
|
||
|
||
// BannerFooterHTML appends the final footer.
|
||
func BannerFooterHTML(filename string) {
|
||
file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, fileUtils.Permission0644)
|
||
if err != nil {
|
||
log.Println(err)
|
||
}
|
||
|
||
_, err = file.WriteString(HTMLBannerFooter)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
file.Close()
|
||
}
|