From c2fe813929bd8c080258bb60d6a420ae52955d76 Mon Sep 17 00:00:00 2001 From: Nariman Jelveh Date: Tue, 11 Aug 2026 18:29:22 -0700 Subject: [PATCH] fix: make the feedback dialog's privacy note match what is shared MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The note unconditionally said 'Your email address will be shared with the developer so they can respond', but AppFeedbackService shares the username always and the email only when it exists and is verified — an unverified or temp-user sender was promised a reply path that never materializes, and nobody was told about the username. Show 'username and email' when the signed-in user's email is verified, and 'username' otherwise. --- src/backend/services/feedback/AppFeedbackService.ts | 3 ++- src/gui/src/UI/UIWindowAppFeedback.js | 11 ++++++++++- src/gui/src/i18n/translations/en.js | 3 ++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/backend/services/feedback/AppFeedbackService.ts b/src/backend/services/feedback/AppFeedbackService.ts index d40343243..0bd179a14 100644 --- a/src/backend/services/feedback/AppFeedbackService.ts +++ b/src/backend/services/feedback/AppFeedbackService.ts @@ -322,7 +322,8 @@ export class AppFeedbackService extends PuterService { // signup, never proven), so using it as Reply-To would let a sender // point the developer's reply at a stranger's inbox. Unverified // senders still get their feedback delivered, just without a - // reply path. The dialog tells the user their email will be shared. + // reply path. The dialog's privacy note mirrors this split (see + // app_feedback_privacy_note / app_feedback_privacy_note_no_email). const senderEmail = sender?.email && sender.email_confirmed ? sender.email : null; diff --git a/src/gui/src/UI/UIWindowAppFeedback.js b/src/gui/src/UI/UIWindowAppFeedback.js index 8fba932a4..f5cc3991a 100644 --- a/src/gui/src/UI/UIWindowAppFeedback.js +++ b/src/gui/src/UI/UIWindowAppFeedback.js @@ -59,6 +59,15 @@ async function UIWindowAppFeedback (options) { ? { app: options.app } : { origin: options.origin }; + // Mirror what AppFeedbackService actually shares: the username + // always, the sender's email only when it exists and is verified + // (unverified addresses get no Reply-To, so the developer cannot + // respond). The note must not promise either more or less. + const shares_email = Boolean(window.user?.email && window.user?.email_confirmed); + const privacy_note_key = shares_email + ? 'app_feedback_privacy_note' + : 'app_feedback_privacy_note_no_email'; + const titleId = `${modal_id}-title`; const h = `