// Copyright 2018 Google LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

syntax = "proto3";

package google.cloud.securitycenter.v1beta1;

import "google/api/annotations.proto";
import "google/cloud/securitycenter/v1beta1/asset.proto";
import "google/cloud/securitycenter/v1beta1/finding.proto";
import "google/cloud/securitycenter/v1beta1/organization_settings.proto";
import "google/cloud/securitycenter/v1beta1/security_marks.proto";
import "google/cloud/securitycenter/v1beta1/source.proto";
import "google/iam/v1/iam_policy.proto";
import "google/iam/v1/policy.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";

option go_package = "google.golang.org/genproto/googleapis/cloud/securitycenter/v1beta1;securitycenter";
option java_package = "com.google.cloud.securitycenter.v1beta1";

// V1 Beta APIs for Security Center service.
service SecurityCenter {
  // Creates a source.
  rpc CreateSource(CreateSourceRequest) returns (Source) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=organizations/*}/sources"
      body: "source"
    };
  }

  // Creates a finding. The corresponding source must exist for finding creation
  // to succeed.
  rpc CreateFinding(CreateFindingRequest) returns (Finding) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=organizations/*/sources/*}/findings"
      body: "finding"
    };
  }

  // Gets the access control policy on the specified Source.
  rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest)
      returns (google.iam.v1.Policy) {
    option (google.api.http) = {
      post: "/v1beta1/{resource=organizations/*/sources/*}:getIamPolicy"
      body: "*"
    };
  }

  // Gets the settings for an organization.
  rpc GetOrganizationSettings(GetOrganizationSettingsRequest)
      returns (OrganizationSettings) {
    option (google.api.http) = {
      get: "/v1beta1/{name=organizations/*/organizationSettings}"
    };
  }

  // Gets a source.
  rpc GetSource(GetSourceRequest) returns (Source) {
    option (google.api.http) = {
      get: "/v1beta1/{name=organizations/*/sources/*}"
    };
  }

  // Filters an organization's assets and  groups them by their specified
  // properties.
  rpc GroupAssets(GroupAssetsRequest) returns (GroupAssetsResponse) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=organizations/*}/assets:group"
      body: "*"
    };
  }

  // Filters an organization or source's findings and  groups them by their
  // specified properties.
  //
  // To group across all sources provide a `-` as the source id.
  // Example: /v1beta1/organizations/123/sources/-/findings
  rpc GroupFindings(GroupFindingsRequest) returns (GroupFindingsResponse) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=organizations/*/sources/*}/findings:group"
      body: "*"
    };
  }

  // Lists an organization's assets.
  rpc ListAssets(ListAssetsRequest) returns (ListAssetsResponse) {
    option (google.api.http) = {
      get: "/v1beta1/{parent=organizations/*}/assets"
    };
  }

  // Lists an organization or source's assets.
  //
  // To list across all sources provide a `-` as the source id.
  // Example: /v1beta1/organizations/123/sources/-/findings
  rpc ListFindings(ListFindingsRequest) returns (ListFindingsResponse) {
    option (google.api.http) = {
      get: "/v1beta1/{parent=organizations/*/sources/*}/findings"
    };
  }

  // Lists all sources belonging to an organization.
  rpc ListSources(ListSourcesRequest) returns (ListSourcesResponse) {
    option (google.api.http) = {
      get: "/v1beta1/{parent=organizations/*}/sources"
    };
  }

  // Runs asset discovery. The discovery is tracked with a long-running
  // operation.
  //
  // This API can only be called with limited frequency for an organization. If
  // it is called too frequently the caller will receive a TOO_MANY_REQUESTS
  // error.
  rpc RunAssetDiscovery(RunAssetDiscoveryRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=organizations/*}/assets:runDiscovery"
      body: "*"
    };
  }

  // Updates the state of a finding.
  rpc SetFindingState(SetFindingStateRequest) returns (Finding) {
    option (google.api.http) = {
      post: "/v1beta1/{name=organizations/*/sources/*/findings/*}:setState"
      body: "*"
    };
  }

  // Sets the access control policy on the specified Source.
  rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest)
      returns (google.iam.v1.Policy) {
    option (google.api.http) = {
      post: "/v1beta1/{resource=organizations/*/sources/*}:setIamPolicy"
      body: "*"
    };
  }

  // Returns the permissions that a caller has on the specified source.
  rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest)
      returns (google.iam.v1.TestIamPermissionsResponse) {
    option (google.api.http) = {
      post: "/v1beta1/{resource=organizations/*/sources/*}:testIamPermissions"
      body: "*"
    };
  }

  // Creates or updates a finding. The corresponding source must exist for a
  // finding creation to succeed.
  rpc UpdateFinding(UpdateFindingRequest) returns (Finding) {
    option (google.api.http) = {
      patch: "/v1beta1/{finding.name=organizations/*/sources/*/findings/*}"
      body: "finding"
    };
  }

  // Updates an organization's settings.
  rpc UpdateOrganizationSettings(UpdateOrganizationSettingsRequest)
      returns (OrganizationSettings) {
    option (google.api.http) = {
      patch: "/v1beta1/{organization_settings.name=organizations/*/organizationSettings}"
      body: "organization_settings"
    };
  }

  // Updates a source.
  rpc UpdateSource(UpdateSourceRequest) returns (Source) {
    option (google.api.http) = {
      patch: "/v1beta1/{source.name=organizations/*/sources/*}"
      body: "source"
    };
  }

  // Updates security marks.
  rpc UpdateSecurityMarks(UpdateSecurityMarksRequest) returns (SecurityMarks) {
    option (google.api.http) = {
      patch: "/v1beta1/{security_marks.name=organizations/*/assets/*/securityMarks}"
      body: "security_marks"
      additional_bindings {
        patch: "/v1beta1/{security_marks.name=organizations/*/sources/*/findings/*/securityMarks}"
        body: "security_marks"
      }
    };
  }
}

