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
# 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)
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)
# 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:
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()
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):
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)
'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):
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 = {}
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)
# 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')