mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	mypy: Update zerver directory to use Text
This commit is contained in:
		@@ -29,8 +29,7 @@ from io import BytesIO
 | 
				
			|||||||
from zerver.lib.mandrill_client import get_mandrill_client
 | 
					from zerver.lib.mandrill_client import get_mandrill_client
 | 
				
			||||||
from six.moves import zip, urllib
 | 
					from six.moves import zip, urllib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from six import text_type
 | 
					from typing import Union, Any, Callable, Sequence, Dict, Optional, TypeVar, Text
 | 
				
			||||||
from typing import Union, Any, Callable, Sequence, Dict, Optional, TypeVar
 | 
					 | 
				
			||||||
from zerver.lib.str_utils import force_bytes
 | 
					from zerver.lib.str_utils import force_bytes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if settings.ZILENCER_ENABLED:
 | 
					if settings.ZILENCER_ENABLED:
 | 
				
			||||||
@@ -44,7 +43,7 @@ FuncT = TypeVar('FuncT', bound=Callable[..., Any])
 | 
				
			|||||||
ViewFuncT = TypeVar('ViewFuncT', bound=Callable[..., HttpResponse])
 | 
					ViewFuncT = TypeVar('ViewFuncT', bound=Callable[..., HttpResponse])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_deployment_or_userprofile(role):
 | 
					def get_deployment_or_userprofile(role):
 | 
				
			||||||
    # type: (text_type) -> Union[UserProfile, Deployment]
 | 
					    # type: (Text) -> Union[UserProfile, Deployment]
 | 
				
			||||||
    return get_user_profile_by_email(role) if "@" in role else get_deployment_by_domain(role)
 | 
					    return get_user_profile_by_email(role) if "@" in role else get_deployment_by_domain(role)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _RespondAsynchronously(object):
 | 
					class _RespondAsynchronously(object):
 | 
				
			||||||
@@ -120,7 +119,7 @@ def require_realm_admin(func):
 | 
				
			|||||||
from zerver.lib.user_agent import parse_user_agent
 | 
					from zerver.lib.user_agent import parse_user_agent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_client_name(request, is_json_view):
 | 
					def get_client_name(request, is_json_view):
 | 
				
			||||||
    # type: (HttpRequest, bool) -> text_type
 | 
					    # type: (HttpRequest, bool) -> Text
 | 
				
			||||||
    # If the API request specified a client in the request content,
 | 
					    # If the API request specified a client in the request content,
 | 
				
			||||||
    # that has priority.  Otherwise, extract the client from the
 | 
					    # that has priority.  Otherwise, extract the client from the
 | 
				
			||||||
    # User-Agent.
 | 
					    # User-Agent.
 | 
				
			||||||
