syntax = "proto3";

package iam_pb;

option go_package = "github.com/seaweedfs/seaweedfs/weed/pb/iam_pb";
option java_package = "seaweedfs.client";
option java_outer_classname = "IamProto";

//////////////////////////////////////////////////

service SeaweedIdentityAccessManagement {
    // Configuration Management
    rpc GetConfiguration (GetConfigurationRequest) returns (GetConfigurationResponse);
    rpc PutConfiguration (PutConfigurationRequest) returns (PutConfigurationResponse);
    
    // User Management
    rpc CreateUser (CreateUserRequest) returns (CreateUserResponse);
    rpc GetUser (GetUserRequest) returns (GetUserResponse);
    rpc UpdateUser (UpdateUserRequest) returns (UpdateUserResponse);
    rpc DeleteUser (DeleteUserRequest) returns (DeleteUserResponse);
    rpc ListUsers (ListUsersRequest) returns (ListUsersResponse);
    
    // Access Key Management
    rpc CreateAccessKey (CreateAccessKeyRequest) returns (CreateAccessKeyResponse);
    rpc DeleteAccessKey (DeleteAccessKeyRequest) returns (DeleteAccessKeyResponse);
    rpc GetUserByAccessKey (GetUserByAccessKeyRequest) returns (GetUserByAccessKeyResponse);
    
    // Policy Management
    rpc PutPolicy (PutPolicyRequest) returns (PutPolicyResponse);
    rpc GetPolicy (GetPolicyRequest) returns (GetPolicyResponse);
    rpc ListPolicies (ListPoliciesRequest) returns (ListPoliciesResponse);
    rpc DeletePolicy (DeletePolicyRequest) returns (DeletePolicyResponse);

    // Service Account Management
    rpc CreateServiceAccount (CreateServiceAccountRequest) returns (CreateServiceAccountResponse);
    rpc UpdateServiceAccount (UpdateServiceAccountRequest) returns (UpdateServiceAccountResponse);
    rpc DeleteServiceAccount (DeleteServiceAccountRequest) returns (DeleteServiceAccountResponse);
    rpc GetServiceAccount (GetServiceAccountRequest) returns (GetServiceAccountResponse);
    rpc ListServiceAccounts (ListServiceAccountsRequest) returns (ListServiceAccountsResponse);
    rpc GetServiceAccountByAccessKey (GetServiceAccountByAccessKeyRequest) returns (GetServiceAccountByAccessKeyResponse);
}

//////////////////////////////////////////////////
// Configuration Management Messages

message GetConfigurationRequest {
}

message GetConfigurationResponse {
    S3ApiConfiguration configuration = 1;
}

message PutConfigurationRequest {
    S3ApiConfiguration configuration = 1;
}

message PutConfigurationResponse {
}

//////////////////////////////////////////////////
// User Management Messages

message CreateUserRequest {
    Identity identity = 1;
}

message CreateUserResponse {
}

message GetUserRequest {
    string username = 1;
}

message GetUserResponse {
    Identity identity = 1;
}

message UpdateUserRequest {
    string username = 1;
    Identity identity = 2;
}

message UpdateUserResponse {
}

message DeleteUserRequest {
    string username = 1;
}

message DeleteUserResponse {
}

message ListUsersRequest {
}

message ListUsersResponse {
    repeated string usernames = 1;
}

//////////////////////////////////////////////////
// Access Key Management Messages

message CreateAccessKeyRequest {
    string username = 1;
    Credential credential = 2;
}

message CreateAccessKeyResponse {
}

message DeleteAccessKeyRequest {
    string username = 1;
    string access_key = 2;
}

message DeleteAccessKeyResponse {
}

message GetUserByAccessKeyRequest {
    string access_key = 1;
}

message GetUserByAccessKeyResponse {
    Identity identity = 1;
}

message ListAccessKeysRequest {
    string username = 1;
}

message ListAccessKeysResponse {
    repeated Credential access_keys = 1;
}

// User Policy Management Messages
message PutUserPolicyRequest {
    string username = 1;
    string policy_name = 2;
    string policy_document = 3;
}

message PutUserPolicyResponse {
}

