Documentation
¶
Index ¶
- func SeverityToRank(severity model.VulnerabilitySeverity) int
- type CVEEventCandidate
- type CVEEventResolutionCandidate
- type DeviceImageDigest
- type FleetSeverityCounts
- type GroupedVulnPageRow
- type ImpactDigestDetail
- type ImpactPageResult
- type ImpactPageRow
- type OrgVulnerabilitySummary
- type SeverityCounts
- type Store
- type VulnerabilityFindingStore
- func (s *VulnerabilityFindingStore) BatchUpdateOpenEvents(ctx context.Context, actions []model.CVEEventAction) ([]model.CVEEventAction, error)
- func (s *VulnerabilityFindingStore) ComputeAllCVEActions(ctx context.Context, changedFindings []model.ChangedFinding, ...) ([]model.CVEEventAction, error)
- func (s *VulnerabilityFindingStore) FindAnyFindingForCVE(ctx context.Context, cveID string) (*model.VulnerabilityFinding, error)
- func (s *VulnerabilityFindingStore) FindingsForCVEAndImageDigests(ctx context.Context, cveID string, imageDigests []string) ([]model.VulnerabilityFinding, error)
- func (s *VulnerabilityFindingStore) GetFleetVulnerabilitySummary(ctx context.Context, digests []DeviceImageDigest, fs *selector.FieldSelector) (FleetSeverityCounts, error)
- func (s *VulnerabilityFindingStore) GetImpactDigestDetails(ctx context.Context, orgID uuid.UUID, cveID string, owners []string, ...) ([]ImpactDigestDetail, error)
- func (s *VulnerabilityFindingStore) GetOrgVulnerabilitySummary(ctx context.Context, orgID uuid.UUID) (OrgVulnerabilitySummary, error)
- func (s *VulnerabilityFindingStore) GetVulnerabilities(ctx context.Context, digest string, listParams store.ListParams) (*VulnerabilityListResult, error)
- func (s *VulnerabilityFindingStore) GetVulnerabilityGroups(ctx context.Context, digests []DeviceImageDigest, listParams store.ListParams) (*VulnerabilityGroupResult, error)
- func (s *VulnerabilityFindingStore) GetVulnerabilityImpactPage(ctx context.Context, orgID uuid.UUID, cveID string, ...) (*ImpactPageResult, error)
- func (s *VulnerabilityFindingStore) GetVulnerabilitySummary(ctx context.Context, digest string, fs *selector.FieldSelector) (SeverityCounts, error)
- func (s *VulnerabilityFindingStore) InitialMigration(ctx context.Context) error
- func (s *VulnerabilityFindingStore) ListCVEEventResolutionCandidates(ctx context.Context) ([]CVEEventResolutionCandidate, error)
- func (s *VulnerabilityFindingStore) ListCriticalCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
- func (s *VulnerabilityFindingStore) ListDeployedImageDigests(ctx context.Context) ([]string, error)
- func (s *VulnerabilityFindingStore) ListFleetDeviceImageDigests(ctx context.Context, orgId uuid.UUID, fleetName string) ([]DeviceImageDigest, error)
- func (s *VulnerabilityFindingStore) ListOpenWarningSupersedeCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
- func (s *VulnerabilityFindingStore) ListOrgDeviceImageDigests(ctx context.Context, orgId uuid.UUID) ([]DeviceImageDigest, error)
- func (s *VulnerabilityFindingStore) ListWarningCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
- func (s *VulnerabilityFindingStore) UpsertFindings(ctx context.Context, findings []model.VulnerabilityFinding) ([]model.ChangedFinding, error)
- type VulnerabilityGroup
- type VulnerabilityGroupResult
- type VulnerabilityListResult
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func SeverityToRank ¶
func SeverityToRank(severity model.VulnerabilitySeverity) int
SeverityToRank converts a model severity enum to its integer rank used in SQL ordering.
Types ¶
type CVEEventCandidate ¶
type CVEEventCandidate struct {
OrgID uuid.UUID `gorm:"column:org_id"`
DeviceName string `gorm:"column:device_name"`
CveID string `gorm:"column:cve_id"`
ImageDigest string `gorm:"column:image_digest"`
ImageRef string `gorm:"column:image_ref"`
CvssScore float64 `gorm:"column:cvss_score"`
Severity string `gorm:"column:severity"`
}
CVEEventCandidate is one device+CVE row eligible for a new vulnerability event emission.
type CVEEventResolutionCandidate ¶
type CVEEventResolutionCandidate struct {
OrgID uuid.UUID `gorm:"column:org_id"`
DeviceName string `gorm:"column:device_name"`
CveID string `gorm:"column:cve_id"`
ImageDigest string `gorm:"column:image_digest"`
ImageRef string `gorm:"column:image_ref"`
PriorReason string `gorm:"column:prior_reason"`
CvssScore float64 `gorm:"column:cvss_score"`
Severity string `gorm:"column:severity"`
}
CVEEventResolutionCandidate is an open Warning or Critical CVE event that should receive a Resolved event.
type DeviceImageDigest ¶
DeviceImageDigest aggregates all image refs that resolve to the same digest.
type FleetSeverityCounts ¶
type FleetSeverityCounts struct {
SeverityCounts
UniqueDigests int64
}
FleetSeverityCounts extends SeverityCounts with the unique digest count for a fleet.
type GroupedVulnPageRow ¶
type GroupedVulnPageRow struct {
CveID string
SeverityRank int
MaxCvssScore *float64
MaxPublishedAt *time.Time
}
GroupedVulnPageRow holds the per-CVE aggregated data for pagination (without full findings).
type ImpactDigestDetail ¶
type ImpactDigestDetail struct {
Owner *string `gorm:"column:owner"`
ImageDigest string `gorm:"column:image_digest"`
ImageRefsJSON []byte `gorm:"column:image_refs_json"`
DeviceCount int64 `gorm:"column:device_count"`
Severity string `gorm:"column:severity"`
CvssScore *float64 `gorm:"column:cvss_score"`
AdvisoryID *string `gorm:"column:advisory_id"`
IssuerName *string `gorm:"column:issuer_name"`
Description *string `gorm:"column:description"`
PublishedAt *time.Time `gorm:"column:published_at"`
FirstSeenAt *time.Time `gorm:"column:first_seen_at"`
}
ImpactDigestDetail holds per-(owner, digest) details: imageRefs, device count, and vulnerability metadata.
type ImpactPageResult ¶
type ImpactPageResult struct {
Rows []ImpactPageRow
TotalFleets int64
WorstSeverity string
MaxCvssScore *float64
MaxPublishedAt *time.Time
Continue *string
}
ImpactPageResult holds the page rows plus top-level aggregates for the entire CVE impact.
type ImpactPageRow ¶
type ImpactPageRow struct {
Owner *string `gorm:"column:owner"`
DeviceAffected int64 `gorm:"column:device_affected"`
}
ImpactPageRow is one row for the page-level query (owner-level aggregates + digest list).
type OrgVulnerabilitySummary ¶
type OrgVulnerabilitySummary struct {
CvesBySeverity SeverityCounts
}
OrgVulnerabilitySummary holds distinct CVE counts and distinct device counts per finding severity for an organization (tenant-scoped via devices ⨝ vulnerability_findings).
type SeverityCounts ¶
type SeverityCounts struct {
Total int64
Critical int64
High int64
Medium int64
Low int64
None int64
Unknown int64
}
SeverityCounts holds per-severity CVE counts for a result set.
type Store ¶
type Store interface {
InitialMigration(ctx context.Context) error
ListDeployedImageDigests(ctx context.Context) ([]string, error)
// UpsertFindings inserts or updates vulnerability findings and returns the findings
// that were actually inserted or had their severity/status changed.
UpsertFindings(ctx context.Context, findings []model.VulnerabilityFinding) ([]model.ChangedFinding, error)
// GetVulnerabilities returns paginated findings for a single image digest.
// Supports cursor-based pagination via store.ListParams.Continue and sorting via store.ListParams.SortColumns
// (store.SortBySeverity, store.SortByCvssScore, store.SortByPublishedAt, store.SortByCveId).
GetVulnerabilities(ctx context.Context, digest string, listParams store.ListParams) (*VulnerabilityListResult, error)
// GetVulnerabilitySummary returns the severity counts for a single image digest.
GetVulnerabilitySummary(ctx context.Context, digest string, fieldSelector *selector.FieldSelector) (SeverityCounts, error)
// ListFleetDeviceImageDigests returns the (image, imageDigest, deviceCount) rows for all
// non-deleted devices that belong to the given fleet within the given org.
ListFleetDeviceImageDigests(ctx context.Context, orgId uuid.UUID, fleetName string) ([]DeviceImageDigest, error)
// ListOrgDeviceImageDigests returns per-digest device totals and image refs for all
// non-deleted devices in the organization (any fleet or fleetless).
ListOrgDeviceImageDigests(ctx context.Context, orgId uuid.UUID) ([]DeviceImageDigest, error)
// GetVulnerabilityGroups returns findings grouped by CVE across multiple image digests.
// Supports cursor-based pagination via store.ListParams.Continue and sorting via store.ListParams.SortColumns
// (store.SortBySeverity, store.SortByCvssScore, store.SortByPublishedAt, store.SortByCveId).
GetVulnerabilityGroups(ctx context.Context, digests []DeviceImageDigest, listParams store.ListParams) (*VulnerabilityGroupResult, error)
// GetFleetVulnerabilitySummary returns the severity summary across multiple image digests using SQL aggregation.
GetFleetVulnerabilitySummary(ctx context.Context, digests []DeviceImageDigest, fieldSelector *selector.FieldSelector) (FleetSeverityCounts, error)
// GetOrgVulnerabilitySummary returns per-severity CVE and affected-device counts for an organization.
GetOrgVulnerabilitySummary(ctx context.Context, orgID uuid.UUID) (OrgVulnerabilitySummary, error)
// FindAnyFindingForCVE returns any finding row for the CVE, or nil if none exist.
FindAnyFindingForCVE(ctx context.Context, cveID string) (*model.VulnerabilityFinding, error)
// FindingsForCVEAndImageDigests returns findings for the CVE limited to the given digests (empty digests => empty slice).
FindingsForCVEAndImageDigests(ctx context.Context, cveID string, imageDigests []string) ([]model.VulnerabilityFinding, error)
// GetVulnerabilityImpactPage returns one page of fleets with fleet totals, digest lists, and top-level CVE aggregates.
// Supports cursor-based pagination via store.ListParams.Continue and sorting via store.ListParams.SortColumns (store.SortByOwner or store.SortByDeviceAffected).
GetVulnerabilityImpactPage(ctx context.Context, orgID uuid.UUID, cveID string, listParams store.ListParams) (*ImpactPageResult, error)
// GetImpactDigestDetails returns per-(owner, digest) device counts and vulnerability metadata for the given owners.
GetImpactDigestDetails(ctx context.Context, orgID uuid.UUID, cveID string, owners []string, includeNull bool) ([]ImpactDigestDetail, error)
// ListCVEEventResolutionCandidates returns open Warning/Critical CVE events that merit a Resolved event (PostgreSQL only).
ListCVEEventResolutionCandidates(ctx context.Context) ([]CVEEventResolutionCandidate, error)
// ListOpenWarningSupersedeCVEEventCandidates returns device/CVE rows crossing critical severity with an open Warning (PostgreSQL only).
ListOpenWarningSupersedeCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
// ListCriticalCVEEventCandidates returns device/CVE rows with Critical severity eligible for a Critical event (PostgreSQL only).
ListCriticalCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
// ListWarningCVEEventCandidates returns device/CVE rows with High severity eligible for a Warning event (PostgreSQL only).
ListWarningCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
// ComputeAllCVEActions computes all CVE event actions from changed findings and device image changes.
// Returns a list of actions (new, supersede, resolved) to apply to device_open_cve_events.
ComputeAllCVEActions(ctx context.Context, changedFindings []model.ChangedFinding, lastSnapshot time.Time) ([]model.CVEEventAction, error)
// BatchUpdateOpenEvents applies CVE event actions to device_open_cve_events using batch INSERT/UPDATE/DELETE.
// Returns the actions that were actually applied (for event emission).
BatchUpdateOpenEvents(ctx context.Context, actions []model.CVEEventAction) ([]model.CVEEventAction, error)
}
func NewVulnerabilityFindingStore ¶
func NewVulnerabilityFindingStore(db *gorm.DB, log logrus.FieldLogger) Store
type VulnerabilityFindingStore ¶
type VulnerabilityFindingStore struct {
// contains filtered or unexported fields
}
func (*VulnerabilityFindingStore) BatchUpdateOpenEvents ¶
func (s *VulnerabilityFindingStore) BatchUpdateOpenEvents(ctx context.Context, actions []model.CVEEventAction) ([]model.CVEEventAction, error)
BatchUpdateOpenEvents applies CVE event actions to device_open_cve_events using batch queries. Returns the actions that were actually applied (for event emission).
func (*VulnerabilityFindingStore) ComputeAllCVEActions ¶
func (s *VulnerabilityFindingStore) ComputeAllCVEActions(ctx context.Context, changedFindings []model.ChangedFinding, lastSnapshot time.Time) ([]model.CVEEventAction, error)
ComputeAllCVEActions computes all CVE event actions from changed findings and device image changes. It combines two sources of deltas: 1. Finding actions: Changed findings expanded to device-CVE pairs, compared against open events 2. Device actions: Devices that changed images since lastSnapshot Returns a unified list of actions (new, supersede, resolved) to apply.
func (*VulnerabilityFindingStore) FindAnyFindingForCVE ¶
func (s *VulnerabilityFindingStore) FindAnyFindingForCVE(ctx context.Context, cveID string) (*model.VulnerabilityFinding, error)
func (*VulnerabilityFindingStore) FindingsForCVEAndImageDigests ¶
func (s *VulnerabilityFindingStore) FindingsForCVEAndImageDigests(ctx context.Context, cveID string, imageDigests []string) ([]model.VulnerabilityFinding, error)
func (*VulnerabilityFindingStore) GetFleetVulnerabilitySummary ¶
func (s *VulnerabilityFindingStore) GetFleetVulnerabilitySummary( ctx context.Context, digests []DeviceImageDigest, fs *selector.FieldSelector, ) (FleetSeverityCounts, error)
GetFleetVulnerabilitySummary returns the fleet-level severity summary across multiple image digests using a single SQL aggregation — no in-memory iteration.
func (*VulnerabilityFindingStore) GetImpactDigestDetails ¶
func (s *VulnerabilityFindingStore) GetImpactDigestDetails( ctx context.Context, orgID uuid.UUID, cveID string, owners []string, includeNull bool, ) ([]ImpactDigestDetail, error)
func (*VulnerabilityFindingStore) GetOrgVulnerabilitySummary ¶
func (s *VulnerabilityFindingStore) GetOrgVulnerabilitySummary(ctx context.Context, orgID uuid.UUID) (OrgVulnerabilitySummary, error)
func (*VulnerabilityFindingStore) GetVulnerabilities ¶
func (s *VulnerabilityFindingStore) GetVulnerabilities( ctx context.Context, digest string, listParams store.ListParams, ) (*VulnerabilityListResult, error)
func (*VulnerabilityFindingStore) GetVulnerabilityGroups ¶
func (s *VulnerabilityFindingStore) GetVulnerabilityGroups( ctx context.Context, digests []DeviceImageDigest, listParams store.ListParams, ) (*VulnerabilityGroupResult, error)
GetVulnerabilityGroups returns CVE groups for the given image digests using two queries:
Step 1 — lightweight GROUP BY: computes only the three sort fields and COUNT(*) OVER() for the total count, then applies LIMIT/OFFSET to get exactly the page of CVE IDs.
Step 2 — targeted fetch: loads full findings only for those CVEs (at most pageSize × fleetImageCount rows, typically < 200). The Go assembly collects unique image digests per CVE from the fetched findings.
func (*VulnerabilityFindingStore) GetVulnerabilityImpactPage ¶
func (s *VulnerabilityFindingStore) GetVulnerabilityImpactPage( ctx context.Context, orgID uuid.UUID, cveID string, listParams store.ListParams, ) (*ImpactPageResult, error)
func (*VulnerabilityFindingStore) GetVulnerabilitySummary ¶
func (s *VulnerabilityFindingStore) GetVulnerabilitySummary( ctx context.Context, digest string, fs *selector.FieldSelector, ) (SeverityCounts, error)
GetSummaryByDigest returns the full (unpaginated) severity counts for a single image digest.
func (*VulnerabilityFindingStore) InitialMigration ¶
func (s *VulnerabilityFindingStore) InitialMigration(ctx context.Context) error
func (*VulnerabilityFindingStore) ListCVEEventResolutionCandidates ¶
func (s *VulnerabilityFindingStore) ListCVEEventResolutionCandidates(ctx context.Context) ([]CVEEventResolutionCandidate, error)
ListCVEEventResolutionCandidates returns open Warning or Critical CVE events that should receive a Resolved event.
func (*VulnerabilityFindingStore) ListCriticalCVEEventCandidates ¶
func (s *VulnerabilityFindingStore) ListCriticalCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
ListCriticalCVEEventCandidates returns device+CVE rows with Critical severity that need a Critical event.
func (*VulnerabilityFindingStore) ListDeployedImageDigests ¶
func (s *VulnerabilityFindingStore) ListDeployedImageDigests(ctx context.Context) ([]string, error)
ListDeployedImageDigests returns the distinct set of OS image digests reported across all devices (all organizations), excluding empty or NULL values.
func (*VulnerabilityFindingStore) ListFleetDeviceImageDigests ¶
func (s *VulnerabilityFindingStore) ListFleetDeviceImageDigests( ctx context.Context, orgId uuid.UUID, fleetName string, ) ([]DeviceImageDigest, error)
ListFleetDeviceImageDigests returns per-digest device totals and all image refs reported for each digest by devices in the given fleet and organization.
func (*VulnerabilityFindingStore) ListOpenWarningSupersedeCVEEventCandidates ¶
func (s *VulnerabilityFindingStore) ListOpenWarningSupersedeCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
ListOpenWarningSupersedeCVEEventCandidates returns device+CVE rows that qualify for Critical severity and still have an open Warning (emit Resolved before Critical).
func (*VulnerabilityFindingStore) ListOrgDeviceImageDigests ¶
func (s *VulnerabilityFindingStore) ListOrgDeviceImageDigests( ctx context.Context, orgId uuid.UUID, ) ([]DeviceImageDigest, error)
ListOrgDeviceImageDigests returns per-digest device totals and all image refs reported for each digest by non-deleted devices in the given organization.
This is the tenant boundary for org-wide vulnerability APIs: only devices with matching org_id contribute digests (see devices.org_id in the query below).
func (*VulnerabilityFindingStore) ListWarningCVEEventCandidates ¶
func (s *VulnerabilityFindingStore) ListWarningCVEEventCandidates(ctx context.Context) ([]CVEEventCandidate, error)
ListWarningCVEEventCandidates returns device+CVE rows with High severity that need a Warning event.
func (*VulnerabilityFindingStore) UpsertFindings ¶
func (s *VulnerabilityFindingStore) UpsertFindings(ctx context.Context, findings []model.VulnerabilityFinding) ([]model.ChangedFinding, error)
UpsertFindings inserts or updates vulnerability findings and returns the findings that were actually inserted or had their severity/status changed. All metadata fields (advisory_id, cvss_score, description, published_at) are always refreshed on conflict, but only findings with severity/status changes are returned. Returned findings include SeverityChanged and StatusChanged flags for event emission. Uses PostgreSQL CTEs to capture old values and compute change flags efficiently.
type VulnerabilityGroup ¶
type VulnerabilityGroup struct {
CveID string
SeverityRank int
MaxCvssScore *float64
MaxPublishedAt *time.Time
Findings []model.VulnerabilityFinding
}
VulnerabilityGroup is the per-CVE result returned by GetVulnerabilityGroups. SeverityRank is the integer rank (1=Critical … 6=None; 7=unrecognized severity) from the SQL severity expression; use model.VulnerabilitySeverityFromRank to recover the string. Findings contains the raw store rows for all (image_digest, cve_id) pairs in this group — one entry per image for fleet/estate context.
type VulnerabilityGroupResult ¶
type VulnerabilityGroupResult struct {
Groups []VulnerabilityGroup
Continue *string
}
VulnerabilityGroupResult holds paginated vulnerability groups.
type VulnerabilityListResult ¶
type VulnerabilityListResult struct {
Items []model.VulnerabilityFinding
Continue *string
}
VulnerabilityListResult holds paginated vulnerability findings.