From 23cd37302b727f38e676d4969a1462f36d61b63b Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Thu, 3 Jan 2019 11:59:40 +0100 Subject: [PATCH] Update django app to python 3 --- django/archives/auth.py | 28 +++++++++---------- django/archives/mailarchives/api.py | 4 +-- .../mailarchives/templatetags/pgfilters.py | 2 +- django/archives/mailarchives/views.py | 20 ++++++------- django/archives/settings.py | 2 +- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/django/archives/auth.py b/django/archives/auth.py index b3af1a5..c24faa1 100644 --- a/django/archives/auth.py +++ b/django/archives/auth.py @@ -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() diff --git a/django/archives/mailarchives/api.py b/django/archives/mailarchives/api.py index 85eae8e..0ec94e1 100644 --- a/django/archives/mailarchives/api.py +++ b/django/archives/mailarchives/api.py @@ -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 diff --git a/django/archives/mailarchives/templatetags/pgfilters.py b/django/archives/mailarchives/templatetags/pgfilters.py index 4f85e80..77d5fec 100644 --- a/django/archives/mailarchives/templatetags/pgfilters.py +++ b/django/archives/mailarchives/templatetags/pgfilters.py @@ -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() diff --git a/django/archives/mailarchives/views.py b/django/archives/mailarchives/views.py index dc5c177..a5c87b3 100644 --- a/django/archives/mailarchives/views.py +++ b/django/archives/mailarchives/views.py @@ -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') diff --git a/django/archives/settings.py b/django/archives/settings.py index 4fe7e96..6a42a26 100644 --- a/django/archives/settings.py +++ b/django/archives/settings.py @@ -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 -- 2.39.5