Spaces:
Running
Running
AuthorBot Cursor commited on
Commit Β·
186c5c0
1
Parent(s): ca62fc7
fix: accept legacy HF secret names for Gmail and subscription tokens
Browse files
backend/app/config.py
CHANGED
|
@@ -8,7 +8,7 @@ Import `get_settings()` wherever configuration is needed.
|
|
| 8 |
from functools import lru_cache
|
| 9 |
from typing import Literal
|
| 10 |
|
| 11 |
-
from pydantic import EmailStr, Field, field_validator
|
| 12 |
from pydantic_settings import BaseSettings, SettingsConfigDict
|
| 13 |
|
| 14 |
|
|
@@ -88,10 +88,19 @@ class Settings(BaseSettings):
|
|
| 88 |
SMTP_HOST: str = "smtp.gmail.com"
|
| 89 |
SMTP_PORT: int = 465
|
| 90 |
SMTP_USE_SSL: bool = True
|
| 91 |
-
SMTP_USERNAME: EmailStr | None =
|
| 92 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
EMAIL_FROM_NAME: str = "AuthorBot"
|
| 94 |
-
EMAIL_FROM_ADDRESS: EmailStr | None =
|
|
|
|
|
|
|
|
|
|
| 95 |
|
| 96 |
# βββ Rate Limiting ββββββββββββββββββββββββββββββββββββ
|
| 97 |
RATE_LIMIT_CHAT_PER_MINUTE: int = 60
|
|
@@ -110,6 +119,13 @@ class Settings(BaseSettings):
|
|
| 110 |
# βββ SuperAdmin βββββββββββββββββββββββββββββββββββββββ
|
| 111 |
SUPERADMIN_2FA_ISSUER: str = "AuthorBot SuperAdmin"
|
| 112 |
SUBSCRIPTION_TOKEN_ALGORITHM: str = "HS256"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
|
| 114 |
# βββ Token Budgets (defaults, overridden per plan) ββββ
|
| 115 |
PLAN_MONTHLY_TOKENS: int = 500_000
|
|
@@ -135,6 +151,13 @@ class Settings(BaseSettings):
|
|
| 135 |
raise ValueError("SECRET_KEY must be at least 32 characters long")
|
| 136 |
return v
|
| 137 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 138 |
|
| 139 |
@lru_cache
|
| 140 |
def get_settings() -> Settings:
|
|
|
|
| 8 |
from functools import lru_cache
|
| 9 |
from typing import Literal
|
| 10 |
|
| 11 |
+
from pydantic import AliasChoices, EmailStr, Field, field_validator, model_validator
|
| 12 |
from pydantic_settings import BaseSettings, SettingsConfigDict
|
| 13 |
|
| 14 |
|
|
|
|
| 88 |
SMTP_HOST: str = "smtp.gmail.com"
|
| 89 |
SMTP_PORT: int = 465
|
| 90 |
SMTP_USE_SSL: bool = True
|
| 91 |
+
SMTP_USERNAME: EmailStr | None = Field(
|
| 92 |
+
default=None,
|
| 93 |
+
validation_alias=AliasChoices("SMTP_USERNAME", "GMAIL_USER"),
|
| 94 |
+
)
|
| 95 |
+
SMTP_PASSWORD: str | None = Field(
|
| 96 |
+
default=None,
|
| 97 |
+
validation_alias=AliasChoices("SMTP_PASSWORD", "GMAIL_APP_PASSWORD"),
|
| 98 |
+
)
|
| 99 |
EMAIL_FROM_NAME: str = "AuthorBot"
|
| 100 |
+
EMAIL_FROM_ADDRESS: EmailStr | None = Field(
|
| 101 |
+
default=None,
|
| 102 |
+
validation_alias=AliasChoices("EMAIL_FROM_ADDRESS", "GMAIL_USER"),
|
| 103 |
+
)
|
| 104 |
|
| 105 |
# βββ Rate Limiting ββββββββββββββββββββββββββββββββββββ
|
| 106 |
RATE_LIMIT_CHAT_PER_MINUTE: int = 60
|
|
|
|
| 119 |
# βββ SuperAdmin βββββββββββββββββββββββββββββββββββββββ
|
| 120 |
SUPERADMIN_2FA_ISSUER: str = "AuthorBot SuperAdmin"
|
| 121 |
SUBSCRIPTION_TOKEN_ALGORITHM: str = "HS256"
|
| 122 |
+
# Legacy HF secret name β subscription HMAC uses SECRET_KEY unless this is set.
|
| 123 |
+
SUBSCRIPTION_SECRET: str | None = Field(
|
| 124 |
+
default=None,
|
| 125 |
+
validation_alias=AliasChoices("SUBSCRIPTION_SECRET", "SUBSCRIPTION_TOKEN_SECRET"),
|
| 126 |
+
)
|
| 127 |
+
# Legacy HF secret name β TOTP secrets are stored per SuperAdmin in the DB.
|
| 128 |
+
SUPERADMIN_TOTP_SECRET: str | None = Field(default=None, exclude=True)
|
| 129 |
|
| 130 |
# βββ Token Budgets (defaults, overridden per plan) ββββ
|
| 131 |
PLAN_MONTHLY_TOKENS: int = 500_000
|
|
|
|
| 151 |
raise ValueError("SECRET_KEY must be at least 32 characters long")
|
| 152 |
return v
|
| 153 |
|
| 154 |
+
@model_validator(mode="after")
|
| 155 |
+
def apply_hf_secret_defaults(self) -> "Settings":
|
| 156 |
+
"""Fill derived settings from legacy Hugging Face secret names."""
|
| 157 |
+
if self.EMAIL_FROM_ADDRESS is None and self.SMTP_USERNAME is not None:
|
| 158 |
+
self.EMAIL_FROM_ADDRESS = self.SMTP_USERNAME
|
| 159 |
+
return self
|
| 160 |
+
|
| 161 |
|
| 162 |
@lru_cache
|
| 163 |
def get_settings() -> Settings:
|
backend/app/core/access/token_crypto.py
CHANGED
|
@@ -213,7 +213,7 @@ def _compute_hmac(payload_b64: bytes) -> bytes:
|
|
| 213 |
URL-safe Base64 encoded signature bytes.
|
| 214 |
"""
|
| 215 |
signature = hmac.new(
|
| 216 |
-
cfg.SECRET_KEY.encode(),
|
| 217 |
payload_b64,
|
| 218 |
hashlib.sha256,
|
| 219 |
).digest()
|
|
|
|
| 213 |
URL-safe Base64 encoded signature bytes.
|
| 214 |
"""
|
| 215 |
signature = hmac.new(
|
| 216 |
+
(cfg.SUBSCRIPTION_SECRET or cfg.SECRET_KEY).encode(),
|
| 217 |
payload_b64,
|
| 218 |
hashlib.sha256,
|
| 219 |
).digest()
|