Blame pagure/decorators.py

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