// Request message for creating a finding.
message CreateFindingRequest {
  // Resource name of the new finding's parent. Its format should be
  // "organizations/[organization_id]/sources/[source_id]".
  string parent = 1;

  // Unique identifier provided by the client within the parent scope.
  // It must be alphanumeric and less than or equal to 32 characters and
  // greater than 0 characters in length.
  string finding_id = 2;

  // The Finding being created. The name and security_marks will be ignored as
  // they are both output only fields on this resource.
  Finding finding = 3;
}

// Request message for creating a source.
message CreateSourceRequest {
  // Resource name of the new source's parent. Its format should be
  // "organizations/[organization_id]".
  string parent = 1;

  // The Source being created, only the display_name and description will be
  // used. All other fields will be ignored.
  Source source = 2;
}

// Request message for getting organization settings.
message GetOrganizationSettingsRequest {
  // Name of the organization to get organization settings for. Its format is
  // "organizations/[organization_id]/organizationSettings".
  string name = 1;
}

// Request message for getting a source.
message GetSourceRequest {
  // Relative resource name of the source. Its format is
  // "organizations/[organization_id]/source/[source_id]".
  string name = 1;
}

// Request message for grouping by assets.
message GroupAssetsRequest {
  // Name of the organization to groupBy. Its format is
  // "organizations/[organization_id]".
  string parent = 1;

  // Expression that defines the filter to apply across assets.
  // The expression is a list of zero or more restrictions combined via logical
  // operators `AND` and `OR`.
  // Parentheses are not supported, and `OR` has higher precedence than `AND`.
  //
  // Restrictions have the form `<field> <operator> <value>` and may have a `-`
  // character in front of them to indicate negation. The fields map to those
  // defined in the Asset resource. Examples include:
  //
  // * name
  // * security_center_properties.resource_name
  // * resource_properties.a_property
  // * security_marks.marks.marka
  //
  // The supported operators are:
  //
  // * `=` for all value types.
  // * `>`, `<`, `>=`, `<=` for integer values.
  // * `:`, meaning substring matching, for strings.
  //
  // The supported value types are:
  //
  // * string literals in quotes.
  // * integer literals without quotes.
  // * boolean literals `true` and `false` without quotes.
  //
  // For example, `resource_properties.size = 100` is a valid filter string.
  string filter = 2;

  // Expression that defines what assets fields to use for grouping. The string
  // value should follow SQL syntax: comma separated list of fields. For
  // example:
  // "security_center_properties.resource_project,security_center_properties.project".
  //
  // The following fields are supported when compare_duration is not set:
  //
  // * security_center_properties.resource_name
  // * security_center_properties.resource_project
  // * security_center_properties.resource_type
  // * security_center_properties.resource_parent
  //
  // The following fields are supported when compare_duration is set:
  //
  // * security_center_properties.resource_type
  string group_by = 3;

  // When compare_duration is set, the Asset's "state" property is updated to
  // indicate whether the asset was added, removed, or remained present during
  // the compare_duration period of time that precedes the read_time. This is
  // the time between (read_time - compare_duration) and read_time.
  //
  // The state value is derived based on the presence of the asset at the two
  // points in time. Intermediate state changes between the two times don't
  // affect the result. For example, the results aren't affected if the asset is
  // removed and re-created again.
  //
  // Possible "state" values when compare_duration is specified:
  //
  // * "ADDED": indicates that the asset was not present before
  //              compare_duration, but present at reference_time.
  // * "REMOVED": indicates that the asset was present at the start of
  //              compare_duration, but not present at reference_time.
  // * "ACTIVE_AT_BOTH": indicates that the asset was present at both the
  //              start and the end of the time period defined by
  //              compare_duration and reference_time.
  //
  // This field is ignored if `state` is not a field in `group_by`.
  google.protobuf.Duration compare_duration = 4;

  // Time used as a reference point when filtering assets. The filter is limited
  // to assets existing at the supplied time and their values are those at that
  // specific time. Absence of this field will default to the API's version of
  // NOW.
  google.protobuf.Timestamp read_time = 5;

  // The value returned by the last `GroupAssetsResponse`; indicates
  // that this is a continuation of a prior `GroupAssets` call, and that the
  // system should return the next page of data.
  string page_token = 7;

  // The maximum number of results to return in a single response. Default is
  // 10, minimum is 1, maximum is 1000.
  int32 page_size = 8;
}

