syntax = "proto3";

package source_metadata;

option go_package = "github.com/trufflesecurity/trufflehog/v3/pkg/pb/source_metadatapb";

import "google/protobuf/timestamp.proto";

message Azure {
  string container = 1;
  string file = 2;
  string uploaded = 3;
  string link = 4;
  string email = 5;
}

message Bitbucket {
  string file = 1;
  string repository = 2;
  string workspace = 3;
  string snippet_id = 4;
  string title = 5;
  string commit = 6;
  string email = 7;
  string link = 8;
  string timestamp = 9;
  int64 line = 10;
}

message Buildkite {
  string org = 1;
  string pipeline = 2;
  string link = 3;
  string email = 4;
  int64 build_number = 5;
  string timestamp = 6;
}

message CircleCI {
  string vcs_type = 1;
  string username = 2;
  string repository = 3;
  int64 build_number = 4;
  string build_step  = 5;
  string link = 6;
  string email = 7;
}

message TravisCI {
  string username = 2;
  string repository = 3;
  string build_number = 4;
  string job_number  = 5;
  string link = 6;
  bool public = 7;
}


message Confluence {
  string page = 1;
  string space = 2;
  string version = 3;
  string link = 4;
  string email = 5;
  string timestamp = 6;
  string location = 7;
  string file = 8;
  string user = 9;
  string comment_id = 10;
}

message Docker {
  string file = 1;
  string image = 2;
  string layer = 3;
  string tag = 4;
}

message ECR {
  string file = 1;
  string layer = 2;
  string image = 3;
  string registry = 4;
  string region = 5;
  string link = 6;
  string email = 7;
}

message Filesystem {
  string file = 1;
  string link = 2;
  string email = 3;
  int64 line = 4;
}

message Git {
  string commit = 1;
  string file = 2;
  string email = 3;
  string repository = 4;
  string timestamp = 5;
  int64 line = 6;
  string repository_local_path = 7;
}

message Github {
  string link = 1;
  string username = 2;
  string repository = 3;
  string commit = 4;
  string email = 5;
  string file = 6;
  string timestamp = 7;
  int64 line = 8;
  Visibility visibility = 9;
  string repository_local_path = 10;
}

message Gitlab {
  string commit = 1;
  string file = 2;
  string link = 3;
  string email = 4;
  string repository = 5;
  string timestamp = 6;
  int64 line = 7;
  int64 project_id = 8;
  string project_name = 9;
  string project_owner = 10;
  string repository_local_path = 11;
}

message GCS {
  string bucket = 1;
  string filename = 2;
  string link = 3;
  string email = 4;
  string created_at = 5;
  string updated_at = 6;
  repeated string acls = 7;
  string content_type = 8;
}

message Huggingface {
  string link = 1;
  string username = 2;
  string repository = 3;
  string commit = 4;
  string email = 5;
  string file = 6;
  string timestamp = 7;
  int64 line = 8;
  Visibility visibility = 9;
  string resource_type = 10;
}

message Jira {
  string issue = 1;
  string author = 2;
  string link = 3;
  string location = 4;
  string email = 5;
  string timestamp = 6;
}

message NPM {
  string file = 1;
  string package = 2;
  string release = 3;
  string link = 4;
  string email = 5;
}

message PyPi {
  string file = 1;
  string package = 2;
  string release = 3;
  string link = 4;
  string email = 5;
}

message S3 {
  string bucket = 1;
  string file = 2;
  string link = 3;
  string email = 5;
  string timestamp = 6;
}

enum Visibility {
  public = 0;
  private = 1;
  shared = 2;
  unknown = 3;
}

message Slack {
  string channel_id = 1;
  string channel_name = 2;
  string timestamp = 3;
  string user_id = 4;
  string link = 5;
  string file = 6;
  string email = 7;
  Visibility visibility = 8;
  string location = 9;
}

message Gerrit {
  string commit = 1;
  string file = 2;
  string email = 3;
  string project = 4; // projects are what Gerrit calls repositories
  string timestamp = 5;
  int64 line = 6;
}

message Test {
  string file = 1;
}

message Jenkins {
  string project_name = 1;
  int64 build_number = 2;
  string link = 3;
  string timestamp = 4;
}

message Teams {
  string channel_id = 1;
  string channel_name = 2;
  string timestamp = 3;
  string user_id = 4;
  string link = 5;
  string file = 6;
  string email = 7;
  string location = 8;
  string team_name = 9;
  string team_id = 10;
}

// https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API#ArtifactoryRESTAPI-FileInfo
message Artifactory {
  string repo = 1;
  string path = 2;
  string link = 3;
  string timestamp = 4;
  string username = 5;
  string email = 6;
}

