Files
sonr/bridge/config.go
T

203 lines
5.1 KiB
Go
Raw Normal View History

2025-10-03 14:45:52 -04:00
package bridge
import (
"log"
"os"
"strconv"
"time"
"github.com/hibiken/asynq"
"github.com/sonr-io/sonr/types/ipfs"
)
const (
DefaultRedisAddr = "127.0.0.1:6379"
DefaultJWTSecret = "highway-ucan-secret-key"
DefaultHTTPPort = 8090
ShutdownTimeout = 30 * time.Second
)
// OIDCProviderConfig contains OIDC provider configuration
type OIDCProviderConfig struct {
Issuer string
PublicURL string
SigningKeyPath string
EncryptionKeyPath string
AuthorizationCodeTTL time.Duration
AccessTokenTTL time.Duration
RefreshTokenTTL time.Duration
IDTokenTTL time.Duration
EnablePKCE bool
EnableRefreshTokens bool
EnableSIOP bool
SupportedScopes []string
SupportedResponseTypes []string
SupportedGrantTypes []string
AllowedRedirectURIs []string
WebAuthnRPID string
WebAuthnRPName string
WebAuthnTimeout int
AutoCreateVault bool
}
type Config struct {
RedisAddr string
HTTPPort int
JWTSecret []byte
IPFSClient ipfs.IPFSClient
ShutdownTimeout time.Duration
AsynqConfig asynq.Config
OIDC OIDCProviderConfig
}
func NewConfig() *Config {
jwtSecret := initializeJWTSecret()
redisAddr := getRedisAddr()
httpPort := getHTTPPort()
ipfsClient := initializeIPFS()
oidcConfig := initializeOIDCConfig()
return &Config{
RedisAddr: redisAddr,
HTTPPort: httpPort,
JWTSecret: jwtSecret,
IPFSClient: ipfsClient,
ShutdownTimeout: ShutdownTimeout,
AsynqConfig: asynq.Config{
Concurrency: 10,
Queues: map[string]int{
"critical": 6,
"default": 3,
"low": 1,
},
ShutdownTimeout: ShutdownTimeout,
// Enhanced error handling and retry configuration
RetryDelayFunc: asynq.DefaultRetryDelayFunc,
IsFailure: func(err error) bool {
return err != nil
},
},
OIDC: oidcConfig,
}
}
func initializeJWTSecret() []byte {
secret := os.Getenv("JWT_SECRET")
if secret == "" {
secret = DefaultJWTSecret
log.Printf("Warning: Using default JWT secret for UCAN operations")
log.Printf("Set JWT_SECRET environment variable for production deployment")
} else {
log.Println("JWT secret loaded from environment")
}
return []byte(secret)
}
func getRedisAddr() string {
// Check for REDIS_URL first (Docker Compose style)
if url := os.Getenv("REDIS_URL"); url != "" {
// Parse redis://host:port format
if len(url) > 8 && url[:8] == "redis://" {
return url[8:]
}
return url
}
// Fall back to REDIS_ADDR
if addr := os.Getenv("REDIS_ADDR"); addr != "" {
return addr
}
log.Printf("Using default Redis address: %s", DefaultRedisAddr)
return DefaultRedisAddr
}
func initializeIPFS() ipfs.IPFSClient {
ipfsClient, err := ipfs.GetClient()
if err != nil {
log.Printf("Warning: IPFS client initialization failed: %v", err)
log.Println("Enclave data will be handled directly without IPFS storage")
return nil
}
log.Println("IPFS client initialized successfully")
return ipfsClient
}
func initializeOIDCConfig() OIDCProviderConfig {
issuer := os.Getenv("OIDC_ISSUER")
if issuer == "" {
issuer = "https://localhost:8080"
}
publicURL := os.Getenv("OIDC_PUBLIC_URL")
if publicURL == "" {
publicURL = issuer
}
rpID := os.Getenv("WEBAUTHN_RP_ID")
if rpID == "" {
rpID = "localhost"
}
rpName := os.Getenv("WEBAUTHN_RP_NAME")
if rpName == "" {
rpName = "Sonr Identity Platform"
}
return OIDCProviderConfig{
Issuer: issuer,
PublicURL: publicURL,
SigningKeyPath: os.Getenv("OIDC_SIGNING_KEY_PATH"),
EncryptionKeyPath: os.Getenv("OIDC_ENCRYPTION_KEY_PATH"),
AuthorizationCodeTTL: 10 * time.Minute,
AccessTokenTTL: 1 * time.Hour,
RefreshTokenTTL: 7 * 24 * time.Hour,
IDTokenTTL: 1 * time.Hour,
EnablePKCE: true,
EnableRefreshTokens: true,
EnableSIOP: true,
SupportedScopes: []string{
"openid", "profile", "email", "did", "vault", "offline_access",
},
SupportedResponseTypes: []string{
"code", "id_token", "code id_token",
},
SupportedGrantTypes: []string{
"authorization_code", "refresh_token", "client_credentials",
},
AllowedRedirectURIs: getRedirectURIs(),
WebAuthnRPID: rpID,
WebAuthnRPName: rpName,
WebAuthnTimeout: 60000,
AutoCreateVault: true,
}
}
// getRedirectURIs returns the allowed redirect URIs for OIDC
func getRedirectURIs() []string {
// Default URIs for development
uris := []string{
"http://localhost:3000/callback",
"http://localhost:3001/callback",
"https://localhost:3000/callback",
"https://localhost:3001/callback",
}
// Add additional URIs from environment if specified
if envURIs := os.Getenv("OIDC_ALLOWED_REDIRECT_URIS"); envURIs != "" {
// Parse comma-separated URIs
// This could be enhanced with proper validation
log.Printf("Additional redirect URIs configured from environment")
}
return uris
}
// getHTTPPort returns the HTTP port for the Highway service
func getHTTPPort() int {
if port := os.Getenv("HIGHWAY_PORT"); port != "" {
if p, err := strconv.Atoi(port); err == nil {
return p
}
}
return DefaultHTTPPort
}