Change: remove credentials from redis url in system status (#6104)

This commit is contained in:
shamoon 2024-03-14 08:20:34 -07:00 committed by GitHub
parent a196c14a58
commit 2c4a664df4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 1 deletions

View File

@ -100,6 +100,45 @@ class TestSystemStatus(APITestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["tasks"]["redis_status"], "OK") self.assertEqual(response.data["tasks"]["redis_status"], "OK")
def test_system_status_redis_no_credentials(self):
"""
GIVEN:
- Redis URL with credentials
WHEN:
- The user requests the system status
THEN:
- The response contains the redis URL but no credentials
"""
with override_settings(
_CHANNELS_REDIS_URL="redis://username:password@localhost:6379",
):
self.client.force_login(self.user)
response = self.client.get(self.ENDPOINT)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
response.data["tasks"]["redis_url"],
"redis://localhost:6379",
)
def test_system_status_redis_socket(self):
"""
GIVEN:
- Redis URL is socket
WHEN:
- The user requests the system status
THEN:
- The response contains the redis URL
"""
with override_settings(_CHANNELS_REDIS_URL="unix:///path/to/redis.sock"):
self.client.force_login(self.user)
response = self.client.get(self.ENDPOINT)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
response.data["tasks"]["redis_url"],
"unix:///path/to/redis.sock",
)
@mock.patch("celery.app.control.Inspect.ping") @mock.patch("celery.app.control.Inspect.ping")
def test_system_status_celery_ping(self, mock_ping): def test_system_status_celery_ping(self, mock_ping):
""" """

View File

@ -12,6 +12,7 @@ from pathlib import Path
from time import mktime from time import mktime
from unicodedata import normalize from unicodedata import normalize
from urllib.parse import quote from urllib.parse import quote
from urllib.parse import urlparse
import pathvalidate import pathvalidate
from django.apps import apps from django.apps import apps
@ -1617,6 +1618,10 @@ class SystemStatusView(GenericAPIView, PassUserMixin):
media_stats = os.statvfs(settings.MEDIA_ROOT) media_stats = os.statvfs(settings.MEDIA_ROOT)
redis_url = settings._CHANNELS_REDIS_URL redis_url = settings._CHANNELS_REDIS_URL
redis_url_parsed = urlparse(redis_url)
redis_constructed_url = f"{redis_url_parsed.scheme}://{redis_url_parsed.path or redis_url_parsed.hostname}"
if redis_url_parsed.hostname is not None:
redis_constructed_url += f":{redis_url_parsed.port}"
redis_error = None redis_error = None
with Redis.from_url(url=redis_url) as client: with Redis.from_url(url=redis_url) as client:
try: try:
@ -1728,7 +1733,7 @@ class SystemStatusView(GenericAPIView, PassUserMixin):
}, },
}, },
"tasks": { "tasks": {
"redis_url": redis_url, "redis_url": redis_constructed_url,
"redis_status": redis_status, "redis_status": redis_status,
"redis_error": redis_error, "redis_error": redis_error,
"celery_status": celery_active, "celery_status": celery_active,