From c6fd7ea89b6e0a96eb1d81989de891b4768b1044 Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Mon, 31 Aug 2026 17:19:17 +0200 Subject: feat: email verification for registration, email change, and invitations Registration now creates a pending account and sends a 6-digit code via email; the account activates only after verification. Email changes on the profile page follow the same flow. Group invitations send a notification email to the invitee (without revealing their address to the inviter) containing the invite code and hub link. Backend: blind HMAC-SHA256 email index for uniqueness without decryption, mail.py for localhost Postfix delivery, verification endpoints, cleanup of expired codes and stale pending accounts, startup backfill of email_hash for existing users. Frontend: 3-phase register page, inline email change verification on profile, invite-notify call with status display. All 10 locales updated. Co-Authored-By: Claude Opus 4.6 --- .../src/meshbay_hub/static/locales/pt-BR.js | 35 +++++++++++++++------- 1 file changed, 25 insertions(+), 10 deletions(-) (limited to 'packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js') diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js index 89c76c2a..3fbbb0bf 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js @@ -41,9 +41,18 @@ export default { 'register.loading': 'Criando a conta...', 'register.has_account': 'Já tem uma conta?', 'register.login_link': 'Entrar', - 'register.success_title': 'Conta criada', - 'register.success_msg': 'Agora você pode entrar com suas credenciais.', + 'register.success_title': 'Verifique seu e-mail', + 'register.success_msg': 'Um código de verificação foi enviado para o seu e-mail. Digite-o abaixo para ativar sua conta.', 'register.go_login': 'Ir para o login', + 'register.code_placeholder': 'Código de verificação', + 'register.verify_btn': 'Verificar', + 'register.verifying': 'Verificando…', + 'register.verified_title': 'E-mail verificado', + 'register.verified_msg': 'Sua conta está ativa. Agora você pode entrar.', + 'register.resend': 'Reenviar código', + 'register.resend_sent': 'Um novo código foi enviado.', + 'login.pending_verification': 'Seu e-mail ainda não foi verificado. Verifique sua caixa de entrada.', + 'login.verify_link': 'Verificar e-mail', 'register.err_mismatch': 'As senhas não coincidem', 'register.err_min_len': { one: 'Use pelo menos {n} caractere', @@ -261,10 +270,15 @@ export default { 'settings.profile': 'Perfil', 'settings.username': 'Nome de usuário', 'settings.email': 'Email', - 'settings.email_save': 'Save', - 'settings.email_saved': 'Email updated', - 'settings.notif_global_disable': 'Disable all notifications', - 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', + 'settings.email_save': 'Salvar', + 'settings.email_saved': 'E-mail atualizado', + 'settings.email_code_sent': 'Um código de verificação foi enviado para o seu novo endereço de e-mail.', + 'settings.email_code_placeholder': 'Código de verificação', + 'settings.email_verify_btn': 'Verificar', + 'settings.email_verifying': 'Verificando…', + 'settings.email_verified': 'Endereço de e-mail alterado com sucesso.', + 'settings.notif_global_disable': 'Desativar todas as notificações', + 'settings.notif_global_hint': 'Quando ativado, nenhuma notificação é criada para nenhum grupo.', 'settings.defaults': 'Padrões', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', @@ -466,10 +480,11 @@ export default { + 'passa pelo hub.', 'members.pair_btn': 'Parear', 'members.pair_success': 'Este navegador agora está pareado com o node.', - 'members.invite_code_ready': 'Código de convite para {user} — envie a ele pelo meio ' - + 'que vocês costumam usar. Funciona uma única vez e nunca passa pelo hub.', - 'members.invite_code_hint': 'A pessoa digita o código na primeira vez que abrir este ' - + 'grupo. Você não precisa estar on-line nesse momento.', + 'members.invite_code_ready': 'Código de convite para {user}:', + 'members.invite_email_sent': 'Um e-mail com o código foi enviado a este membro.', + 'members.invite_email_failed': 'Não foi possível enviar o e-mail — compartilhe o código manualmente.', + 'members.invite_code_hint': 'Você também pode compartilhar este código por outro canal (ex: SMS). ' + + 'O código funciona uma única vez e nunca passa pelo hub.', 'transfers.title': 'Transferências', 'transfers.clear': 'Limpar as concluídas', 'transfers.cancel': 'Cancelar', -- cgit v1.2.3