From a666efd25fbc8d4d0d7a939881f7a13e86d593e2 Mon Sep 17 00:00:00 2001 From: rene Date: Wed, 6 May 2026 20:23:45 +0200 Subject: [PATCH 1/3] Fix: SMTP Port 465 SSL statt 587 STARTTLS (Port 587 von Synology geblockt) --- backend/routes/outreach.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/backend/routes/outreach.py b/backend/routes/outreach.py index 4fbd03c..9b072dc 100644 --- a/backend/routes/outreach.py +++ b/backend/routes/outreach.py @@ -116,11 +116,16 @@ def _send_smtp(to: str, subject: str, body: str, account: str = "partner", html: msg = _build_message(to, subject, body + _LEGAL_FOOTER, account, html=html) msg_bytes = msg.as_bytes() ctx = ssl.create_default_context() - with smtplib.SMTP(_SMTP_HOST, _SMTP_PORT, timeout=15) as s: - s.ehlo() - s.starttls(context=ctx) - s.login(acc["user"], acc["pass"]) - s.sendmail(acc["from"], [to], msg_bytes) + if _SMTP_PORT == 465: + with smtplib.SMTP_SSL(_SMTP_HOST, _SMTP_PORT, context=ctx, timeout=15) as s: + s.login(acc["user"], acc["pass"]) + s.sendmail(acc["from"], [to], msg_bytes) + else: + with smtplib.SMTP(_SMTP_HOST, _SMTP_PORT, timeout=15) as s: + s.ehlo() + s.starttls(context=ctx) + s.login(acc["user"], acc["pass"]) + s.sendmail(acc["from"], [to], msg_bytes) _imap_save_sent(msg_bytes, account) From 5f2c3476f9c75cd24c6f1d13bed97d8a0f4c4971 Mon Sep 17 00:00:00 2001 From: rene Date: Wed, 6 May 2026 20:27:40 +0200 Subject: [PATCH 2/3] Fix: SMTP Port 25 mit STARTTLS (465/587 von Synology geblockt) --- backend/routes/outreach.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/routes/outreach.py b/backend/routes/outreach.py index 9b072dc..d738998 100644 --- a/backend/routes/outreach.py +++ b/backend/routes/outreach.py @@ -120,10 +120,11 @@ def _send_smtp(to: str, subject: str, body: str, account: str = "partner", html: with smtplib.SMTP_SSL(_SMTP_HOST, _SMTP_PORT, context=ctx, timeout=15) as s: s.login(acc["user"], acc["pass"]) s.sendmail(acc["from"], [to], msg_bytes) - else: + else: # 587 oder 25 mit STARTTLS with smtplib.SMTP(_SMTP_HOST, _SMTP_PORT, timeout=15) as s: s.ehlo() - s.starttls(context=ctx) + if s.has_extn("starttls"): + s.starttls(context=ctx) s.login(acc["user"], acc["pass"]) s.sendmail(acc["from"], [to], msg_bytes) _imap_save_sent(msg_bytes, account) From 7749aa6d2ac1feba2647d2391fbe2a0f5502fd20 Mon Sep 17 00:00:00 2001 From: rene Date: Wed, 6 May 2026 20:34:22 +0200 Subject: [PATCH 3/3] =?UTF-8?q?Fix:=20verified/token=20Hash-Parameter=20se?= =?UTF-8?q?tzt=20by=5Fstay=5Fin=5Fapp=20=E2=80=94=20kein=20/info-Redirect?= =?UTF-8?q?=20nach=20Verifikationslink=20(SW=20by-v746)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.py | 2 +- backend/static/index.html | 2 +- backend/static/js/app.js | 10 +++++++++- backend/static/sw.js | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/backend/main.py b/backend/main.py index c643fbf..936a202 100644 --- a/backend/main.py +++ b/backend/main.py @@ -327,7 +327,7 @@ MEDIA_DIR = os.getenv("MEDIA_DIR", "/data/media") os.makedirs(MEDIA_DIR, exist_ok=True) app.mount("/media", StaticFiles(directory=MEDIA_DIR), name="media") -APP_VER = "745" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "746" # muss mit APP_VER in app.js übereinstimmen @app.get("/api/version") async def app_version(): diff --git a/backend/static/index.html b/backend/static/index.html index 9f61db8..184af40 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -578,7 +578,7 @@ - + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 1037001..5a80762 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '745'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '746'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.5.0'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; @@ -848,6 +848,14 @@ const App = (() => { // INITIALISIERUNG // ---------------------------------------------------------- async function init() { + // Spezielle Hash-Parameter → in App bleiben (kein /info-Redirect) + const _rawHash = location.hash.replace('#', ''); + const _hashQuery = _rawHash.split('?')[1] || ''; + const _hashP = new URLSearchParams(_hashQuery); + if (_hashP.get('verified') || _hashP.get('token') || location.pathname.startsWith('/teilen/')) { + sessionStorage.setItem('by_stay_in_app', '1'); + } + // Referral-Code aus URL ?ref=CODE speichern const urlParams = new URLSearchParams(window.location.search); const refCode = urlParams.get('ref'); diff --git a/backend/static/sw.js b/backend/static/sw.js index e704d22..80e27bc 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v745'; +const CACHE_VERSION = 'by-v746'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache