- Change file mode from 644 to 755 for all project files - Add chain_id parameter to get_balance RPC endpoint with default "ait-devnet" - Rename Miner.extra_meta_data to extra_metadata for consistency
71 lines
2.6 KiB
Python
Executable File
71 lines
2.6 KiB
Python
Executable File
"""Authentication and credential management for AITBC CLI"""
|
|
|
|
import keyring
|
|
import os
|
|
from typing import Optional, Dict
|
|
from ..utils import success, error, warning
|
|
|
|
|
|
class AuthManager:
|
|
"""Manages authentication credentials using secure keyring storage"""
|
|
|
|
SERVICE_NAME = "aitbc-cli"
|
|
|
|
def __init__(self):
|
|
self.keyring = keyring.get_keyring()
|
|
|
|
def store_credential(self, name: str, api_key: str, environment: str = "default"):
|
|
"""Store an API key securely"""
|
|
try:
|
|
key = f"{environment}_{name}"
|
|
self.keyring.set_password(self.SERVICE_NAME, key, api_key)
|
|
success(f"Credential '{name}' stored for environment '{environment}'")
|
|
except Exception as e:
|
|
error(f"Failed to store credential: {e}")
|
|
|
|
def get_credential(self, name: str, environment: str = "default") -> Optional[str]:
|
|
"""Retrieve an API key"""
|
|
try:
|
|
key = f"{environment}_{name}"
|
|
return self.keyring.get_password(self.SERVICE_NAME, key)
|
|
except Exception as e:
|
|
warning(f"Failed to retrieve credential: {e}")
|
|
return None
|
|
|
|
def delete_credential(self, name: str, environment: str = "default"):
|
|
"""Delete an API key"""
|
|
try:
|
|
key = f"{environment}_{name}"
|
|
self.keyring.delete_password(self.SERVICE_NAME, key)
|
|
success(f"Credential '{name}' deleted for environment '{environment}'")
|
|
except Exception as e:
|
|
error(f"Failed to delete credential: {e}")
|
|
|
|
def list_credentials(self, environment: str = None) -> Dict[str, str]:
|
|
"""List all stored credentials (without showing the actual keys)"""
|
|
# Note: keyring doesn't provide a direct way to list all keys
|
|
# This is a simplified version that checks for common credential names
|
|
credentials = []
|
|
envs = [environment] if environment else ["default", "dev", "staging", "prod"]
|
|
names = ["client", "miner", "admin"]
|
|
|
|
for env in envs:
|
|
for name in names:
|
|
key = f"{env}_{name}"
|
|
if self.get_credential(name, env):
|
|
credentials.append(f"{name}@{env}")
|
|
|
|
return credentials
|
|
|
|
def store_env_credential(self, name: str):
|
|
"""Store credential from environment variable"""
|
|
env_var = f"{name.upper()}_API_KEY"
|
|
api_key = os.getenv(env_var)
|
|
|
|
if not api_key:
|
|
error(f"Environment variable {env_var} not set")
|
|
return False
|
|
|
|
self.store_credential(name, api_key)
|
|
return True
|