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 = None
92
- SMTP_PASSWORD: str | None = None # Gmail App Password (not account pw)
 
 
 
 
 
 
93
  EMAIL_FROM_NAME: str = "AuthorBot"
94
- EMAIL_FROM_ADDRESS: EmailStr | None = 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()