package model import ( "time" ) // Credential 凭据管理模型 — 统一管理 SSH/Docker/Token/AKSK/数据库/API 等敏感信息 // 设计参考:opsx-web Secret 模型,按类型动态切换字段 // 核心加密字段 content 存储类型特有数据(JSON),API 不返回 // // 类型与内容 JSON 映射: // ssh → {"private_key":"...","public_key":"...","ssh_user":"...","ssh_port":22} // docker → {"server":"...","username":"...","password":"..."} // tls → {"cert":"...","key":"...","ca":"..."} // aksk → {"provider":"...","access_key":"...","secret_key":"...","region":"..."} // database → {"db_type":"...","host":"...","port":3306,"db_name":"...","username":"...","password":"..."} // api → {"key":"...","endpoint":"..."} // generic → {"key":"...","value":"..."} type Credential struct { ID uint `gorm:"primarykey" json:"id"` Name string `gorm:"size:128;not null" json:"name"` // 凭据名称 VariableName string `gorm:"size:64;index" json:"variable_name,omitempty"` // 环境变量别名 e.g. MYSQL_PROD SecretType string `gorm:"size:32;not null;index" json:"secret_type"` // ssh/docker/tls/aksk/database/api/generic Summary string `gorm:"size:255" json:"summary,omitempty"` // 关键信息摘要(脱敏展示) Content string `gorm:"type:text;not null" json:"-"` // AES 加密后的 JSON,API 不返回 Tags string `gorm:"type:text" json:"tags,omitempty"` // JSON 数组: ["生产环境","阿里云"] Description string `gorm:"size:500" json:"description,omitempty"` ExpiresAt *time.Time `json:"expires_at,omitempty"` // 过期时间 IsActive bool `gorm:"default:true" json:"is_active"` // 启用/禁用 EnvPrefix string `gorm:"size:32" json:"env_prefix,omitempty"` // 引用 ID(可复制) CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } func (Credential) TableName() string { return "iam_credentials" } // ────── 类型定义 ────── // SecretType SSH 凭据 content type SSHSecretContent struct { PrivateKey string `json:"private_key"` PublicKey string `json:"public_key"` SSHUser string `json:"ssh_user"` SSHPort int `json:"ssh_port"` Password string `json:"password,omitempty"` } // DockerSecretContent Docker 凭据 content type DockerSecretContent struct { Server string `json:"server"` Username string `json:"username"` Password string `json:"password"` } // TLSSecretContent TLS 证书凭据 content type TLSSecretContent struct { Cert string `json:"cert"` Key string `json:"key"` CA string `json:"ca"` } // AKSKSecretContent AKSK 凭据 content type AKSKSecretContent struct { Provider string `json:"provider"` AccessKey string `json:"access_key"` SecretKey string `json:"secret_key"` Region string `json:"region,omitempty"` } // DatabaseSecretContent 数据库凭据 content type DatabaseSecretContent struct { DBType string `json:"db_type"` Host string `json:"host"` Port int `json:"port"` DBName string `json:"db_name"` Username string `json:"username"` Password string `json:"password"` } // APISecretContent API 密钥凭据 content type APISecretContent struct { Key string `json:"api_key"` Endpoint string `json:"endpoint,omitempty"` } // GenericSecretContent 通用凭据 content type GenericSecretContent struct { Key string `json:"generic_key"` Value string `json:"generic_value"` } // ────── 请求/响应 ────── // CreateSecretRequest 创建凭据请求 type CreateSecretRequest struct { Name string `json:"name" binding:"required"` VariableName string `json:"variable_name"` SecretType string `json:"secret_type" binding:"required,oneof=ssh docker tls aksk database api generic"` Tags []string `json:"tags"` Description string `json:"description"` ExpiresAt *time.Time `json:"expires_at"` IsActive *bool `json:"is_active"` // 类型特有字段(明文,后端组装成 JSON 加密存储) // SSH SSHPrivateKey string `json:"ssh_private_key,omitempty"` SSHPublicKey string `json:"ssh_public_key,omitempty"` SSHUser string `json:"ssh_user,omitempty"` SSHPort int `json:"ssh_port,omitempty"` SSHPassword string `json:"ssh_password,omitempty"` // Docker DockerServer string `json:"docker_server,omitempty"` DockerUsername string `json:"docker_username,omitempty"` DockerPassword string `json:"docker_password,omitempty"` // TLS TLSCert string `json:"tls_cert,omitempty"` TLSKey string `json:"tls_key,omitempty"` TLSCA string `json:"tls_ca,omitempty"` // AKSK AKSKProvider string `json:"aksk_provider,omitempty"` AKSKAccessKey string `json:"aksk_access_key,omitempty"` AKSKSecretKey string `json:"aksk_secret_key,omitempty"` AKSKRegion string `json:"aksk_region,omitempty"` // Database DBType string `json:"db_type,omitempty"` DBHost string `json:"db_host,omitempty"` DBPort int `json:"db_port,omitempty"` DBName string `json:"db_name,omitempty"` DBUsername string `json:"db_username,omitempty"` DBPassword string `json:"db_password,omitempty"` // API APIKey string `json:"api_key,omitempty"` APIEndpoint string `json:"api_endpoint,omitempty"` // Generic GenericKey string `json:"generic_key,omitempty"` GenericValue string `json:"generic_value,omitempty"` } // UpdateSecretRequest 更新凭据请求 type UpdateSecretRequest struct { Name *string `json:"name"` VariableName *string `json:"variable_name"` Tags []string `json:"tags"` Description *string `json:"description"` ExpiresAt *time.Time `json:"expires_at"` IsActive *bool `json:"is_active"` // 类型特有字段 — 传了才更新 SSHPrivateKey *string `json:"ssh_private_key,omitempty"` SSHPublicKey *string `json:"ssh_public_key,omitempty"` SSHUser *string `json:"ssh_user,omitempty"` SSHPort *int `json:"ssh_port,omitempty"` SSHPassword *string `json:"ssh_password,omitempty"` DockerServer *string `json:"docker_server,omitempty"` DockerUsername *string `json:"docker_username,omitempty"` DockerPassword *string `json:"docker_password,omitempty"` TLSCert *string `json:"tls_cert,omitempty"` TLSKey *string `json:"tls_key,omitempty"` TLSCA *string `json:"tls_ca,omitempty"` AKSKProvider *string `json:"aksk_provider,omitempty"` AKSKAccessKey *string `json:"aksk_access_key,omitempty"` AKSKSecretKey *string `json:"aksk_secret_key,omitempty"` AKSKRegion *string `json:"aksk_region,omitempty"` DBType *string `json:"db_type,omitempty"` DBHost *string `json:"db_host,omitempty"` DBPort *int `json:"db_port,omitempty"` DBName *string `json:"db_name,omitempty"` DBUsername *string `json:"db_username,omitempty"` DBPassword *string `json:"db_password,omitempty"` APIKey *string `json:"api_key,omitempty"` APIEndpoint *string `json:"api_endpoint,omitempty"` GenericKey *string `json:"generic_key,omitempty"` GenericValue *string `json:"generic_value,omitempty"` } // SecretListResponse 列表返回(内容脱敏) type SecretListResponse struct { ID uint `json:"id"` Name string `json:"name"` VariableName string `json:"variable_name,omitempty"` SecretType string `json:"secret_type"` Summary string `json:"summary,omitempty"` Tags []string `json:"tags,omitempty"` Description string `json:"description,omitempty"` ExpiresAt *time.Time `json:"expires_at,omitempty"` IsActive bool `json:"is_active"` EnvPrefix string `json:"env_prefix,omitempty"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // SecretListQuery 列表查询参数 type SecretListQuery struct { Page int `form:"page"` PageSize int `form:"page_size"` SecretType string `form:"secret_type"` Tags string `form:"tags"` // 逗号分隔 Search string `form:"search"` }