Update django app to python 3
authorMagnus Hagander <magnus@hagander.net>
Thu, 3 Jan 2019 10:59:40 +0000 (11:59 +0100)
committerMagnus Hagander <magnus@hagander.net>
Fri, 4 Jan 2019 11:24:06 +0000 (12:24 +0100)
django/archives/auth.py
django/archives/mailarchives/api.py
django/archives/mailarchives/templatetags/pgfilters.py
django/archives/mailarchives/views.py
django/archives/settings.py

index b3af1a571fb6f24f3934c718572d323b4e4fce8f..c24faa1fcae42d1b0e281fbb0b0e73f640d628a2 100644 (file)
@@ -28,8 +28,8 @@ from django.conf import settings
 import base64
 import json
 import socket
-import urlparse
-import urllib
+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
@@ -57,17 +57,17 @@ def login(request):
                # 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
                # encrypt the same way every time.
-               s = "t=%s&%s" % (int(time.time()), urllib.urlencode({'r': request.GET['next']}))
+               s = "t=%s&%s" % (int(time.time()), urlencode({'r': request.GET['next']}))
                # Now encrypt it
                r = Random.new()
                iv = r.read(16)
-               encryptor = AES.new(SHA.new(settings.SECRET_KEY).digest()[:16], AES.MODE_CBC, iv)
+               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
 
                return HttpResponseRedirect("%s?d=%s$%s" % (
                                settings.PGAUTH_REDIRECT,
-                           base64.b64encode(iv, "-_"),
-                           base64.b64encode(cipher, "-_"),
+                           base64.b64encode(iv, b"-_").decode('utf8'),
+                           base64.b64encode(cipher, b"-_").decode('utf8'),
                                ))
        else:
                return HttpResponseRedirect(settings.PGAUTH_REDIRECT)
@@ -95,11 +95,11 @@ def auth_receive(request):
        decryptor = AES.new(base64.b64decode(settings.PGAUTH_KEY),
                                                AES.MODE_CBC,
                                                base64.b64decode(str(request.GET['i']), "-_"))
