Mark all ForeignKeys as on_delete=CASCADE
authorMagnus Hagander <magnus@hagander.net>
Wed, 1 Apr 2020 18:34:05 +0000 (20:34 +0200)
committerMagnus Hagander <magnus@hagander.net>
Wed, 1 Apr 2020 18:34:05 +0000 (20:34 +0200)
django/archives/auth.py
django/archives/mailarchives/migrations/0001_initial.py
django/archives/mailarchives/migrations/0002_list_permissions.py
django/archives/mailarchives/models.py
loader/lib/parser.py

index 6ccf131872b4bdcd684dffe540745fdd80f1427b..4ae553b2f78f5080e6ca577c57fb9e95f87f8fbf 100644 (file)
@@ -29,10 +29,10 @@ import base64
 import json
 import socket
 from urllib.parse import urlparse, urlencode, parse_qs
-import urllib.request
-from Crypto.Cipher import AES
-from Crypto.Hash import SHA
-from Crypto import Random
+import requests
+from Cryptodome.Cipher import AES
+from Cryptodome.Hash import SHA
+from Cryptodome import Random
 import time
 
 
@@ -49,11 +49,6 @@ class AuthBackend(ModelBackend):
 
 # Handle login requests by sending them off to the main site
 def login(request):
-    if not hasattr(settings, 'PGAUTH_REDIRECT'):
-        # No pgauth installed, so allow local installs.
-        from django.contrib.auth.views import login
-        return login(request, template_name='admin.html')
-
     if 'next' in request.GET:
         # Put together an url-encoded dict of parameters we're getting back,
         # including a small nonce at the beginning to make sure it doesn't
@@ -63,7 +58,7 @@ def login(request):
         r = Random.new()
         iv = r.read(16)
         encryptor = AES.new(SHA.new(settings.SECRET_KEY.encode('ascii')).digest()[:16], AES.MODE_CBC, iv)
