mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			148 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.conf import settings
 | 
						|
from django.core import mail
 | 
						|
from django.contrib.auth.signals import user_logged_in
 | 
						|
from zerver.lib.test_classes import ZulipTestCase
 | 
						|
from zerver.signals import get_device_browser, get_device_os
 | 
						|
from zerver.lib.actions import notify_new_user
 | 
						|
from zerver.models import Recipient, Stream
 | 
						|
from zerver.lib.initial_password import initial_password
 | 
						|
 | 
						|
class SendLoginEmailTest(ZulipTestCase):
 | 
						|
    """
 | 
						|
    Uses django's user_logged_in signal to send emails on new login.
 | 
						|
 | 
						|
    The receiver handler for this signal is always registered in production,
 | 
						|
    development and testing, but emails are only sent based on SEND_LOGIN_EMAILS setting.
 | 
						|
 | 
						|
    SEND_LOGIN_EMAILS is set to true in default settings.
 | 
						|
    It is turned off during testing.
 | 
						|
    """
 | 
						|
 | 
						|
    def test_send_login_emails_if_send_login_email_setting_is_true(self):
 | 
						|
        # type: () -> None
 | 
						|
        with self.settings(SEND_LOGIN_EMAILS=True):
 | 
						|
            self.assertTrue(settings.SEND_LOGIN_EMAILS)
 | 
						|
            # we don't use the self.login method since we spoof the user-agent
 | 
						|
            email = self.example_email('hamlet')
 | 
						|
            password = initial_password(email)
 | 
						|
            firefox_windows = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
 | 
						|
            self.client_post("/accounts/login/", info={"username": email, "password": password},
 | 
						|
                             HTTP_USER_AGENT=firefox_windows)
 | 
						|
 | 
						|
            # email is sent and correct subject
 | 
						|
            self.assertEqual(len(mail.outbox), 1)
 | 
						|
            subject = 'New login from Firefox on Windows'
 | 
						|
            self.assertEqual(mail.outbox[0].subject, subject)
 | 
						|
 | 
						|
    def test_dont_send_login_emails_if_send_login_emails_is_false(self):
 | 
						|
        # type: () -> None
 | 
						|
        self.assertFalse(settings.SEND_LOGIN_EMAILS)
 | 
						|
        email = self.example_email('hamlet')
 | 
						|
        self.login(email)
 | 
						|
 | 
						|
        self.assertEqual(len(mail.outbox), 0)
 | 
						|
 | 
						|
    def test_dont_send_login_emails_for_new_user_registration_logins(self):
 | 
						|
        # type: () -> None
 | 
						|
        with self.settings(SEND_LOGIN_EMAILS=True):
 | 
						|
            self.register("test@zulip.com", "test")
 | 
						|
 | 
						|
            # Verify that there's just 1 email for new user registration.
 | 
						|
            self.assertEqual(mail.outbox[0].subject, "Activate your Zulip account")
 | 
						|
            self.assertEqual(len(mail.outbox), 1)
 | 
						|
 | 
						|
    def test_without_path_info_dont_send_login_emails_for_new_user_registration_logins(self):
 | 
						|
        # type: () -> None
 | 
						|
        with self.settings(SEND_LOGIN_EMAILS=True):
 | 
						|
            self.client_post('/accounts/home/', {'email': "orange@zulip.com"})
 | 
						|
            self.submit_reg_form_for_user("orange@zulip.com", "orange", PATH_INFO='')
 | 
						|
 | 
						|
            for email in mail.outbox:
 | 
						|
                subject = 'New login from an unknown browser on an unknown operating system'
 | 
						|
                self.assertNotEqual(email.subject, subject)
 | 
						|
 | 
						|