// Response message for grouping by assets.
message GroupAssetsResponse {
  // Group results. There exists an element for each existing unique
  // combination of property/values. The element contains a count for the number
  // of times those specific property/values appear.
  repeated GroupResult group_by_results = 1;

  // Time used for executing the groupBy request.
  google.protobuf.Timestamp read_time = 2;

  // Token to retrieve the next page of results, or empty if there are no more
  // results.
  string next_page_token = 3;
}

// Request message for grouping by findings.
message GroupFindingsRequest {
  // Name of the source to groupBy. Its format is
  // "organizations/[organization_id]/sources/[source_id]". To groupBy across
  // all sources provide a source_id of `-`. For example:
  // organizations/123/sources/-
  string parent = 1;

  // Expression that defines the filter to apply across findings.
  // The expression is a list of one or more restrictions combined via logical
  // operators `AND` and `OR`.
  // Parentheses are not supported, and `OR` has higher precedence than `AND`.
  //
  // Restrictions have the form `<field> <operator> <value>` and may have a `-`
  // character in front of them to indicate negation. Examples include:
  //
  //  * name
  //  * source_properties.a_property
  //  * security_marks.marks.marka
  //
  // The supported operators are:
  //
  // * `=` for all value types.
  // * `>`, `<`, `>=`, `<=` for integer values.
  // * `:`, meaning substring matching, for strings.
  //
  // The supported value types are:
  //
  // * string literals in quotes.
  // * integer literals without quotes.
  // * boolean literals `true` and `false` without quotes.
  //
  // For example, `source_properties.size = 100` is a valid filter string.
  string filter = 2;

  // Expression that defines what assets fields to use for grouping (including
  // `state`). The string value should follow SQL syntax: comma separated list
  // of fields. For example:
  // "parent,resource_name".
  //
  // The following fields are supported:
  //
  // * resource_name
  // * category
  // * state
  // * parent
  string group_by = 3;

  // Time used as a reference point when filtering findings. The filter is
  // limited to findings existing at the supplied time and their values are
  // those at that specific time. Absence of this field will default to the
  // API's version of NOW.
  google.protobuf.Timestamp read_time = 4;

  // The value returned by the last `GroupFindingsResponse`; indicates
  // that this is a continuation of a prior `GroupFindings` call, and
  // that the system should return the next page of data.
  string page_token = 5;

  // The maximum number of results to return in a single response. Default is
  // 10, minimum is 1, maximum is 1000.
  int32 page_size = 6;
}

