ruff: Fix RSE102 Unnecessary parentheses on raised exception.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2023-02-03 17:07:20 -08:00 committed by Tim Abbott
parent 3099487bc3
commit da3cf5ea7a
36 changed files with 101 additions and 101 deletions

View File

@ -240,10 +240,10 @@ def validate_key(creation_key: Optional[str]) -> Optional["RealmCreationKey"]:
try: try:
key_record = RealmCreationKey.objects.get(creation_key=creation_key) key_record = RealmCreationKey.objects.get(creation_key=creation_key)
except RealmCreationKey.DoesNotExist: except RealmCreationKey.DoesNotExist:
raise RealmCreationKey.InvalidError() raise RealmCreationKey.InvalidError
time_elapsed = timezone_now() - key_record.date_created time_elapsed = timezone_now() - key_record.date_created
if time_elapsed.total_seconds() > settings.REALM_CREATION_LINK_VALIDITY_DAYS * 24 * 3600: if time_elapsed.total_seconds() > settings.REALM_CREATION_LINK_VALIDITY_DAYS * 24 * 3600:
raise RealmCreationKey.InvalidError() raise RealmCreationKey.InvalidError
return key_record return key_record

View File

@ -82,7 +82,7 @@ def check_spare_licenses_available_for_adding_new_users(
if plan.licenses() < get_seat_count( if plan.licenses() < get_seat_count(
realm, extra_non_guests_count=extra_non_guests_count, extra_guests_count=extra_guests_count realm, extra_non_guests_count=extra_non_guests_count, extra_guests_count=extra_guests_count
): ):
raise LicenseLimitError() raise LicenseLimitError
def check_spare_licenses_available_for_registering_new_user( def check_spare_licenses_available_for_registering_new_user(

View File

@ -636,7 +636,7 @@ def ensure_realm_does_not_have_active_plan(realm: Realm) -> None:
"Upgrade of %s failed because of existing active plan.", "Upgrade of %s failed because of existing active plan.",
realm.string_id, realm.string_id,
) )
raise UpgradeWithExistingPlanError() raise UpgradeWithExistingPlanError
@transaction.atomic @transaction.atomic

View File

@ -82,7 +82,7 @@ def get_ses_arn(session: boto3.session.Session, args: argparse.Namespace) -> str
return settings["ComplaintTopic"] return settings["ComplaintTopic"]
elif args.deliveries: elif args.deliveries:
return settings["DeliveryTopic"] return settings["DeliveryTopic"]
raise AssertionError() # Unreachable raise AssertionError # Unreachable
@contextmanager @contextmanager

View File

@ -71,7 +71,7 @@ def get_realm_from_request(request: HttpRequest) -> Optional[Realm]:
def get_valid_realm_from_request(request: HttpRequest) -> Realm: def get_valid_realm_from_request(request: HttpRequest) -> Realm:
realm = get_realm_from_request(request) realm = get_realm_from_request(request)
if realm is None: if realm is None:
raise InvalidSubdomainError() raise InvalidSubdomainError
return realm return realm

View File

@ -139,7 +139,7 @@ def require_realm_owner(
**kwargs: ParamT.kwargs, **kwargs: ParamT.kwargs,
) -> HttpResponse: ) -> HttpResponse:
if not user_profile.is_realm_owner: if not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
return func(request, user_profile, *args, **kwargs) return func(request, user_profile, *args, **kwargs)
return wrapper return wrapper
@ -157,7 +157,7 @@ def require_realm_admin(
**kwargs: ParamT.kwargs, **kwargs: ParamT.kwargs,
) -> HttpResponse: ) -> HttpResponse:
if not user_profile.is_realm_admin: if not user_profile.is_realm_admin:
raise OrganizationAdministratorRequiredError() raise OrganizationAdministratorRequiredError
return func(request, user_profile, *args, **kwargs) return func(request, user_profile, *args, **kwargs)
return wrapper return wrapper
@ -175,7 +175,7 @@ def require_organization_member(
**kwargs: ParamT.kwargs, **kwargs: ParamT.kwargs,
) -> HttpResponse: ) -> HttpResponse:
if user_profile.role > UserProfile.ROLE_MEMBER: if user_profile.role > UserProfile.ROLE_MEMBER:
raise OrganizationMemberRequiredError() raise OrganizationMemberRequiredError
return func(request, user_profile, *args, **kwargs) return func(request, user_profile, *args, **kwargs)
return wrapper return wrapper
@ -257,9 +257,9 @@ def validate_api_key(
def validate_account_and_subdomain(request: HttpRequest, user_profile: UserProfile) -> None: def validate_account_and_subdomain(request: HttpRequest, user_profile: UserProfile) -> None:
if user_profile.realm.deactivated: if user_profile.realm.deactivated:
raise RealmDeactivatedError() raise RealmDeactivatedError
if not user_profile.is_active: if not user_profile.is_active:
raise UserDeactivatedError() raise UserDeactivatedError
# Either the subdomain matches, or we're accessing Tornado from # Either the subdomain matches, or we're accessing Tornado from
# and to localhost (aka spoofing a request as the user). # and to localhost (aka spoofing a request as the user).
@ -281,17 +281,17 @@ def access_user_by_api_key(
request: HttpRequest, api_key: str, email: Optional[str] = None request: HttpRequest, api_key: str, email: Optional[str] = None
) -> UserProfile: ) -> UserProfile:
if not has_api_key_format(api_key): if not has_api_key_format(api_key):
raise InvalidAPIKeyFormatError() raise InvalidAPIKeyFormatError
try: try:
user_profile = get_user_profile_by_api_key(api_key) user_profile = get_user_profile_by_api_key(api_key)
except UserProfile.DoesNotExist: except UserProfile.DoesNotExist:
raise InvalidAPIKeyError() raise InvalidAPIKeyError
if email is not None and email.lower() != user_profile.delivery_email.lower(): if email is not None and email.lower() != user_profile.delivery_email.lower():
# This covers the case that the API key is correct, but for a # This covers the case that the API key is correct, but for a
# different user. We may end up wanting to relaxing this # different user. We may end up wanting to relaxing this
# constraint or give a different error message in the future. # constraint or give a different error message in the future.
raise InvalidAPIKeyError() raise InvalidAPIKeyError
validate_account_and_subdomain(request, user_profile) validate_account_and_subdomain(request, user_profile)
@ -866,7 +866,7 @@ def authenticated_json_view(
**kwargs: ParamT.kwargs, **kwargs: ParamT.kwargs,
) -> HttpResponse: ) -> HttpResponse:
if not request.user.is_authenticated: if not request.user.is_authenticated:
raise UnauthorizedError() raise UnauthorizedError
user_profile = request.user user_profile = request.user
if not skip_rate_limiting: if not skip_rate_limiting:
@ -913,7 +913,7 @@ def internal_notify_view(
request: HttpRequest, /, *args: ParamT.args, **kwargs: ParamT.kwargs request: HttpRequest, /, *args: ParamT.args, **kwargs: ParamT.kwargs
) -> HttpResponse: ) -> HttpResponse:
if not authenticate_notify(request): if not authenticate_notify(request):
raise AccessDeniedError() raise AccessDeniedError
request_notes = RequestNotes.get_notes(request) request_notes = RequestNotes.get_notes(request)
is_tornado_request = request_notes.tornado_handler_id is not None is_tornado_request = request_notes.tornado_handler_id is not None
# These next 2 are not security checks; they are internal # These next 2 are not security checks; they are internal

