def test_email_unsubscribe_code_parse(self): email = 'nobody@mozîlla.org' token, hash_ = UnsubscribeCode.create(email) r_email = UnsubscribeCode.parse(token, hash_) assert email == r_email # A bad token or hash raises ValueError self.assertRaises(ValueError, UnsubscribeCode.parse, token, hash_[:-5]) self.assertRaises(ValueError, UnsubscribeCode.parse, token[5:], hash_)
def test_correct_url_update_notification(self): # Make sure the user is subscribed perm_setting = email.NOTIFICATIONS[0] un = UserNotification.objects.create(notification_id=perm_setting.id, user=self.user, enabled=True) # Create a URL token, hash = UnsubscribeCode.create(self.user.email) url = reverse('users.unsubscribe', args=[token, hash, perm_setting.short]) # Load the URL r = self.client.get(url) doc = pq(r.content) # Check that it was successful assert doc('#unsubscribe-success').length assert doc('#standalone').length assert doc('#standalone ul li').length == 1 # Make sure the user is unsubscribed un = UserNotification.objects.filter(notification_id=perm_setting.id, user=self.user) assert un.count() == 1 assert not un.all()[0].enabled
def test_wrong_url(self): perm_setting = email.NOTIFICATIONS[0] token, hash = UnsubscribeCode.create(self.user.email) hash = hash[::-1] # Reverse the hash, so it's wrong url = reverse('users.unsubscribe', args=[token, hash, perm_setting.short]) r = self.client.get(url) doc = pq(r.content) assert doc('#unsubscribe-fail').length == 1
def authenticate(self, request): try: email = UnsubscribeCode.parse(request.data.get('token'), request.data.get('hash')) user = UserProfile.objects.get(email=email) except ValueError: raise exceptions.AuthenticationFailed( gettext('Invalid token or hash.')) except UserProfile.DoesNotExist: raise exceptions.AuthenticationFailed( gettext('Email address not found.')) return (user, None)
def test_email_unsubscribe_code_parse(): email = 'nobody@mozîlla.org' token, hash_ = UnsubscribeCode.create(email) r_email = UnsubscribeCode.parse(token, hash_) assert email == r_email # A bad token or hash raises ValueError with pytest.raises(ValueError): UnsubscribeCode.parse(token, hash_[:-5]) with pytest.raises(ValueError): UnsubscribeCode.parse(token[5:], hash_)
if async: return send_email.delay(*args, **kwargs) else: return send_email(*args, **kwargs) if white_list: if perm_setting: html_template = loader.get_template('amo/emails/unsubscribe.html') text_template = loader.get_template('amo/emails/unsubscribe.ltxt') if not manage_url: manage_url = urlparams( absolutify(reverse('users.edit', add_prefix=False)), 'acct-notify') for recipient in white_list: # Add unsubscribe link to footer. token, hash = UnsubscribeCode.create(recipient) unsubscribe_url = absolutify( reverse('users.unsubscribe', args=[token, hash, perm_setting.short], add_prefix=False)) context_options = { 'message': message, 'manage_url': manage_url, 'unsubscribe_url': unsubscribe_url, 'perm_setting': perm_setting.label, 'SITE_URL': settings.SITE_URL, 'mandatory': perm_setting.mandatory, } # Render this template in the default locale until # bug 635840 is fixed.
if async: return send_email.delay(*args, **kwargs) else: return send_email(*args, **kwargs) if white_list: if perm_setting: html_template = loader.get_template('amo/emails/unsubscribe.html') text_template = loader.get_template('amo/emails/unsubscribe.ltxt') if not manage_url: manage_url = urlparams(absolutify( reverse('users.edit', add_prefix=False)), 'acct-notify') for recipient in white_list: # Add unsubscribe link to footer. token, hash = UnsubscribeCode.create(recipient) unsubscribe_url = absolutify( reverse('users.unsubscribe', args=[token, hash, perm_setting.short], add_prefix=False)) context_options = { 'message': message, 'manage_url': manage_url, 'unsubscribe_url': unsubscribe_url, 'perm_setting': perm_setting.label, 'SITE_URL': settings.SITE_URL, 'mandatory': perm_setting.mandatory, } # Render this template in the default locale until # bug 635840 is fixed.
def send_mail(subject, message, from_email=None, recipient_list=None, use_deny_list=True, perm_setting=None, manage_url=None, headers=None, cc=None, real_email=False, html_message=None, attachments=None, max_retries=3, reply_to=None, countdown=None): """ A wrapper around django.core.mail.EmailMessage. Adds deny checking and error logging. """ from olympia.amo.templatetags.jinja_helpers import absolutify from olympia.amo.tasks import send_email from olympia.users import notifications if not recipient_list: return True if isinstance(recipient_list, str): raise ValueError('recipient_list should be a list, not a string.') # Check against user notification settings if perm_setting: if isinstance(perm_setting, str): perm_setting = notifications.NOTIFICATIONS_BY_SHORT[perm_setting] perms = dict(UserNotification.objects .filter(user__email__in=recipient_list, notification_id=perm_setting.id) .values_list('user__email', 'enabled')) d = perm_setting.default_checked recipient_list = [e for e in recipient_list if e and perms.setdefault(e, d)] # Prune denied emails. if use_deny_list: white_list = [] for email in recipient_list: if email and email.lower() in settings.EMAIL_DENY_LIST: log.info('Blacklisted email removed from list: %s' % email) else: white_list.append(email) else: white_list = recipient_list if not from_email: from_email = settings.DEFAULT_FROM_EMAIL if cc: # If not str, assume it is already a list. if isinstance(cc, str): cc = [cc] if not headers: headers = {} # Avoid auto-replies per rfc 3834 and the Microsoft variant headers['X-Auto-Response-Suppress'] = 'RN, NRN, OOF, AutoReply' headers['Auto-Submitted'] = 'auto-generated' def send(recipients, message, **options): kwargs = { 'attachments': attachments, 'cc': cc, 'from_email': from_email, 'headers': headers, 'html_message': html_message, 'max_retries': max_retries, 'real_email': real_email, 'reply_to': reply_to, 'countdown': countdown, } kwargs.update(options) # Email subject *must not* contain newlines args = (list(recipients), ' '.join(subject.splitlines()), message) return send_email.delay(*args, **kwargs) if white_list: if perm_setting: html_template = loader.get_template('amo/emails/unsubscribe.html') text_template = loader.get_template('amo/emails/unsubscribe.ltxt') if not manage_url: manage_url = urlparams(absolutify( reverse('users.edit', add_prefix=False)), 'acct-notify') for recipient in white_list: # Add unsubscribe link to footer. token, hash = UnsubscribeCode.create(recipient) unsubscribe_url = absolutify( reverse('users.unsubscribe', args=[force_text(token), hash, perm_setting.short], add_prefix=False)) context = { 'message': message, 'manage_url': manage_url, 'unsubscribe_url': unsubscribe_url, 'perm_setting': perm_setting.label, 'SITE_URL': settings.SITE_URL, 'mandatory': perm_setting.mandatory, } # Render this template in the default locale until # bug 635840 is fixed. with translation.override(settings.LANGUAGE_CODE): message_with_unsubscribe = text_template.render(context) if html_message: context['message'] = html_message with translation.override(settings.LANGUAGE_CODE): html_with_unsubscribe = html_template.render(context) result = send([recipient], message_with_unsubscribe, html_message=html_with_unsubscribe, attachments=attachments) else: result = send([recipient], message_with_unsubscribe, attachments=attachments) else: result = send(recipient_list, message=message, html_message=html_message, attachments=attachments) else: result = True return result
def send_mail(subject, message, from_email=None, recipient_list=None, use_deny_list=True, perm_setting=None, manage_url=None, headers=None, cc=None, real_email=False, html_message=None, attachments=None, max_retries=3, reply_to=None): """ A wrapper around django.core.mail.EmailMessage. Adds deny checking and error logging. """ from olympia.amo.templatetags.jinja_helpers import absolutify from olympia.amo.tasks import send_email from olympia.users import notifications if not recipient_list: return True if isinstance(recipient_list, six.string_types): raise ValueError('recipient_list should be a list, not a string.') # Check against user notification settings if perm_setting: if isinstance(perm_setting, six.string_types): perm_setting = notifications.NOTIFICATIONS_BY_SHORT[perm_setting] perms = dict(UserNotification.objects .filter(user__email__in=recipient_list, notification_id=perm_setting.id) .values_list('user__email', 'enabled')) d = perm_setting.default_checked recipient_list = [e for e in recipient_list if e and perms.setdefault(e, d)] # Prune denied emails. if use_deny_list: white_list = [] for email in recipient_list: if email and email.lower() in settings.EMAIL_DENY_LIST: log.debug('Blacklisted email removed from list: %s' % email) else: white_list.append(email) else: white_list = recipient_list if not from_email: from_email = settings.DEFAULT_FROM_EMAIL if cc: # If not six.string_types, assume it is already a list. if isinstance(cc, six.string_types): cc = [cc] if not headers: headers = {} # Avoid auto-replies per rfc 3834 and the Microsoft variant headers['X-Auto-Response-Suppress'] = 'RN, NRN, OOF, AutoReply' headers['Auto-Submitted'] = 'auto-generated' def send(recipients, message, **options): kwargs = { 'attachments': attachments, 'cc': cc, 'from_email': from_email, 'headers': headers, 'html_message': html_message, 'max_retries': max_retries, 'real_email': real_email, 'reply_to': reply_to, } kwargs.update(options) # Email subject *must not* contain newlines args = (list(recipients), ' '.join(subject.splitlines()), message) return send_email.delay(*args, **kwargs) if white_list: if perm_setting: html_template = loader.get_template('amo/emails/unsubscribe.html') text_template = loader.get_template('amo/emails/unsubscribe.ltxt') if not manage_url: manage_url = urlparams(absolutify( reverse('users.edit', add_prefix=False)), 'acct-notify') for recipient in white_list: # Add unsubscribe link to footer. token, hash = UnsubscribeCode.create(recipient) unsubscribe_url = absolutify( reverse('users.unsubscribe', args=[force_text(token), hash, perm_setting.short], add_prefix=False)) context = { 'message': message, 'manage_url': manage_url, 'unsubscribe_url': unsubscribe_url, 'perm_setting': perm_setting.label, 'SITE_URL': settings.SITE_URL, 'mandatory': perm_setting.mandatory, } # Render this template in the default locale until # bug 635840 is fixed. with translation.override(settings.LANGUAGE_CODE): message_with_unsubscribe = text_template.render(context) if html_message: context['message'] = html_message with translation.override(settings.LANGUAGE_CODE): html_with_unsubscribe = html_template.render(context) result = send([recipient], message_with_unsubscribe, html_message=html_with_unsubscribe, attachments=attachments) else: result = send([recipient], message_with_unsubscribe, attachments=attachments) else: result = send(recipient_list, message=message, html_message=html_message, attachments=attachments) else: result = True return result