// Response message for group by findings.
message GroupFindingsResponse {
  // Group results. There exists an element for each existing unique
  // combination of property/values. The element contains a count for the number
  // of times those specific property/values appear.
  repeated GroupResult group_by_results = 1;

  // Time used for executing the groupBy request.
  google.protobuf.Timestamp read_time = 2;

  // Token to retrieve the next page of results, or empty if there are no more
  // results.
  string next_page_token = 3;
}

// Result containing the properties and count of a groupBy request.
message GroupResult {
  // Properties matching the groupBy fields in the request.
  map<string, google.protobuf.Value> properties = 1;

  // Total count of resources for the given properties.
  int64 count = 2;
}

// Request message for listing sources.
message ListSourcesRequest {
  // Resource name of the parent of sources to list. Its format should be
  // "organizations/[organization_id]".
  string parent = 1;

  // The value returned by the last `ListSourcesResponse`; indicates
  // that this is a continuation of a prior `ListSources` call, and
  // that the system should return the next page of data.
  string page_token = 2;

  // The maximum number of results to return in a single response. Default is
  // 10, minimum is 1, maximum is 1000.
  int32 page_size = 7;
}

// Response message for listing sources.
message ListSourcesResponse {
  // Sources belonging to the requested parent.
  repeated Source sources = 1;

  // Token to retrieve the next page of results, or empty if there are no more
  // results.
  string next_page_token = 2;
}

