vulnerabilityfinding

package
v1.3.0-rc4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 21, 2026 License: Apache-2.0 Imports: 16 Imported by: 0

Documentation

Index

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

type DeviceImageDigest struct {
	ImageDigest string
	DeviceCount int64
	ImageRefs   []string
}

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

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL