syntax = "proto3";

package trivy.common;

import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";

option go_package = "github.com/aquasecurity/trivy/rpc/common;common";

message OS {
  string family = 1;
  string name = 2;
  bool eosl = 3;
  bool extended = 4;
}

message Repository {
  string family = 1;
  string release = 2;
}

message PackageInfo {
  string file_path = 1;
  repeated Package packages = 2;
}

message Application {
  string type = 1;
  string file_path = 2;
  repeated Package packages = 3;
}

message Package {
  // binary package
  // e.g. bind-utils
  string id = 13;
  string name = 1;
  string version = 2;
  string release = 3;
  int32 epoch = 4;
  PkgIdentifier identifier = 19;
  string arch = 5;
  // src package containing some binary packages
  // e.g. bind
  string src_name = 6;
  string src_version = 7;
  string src_release = 8;
  int32 src_epoch = 9;
  repeated string licenses = 15;
  repeated Location locations = 20;
  Layer layer = 11;
  string file_path = 12;
  repeated string depends_on = 14;
  string digest = 16;
  bool dev = 17;
  bool indirect = 18;
  string maintainer = 21;
  int32 relationship = 22;
  string analyzed_by = 23;
}

message PkgIdentifier {
  string purl = 1;
  string bom_ref = 2;
  string uid = 3;
}

message Location {
  int32 start_line = 1;
  int32 end_line = 2;
}

message BuildInfo {
  repeated string content_sets = 1;
  string nvr = 2;
  string arch = 3;
}

message Misconfiguration {
  string file_type = 1;
  string file_path = 2;
  repeated MisconfResult successes = 3;
  repeated MisconfResult warnings = 4;
  repeated MisconfResult failures = 5;

  reserved 6; // deprecated 'exceptions'
}

message MisconfResult {
  string namespace = 1;
  string message = 2;
  reserved 3 to 6;
  reserved "type", "id", "title", "severity";
  PolicyMetadata policy_metadata = 7;
  CauseMetadata cause_metadata = 8;
}

message PolicyMetadata {
  string id = 1;
  string adv_id = 2;
  string type = 3;
  string title = 4;
  string description = 5;
  string severity = 6;
  string recommended_actions = 7;
  repeated string references = 8;
}

message DetectedMisconfiguration {
  string type = 1;
  string id = 2;
  string title = 3;
  string description = 4;
  string message = 5;
  string namespace = 6;
  string resolution = 7;
  Severity severity = 8;
  string primary_url = 9;
  repeated string references = 10;
  string status = 11;
  Layer layer = 12;
  CauseMetadata cause_metadata = 13;
  string avd_id = 14 [deprecated = true];
  string query = 15;
  repeated string aliases = 16;
}

message Vulnerability {
  string vulnerability_id = 1;
  string pkg_name = 2;
  string installed_version = 3;
  string fixed_version = 4;
  string title = 5;
  string description = 6;
  Severity severity = 7;
  repeated string references = 8;
  PkgIdentifier pkg_identifier = 25;
  Layer layer = 10;
  string severity_source = 11;
  map<string, CVSS> cvss = 12;
  repeated string cwe_ids = 13;
  string primary_url = 14;
  google.protobuf.Timestamp published_date = 15;
  google.protobuf.Timestamp last_modified_date = 16;
  google.protobuf.Value custom_advisory_data = 17;
  google.protobuf.Value custom_vuln_data = 18;
  repeated string vendor_ids = 19;
  DataSource data_source = 20;
  map<string, Severity> vendor_severity = 21;
  string pkg_path = 22;
  string pkg_id = 23;
  int32 status = 24;
}

message DataSource {
  string id = 1;
  string name = 2;
  string url = 3;
}

message Layer {
  string digest = 1;
  string diff_id = 2;
  string created_by = 3;
  int64 size = 4;
}

message CauseMetadata {
  string resource = 1;
  string provider = 2;
  string service = 3;
  int32 start_line = 4;
  int32 end_line = 5;
  Code code = 6;
  RenderedCause rendered_cause = 7;
}

enum Severity {
  UNKNOWN = 0;
  LOW = 1;
  MEDIUM = 2;
  HIGH = 3;
  CRITICAL = 4;
}

message CVSS {
  string v2_vector = 1;
  string v3_vector = 2;
  double v2_score = 3;
  double v3_score = 4;
  string v40_vector = 5;
  double v40_score = 6;
}

message CustomResource {
  string type = 1;
  string file_path = 2;
  Layer layer = 3;
  google.protobuf.Value data = 4;
}

message Line {
  int32 number = 1;
  string content = 2;
  bool is_cause = 3;
  string annotation = 4;
  bool truncated = 5;
  string highlighted = 6;
  bool first_cause = 7;
  bool last_cause = 8;
}

message Code {
  repeated Line lines = 1;
}

message RenderedCause {
  string raw = 1;
  string highlighted = 2;
}

message SecretFinding {
  string rule_id = 1;
  string category = 2;
  string severity = 3;
  string title = 4;
  int32 start_line = 5;
  int32 end_line = 6;
  Code code = 7;
  string match = 8;
  Layer layer = 10;
  int32 offset = 11;

  reserved 9; // deprecated 'deleted'
}

message Secret {
  string filepath = 1;
  repeated SecretFinding findings = 2;
}

message DetectedLicense {
  Severity severity = 1;
  LicenseCategory.Enum category = 2;
  string pkg_name = 3;
  string file_path = 4;
  string name = 5;
  float confidence = 6;
  string link = 7;
  string text = 8;
}

message LicenseFile {
  LicenseType.Enum license_type = 1;
  string file_path = 2;
  string pkg_name = 3;
  repeated LicenseFinding fingings = 4;
  Layer layer = 5;
}

message LicenseFinding {
  LicenseCategory.Enum category = 1;
  string name = 2;
  float confidence = 3;
  string link = 4;
}

// Enumerations are wrapped with a message to improve the readability of
// enumerations in generated code and avoid name conflicts.
// https://github.com/golang/protobuf/issues/513
message LicenseCategory {
  enum Enum {
    UNSPECIFIED = 0;
    FORBIDDEN = 1;
    RESTRICTED = 2;
    RECIPROCAL = 3;
    NOTICE = 4;
    PERMISSIVE = 5;
    UNENCUMBERED = 6;
    UNKNOWN = 7;
  }
}

message LicenseType {
  enum Enum {
    UNSPECIFIED = 0;
    DPKG = 1;
    HEADER = 2;
    LICENSE_FILE = 3;
  }
}