// Request message for listing assets.
message ListAssetsRequest {
  // Name of the organization assets should belong to. Its format is
  // "organizations/[organization_id]".
  string parent = 1;

  // Expression that defines the filter to apply across assets.
  // The expression is a list of zero or more restrictions combined via logical
  // operators `AND` and `OR`.
  // Parentheses are not supported, and `OR` has higher precedence than `AND`.
  //
  // Restrictions have the form `<field> <operator> <value>` and may have a `-`
  // character in front of them to indicate negation. The fields map to those
  // defined in the Asset resource. Examples include:
  //
  // * name
  // * security_center_properties.resource_name
  // * resource_properties.a_property
  // * security_marks.marks.marka
  //
  // The supported operators are:
  //
  // * `=` for all value types.
  // * `>`, `<`, `>=`, `<=` for integer values.
  // * `:`, meaning substring matching, for strings.
  //
  // The supported value types are:
  //
  // * string literals in quotes.
  // * integer literals without quotes.
  // * boolean literals `true` and `false` without quotes.
  //
  // For example, `resource_properties.size = 100` is a valid filter string.
  string filter = 2;

  // Expression that defines what fields and order to use for sorting. The
  // string value should follow SQL syntax: comma separated list of fields. For
  // example: "name,resource_properties.a_property". The default sorting order
  // is ascending. To specify descending order for a field, a suffix " desc"
  // should be appended to the field name. For example: "name
  // desc,resource_properties.a_property". Redundant space characters in the
  // syntax are insignificant. "name desc,resource_properties.a_property" and "
  // name     desc  ,   resource_properties.a_property  " are equivalent.
  string order_by = 3;

  // Time used as a reference point when filtering assets. The filter is limited
  // to assets existing at the supplied time and their values are those at that
  // specific time. Absence of this field will default to the API's version of
  // NOW.
  google.protobuf.Timestamp read_time = 4;

  // When compare_duration is set, the ListAssetResult's "state" attribute is
  // updated to indicate whether the asset was added, removed, or remained
  // present during the compare_duration period of time that precedes the
  // read_time. This is the time between (read_time -
  // compare_duration) and read_time.
  //
  // The state value is derived based on the presence of the asset at the two
  // points in time. Intermediate state changes between the two times don't
  // affect the result. For example, the results aren't affected if the asset is
  // removed and re-created again.
  //
  // Possible "state" values when compare_duration is specified:
  //
  // * "ADDED": indicates that the asset was not present before
  //              compare_duration, but present at read_time.
  // * "REMOVED": indicates that the asset was present at the start of
  //              compare_duration, but not present at read_time.
  // * "ACTIVE": indicates that the asset was present at both the
  //              start and the end of the time period defined by
  //              compare_duration and read_time.
  //
  // If compare_duration is not specified, then the only possible state is
  // "UNUSED", which indicates that the asset is present at read_time.
  google.protobuf.Duration compare_duration = 5;

  // Optional.
  //
  // A field mask to specify the ListAssetsResult fields to be listed in the
  // response.
  // An empty field mask will list all fields.
  google.protobuf.FieldMask field_mask = 7;

  // The value returned by the last `ListAssetsResponse`; indicates
  // that this is a continuation of a prior `ListAssets` call, and
  // that the system should return the next page of data.
  string page_token = 8;

  // The maximum number of results to return in a single response. Default is
  // 10, minimum is 1, maximum is 1000.
  int32 page_size = 9;
}

// Response message for listing assets.
message ListAssetsResponse {
  // Result containing the Asset and its State.
  message ListAssetsResult {
    // State of the asset.
    //
    // When querying across two points in time this describes
    // the change between the two points: ADDED, REMOVED, or ACTIVE.
    // If there was no compare_duration supplied in the request the state should
    // be: UNUSED
    enum State {
      // Unspecified state.
      STATE_UNSPECIFIED = 0;

      // Request did not specify use of this field in the result.
      UNUSED = 1;

      // Asset was added between the points in time.
      ADDED = 2;

      // Asset was removed between the points in time.
      REMOVED = 3;

      // Asset was active at both point(s) in time.
      ACTIVE = 4;
    }

    // Asset matching the search request.
    Asset asset = 1;

    // State of the asset.
    State state = 2;
  }

  // Assets matching the list request.
  repeated ListAssetsResult list_assets_results = 1;

  // Time used for executing the list request.
  google.protobuf.Timestamp read_time = 2;

  // Token to retrieve the next page of results, or empty if there are no more
  // results.
  string next_page_token = 3;

  // The total number of assets matching the query.
  int32 total_size = 4;
}

