|
|
|
@@ -1,3 +1,6 @@ |
|
|
|
import web |
|
|
|
from uuid import uuid4 |
|
|
|
|
|
|
|
|
|
|
|
def get_nav_bar(session): |
|
|
|
""" |
|
|
|
@@ -38,3 +41,40 @@ def get_element_count(data, element): |
|
|
|
except: |
|
|
|
break |
|
|
|
return task_count |
|
|
|
|
|
|
|
|
|
|
|
def csrf_token(): |
|
|
|
""" |
|
|
|
Get the CSRF token for the session |
|
|
|
""" |
|
|
|
session = web.ctx.session |
|
|
|
|
|
|
|
if 'csrf_token' not in session: |
|
|
|
session.csrf_token = uuid4().hex |
|
|
|
|
|
|
|
return session.csrf_token |
|
|
|
|
|
|
|
|
|
|
|
def csrf_field(): |
|
|
|
""" |
|
|
|
Return a HTML form field for the CSRF token |
|
|
|
""" |
|
|
|
return f'<input type="hidden" name="csrf_token" value="{csrf_token()}" />' |
|
|
|
|
|
|
|
|
|
|
|
def csrf_protected(f): |
|
|
|
""" |
|
|
|
Decorate a function to do a CSRF check. |
|
|
|
""" |
|
|
|
def decorated(*args, **kwargs): |
|
|
|
session = web.ctx.session |
|
|
|
inp = web.input() |
|
|
|
if not ('csrf_token' in inp and inp.csrf_token == session.pop('csrf_token', None)): |
|
|
|
raise web.HTTPError( |
|
|
|
'400 Bad request', |
|
|
|
{'content-type': 'text/html'}, |
|
|
|
'Cross-site request forgery attempt', |
|
|
|
) |
|
|
|
return f(*args, **kwargs) |
|
|
|
|
|
|
|
return decorated |