-        cipher = encryptor.encrypt(s + ' ' * (16 - (len(s) % 16)))  # pad to 16 bytes
+        cipher = encryptor.encrypt(s.encode('ascii') + b' ' * (16 - (len(s) % 16)))  # pad to 16 bytes
 
         return HttpResponseRedirect("%s?d=%s$%s" % (
             settings.PGAUTH_REDIRECT,
@@ -138,14 +133,14 @@ def auth_receive(request):
 a different username than %s.
 
 This is almost certainly caused by some legacy data in our database.
-Please send an email to webmaster@postgresql.eu, indicating the username
+Please send an email to webmaster@postgresql.org, indicating the username
 and email address from above, and we'll manually merge the two accounts
 for you.
 
 We apologize for the inconvenience.
 """ % (data['e'][0], data['u'][0]), content_type='text/plain')
 
-        if hasattr(settings, 'PGAUTH_CREATEUSER_CALLBACK'):
+        if getattr(settings, 'PGAUTH_CREATEUSER_CALLBACK', None):
             res = getattr(settings, 'PGAUTH_CREATEUSER_CALLBACK')(
                 data['u'][0],
                 data['e'][0],
@@ -208,18 +203,20 @@ def user_search(searchterm=None, userid=None):
     else:
         q = {'s': searchterm}
 
-    u = urllib.request.urlopen('%ssearch/?%s' % (
-        settings.PGAUTH_REDIRECT,
-        urlencode(q),
-    ))
-    (ivs, datas) = u.read().split('&')
-    u.close()
+    r = requests.get(
+        '{0}search/'.format(settings.PGAUTH_REDIRECT),
+        params=q,
+    )
+    if r.status_code != 200:
+        return []
+
+    (ivs, datas) = r.text.encode('utf8').split(b'&')
 
     # Decryption time
     decryptor = AES.new(base64.b64decode(settings.PGAUTH_KEY),
                         AES.MODE_CBC,
                         base64.b64decode(ivs, "-_"))
-    s = decryptor.decrypt(base64.b64decode(datas, "-_")).rstrip(')
+    s = decryptor.decrypt(base64.b64decode(datas, "-_")).rstrip(b' ').decode('utf8')
     j = json.loads(s)
 
     return j
index 8c8da299ecb231a9a4496cf55cd25ce5cf2c3b40..8008ba66da8015479c49332becdeca0d263314b2 100644 (file)
@@ -69,11 +69,11 @@ class Migration(migrations.Migration):
         migrations.AddField(
             model_name='list',
             name='group',
-            field=models.ForeignKey(to='mailarchives.ListGroup', db_column='groupid'),
+            field=models.ForeignKey(to='mailarchives.ListGroup', db_column='groupid', on_delete=models.CASCADE),
         ),
         migrations.AddField(
             model_name='attachment',
             name='message',
-            field=models.ForeignKey(to='mailarchives.Message', db_column='message'),
+            field=models.ForeignKey(to='mailarchives.Message', db_column='message', on_delete=models.CASCADE),
         ),
     ]
index 4f2abbb256e8cc773e68c689fc4caca80662c11d..58c403015b5e42f348f55f164459b3dd917fbd86 100644 (file)
@@ -29,7 +29,7 @@ class Migration(migrations.Migration):
         migrations.AddField(
             model_name='listsubscriber',
             name='list',
-            field=models.ForeignKey(to='mailarchives.List'),
+            field=models.ForeignKey(to='mailarchives.List', on_delete=models.CASCADE),
         ),
         migrations.AlterUniqueTogether(
             name='listsubscriber',
index 0affa3b418ad1d21c841e61521ec78f1eeb6845e..5ffa4a47e08ae1f399cd5e289aa448324830727a 100644 (file)
@@ -76,7 +76,7 @@ class List(models.Model):
     shortdesc = models.TextField(null=False, blank=False)
     description = models.TextField(null=False, blank=False)
     active = models.BooleanField(null=False, blank=False)
-    group = models.ForeignKey(ListGroup, db_column='groupid')
+    group = models.ForeignKey(ListGroup, db_column='groupid', on_delete=models.CASCADE)
     subscriber_access = models.BooleanField(null=False, blank=False, default=False, help_text="Subscribers can access contents (default is admins only)")
 
     @property
@@ -90,7 +90,7 @@ class List(models.Model):
 
 
 class Attachment(models.Model):
-    message = models.ForeignKey(Message, null=False, blank=False, db_column='message')
+    message = models.ForeignKey(Message, null=False, blank=False, db_column='message', on_delete=models.CASCADE)
     filename = models.CharField(max_length=1000, null=False, blank=False)
     contenttype = models.CharField(max_length=1000, null=False, blank=False)
     # attachment = bytea, not supported by django at this point
@@ -113,7 +113,7 @@ class ListSubscriber(models.Model):
     # Only used when public access is not allowed.
     # We set the username of the community account instead of a
     # foreign key, because the user might not exist.
-    list = models.ForeignKey(List, null=False, blank=False)
+    list = models.ForeignKey(List, null=False, blank=False, on_delete=models.CASCADE)
     username = models.CharField(max_length=30, null=False, blank=False)
 
     class Meta:
@@ -122,8 +122,8 @@ class ListSubscriber(models.Model):
 
 
 class ResendMessage(models.Model):
-    message = models.ForeignKey(Message, null=False, blank=False)
-    sendto = models.ForeignKey(User, null=False, blank=False)
+    message = models.ForeignKey(Message, null=False, blank=False, on_delete=models.CASCADE)
+    sendto = models.ForeignKey(User, null=False, blank=False, on_delete=models.CASCADE)
     registeredat = models.DateTimeField(null=False, blank=False)
 
     class Meta:
@@ -131,7 +131,7 @@ class ResendMessage(models.Model):
 
 
 class LastResentMessage(models.Model):
-    sentto = models.ForeignKey(User, null=False, blank=False, primary_key=True)
+    sentto = models.ForeignKey(User, null=False, blank=False, primary_key=True, on_delete=models.CASCADE)
     sentat = models.DateTimeField(null=False, blank=False)
 
 
@@ -144,7 +144,7 @@ class ApiClient(models.Model):
 
 
 class ThreadSubscription(models.Model):
-    apiclient = models.ForeignKey(ApiClient, null=False, blank=False)
+    apiclient = models.ForeignKey(ApiClient, null=False, blank=False, on_delete=models.CASCADE)
     threadid = models.IntegerField(null=False, blank=False)
 
     class Meta:
index c6ee98fc08f1c5e95450355644e54be558b4ba5e..b9caace0f8bd450ca255c411780d68dde97b2d74 100644 (file)
@@ -258,12 +258,16 @@ class ArchivesParser(object):
                 # Don't include it if it looks like an attachment
                 if 'Content-Disposition' in p and p['Content-Disposition'].startswith('attachment'):
                     continue
-                return self.get_payload_as_unicode(p)
+                t = self.get_payload_as_unicode(p)
+                if t:
+                    return t
             if html_instead and p.get_params()[0][0].lower() == 'text/html':
                 # Don't include it if it looks like an attachment
                 if 'Content-Disposition' in p and p['Content-Disposition'].startswith('attachment'):
                     continue
-                return self.get_payload_as_unicode(p)
+                t = self.get_payload_as_unicode(p)
+                if t:
+                    return t
             if p.is_multipart():
                 b = self.recursive_first_plaintext(p, html_instead)
                 if b or b == '':