1717# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1818
1919import os
20+ import json
21+ from datetime import datetime , date
2022from celery import Celery
2123from celery .security import setup_security
24+ from kombu .serialization import register
2225from app .configuration import CeleryConfig
2326
2427
2528def _patch_celery_cert_datetime ():
26- import datetime
2729 from celery .security .certificate import Certificate
2830
2931 _original_has_expired = Certificate .has_expired
@@ -33,11 +35,28 @@ def _patched_has_expired(self):
3335 return _original_has_expired (self )
3436 except TypeError :
3537 not_valid_after = self ._cert .not_valid_after_utc
36- return datetime .datetime . now (datetime .timezone .utc ) >= not_valid_after
38+ return datetime .now (datetime .timezone .utc ) >= not_valid_after
3739
3840 Certificate .has_expired = _patched_has_expired
3941
4042
43+ def _register_auth_serializer ():
44+ """Register a minimal auth serializer before setup_security() is called.
45+ The actual message signing is handled by setup_security().
46+ This is needed because setup_security() tries to enable the auth serializer
47+ but it must be registered first."""
48+
49+ def _encode_auth (data ):
50+ return json .dumps (data ).encode ('utf-8' ), 'application/auth'
51+
52+ def _decode_auth (data ):
53+ if isinstance (data , bytes ):
54+ data = data .decode ('utf-8' )
55+ return json .loads (data )
56+
57+ register ('auth' , _encode_auth , _decode_auth , content_type = 'application/auth' )
58+
59+
4160def _check_certificate_files ():
4261 key_path = CeleryConfig .security_key
4362 cert_path = CeleryConfig .security_certificate
@@ -63,6 +82,7 @@ def make_celery(name):
6382 )
6483
6584 if _check_certificate_files ():
85+ _register_auth_serializer ()
6686 _patch_celery_cert_datetime ()
6787 setup_security (
6888 allowed_serializers = ['auth' ],
0 commit comments