message GetUserPolicyRequest {
    string username = 1;
    string policy_name = 2;
}

message GetUserPolicyResponse {
    string username = 1;
    string policy_name = 2;
    string policy_document = 3;
}

message DeleteUserPolicyRequest {
    string username = 1;
    string policy_name = 2;
}

message DeleteUserPolicyResponse {
}

//////////////////////////////////////////////////

message S3ApiConfiguration {
    repeated Identity identities = 1;
    repeated Account accounts = 2;
    repeated ServiceAccount service_accounts = 3;
    repeated Policy policies = 4;
    repeated Group groups = 5;
}

message Group {
    string name = 1;
    repeated string members = 2;       // usernames
    repeated string policy_names = 3;  // attached managed policy names
    bool disabled = 4;
}

message Identity {
    string name = 1;
    repeated Credential credentials = 2;
    repeated string actions = 3;
    Account account = 4;
    bool disabled = 5;  // User status: false = enabled (default), true = disabled
    repeated string service_account_ids = 6;  // IDs of service accounts owned by this user
    repeated string policy_names = 7;
    bool is_static = 8;  // Loaded from static config file (read-only, not editable via API)
    repeated UserTag tags = 9;
}

message UserTag {
    string key = 1;
    string value = 2;
}

message Credential {
    string access_key = 1;
    string secret_key = 2;
    string status = 3;  // Access key status: "Active" or "Inactive"
}

message Account {
    string id = 1;
    string display_name = 2;
    string email_address = 3;
}

// ServiceAccount represents a service account - special credentials for applications.
// Service accounts are linked to a parent user and can have restricted permissions.
message ServiceAccount {
    string id = 1;                     // Unique identifier (e.g., "sa-xxxxx")
    string parent_user = 2;            // Parent identity name
    string description = 3;            // Optional description
    Credential credential = 4;         // Access key/secret for this service account
    repeated string actions = 5;       // Allowed actions (subset of parent)
    int64 expiration = 6;              // Unix timestamp, 0 = no expiration
    bool disabled = 7;                 // Status: false = enabled (default)
    int64 created_at = 8;              // Creation timestamp
    string created_by = 9;             // Who created this service account
}

message PutPolicyRequest {
    string name = 1;
    string content = 2;
}

message PutPolicyResponse {
}

message GetPolicyRequest {
    string name = 1;
}

message GetPolicyResponse {
    string name = 1;
    string content = 2;
}

message ListPoliciesRequest {
}

message ListPoliciesResponse {
    repeated Policy policies = 1;
}

message DeletePolicyRequest {
    string name = 1;
}

message DeletePolicyResponse {
}

message Policy {
    string name = 1;
    string content = 2; // JSON content of the policy
}

//////////////////////////////////////////////////
// Service Account Messages

message CreateServiceAccountRequest {
    ServiceAccount service_account = 1;
}

message CreateServiceAccountResponse {
}

message UpdateServiceAccountRequest {
    string id = 1;
    ServiceAccount service_account = 2;
}

message UpdateServiceAccountResponse {
}

message DeleteServiceAccountRequest {
    string id = 1;
}

message DeleteServiceAccountResponse {
}

message GetServiceAccountRequest {
    string id = 1;
}

message GetServiceAccountResponse {
    ServiceAccount service_account = 1;
}

message ListServiceAccountsRequest {
}

message ListServiceAccountsResponse {
    repeated ServiceAccount service_accounts = 1;
}

message GetServiceAccountByAccessKeyRequest {
    string access_key = 1;
}

message GetServiceAccountByAccessKeyResponse {
    ServiceAccount service_account = 1;
}


//////////////////////////////////////////////////
// S3 IAM Cache Management
// Designed for unidirectional propagation from Filer to S3 Servers


message PutIdentityRequest {
    Identity identity = 1;
}

message PutIdentityResponse {
}

message RemoveIdentityRequest {
    string username = 1;
}

message RemoveIdentityResponse {
}

message PutGroupRequest {
    Group group = 1;
}

message PutGroupResponse {
}

message RemoveGroupRequest {
    string group_name = 1;
}

message RemoveGroupResponse {
}
