feat(config): 在加密导出/导入中包含个人访问令牌
This commit is contained in:
@@ -423,10 +423,6 @@ impl GpgConfig {
|
||||
/// Token configuration for services (GitHub, GitLab, etc.)
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct TokenConfig {
|
||||
/// Token value (encrypted)
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub token: Option<String>,
|
||||
|
||||
/// Token type (personal, oauth, etc.)
|
||||
#[serde(default)]
|
||||
pub token_type: TokenType,
|
||||
@@ -446,25 +442,41 @@ pub struct TokenConfig {
|
||||
/// Description
|
||||
#[serde(default)]
|
||||
pub description: Option<String>,
|
||||
|
||||
/// Indicates if a token is stored in keyring
|
||||
#[serde(default)]
|
||||
pub has_token: bool,
|
||||
}
|
||||
|
||||
impl TokenConfig {
|
||||
/// Create a new token config
|
||||
pub fn new(token: String, token_type: TokenType) -> Self {
|
||||
/// Create a new token config (token stored separately in keyring)
|
||||
pub fn new(token_type: TokenType) -> Self {
|
||||
Self {
|
||||
token: Some(token),
|
||||
token_type,
|
||||
scopes: vec![],
|
||||
expires_at: None,
|
||||
last_used: None,
|
||||
description: None,
|
||||
has_token: true,
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new token config without token
|
||||
pub fn without_token(token_type: TokenType) -> Self {
|
||||
Self {
|
||||
token_type,
|
||||
scopes: vec![],
|
||||
expires_at: None,
|
||||
last_used: None,
|
||||
description: None,
|
||||
has_token: false,
|
||||
}
|
||||
}
|
||||
|
||||
/// Validate token configuration
|
||||
pub fn validate(&self) -> Result<()> {
|
||||
if self.token.is_none() && self.token_type != TokenType::None {
|
||||
bail!("Token value is required for {:?}", self.token_type);
|
||||
if !self.has_token && self.token_type != TokenType::None {
|
||||
bail!("Token is required for {:?}", self.token_type);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -473,6 +485,11 @@ impl TokenConfig {
|
||||
pub fn record_usage(&mut self) {
|
||||
self.last_used = Some(chrono::Utc::now().to_rfc3339());
|
||||
}
|
||||
|
||||
/// Mark that a token is stored
|
||||
pub fn set_has_token(&mut self, has_token: bool) {
|
||||
self.has_token = has_token;
|
||||
}
|
||||
}
|
||||
|
||||
/// Token type
|
||||
@@ -675,7 +692,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_token_config() {
|
||||
let token = TokenConfig::new("test-token".to_string(), TokenType::Personal);
|
||||
let token = TokenConfig::new(TokenType::Personal);
|
||||
assert!(token.validate().is_ok());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user