initial commit

This commit is contained in:
FinnStutzenstein committed 2020-04-13 08:31:44 +02:00
commit 9d018e00be
82 files changed
+2407

No files matched your search

+58
View File
@@ -0,0 +1,58 @@
from functools import wraps
from flask import request, session
from max.crypto import constant_time_compare, get_random_string
from max.middlewares import BaseMiddleware
CSRF_TOKEN_KEY = "csrf_token"
CSRF_TOKEN_LENGTH = 32
class CsrfMiddleware(BaseMiddleware):
def __call__(self, *args, **kwargs):
error = self.process_request()
if error is not None:
# clear csrf from session
if CSRF_TOKEN_KEY in session:
del session[CSRF_TOKEN_KEY]
return error, 400
return self.handler(*args, **kwargs)
def process_request(self):
""" If a string is returned, it mist be used as a 400er error """
if getattr(self.handler, "no_csrf", False):
return
session_has_csrf_token = CSRF_TOKEN_KEY in session
method_is_unsafe = request.method.lower() != "get"
if not session_has_csrf_token and method_is_unsafe:
return "CSRF token is missing"
elif not session_has_csrf_token and not method_is_unsafe:
session[CSRF_TOKEN_KEY] = get_random_string(CSRF_TOKEN_LENGTH)
elif session_has_csrf_token and method_is_unsafe:
return self.check_token(session[CSRF_TOKEN_KEY], request.form)
def check_token(self, session_token, formdata):
if CSRF_TOKEN_KEY not in formdata:
return "No CSRF token"
request_token = formdata[CSRF_TOKEN_KEY]
if len(request_token) != CSRF_TOKEN_LENGTH:
return "Wrong CSRF token"
elif not constant_time_compare(request_token, session_token):
return "Wrong CSRF token"
def no_csrf(handler):
@wraps(handler)
def wrapped_handler(*args, **kwargs):
return handler(*args, **kwargs)
wrapped_handler.no_csrf = True
return wrapped_handler