Support both old and new versions of pyjwt
authorMagnus Hagander <magnus@hagander.net>
Tue, 7 Jan 2025 09:26:43 +0000 (10:26 +0100)
committerMagnus Hagander <magnus@hagander.net>
Tue, 7 Jan 2025 09:26:43 +0000 (10:26 +0100)
Pyjwt 2.0 made some incompatible changes in how a signature is verified,
so we need to support both the old and the new one.

For cleanliness, create a util/versionutil.py that wraps these version
specific things. There are clearly more.

postgresqleu/util/messaging/bluesky.py
postgresqleu/util/versionutil.py [new file with mode: 0644]

index 4345db59119be7b42bcf1b6e9e096104c26fb958..76e4a7dd6dec53076f8e1e945c917728ed77c47d 100644 (file)
@@ -2,11 +2,11 @@ from django.core.validators import ValidationError
 from django import forms
 
 from datetime import datetime, timezone, timedelta
-import jwt
 import re
 import requests
 
 from postgresqleu.util.image import get_image_contenttype_from_bytes
+from postgresqleu.util.versionutil import decode_unverified_jwt
 
 from postgresqleu.confreg.models import MessagingProvider
 from postgresqleu.confreg.backendforms import BackendSeriesMessagingForm
@@ -107,8 +107,8 @@ class Bluesky(object):
         provider.config.update({
             'accessjwt': response['accessJwt'],
             'refreshjwt': response['refreshJwt'],
-            'accesstokenexpires': jwt.decode(response['accessJwt'], verify=False)['exp'],
-            'refreshtokenexpires': jwt.decode(response['refreshJwt'], verify=False)['exp'],
+            'accesstokenexpires': decode_unverified_jwt(response['accessJwt'])['exp'],
+            'refreshtokenexpires': decode_unverified_jwt(response['refreshJwt'])['exp'],
             'handle': response['handle'],
             'did': response['did'],
         })
diff --git a/postgresqleu/util/versionutil.py b/postgresqleu/util/versionutil.py
new file mode 100644 (file)
index 0000000..24f17e2
--- /dev/null
@@ -0,0 +1,9 @@
+# Generic wrappers to handle backwards incompatible changes in dependencies
+import jwt
+
+
+def decode_unverified_jwt(j):
+    if jwt.__version__ > 2:
+        return jwt.decode(j, options={'verify_signature': False})
+    else:
+        return jwt.decode(j, verify=False)