mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	python: Remove now-unnecessary str_utils library.
This library was absolutely essential as part of our Python 2->3
migration process, but all of its calls should be either no-ops or
encode/decode operations.
Note also that the library has been wrong since the incorrect
refactoring in 1f9244e060.
Fixes #10807.
			
			
This commit is contained in:
		@@ -16,7 +16,6 @@ from django.utils.crypto import get_random_string
 | 
				
			|||||||
import argparse
 | 
					import argparse
 | 
				
			||||||
import uuid
 | 
					import uuid
 | 
				
			||||||
import configparser
 | 
					import configparser
 | 
				
			||||||
from zerver.lib.str_utils import force_str
 | 
					 | 
				
			||||||
from zerver.lib.utils import generate_random_token
 | 
					from zerver.lib.utils import generate_random_token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
os.chdir(os.path.join(os.path.dirname(__file__), '..', '..'))
 | 
					os.chdir(os.path.join(os.path.dirname(__file__), '..', '..'))
 | 
				
			||||||
@@ -111,7 +110,7 @@ def generate_secrets(development=False):
 | 
				
			|||||||
    out = open(OUTPUT_SETTINGS_FILENAME, 'a')
 | 
					    out = open(OUTPUT_SETTINGS_FILENAME, 'a')
 | 
				
			||||||
    # Write a newline at the start, in case there was no newline at
 | 
					    # Write a newline at the start, in case there was no newline at
 | 
				
			||||||
    # the end of the file due to human editing.
 | 
					    # the end of the file due to human editing.
 | 
				
			||||||
    out.write("\n" + force_str("".join(lines)))
 | 
					    out.write("\n" + "".join(lines))
 | 
				
			||||||
    out.close()
 | 
					    out.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    print("Generated new secrets in %s." % (OUTPUT_SETTINGS_FILENAME,))
 | 
					    print("Generated new secrets in %s." % (OUTPUT_SETTINGS_FILENAME,))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,7 +84,6 @@ not_yet_fully_covered = {
 | 
				
			|||||||
    'zerver/lib/rate_limiter.py',
 | 
					    'zerver/lib/rate_limiter.py',
 | 
				
			||||||
    'zerver/lib/sqlalchemy_utils.py',
 | 
					    'zerver/lib/sqlalchemy_utils.py',
 | 
				
			||||||
    'zerver/lib/storage.py',
 | 
					    'zerver/lib/storage.py',
 | 
				
			||||||
    'zerver/lib/str_utils.py',
 | 
					 | 
				
			||||||
    'zerver/lib/stream_recipient.py',
 | 
					    'zerver/lib/stream_recipient.py',
 | 
				
			||||||
    'zerver/lib/timeout.py',
 | 
					    'zerver/lib/timeout.py',
 | 
				
			||||||
    'zerver/lib/unminify.py',
 | 
					    'zerver/lib/unminify.py',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
from typing import Any, Dict, List, Optional, Union
 | 
					from typing import Any, Dict, List, Optional, Union, cast
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
@@ -17,7 +17,6 @@ from zerver.lib.queue import queue_json_publish
 | 
				
			|||||||
from zerver.lib.redis_utils import get_redis_client
 | 
					from zerver.lib.redis_utils import get_redis_client
 | 
				
			||||||
from zerver.lib.upload import upload_message_file
 | 
					from zerver.lib.upload import upload_message_file
 | 
				
			||||||
from zerver.lib.utils import generate_random_token
 | 
					from zerver.lib.utils import generate_random_token
 | 
				
			||||||
from zerver.lib.str_utils import force_text
 | 
					 | 
				
			||||||
from zerver.lib.send_email import FromAddress
 | 
					from zerver.lib.send_email import FromAddress
 | 
				
			||||||
from zerver.models import Stream, Recipient, \
 | 
					from zerver.models import Stream, Recipient, \
 | 
				
			||||||
    get_user_profile_by_id, get_display_recipient, get_personal_recipient, \
 | 
					    get_user_profile_by_id, get_display_recipient, get_personal_recipient, \
 | 
				
			||||||
@@ -324,7 +323,7 @@ def process_message(message: message.Message, rcpt_to: Optional[str]=None, pre_c
 | 
				
			|||||||
        subject_header = "(no topic)"
 | 
					        subject_header = "(no topic)"
 | 
				
			||||||
    encoded_subject, encoding = decode_header(subject_header)[0]
 | 
					    encoded_subject, encoding = decode_header(subject_header)[0]
 | 
				
			||||||
    if encoding is None:
 | 
					    if encoding is None:
 | 
				
			||||||
        subject = force_text(encoded_subject)  # encoded_subject has type str when encoding is None
 | 
					        subject = cast(str, encoded_subject)  # encoded_subject has type str when encoding is None
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            subject = encoded_subject.decode(encoding)
 | 
					            subject = encoded_subject.decode(encoding)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,8 +8,6 @@ from django.conf import settings
 | 
				
			|||||||
from django.contrib.staticfiles.storage import ManifestStaticFilesStorage
 | 
					from django.contrib.staticfiles.storage import ManifestStaticFilesStorage
 | 
				
			||||||
from pipeline.storage import PipelineMixin
 | 
					from pipeline.storage import PipelineMixin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from zerver.lib.str_utils import force_str
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class AddHeaderMixin:
 | 
					class AddHeaderMixin:
 | 
				
			||||||
    def post_process(self, paths: Dict[str, Tuple['ZulipStorage', str]], dry_run: bool=False,
 | 
					    def post_process(self, paths: Dict[str, Tuple['ZulipStorage', str]], dry_run: bool=False,
 | 
				
			||||||
                     **kwargs: Any) -> List[Tuple[str, str, bool]]:
 | 
					                     **kwargs: Any) -> List[Tuple[str, str, bool]]:
 | 
				
			||||||
@@ -38,7 +36,7 @@ class AddHeaderMixin:
 | 
				
			|||||||
            storage.delete(path)
 | 
					            storage.delete(path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            with storage.open(path, 'w') as new_file:
 | 
					            with storage.open(path, 'w') as new_file:
 | 
				
			||||||
                new_file.write(force_str(header + orig_contents, encoding=settings.FILE_CHARSET))
 | 
					                new_file.write(header + orig_contents)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ret_dict[path] = (path, path, True)
 | 
					            ret_dict[path] = (path, path, True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,52 +0,0 @@
 | 
				
			|||||||
"""
 | 
					 | 
				
			||||||
String Utilities:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This module helps in converting strings from one type to another.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Currently we have strings of 3 semantic types:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1.  text strings: These strings are used to represent all textual data,
 | 
					 | 
				
			||||||
    like people's names, stream names, content of messages, etc.
 | 
					 | 
				
			||||||
    These strings can contain non-ASCII characters, so its type should be
 | 
					 | 
				
			||||||
    typing.str (which is `str` in python 3 and `unicode` in python 2).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
2.  binary strings: These strings are used to represent binary data.
 | 
					 | 
				
			||||||
    This should be of type `bytes`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
3.  native strings: These strings are for internal use only.  Strings of
 | 
					 | 
				
			||||||
    this type are not meant to be stored in database, displayed to end
 | 
					 | 
				
			||||||
    users, etc.  Things like exception names, parameter names, attribute
 | 
					 | 
				
			||||||
    names, etc should be native strings.  These strings should only
 | 
					 | 
				
			||||||
    contain ASCII characters and they should have type `str`.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
There are 3 utility functions provided for converting strings from one type
 | 
					 | 
				
			||||||
to another - force_text, force_bytes, force_str
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Interconversion between text strings and binary strings can be done by
 | 
					 | 
				
			||||||
using encode and decode appropriately or by using the utility functions
 | 
					 | 
				
			||||||
force_text and force_bytes.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
It is recommended to use the utility functions for other string conversions.
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from typing import Any, Dict, Mapping, Union, TypeVar
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def force_text(s: Union[str, bytes], encoding: str='utf-8') -> str:
 | 
					 | 
				
			||||||
    """converts a string to a text string"""
 | 
					 | 
				
			||||||
    if isinstance(s, str):
 | 
					 | 
				
			||||||
        return s
 | 
					 | 
				
			||||||
    elif isinstance(s, bytes):
 | 
					 | 
				
			||||||
        return s.decode(encoding)
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        raise TypeError("force_text expects a string type")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def force_str(s: Union[str, bytes], encoding: str='utf-8') -> str:
 | 
					 | 
				
			||||||
    """converts a string to a native string"""
 | 
					 | 
				
			||||||
    if isinstance(s, str):
 | 
					 | 
				
			||||||
        return s
 | 
					 | 
				
			||||||
    elif isinstance(s, str):
 | 
					 | 
				
			||||||
        return s.encode(encoding)
 | 
					 | 
				
			||||||
    elif isinstance(s, bytes):
 | 
					 | 
				
			||||||
        return s.decode(encoding)
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        raise TypeError("force_str expects a string type")
 | 
					 | 
				
			||||||
@@ -2,8 +2,6 @@ import re
 | 
				
			|||||||
import traceback
 | 
					import traceback
 | 
				
			||||||
import DNS
 | 
					import DNS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from zerver.lib.str_utils import force_str
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def compute_mit_user_fullname(email: str) -> str:
 | 
					def compute_mit_user_fullname(email: str) -> str:
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        # Input is either e.g. username@mit.edu or user|CROSSREALM.INVALID@mit.edu
 | 
					        # Input is either e.g. username@mit.edu or user|CROSSREALM.INVALID@mit.edu
 | 
				
			||||||
@@ -12,7 +10,7 @@ def compute_mit_user_fullname(email: str) -> str:
 | 
				
			|||||||
            answer = DNS.dnslookup(
 | 
					            answer = DNS.dnslookup(
 | 
				
			||||||
                "%s.passwd.ns.athena.mit.edu" % (match_user.group(1),),
 | 
					                "%s.passwd.ns.athena.mit.edu" % (match_user.group(1),),
 | 
				
			||||||
                DNS.Type.TXT)
 | 
					                DNS.Type.TXT)
 | 
				
			||||||
            hesiod_name = force_str(answer[0][0]).split(':')[4].split(',')[0].strip()
 | 
					            hesiod_name = answer[0][0].split(':')[4].split(',')[0].strip()
 | 
				
			||||||
            if hesiod_name != "":
 | 
					            if hesiod_name != "":
 | 
				
			||||||
                return hesiod_name
 | 
					                return hesiod_name
 | 
				
			||||||
        elif match_user:
 | 
					        elif match_user:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ from typing import Any
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from zerver.lib.actions import create_stream_if_needed
 | 
					from zerver.lib.actions import create_stream_if_needed
 | 
				
			||||||
from zerver.lib.management import ZulipBaseCommand
 | 
					from zerver.lib.management import ZulipBaseCommand
 | 
				
			||||||
from zerver.lib.str_utils import force_text
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Command(ZulipBaseCommand):
 | 
					class Command(ZulipBaseCommand):
 | 
				
			||||||
    help = """Create a stream, and subscribe all active users (excluding bots).
 | 
					    help = """Create a stream, and subscribe all active users (excluding bots).
 | 
				
			||||||
@@ -22,6 +21,5 @@ the command."""
 | 
				
			|||||||
        realm = self.get_realm(options)
 | 
					        realm = self.get_realm(options)
 | 
				
			||||||
        assert realm is not None  # Should be ensured by parser
 | 
					        assert realm is not None  # Should be ensured by parser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        encoding = sys.getfilesystemencoding()
 | 
					 | 
				
			||||||
        stream_name = options['stream_name']
 | 
					        stream_name = options['stream_name']
 | 
				
			||||||
        create_stream_if_needed(realm, force_text(stream_name, encoding))
 | 
					        create_stream_if_needed(realm, stream_name)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,8 +41,6 @@ from django.core.management.commands import makemessages
 | 
				
			|||||||
from django.template.base import BLOCK_TAG_END, BLOCK_TAG_START
 | 
					from django.template.base import BLOCK_TAG_END, BLOCK_TAG_START
 | 
				
			||||||
from django.utils.translation import template
 | 
					from django.utils.translation import template
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from zerver.lib.str_utils import force_text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
strip_whitespace_right = re.compile("(%s-?\\s*(trans|pluralize).*?-%s)\\s+" % (
 | 
					strip_whitespace_right = re.compile("(%s-?\\s*(trans|pluralize).*?-%s)\\s+" % (
 | 
				
			||||||
                                    BLOCK_TAG_START, BLOCK_TAG_END), re.U)
 | 
					                                    BLOCK_TAG_START, BLOCK_TAG_END), re.U)
 | 
				
			||||||
strip_whitespace_left = re.compile("\\s+(%s-\\s*(endtrans|pluralize).*?-?%s)" % (
 | 
					strip_whitespace_left = re.compile("\\s+(%s-\\s*(endtrans|pluralize).*?-?%s)" % (
 | 
				
			||||||
@@ -249,7 +247,7 @@ class Command(makemessages.Command):
 | 
				
			|||||||
                old_strings = {}
 | 
					                old_strings = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            new_strings = {
 | 
					            new_strings = {
 | 
				
			||||||
                force_text(k): v
 | 
					                k: v
 | 
				
			||||||
                for k, v in self.get_new_strings(old_strings,
 | 
					                for k, v in self.get_new_strings(old_strings,
 | 
				
			||||||
                                                 translation_strings,
 | 
					                                                 translation_strings,
 | 
				
			||||||
                                                 locale).items()
 | 
					                                                 locale).items()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ from typing import Any
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from zerver.lib.actions import do_rename_stream
 | 
					from zerver.lib.actions import do_rename_stream
 | 
				
			||||||
from zerver.lib.management import ZulipBaseCommand
 | 
					from zerver.lib.management import ZulipBaseCommand
 | 
				
			||||||
from zerver.lib.str_utils import force_text
 | 
					 | 
				
			||||||
from zerver.models import get_stream
 | 
					from zerver.models import get_stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Command(ZulipBaseCommand):
 | 
					class Command(ZulipBaseCommand):
 | 
				
			||||||
@@ -23,7 +22,6 @@ class Command(ZulipBaseCommand):
 | 
				
			|||||||
        assert realm is not None  # Should be ensured by parser
 | 
					        assert realm is not None  # Should be ensured by parser
 | 
				
			||||||
        old_name = options['old_name']
 | 
					        old_name = options['old_name']
 | 
				
			||||||
        new_name = options['new_name']
 | 
					        new_name = options['new_name']
 | 
				
			||||||
        encoding = sys.getfilesystemencoding()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        stream = get_stream(force_text(old_name, encoding), realm)
 | 
					        stream = get_stream(old_name, realm)
 | 
				
			||||||
        do_rename_stream(stream, force_text(new_name, encoding))
 | 
					        do_rename_stream(stream, new_name)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ from zerver.decorator import authenticated_json_view
 | 
				
			|||||||
from zerver.lib.ccache import make_ccache
 | 
					from zerver.lib.ccache import make_ccache
 | 
				
			||||||
from zerver.lib.request import has_request_variables, REQ, JsonableError
 | 
					from zerver.lib.request import has_request_variables, REQ, JsonableError
 | 
				
			||||||
from zerver.lib.response import json_success, json_error
 | 
					from zerver.lib.response import json_success, json_error
 | 
				
			||||||
from zerver.lib.str_utils import force_str
 | 
					 | 
				
			||||||
from zerver.lib.users import get_api_key
 | 
					from zerver.lib.users import get_api_key
 | 
				
			||||||
from zerver.models import UserProfile
 | 
					from zerver.models import UserProfile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -48,9 +47,9 @@ def webathena_kerberos_login(request: HttpRequest, user_profile: UserProfile,
 | 
				
			|||||||
        api_key = get_api_key(user_profile)
 | 
					        api_key = get_api_key(user_profile)
 | 
				
			||||||
        subprocess.check_call(["ssh", settings.PERSONAL_ZMIRROR_SERVER, "--",
 | 
					        subprocess.check_call(["ssh", settings.PERSONAL_ZMIRROR_SERVER, "--",
 | 
				
			||||||
                               "/home/zulip/python-zulip-api/zulip/integrations/zephyr/process_ccache",
 | 
					                               "/home/zulip/python-zulip-api/zulip/integrations/zephyr/process_ccache",
 | 
				
			||||||
                               force_str(user),
 | 
					                               user,
 | 
				
			||||||
                               force_str(api_key),
 | 
					                               api_key,
 | 
				
			||||||
                               force_str(base64.b64encode(ccache))])
 | 
					                               base64.b64encode(ccache).decode("utf-8")])
 | 
				
			||||||
    except Exception:
 | 
					    except Exception:
 | 
				
			||||||
        logging.exception("Error updating the user's ccache")
 | 
					        logging.exception("Error updating the user's ccache")
 | 
				
			||||||
        return json_error(_("We were unable to setup mirroring for you"))
 | 
					        return json_error(_("We were unable to setup mirroring for you"))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,7 +40,6 @@ from zerver.tornado.socket import req_redis_key, respond_send_message
 | 
				
			|||||||
from confirmation.models import Confirmation, create_confirmation_link
 | 
					from confirmation.models import Confirmation, create_confirmation_link
 | 
				
			||||||
from zerver.lib.db import reset_queries
 | 
					from zerver.lib.db import reset_queries
 | 
				
			||||||
from zerver.lib.redis_utils import get_redis_client
 | 
					from zerver.lib.redis_utils import get_redis_client
 | 
				
			||||||
from zerver.lib.str_utils import force_str
 | 
					 | 
				
			||||||
from zerver.context_processors import common_context
 | 
					from zerver.context_processors import common_context
 | 
				
			||||||
from zerver.lib.outgoing_webhook import do_rest_call, get_outgoing_webhook_service_handler
 | 
					from zerver.lib.outgoing_webhook import do_rest_call, get_outgoing_webhook_service_handler
 | 
				
			||||||
from zerver.models import get_bot_services
 | 
					from zerver.models import get_bot_services
 | 
				
			||||||
@@ -479,8 +478,7 @@ class DigestWorker(QueueProcessingWorker):  # nocoverage
 | 
				
			|||||||
@assign_queue('email_mirror')
 | 
					@assign_queue('email_mirror')
 | 
				
			||||||
class MirrorWorker(QueueProcessingWorker):
 | 
					class MirrorWorker(QueueProcessingWorker):
 | 
				
			||||||
    def consume(self, event: Mapping[str, Any]) -> None:
 | 
					    def consume(self, event: Mapping[str, Any]) -> None:
 | 
				
			||||||
        message = force_str(event["message"])
 | 
					        mirror_email(email.message_from_string(event["message"]),
 | 
				
			||||||
        mirror_email(email.message_from_string(message),
 | 
					 | 
				
			||||||
                     rcpt_to=event["rcpt_to"], pre_checked=True)
 | 
					                     rcpt_to=event["rcpt_to"], pre_checked=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@assign_queue('test', queue_type="test")
 | 
					@assign_queue('test', queue_type="test")
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user