// Used to show the landing page of the application
package cvetool
import (
"glsamaker/pkg/app/handler/authentication"
"glsamaker/pkg/app/handler/authentication/utils"
"glsamaker/pkg/database/connection"
"glsamaker/pkg/logger"
"glsamaker/pkg/models/cve"
"encoding/json"
"fmt"
"github.com/go-pg/pg/v9/orm"
"glsamaker/pkg/models/users"
"html"
"net/http"
"strconv"
"strings"
)
// Show renders a template to show the landing page of the application
func Show(w http.ResponseWriter, r *http.Request) {
user := utils.GetAuthenticatedUser(r)
if !user.Permissions.CVETool.View {
authentication.AccessDenied(w, r)
return
}
renderIndexTemplate(w, user)
}
// Show renders a template to show the landing page of the application
func ShowFullscreen(w http.ResponseWriter, r *http.Request) {
user := utils.GetAuthenticatedUser(r)
if !user.Permissions.CVETool.View {
authentication.AccessDenied(w, r)
return
}
renderIndexFullscreenTemplate(w, user)
}
// Show renders a template to show the landing page of the application
func Add(w http.ResponseWriter, r *http.Request) {
//renderIndexTemplate(w)
}
// Show renders a template to show the landing page of the application
func CveData(w http.ResponseWriter, r *http.Request) {
user := utils.GetAuthenticatedUser(r)
if !user.Permissions.CVETool.View {
authentication.AccessDenied(w, r)
return
}
type DataTableData struct {
Draw int `json:"draw"`
RecordsTotal int `json:"recordsTotal"`
RecordsFiltered int `json:"recordsFiltered"`
Data [][]string `json:"data"`
}
draw, _ := strconv.Atoi(getParam(r, "draw"))
start, _ := strconv.Atoi(getParam(r, "start"))
length, _ := strconv.Atoi(getParam(r, "length"))
order_column := getParam(r, "order[0][column]")
order_dir := strings.ToUpper(getParam(r, "order[0][dir]"))
search_value := strings.ToUpper(getParam(r, "search[value]"))
state_value := getParam(r, "columns[10][search][value]")
logger.Info.Println("state_value")
logger.Info.Println(state_value)
count_overall, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Count()
count, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state LIKE " + "'%" + state_value + "%'").WhereGroup(func(q *orm.Query) (*orm.Query, error) {
q = q.WhereOr("description LIKE " + "'%" + search_value + "%'").
WhereOr("id LIKE " + "'%" + search_value + "%'")
return q, nil
}).Count()
order := "id"
if order_column == "0" {
order = "id"
} else if order_column == "8" {
order = "last_modified_date"
} else if order_column == "9" {
order = "published_date"
} else if order_column == "10" {
order = "state"
}
var dataTableEntries [][]string
var cves []*cve.DefCveItem
err := connection.DB.Model(&cves).Order(order + " " + order_dir).Offset(start).Limit(length).Where("state LIKE " + "'%" + state_value + "%'").WhereGroup(func(q *orm.Query) (*orm.Query, error) {
q = q.WhereOr("description LIKE " + "'%" + search_value + "%'").
WhereOr("id LIKE " + "'%" + search_value + "%'")
return q, nil
}).Relation("Bugs").Relation("Comments").Relation("Comments.User").Select()
if err != nil || len(cves) == 0 {
logger.Info.Println("Error finding cves:")
logger.Info.Println(err)
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"draw":` + strconv.Itoa(draw) + `,"recordsTotal":` + strconv.Itoa(count_overall) + `,"recordsFiltered":0,"data":[]}`))
return
} else {
for _, cve := range cves {
// TODO handle empty
baseScore := ""
impact := ""
if cve.Impact != nil {
baseScore = fmt.Sprintf("%.2f", cve.Impact.BaseMetricV3.CvssV3.BaseScore)
impact = cve.Impact.BaseMetricV3.CvssV3.VectorString
}
var referenceList []string
for _, reference := range cve.Cve.References.ReferenceData {
referenceList = append(referenceList, "source")
//referenceList = append(referenceList, "" + strings.ToLower(reference.Refsource) + "")
}
references := strings.Join(referenceList, ", ")
for k,_ := range cve.Comments {
cve.Comments[k].Message = html.EscapeString(cve.Comments[k].Message)
cve.Comments[k].User = &users.User{
Id: cve.Comments[k].User.Id,
Email: cve.Comments[k].User.Email,
Nick: cve.Comments[k].User.Nick,
Name: cve.Comments[k].User.Name,
Password: users.Argon2Parameters{},
Badge: cve.Comments[k].User.Badge,
}
}
comments, _ := json.Marshal(cve.Comments)
packages, _ := json.Marshal(cve.Packages)
bugs, _ := json.Marshal(cve.Bugs)
dataTableEntries = append(dataTableEntries, []string{
cve.Id,
cve.Description,
string(packages), // TODO MIGRATION strings.Join(cve.Packages, ","),
string(bugs), // TODO MIGRATION strings.Join(cve.Bugs, ","),
baseScore,
impact,
references,
string(comments),
cve.LastModifiedDate,
cve.PublishedDate,
cve.State,
"changelog"})
}
}
dataTableData := DataTableData{
Draw: draw,
RecordsTotal: count_overall,
RecordsFiltered: count,
Data: dataTableEntries,
}
res, _ := json.Marshal(dataTableData)
w.Header().Set("Content-Type", "application/json")
w.Write(res)
}
func getParam(r *http.Request, keyname string) string {
keys, ok := r.URL.Query()[keyname]
if !ok || len(keys[0]) < 1 {
return ""
}
result := keys[0]
return result
}