Skip to content

Commit 4c484e0

Browse files
authored
fix(security): prevent URL redirection from user-provided values (#5637)
1 parent 19b7266 commit 4c484e0

3 files changed

Lines changed: 18 additions & 6 deletions

File tree

webapp/decorators.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ def is_user_logged_in(*args, **kwargs):
3838
},
3939
)
4040

41-
return flask.redirect(f"/login?next={flask.request.path}")
41+
return flask.redirect(
42+
flask.url_for("login.login_handler", next=flask.request.path)
43+
)
4244

4345
publisher = flask.session.get("publisher")
4446
user = publisher["email"]

webapp/handlers.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
CSP_SCRIPT_SRC.append(f"localhost:{VITE_PORT}")
133133

134134

135-
def refresh_redirect(path):
135+
def refresh_redirect():
136136
try:
137137
macaroon_discharge = authentication.get_refreshed_discharge(
138138
flask.session["macaroon_discharge"]
@@ -146,7 +146,13 @@ def refresh_redirect(path):
146146
return flask.abort(502, str(api_error))
147147

148148
flask.session["macaroon_discharge"] = macaroon_discharge
149-
return flask.redirect(path)
149+
return flask.redirect(
150+
flask.url_for(
151+
flask.request.endpoint,
152+
**flask.request.view_args,
153+
**flask.request.args,
154+
)
155+
)
150156

151157

152158
def snapcraft_utility_processor():
@@ -282,7 +288,9 @@ def handle_api_error_list(error):
282288
"macaroon-authorization-required",
283289
]:
284290
authentication.empty_session(flask.session)
285-
return flask.redirect(f"/login?next={flask.request.path}")
291+
return flask.redirect(
292+
flask.url_for("login.login_handler", next=flask.request.path)
293+
)
286294

287295
status_code = 502
288296
codes = [
@@ -309,7 +317,7 @@ def handle_publisher_agreement_not_signed(error):
309317

310318
@app.errorhandler(PublisherMacaroonRefreshRequired)
311319
def handle_publisher_macaroon_refresh_required(error):
312-
return refresh_redirect(flask.request.path)
320+
return refresh_redirect()
313321

314322
# Global tasks for all requests
315323
# ===

webapp/publisher/snaps/build_views.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,9 @@ def get_update_gh_webhooks(snap_name):
436436
try:
437437
github.get_user()
438438
except Unauthorized:
439-
return flask.redirect(f"/github/auth?back={flask.request.path}")
439+
return flask.redirect(
440+
flask.url_for("oauth.github_auth", back=flask.request.path)
441+
)
440442

441443
gh_link = lp_snap["git_repository_url"][19:]
442444
gh_owner, gh_repo = gh_link.split("/")

0 commit comments

Comments
 (0)