Hello community,
here is the log from the commit of package python-flask-jwt-extended for
openSUSE:Factory checked in at 2019-09-10 00:06:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-flask-jwt-extended (Old)
and /work/SRC/openSUSE:Factory/.python-flask-jwt-extended.new.7948 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-flask-jwt-extended"
Tue Sep 10 00:06:05 2019 rev:5 rq:729500 version:3.22.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-flask-jwt-extended/python-flask-jwt-extended.changes
2019-08-28 18:35:01.141288537 +0200
+++
/work/SRC/openSUSE:Factory/.python-flask-jwt-extended.new.7948/python-flask-jwt-extended.changes
2019-09-10 00:06:09.805196678 +0200
@@ -1,0 +2,7 @@
+Mon Sep 9 15:00:48 UTC 2019 - Tomáš Chvátal <[email protected]>
+
+- Update to 3.22.0:
+ * Adds ability to check CSRF double submit token from form data instead of
+ headers
+
+-------------------------------------------------------------------
Old:
----
Flask-JWT-Extended-3.21.0.tar.gz
New:
----
Flask-JWT-Extended-3.22.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-flask-jwt-extended.spec ++++++
--- /var/tmp/diff_new_pack.PTmm5W/_old 2019-09-10 00:06:10.817196609 +0200
+++ /var/tmp/diff_new_pack.PTmm5W/_new 2019-09-10 00:06:10.825196609 +0200
@@ -17,7 +17,7 @@
Name: python-flask-jwt-extended
-Version: 3.21.0
+Version: 3.22.0
Release: 0
Summary: A Flask extension that provides JWT support
License: MIT
++++++ Flask-JWT-Extended-3.21.0.tar.gz -> Flask-JWT-Extended-3.22.0.tar.gz
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Flask-JWT-Extended-3.21.0/Flask_JWT_Extended.egg-info/PKG-INFO
new/Flask-JWT-Extended-3.22.0/Flask_JWT_Extended.egg-info/PKG-INFO
--- old/Flask-JWT-Extended-3.21.0/Flask_JWT_Extended.egg-info/PKG-INFO
2019-08-03 17:50:24.000000000 +0200
+++ new/Flask-JWT-Extended-3.22.0/Flask_JWT_Extended.egg-info/PKG-INFO
2019-08-28 18:23:28.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: Flask-JWT-Extended
-Version: 3.21.0
+Version: 3.22.0
Summary: Extended JWT integration with Flask
Home-page: https://github.com/vimalloc/flask-jwt-extended
Author: Landon Gilbert-Bland
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Flask-JWT-Extended-3.21.0/PKG-INFO
new/Flask-JWT-Extended-3.22.0/PKG-INFO
--- old/Flask-JWT-Extended-3.21.0/PKG-INFO 2019-08-03 17:50:24.000000000
+0200
+++ new/Flask-JWT-Extended-3.22.0/PKG-INFO 2019-08-28 18:23:32.000000000
+0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: Flask-JWT-Extended
-Version: 3.21.0
+Version: 3.22.0
Summary: Extended JWT integration with Flask
Home-page: https://github.com/vimalloc/flask-jwt-extended
Author: Landon Gilbert-Bland
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Flask-JWT-Extended-3.21.0/flask_jwt_extended/__init__.py
new/Flask-JWT-Extended-3.22.0/flask_jwt_extended/__init__.py
--- old/Flask-JWT-Extended-3.21.0/flask_jwt_extended/__init__.py
2019-08-03 17:42:04.000000000 +0200
+++ new/Flask-JWT-Extended-3.22.0/flask_jwt_extended/__init__.py
2019-08-28 18:20:10.000000000 +0200
@@ -11,4 +11,4 @@
unset_jwt_cookies, unset_refresh_cookies
)
-__version__ = '3.21.0'
+__version__ = '3.22.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Flask-JWT-Extended-3.21.0/flask_jwt_extended/config.py
new/Flask-JWT-Extended-3.22.0/flask_jwt_extended/config.py
--- old/Flask-JWT-Extended-3.21.0/flask_jwt_extended/config.py 2019-08-03
17:16:25.000000000 +0200
+++ new/Flask-JWT-Extended-3.22.0/flask_jwt_extended/config.py 2019-08-28
18:19:52.000000000 +0200
@@ -185,6 +185,18 @@
current_app.config['JWT_REFRESH_CSRF_HEADER_NAME']
@property
+ def csrf_check_form(self):
+ return current_app.config['JWT_CSRF_CHECK_FORM']
+
+ @property
+ def access_csrf_field_name(self):
+ return current_app.config['JWT_ACCESS_CSRF_FIELD_NAME']
+
+ @property
+ def refresh_csrf_field_name(self):
+ return current_app.config['JWT_REFRESH_CSRF_FIELD_NAME']
+
+ @property
def access_expires(self):
delta = current_app.config['JWT_ACCESS_TOKEN_EXPIRES']
if type(delta) is int:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Flask-JWT-Extended-3.21.0/flask_jwt_extended/jwt_manager.py
new/Flask-JWT-Extended-3.22.0/flask_jwt_extended/jwt_manager.py
--- old/Flask-JWT-Extended-3.21.0/flask_jwt_extended/jwt_manager.py
2019-08-03 17:34:19.000000000 +0200
+++ new/Flask-JWT-Extended-3.22.0/flask_jwt_extended/jwt_manager.py
2019-08-28 18:19:52.000000000 +0200
@@ -196,6 +196,9 @@
app.config.setdefault('JWT_REFRESH_CSRF_COOKIE_NAME',
'csrf_refresh_token')
app.config.setdefault('JWT_ACCESS_CSRF_COOKIE_PATH', '/')
app.config.setdefault('JWT_REFRESH_CSRF_COOKIE_PATH', '/')
+ app.config.setdefault('JWT_CSRF_CHECK_FORM', False)
+ app.config.setdefault('JWT_ACCESS_CSRF_FIELD_NAME', 'csrf_token')
+ app.config.setdefault('JWT_REFRESH_CSRF_FIELD_NAME', 'csrf_token')
# How long an a token will live before they expire.
app.config.setdefault('JWT_ACCESS_TOKEN_EXPIRES',
datetime.timedelta(minutes=15))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Flask-JWT-Extended-3.21.0/flask_jwt_extended/view_decorators.py
new/Flask-JWT-Extended-3.22.0/flask_jwt_extended/view_decorators.py
--- old/Flask-JWT-Extended-3.21.0/flask_jwt_extended/view_decorators.py
2019-08-03 16:52:54.000000000 +0200
+++ new/Flask-JWT-Extended-3.22.0/flask_jwt_extended/view_decorators.py
2019-08-28 18:19:52.000000000 +0200
@@ -198,9 +198,11 @@
if request_type == 'access':
cookie_key = config.access_cookie_name
csrf_header_key = config.access_csrf_header_name
+ csrf_field_key = config.access_csrf_field_name
else:
cookie_key = config.refresh_cookie_name
csrf_header_key = config.refresh_csrf_header_name
+ csrf_field_key = config.refresh_csrf_field_name
encoded_token = request.cookies.get(cookie_key)
if not encoded_token:
@@ -208,8 +210,10 @@
if config.csrf_protect and request.method in config.csrf_request_methods:
csrf_value = request.headers.get(csrf_header_key, None)
+ if not csrf_value and config.csrf_check_form:
+ csrf_value = request.form.get(csrf_field_key, None)
if not csrf_value:
- raise CSRFError("Missing CSRF token in headers")
+ raise CSRFError("Missing CSRF token")
else:
csrf_value = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Flask-JWT-Extended-3.21.0/tests/test_cookies.py
new/Flask-JWT-Extended-3.22.0/tests/test_cookies.py
--- old/Flask-JWT-Extended-3.21.0/tests/test_cookies.py 2018-09-16
07:27:45.000000000 +0200
+++ new/Flask-JWT-Extended-3.22.0/tests/test_cookies.py 2019-08-28
18:19:53.000000000 +0200
@@ -139,7 +139,7 @@
# Test you cannot post without the additional csrf protection
response = test_client.post(post_url)
assert response.status_code == 401
- assert response.get_json() == {'msg': 'Missing CSRF token in headers'}
+ assert response.get_json() == {'msg': 'Missing CSRF token'}
# Test that you can post with the csrf double submit value
csrf_headers = {'X-CSRF-TOKEN': csrf_token}
@@ -202,6 +202,48 @@
@pytest.mark.parametrize("options", [
+ ('/refresh_token', 'csrf_refresh_token', '/post_refresh_protected'),
+ ('/access_token', 'csrf_access_token', '/post_protected')
+])
+def test_csrf_with_default_form_field(app, options):
+ app.config['JWT_CSRF_CHECK_FORM'] = True
+ test_client = app.test_client()
+ auth_url, csrf_cookie_name, post_url = options
+
+ # Get the jwt cookies and csrf double submit tokens
+ response = test_client.get(auth_url)
+ csrf_token = _get_cookie_from_response(response,
csrf_cookie_name)[csrf_cookie_name]
+
+ # Test that you can post with the csrf double submit value
+ csrf_data = {'csrf_token': csrf_token}
+ response = test_client.post(post_url, data=csrf_data)
+ assert response.status_code == 200
+ assert response.get_json() == {'foo': 'bar'}
+
+
[email protected]("options", [
+ ('/refresh_token', 'csrf_refresh_token', '/post_refresh_protected'),
+ ('/access_token', 'csrf_access_token', '/post_protected')
+])
+def test_csrf_with_custom_form_field(app, options):
+ app.config['JWT_CSRF_CHECK_FORM'] = True
+ app.config['JWT_ACCESS_CSRF_FIELD_NAME'] = 'FOO'
+ app.config['JWT_REFRESH_CSRF_FIELD_NAME'] = 'FOO'
+ test_client = app.test_client()
+ auth_url, csrf_cookie_name, post_url = options
+
+ # Get the jwt cookies and csrf double submit tokens
+ response = test_client.get(auth_url)
+ csrf_token = _get_cookie_from_response(response,
csrf_cookie_name)[csrf_cookie_name]
+
+ # Test that you can post with the csrf double submit value
+ csrf_data = {'FOO': csrf_token}
+ response = test_client.post(post_url, data=csrf_data)
+ assert response.status_code == 200
+ assert response.get_json() == {'foo': 'bar'}
+
+
[email protected]("options", [
('/refresh_token', 'csrf_refresh_token', '/refresh_protected',
'/post_refresh_protected'), # nopep8
('/access_token', 'csrf_access_token', '/protected', '/post_protected')
])
@@ -222,7 +264,7 @@
# Insure GET requests now fail without csrf
response = test_client.get(get_url)
assert response.status_code == 401
- assert response.get_json() == {'msg': 'Missing CSRF token in headers'}
+ assert response.get_json() == {'msg': 'Missing CSRF token'}
# Insure GET requests now succeed with csrf
csrf_headers = {'X-CSRF-TOKEN': csrf_token}
@@ -430,4 +472,4 @@
csrf_token = csrf_cookie['csrf_access_token']
response = test_client.post('/optional_post_protected')
assert response.status_code == 401
- assert response.get_json() == {'msg': 'Missing CSRF token in headers'}
+ assert response.get_json() == {'msg': 'Missing CSRF token'}