@@ -150,7 +149,7 @@ def get_client_name(request, is_json_view):
 | 
				
			|||||||
            return "Unspecified"
 | 
					            return "Unspecified"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def process_client(request, user_profile, is_json_view=False, client_name=None):
 | 
					def process_client(request, user_profile, is_json_view=False, client_name=None):
 | 
				
			||||||
    # type: (HttpRequest, UserProfile, bool, Optional[text_type]) -> None
 | 
					    # type: (HttpRequest, UserProfile, bool, Optional[Text]) -> None
 | 
				
			||||||
    if client_name is None:
 | 
					    if client_name is None:
 | 
				
			||||||
        client_name = get_client_name(request, is_json_view)
 | 
					        client_name = get_client_name(request, is_json_view)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -163,7 +162,7 @@ def process_client(request, user_profile, is_json_view=False, client_name=None):
 | 
				
			|||||||
    update_user_activity(request, user_profile)
 | 
					    update_user_activity(request, user_profile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def validate_api_key(request, role, api_key, is_webhook=False):
 | 
					def validate_api_key(request, role, api_key, is_webhook=False):
 | 
				
			||||||
    # type: (HttpRequest, text_type, text_type, bool) -> Union[UserProfile, Deployment]
 | 
					    # type: (HttpRequest, Text, Text, bool) -> Union[UserProfile, Deployment]
 | 
				
			||||||
    # Remove whitespace to protect users from trivial errors.
 | 
					    # Remove whitespace to protect users from trivial errors.
 | 
				
			||||||
    role, api_key = role.strip(), api_key.strip()
 | 
					    role, api_key = role.strip(), api_key.strip()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -204,7 +203,7 @@ def validate_api_key(request, role, api_key, is_webhook=False):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Use this for webhook views that don't get an email passed in.
 | 
					# Use this for webhook views that don't get an email passed in.
 | 
				
			||||||
def api_key_only_webhook_view(client_name):
 | 
					def api_key_only_webhook_view(client_name):
 | 
				
			||||||
    # type: (text_type) ->  Callable[..., HttpResponse]
 | 
					    # type: (Text) ->  Callable[..., HttpResponse]
 | 
				
			||||||
    # This function can't be typed perfectly because returning a generic function
 | 
					    # This function can't be typed perfectly because returning a generic function
 | 
				
			||||||
    # isn't supported in mypy - https://github.com/python/mypy/issues/1551.
 | 
					    # isn't supported in mypy - https://github.com/python/mypy/issues/1551.
 | 
				
			||||||
    def _wrapped_view_func(view_func):
 | 
					    def _wrapped_view_func(view_func):
 | 
				
			||||||
@@ -214,7 +213,7 @@ def api_key_only_webhook_view(client_name):
 | 
				
			|||||||
        @wraps(view_func)
 | 
					        @wraps(view_func)
 | 
				
			||||||
        def _wrapped_func_arguments(request, api_key=REQ(),
 | 
					        def _wrapped_func_arguments(request, api_key=REQ(),
 | 
				
			||||||
                                    *args, **kwargs):
 | 
					                                    *args, **kwargs):
 | 
				
			||||||
            # type: (HttpRequest, text_type, *Any, **Any) -> HttpResponse
 | 
					            # type: (HttpRequest, Text, *Any, **Any) -> HttpResponse
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                user_profile = UserProfile.objects.get(api_key=api_key)
 | 
					                user_profile = UserProfile.objects.get(api_key=api_key)
 | 
				
			||||||
            except UserProfile.DoesNotExist:
 | 
					            except UserProfile.DoesNotExist:
 | 
				
			||||||
@@ -241,7 +240,7 @@ def api_key_only_webhook_view(client_name):
 | 
				
			|||||||
# From Django 1.8, modified to leave off ?next=/
 | 
					# From Django 1.8, modified to leave off ?next=/
 | 
				
			||||||
def redirect_to_login(next, login_url=None,
 | 
					def redirect_to_login(next, login_url=None,
 | 
				
			||||||
                      redirect_field_name=REDIRECT_FIELD_NAME):
 | 
					                      redirect_field_name=REDIRECT_FIELD_NAME):
 | 
				
			||||||
    # type: (text_type, Optional[text_type], text_type) -> HttpResponseRedirect
 | 
					    # type: (Text, Optional[Text], Text) -> HttpResponseRedirect
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Redirects the user to the login page, passing the given 'next' page
 | 
					    Redirects the user to the login page, passing the given 'next' page
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
@@ -259,7 +258,7 @@ def redirect_to_login(next, login_url=None,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# From Django 1.8
 | 
					# From Django 1.8
 | 
				
			||||||
def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
 | 
					def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
 | 
				
			||||||
    # type: (Callable[[UserProfile], bool], Optional[text_type], text_type) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]]
 | 
					    # type: (Callable[[UserProfile], bool], Optional[Text], Text) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]]
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Decorator for views that checks that the user passes the given test,
 | 
					    Decorator for views that checks that the user passes the given test,
 | 
				
			||||||
    redirecting to the log-in page if necessary. The test should be a callable
 | 
					    redirecting to the log-in page if necessary. The test should be a callable
 | 
				
			||||||
@@ -300,7 +299,7 @@ def logged_in_and_active(request):
 | 
				
			|||||||
def zulip_login_required(function=None,
 | 
					def zulip_login_required(function=None,
 | 
				
			||||||
                         redirect_field_name=REDIRECT_FIELD_NAME,
 | 
					                         redirect_field_name=REDIRECT_FIELD_NAME,
 | 
				
			||||||
                         login_url=settings.HOME_NOT_LOGGED_IN):
 | 
					                         login_url=settings.HOME_NOT_LOGGED_IN):
 | 
				
			||||||
    # type: (Optional[Callable[..., HttpResponse]], text_type, text_type) -> Union[Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]], Callable[..., HttpResponse]]
 | 
					    # type: (Optional[Callable[..., HttpResponse]], Text, Text) -> Union[Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]], Callable[..., HttpResponse]]
 | 
				
			||||||
    actual_decorator = user_passes_test(
 | 
					    actual_decorator = user_passes_test(
 | 
				
			||||||
        logged_in_and_active,
 | 
					        logged_in_and_active,
 | 
				
			||||||
        login_url=login_url,
 | 
					        login_url=login_url,
 | 
				
			||||||
@@ -340,7 +339,7 @@ def authenticated_api_view(is_webhook=False):
 | 
				
			|||||||
        def _wrapped_func_arguments(request, email=REQ(), api_key=REQ(default=None),
 | 
					        def _wrapped_func_arguments(request, email=REQ(), api_key=REQ(default=None),
 | 
				
			||||||
                                    api_key_legacy=REQ('api-key', default=None),
 | 
					                                    api_key_legacy=REQ('api-key', default=None),
 | 
				
			||||||
                                    *args, **kwargs):
 | 
					                                    *args, **kwargs):
 | 
				
			||||||
            # type: (HttpRequest, text_type, Optional[text_type], Optional[text_type], *Any, **Any) -> HttpResponse
 | 
					            # type: (HttpRequest, Text, Optional[Text], Optional[Text], *Any, **Any) -> HttpResponse
 | 
				
			||||||
            if not api_key and not api_key_legacy:
 | 
					            if not api_key and not api_key_legacy:
 | 
				
			||||||
                raise RequestVariableMissingError("api_key")
 | 
					                raise RequestVariableMissingError("api_key")
 | 
				
			||||||
            elif not api_key:
 | 
					            elif not api_key:
 | 
				
			||||||
@@ -478,7 +477,7 @@ def authenticated_json_view(view_func):
 | 
				
			|||||||
    return _wrapped_view_func # type: ignore # https://github.com/python/mypy/issues/1927
 | 
					    return _wrapped_view_func # type: ignore # https://github.com/python/mypy/issues/1927
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def is_local_addr(addr):
 | 
					def is_local_addr(addr):
 | 
				
			||||||
    # type: (text_type) -> bool
 | 
					    # type: (Text) -> bool
 | 
				
			||||||
    return addr in ('127.0.0.1', '::1')
 | 
					    return addr in ('127.0.0.1', '::1')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# These views are used by the main Django server to notify the Tornado server
 | 
					# These views are used by the main Django server to notify the Tornado server
 | 
				
			||||||
@@ -518,14 +517,14 @@ def internal_notify_view(view_func):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Converter functions for use with has_request_variables
 | 
					# Converter functions for use with has_request_variables
 | 
				
			||||||
def to_non_negative_int(s):
 | 
					def to_non_negative_int(s):
 | 
				
			||||||
    # type: (text_type) -> int
 | 
					    # type: (Text) -> int
 | 
				
			||||||
    x = int(s)
 | 
					    x = int(s)
 | 
				
			||||||
    if x < 0:
 | 
					    if x < 0:
 | 
				
			||||||
        raise ValueError("argument is negative")
 | 
					        raise ValueError("argument is negative")
 | 
				
			||||||
    return x
 | 
					    return x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def flexible_boolean(boolean):
 | 
					def flexible_boolean(boolean):
 | 
				
			||||||
    # type: (text_type) -> bool
 | 
					    # type: (Text) -> bool
 | 
				
			||||||
    """Returns True for any of "1", "true", or "True".  Returns False otherwise."""
 | 
					    """Returns True for any of "1", "true", or "True".  Returns False otherwise."""
 | 
				
			||||||
    if boolean in ("1", "true", "True"):
 | 
					    if boolean in ("1", "true", "True"):
 | 
				
			||||||
        return True
 | 
					        return True
 | 
				
			||||||
@@ -533,7 +532,7 @@ def flexible_boolean(boolean):
 | 
				
			|||||||
        return False
 | 
					        return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def statsd_increment(counter, val=1):
 | 
					def statsd_increment(counter, val=1):
 | 
				
			||||||
    # type: (text_type, int) -> Callable[[Callable[..., Any]], Callable[..., Any]]
 | 
					    # type: (Text, int) -> Callable[[Callable[..., Any]], Callable[..., Any]]
 | 
				
			||||||
    """Increments a statsd counter on completion of the
 | 
					    """Increments a statsd counter on completion of the
 | 
				
			||||||
    decorated function.
 | 
					    decorated function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -550,7 +549,7 @@ def statsd_increment(counter, val=1):
 | 
				
			|||||||
    return wrapper
 | 
					    return wrapper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def rate_limit_user(request, user, domain):
 | 
					def rate_limit_user(request, user, domain):
 | 
				
			||||||
    # type: (HttpRequest, UserProfile, text_type) -> None
 | 
					    # type: (HttpRequest, UserProfile, Text) -> None
 | 
				
			||||||
    """Returns whether or not a user was rate limited. Will raise a RateLimited exception
 | 
					    """Returns whether or not a user was rate limited. Will raise a RateLimited exception
 | 
				
			||||||
    if the user has been rate limited, otherwise returns and modifies request to contain
 | 
					    if the user has been rate limited, otherwise returns and modifies request to contain
 | 
				
			||||||
    the rate limit information"""
 | 
					    the rate limit information"""
 | 
				
			||||||
@@ -571,7 +570,7 @@ def rate_limit_user(request, user, domain):
 | 
				
			|||||||
    request._ratelimit_secs_to_freedom = time_reset
 | 
					    request._ratelimit_secs_to_freedom = time_reset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def rate_limit(domain='all'):
 | 
					def rate_limit(domain='all'):
 | 
				
			||||||
    # type: (text_type) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]]
 | 
					    # type: (Text) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]]
 | 
				
			||||||
    """Rate-limits a view. Takes an optional 'domain' param if you wish to rate limit different
 | 
					    """Rate-limits a view. Takes an optional 'domain' param if you wish to rate limit different
 | 
				
			||||||
    types of API calls independently.
 | 
					    types of API calls independently.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,8 +22,7 @@ import logging
 | 
				
			|||||||
import re
 | 
					import re
 | 
				
			||||||
import DNS
 | 
					import DNS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from six import text_type
 | 
					from typing import Any, Callable, Optional, Text
 | 
				
			||||||
from typing import Any, Callable, Optional
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
MIT_VALIDATION_ERROR = u'That user does not exist at MIT or is a ' + \
 | 
					MIT_VALIDATION_ERROR = u'That user does not exist at MIT or is a ' + \
 | 
				
			||||||
                       u'<a href="https://ist.mit.edu/email-lists">mailing list</a>. ' + \
 | 
					                       u'<a href="https://ist.mit.edu/email-lists">mailing list</a>. ' + \
 | 
				
			||||||
@@ -34,14 +33,14 @@ WRONG_SUBDOMAIN_ERROR = "Your Zulip account is not a member of the " + \
 | 
				
			|||||||
                        "Please contact %s with any questions!" % (settings.ZULIP_ADMINISTRATOR,)
 | 
					                        "Please contact %s with any questions!" % (settings.ZULIP_ADMINISTRATOR,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_registration_string(domain):
 | 
					def get_registration_string(domain):
 | 
				
			||||||
    # type: (text_type) -> text_type
 | 
					    # type: (Text) -> Text
 | 
				
			||||||
    register_url  = reverse('register') + domain
 | 
					    register_url  = reverse('register') + domain
 | 
				
			||||||
    register_account_string = _('The organization with the domain already exists. '
 | 
					    register_account_string = _('The organization with the domain already exists. '
 | 
				
			||||||
                                'Please register your account <a href=%(url)s>here</a>.') % {'url': register_url}
 | 
					                                'Please register your account <a href=%(url)s>here</a>.') % {'url': register_url}
 | 
				
			||||||
    return register_account_string
 | 
					    return register_account_string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def email_is_not_mit_mailing_list(email):
 | 
					def email_is_not_mit_mailing_list(email):
 | 
				
			||||||
    # type: (text_type) -> None
 | 
					    # type: (Text) -> None
 | 
				
			||||||
    """Prevent MIT mailing lists from signing up for Zulip"""
 | 
					    """Prevent MIT mailing lists from signing up for Zulip"""
 | 
				
			||||||
    if "@mit.edu" in email:
 | 
					    if "@mit.edu" in email:
 | 
				
			||||||
        username = email.rsplit("@", 1)[0]
 | 
					        username = email.rsplit("@", 1)[0]
 | 
				
			||||||
@@ -143,7 +142,7 @@ class HomepageForm(forms.Form):
 | 
				
			|||||||
        return email
 | 
					        return email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def email_is_not_disposable(email):
 | 
					def email_is_not_disposable(email):
 | 
				
			||||||
    # type: (text_type) -> None
 | 
					    # type: (Text) -> None
 | 
				
			||||||
    if is_disposable_domain(email_to_domain(email)):
 | 
					    if is_disposable_domain(email_to_domain(email)):
 | 
				
			||||||
        raise ValidationError(_("Please use your real email address."))
 | 
					        raise ValidationError(_("Please use your real email address."))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,6 @@ import os
 | 
				
			|||||||
import os.path
 | 
					import os.path
 | 
				
			||||||
import hashlib
 | 
					import hashlib
 | 
				
			||||||
import six
 | 
					import six
 | 
				
			||||||
from six import text_type
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
if False:
 | 
					if False:
 | 
				
			||||||
    from zerver.models import UserProfile, Realm, Message
 | 
					    from zerver.models import UserProfile, Realm, Message
 | 
				
			||||||
@@ -79,7 +78,7 @@ def get_or_create_key_prefix():
 | 
				
			|||||||
    filename = os.path.join(settings.DEPLOY_ROOT, "var", "remote_cache_prefix")
 | 
					    filename = os.path.join(settings.DEPLOY_ROOT, "var", "remote_cache_prefix")
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_RDWR, 0o444)
 | 
					        fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_RDWR, 0o444)
 | 
				
			||||||
        random_hash = hashlib.sha256(text_type(random.getrandbits(256)).encode('utf-8')).digest()
 | 
					        random_hash = hashlib.sha256(Text(random.getrandbits(256)).encode('utf-8')).digest()
 | 
				
			||||||
        prefix = base64.b16encode(random_hash)[:32].decode('utf-8').lower() + ':'
 | 
					        prefix = base64.b16encode(random_hash)[:32].decode('utf-8').lower() + ':'
 | 
				
			||||||
        # This does close the underlying file
 | 
					        # This does close the underlying file
 | 
				
			||||||
        with os.fdopen(fd, 'w') as f:
 | 
					        with os.fdopen(fd, 'w') as f:
 | 
				
			||||||
@@ -107,7 +106,7 @@ KEY_PREFIX = get_or_create_key_prefix() # type: Text
 | 
				
			|||||||
def bounce_key_prefix_for_testing(test_name):
 | 
					def bounce_key_prefix_for_testing(test_name):
 | 
				
			||||||
    # type: (Text) -> None
 | 
					    # type: (Text) -> None
 | 
				
			||||||
    global KEY_PREFIX
 | 
					    global KEY_PREFIX
 | 
				
			||||||
    KEY_PREFIX = test_name + u':' + text_type(os.getpid()) + u':'
 | 
					    KEY_PREFIX = test_name + u':' + Text(os.getpid()) + u':'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_cache_backend(cache_name):
 | 
					def get_cache_backend(cache_name):
 | 
				
			||||||
    # type: (Optional[str]) -> BaseCache
 | 
					    # type: (Optional[str]) -> BaseCache
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,7 +56,7 @@ import time
 | 
				
			|||||||
import ujson
 | 
					import ujson
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
from six.moves import urllib
 | 
					from six.moves import urllib
 | 
				
			||||||
from six import text_type, binary_type
 | 
					from six import binary_type
 | 
				
			||||||
from zerver.lib.str_utils import NonBinaryStr
 | 
					from zerver.lib.str_utils import NonBinaryStr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from contextlib import contextmanager
 | 
					from contextlib import contextmanager
 | 
				
			||||||
@@ -250,7 +250,7 @@ class ZulipTestCase(TestCase):
 | 
				
			|||||||
            user_profile=user_profile,
 | 
					            user_profile=user_profile,
 | 
				
			||||||
            active=True,
 | 
					            active=True,
 | 
				
			||||||
            recipient__type=Recipient.STREAM)
 | 
					            recipient__type=Recipient.STREAM)
 | 
				
			||||||
        return [cast(text_type, get_display_recipient(sub.recipient)) for sub in subs]
 | 
					        return [cast(Text, get_display_recipient(sub.recipient)) for sub in subs]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def send_message(self, sender_name, raw_recipients, message_type,
 | 
					    def send_message(self, sender_name, raw_recipients, message_type,
 | 
				
			||||||
                     content=u"test content", subject=u"test", **kwargs):
 | 
					                     content=u"test content", subject=u"test", **kwargs):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
from __future__ import absolute_import
 | 
					from __future__ import absolute_import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from six import text_type, binary_type
 | 
					from six import binary_type
 | 
				
			||||||
from typing import Any, AnyStr, Callable, Iterable, MutableMapping, Optional
 | 
					from typing import Any, AnyStr, Callable, Iterable, MutableMapping, Optional, Text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
from django.utils.translation import ugettext as _
 | 
					from django.utils.translation import ugettext as _
 | 
				
			||||||
@@ -85,7 +85,7 @@ def format_timedelta(timedelta):
 | 
				
			|||||||
    return "%.0fms" % (timedelta_ms(timedelta),)
 | 
					    return "%.0fms" % (timedelta_ms(timedelta),)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def is_slow_query(time_delta, path):
 | 
					def is_slow_query(time_delta, path):
 | 
				
			||||||
    # type: (float, text_type) -> bool
 | 
					    # type: (float, Text) -> bool
 | 
				
			||||||
    if time_delta < 1.2:
 | 
					    if time_delta < 1.2:
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
    is_exempt = \
 | 
					    is_exempt = \
 | 
				
			||||||
@@ -101,7 +101,7 @@ def is_slow_query(time_delta, path):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def write_log_line(log_data, path, method, remote_ip, email, client_name,
 | 
					def write_log_line(log_data, path, method, remote_ip, email, client_name,
 | 
				
			||||||
                   status_code=200, error_content=None, error_content_iter=None):
 | 
					                   status_code=200, error_content=None, error_content_iter=None):
 | 
				
			||||||
    # type: (MutableMapping[str, Any], text_type, str, str, text_type, text_type, int, Optional[AnyStr], Optional[Iterable[AnyStr]]) -> None
 | 
					    # type: (MutableMapping[str, Any], Text, str, str, Text, Text, int, Optional[AnyStr], Optional[Iterable[AnyStr]]) -> None
 | 
				
			||||||
    assert error_content is None or error_content_iter is None
 | 
					    assert error_content is None or error_content_iter is None
 | 
				
			||||||
    if error_content is not None:
 | 
					    if error_content is not None:
 | 
				
			||||||
        error_content_iter = (error_content,)
 | 
					        error_content_iter = (error_content,)
 | 
				
			||||||
@@ -219,7 +219,7 @@ def write_log_line(log_data, path, method, remote_ip, email, client_name,
 | 
				
			|||||||
        error_content_list = list(error_content_iter)
 | 
					        error_content_list = list(error_content_iter)
 | 
				
			||||||
        if error_content_list:
 | 
					        if error_content_list:
 | 
				
			||||||
            error_data = u''
 | 
					            error_data = u''
 | 
				
			||||||
        elif isinstance(error_content_list[0], text_type):
 | 
					        elif isinstance(error_content_list[0], Text):
 | 
				
			||||||
            error_data = u''.join(error_content_list)
 | 
					            error_data = u''.join(error_content_list)
 | 
				
			||||||
        elif isinstance(error_content_list[0], binary_type):
 | 
					        elif isinstance(error_content_list[0], binary_type):
 | 
				
			||||||
            error_data = repr(b''.join(error_content_list))
 | 
					            error_data = repr(b''.join(error_content_list))
 | 
				
			||||||
@@ -308,7 +308,7 @@ class TagRequests(object):
 | 
				
			|||||||
            request.error_format = "HTML"
 | 
					            request.error_format = "HTML"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def csrf_failure(request, reason=""):
 | 
					def csrf_failure(request, reason=""):
 | 
				
			||||||
    # type: (HttpRequest, Optional[text_type]) -> HttpResponse
 | 
					    # type: (HttpRequest, Optional[Text]) -> HttpResponse
 | 
				
			||||||
    if request.error_format == "JSON":
 | 
					    if request.error_format == "JSON":
 | 
				
			||||||
        return json_error(_("CSRF Error: %s") % (reason,), status=403)
 | 
					        return json_error(_("CSRF Error: %s") % (reason,), status=403)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
from zerver.lib.test_classes import WebhookTestCase
 | 
					from zerver.lib.test_classes import WebhookTestCase
 | 
				
			||||||
from six import text_type
 | 
					from typing import Text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PapertrailHookTests(WebhookTestCase):
 | 
					class PapertrailHookTests(WebhookTestCase):
 | 
				
			||||||
    STREAM_NAME = 'papertrail'
 | 
					    STREAM_NAME = 'papertrail'
 | 
				
			||||||
@@ -42,5 +42,5 @@ May 18 20:30:02 abc cron OR server1:
 | 
				
			|||||||
                                          content_type="application/x-www-form-urlencoded")
 | 
					                                          content_type="application/x-www-form-urlencoded")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_body(self, fixture_name):
 | 
					    def get_body(self, fixture_name):
 | 
				
			||||||
        # type: (text_type) -> text_type
 | 
					        # type: (Text) -> Text
 | 
				
			||||||
        return self.fixture_data("papertrail", fixture_name, file_type="json")
 | 
					        return self.fixture_data("papertrail", fixture_name, file_type="json")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
