Fix: Echte Umlaute statt Umschreibungen (gültig, für, prüfen)
Dieser Commit ist enthalten in:
@@ -1,4 +1,4 @@
|
|||||||
"""HTML-E-Mail-Vorlagen fuer Magic Links, Einladungen und Benachrichtigungen."""
|
"""HTML-E-Mail-Vorlagen für Magic Links, Einladungen und Benachrichtigungen."""
|
||||||
|
|
||||||
|
|
||||||
def magic_link_login_email(username: str, link: str) -> tuple[str, str]:
|
def magic_link_login_email(username: str, link: str) -> tuple[str, str]:
|
||||||
@@ -26,7 +26,7 @@ def magic_link_login_email(username: str, link: str) -> tuple[str, str]:
|
|||||||
<p style="color: #94a3b8; font-size: 13px; margin: 0 0 12px 0;">Oder kopieren Sie diesen Link in Ihren Browser:</p>
|
<p style="color: #94a3b8; font-size: 13px; margin: 0 0 12px 0;">Oder kopieren Sie diesen Link in Ihren Browser:</p>
|
||||||
<p style="color: #64748b; font-size: 11px; word-break: break-all; margin: 0 0 24px 0;">{link}</p>
|
<p style="color: #64748b; font-size: 11px; word-break: break-all; margin: 0 0 24px 0;">{link}</p>
|
||||||
|
|
||||||
<p style="color: #94a3b8; font-size: 13px; margin: 0;">Dieser Link ist 10 Minuten gueltig. Falls Sie diese Anmeldung nicht angefordert haben, ignorieren Sie diese E-Mail.</p>
|
<p style="color: #94a3b8; font-size: 13px; margin: 0;">Dieser Link ist 10 Minuten gültig. Falls Sie diese Anmeldung nicht angefordert haben, ignorieren Sie diese E-Mail.</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>"""
|
</html>"""
|
||||||
@@ -39,7 +39,7 @@ def incident_notification_email(
|
|||||||
notifications: list[dict],
|
notifications: list[dict],
|
||||||
dashboard_url: str,
|
dashboard_url: str,
|
||||||
) -> tuple[str, str]:
|
) -> tuple[str, str]:
|
||||||
"""Erzeugt Benachrichtigungs-E-Mail fuer Lagen-Updates.
|
"""Erzeugt Benachrichtigungs-E-Mail für Lagen-Updates.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
username: Empfaenger-Name
|
username: Empfaenger-Name
|
||||||
|
|||||||
@@ -36,10 +36,10 @@ async def request_magic_link(
|
|||||||
email = data.email.lower().strip()
|
email = data.email.lower().strip()
|
||||||
ip = request.client.host if request.client else "unknown"
|
ip = request.client.host if request.client else "unknown"
|
||||||
|
|
||||||
# Rate-Limit pruefen
|
# Rate-Limit prüfen
|
||||||
allowed, reason = magic_link_limiter.check(email, ip)
|
allowed, reason = magic_link_limiter.check(email, ip)
|
||||||
if not allowed:
|
if not allowed:
|
||||||
logger.warning(f"Rate-Limit fuer {email} von {ip}: {reason}")
|
logger.warning(f"Rate-Limit für {email} von {ip}: {reason}")
|
||||||
return MagicLinkResponse(message="Wenn ein Konto existiert, wurde eine E-Mail gesendet.")
|
return MagicLinkResponse(message="Wenn ein Konto existiert, wurde eine E-Mail gesendet.")
|
||||||
|
|
||||||
# Nutzer suchen
|
# Nutzer suchen
|
||||||
@@ -65,7 +65,7 @@ async def request_magic_link(
|
|||||||
magic_link_limiter.record(email, ip)
|
magic_link_limiter.record(email, ip)
|
||||||
return MagicLinkResponse(message="Wenn ein Konto existiert, wurde eine E-Mail gesendet.")
|
return MagicLinkResponse(message="Wenn ein Konto existiert, wurde eine E-Mail gesendet.")
|
||||||
|
|
||||||
# Lizenz pruefen
|
# Lizenz prüfen
|
||||||
from services.license_service import check_license
|
from services.license_service import check_license
|
||||||
lic = await check_license(db, user["organization_id"])
|
lic = await check_license(db, user["organization_id"])
|
||||||
if lic.get("status") == "org_disabled":
|
if lic.get("status") == "org_disabled":
|
||||||
@@ -76,7 +76,7 @@ async def request_magic_link(
|
|||||||
token = generate_magic_token()
|
token = generate_magic_token()
|
||||||
expires_at = (datetime.now(TIMEZONE) + timedelta(minutes=MAGIC_LINK_EXPIRE_MINUTES)).strftime('%Y-%m-%d %H:%M:%S')
|
expires_at = (datetime.now(TIMEZONE) + timedelta(minutes=MAGIC_LINK_EXPIRE_MINUTES)).strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
# Alte ungenutzte Magic Links fuer diese E-Mail invalidieren
|
# Alte ungenutzte Magic Links für diese E-Mail invalidieren
|
||||||
await db.execute(
|
await db.execute(
|
||||||
"UPDATE magic_links SET is_used = 1 WHERE email = ? AND is_used = 0",
|
"UPDATE magic_links SET is_used = 1 WHERE email = ? AND is_used = 0",
|
||||||
(email,),
|
(email,),
|
||||||
@@ -117,9 +117,9 @@ async def verify_magic_link(
|
|||||||
ml = await cursor.fetchone()
|
ml = await cursor.fetchone()
|
||||||
|
|
||||||
if not ml:
|
if not ml:
|
||||||
raise HTTPException(status_code=400, detail="Ungueltiger oder bereits verwendeter Link")
|
raise HTTPException(status_code=400, detail="Ungültiger oder bereits verwendeter Link")
|
||||||
|
|
||||||
# Ablauf pruefen
|
# Ablauf prüfen
|
||||||
now = datetime.now(TIMEZONE)
|
now = datetime.now(TIMEZONE)
|
||||||
expires = datetime.fromisoformat(ml["expires_at"])
|
expires = datetime.fromisoformat(ml["expires_at"])
|
||||||
if expires.tzinfo is None:
|
if expires.tzinfo is None:
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren