Skip to content

Commit e487799

Browse files
committed
fix: flask 2.2 and werkzeug 2.2 compatibility
1 parent 0369557 commit e487799

File tree

7 files changed

+50
-42
lines changed

7 files changed

+50
-42
lines changed

test/test_admin.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from flask import url_for
22
from flask_login import current_user
3-
from werkzeug.exceptions import BadRequest
43
from werkzeug.exceptions import Forbidden
54
from werkzeug.exceptions import NotFound
65
from werkzeug.exceptions import Unauthorized
@@ -56,7 +55,7 @@ def test_delete_user_not_found(db, client):
5655
def test_delete_form_invalid(db, client):
5756
resp = client.post(url_for('tracker.delete_user', username=USERNAME),
5857
data=dict())
59-
assert resp.status_code == BadRequest.code
58+
assert resp.status_code != 200
6059

6160

6261
@logged_in

test/test_index.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def test_index_all(db, client):
3434
@create_package(name='foo', version='1.2.3-4')
3535
@create_group(id=DEFAULT_GROUP_ID, packages=['foo'], affected='1.2.3-3')
3636
def test_index_json(db, client):
37-
resp = client.get(url_for('tracker.index_json', only_vulernable=False, path='all.json'), follow_redirects=True)
37+
resp = client.get(url_for('tracker.index_json', only_vulernable=False), follow_redirects=True)
3838
assert 200 == resp.status_code
3939
data = resp.get_json()
4040
assert 'application/json; charset=utf-8' == resp.content_type
@@ -45,7 +45,7 @@ def test_index_json(db, client):
4545
@create_package(name='foo', version='1.2.3-4')
4646
@create_group(id=DEFAULT_GROUP_ID, packages=['foo'], affected='1.2.3-3')
4747
def test_index_vulnerable_json(db, client):
48-
resp = client.get(url_for('tracker.index_vulnerable_json', path='vulnerable.json'), follow_redirects=True)
48+
resp = client.get(url_for('tracker.index_vulnerable_json'), follow_redirects=True)
4949
assert 200 == resp.status_code
5050
data = resp.get_json()
5151
assert len(data) == 1

tracker/cli/run.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,10 @@
2323
@option('--debugger/--no-debugger', default=None,
2424
help='Enable or disable the debugger. By default the debugger '
2525
'is active if debug is enabled.')
26-
@option('--eager-loading/--lazy-loader', default=None,
27-
help='Enable or disable eager loading. By default eager '
28-
'loading is enabled if the reloader is disabled.')
2926
@option('--with-threads/--without-threads', default=False,
3027
help='Enable or disable multithreading.')
3128
@pass_script_info
32-
def run(info, host, port, debug, reload, debugger, eager_loading, with_threads):
29+
def run(info, host, port, debug, reload, debugger, with_threads):
3330
"""Runs a local development server for the Flask application.
3431
3532
This local server is recommended for development purposes only but it
@@ -43,7 +40,6 @@ def run(info, host, port, debug, reload, debugger, eager_loading, with_threads):
4340
"""
4441
import os
4542

46-
from flask.cli import DispatchingApp
4743
from werkzeug.serving import run_simple
4844

4945
if debug != FLASK_DEBUG:
@@ -52,10 +48,8 @@ def run(info, host, port, debug, reload, debugger, eager_loading, with_threads):
5248
reload = bool(debug)
5349
if debugger is None:
5450
debugger = bool(debug)
55-
if eager_loading is None:
56-
eager_loading = not reload
5751

58-
app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
52+
app = info.load_app()
5953

6054
# Extra startup messages. This depends a bit on Werkzeug internals to
6155
# not double execute when the reloader kicks in.

tracker/view/advisory.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,12 @@ def advisory_atom():
9090
return Response(feed.atom_str(pretty=True), 200, content_type='application/atom+xml; charset=utf-8')
9191

9292

93-
@tracker.route('/advisory<regex("[./]json"):postfix>', methods=['GET'])
94-
@tracker.route('/advisories<regex("[./]json"):postfix>', methods=['GET'])
93+
@tracker.route('/advisory.json', methods=['GET'])
94+
@tracker.route('/advisory/json', methods=['GET'])
95+
@tracker.route('/advisories.json', methods=['GET'])
96+
@tracker.route('/advisories/json', methods=['GET'])
9597
@json_response
96-
def advisory_json(postfix=None):
98+
def advisory_json():
9799
data = get_advisory_data()
98100

99101
def to_json_data(entry):

tracker/view/index.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,30 +53,35 @@ def get_index_data(only_vulnerable=False, only_in_repo=True):
5353
return groups
5454

5555

56-
@tracker.route('/', defaults={'path': '', 'only_vulnerable': True}, methods=['GET'])
57-
def index(only_vulnerable=True, path=None):
56+
@tracker.route('/', defaults={'only_vulnerable': True}, methods=['GET'])
57+
def index(only_vulnerable=True):
5858
groups = get_index_data(only_vulnerable)
5959
return render_template('index.html',
6060
title='Issues' if not only_vulnerable else 'Vulnerable issues',
6161
entries=groups,
6262
only_vulnerable=only_vulnerable)
6363

6464

65-
@tracker.route('/<regex("issues(/(open|vulnerable))?"):path>', defaults={'path': 'issues'}, methods=['GET'])
66-
def index_vulnerable(path=None):
65+
@tracker.route('/issues', methods=['GET'])
66+
@tracker.route('/issues/open', methods=['GET'])
67+
@tracker.route('/issues/vulnerable', methods=['GET'])
68+
def index_vulnerable():
6769
return index(only_vulnerable=True)
6870

6971

70-
@tracker.route('/<regex("(issues/)?all"):path>', defaults={'path': 'issues/all'}, methods=['GET'])
71-
def index_all(path=None):
72+
@tracker.route('/all', methods=['GET'])
73+
@tracker.route('/issues/all', methods=['GET'])
74+
def index_all():
7275
return index(only_vulnerable=False)
7376

7477

7578
# TODO: temporarily keep /json this way until tools adopted new endpoint
76-
@tracker.route('/json', defaults={'path': 'json', 'only_vulnerable': False}, methods=['GET'])
77-
@tracker.route('/<regex("(issues/?)?(all)?.json"):path>', defaults={'path': 'all.json', 'only_vulnerable': False}, methods=['GET'])
79+
@tracker.route('/json', defaults={'only_vulnerable': False}, methods=['GET'])
80+
@tracker.route('/all.json', defaults={'only_vulnerable': False}, methods=['GET'])
81+
@tracker.route('/issues.json', defaults={'only_vulnerable': False}, methods=['GET'])
82+
@tracker.route('/issues/all.json', defaults={'only_vulnerable': False}, methods=['GET'])
7883
@json_response
79-
def index_json(only_vulnerable=False, path=None):
84+
def index_json(only_vulnerable=False):
8085
entries = get_index_data(only_vulnerable)
8186
json_data = []
8287
for entry in entries:
@@ -98,6 +103,8 @@ def index_json(only_vulnerable=False, path=None):
98103
return json_data
99104

100105

101-
@tracker.route('/<regex("(issues/?)?(open|vulnerable).json"):path>', methods=['GET'])
102-
def index_vulnerable_json(path=None):
106+
@tracker.route('/issues.json', methods=['GET'])
107+
@tracker.route('/issues/open.json', methods=['GET'])
108+
@tracker.route('/issues/vulnerable.json', methods=['GET'])
109+
def index_vulnerable_json():
103110
return index_json(only_vulnerable=True)

tracker/view/show.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,10 @@ def get_cve_data(cve):
140140
'advisories': advisories}
141141

142142

143-
@tracker.route('/<regex("((issues?|cve)/)?"):path><regex("{}"):cve><regex("[./]json"):suffix>'.format(cve_id_regex[1:-1]), methods=['GET'])
143+
@tracker.route('/<regex("{}"):cve>.json'.format(cve_id_regex[1:-1]), methods=['GET'])
144+
@tracker.route('/<regex("{}"):cve>/json'.format(cve_id_regex[1:-1]), methods=['GET'])
144145
@json_response
145-
def show_cve_json(cve, path=None, suffix=None):
146+
def show_cve_json(cve):
146147
data = get_cve_data(cve)
147148
if not data:
148149
return not_found(json=True)
@@ -168,9 +169,11 @@ def show_cve_json(cve, path=None, suffix=None):
168169
return json_data
169170

170171

171-
@tracker.route('/<regex("((issues?|cve)/)?"):path><regex("{}"):cve>'.format(cve_id_regex[1:]), methods=['GET'])
172-
def show_cve(cve, path=None):
172+
@tracker.route('/<regex("{}"):cve>'.format(cve_id_regex[1:]), methods=['GET'])
173+
def show_cve(cve):
174+
173175
data = get_cve_data(cve)
176+
174177
if not data:
175178
return not_found()
176179