class TestBrowserAndOsUserAgentStrings(ZulipTestCase):
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        # type: () -> None
 | 
						|
        self.user_agents = [
 | 
						|
            ('mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) ' +
 | 
						|
                'Chrome/54.0.2840.59 Safari/537.36', 'Chrome', 'Linux',),
 | 
						|
            ('mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) ' +
 | 
						|
                'chrome/56.0.2924.87 safari/537.36', 'Chrome', 'Windows',),
 | 
						|
            ('mozilla/5.0 (windows nt 6.1; wow64; rv:51.0) ' +
 | 
						|
                'gecko/20100101 firefox/51.0', 'Firefox', 'Windows',),
 | 
						|
            ('mozilla/5.0 (windows nt 6.1; wow64; trident/7.0; rv:11.0) ' +
 | 
						|
                'like gecko', 'Internet Explorer', 'Windows'),
 | 
						|
            ('Mozilla/5.0 (Android; Mobile; rv:27.0) ' +
 | 
						|
                'Gecko/27.0 Firefox/27.0', 'Firefox', 'Android'),
 | 
						|
            ('Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) ' +
 | 
						|
                'AppleWebKit/536.26 (KHTML, like Gecko) ' +
 | 
						|
                'Version/6.0 Mobile/10B329 Safari/8536.25', 'Safari', 'iOS'),
 | 
						|
            ('Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) ' +
 | 
						|
                'AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B350', None, 'iOS'),
 | 
						|
            ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) ' +
 | 
						|
                'AppleWebKit/537.36 (KHTML, like Gecko) ' +
 | 
						|
                'Chrome/56.0.2924.87 Safari/537.36', 'Chrome', 'macOS'),
 | 
						|
            ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) ' +
 | 
						|
                'AppleWebKit/602.3.12 (KHTML, like Gecko) ' +
 | 
						|
                'Version/10.0.2 Safari/602.3.12', 'Safari', 'macOS'),
 | 
						|
            ('ZulipAndroid/1.0', 'Zulip', 'Android'),
 | 
						|
            ('ZulipMobile/1.0.12 (Android 7.1.1)', 'Zulip', 'Android'),
 | 
						|
            ('ZulipMobile/0.7.1.1 (iOS 10.3.1)', 'Zulip', 'iOS'),
 | 
						|
            ('ZulipElectron/1.1.0-beta Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' +
 | 
						|
             'AppleWebKit/537.36 (KHTML, like Gecko) Zulip/1.1.0-beta ' +
 | 
						|
             'Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36', 'Zulip', 'Windows'),
 | 
						|
            ('Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, '
 | 
						|
             'like Gecko) Ubuntu/11.10 Chromium/16.0.912.77 '
 | 
						|
             'Chrome/16.0.912.77 Safari/535.7', 'Chromium', 'Linux'),
 | 
						|
            ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
 | 
						|
             '(KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 '
 | 
						|
             'OPR/15.0.1147.100', 'Opera', 'Windows'),
 | 
						|
            ('Mozilla/5.0 (Windows NT 10.0; <64-bit tags>) AppleWebKit/'
 | 
						|
             '<WebKit Rev> (KHTML, like Gecko) Chrome/<Chrome Rev> Safari'
 | 
						|
             '/<WebKit Rev> Edge/<EdgeHTML Rev>.'
 | 
						|
             '<Windows Build>', 'Edge', 'Windows'),
 | 
						|
            ('', None, None),
 | 
						|
        ]
 | 
						|
 | 
						|
    def test_get_browser_on_new_login(self):
 | 
						|
        # type: () -> None
 | 
						|
        for user_agent in self.user_agents:
 | 
						|
            device_browser = get_device_browser(user_agent[0])
 | 
						|
            self.assertEqual(device_browser, user_agent[1])
 | 
						|
 | 
						|
    def test_get_os_on_new_login(self):
 | 
						|
        # type: () -> None
 | 
						|
        for user_agent in self.user_agents:
 | 
						|
            device_os = get_device_os(user_agent[0])
 | 
						|
            self.assertEqual(device_os, user_agent[2])
 | 
						|
 | 
						|
 | 
						|
class TestNotifyNewUser(ZulipTestCase):
 | 
						|
    def test_notify_of_new_user_internally(self):
 | 
						|
        # type: () -> None
 | 
						|
        new_user = self.example_user('cordelia')
 | 
						|
        self.make_stream('signups')
 | 
						|
        notify_new_user(new_user, internal=True)
 | 
						|
 | 
						|
        message = self.get_last_message()
 | 
						|
        actual_stream = Stream.objects.get(id=message.recipient.type_id)
 | 
						|
        self.assertEqual(actual_stream.name, 'signups')
 | 
						|
        self.assertEqual(message.recipient.type, Recipient.STREAM)
 | 
						|
        self.assertIn("**INTERNAL SIGNUP**", message.content)
 | 
						|
 | 
						|
    def test_notify_realm_of_new_user(self):
 | 
						|
        # type: () -> None
 | 
						|
        new_user = self.example_user('cordelia')
 | 
						|
        stream = self.make_stream('announce')
 | 
						|
        new_user.realm.notifications_stream = stream
 | 
						|
        new_user.realm.save()
 | 
						|
        new_user = self.example_user('cordelia')
 | 
						|
        notify_new_user(new_user)
 | 
						|
 | 
						|
        message = self.get_last_message()
 | 
						|
        self.assertEqual(message.recipient.type, Recipient.STREAM)
 | 
						|
        actual_stream = Stream.objects.get(id=message.recipient.type_id)
 | 
						|
        self.assertEqual(actual_stream.name, 'announce')
 |