Skip to content

Commit c5c3ab6

Browse files
mateuszmanderatimabbott
authored andcommitted
remote_server: Migrate RemoteZulipServer.uuid to be UUIDField.
Given that these values are uuids, it's better to use UUIDField which is meant for exactly that, rather than an arbitrary CharField. This requires modifying some tests to use valid uuids.
1 parent e48120f commit c5c3ab6

File tree

7 files changed

+43
-17
lines changed

7 files changed

+43
-17
lines changed

corporate/tests/test_stripe.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import random
55
import re
66
import sys
7+
import uuid
78
from dataclasses import dataclass
89
from datetime import datetime, timedelta, timezone
910
from decimal import Decimal
@@ -4424,7 +4425,7 @@ def test_is_sponsored_realm(self) -> None:
44244425
self.assertTrue(is_sponsored_realm(realm))
44254426

44264427
def test_change_remote_server_plan_type(self) -> None:
4427-
server_uuid = "demo-1234"
4428+
server_uuid = str(uuid.uuid4())
44284429
remote_server = RemoteZulipServer.objects.create(
44294430
uuid=server_uuid,
44304431
api_key="magic_secret_api_key",

tools/lib/capitalization.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
r"URL",
5151
r"Ubuntu",
5252
r"Updown",
53+
r"UUID",
5354
r"V5",
5455
r"Webathena",
5556
r"Windows",

zerver/tests/test_decorators.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import base64
22
import os
33
import re
4+
import uuid
45
from collections import defaultdict
56
from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple
67
from unittest import mock, skipUnless
@@ -644,7 +645,7 @@ def test_rate_limiting_happens_in_normal_case(self) -> None:
644645

645646
@skipUnless(settings.ZILENCER_ENABLED, "requires zilencer")
646647
def test_rate_limiting_happens_if_remote_server(self) -> None:
647-
server_uuid = "1234-abcd"
648+
server_uuid = str(uuid.uuid4())
648649
server = RemoteZulipServer(
649650
uuid=server_uuid,
650651
api_key="magic_secret_api_key",

zerver/tests/test_external.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import time
2+
import uuid
23
from contextlib import contextmanager
34
from typing import IO, Any, Callable, Iterator, Optional, Sequence
45
from unittest import mock, skipUnless
@@ -411,7 +412,7 @@ def test_tor_file_not_found(self) -> None:
411412
@skipUnless(settings.ZILENCER_ENABLED, "requires zilencer")
412413
@rate_limit_rule(1, 5, domain="api_by_remote_server")
413414
def test_hit_ratelimits_as_remote_server(self) -> None:
414-
server_uuid = "1234-abcd"
415+
server_uuid = str(uuid.uuid4())
415416
server = RemoteZulipServer(
416417
uuid=server_uuid,
417418
api_key="magic_secret_api_key",
@@ -433,7 +434,7 @@ def test_hit_ratelimits_as_remote_server(self) -> None:
433434
self.assertEqual(
434435
m.output,
435436
[
436-
"WARNING:zerver.lib.rate_limiter:Remote server <RemoteZulipServer demo.example.com 1234-abcd> exceeded rate limits on domain api_by_remote_server"
437+
f"WARNING:zerver.lib.rate_limiter:Remote server <RemoteZulipServer demo.example.com {server_uuid[:12]}> exceeded rate limits on domain api_by_remote_server"
437438
],
438439
)
439440
finally:

zerver/tests/test_push_notifications.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
@skipUnless(settings.ZILENCER_ENABLED, "requires zilencer")
9191
class BouncerTestCase(ZulipTestCase):
9292
def setUp(self) -> None:
93-
self.server_uuid = "1234-abcd"
93+
self.server_uuid = "6cde5f7a-1f7e-4978-9716-49f69ebfc9fe"
9494
server = RemoteZulipServer(
9595
uuid=self.server_uuid,
9696
api_key="magic_secret_api_key",
@@ -234,12 +234,15 @@ def test_register_remote_push_user_paramas(self) -> None:
234234
self.server_uuid, endpoint, dict(user_id=user_id, token_kind=token_kind, token=token)
235235
)
236236
self.assert_json_error(
237-
result, "Zulip server auth failure: key does not match role 1234-abcd", status_code=401
237+
result,
238+
"Zulip server auth failure: key does not match role 6cde5f7a-1f7e-4978-9716-49f69ebfc9fe",
239+
status_code=401,
238240
)
239241

240242
del self.API_KEYS[self.server_uuid]
241243

242-
credentials = "{}:{}".format("5678-efgh", "invalid")
244+
credentials_uuid = str(uuid.uuid4())
245+
credentials = "{}:{}".format(credentials_uuid, "invalid")
243246
api_auth = "Basic " + base64.b64encode(credentials.encode()).decode()
244247
result = self.client_post(
245248
endpoint,
@@ -248,7 +251,7 @@ def test_register_remote_push_user_paramas(self) -> None:
248251
)
249252
self.assert_json_error(
250253
result,
251-
"Zulip server auth failure: 5678-efgh is not registered -- did you run `manage.py register_server`?",
254+
f"Zulip server auth failure: {credentials_uuid} is not registered -- did you run `manage.py register_server`?",
252255
status_code=401,
253256
)
254257

@@ -325,7 +328,7 @@ def test_send_notification_endpoint(self) -> None:
325328
logger.output,
326329
[
327330
"INFO:zilencer.views:"
328-
f"Sending mobile push notifications for remote user 1234-abcd:{hamlet.id}: "
331+
f"Sending mobile push notifications for remote user 6cde5f7a-1f7e-4978-9716-49f69ebfc9fe:{hamlet.id}: "
329332
"2 via FCM devices, 1 via APNs devices"
330333
],
331334
)
@@ -673,7 +676,7 @@ def check_counts(
673676
self.assertEqual(
674677
warn_log.output,
675678
[
676-
"WARNING:root:Invalid data saving zilencer_remoteinstallationcount for server demo.example.com/1234-abcd"
679+
"WARNING:root:Invalid data saving zilencer_remoteinstallationcount for server demo.example.com/6cde5f7a-1f7e-4978-9716-49f69ebfc9fe"
677680
],
678681
)
679682

@@ -784,7 +787,7 @@ def test_realmauditlog_data_mapping(self) -> None:
784787
send_analytics_to_remote_server()
785788
remote_log_entry = RemoteRealmAuditLog.objects.order_by("id").last()
786789
assert remote_log_entry is not None
787-
self.assertEqual(remote_log_entry.server.uuid, self.server_uuid)
790+
self.assertEqual(str(remote_log_entry.server.uuid), self.server_uuid)
788791
self.assertEqual(remote_log_entry.remote_id, log_entry.id)
789792
self.assertEqual(remote_log_entry.event_time, self.TIME_ZERO)
790793
self.assertEqual(remote_log_entry.backfilled, True)
@@ -921,7 +924,7 @@ def test_end_to_end(self) -> None:
921924
views_logger.output,
922925
[
923926
"INFO:zilencer.views:"
924-
f"Sending mobile push notifications for remote user 1234-abcd:{self.user_profile.id}: "
927+
f"Sending mobile push notifications for remote user 6cde5f7a-1f7e-4978-9716-49f69ebfc9fe:{self.user_profile.id}: "
925928
f"{len(gcm_devices)} via FCM devices, {len(apns_devices)} via APNs devices"
926929
],
927930
)
@@ -982,7 +985,7 @@ def test_unregistered_client(self) -> None:
982985
views_logger.output,
983986
[
984987
"INFO:zilencer.views:"
985-
f"Sending mobile push notifications for remote user 1234-abcd:{self.user_profile.id}: "
988+
f"Sending mobile push notifications for remote user 6cde5f7a-1f7e-4978-9716-49f69ebfc9fe:{self.user_profile.id}: "
986989
f"{len(gcm_devices)} via FCM devices, {len(apns_devices)} via APNs devices"
987990
],
988991
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.2.9 on 2021-12-22 10:06
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("zilencer", "0020_remotezulipserverauditlog"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="remotezulipserver",
15+
name="uuid",
16+
field=models.UUIDField(unique=True),
17+
),
18+
]

zilencer/models.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime
22
from typing import List, Tuple
3+
from uuid import UUID
34

45
from django.conf import settings
56
from django.db import models
@@ -26,7 +27,7 @@ class RemoteZulipServer(models.Model):
2627

2728
# The unique UUID (`zulip_org_id`) and API key (`zulip_org_key`)
2829
# for this remote server registration.
29-
uuid: str = models.CharField(max_length=UUID_LENGTH, unique=True)
30+
uuid: UUID = models.UUIDField(unique=True)
3031
api_key: str = models.CharField(max_length=API_KEY_LENGTH)
3132

3233
# The hostname and contact details are not verified/trusted. Thus,
@@ -44,10 +45,10 @@ class RemoteZulipServer(models.Model):
4445
plan_type: int = models.PositiveSmallIntegerField(default=PLAN_TYPE_SELF_HOSTED)
4546

4647
def __str__(self) -> str:
47-
return f"<RemoteZulipServer {self.hostname} {self.uuid[0:12]}>"
48+
return f"<RemoteZulipServer {self.hostname} {str(self.uuid)[0:12]}>"
4849

4950
def format_requestor_for_logs(self) -> str:
50-
return "zulip-server:" + self.uuid
51+
return "zulip-server:" + str(self.uuid)
5152

5253

5354
class RemotePushDeviceToken(AbstractPushDeviceToken):
@@ -137,7 +138,7 @@ def __init__(
137138
assert not settings.RUNNING_INSIDE_TORNADO
138139
assert settings.ZILENCER_ENABLED
139140

140-
self.uuid = remote_server.uuid
141+
self.uuid = str(remote_server.uuid)
141142
self.domain = domain
142143
super().__init__()
143144

0 commit comments

Comments
 (0)