diff --git a/pages/newsletter/subscribe.vue b/pages/newsletter/subscribe.vue index 74fefeb..5e67087 100644 --- a/pages/newsletter/subscribe.vue +++ b/pages/newsletter/subscribe.vue @@ -74,10 +74,20 @@ v-model="form.email" type="email" required - class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" + :readonly="isLoggedIn" + :class="[ + 'w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500', + isLoggedIn ? 'bg-gray-100 border-gray-300 cursor-not-allowed' : 'border-gray-300' + ]" placeholder="ihre.email@example.com" @blur="checkSubscription" > +

+ Ihre E-Mail-Adresse wird aus Ihrem Profil verwendet. +

@@ -125,13 +135,16 @@ diff --git a/server/api/newsletter/subscribe.post.js b/server/api/newsletter/subscribe.post.js index 99a0b8b..f852d6e 100644 --- a/server/api/newsletter/subscribe.post.js +++ b/server/api/newsletter/subscribe.post.js @@ -5,6 +5,7 @@ import crypto from 'crypto' import fs from 'fs/promises' import path from 'path' import { assertRateLimit, getClientIp, registerRateLimitFailure, registerRateLimitSuccess } from '../../utils/rate-limit.js' +import { getUserFromToken } from '../../utils/auth.js' // nosemgrep: javascript.lang.security.audit.path-traversal.path-join-resolve-traversal.path-join-resolve-traversal // filename is always a hardcoded constant (e.g., 'newsletter-subscribers.json'), never user input @@ -79,10 +80,33 @@ export default defineEventHandler(async (event) => { }) } - if (group.type !== 'subscription' || group.sendToExternal !== true) { + // Prüfe ob Benutzer eingeloggt ist + let isLoggedIn = false + try { + const token = getCookie(event, 'auth_token') || getHeader(event, 'authorization')?.replace('Bearer ', '') + if (token) { + const user = await getUserFromToken(token) + if (user && user.active) { + isLoggedIn = true + } + } + } catch (_e) { + // Nicht eingeloggt - kein Problem + } + + // Prüfe ob Gruppe für Abonnements verfügbar ist + if (group.type !== 'subscription') { throw createError({ statusCode: 403, - statusMessage: 'Diese Newsletter-Gruppe ist nicht für externe Abonnements verfügbar' + statusMessage: 'Diese Newsletter-Gruppe ist nicht für Abonnements verfügbar' + }) + } + + // Nicht eingeloggte Benutzer können sich nur für externe Newsletter anmelden + if (!isLoggedIn && group.sendToExternal !== true) { + throw createError({ + statusCode: 403, + statusMessage: 'Diese Newsletter-Gruppe ist nur für Mitglieder verfügbar. Bitte melden Sie sich an.' }) }