From a86e59b026ee875630cfda1f55fe5371947031c2 Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Tue, 18 Apr 2017 19:03:19 -0300 Subject: [#927] Adds email template translation for portuguese --- service/pixelated/account_recovery.py | 10 +++--- service/pixelated/assets/recovery.mail.pt-BR | 20 +++++++++++ .../pixelated/resources/backup_account_resource.py | 7 +++- service/pixelated/resources/login_resource.py | 11 ++---- service/pixelated/support/language.py | 24 +++++++++++++ .../unit/resources/test_backup_account_resource.py | 7 ++-- service/test/unit/resources/test_login_resource.py | 21 ------------ service/test/unit/support/test_language.py | 40 ++++++++++++++++++++++ service/test/unit/test_account_recovery.py | 35 +++++++++++++++++++ 9 files changed, 138 insertions(+), 37 deletions(-) create mode 100644 service/pixelated/assets/recovery.mail.pt-BR create mode 100644 service/pixelated/support/language.py create mode 100644 service/test/unit/support/test_language.py diff --git a/service/pixelated/account_recovery.py b/service/pixelated/account_recovery.py index 723d4048..4e8a1583 100644 --- a/service/pixelated/account_recovery.py +++ b/service/pixelated/account_recovery.py @@ -15,6 +15,7 @@ # along with Pixelated. If not, see . import pkg_resources +import binascii from twisted.internet.defer import inlineCallbacks, returnValue from twisted.logger import Logger @@ -28,12 +29,13 @@ log = Logger() class AccountRecovery(object): - def __init__(self, session, soledad, smtp_config, backup_email, domain): + def __init__(self, session, soledad, smtp_config, backup_email, domain, language='en-US'): self._bonafide_session = session self._soledad = soledad self._smtp_config = smtp_config self._backup_email = backup_email self._domain = domain + self._language = language @inlineCallbacks def update_recovery_code(self): @@ -72,15 +74,15 @@ class AccountRecovery(object): log.error('Failed trying to send the email with the recovery code') raise e - def _get_recovery_mail(self, code, language='en-US'): + def _get_recovery_mail(self, code): recovery_mail = pkg_resources.resource_filename( 'pixelated.assets', - 'recovery.mail.%s' % (language)) + 'recovery.mail.%s' % (self._language)) account_recovery_url = '{}/{}'.format(self._domain, AccountRecoveryResource.BASE_URL) with open(recovery_mail) as mail_template_file: return mail_template_file.read().format( domain=self._domain, - recovery_code=code, + recovery_code=binascii.hexlify(code), account_recovery_url=account_recovery_url) diff --git a/service/pixelated/assets/recovery.mail.pt-BR b/service/pixelated/assets/recovery.mail.pt-BR new file mode 100644 index 00000000..77271b39 --- /dev/null +++ b/service/pixelated/assets/recovery.mail.pt-BR @@ -0,0 +1,20 @@ +Olá, + +Você está recebendo este email porque você se registrou em um provedor do Pixelated, no {domain}. +Se algum dia esquecer sua senha, você pode acessar esse link {account_recovery_url} e usar o código abaixo: + +{recovery_code} + +Esse código é a única forma de recuperar o acesso a sua conta se perder a senha. +Guarde-o com carinho!!! + +Por quê isso é importante? + +Pixelated é um cliente de email que respeita sua privacidade e usa criptografia PGP para isso. +Sua senha também te da acesso as suas chaves, então se você esquecê-la você perderá acesso a sua conta e a habilidade de descriptografar suas mensagens. +Nós entedemos que esquecer a senha é algo comum, por isso desenvolvemos uma forma mais segura de recuperar sua conta e, consequentemente, um pouco mais chata ;) + +Esse código é uma metade do código necesário para recuperar a conta. A outra metade está com o administrador da conta. Se você esquecer a senha, use esse código e o do administrador para recuperar acesso a conta. É como se fosse um cadeado com duas chaves :) +Você só terá sucesso se tiver ambos os códigos, então, nunca machuca pedir novamente: GUARDE ESSE CÓDIGO! + +PS: Se você não criou uma conta no site {domain}, por favor ignore esse email. diff --git a/service/pixelated/resources/backup_account_resource.py b/service/pixelated/resources/backup_account_resource.py index ec3e9dee..94129122 100644 --- a/service/pixelated/resources/backup_account_resource.py +++ b/service/pixelated/resources/backup_account_resource.py @@ -25,6 +25,7 @@ from twisted.web.template import Element, XMLFile, renderElement from pixelated.resources import BaseResource from pixelated.resources import get_protected_static_folder from pixelated.account_recovery import AccountRecovery +from pixelated.support.language import parse_accept_language class BackupAccountPage(Element): @@ -56,7 +57,8 @@ class BackupAccountResource(BaseResource): self.soledad(request), self._service(request, '_leap_session').smtp_config, self._get_backup_email(request), - self._leap_provider.server_name) + self._leap_provider.server_name, + language=self._get_language(request)) def update_response(response): request.setResponseCode(NO_CONTENT) @@ -72,3 +74,6 @@ class BackupAccountResource(BaseResource): def _get_backup_email(self, request): return json.loads(request.content.getvalue()).get('backupEmail') + + def _get_language(self, request): + return parse_accept_language(request.getAllHeaders()) diff --git a/service/pixelated/resources/login_resource.py b/service/pixelated/resources/login_resource.py index 45942ea6..5b0b70d0 100644 --- a/service/pixelated/resources/login_resource.py +++ b/service/pixelated/resources/login_resource.py @@ -22,6 +22,8 @@ from pixelated.config.leap import BootstrapUserServices from pixelated.resources import BaseResource, UnAuthorizedResource, IPixelatedSession from pixelated.resources.account_recovery_resource import AccountRecoveryResource from pixelated.resources import get_public_static_folder, respond_json +from pixelated.support.language import parse_accept_language + from twisted.cred.error import UnauthorizedLogin from twisted.internet import defer from twisted.logger import Logger @@ -36,15 +38,6 @@ from twisted.web.template import Element, XMLFile, renderElement, renderer log = Logger() -def parse_accept_language(all_headers): - accepted_languages = ['pt-BR', 'en-US'] - languages = all_headers.get('accept-language', '').split(';')[0] - for language in accepted_languages: - if language in languages: - return language - return 'pt-BR' - - class DisclaimerElement(Element): loader = XMLFile(FilePath(os.path.join(get_public_static_folder(), '_login_disclaimer_banner.html'))) diff --git a/service/pixelated/support/language.py b/service/pixelated/support/language.py new file mode 100644 index 00000000..4999bc04 --- /dev/null +++ b/service/pixelated/support/language.py @@ -0,0 +1,24 @@ +# +# Copyright (c) 2017 ThoughtWorks, Inc. +# +# Pixelated is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pixelated is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with Pixelated. If not, see . + + +def parse_accept_language(all_headers): + accepted_languages = ['pt-BR', 'en-US'] + languages = all_headers.get('accept-language', '').split(';')[0] + for language in accepted_languages: + if language in languages: + return language + return 'pt-BR' diff --git a/service/test/unit/resources/test_backup_account_resource.py b/service/test/unit/resources/test_backup_account_resource.py index 220e3909..e16fa0e1 100644 --- a/service/test/unit/resources/test_backup_account_resource.py +++ b/service/test/unit/resources/test_backup_account_resource.py @@ -44,8 +44,10 @@ class TestBackupAccountResource(unittest.TestCase): d.addCallback(assert_200_when_user_logged_in) return d + @patch('pixelated.resources.backup_account_resource.parse_accept_language') @patch('pixelated.resources.backup_account_resource.AccountRecovery') - def test_post_updates_recovery_code(self, mock_account_recovery_init): + def test_post_updates_recovery_code(self, mock_account_recovery_init, mock_language): + mock_language.return_value = 'pt-BR' mock_account_recovery = MagicMock() mock_account_recovery_init.return_value = mock_account_recovery mock_account_recovery.update_recovery_code.return_value = defer.succeed("Success") @@ -61,7 +63,8 @@ class TestBackupAccountResource(unittest.TestCase): self.resource.soledad(request), self.resource._service(request, '_leap_session').smtp_config, self.resource._get_backup_email(request), - self.leap_provider.server_name) + self.leap_provider.server_name, + language='pt-BR') mock_account_recovery.update_recovery_code.assert_called() d.addCallback(assert_update_recovery_code_called) diff --git a/service/test/unit/resources/test_login_resource.py b/service/test/unit/resources/test_login_resource.py index eaaba1d4..e33b5618 100644 --- a/service/test/unit/resources/test_login_resource.py +++ b/service/test/unit/resources/test_login_resource.py @@ -24,30 +24,9 @@ from twisted.trial import unittest from twisted.web.test.requesthelper import DummyRequest from pixelated.resources.login_resource import LoginResource, LoginStatusResource -from pixelated.resources.login_resource import parse_accept_language from test.unit.resources import DummySite -class TestParseAcceptLanguage(unittest.TestCase): - def test_parse_pt_br_simple(self): - all_headers = { - 'accept-language': 'pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3'} - parsed_language = parse_accept_language(all_headers) - self.assertEqual('pt-BR', parsed_language) - - def test_parse_en_us_simple(self): - all_headers = { - 'accept-language': 'en-US,en;q=0.8,en-US;q=0.5,en;q=0.3'} - parsed_language = parse_accept_language(all_headers) - self.assertEqual('en-US', parsed_language) - - def test_parse_pt_br_as_default(self): - all_headers = { - 'accept-language': 'de-DE,de;q=0.8,en-US;q=0.5,en;q=0.3'} - parsed_language = parse_accept_language(all_headers) - self.assertEqual('pt-BR', parsed_language) - - class TestLoginResource(unittest.TestCase): def setUp(self): self.services_factory = mock() diff --git a/service/test/unit/support/test_language.py b/service/test/unit/support/test_language.py new file mode 100644 index 00000000..23983b53 --- /dev/null +++ b/service/test/unit/support/test_language.py @@ -0,0 +1,40 @@ +# +# Copyright (c) 2017 ThoughtWorks, Inc. +# +# Pixelated is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pixelated is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with Pixelated. If not, see . + + +from twisted.trial import unittest + +from pixelated.support.language import parse_accept_language + + +class TestParseAcceptLanguage(unittest.TestCase): + def test_parse_pt_br_simple(self): + all_headers = { + 'accept-language': 'pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3'} + parsed_language = parse_accept_language(all_headers) + self.assertEqual('pt-BR', parsed_language) + + def test_parse_en_us_simple(self): + all_headers = { + 'accept-language': 'en-US,en;q=0.8,en-US;q=0.5,en;q=0.3'} + parsed_language = parse_accept_language(all_headers) + self.assertEqual('en-US', parsed_language) + + def test_parse_pt_br_as_default(self): + all_headers = { + 'accept-language': 'de-DE,de;q=0.8,en-US;q=0.5,en;q=0.3'} + parsed_language = parse_accept_language(all_headers) + self.assertEqual('pt-BR', parsed_language) diff --git a/service/test/unit/test_account_recovery.py b/service/test/unit/test_account_recovery.py index b0edc466..eb7927d0 100644 --- a/service/test/unit/test_account_recovery.py +++ b/service/test/unit/test_account_recovery.py @@ -50,6 +50,41 @@ class AccountRecoveryTest(unittest.TestCase): yield self.account_recovery.update_recovery_code() self.mock_bonafide_session.update_recovery_code.assert_called_once_with(self.generated_code) + @defer.inlineCallbacks + def test_creates_recovery_code(self): + when(self.account_recovery)._send_mail(ANY).thenReturn(defer.succeed(None)) + yield self.account_recovery.update_recovery_code() + self.mock_soledad.create_recovery_code.assert_called_once() + + @patch('pixelated.account_recovery.smtp.sendmail') + @patch('pixelated.account_recovery.pkg_resources.resource_filename') + @defer.inlineCallbacks + def test_default_email_template(self, mock_resource, mock_sendmail): + mock_sendmail.return_value = defer.succeed(None) + + with patch('pixelated.account_recovery.open', mock_open(read_data=''), create=True): + yield self.account_recovery.update_recovery_code() + mock_resource.assert_called_once_with('pixelated.assets', + 'recovery.mail.en-US') + + @patch('pixelated.account_recovery.smtp.sendmail') + @patch('pixelated.account_recovery.pkg_resources.resource_filename') + @defer.inlineCallbacks + def test_portuguese_email_template(self, mock_resource, mock_sendmail): + self.account_recovery = AccountRecovery( + self.mock_bonafide_session, + self.mock_soledad, + self.mock_smtp_config, + self.backup_email, + self.domain, + language='pt-BR') + mock_sendmail.return_value = defer.succeed(None) + + with patch('pixelated.account_recovery.open', mock_open(read_data=''), create=True): + yield self.account_recovery.update_recovery_code() + mock_resource.assert_called_once_with('pixelated.assets', + 'recovery.mail.pt-BR') + @patch('pixelated.account_recovery.smtp.sendmail') @patch('pixelated.account_recovery.pkg_resources.resource_filename') @defer.inlineCallbacks -- cgit v1.2.3 From 995446a82ef694e0705e94effb494812e0b3ae9f Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Wed, 19 Apr 2017 11:29:42 -0300 Subject: [#927] Adds headers to recovery code email template with @deniscostadsc --- service/pixelated/account_recovery.py | 16 ++++++++-------- service/pixelated/assets/recovery.mail.en-US | 6 ++++++ service/pixelated/assets/recovery.mail.pt-BR | 6 ++++++ service/test/unit/test_account_recovery.py | 10 +++------- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/service/pixelated/account_recovery.py b/service/pixelated/account_recovery.py index 4e8a1583..d2110bb3 100644 --- a/service/pixelated/account_recovery.py +++ b/service/pixelated/account_recovery.py @@ -21,7 +21,7 @@ from twisted.internet.defer import inlineCallbacks, returnValue from twisted.logger import Logger from twisted.mail import smtp -from email.mime.text import MIMEText +from email import message_from_string from pixelated.resources.account_recovery_resource import AccountRecoveryResource @@ -58,10 +58,7 @@ class AccountRecovery(object): log.info('Sending mail containing the user\'s recovery code') sender = 'team@{}'.format(self._domain) - msg = MIMEText(self._get_recovery_mail(code)) - msg['Subject'] = 'Recovery Code' - msg['From'] = sender - msg['To'] = backup_email + msg = self._get_recovery_mail(code, sender, backup_email) try: send_mail_result = yield smtp.sendmail( @@ -74,7 +71,7 @@ class AccountRecovery(object): log.error('Failed trying to send the email with the recovery code') raise e - def _get_recovery_mail(self, code): + def _get_recovery_mail(self, code, sender, backup_email): recovery_mail = pkg_resources.resource_filename( 'pixelated.assets', 'recovery.mail.%s' % (self._language)) @@ -82,7 +79,10 @@ class AccountRecovery(object): account_recovery_url = '{}/{}'.format(self._domain, AccountRecoveryResource.BASE_URL) with open(recovery_mail) as mail_template_file: - return mail_template_file.read().format( + return message_from_string(mail_template_file.read().format( domain=self._domain, recovery_code=binascii.hexlify(code), - account_recovery_url=account_recovery_url) + account_recovery_url=account_recovery_url, + backup_email=backup_email, + sender=sender, + date='Sat, 21 Mar 2015 19:30:09 -0300')) diff --git a/service/pixelated/assets/recovery.mail.en-US b/service/pixelated/assets/recovery.mail.en-US index d17f8a28..8e12c55d 100644 --- a/service/pixelated/assets/recovery.mail.en-US +++ b/service/pixelated/assets/recovery.mail.en-US @@ -1,3 +1,9 @@ +From: {sender} +Date: {date} +Subject: Recovery Code +To: {backup_email} +Content-Type: text/plain; charset=UTF-8 + Hello, You are receiving this email because you registered at a Pixelated provider, on {domain}. diff --git a/service/pixelated/assets/recovery.mail.pt-BR b/service/pixelated/assets/recovery.mail.pt-BR index 77271b39..8ef07a89 100644 --- a/service/pixelated/assets/recovery.mail.pt-BR +++ b/service/pixelated/assets/recovery.mail.pt-BR @@ -1,3 +1,9 @@ +From: {sender} +Date: {date} +Subject: Código de Recuperação +To: {backup_email} +Content-Type: text/plain; charset=UTF-8 + Olá, Você está recebendo este email porque você se registrou em um provedor do Pixelated, no {domain}. diff --git a/service/test/unit/test_account_recovery.py b/service/test/unit/test_account_recovery.py index eb7927d0..e595fc5a 100644 --- a/service/test/unit/test_account_recovery.py +++ b/service/test/unit/test_account_recovery.py @@ -92,12 +92,8 @@ class AccountRecoveryTest(unittest.TestCase): mock_sendmail.return_value = defer.succeed(None) sender = 'team@{}'.format(self.domain) - mock_file_content = '{domain}, {recovery_code}, {account_recovery_url}' - recovery_code_email = 'test.com, 4645a2f8997e5d0d, test.com/account-recovery' - msg = MIMEText(recovery_code_email) - msg['Subject'] = 'Recovery Code' - msg['From'] = sender - msg['To'] = self.backup_email + mock_file_content = '{backup_email}, {sender}, {date}, {domain}, {recovery_code}, {account_recovery_url}' + recovery_code_email = '\ntest@test.com, team@test.com, Sat, 21 Mar 2015 19:30:09 -0300, test.com, 34363435613266383939376535643064, test.com/account-recovery' with patch('pixelated.account_recovery.open', mock_open(read_data=mock_file_content), create=True): yield self.account_recovery._send_mail(self.generated_code, self.backup_email) @@ -106,4 +102,4 @@ class AccountRecoveryTest(unittest.TestCase): self.mock_smtp_config.remote_smtp_host, sender, [self.backup_email], - msg.as_string()) + recovery_code_email) -- cgit v1.2.3 From a3763301042c5db0231b0e9e2d4a62d41d374d49 Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Wed, 19 Apr 2017 13:51:47 -0300 Subject: [#927] Adds date to recovery code email with @deniscostadsc --- service/pixelated/account_recovery.py | 3 ++- service/pixelated/assets/recovery.mail.pt-BR | 2 +- service/test/unit/test_account_recovery.py | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/service/pixelated/account_recovery.py b/service/pixelated/account_recovery.py index d2110bb3..dae3da1b 100644 --- a/service/pixelated/account_recovery.py +++ b/service/pixelated/account_recovery.py @@ -22,6 +22,7 @@ from twisted.logger import Logger from twisted.mail import smtp from email import message_from_string +from email.utils import formatdate from pixelated.resources.account_recovery_resource import AccountRecoveryResource @@ -85,4 +86,4 @@ class AccountRecovery(object): account_recovery_url=account_recovery_url, backup_email=backup_email, sender=sender, - date='Sat, 21 Mar 2015 19:30:09 -0300')) + date=formatdate(localtime=True))) diff --git a/service/pixelated/assets/recovery.mail.pt-BR b/service/pixelated/assets/recovery.mail.pt-BR index 8ef07a89..7d0f2a58 100644 --- a/service/pixelated/assets/recovery.mail.pt-BR +++ b/service/pixelated/assets/recovery.mail.pt-BR @@ -1,6 +1,6 @@ From: {sender} Date: {date} -Subject: Código de Recuperação +Subject: Codigo de Recuperacao To: {backup_email} Content-Type: text/plain; charset=UTF-8 diff --git a/service/test/unit/test_account_recovery.py b/service/test/unit/test_account_recovery.py index e595fc5a..cb5ed520 100644 --- a/service/test/unit/test_account_recovery.py +++ b/service/test/unit/test_account_recovery.py @@ -85,11 +85,13 @@ class AccountRecoveryTest(unittest.TestCase): mock_resource.assert_called_once_with('pixelated.assets', 'recovery.mail.pt-BR') + @patch('pixelated.account_recovery.formatdate') @patch('pixelated.account_recovery.smtp.sendmail') @patch('pixelated.account_recovery.pkg_resources.resource_filename') @defer.inlineCallbacks - def test_send_recovery_code_by_email(self, mock_resource, mock_sendmail): + def test_send_recovery_code_by_email(self, mock_resource, mock_sendmail, mock_formatdate): mock_sendmail.return_value = defer.succeed(None) + mock_formatdate.return_value = 'Sat, 21 Mar 2015 19:30:09 -0300' sender = 'team@{}'.format(self.domain) mock_file_content = '{backup_email}, {sender}, {date}, {domain}, {recovery_code}, {account_recovery_url}' -- cgit v1.2.3 From d2c13c6f8535418b7c90d1f0d75fe88b2c68dd85 Mon Sep 17 00:00:00 2001 From: Denis Costa Date: Wed, 19 Apr 2017 16:52:02 -0300 Subject: [#927] Removes recovery url from email @anikarni --- service/pixelated/account_recovery.py | 5 ----- service/pixelated/assets/recovery.mail.en-US | 8 ++++---- service/pixelated/assets/recovery.mail.pt-BR | 8 ++++---- service/test/unit/test_account_recovery.py | 4 ++-- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/service/pixelated/account_recovery.py b/service/pixelated/account_recovery.py index dae3da1b..f84aea1a 100644 --- a/service/pixelated/account_recovery.py +++ b/service/pixelated/account_recovery.py @@ -24,8 +24,6 @@ from twisted.mail import smtp from email import message_from_string from email.utils import formatdate -from pixelated.resources.account_recovery_resource import AccountRecoveryResource - log = Logger() @@ -77,13 +75,10 @@ class AccountRecovery(object): 'pixelated.assets', 'recovery.mail.%s' % (self._language)) - account_recovery_url = '{}/{}'.format(self._domain, AccountRecoveryResource.BASE_URL) - with open(recovery_mail) as mail_template_file: return message_from_string(mail_template_file.read().format( domain=self._domain, recovery_code=binascii.hexlify(code), - account_recovery_url=account_recovery_url, backup_email=backup_email, sender=sender, date=formatdate(localtime=True))) diff --git a/service/pixelated/assets/recovery.mail.en-US b/service/pixelated/assets/recovery.mail.en-US index 8e12c55d..a2e5b1e8 100644 --- a/service/pixelated/assets/recovery.mail.en-US +++ b/service/pixelated/assets/recovery.mail.en-US @@ -1,13 +1,13 @@ From: {sender} Date: {date} -Subject: Recovery Code +Subject: Recovery Code for {domain} To: {backup_email} Content-Type: text/plain; charset=UTF-8 Hello, -You are receiving this email because you registered at a Pixelated provider, on {domain}. -In case you ever forget your password, you can access this link {account_recovery_url} and put the following recovery code: +You are receiving this email because you registered at a Pixelated provider, on https://{domain}. +In case you ever forget your password use the following recovery code: {recovery_code} @@ -23,4 +23,4 @@ This code is half of a big code to recover your account, the other half is with You will only succeed if you have both codes, so, never hurts to ask again: SAVE THIS CODE! -PS: If you didn't create an account at {domain}, please ignore this email. +PS: If you didn't create an account at https://{domain}, please ignore this email. diff --git a/service/pixelated/assets/recovery.mail.pt-BR b/service/pixelated/assets/recovery.mail.pt-BR index 7d0f2a58..c608cb0b 100644 --- a/service/pixelated/assets/recovery.mail.pt-BR +++ b/service/pixelated/assets/recovery.mail.pt-BR @@ -1,13 +1,13 @@ From: {sender} Date: {date} -Subject: Codigo de Recuperacao +Subject: Codigo de Recuperacao de {domain} To: {backup_email} Content-Type: text/plain; charset=UTF-8 Olá, -Você está recebendo este email porque você se registrou em um provedor do Pixelated, no {domain}. -Se algum dia esquecer sua senha, você pode acessar esse link {account_recovery_url} e usar o código abaixo: +Você está recebendo este email porque você se registrou em um provedor do Pixelated, no https://{domain}. +Se algum dia esquecer sua senha use o código abaixo: {recovery_code} @@ -23,4 +23,4 @@ Nós entedemos que esquecer a senha é algo comum, por isso desenvolvemos uma fo Esse código é uma metade do código necesário para recuperar a conta. A outra metade está com o administrador da conta. Se você esquecer a senha, use esse código e o do administrador para recuperar acesso a conta. É como se fosse um cadeado com duas chaves :) Você só terá sucesso se tiver ambos os códigos, então, nunca machuca pedir novamente: GUARDE ESSE CÓDIGO! -PS: Se você não criou uma conta no site {domain}, por favor ignore esse email. +PS: Se você não criou uma conta no site https://{domain}, por favor ignore esse email. diff --git a/service/test/unit/test_account_recovery.py b/service/test/unit/test_account_recovery.py index cb5ed520..e9979fae 100644 --- a/service/test/unit/test_account_recovery.py +++ b/service/test/unit/test_account_recovery.py @@ -94,8 +94,8 @@ class AccountRecoveryTest(unittest.TestCase): mock_formatdate.return_value = 'Sat, 21 Mar 2015 19:30:09 -0300' sender = 'team@{}'.format(self.domain) - mock_file_content = '{backup_email}, {sender}, {date}, {domain}, {recovery_code}, {account_recovery_url}' - recovery_code_email = '\ntest@test.com, team@test.com, Sat, 21 Mar 2015 19:30:09 -0300, test.com, 34363435613266383939376535643064, test.com/account-recovery' + mock_file_content = '{backup_email}, {sender}, {date}, {domain}, {recovery_code}' + recovery_code_email = '\ntest@test.com, team@test.com, Sat, 21 Mar 2015 19:30:09 -0300, test.com, 34363435613266383939376535643064' with patch('pixelated.account_recovery.open', mock_open(read_data=mock_file_content), create=True): yield self.account_recovery._send_mail(self.generated_code, self.backup_email) -- cgit v1.2.3 From 496783ff4c7af8381edec09668c07a1d5f64f8bc Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Wed, 19 Apr 2017 17:23:20 -0300 Subject: [#927] Improves recovery email template with @deniscostadsc --- service/pixelated/assets/recovery.mail.en-US | 20 +++++++++++--------- service/pixelated/assets/recovery.mail.pt-BR | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/service/pixelated/assets/recovery.mail.en-US b/service/pixelated/assets/recovery.mail.en-US index a2e5b1e8..e7a09f1b 100644 --- a/service/pixelated/assets/recovery.mail.en-US +++ b/service/pixelated/assets/recovery.mail.en-US @@ -6,21 +6,23 @@ Content-Type: text/plain; charset=UTF-8 Hello, -You are receiving this email because you registered at a Pixelated provider, on https://{domain}. -In case you ever forget your password use the following recovery code: +You are receiving this message because you registered an email account at https://{domain}. +If you ever forget your password, you'll need the code below to recover it. Save it! It is the only way to access to your account again. {recovery_code} -This code is the only way to recover access to your account in case you lose your password. -Be careful and keep it safe!!! +Save this message or write this code in a safe place. +-- Why is this so important? -Pixelated is an email client that respects your privacy and uses PGP Encryption to do so. -Your password also gives you access to your keys, so if you forget it you will lose access to your account and the ability to decrypt your messages. -We understand that forgetting passwords is a common thing, so we developed a more secure way to recover access to your account, therefore, a little bit more annoying ;) -This code is half of a big code to recover your account, the other half is with the account administrator. In case you forget your password, use this code and your administrator code to recover access to your account. It's like those locks with two keys :) -You will only succeed if you have both codes, so, never hurts to ask again: SAVE THIS CODE! +Pixelated is an email client that respects your privacy and uses PGP Encryption to do so. Your password also gives you access to your keys, so if you forget it you will lose access to your account and the ability to read your messages. +Forgetting passwords is a common thing, so we developed a more secure way to recover access to your account. + +1) This code is half of a big code to recover your account. +2) The other half is with the account administrator. +3) In case you forget your password, use this code and your administrator code to recover access to your account. It's like those locks with two keys :) + PS: If you didn't create an account at https://{domain}, please ignore this email. diff --git a/service/pixelated/assets/recovery.mail.pt-BR b/service/pixelated/assets/recovery.mail.pt-BR index c608cb0b..558c6905 100644 --- a/service/pixelated/assets/recovery.mail.pt-BR +++ b/service/pixelated/assets/recovery.mail.pt-BR @@ -6,21 +6,21 @@ Content-Type: text/plain; charset=UTF-8 Olá, -Você está recebendo este email porque você se registrou em um provedor do Pixelated, no https://{domain}. -Se algum dia esquecer sua senha use o código abaixo: +Você está recebendo isso porque você registrou um email no https://{domain}. +Guarde o código abaixo para se um dia esquecer sua senha. Ele é a única forma de recuperar uma senha para acessar sua conta outra vez: {recovery_code} -Esse código é a única forma de recuperar o acesso a sua conta se perder a senha. -Guarde-o com carinho!!! +Salve essa mensagem ou anote o código em um lugar seguro. -Por quê isso é importante? +-- +Por que isso é importante? -Pixelated é um cliente de email que respeita sua privacidade e usa criptografia PGP para isso. -Sua senha também te da acesso as suas chaves, então se você esquecê-la você perderá acesso a sua conta e a habilidade de descriptografar suas mensagens. -Nós entedemos que esquecer a senha é algo comum, por isso desenvolvemos uma forma mais segura de recuperar sua conta e, consequentemente, um pouco mais chata ;) +O Pixelated é um cliente de email que respeita sua privacidade e usa criptografia PGP para isso. Sua senha também dá acesso às suas chaves, então se você esquecê-la você perderá acesso a sua conta e a habilidade de ler suas mensagens. Esquecer a senha é algo comum, por isso desenvolvemos uma forma mais segura de recuperar sua conta. + +1) Esse código é uma metade de um código necessário para recuperar a conta. +2) A outra metade está com o administrador da conta. +3) Se você esquecer a senha, use esse código e o do administrador para recuperar acesso a conta. É como se fosse um cadeado com duas chaves :) -Esse código é uma metade do código necesário para recuperar a conta. A outra metade está com o administrador da conta. Se você esquecer a senha, use esse código e o do administrador para recuperar acesso a conta. É como se fosse um cadeado com duas chaves :) -Você só terá sucesso se tiver ambos os códigos, então, nunca machuca pedir novamente: GUARDE ESSE CÓDIGO! PS: Se você não criou uma conta no site https://{domain}, por favor ignore esse email. -- cgit v1.2.3 From cffce77dbc126b1678f9a754b3e1a3663a323c33 Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Thu, 20 Apr 2017 09:25:14 -0300 Subject: [#927] Calls the public method intead of private one on test with @deniscostadsc --- service/test/unit/test_account_recovery.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/test/unit/test_account_recovery.py b/service/test/unit/test_account_recovery.py index e9979fae..4dc9621f 100644 --- a/service/test/unit/test_account_recovery.py +++ b/service/test/unit/test_account_recovery.py @@ -98,7 +98,7 @@ class AccountRecoveryTest(unittest.TestCase): recovery_code_email = '\ntest@test.com, team@test.com, Sat, 21 Mar 2015 19:30:09 -0300, test.com, 34363435613266383939376535643064' with patch('pixelated.account_recovery.open', mock_open(read_data=mock_file_content), create=True): - yield self.account_recovery._send_mail(self.generated_code, self.backup_email) + yield self.account_recovery.update_recovery_code() mock_sendmail.assert_called_with( self.mock_smtp_config.remote_smtp_host, -- cgit v1.2.3 From 014dde1cf661d2cc43dda79dcfa94ddc6a6b5ed0 Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Thu, 20 Apr 2017 09:32:45 -0300 Subject: [#927] Sets default language to en-US with @deniscostadsc --- service/pixelated/support/language.py | 2 +- service/test/unit/resources/test_login_resource.py | 2 +- service/test/unit/support/test_language.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/service/pixelated/support/language.py b/service/pixelated/support/language.py index 4999bc04..cd455f89 100644 --- a/service/pixelated/support/language.py +++ b/service/pixelated/support/language.py @@ -21,4 +21,4 @@ def parse_accept_language(all_headers): for language in accepted_languages: if language in languages: return language - return 'pt-BR' + return 'en-US' diff --git a/service/test/unit/resources/test_login_resource.py b/service/test/unit/resources/test_login_resource.py index e33b5618..03d61758 100644 --- a/service/test/unit/resources/test_login_resource.py +++ b/service/test/unit/resources/test_login_resource.py @@ -231,7 +231,7 @@ class TestLoginPOST(unittest.TestCase): d = self.web.get(self.request) def assert_login_setup_service_for_user(_): - mock_user_bootstrap_setup.assert_called_once_with(self.user_auth, self.password, 'pt-BR') + mock_user_bootstrap_setup.assert_called_once_with(self.user_auth, self.password, 'en-US') d.addCallback(assert_login_setup_service_for_user) return d diff --git a/service/test/unit/support/test_language.py b/service/test/unit/support/test_language.py index 23983b53..b84f3a23 100644 --- a/service/test/unit/support/test_language.py +++ b/service/test/unit/support/test_language.py @@ -33,8 +33,8 @@ class TestParseAcceptLanguage(unittest.TestCase): parsed_language = parse_accept_language(all_headers) self.assertEqual('en-US', parsed_language) - def test_parse_pt_br_as_default(self): + def test_parse_en_us_as_default(self): all_headers = { 'accept-language': 'de-DE,de;q=0.8,en-US;q=0.5,en;q=0.3'} parsed_language = parse_accept_language(all_headers) - self.assertEqual('pt-BR', parsed_language) + self.assertEqual('en-US', parsed_language) -- cgit v1.2.3