easyctf-2017/server/api/utils.py

102 lines
3.1 KiB
Python
Raw Normal View History

2015-12-23 03:44:51 +00:00
import datetime
2016-03-03 05:36:51 +00:00
import hashlib
2015-12-23 23:23:18 +00:00
import json
2015-12-23 03:44:51 +00:00
import random
2016-01-12 03:54:26 +00:00
import re
2016-01-16 16:41:16 +00:00
import requests
2015-12-23 03:44:51 +00:00
import string
2015-12-23 23:23:18 +00:00
import traceback
2016-01-06 06:15:57 +00:00
import unicodedata
2015-12-23 03:44:51 +00:00
2016-03-03 05:36:51 +00:00
from PIL import Image, ImageDraw
2016-01-16 16:41:16 +00:00
from flask import current_app as app
2015-12-23 23:23:18 +00:00
from functools import wraps
2015-12-23 03:44:51 +00:00
from werkzeug.security import generate_password_hash, check_password_hash
2016-01-12 03:54:26 +00:00
__check_email_format = lambda email: re.match(".+@.+\..{2,}", email) is not None
__check_ascii = lambda s: all(c in string.printable for c in s)
2016-01-16 21:12:32 +00:00
__check_alphanumeric = lambda s: all(c in string.digits + string.ascii_uppercase + string.ascii_lowercase for c in s)
2016-01-12 03:54:26 +00:00
2015-12-23 03:44:51 +00:00
def hash_password(s):
2015-12-23 23:23:18 +00:00
return generate_password_hash(s)
2015-12-23 03:44:51 +00:00
def check_password(hashed_password, try_password):
2015-12-23 23:23:18 +00:00
return check_password_hash(hashed_password, try_password)
2015-12-23 03:44:51 +00:00
2016-01-06 06:15:57 +00:00
def generate_string(length=32, alpha=string.hexdigits):
return "".join([random.choice(alpha) for x in range(length)])
2015-12-23 03:44:51 +00:00
def unix_time_millis(dt):
2015-12-23 23:23:18 +00:00
epoch = datetime.datetime.utcfromtimestamp(0)
return (dt - epoch).total_seconds() * 1000.0
2015-12-23 03:44:51 +00:00
def get_time_since_epoch():
2015-12-23 23:23:18 +00:00
return unix_time_millis(datetime.datetime.now())
2016-01-06 06:15:57 +00:00
def flat_multi(multidict):
flat = {}
for key, values in multidict.items():
value = values[0] if type(values) == list and len(values) == 1 else values
2016-01-12 03:54:26 +00:00
flat[key] = value.encode("utf-8")
2016-01-16 16:41:16 +00:00
return flat
def send_email(recipient, subject, body):
2016-03-03 05:36:51 +00:00
api_key = app.config["MG_API_KEY"]
data = {"from": "EasyCTF Administrator <%s>" % (app.config["ADMIN_EMAIL"]),
"to": recipient,
"subject": subject,
"text": body
}
auth = ("api", api_key)
return requests.post("https://api.mailgun.net/v3/%s/messages" % (app.config["MG_HOST"]), auth=auth, data=data)
def generate_identicon(email, filename):
email = email.strip().lower()
h = hashlib.sha1(email).hexdigest()
size = 256
margin = 0.08
baseMargin = int(size * margin)
cell = int((size - baseMargin * 2.0) / 5)
margin = int((size - cell * 5.0) / 2)
image = Image.new("RGB", (size, size))
draw = ImageDraw.Draw(image)
def hsl2rgb(h, s, b):
h *= 6
s1 = []
s *= b if b < 0.5 else 1-b
b += s
s1.append(b)
s1.append(b - h % 1 * s * 2)
s *= 2
b -= s
s1.append(b)
s1.append(b)
s1.append(b + h % 1 * s)
s1.append(b + s)
return [
s1[~~h % 6], s1[(h|16) % 6], s1[(h|8) % 6]
]
rgb = hsl2rgb(int(h[-7:], 16) & 0xfffffff, 0.5, 0.7)
bg = (255, 255, 255)
fg = (int(rgb[0] * 255), int(rgb[1] * 255), int(rgb[2] * 255))
# print fg, bg
draw.rectangle([(0, 0), (size, size)], fill=bg)
for i in range(15):
c = bg if int(h[i], 16) % 2 == 1 else fg
if i < 5:
draw.rectangle([(2*cell + margin, i*cell + margin), (3*cell + margin, (i+1)*cell + margin)], fill=c)
elif i < 10:
draw.rectangle([(1*cell + margin, (i-5)*cell + margin), (2*cell + margin, (i-4)*cell + margin)], fill=c)
draw.rectangle([(3*cell + margin, (i-5)*cell + margin), (4*cell + margin, (i-4)*cell + margin)], fill=c)
elif i < 15:
draw.rectangle([(0*cell + margin, (i-10)*cell + margin), (1*cell + margin, (i-9)*cell + margin)], fill=c)
draw.rectangle([(4*cell + margin, (i-10)*cell + margin), (5*cell + margin, (i-9)*cell + margin)], fill=c)
image.save(open("pfp/%s.png" % filename, "w"), "PNG")
return