message Syslog {
  string hostname = 1;
  string appname = 2;
  string procid = 3;
  string timestamp = 4;
  string client = 5;
  string facility = 6;
}

message Forager {
  oneof metadata {
    Github github = 1;
    NPM npm = 2;
    PyPi pypi = 3;
  }
}

message SharePoint {
  string link = 1;
  string timestamp = 2;
  string author = 3;
  string title = 4;
  int64 views = 5;
  string docid = 6;
  string email = 7;
}

message GoogleDrive {
  string file = 1;
  string link = 2;
  string email = 3;
  string timestamp = 4;
  bool shared = 5;
  string last_modified_by = 6;
  string path = 7;
}

message AzureRepos {
  string link = 1;
  string username = 2;
  string repository = 3;
  string commit = 4;
  string email = 5;
  string file = 6;
  string timestamp = 7;
  int64 line = 8;
  Visibility visibility = 9;
  string project = 10;
  string organization = 11;
}

message Postman {
  reserved 4, 14, 15;
  reserved "globals_id", "field_name", "variable_type";
  string link = 1;
  string workspace_uuid = 2;
  string workspace_name = 3;
  string collection_id = 5;
  string collection_name = 6;
  string environment_id = 7;
  string environment_name = 8;
  string request_id =  9;
  string request_name = 10;
  string folder_id = 11;
  string folder_name = 12;
  string field_type = 13; // Do not use this field for transport. It is only used for output to STDOUT.
  PostmanLocationType location_type = 16;
  string response_id = 17;
  string response_name = 18;
}

enum PostmanLocationType {
  UNKNOWN_POSTMAN = 0;
  REQUEST_QUERY_PARAMETER = 1;
  REQUEST_AUTHORIZATION = 2;
  REQUEST_HEADER = 3;
  REQUEST_BODY_FORM_DATA = 4;
  REQUEST_BODY_RAW = 5;
  REQUEST_BODY_URL_ENCODED = 6;
  REQUEST_BODY_GRAPHQL = 7;
  REQUEST_SCRIPT = 8;
  REQUEST_URL = 9;
  ENVIRONMENT_VARIABLE = 10;
  FOLDER_AUTHORIZATION = 11;
  FOLDER_SCRIPT = 12;
  COLLECTION_SCRIPT = 13;
  COLLECTION_VARIABLE = 14;
  COLLECTION_AUTHORIZATION = 15;
  RESPONSE_BODY = 16;
  RESPONSE_HEADER = 17;
}

message Vector {
  google.protobuf.Timestamp timestamp = 1;
  string source_type = 2;
  string host = 3;
  string locator = 4;
  string link = 5;
}

message Webhook {
  oneof data {
    Vector vector = 1;
  }
}

message Elasticsearch {
  string index = 1;
  string document_id = 2;
  string timestamp = 3;
}

message Sentry {
  string event_id = 1;
  string organization_id = 2;
  string organization_slug = 3;
  string organization_date_created = 4;
  string project_id = 5;
  string project_slug = 6;
  string issue_id = 7;
  string date_created = 8;
  string link = 9;
}

message Stdin {}

message SlackContinuous {
  string channel_id = 1;
  string channel_name = 2;
  string timestamp = 3;
  string user_id = 4;
  string link = 5;
  string file = 6;
  string email = 7;
  Visibility visibility = 8;
  string location = 9;
  string workspace_id = 10;
}

message JSONEnumerator {
  string metadata = 1;
}

message MetaData {
  oneof data {
    Azure azure = 1;
    Bitbucket bitbucket = 2;
    CircleCI circleci = 3;
    Confluence confluence = 4;
    Docker docker = 5;
    ECR ecr = 6;
    GCS gcs = 7;
    Github github = 8;
    Gitlab gitlab = 9;
    Jira jira = 10;
    NPM npm = 11;
    PyPi pypi = 12;
    S3 s3 = 13;
    Slack slack = 14;
    Filesystem filesystem = 15;
    Git git = 16;
    Test test = 17;
    Buildkite buildkite = 18;
    Gerrit gerrit = 19;
    Jenkins jenkins = 20;
    Teams teams = 21;
    Artifactory artifactory = 22;
    Syslog syslog = 23;
    Forager forager = 24;
    SharePoint sharepoint = 25;
    GoogleDrive googleDrive = 26;
    AzureRepos azureRepos = 27;
    TravisCI travisCI = 28;
    Postman postman = 29;
    Webhook webhook = 30;
    Elasticsearch elasticsearch = 31;
    Huggingface huggingface = 32;
    Sentry sentry = 33;
    Stdin stdin = 34;
    SlackContinuous slackContinuous = 35;
    JSONEnumerator jsonEnumerator = 36;
  }
}