// Request message for listing findings.
message ListFindingsRequest {
  // Name of the source the findings belong to. Its format is
  // "organizations/[organization_id]/sources/[source_id]". To list across all
  // sources provide a source_id of `-`. For example:
  // organizations/123/sources/-
  string parent = 1;

  // Expression that defines the filter to apply across findings.
  // The expression is a list of one or more restrictions combined via logical
  // operators `AND` and `OR`.
  // Parentheses are not supported, and `OR` has higher precedence than `AND`.
  //
  // Restrictions have the form `<field> <operator> <value>` and may have a `-`
  // character in front of them to indicate negation. Examples include:
  //
  //  * name
  //  * source_properties.a_property
  //  * security_marks.marks.marka
  //
  // The supported operators are:
  //
  // * `=` for all value types.
  // * `>`, `<`, `>=`, `<=` for integer values.
  // * `:`, meaning substring matching, for strings.
  //
  // The supported value types are:
  //
  // * string literals in quotes.
  // * integer literals without quotes.
  // * boolean literals `true` and `false` without quotes.
  //
  // For example, `source_properties.size = 100` is a valid filter string.
  string filter = 2;

  // Expression that defines what fields and order to use for sorting. The
  // string value should follow SQL syntax: comma separated list of fields. For
  // example: "name,resource_properties.a_property". The default sorting order
  // is ascending. To specify descending order for a field, a suffix " desc"
  // should be appended to the field name. For example: "name
  // desc,source_properties.a_property". Redundant space characters in the
  // syntax are insignificant. "name desc,source_properties.a_property" and "
  // name     desc  ,   source_properties.a_property  " are equivalent.
  string order_by = 3;

  // Time used as a reference point when filtering findings. The filter is
  // limited to findings existing at the supplied time and their values are
  // those at that specific time. Absence of this field will default to the
  // API's version of NOW.
  google.protobuf.Timestamp read_time = 4;

  // Optional.
  //
  // A field mask to specify the Finding fields to be listed in the response.
  // An empty field mask will list all fields.
  google.protobuf.FieldMask field_mask = 5;

  // The value returned by the last `ListFindingsResponse`; indicates
  // that this is a continuation of a prior `ListFindings` call, and
  // that the system should return the next page of data.
  string page_token = 6;

  // The maximum number of results to return in a single response. Default is
  // 10, minimum is 1, maximum is 1000.
  int32 page_size = 7;
}

// Response message for listing findings.
message ListFindingsResponse {
  // Findings matching the list request.
  repeated Finding findings = 1;

  // Time used for executing the list request.
  google.protobuf.Timestamp read_time = 2;

  // Token to retrieve the next page of results, or empty if there are no more
  // results.
  string next_page_token = 3;

  // The total number of findings matching the query.
  int32 total_size = 4;
}

// Request message for updating a finding's state.
message SetFindingStateRequest {
  // The relative resource name of the finding. See:
  // https://cloud.google.com/apis/design/resource_names#relative_resource_name
  // Example:
  // "organizations/123/sources/456/finding/789".
  string name = 1;

  // The desired State of the finding.
  Finding.State state = 2;

  // The time at which the updated state takes effect.
  google.protobuf.Timestamp start_time = 3;
}

// Request message for running asset discovery for an organization.
message RunAssetDiscoveryRequest {
  // Name of the organization to run asset discovery for. Its format is
  // "organizations/[organization_id]".
  string parent = 1;
}

// Request message for updating or creating a finding.
message UpdateFindingRequest {
  // The finding resource to update or create if it does not already exist.
  // parent, security_marks, and update_time will be ignored.
  //
  // In the case of creation, the finding id portion of the name must
  // alphanumeric and less than or equal to 32 characters and greater than 0
  // characters in length.
  Finding finding = 1;

  // The FieldMask to use when updating the finding resource. This field is
  // ignored if the finding does not already exist and the finding is created.
  google.protobuf.FieldMask update_mask = 2;
}

// Request message for updating an organization's settings.
message UpdateOrganizationSettingsRequest {
  // The organization settings resource to update.
  OrganizationSettings organization_settings = 1;

  // The FieldMask to use when updating the settings resource.
  google.protobuf.FieldMask update_mask = 2;
}

// Request message for updating a source.
message UpdateSourceRequest {
  // The source resource to update.
  Source source = 1;

  // The FieldMask to use when updating the source resource.
  google.protobuf.FieldMask update_mask = 2;
}

// Request message for updating a SecurityMarks resource.
message UpdateSecurityMarksRequest {
  // The security marks resource to update.
  SecurityMarks security_marks = 1;

  // The FieldMask to use when updating the security marks resource.
  google.protobuf.FieldMask update_mask = 2;

  // The time at which the updated SecurityMarks take effect.
  google.protobuf.Timestamp start_time = 3;
}
