From f4229e63e315654032dc3f0c8a69e2892c72758c Mon Sep 17 00:00:00 2001 From: Thais Siqueira Date: Fri, 31 Mar 2017 14:10:30 -0300 Subject: [#927] Implements sending recovery code by email. with @tayanefernandes --- service/pixelated/account_recovery.py | 30 +++++++++++++++++++++- service/pixelated/resources/__init__.py | 3 +++ .../pixelated/resources/backup_account_resource.py | 4 ++- 3 files changed, 35 insertions(+), 2 deletions(-) (limited to 'service/pixelated') diff --git a/service/pixelated/account_recovery.py b/service/pixelated/account_recovery.py index 234bb1fe..fa1bf4f9 100644 --- a/service/pixelated/account_recovery.py +++ b/service/pixelated/account_recovery.py @@ -13,23 +13,51 @@ # # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see . + from twisted.internet.defer import inlineCallbacks, returnValue from twisted.logger import Logger +from twisted.mail import smtp + +from email.mime.text import MIMEText + log = Logger() class AccountRecovery(object): - def __init__(self, session, soledad): + def __init__(self, session, soledad, smtp_config, backup_email): self._bonafide_session = session self._soledad = soledad + self._smtp_config = smtp_config + self._backup_email = backup_email @inlineCallbacks def update_recovery_code(self): try: code = self._soledad.create_recovery_code() response = yield self._bonafide_session.update_recovery_code(code) + yield self._send_mail(code, self._backup_email) + returnValue(response) + except Exception as e: log.warn('Something went wrong when trying to save the recovery code') raise + + @inlineCallbacks + def _send_mail(self, code, backup_email): + msg = MIMEText('Your code %s' % code) + msg['Subject'] = 'Recovery Code' + msg['From'] = 'team@pixelated-project.org' + msg['To'] = backup_email + + try: + send_mail_result = yield smtp.sendmail( + str(self._smtp_config.remote_smtp_host), + 'team@pixelated-project.org', + [backup_email], + msg.as_string()) + returnValue(send_mail_result) + except Exception as e: + log.warn('Failed trying to send the email with the recovery code') + raise diff --git a/service/pixelated/resources/__init__.py b/service/pixelated/resources/__init__.py index 61e60720..3b2a7118 100644 --- a/service/pixelated/resources/__init__.py +++ b/service/pixelated/resources/__init__.py @@ -122,6 +122,9 @@ class BaseResource(Resource): def soledad(self, request): return self._service(request, '_leap_session').soledad + def get_backup_email(self, request): + return json.loads(request.content.getvalue()).get('backupEmail') + class UnAuthorizedResource(Resource): diff --git a/service/pixelated/resources/backup_account_resource.py b/service/pixelated/resources/backup_account_resource.py index b752b4c7..677e9e75 100644 --- a/service/pixelated/resources/backup_account_resource.py +++ b/service/pixelated/resources/backup_account_resource.py @@ -51,7 +51,9 @@ class BackupAccountResource(BaseResource): def render_POST(self, request): account_recovery = AccountRecovery( self._authenticator.bonafide_session, - self.soledad(request)) + self.soledad(request), + self._service(request, '_leap_session').smtp_config, + self.get_backup_email(request)) def update_response(response): request.setResponseCode(NO_CONTENT) -- cgit v1.2.3 From 304215fe36666c8401bd9fa01a50cab61ddc10ca Mon Sep 17 00:00:00 2001 From: Thais Siqueira Date: Fri, 31 Mar 2017 17:32:49 -0300 Subject: [#927] Log exception with recovery code with @tayanefernandes --- service/pixelated/account_recovery.py | 9 +++++---- service/pixelated/resources/__init__.py | 3 --- service/pixelated/resources/backup_account_resource.py | 7 ++++++- 3 files changed, 11 insertions(+), 8 deletions(-) (limited to 'service/pixelated') diff --git a/service/pixelated/account_recovery.py b/service/pixelated/account_recovery.py index fa1bf4f9..c0a18792 100644 --- a/service/pixelated/account_recovery.py +++ b/service/pixelated/account_recovery.py @@ -41,8 +41,9 @@ class AccountRecovery(object): returnValue(response) except Exception as e: - log.warn('Something went wrong when trying to save the recovery code') - raise + log.error('Something went wrong when trying to save the recovery code') + log.error(e) + raise e @inlineCallbacks def _send_mail(self, code, backup_email): @@ -59,5 +60,5 @@ class AccountRecovery(object): msg.as_string()) returnValue(send_mail_result) except Exception as e: - log.warn('Failed trying to send the email with the recovery code') - raise + log.error('Failed trying to send the email with the recovery code') + raise e diff --git a/service/pixelated/resources/__init__.py b/service/pixelated/resources/__init__.py index 3b2a7118..61e60720 100644 --- a/service/pixelated/resources/__init__.py +++ b/service/pixelated/resources/__init__.py @@ -122,9 +122,6 @@ class BaseResource(Resource): def soledad(self, request): return self._service(request, '_leap_session').soledad - def get_backup_email(self, request): - return json.loads(request.content.getvalue()).get('backupEmail') - class UnAuthorizedResource(Resource): diff --git a/service/pixelated/resources/backup_account_resource.py b/service/pixelated/resources/backup_account_resource.py index 677e9e75..f51ac2ec 100644 --- a/service/pixelated/resources/backup_account_resource.py +++ b/service/pixelated/resources/backup_account_resource.py @@ -15,6 +15,8 @@ # along with Pixelated. If not, see . import os +import json + from xml.sax import SAXParseException from pixelated.resources import BaseResource @@ -53,7 +55,7 @@ class BackupAccountResource(BaseResource): self._authenticator.bonafide_session, self.soledad(request), self._service(request, '_leap_session').smtp_config, - self.get_backup_email(request)) + self._get_backup_email(request)) def update_response(response): request.setResponseCode(NO_CONTENT) @@ -66,3 +68,6 @@ class BackupAccountResource(BaseResource): d = account_recovery.update_recovery_code() d.addCallbacks(update_response, error_response) return NOT_DONE_YET + + def _get_backup_email(self, request): + return json.loads(request.content.getvalue()).get('backupEmail') -- cgit v1.2.3