crypto.py (1759B)
1 import hashlib 2 import secrets 3 import jwt 4 import datetime 5 import os 6 import logging 7 8 from html import escape 9 from blueprints.utils import database 10 from functools import wraps 11 from flask import request, jsonify, abort, session 12 from dotenv import load_dotenv 13 14 load_dotenv() 15 16 jwt_secret = os.getenv("JWT_SECRET") 17 18 19 def hash_string(string): 20 sha3 = hashlib.sha3_512() 21 sha3.update(string.encode('utf-8')) 22 23 return sha3.hexdigest() 24 25 26 def verify_hash(hash1, hash2): 27 return secrets.compare_digest(hash1, hash2) 28 29 30 def create_jwt(name): 31 return jwt.encode({ 32 "username": escape(name), 33 "isAdmin": 1 if database.is_admin(name) else 0, 34 "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1) 35 }, jwt_secret, algorithm="HS512") 36 37 38 def decode_jwt(token): 39 try: 40 return jwt.decode(token, jwt_secret, algorithms=["HS512"]) 41 except jwt.ExpiredSignatureError: 42 return None 43 except jwt.InvalidTokenError: 44 return None 45 46 47 def require_token(f): 48 @wraps(f) 49 def decorated_function(*args, **kwargs): 50 token = session.get('jwt-token', None) 51 52 if not token: 53 logging.warning("No JWT token provided") 54 return abort(403) 55 56 try: 57 data = jwt.decode(token, jwt_secret, algorithms=['HS512']) 58 except jwt.ExpiredSignatureError: 59 logging.info("JWT token has expired") 60 return jsonify({'message': 'Token has expired'}), 401 61 except jwt.InvalidTokenError: 62 logging.warning("Invalid JWT token provided") 63 return abort(403) 64 65 # You can access the token payload in the route function using data 66 kwargs['jwt_data'] = data 67 68 return f(*args, **kwargs) 69 70 return decorated_function 71