-       s = decryptor.decrypt(base64.b64decode(str(request.GET['d']), "-_")).rstrip(')
+       s = decryptor.decrypt(base64.b64decode(str(request.GET['d']), "-_")).rstrip(b' ').decode('utf8')
 
        # Now un-urlencode it
        try:
-               data = urlparse.parse_qs(s, strict_parsing=True)
+               data = parse_qs(s, strict_parsing=True)
        except ValueError:
                return HttpResponse("Invalid encrypted data received.", status=400)
 
@@ -172,12 +172,12 @@ We apologize for the inconvenience.
        # redirect the user.
        if 'd' in data:
                (ivs, datas) = data['d'][0].split('$')
-               decryptor = AES.new(SHA.new(settings.SECRET_KEY).digest()[:16],
+               decryptor = AES.new(SHA.new(settings.SECRET_KEY.encode('ascii')).digest()[:16],
                                                        AES.MODE_CBC,
-                                                       base64.b64decode(ivs, "-_"))
-               s = decryptor.decrypt(base64.b64decode(datas, "-_")).rstrip(')
+                                                       base64.b64decode(ivs, b"-_"))
+               s = decryptor.decrypt(base64.b64decode(datas, "-_")).rstrip(b' ').decode('utf8')
                try:
-                       rdata = urlparse.parse_qs(s, strict_parsing=True)
+                       rdata = parse_qs(s, strict_parsing=True)
                except ValueError:
                        return HttpResponse("Invalid encrypted data received.", status=400)
                if 'r' in rdata:
@@ -205,9 +205,9 @@ def user_search(searchterm=None, userid=None):
        else:
                q = {'s': searchterm}
 
-       u = urllib.urlopen('%ssearch/?%s' % (
+       u = urllib.request.urlopen('%ssearch/?%s' % (
                settings.PGAUTH_REDIRECT,
-               urllib.urlencode(q),
+               urlencode(q),
                ))
        (ivs, datas) = u.read().split('&')
        u.close()
index 85eae8e6481011d01416dc30b2940f95251be761..0ec94e1a6be9cd508db497671178b1d8d38234f3 100644 (file)
@@ -2,8 +2,8 @@ from django.http import HttpResponse, HttpResponseForbidden
 from django.shortcuts import get_object_or_404
 from django.conf import settings
 
-from views import cache
-from models import Message, List, ApiClient, ThreadSubscription
+from .views import cache
+from .models import Message, List, ApiClient, ThreadSubscription
 
 import json
 
index 4f85e804283cfd3e02e9ada3ebff3a43e2d0bef6..77d5fec4acacfbabe8e2604d7369adf26cca9499 100644 (file)
@@ -48,4 +48,4 @@ def nameonly(value):
 @register.filter(name='md5')
 @stringfilter
 def md5(value):
-       return hashlib.md5(value).hexdigest()
+       return hashlib.md5(value.encode('utf8')).hexdigest()
index dc5c17748afa4513aea37c31a456fd39a72f5bb3..a5c87b3072feb30042a18676374e5ef4376847f6 100644 (file)
@@ -10,20 +10,20 @@ from django.db.models import Q
 from django.conf import settings
 
 import copy
-import urllib
 import re
 import os
 import base64
 from datetime import datetime, timedelta, date
 import calendar
 import email.parser
-from StringIO import StringIO
+import email.policy
+from io import BytesIO
 
 import json
 
-from redirecthandler import ERedirect
+from .redirecthandler import ERedirect
 
-from models import *
+from .models import *
 
 # Ensure the user is logged in (if it's not public lists)
 def ensure_logged_in(request):
@@ -117,7 +117,7 @@ def antispam_auth(fn):
                        if len(auth) != 2:
                                return HttpResponseForbidden("Invalid authentication")
                        if auth[0].lower() == "basic":
-                               user, pwd = base64.b64decode(auth[1]).split(':')
+                               user, pwd = base64.b64decode(auth[1]).decode('utf8', errors='ignore').split(':')
                                if user == 'archives' and pwd == 'antispam':
                                        # Actually run the function if auth is correct
                                        resp = fn(request, *_args, **_kwargs)
@@ -156,7 +156,7 @@ def get_all_groups_and_lists(request, listid=None):
                                'homelink': 'list/group/%s' % l.group.groupid,
                                }
 
-       return (sorted(groups.values(), key=lambda g: g['sortkey']), listgroupid)
+       return (sorted(list(groups.values()), key=lambda g: g['sortkey']), listgroupid)
 
 
 class NavContext(object):
@@ -395,7 +395,7 @@ SELECT l.listid,0,
         WHERE m.date<%(time)s AND lt.listid=l.listid
         ORDER BY m.date DESC LIMIT 1
  ) FROM l""", {
-                       'lists': listmap.keys(),
+                       'lists': list(listmap.keys()),
                        'time': dt,
                        })
        retval = {}
@@ -525,8 +525,8 @@ def _build_mbox(query, params, msgid=None):
 
        def _one_message(raw):
                # Parse as a message to generate headers
-               s = StringIO(raw)
-               parser = email.parser.Parser()
+               s = BytesIO(raw)
+               parser = email.parser.BytesParser(policy=email.policy.compat32)
                msg = parser.parse(s)
                return msg.as_string(unixfrom=True)
 
@@ -603,7 +603,7 @@ def search(request):
        # q = query to search for
        # ln = comma separate list of listnames to search in
        # d = number of days back to search for, or -1 (or not specified)
-       #     to search the full archives
+       #         to search the full archives
        # s = sort results by ['r'=rank, 'd'=date, 'i'=inverse date]
        if not request.method == 'POST':
                raise Http404('I only respond to POST')
index 4fe7e9685814edc445afddbc43756a120ed0693b..6a42a2603f730a87ff763b362a4b3aeb89ec100e 100644 (file)
@@ -159,7 +159,7 @@ API_CLIENTS = ('127.0.0.1',)
 PUBLIC_ARCHIVES = False
 
 try:
-       from settings_local import *
+       from .settings_local import *
 except ImportError:
        pass