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.'
})
}