|
Clement Verna |
4cc8c0 |
# -*- coding: utf-8 -*-
|
|
Clement Verna |
4cc8c0 |
|
|
Clement Verna |
4cc8c0 |
"""
|
|
Pierre-Yves Chibon |
cd4df4 |
(c) 2018-2019 - Copyright Red Hat Inc
|
|
Clement Verna |
4cc8c0 |
|
|
Clement Verna |
4cc8c0 |
Authors:
|
|
Clement Verna |
4cc8c0 |
Clement Verna <cverna@tutanota.com></cverna@tutanota.com>
|
|
Pierre-Yves Chibon |
cd4df4 |
Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
|
|
Clement Verna |
4cc8c0 |
|
|
Clement Verna |
4cc8c0 |
"""
|
|
Aurélien Bompard |
dcf6f6 |
|
|
Pierre-Yves Chibon |
67d1cc |
from __future__ import unicode_literals, absolute_import
|
|
Aurélien Bompard |
dcf6f6 |
|
|
Clement Verna |
4cc8c0 |
import flask
|
|
Clement Verna |
afe475 |
from pagure.flask_app import admin_session_timedout
|
|
Clement Verna |
4cc8c0 |
from functools import wraps
|
|
Clement Verna |
4cc8c0 |
|
|
Clement Verna |
4cc8c0 |
|
|
Clement Verna |
4cc8c0 |
def has_issue_tracker(function):
|
|
Clement Verna |
4cc8c0 |
"""
|
|
Clement Verna |
4cc8c0 |
Decorator that checks if the current pagure project has the
|
|
Clement Verna |
4cc8c0 |
issue tracker active
|
|
Clement Verna |
4cc8c0 |
If not active returns a 404 page
|
|
Clement Verna |
4cc8c0 |
"""
|
|
Pierre-Yves Chibon |
9c2953 |
|
|
Clement Verna |
4cc8c0 |
@wraps(function)
|
|
Clement Verna |
4cc8c0 |
def check_issue_tracker(*args, **kwargs):
|
|
Clement Verna |
4cc8c0 |
repo = flask.g.repo
|
|
Pierre-Yves Chibon |
cd4df4 |
if not flask.g.issues_enabled or not repo.settings.get(
|
|
Pierre-Yves Chibon |
cd4df4 |
"issue_tracker", True
|
|
Pierre-Yves Chibon |
cd4df4 |
):
|
|
Pierre-Yves Chibon |
c6cc5c |
flask.abort(
|
|
Pierre-Yves Chibon |
c6cc5c |
404, description="No issue tracker found for this project"
|
|
Pierre-Yves Chibon |
c6cc5c |
)
|
|
Pierre-Yves Chibon |
b59748 |
# forbid all POST requests if the issue tracker is made read-only
|
|
Pierre-Yves Chibon |
9c2953 |
if flask.request.method == "POST" and repo.settings.get(
|
|
Pierre-Yves Chibon |
9c2953 |
"issue_tracker_read_only", False
|
|
Pierre-Yves Chibon |
9c2953 |
):
|
|
Pierre-Yves Chibon |
c6cc5c |
flask.abort(
|
|
Pierre-Yves Chibon |
c6cc5c |
401,
|
|
Pierre-Yves Chibon |
c6cc5c |
description="The issue tracker for this project is read-only",
|
|
Pierre-Yves Chibon |
c6cc5c |
)
|
|
Clement Verna |
4cc8c0 |
return function(*args, **kwargs)
|
|
Clement Verna |
4cc8c0 |
|
|
Clement Verna |
4cc8c0 |
return check_issue_tracker
|
|
Clement Verna |
ea2e29 |
|
|
Clement Verna |
ea2e29 |
|
|
Clement Verna |
36168f |
def has_pr_enabled(function):
|
|
Ryan Lerch |
6800cd |
"""
|
|
Ryan Lerch |
6800cd |
Decorator that checks if the current pagure project has the
|
|
Ryan Lerch |
6800cd |
issue tracker active or has PRs function active
|
|
Ryan Lerch |
6800cd |
If not active returns a 404 page
|
|
Ryan Lerch |
6800cd |
"""
|
|
Ryan Lerch |
6800cd |
|
|
Ryan Lerch |
6800cd |
@wraps(function)
|
|
Ryan Lerch |
6800cd |
def check_trackers(*args, **kwargs):
|
|
Ryan Lerch |
6800cd |
repo = flask.g.repo
|
|
Clement Verna |
36168f |
if not repo.settings.get("pull_requests", True):
|
|
Pierre-Yves Chibon |
c6cc5c |
flask.abort(
|
|
Pierre-Yves Chibon |
c6cc5c |
404,
|
|
Pierre-Yves Chibon |
c6cc5c |
description="Pull Requests are not enabled on this project",
|
|
Pierre-Yves Chibon |
c6cc5c |
)
|
|
Clement Verna |
36168f |
|
|
Ryan Lerch |
6800cd |
return function(*args, **kwargs)
|
|
Ryan Lerch |
6800cd |
|
|
Ryan Lerch |
6800cd |
return check_trackers
|
|
Ryan Lerch |
6800cd |
|
|
Ryan Lerch |
6800cd |
|
|
Pierre-Yves Chibon |
d86b5c |
def has_issue_or_pr_enabled(function):
|
|
Pierre-Yves Chibon |
d86b5c |
"""
|
|
Pierre-Yves Chibon |
d86b5c |
Decorator that checks if the current pagure project has either their
|
|
Pierre-Yves Chibon |
d86b5c |
issue tracker or their PR active. If both of them are disabled, it
|
|
Pierre-Yves Chibon |
d86b5c |
returns a 404 page.
|
|
Pierre-Yves Chibon |
d86b5c |
"""
|
|
Pierre-Yves Chibon |
d86b5c |
|
|
Pierre-Yves Chibon |
d86b5c |
@wraps(function)
|
|
Pierre-Yves Chibon |
d86b5c |
def check_issue_pr_trackers(*args, **kwargs):
|
|
Pierre-Yves Chibon |
d86b5c |
repo = flask.g.repo
|
|
Pierre-Yves Chibon |
dbe802 |
issue_enabled = flask.g.issues_enabled
|
|
Pierre-Yves Chibon |
dbe802 |
issue_ro = repo.settings.get("issue_tracker_read_only", False)
|
|
Pierre-Yves Chibon |
dbe802 |
pr_enabled = repo.settings.get("pull_requests", True)
|
|
Pierre-Yves Chibon |
dbe802 |
if not issue_enabled and not pr_enabled:
|
|
Pierre-Yves Chibon |
d86b5c |
flask.abort(
|
|
Pierre-Yves Chibon |
c6cc5c |
404,
|
|
Pierre-Yves Chibon |
c6cc5c |
description="Issue tracker and Pull-Request disabled for "
|
|
Pierre-Yves Chibon |
c6cc5c |
"this project",
|
|
Pierre-Yves Chibon |
d86b5c |
)
|
|
Pierre-Yves Chibon |
dbe802 |
elif flask.request.method == "POST" and not pr_enabled and issue_ro:
|
|
Pierre-Yves Chibon |
c6cc5c |
flask.abort(
|
|
Pierre-Yves Chibon |
c6cc5c |
401,
|
|
Pierre-Yves Chibon |
c6cc5c |
description="The issue tracker for this project is read-only",
|
|
Pierre-Yves Chibon |
c6cc5c |
)
|
|
Pierre-Yves Chibon |
d86b5c |
return function(*args, **kwargs)
|
|
Pierre-Yves Chibon |
d86b5c |
|
|
Pierre-Yves Chibon |
d86b5c |
return check_issue_pr_trackers
|
|
Pierre-Yves Chibon |
d86b5c |
|
|
Pierre-Yves Chibon |
d86b5c |
|
|
Clement Verna |
ea2e29 |
def is_repo_admin(function):
|
|
Clement Verna |
ea2e29 |
"""
|
|
Clement Verna |
ea2e29 |
Decorator that checks if the current user is the admin of
|
|
Clement Verna |
ea2e29 |
the project.
|
|
Clement Verna |
ea2e29 |
If not active returns a 403 page
|
|
Clement Verna |
ea2e29 |
"""
|
|
Pierre-Yves Chibon |
9c2953 |
|
|
Clement Verna |
ea2e29 |
@wraps(function)
|
|
Clement Verna |
ea2e29 |
def check_repo_admin(*args, **kwargs):
|
|
Clement Verna |
ea2e29 |
if not flask.g.repo_admin:
|
|
Pierre-Yves Chibon |
9c2953 |
flask.abort(
|
|
Pierre-Yves Chibon |
9c2953 |
403,
|
|
Pierre-Yves Chibon |
c6cc5c |
description="You are not allowed to change the "
|
|
Pierre-Yves Chibon |
9c2953 |
"settings for this project",
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Clement Verna |
ea2e29 |
return function(*args, **kwargs)
|
|
Pierre-Yves Chibon |
9c2953 |
|
|
Clement Verna |
ea2e29 |
return check_repo_admin
|
|
Clement Verna |
91fd11 |
|
|
Clement Verna |
91fd11 |
|
|
Clement Verna |
91fd11 |
def is_admin_sess_timedout(function):
|
|
Clement Verna |
91fd11 |
"""
|
|
Clement Verna |
91fd11 |
Decorator that checks if the admin session has timeout.
|
|
Clement Verna |
91fd11 |
If not true redirect to the login page
|
|
Clement Verna |
91fd11 |
"""
|
|
Pierre-Yves Chibon |
9c2953 |
|
|
Clement Verna |
91fd11 |
@wraps(function)
|
|
Clement Verna |
91fd11 |
def check_session_timeout(*args, **kwargs):
|
|
Clement Verna |
91fd11 |
if admin_session_timedout():
|
|
Pierre-Yves Chibon |
9c2953 |
if flask.request.method == "POST":
|
|
Pierre-Yves Chibon |
9c2953 |
flask.flash("Action canceled, try it again", "error")
|
|
Clement Verna |
91fd11 |
return flask.redirect(
|
|
Pierre-Yves Chibon |
9c2953 |
flask.url_for("auth_login", next=flask.request.url)
|
|
Pierre-Yves Chibon |
9c2953 |
)
|
|
Clement Verna |
91fd11 |
return function(*args, **kwargs)
|
|
Pierre-Yves Chibon |
9c2953 |
|
|
Clement Verna |
91fd11 |
return check_session_timeout
|