from __future__ import absolute_import
 | 
					from __future__ import absolute_import
 | 
				
			||||||
from typing import cast, AbstractSet, Any, Optional, Iterable, Sequence, Mapping, MutableMapping, Callable, Union
 | 
					from typing import cast, AbstractSet, Any, Optional, Iterable, Sequence, Mapping, MutableMapping, Callable, Union, Text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.utils.translation import ugettext as _
 | 
					from django.utils.translation import ugettext as _
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
@@ -34,7 +34,6 @@ from zerver.lib.timestamp import timestamp_to_datetime
 | 
				
			|||||||
from zerver.tornado.descriptors import clear_descriptor_by_handler_id, set_descriptor_by_handler_id
 | 
					from zerver.tornado.descriptors import clear_descriptor_by_handler_id, set_descriptor_by_handler_id
 | 
				
			||||||
import copy
 | 
					import copy
 | 
				
			||||||
import six
 | 
					import six
 | 
				
			||||||
from six import text_type
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
requests_client = requests.Session()
 | 
					requests_client = requests.Session()
 | 
				
			||||||
for host in ['127.0.0.1', 'localhost']:
 | 
					for host in ['127.0.0.1', 'localhost']:
 | 
				
			||||||
@@ -64,7 +63,7 @@ class ClientDescriptor(object):
 | 
				
			|||||||
    def __init__(self, user_profile_id, user_profile_email, realm_id, event_queue,
 | 
					    def __init__(self, user_profile_id, user_profile_email, realm_id, event_queue,
 | 
				
			||||||
                 event_types, client_type_name, apply_markdown=True,
 | 
					                 event_types, client_type_name, apply_markdown=True,
 | 
				
			||||||
                 all_public_streams=False, lifespan_secs=0, narrow=[]):
 | 
					                 all_public_streams=False, lifespan_secs=0, narrow=[]):
 | 
				
			||||||
        # type: (int, text_type, int, EventQueue, Optional[Sequence[str]], text_type, bool, bool, int, Iterable[Sequence[text_type]]) -> None
 | 
					        # type: (int, Text, int, EventQueue, Optional[Sequence[str]], Text, bool, bool, int, Iterable[Sequence[Text]]) -> None
 | 
				
			||||||
        # These objects are serialized on shutdown and restored on restart.
 | 
					        # These objects are serialized on shutdown and restored on restart.
 | 
				
			||||||
        # If fields are added or semantics are changed, temporary code must be
 | 
					        # If fields are added or semantics are changed, temporary code must be
 | 
				
			||||||
        # added to load_event_queues() to update the restored objects.
 | 
					        # added to load_event_queues() to update the restored objects.
 | 
				
			||||||
