122 lines
3.2 KiB
Python
Executable File
122 lines
3.2 KiB
Python
Executable File
from hmac import compare_digest as checkHash
|
|
from django.http import HttpResponse
|
|
from threading import Thread
|
|
import threading
|
|
import requests
|
|
import crypt
|
|
import json
|
|
import jwt
|
|
|
|
# Session / Token Methods
|
|
|
|
tokenKey = 'U0VDUkVUX1BBU1NfQ0hFQ0s#!@#SDS!#'
|
|
tokens = []
|
|
|
|
def createSession(request, userDict):
|
|
newToken = createToken(userDict)
|
|
tokens.append(newToken)
|
|
return newToken
|
|
|
|
def createToken(userDict):
|
|
return jwt.encode( { 'payload': userDict }, tokenKey, algorithm = 'HS256' ).decode('UTF-8')
|
|
|
|
def checkSession(request, privilige):
|
|
token = tryGetTokenFromRequest(request)
|
|
for currentToken in tokens:
|
|
if token == currentToken:
|
|
if decodeToken(currentToken)['payload']['privilige'] >= privilige:
|
|
return True
|
|
else:
|
|
return False
|
|
return False
|
|
|
|
def tryGetTokenFromRequest(request):
|
|
try:
|
|
return jsonLoad(request)['token']
|
|
except:
|
|
pass
|
|
|
|
def decodeToken(token):
|
|
return jwt.decode( token, tokenKey, algorithms = ['HS256'] )
|
|
|
|
def checkUserPermission(modelDict, request):
|
|
|
|
def UserIsAdmin(token):
|
|
return decodeToken(token)['payload']['privilige'] == 3
|
|
|
|
def UserIsModer(token):
|
|
return decodeToken(token)['payload']['privilige'] == 2
|
|
|
|
def checkUserChanges(modelDict, token):
|
|
return decodeToken(token)['payload']['id'] == modelDict['user_id']
|
|
|
|
def checkUser(modelDict, token):
|
|
return decodeToken(token)['payload']['id'] == modelDict['id']
|
|
|
|
def modelIsNotUser(modelDict):
|
|
return 'user_id' in modelDict
|
|
|
|
def modelIsUser(modelDict):
|
|
return 'login' in modelDict
|
|
|
|
def checkCheats(modelDict, token):
|
|
if 'privilige' in modelDict:
|
|
if modelDict['privilige'] != decodeToken(token)['payload']['privilige']:
|
|
return True
|
|
else:
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
token = tryGetTokenFromRequest(request)
|
|
if modelIsNotUser(modelDict):
|
|
if UserIsAdmin(token):
|
|
return True
|
|
elif UserIsModer(token):
|
|
return True
|
|
elif checkUserChanges(modelDict, token):
|
|
return True
|
|
else:
|
|
return False
|
|
elif modelIsUser(modelDict):
|
|
if UserIsAdmin(token):
|
|
return True
|
|
elif checkCheats(modelDict, token):
|
|
return False
|
|
elif checkUser(modelDict, token):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def deleteSession(request):
|
|
token = jsonLoad(request)['token']
|
|
try:
|
|
tokens.remove(token)
|
|
return HttpResponse("Session Has Been Deleted")
|
|
except:
|
|
return HttpResponse("Session Delete Error")
|
|
|
|
# Security Hash / Crypt Methods
|
|
|
|
def createPassHash(password):
|
|
return crypt.crypt(password)
|
|
|
|
def checkPassHash(password, hashedPass):
|
|
return checkHash(hashedPass, crypt.crypt(password, hashedPass))
|
|
|
|
# Thread Method
|
|
|
|
def newThread(function):
|
|
|
|
def decorator(*args, **kwargs):
|
|
thread = Thread(target = function, args = args, kwargs = kwargs)
|
|
thread.daemon = True
|
|
thread.start()
|
|
|
|
return decorator
|
|
|
|
# JSON Load Method
|
|
|
|
def jsonLoad(self):
|
|
return json.loads(self.body.decode('utf-8'))
|