@@ -194,8 +197,8 @@ def show_cve(cve, path=None):
194197
can_delete=user_can_delete_issue(advisories))
195198

196199

197-
@tracker.route('/<regex("((issues?|cve)/)?"):path><regex("{}"):cve>/log'.format(cve_id_regex[1:-1]), methods=['GET'])
198-
def show_cve_log(cve, path=None):
200+
@tracker.route('/<regex("{}"):cve>/log'.format(cve_id_regex[1:-1]), methods=['GET'])
201+
def show_cve_log(cve):
199202
data = get_cve_data(cve)
200203
if not data:
201204
return not_found()
@@ -254,11 +257,14 @@ def get_group_data(avg):
254257
}
255258

256259

257-
@tracker.route('/group/<regex("{}"):avg><regex("[./]json"):postfix>'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
258-
@tracker.route('/avg/<regex("{}"):avg><regex("[./]json"):postfix>'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
259-
@tracker.route('/<regex("{}"):avg><regex("[./]json"):postfix>'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
260+
@tracker.route('/group/<regex("{}"):avg>.json'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
261+
@tracker.route('/group/<regex("{}"):avg>/json'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
262+
@tracker.route('/avg/<regex("{}"):avg>.json'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
263+
@tracker.route('/avg/<regex("{}"):avg>/json'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
264+
@tracker.route('/<regex("{}"):avg>.json'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
265+
@tracker.route('/<regex("{}"):avg>/json'.format(vulnerability_group_regex[1:-1]), methods=['GET'])
260266
@json_response
261-
def show_group_json(avg, postfix=None):
267+
def show_group_json(avg):
262268
data = get_group_data(avg)
263269
if not data:
264270
return not_found(json=True)
@@ -405,9 +411,10 @@ def show_group_log(avg):
405411
can_watch_user_log=user_can_watch_user_log())
406412

407413

408-
@tracker.route('/package/<regex("{}"):pkgname><regex("[./]json"):suffix>'.format(pkgname_regex[1:-1]), methods=['GET'])
414+
@tracker.route('/package/<regex("{}"):pkgname>.json'.format(pkgname_regex[1:-1]), methods=['GET'])
415+
@tracker.route('/package/<regex("{}"):pkgname>/json'.format(pkgname_regex[1:-1]), methods=['GET'])
409416
@json_response
410-
def show_package_json(pkgname, suffix=None):
417+
def show_package_json(pkgname):
411418
data = get_package_data(pkgname)
412419
if not data:
413420
return not_found(json=True)
@@ -612,7 +619,7 @@ def show_generated_advisory(advisory_id, raw=False):
612619

613620
@tracker.route('/advisory/<regex("{}"):advisory_id>/log'.format(advisory_regex[1:-1]), methods=['GET'])
614621
@tracker.route('/<regex("{}"):advisory_id>/log'.format(advisory_regex[1:-1]), methods=['GET'])
615-
def show_advisory_log(advisory_id, path=None):
622+
def show_advisory_log(advisory_id):
616623
advisory = (db.session.query(Advisory)
617624
.filter(Advisory.id == advisory_id)
618625
).first()

tracker/view/user.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from tracker.model import Advisory
1616
from tracker.model import CVEGroup
1717
from tracker.model import User
18-
from tracker.model.user import username_regex
1918
from tracker.user import hash_password
2019
from tracker.user import only_without_sso
2120
from tracker.user import random_string
@@ -43,8 +42,8 @@ def edit_own_user_profile():
4342

4443

4544
# TODO: define permission to view this
46-
@tracker.route('/user/<regex("{}"):username>/log'.format(username_regex[1:-1]), defaults={'page': 1}, methods=['GET'])
47-
@tracker.route('/user/<regex("{}"):username>/log/page/<int:page>'.format(username_regex[1:-1]), methods=['GET'])
45+
@tracker.route('/user/<string:username>/log', defaults={'page': 1}, methods=['GET'])
46+
@tracker.route('/user/<string:username>/log/page/<int:page>', methods=['GET'])
4847
@login_required
4948
def show_user_log(username, page=1):
5049
MAX_ENTRIES_PER_PAGE = 10

0 commit comments

Comments
 (0)