View File

@ -647,7 +647,7 @@ def apply_events(
) -> None: ) -> None:
for event in events: for event in events:
if event["type"] == "restart": if event["type"] == "restart":
raise RestartEventError() raise RestartEventError
if fetch_event_types is not None and event["type"] not in fetch_event_types: if fetch_event_types is not None and event["type"] not in fetch_event_types:
# TODO: continuing here is not, most precisely, correct. # TODO: continuing here is not, most precisely, correct.
# In theory, an event of one type, e.g. `realm_user`, # In theory, an event of one type, e.g. `realm_user`,

View File

@ -50,7 +50,7 @@ class InvalidPlatformError(Exception):
@cache_with_key(lambda platform: f"download_link:{platform}", timeout=60 * 30) @cache_with_key(lambda platform: f"download_link:{platform}", timeout=60 * 30)
def get_latest_github_release_download_link_for_platform(platform: str) -> str: def get_latest_github_release_download_link_for_platform(platform: str) -> str:
if platform not in PLATFORM_TO_SETUP_FILE: if platform not in PLATFORM_TO_SETUP_FILE:
raise InvalidPlatformError() raise InvalidPlatformError
latest_version = get_latest_github_release_version_for_repo("zulip-desktop") latest_version = get_latest_github_release_version_for_repo("zulip-desktop")
if latest_version: if latest_version:

View File

@ -2639,7 +2639,7 @@ def do_convert(
logging_message_id, logging_message_id,
) )
raise MarkdownRenderingError() raise MarkdownRenderingError
finally: finally:
# These next three lines are slightly paranoid, since # These next three lines are slightly paranoid, since
# we always set these right before actually using the # we always set these right before actually using the

View File