@@ -73,7 +72,7 @@ class ClientDescriptor(object):
 | 
				
			|||||||
        self.user_profile_email = user_profile_email
 | 
					        self.user_profile_email = user_profile_email
 | 
				
			||||||
        self.realm_id = realm_id
 | 
					        self.realm_id = realm_id
 | 
				
			||||||
        self.current_handler_id = None # type: Optional[int]
 | 
					        self.current_handler_id = None # type: Optional[int]
 | 
				
			||||||
        self.current_client_name = None # type: Optional[text_type]
 | 
					        self.current_client_name = None # type: Optional[Text]
 | 
				
			||||||
        self.event_queue = event_queue
 | 
					        self.event_queue = event_queue
 | 
				
			||||||
        self.queue_timeout = lifespan_secs
 | 
					        self.queue_timeout = lifespan_secs
 | 
				
			||||||
        self.event_types = event_types
 | 
					        self.event_types = event_types
 | 
				
			||||||
@@ -176,7 +175,7 @@ class ClientDescriptor(object):
 | 
				
			|||||||
                and now - self.last_connection_time >= self.queue_timeout)
 | 
					                and now - self.last_connection_time >= self.queue_timeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def connect_handler(self, handler_id, client_name):
 | 
					    def connect_handler(self, handler_id, client_name):
 | 
				
			||||||
        # type: (int, text_type) -> None
 | 
					        # type: (int, Text) -> None
 | 
				
			||||||
        self.current_handler_id = handler_id
 | 
					        self.current_handler_id = handler_id
 | 
				
			||||||
        self.current_client_name = client_name
 | 
					        self.current_client_name = client_name
 | 
				
			||||||
        set_descriptor_by_handler_id(handler_id, self)
 | 
					        set_descriptor_by_handler_id(handler_id, self)
 | 
				
			||||||
