diff --git a/app.py b/app.py index ac390317..a69e9a7e 100644 --- a/app.py +++ b/app.py @@ -564,7 +564,6 @@ from modules.auth import ( # without having to thread them through every call site. from modules.shared.i18nRegistry import setLanguage, normalizePrimaryLanguageTag from modules.shared.timeUtils import setRequestTimezone -from modules.shared.requestFrontendUrl import resolveFrontendUrlFromRequest, setRequestFrontendUrl @app.middleware("http") async def _requestContextMiddleware(request: Request, call_next): @@ -572,7 +571,6 @@ async def _requestContextMiddleware(request: Request, call_next): lang = normalizePrimaryLanguageTag(acceptLang, "de") setLanguage(lang) setRequestTimezone(request.headers.get("X-User-Timezone", "")) - setRequestFrontendUrl(resolveFrontendUrlFromRequest(request)) return await call_next(request) app.add_middleware(CSRFMiddleware) diff --git a/env-dev.env b/env-dev.env index d8a1e9d5..467f70b4 100644 --- a/env-dev.env +++ b/env-dev.env @@ -4,12 +4,7 @@ APP_ENV_TYPE = dev APP_ENV_LABEL = Development Instance Patrick APP_API_URL = http://localhost:8000 -<<<<<<< Updated upstream APP_KEY_SYSVAR = D:/Athi/Local/Web/poweron-swiss/local/notes/key.txt -======= -APP_FRONTEND_URL = http://localhost:5176 -APP_KEY_SYSVAR = D:/Athi/Local/Web/poweron/local/notes/key.txt ->>>>>>> Stashed changes APP_INIT_PASS_ADMIN_SECRET = DEV_ENC:Z0FBQUFBQm8xSUpEeFFtRGtQeVUtcjlrU3dab1ZxUm9WSks0MlJVYUtERFlqUElHemZrOGNENk1tcmJNX3Vxc01UMDhlNU40VzZZRVBpUGNmT3podzZrOGhOeEJIUEt4eVlSWG5UYXA3d09DVXlLT21Kb1JYSUU9 APP_INIT_PASS_EVENT_SECRET = DEV_ENC:Z0FBQUFBQm8xSUpERzZjNm56WGVBdjJTeG5Udjd6OGQwUVotYXUzQjJ1YVNyVXVBa3NZVml3ODU0MVNkZjhWWmJwNUFkc19BcHlHMTU1Q3BRcHU0cDBoZkFlR2l6UEZQU3d2U3MtMDh5UDZteGFoQ0EyMUE1ckE9 diff --git a/env-int.env b/env-int.env index 1ce618f9..72099314 100644 --- a/env-int.env +++ b/env-int.env @@ -4,7 +4,6 @@ APP_ENV_TYPE = int APP_ENV_LABEL = Integration Instance APP_API_URL = https://api-int.poweron.swiss -APP_FRONTEND_URL = https://nyla-int.poweron.swiss # Force SameSite=None+Secure for auth cookies (cross-site UI on poweron-center.net). Optional if APP_API_URL is https:// APP_COOKIE_SECURE = true APP_KEY_SYSVAR = /srv/gateway/shared/secrets/master_key.txt diff --git a/env-prod.env b/env-prod.env index 6f97cee8..d268450c 100644 --- a/env-prod.env +++ b/env-prod.env @@ -7,7 +7,6 @@ APP_KEY_SYSVAR = /srv/gateway/shared/secrets/master_key.txt APP_INIT_PASS_ADMIN_SECRET = PROD_ENC:Z0FBQUFBQnBDM1Z3UnJRV0sySFlDblpXUlREclREaW1WbUt6bGtQYkdrNkZDOXNOLXFua1hqeFF2RHJnRXJ5VlVGV3hOZm41QjZOMlNTb0duYXNxZi05dXVTc2xDVkx0SVBFLUhncVo5T0VUZHE0UTZLWWw3ck09 APP_INIT_PASS_EVENT_SECRET = PROD_ENC:Z0FBQUFBQnBDM1Z3QVpIY19DQVZSSzJmc2F0VEZvQlU1cHBhTEgxdHdnR3g4eW01aTEzYTUxc1gxTDR1RVVpSHRXYjV6N1BLZUdCUGlfOW1qdy0xSHFVRkNBcGZvaGlSSkZycXRuUllaWnpyVGRoeFg1dGEyNUk9 APP_API_URL = https://api.poweron.swiss -APP_FRONTEND_URL = https://nyla.poweron.swiss # PostgreSQL DB Host (porta-main-db on Infomaniak Public Cloud) DB_HOST=db.poweron.swiss diff --git a/modules/serviceCenter/services/serviceBilling/billingExhaustedNotify.py b/modules/serviceCenter/services/serviceBilling/billingExhaustedNotify.py index b5ab9e53..9e891c6c 100644 --- a/modules/serviceCenter/services/serviceBilling/billingExhaustedNotify.py +++ b/modules/serviceCenter/services/serviceBilling/billingExhaustedNotify.py @@ -39,7 +39,7 @@ def maybeEmailMandatePoolExhausted( currentBalance: Pool balance (CHF). requiredAmount: Minimum required (CHF). cooldownSec: Minimum seconds between emails for this mandate. - frontendUrl: Optional frontend base URL for /billing/admin link (defaults to request Origin). + frontendUrl: Optional frontend base URL for /billing/admin link (omit to send email without CTA). """ if not mandateId: return diff --git a/modules/shared/notifyMandateAdmins.py b/modules/shared/notifyMandateAdmins.py index 081ebdda..25acd9a7 100644 --- a/modules/shared/notifyMandateAdmins.py +++ b/modules/shared/notifyMandateAdmins.py @@ -166,19 +166,6 @@ def buildBillingAdminActionBlock( return buildActionLinkHtmlBlock(admin_url, buttonText) -def _resolveBillingAdminFrontendUrl(frontendUrl: Optional[str]) -> str: - """Explicit frontendUrl param, else per-request value from middleware.""" - explicit = (frontendUrl or "").strip().rstrip("/") - if explicit: - return explicit - try: - from modules.shared.requestFrontendUrl import getRequestFrontendUrl - - return getRequestFrontendUrl() - except Exception: - return "" - - def _getOperatorInfo() -> Dict[str, str]: """Load operator company data from config.ini.""" try: @@ -303,7 +290,7 @@ def notifyMandateAdmins( rawHtmlBlock: Optional pre-formatted HTML block (e.g. invoice summary table). includeBillingAdminLink: When True, append button + link to {frontendUrl}/billing/admin. billingAdminButtonText: Label for the billing admin CTA button. - frontendUrl: Frontend base URL (like auth emails); defaults to per-request Origin / X-Frontend-Url. + frontendUrl: Frontend base URL for the billing admin link (required when includeBillingAdminLink is True). Returns: Number of recipients that were successfully notified. @@ -323,11 +310,11 @@ def notifyMandateAdmins( mandateName = resolveMandateName(mandateId) actionHtmlBlock = None if includeBillingAdminLink: - resolved_frontend = _resolveBillingAdminFrontendUrl(frontendUrl) + resolved_frontend = (frontendUrl or "").strip().rstrip("/") actionHtmlBlock = buildBillingAdminActionBlock(resolved_frontend, billingAdminButtonText) or None if not actionHtmlBlock: logger.warning( - "notifyMandateAdmins: billing admin link omitted (no frontendUrl on request)" + "notifyMandateAdmins: billing admin link omitted (no frontendUrl provided)" ) htmlMessage = renderHtmlEmail( headline, bodyParagraphs, mandateName, footerNote, rawHtmlBlock, actionHtmlBlock,