@ -210,7 +210,7 @@ class ZulipBaseHandler:
"""Returns a formatted text. """Returns a formatted text.
Subclasses should override this method. Subclasses should override this method.
""" """
raise NotImplementedError() raise NotImplementedError
def generic_handler( def generic_handler(

View File

@ -766,21 +766,21 @@ def access_web_public_message(
# message with the provided ID exists on the server if the client # message with the provided ID exists on the server if the client
# shouldn't have access to it. # shouldn't have access to it.
if not realm.web_public_streams_enabled(): if not realm.web_public_streams_enabled():
raise MissingAuthenticationError() raise MissingAuthenticationError
try: try:
message = Message.objects.select_related().get(id=message_id) message = Message.objects.select_related().get(id=message_id)
except Message.DoesNotExist: except Message.DoesNotExist:
raise MissingAuthenticationError() raise MissingAuthenticationError
if not message.is_stream_message(): if not message.is_stream_message():
raise MissingAuthenticationError() raise MissingAuthenticationError
queryset = get_web_public_streams_queryset(realm) queryset = get_web_public_streams_queryset(realm)
try: try:
stream = queryset.get(id=message.recipient.type_id) stream = queryset.get(id=message.recipient.type_id)
except Stream.DoesNotExist: except Stream.DoesNotExist:
raise MissingAuthenticationError() raise MissingAuthenticationError
# These should all have been enforced by the code in # These should all have been enforced by the code in
# get_web_public_streams_queryset # get_web_public_streams_queryset

View File

@ -480,7 +480,7 @@ class RedisRateLimiterBackend(RateLimiterBackend):
break break
except redis.WatchError: # nocoverage # Ideally we'd have a test for this. except redis.WatchError: # nocoverage # Ideally we'd have a test for this.
if count > 10: if count > 10:
raise RateLimiterLockingError() raise RateLimiterLockingError
count += 1 count += 1
continue continue

View File

@ -192,7 +192,7 @@ def rest_dispatch(request: HttpRequest, /, **kwargs: object) -> HttpResponse:
else: else:
# Otherwise, throw an authentication error; our middleware # Otherwise, throw an authentication error; our middleware
# will generate the appropriate HTTP response. # will generate the appropriate HTTP response.
raise MissingAuthenticationError() raise MissingAuthenticationError
if request.method in ["DELETE", "PATCH", "PUT"]: if request.method in ["DELETE", "PATCH", "PUT"]:
# process_as_post needs to be the outer decorator, because # process_as_post needs to be the outer decorator, because

View File

@ -318,7 +318,7 @@ def check_stream_access_for_delete_or_update(
if sub is None and stream.invite_only: if sub is None and stream.invite_only:
raise JsonableError(error) raise JsonableError(error)
raise OrganizationAdministratorRequiredError() raise OrganizationAdministratorRequiredError
def access_stream_for_delete_or_update( def access_stream_for_delete_or_update(
@ -739,7 +739,7 @@ def list_to_streams(
if message_retention_days_not_none: if message_retention_days_not_none:
if not user_profile.is_realm_owner: if not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
user_profile.realm.ensure_not_on_limited_plan() user_profile.realm.ensure_not_on_limited_plan()

View File

@ -181,10 +181,10 @@ def resize_emoji(
class ZulipUploadBackend: class ZulipUploadBackend:
def get_public_upload_root_url(self) -> str: def get_public_upload_root_url(self) -> str:
raise NotImplementedError() raise NotImplementedError
def generate_message_upload_path(self, realm_id: str, uploaded_file_name: str) -> str: def generate_message_upload_path(self, realm_id: str, uploaded_file_name: str) -> str:
raise NotImplementedError() raise NotImplementedError
def upload_message_file( def upload_message_file(
self, self,
@ -195,7 +195,7 @@ class ZulipUploadBackend:
user_profile: UserProfile, user_profile: UserProfile,
target_realm: Optional[Realm] = None, target_realm: Optional[Realm] = None,
) -> str: ) -> str:
raise NotImplementedError() raise NotImplementedError
def upload_avatar_image( def upload_avatar_image(
self, self,
@ -204,44 +204,44 @@ class ZulipUploadBackend:
target_user_profile: UserProfile, target_user_profile: UserProfile,
content_type: Optional[str] = None, content_type: Optional[str] = None,
) -> None: ) -> None:
raise NotImplementedError() raise NotImplementedError
def delete_avatar_image(self, user: UserProfile) -> None: def delete_avatar_image(self, user: UserProfile) -> None:
raise NotImplementedError() raise NotImplementedError
def delete_message_image(self, path_id: str) -> bool: def delete_message_image(self, path_id: str) -> bool:
raise NotImplementedError() raise NotImplementedError
def get_avatar_url(self, hash_key: str, medium: bool = False) -> str: def get_avatar_url(self, hash_key: str, medium: bool = False) -> str:
raise NotImplementedError() raise NotImplementedError
def copy_avatar(self, source_profile: UserProfile, target_profile: UserProfile) -> None: def copy_avatar(self, source_profile: UserProfile, target_profile: UserProfile) -> None:
raise NotImplementedError() raise NotImplementedError
def ensure_avatar_image(self, user_profile: UserProfile, is_medium: bool = False) -> None: def ensure_avatar_image(self, user_profile: UserProfile, is_medium: bool = False) -> None:
raise NotImplementedError() raise NotImplementedError
def upload_realm_icon_image(self, icon_file: IO[bytes], user_profile: UserProfile) -> None: def upload_realm_icon_image(self, icon_file: IO[bytes], user_profile: UserProfile) -> None:
raise NotImplementedError() raise NotImplementedError
def get_realm_icon_url(self, realm_id: int, version: int) -> str: def get_realm_icon_url(self, realm_id: int, version: int) -> str:
raise NotImplementedError() raise NotImplementedError
def upload_realm_logo_image( def upload_realm_logo_image(
self, logo_file: IO[bytes], user_profile: UserProfile, night: bool self, logo_file: IO[bytes], user_profile: UserProfile, night: bool
) -> None: ) -> None:
raise NotImplementedError() raise NotImplementedError
def get_realm_logo_url(self, realm_id: int, version: int, night: bool) -> str: def get_realm_logo_url(self, realm_id: int, version: int, night: bool) -> str:
raise NotImplementedError() raise NotImplementedError
def upload_emoji_image( def upload_emoji_image(
self, emoji_file: IO[bytes], emoji_file_name: str, user_profile: UserProfile self, emoji_file: IO[bytes], emoji_file_name: str, user_profile: UserProfile
) -> bool: ) -> bool:
raise NotImplementedError() raise NotImplementedError
def get_emoji_url(self, emoji_file_name: str, realm_id: int, still: bool = False) -> str: def get_emoji_url(self, emoji_file_name: str, realm_id: int, still: bool = False) -> str:
raise NotImplementedError() raise NotImplementedError
def upload_export_tarball( def upload_export_tarball(
self, self,
@ -249,13 +249,13 @@ class ZulipUploadBackend:
tarball_path: str, tarball_path: str,
percent_callback: Optional[Callable[[Any], None]] = None, percent_callback: Optional[Callable[[Any], None]] = None,
) -> str: ) -> str:
raise NotImplementedError() raise NotImplementedError
def delete_export_tarball(self, export_path: str) -> Optional[str]: def delete_export_tarball(self, export_path: str) -> Optional[str]:
raise NotImplementedError() raise NotImplementedError
def get_export_tarball_url(self, realm: Realm, export_path: str) -> str: def get_export_tarball_url(self, realm: Realm, export_path: str) -> str:
raise NotImplementedError() raise NotImplementedError
def realm_avatar_and_logo_path(self, realm: Realm) -> str: def realm_avatar_and_logo_path(self, realm: Realm) -> str:
return os.path.join(str(realm.id), "realm") return os.path.join(str(realm.id), "realm")

View File

@ -17,4 +17,4 @@ class BaseParser:
self._soup = BeautifulSoup(html_source, "lxml", from_encoding=charset) self._soup = BeautifulSoup(html_source, "lxml", from_encoding=charset)
def extract_data(self) -> UrlEmbedData: def extract_data(self) -> UrlEmbedData:
raise NotImplementedError() raise NotImplementedError

View File

@ -145,12 +145,12 @@ def check_bot_creation_policy(user_profile: UserProfile, bot_type: int) -> None:
if user_profile.realm.bot_creation_policy == Realm.BOT_CREATION_EVERYONE: if user_profile.realm.bot_creation_policy == Realm.BOT_CREATION_EVERYONE:
return return
if user_profile.realm.bot_creation_policy == Realm.BOT_CREATION_ADMINS_ONLY: if user_profile.realm.bot_creation_policy == Realm.BOT_CREATION_ADMINS_ONLY:
raise OrganizationAdministratorRequiredError() raise OrganizationAdministratorRequiredError
if ( if (
user_profile.realm.bot_creation_policy == Realm.BOT_CREATION_LIMIT_GENERIC_BOTS user_profile.realm.bot_creation_policy == Realm.BOT_CREATION_LIMIT_GENERIC_BOTS
and bot_type == UserProfile.DEFAULT_BOT and bot_type == UserProfile.DEFAULT_BOT
): ):
raise OrganizationAdministratorRequiredError() raise OrganizationAdministratorRequiredError
def check_valid_bot_type(user_profile: UserProfile, bot_type: int) -> None: def check_valid_bot_type(user_profile: UserProfile, bot_type: int) -> None:
@ -255,7 +255,7 @@ def access_bot_by_id(user_profile: UserProfile, user_id: int) -> UserProfile:
# default, because it can be abused to send spam. Requiring an # default, because it can be abused to send spam. Requiring an
# owner is intended to ensure organizational responsibility # owner is intended to ensure organizational responsibility
# for use of this permission. # for use of this permission.
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
return target return target

View File

@ -17,7 +17,7 @@ class Uploader:
self.new_path_template = "{realm_id}/emoji/images/{emoji_file_name}" self.new_path_template = "{realm_id}/emoji/images/{emoji_file_name}"
def copy_files(self, src_path: str, dst_path: str) -> None: def copy_files(self, src_path: str, dst_path: str) -> None:
raise NotImplementedError() raise NotImplementedError
def ensure_emoji_images(self, realm_id: int, old_filename: str, new_filename: str) -> None: def ensure_emoji_images(self, realm_id: int, old_filename: str, new_filename: str) -> None:
# Copy original image file. # Copy original image file.

View File

@ -3733,7 +3733,7 @@ def maybe_get_user_profile_by_api_key(api_key: str) -> Optional[UserProfile]:
def get_user_profile_by_api_key(api_key: str) -> UserProfile: def get_user_profile_by_api_key(api_key: str) -> UserProfile:
user_profile = maybe_get_user_profile_by_api_key(api_key) user_profile = maybe_get_user_profile_by_api_key(api_key)
if user_profile is None: if user_profile is None:
raise UserProfile.DoesNotExist() raise UserProfile.DoesNotExist
return user_profile return user_profile
@ -3790,7 +3790,7 @@ def get_active_user(email: str, realm: Realm) -> UserProfile:
See get_user docstring for important usage notes.""" See get_user docstring for important usage notes."""
user_profile = get_user(email, realm) user_profile = get_user(email, realm)
if not user_profile.is_active: if not user_profile.is_active:
raise UserProfile.DoesNotExist() raise UserProfile.DoesNotExist
return user_profile return user_profile
@ -3801,7 +3801,7 @@ def get_user_profile_by_id_in_realm(uid: int, realm: Realm) -> UserProfile:
def get_active_user_profile_by_id_in_realm(uid: int, realm: Realm) -> UserProfile: def get_active_user_profile_by_id_in_realm(uid: int, realm: Realm) -> UserProfile:
user_profile = get_user_profile_by_id_in_realm(uid, realm) user_profile = get_user_profile_by_id_in_realm(uid, realm)
if not user_profile.is_active: if not user_profile.is_active:
raise UserProfile.DoesNotExist() raise UserProfile.DoesNotExist
return user_profile return user_profile
@ -3839,7 +3839,7 @@ def get_user_by_id_in_realm_including_cross_realm(
if is_cross_realm_bot_email(user_profile.delivery_email): if is_cross_realm_bot_email(user_profile.delivery_email):
return user_profile return user_profile
raise UserProfile.DoesNotExist() raise UserProfile.DoesNotExist
@cache_with_key(realm_user_dicts_cache_key, timeout=3600 * 24 * 7) @cache_with_key(realm_user_dicts_cache_key, timeout=3600 * 24 * 7)

View File

@ -56,7 +56,7 @@ class VersionTest(ZulipTestCase):
self.assertIsNone(version_lt(ver1, ver2), msg=msg) self.assertIsNone(version_lt(ver1, ver2), msg=msg)
self.assertIsNone(version_lt(ver2, ver1), msg=msg) self.assertIsNone(version_lt(ver2, ver1), msg=msg)
else: else:
raise AssertionError() # nocoverage raise AssertionError # nocoverage
mobile_os_data = [ mobile_os_data = [
case.split(None, 1) case.split(None, 1)
@ -115,7 +115,7 @@ class CompatibilityTest(ZulipTestCase):
elif expected == "old": elif expected == "old":
self.assert_json_error(result, "Client is too old") self.assert_json_error(result, "Client is too old")
else: else:
raise AssertionError() # nocoverage raise AssertionError # nocoverage
@mock.patch("zerver.lib.compatibility.DESKTOP_MINIMUM_VERSION", "5.0.0") @mock.patch("zerver.lib.compatibility.DESKTOP_MINIMUM_VERSION", "5.0.0")
@mock.patch("zerver.lib.compatibility.DESKTOP_WARNING_VERSION", "5.2.0") @mock.patch("zerver.lib.compatibility.DESKTOP_WARNING_VERSION", "5.2.0")

View File

@ -170,7 +170,7 @@ class MirroredMessageUsersTest(ZulipTestCase):
kwargs["tos_version"] = None kwargs["tos_version"] = None
kwargs["timezone"] = timezone_now() kwargs["timezone"] = timezone_now()
create_user_profile(**kwargs).save() create_user_profile(**kwargs).save()
raise IntegrityError() raise IntegrityError
with mock.patch("zerver.actions.message_send.create_user", side_effect=create_user) as m: with mock.patch("zerver.actions.message_send.create_user", side_effect=create_user) as m:
mirror_fred_user = create_mirror_user_if_needed( mirror_fred_user = create_mirror_user_if_needed(

View File

@ -45,7 +45,7 @@ def timeout_error(final_url: Any, **request_kwargs: Any) -> Any:
def connection_error(final_url: Any, **request_kwargs: Any) -> Any: def connection_error(final_url: Any, **request_kwargs: Any) -> Any:
raise requests.exceptions.ConnectionError() raise requests.exceptions.ConnectionError
class DoRestCallTests(ZulipTestCase): class DoRestCallTests(ZulipTestCase):

View File

@ -92,7 +92,7 @@ class RateLimiterBackendBase(ZulipTestCase, ABC):
""" """
This depends on the algorithm used in the backend, and should be defined by the test class. This depends on the algorithm used in the backend, and should be defined by the test class.
""" """
raise NotImplementedError() raise NotImplementedError
def test_hit_ratelimits(self) -> None: def test_hit_ratelimits(self) -> None:
obj = self.create_object("test", [(2, 3)]) obj = self.create_object("test", [(2, 3)])

View File

@ -479,7 +479,7 @@ def get_email_and_realm_from_jwt_authentication_request(
) -> Tuple[str, Realm]: ) -> Tuple[str, Realm]:
realm = get_realm_from_request(request) realm = get_realm_from_request(request)
if realm is None: if realm is None:
raise InvalidSubdomainError() raise InvalidSubdomainError
try: try:
key = settings.JWT_AUTH_KEYS[realm.subdomain]["key"] key = settings.JWT_AUTH_KEYS[realm.subdomain]["key"]
@ -922,7 +922,7 @@ def get_api_key_fetch_authenticate_failure(return_data: Dict[str, bool]) -> Json
if return_data.get("password_reset_needed"): if return_data.get("password_reset_needed"):
return PasswordResetRequiredError() return PasswordResetRequiredError()
if return_data.get("invalid_subdomain"): if return_data.get("invalid_subdomain"):
raise InvalidSubdomainError() raise InvalidSubdomainError
return AuthenticationFailedError() return AuthenticationFailedError()
@ -976,7 +976,7 @@ def api_fetch_api_key(
realm = get_realm_from_request(request) realm = get_realm_from_request(request)
if realm is None: if realm is None:
raise InvalidSubdomainError() raise InvalidSubdomainError
if not ldap_auth_enabled(realm=realm): if not ldap_auth_enabled(realm=realm):
# In case we don't authenticate against LDAP, check for a valid # In case we don't authenticate against LDAP, check for a valid

View File

@ -117,20 +117,20 @@ def api_dev_fetch_api_key(request: HttpRequest, username: str = REQ()) -> HttpRe
validate_login_email(username) validate_login_email(username)
realm = get_realm_from_request(request) realm = get_realm_from_request(request)
if realm is None: if realm is None:
raise InvalidSubdomainError() raise InvalidSubdomainError
return_data: Dict[str, bool] = {} return_data: Dict[str, bool] = {}
user_profile = authenticate(dev_auth_username=username, realm=realm, return_data=return_data) user_profile = authenticate(dev_auth_username=username, realm=realm, return_data=return_data)
if return_data.get("inactive_realm"): if return_data.get("inactive_realm"):
raise RealmDeactivatedError() raise RealmDeactivatedError
if return_data.get("inactive_user"): if return_data.get("inactive_user"):
raise UserDeactivatedError() raise UserDeactivatedError
if return_data.get("invalid_subdomain"): if return_data.get("invalid_subdomain"):
raise InvalidSubdomainError() raise InvalidSubdomainError
if user_profile is None: if user_profile is None:
# Since we're not actually checking passwords, this condition # Since we're not actually checking passwords, this condition
# is when one's attempting to send an email address that # is when one's attempting to send an email address that
# doesn't have an account, i.e. it's definitely invalid username. # doesn't have an account, i.e. it's definitely invalid username.
raise AuthenticationFailedError() raise AuthenticationFailedError
assert isinstance(user_profile, UserProfile) assert isinstance(user_profile, UserProfile)
do_login(request, user_profile) do_login(request, user_profile)

View File

@ -98,7 +98,7 @@ def events_register_backend(
user_profile = None user_profile = None
realm = get_valid_realm_from_request(request) realm = get_valid_realm_from_request(request)
if not realm.allow_web_public_streams_access(): if not realm.allow_web_public_streams_access():
raise MissingAuthenticationError() raise MissingAuthenticationError
# These parameters must be false for anonymous requests. # These parameters must be false for anonymous requests.
if client_gravatar: if client_gravatar:

View File

@ -34,7 +34,7 @@ def check_if_owner_required(invited_as: int, user_profile: UserProfile) -> None:
invited_as == PreregistrationUser.INVITE_AS["REALM_OWNER"] invited_as == PreregistrationUser.INVITE_AS["REALM_OWNER"]
and not user_profile.is_realm_owner and not user_profile.is_realm_owner
): ):
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
@require_member_or_admin @require_member_or_admin

View File

@ -117,12 +117,12 @@ def get_messages_backend(
# that we are not leaking any secure data (private messages and # that we are not leaking any secure data (private messages and
# non-web-public stream messages) via this path. # non-web-public stream messages) via this path.
if not realm.allow_web_public_streams_access(): if not realm.allow_web_public_streams_access():
raise MissingAuthenticationError() raise MissingAuthenticationError
if not is_web_public_narrow(narrow): if not is_web_public_narrow(narrow):
raise MissingAuthenticationError() raise MissingAuthenticationError
assert narrow is not None assert narrow is not None
if not is_spectator_compatible(narrow): if not is_spectator_compatible(narrow):
raise MissingAuthenticationError() raise MissingAuthenticationError
# We use None to indicate unauthenticated requests as it's more # We use None to indicate unauthenticated requests as it's more
# readable than using AnonymousUser, and the lack of Django # readable than using AnonymousUser, and the lack of Django

View File

@ -155,7 +155,7 @@ def update_realm(
raise JsonableError(_("Invalid language '{}'").format(default_language)) raise JsonableError(_("Invalid language '{}'").format(default_language))
if authentication_methods is not None: if authentication_methods is not None:
if not user_profile.is_realm_owner: if not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
if True not in list(authentication_methods.values()): if True not in list(authentication_methods.values()):
raise JsonableError(_("At least one authentication method must be enabled.")) raise JsonableError(_("At least one authentication method must be enabled."))
if video_chat_provider is not None and video_chat_provider not in { if video_chat_provider is not None and video_chat_provider not in {
@ -170,7 +170,7 @@ def update_realm(
message_retention_days: Optional[int] = None message_retention_days: Optional[int] = None
if message_retention_days_raw is not None: if message_retention_days_raw is not None:
if not user_profile.is_realm_owner: if not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
realm.ensure_not_on_limited_plan() realm.ensure_not_on_limited_plan()
message_retention_days = parse_message_retention_days( message_retention_days = parse_message_retention_days(
message_retention_days_raw, Realm.MESSAGE_RETENTION_SPECIAL_VALUES_MAP message_retention_days_raw, Realm.MESSAGE_RETENTION_SPECIAL_VALUES_MAP
@ -180,15 +180,15 @@ def update_realm(
if ( if (
invite_to_realm_policy is not None or invite_required is not None invite_to_realm_policy is not None or invite_required is not None
) and not user_profile.is_realm_owner: ) and not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
if ( if (
emails_restricted_to_domains is not None or disallow_disposable_email_addresses is not None emails_restricted_to_domains is not None or disallow_disposable_email_addresses is not None
) and not user_profile.is_realm_owner: ) and not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
if waiting_period_threshold is not None and not user_profile.is_realm_owner: if waiting_period_threshold is not None and not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
if enable_spectator_access: if enable_spectator_access:
realm.ensure_not_on_limited_plan() realm.ensure_not_on_limited_plan()
@ -307,7 +307,7 @@ def update_realm(
if string_id is not None: if string_id is not None:
if not user_profile.is_realm_owner: if not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
if realm.demo_organization_scheduled_deletion_date is None: if realm.demo_organization_scheduled_deletion_date is None:
raise JsonableError(_("Must be a demo organization.")) raise JsonableError(_("Must be a demo organization."))

View File

@ -346,7 +346,7 @@ def update_stream_backend(
if message_retention_days is not None: if message_retention_days is not None:
if not user_profile.is_realm_owner: if not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
user_profile.realm.ensure_not_on_limited_plan() user_profile.realm.ensure_not_on_limited_plan()
new_message_retention_days_value = parse_message_retention_days( new_message_retention_days_value = parse_message_retention_days(
message_retention_days, Stream.MESSAGE_RETENTION_SPECIAL_VALUES_MAP message_retention_days, Stream.MESSAGE_RETENTION_SPECIAL_VALUES_MAP

View File

@ -79,7 +79,7 @@ def confirm_email_change(request: HttpRequest, confirmation_key: str) -> HttpRes
if not user_profile.is_active: if not user_profile.is_active:
# TODO: Make this into a user-facing error, not JSON # TODO: Make this into a user-facing error, not JSON
raise UserDeactivatedError() raise UserDeactivatedError
if user_profile.realm.email_changes_disabled and not user_profile.is_realm_admin: if user_profile.realm.email_changes_disabled and not user_profile.is_realm_admin:
raise JsonableError(_("Email address changes are disabled in this organization.")) raise JsonableError(_("Email address changes are disabled in this organization."))

View File

@ -117,7 +117,7 @@ def deactivate_user_backend(
) -> HttpResponse: ) -> HttpResponse:
target = access_user_by_id(user_profile, user_id, for_admin=True) target = access_user_by_id(user_profile, user_id, for_admin=True)
if target.is_realm_owner and not user_profile.is_realm_owner: if target.is_realm_owner and not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
if check_last_owner(target): if check_last_owner(target):
raise JsonableError(_("Cannot deactivate the only organization owner")) raise JsonableError(_("Cannot deactivate the only organization owner"))
if deactivation_notification_comment is not None: if deactivation_notification_comment is not None:
@ -231,9 +231,9 @@ def update_user_backend(
# #
# Logic replicated in patch_bot_backend. # Logic replicated in patch_bot_backend.
if UserProfile.ROLE_REALM_OWNER in [role, target.role] and not user_profile.is_realm_owner: if UserProfile.ROLE_REALM_OWNER in [role, target.role] and not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
elif not user_profile.is_realm_admin: elif not user_profile.is_realm_admin:
raise OrganizationAdministratorRequiredError() raise OrganizationAdministratorRequiredError
if target.role == UserProfile.ROLE_REALM_OWNER and check_last_owner(target): if target.role == UserProfile.ROLE_REALM_OWNER and check_last_owner(target):
raise JsonableError( raise JsonableError(
@ -285,14 +285,14 @@ def avatar(
# enabled in the organization. # enabled in the organization.
realm = get_valid_realm_from_request(request) realm = get_valid_realm_from_request(request)
if not realm.allow_web_public_streams_access(): if not realm.allow_web_public_streams_access():
raise MissingAuthenticationError() raise MissingAuthenticationError
# We only allow the ID format for accessing a user's avatar # We only allow the ID format for accessing a user's avatar
# for spectators. This is mainly for defense in depth, since # for spectators. This is mainly for defense in depth, since
# email_address_visibility should mean spectators only # email_address_visibility should mean spectators only
# interact with fake email addresses anyway. # interact with fake email addresses anyway.
if is_email: if is_email:
raise MissingAuthenticationError() raise MissingAuthenticationError
if settings.RATE_LIMITING: if settings.RATE_LIMITING:
unique_avatar_key = f"{realm.id}/{email_or_id}/{medium}" unique_avatar_key = f"{realm.id}/{email_or_id}/{medium}"
@ -367,9 +367,9 @@ def patch_bot_backend(
if role is not None and bot.role != role: if role is not None and bot.role != role:
# Logic duplicated from update_user_backend. # Logic duplicated from update_user_backend.
if UserProfile.ROLE_REALM_OWNER in [role, bot.role] and not user_profile.is_realm_owner: if UserProfile.ROLE_REALM_OWNER in [role, bot.role] and not user_profile.is_realm_owner:
raise OrganizationOwnerRequiredError() raise OrganizationOwnerRequiredError
elif not user_profile.is_realm_admin: elif not user_profile.is_realm_admin:
raise OrganizationAdministratorRequiredError() raise OrganizationAdministratorRequiredError
do_change_user_role(bot, role, acting_user=user_profile) do_change_user_role(bot, role, acting_user=user_profile)

View File

@ -362,7 +362,7 @@ def api_jira_webhook(
return json_success(request) return json_success(request)
if event is None: if event is None:
raise AnomalousWebhookPayloadError() raise AnomalousWebhookPayloadError
if event is not None: if event is not None:
content_func = JIRA_CONTENT_FUNCTION_MAPPER.get(event) content_func = JIRA_CONTENT_FUNCTION_MAPPER.get(event)

View File

@ -98,7 +98,7 @@ def topic_and_body(payload: WildValue) -> Tuple[str, str]:
blacklist blacklist
) )
if not previous_attributes: # nocoverage if not previous_attributes: # nocoverage
raise SuppressedEventError() raise SuppressedEventError
return "".join( return "".join(
"\n* " "\n* "
+ attribute.replace("_", " ").capitalize() + attribute.replace("_", " ").capitalize()
@ -119,18 +119,18 @@ def topic_and_body(payload: WildValue) -> Tuple[str, str]:
if resource == "account": if resource == "account":
if event == "updated": if event == "updated":
if "previous_attributes" not in payload["data"]: if "previous_attributes" not in payload["data"]:
raise SuppressedEventError() raise SuppressedEventError
topic = "account updates" topic = "account updates"
body = update_string() body = update_string()
else: else:
# Part of Stripe Connect # Part of Stripe Connect
raise NotImplementedEventTypeError() raise NotImplementedEventTypeError
if category == "application_fee": # nocoverage if category == "application_fee": # nocoverage
# Part of Stripe Connect # Part of Stripe Connect
raise NotImplementedEventTypeError() raise NotImplementedEventTypeError
if category == "balance": # nocoverage if category == "balance": # nocoverage
# Not that interesting to most businesses, I think # Not that interesting to most businesses, I think
raise NotImplementedEventTypeError() raise NotImplementedEventTypeError
if category == "charge": if category == "charge":
if resource == "charge": if resource == "charge":
if not topic: # only in legacy fixtures if not topic: # only in legacy fixtures
@ -160,10 +160,10 @@ def topic_and_body(payload: WildValue) -> Tuple[str, str]:
) )
if category == "checkout_beta": # nocoverage if category == "checkout_beta": # nocoverage
# Not sure what this is # Not sure what this is
raise NotImplementedEventTypeError() raise NotImplementedEventTypeError
if category == "coupon": # nocoverage if category == "coupon": # nocoverage
# Not something that likely happens programmatically # Not something that likely happens programmatically
raise NotImplementedEventTypeError() raise NotImplementedEventTypeError
if category == "customer": if category == "customer":
if resource == "customer": if resource == "customer":
# Running into the 60 character topic limit. # Running into the 60 character topic limit.
@ -260,10 +260,10 @@ def topic_and_body(payload: WildValue) -> Tuple[str, str]:
) )
if category.startswith("issuing"): # nocoverage if category.startswith("issuing"): # nocoverage
# Not implemented # Not implemented
raise NotImplementedEventTypeError() raise NotImplementedEventTypeError
if category.startswith("order"): # nocoverage if category.startswith("order"): # nocoverage
# Not implemented # Not implemented
raise NotImplementedEventTypeError() raise NotImplementedEventTypeError
if category in [ if category in [
"payment_intent", "payment_intent",
"payout", "payout",
@ -282,7 +282,7 @@ def topic_and_body(payload: WildValue) -> Tuple[str, str]:
# Not implemented. In theory doing something like # Not implemented. In theory doing something like
# body = default_body() # body = default_body()
# may not be hard for some of these # may not be hard for some of these
raise NotImplementedEventTypeError() raise NotImplementedEventTypeError
if body is None: if body is None:
raise UnsupportedWebhookEventTypeError(event_type) raise UnsupportedWebhookEventTypeError(event_type)

View File

@ -78,7 +78,7 @@ def validate_remote_server(
raise InvalidZulipServerKeyError(role) raise InvalidZulipServerKeyError(role)
if remote_server.deactivated: if remote_server.deactivated:
raise RemoteServerDeactivatedError() raise RemoteServerDeactivatedError
if get_subdomain(request) != Realm.SUBDOMAIN_FOR_ROOT_DOMAIN: if get_subdomain(request) != Realm.SUBDOMAIN_FOR_ROOT_DOMAIN:
raise JsonableError(_("Invalid subdomain for push notifications bouncer")) raise JsonableError(_("Invalid subdomain for push notifications bouncer"))

View File

@ -14,7 +14,7 @@ def get_remote_server_by_uuid(uuid: str) -> "RemoteZulipServer":
try: try:
return RemoteZulipServer.objects.get(uuid=uuid) return RemoteZulipServer.objects.get(uuid=uuid)
except ValidationError: except ValidationError:
raise RemoteZulipServer.DoesNotExist() raise RemoteZulipServer.DoesNotExist
class RemoteZulipServer(models.Model): class RemoteZulipServer(models.Model):