@@ -494,8 +493,8 @@ def fetch_events(query):
 | 
				
			|||||||
    last_event_id = query["last_event_id"] # type: int
 | 
					    last_event_id = query["last_event_id"] # type: int
 | 
				
			||||||
    user_profile_id = query["user_profile_id"] # type: int
 | 
					    user_profile_id = query["user_profile_id"] # type: int
 | 
				
			||||||
    new_queue_data = query.get("new_queue_data") # type: Optional[MutableMapping[str, Any]]
 | 
					    new_queue_data = query.get("new_queue_data") # type: Optional[MutableMapping[str, Any]]
 | 
				
			||||||
    user_profile_email = query["user_profile_email"] # type: text_type
 | 
					    user_profile_email = query["user_profile_email"] # type: Text
 | 
				
			||||||
    client_type_name = query["client_type_name"] # type: text_type
 | 
					    client_type_name = query["client_type_name"] # type: Text
 | 
				
			||||||
    handler_id = query["handler_id"] # type: int
 | 
					    handler_id = query["handler_id"] # type: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
@@ -562,7 +561,7 @@ def extract_json_response(resp):
 | 
				
			|||||||
def request_event_queue(user_profile, user_client, apply_markdown,
 | 
					def request_event_queue(user_profile, user_client, apply_markdown,
 | 
				
			||||||
                        queue_lifespan_secs, event_types=None, all_public_streams=False,
 | 
					                        queue_lifespan_secs, event_types=None, all_public_streams=False,
 | 
				
			||||||
                        narrow=[]):
 | 
					                        narrow=[]):
 | 
				
			||||||
    # type: (UserProfile, Client, bool, int, Optional[Iterable[str]], bool, Iterable[Sequence[text_type]]) -> Optional[str]
 | 
					    # type: (UserProfile, Client, bool, int, Optional[Iterable[str]], bool, Iterable[Sequence[Text]]) -> Optional[str]
 | 
				
			||||||
    if settings.TORNADO_SERVER:
 | 
					    if settings.TORNADO_SERVER:
 | 
				
			||||||
        req = {'dont_block': 'true',
 | 
					        req = {'dont_block': 'true',
 | 
				
			||||||
               'apply_markdown': ujson.dumps(apply_markdown),
 | 
					               'apply_markdown': ujson.dumps(apply_markdown),
 | 
				
			||||||
@@ -648,7 +647,7 @@ def missedmessage_hook(user_profile_id, queue, last_for_client):
 | 
				
			|||||||
            queue_json_publish("missedmessage_emails", notice, lambda notice: None)
 | 
					            queue_json_publish("missedmessage_emails", notice, lambda notice: None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def receiver_is_idle(user_profile_id, realm_presences):
 | 
					def receiver_is_idle(user_profile_id, realm_presences):
 | 
				
			||||||
    # type: (int, Optional[Dict[int, Dict[text_type, Dict[str, Any]]]]) -> bool
 | 
					    # type: (int, Optional[Dict[int, Dict[Text, Dict[str, Any]]]]) -> bool
 | 
				
			||||||
    # If a user has no message-receiving event queues, they've got no open zulip
 | 
					    # If a user has no message-receiving event queues, they've got no open zulip
 | 
				
			||||||
    # session so we notify them
 | 
					    # session so we notify them
 | 
				
			||||||
    all_client_descriptors = get_client_descriptors_for_user(user_profile_id)
 | 
					    all_client_descriptors = get_client_descriptors_for_user(user_profile_id)
 | 
				
			||||||
@@ -684,14 +683,14 @@ def receiver_is_idle(user_profile_id, realm_presences):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def process_message_event(event_template, users):
 | 
					def process_message_event(event_template, users):
 | 
				
			||||||
    # type: (Mapping[str, Any], Iterable[Mapping[str, Any]]) -> None
 | 
					    # type: (Mapping[str, Any], Iterable[Mapping[str, Any]]) -> None
 | 
				
			||||||
    realm_presences = {int(k): v for k, v in event_template['presences'].items()} # type: Dict[int, Dict[text_type, Dict[str, Any]]]
 | 
					    realm_presences = {int(k): v for k, v in event_template['presences'].items()} # type: Dict[int, Dict[Text, Dict[str, Any]]]
 | 
				
			||||||
    sender_queue_id = event_template.get('sender_queue_id', None) # type: Optional[str]
 | 
					    sender_queue_id = event_template.get('sender_queue_id', None) # type: Optional[str]
 | 
				
			||||||
    message_dict_markdown = event_template['message_dict_markdown'] # type: Dict[str, Any]
 | 
					    message_dict_markdown = event_template['message_dict_markdown'] # type: Dict[str, Any]
 | 
				
			||||||
    message_dict_no_markdown = event_template['message_dict_no_markdown'] # type: Dict[str, Any]
 | 
					    message_dict_no_markdown = event_template['message_dict_no_markdown'] # type: Dict[str, Any]
 | 
				
			||||||
    sender_id = message_dict_markdown['sender_id'] # type: int
 | 
					    sender_id = message_dict_markdown['sender_id'] # type: int
 | 
				
			||||||
    message_id = message_dict_markdown['id'] # type: int
 | 
					    message_id = message_dict_markdown['id'] # type: int
 | 
				
			||||||
    message_type = message_dict_markdown['type'] # type: str
 | 
					    message_type = message_dict_markdown['type'] # type: str
 | 
				
			||||||
    sending_client = message_dict_markdown['client'] # type: text_type
 | 
					    sending_client = message_dict_markdown['client'] # type: Text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # To remove duplicate clients: Maps queue ID to {'client': Client, 'flags': flags}
 | 
					    # To remove duplicate clients: Maps queue ID to {'client': Client, 'flags': flags}
 | 
				
			||||||
    send_to_clients = {} # type: Dict[str, Dict[str, Any]]
 | 
					    send_to_clients = {} # type: Dict[str, Dict[str, Any]]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,6 @@
 | 
				
			|||||||
from __future__ import absolute_import
 | 
					from __future__ import absolute_import
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from six import text_type
 | 
					from typing import Any, Union, Mapping, Optional, Text
 | 
				
			||||||
from typing import Any, Union, Mapping, Optional
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
from django.utils import timezone
 | 
					from django.utils import timezone
 | 
				
			||||||
@@ -35,7 +34,7 @@ from zerver.tornado.event_queue import get_client_descriptor
 | 
				
			|||||||
logger = logging.getLogger('zulip.socket')
 | 
					logger = logging.getLogger('zulip.socket')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_user_profile(session_id):
 | 
					def get_user_profile(session_id):
 | 
				
			||||||
    # type: (Optional[text_type]) -> Optional[UserProfile]
 | 
					    # type: (Optional[Text]) -> Optional[UserProfile]
 | 
				
			||||||
    if session_id is None:
 | 
					    if session_id is None:
 | 
				
			||||||
        return None
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -72,7 +71,7 @@ def deregister_connection(conn):
 | 
				
			|||||||
redis_client = get_redis_client()
 | 
					redis_client = get_redis_client()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def req_redis_key(req_id):
 | 
					def req_redis_key(req_id):
 | 
				
			||||||
    # type: (text_type) -> text_type
 | 
					    # type: (Text) -> Text
 | 
				
			||||||
    return u'socket_req_status:%s' % (req_id,)
 | 
					    return u'socket_req_status:%s' % (req_id,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SocketAuthError(Exception):
 | 
					class SocketAuthError(Exception):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,6 @@ from __future__ import absolute_import
 | 
				
			|||||||
from django.utils.translation import ugettext as _
 | 
					from django.utils.translation import ugettext as _
 | 
				
			||||||
from django.http import HttpRequest, HttpResponse
 | 
					from django.http import HttpRequest, HttpResponse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from six import text_type
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from zerver.models import get_client, UserProfile, Client
 | 
					from zerver.models import get_client, UserProfile, Client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from zerver.decorator import asynchronous, \
 | 
					from zerver.decorator import asynchronous, \
 | 
				
			||||||
@@ -17,7 +15,7 @@ from zerver.tornado.event_queue import get_client_descriptor, \
 | 
				
			|||||||
    process_notification, fetch_events
 | 
					    process_notification, fetch_events
 | 
				
			||||||
from django.core.handlers.base import BaseHandler
 | 
					from django.core.handlers.base import BaseHandler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from typing import Union, Optional, Iterable, Sequence, List
 | 
					from typing import Union, Optional, Iterable, Sequence, List, Text
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import ujson
 | 
					import ujson
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,7 +27,7 @@ def notify(request):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@has_request_variables
 | 
					@has_request_variables
 | 
				
			||||||
def cleanup_event_queue(request, user_profile, queue_id=REQ()):
 | 
					def cleanup_event_queue(request, user_profile, queue_id=REQ()):
 | 
				
			||||||
    # type: (HttpRequest, UserProfile, text_type) -> HttpResponse
 | 
					    # type: (HttpRequest, UserProfile, Text) -> HttpResponse
 | 
				
			||||||
    client = get_client_descriptor(str(queue_id))
 | 
					    client = get_client_descriptor(str(queue_id))
 | 
				
			||||||
    if client is None:
 | 
					    if client is None:
 | 
				
			||||||
        return json_error(_("Bad event queue id: %s") % (queue_id,))
 | 
					        return json_error(_("Bad event queue id: %s") % (queue_id,))
 | 
				
			||||||
@@ -51,7 +49,7 @@ def get_events_backend(request, user_profile, handler,
 | 
				
			|||||||
                       dont_block = REQ(default=False, validator=check_bool),
 | 
					                       dont_block = REQ(default=False, validator=check_bool),
 | 
				
			||||||
                       narrow = REQ(default=[], validator=check_list(None)),
 | 
					                       narrow = REQ(default=[], validator=check_list(None)),
 | 
				
			||||||
                       lifespan_secs = REQ(default=0, converter=int)):
 | 
					                       lifespan_secs = REQ(default=0, converter=int)):
 | 
				
			||||||
    # type: (HttpRequest, UserProfile, BaseHandler, Optional[Client], Optional[int], Optional[List[text_type]], bool, bool, Optional[text_type], bool, Iterable[Sequence[text_type]], int) -> Union[HttpResponse, _RespondAsynchronously]
 | 
					    # type: (HttpRequest, UserProfile, BaseHandler, Optional[Client], Optional[int], Optional[List[Text]], bool, bool, Optional[Text], bool, Iterable[Sequence[Text]], int) -> Union[HttpResponse, _RespondAsynchronously]
 | 
				
			||||||
    if user_client is None:
 | 
					    if user_client is None:
 | 
				
			||||||
        user_client = request.client
 | 
					        user_client = request.client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user