From 8bba25e90d8432773e54568579d76b551a6a0389 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jan 03 2018 08:48:19 +0000 Subject: [PATCH 1/8] Remove un-used variable Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index b7bdbdf..decf7a3 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3709,7 +3709,7 @@ def text2markdown(text, extended=True, readme=False): if text: try: text = _convert_markdown(md_processor, text) - except Exception as err: + except Exception: _log.debug( 'A markdown error occured while processing: ``%s``', str(text)) From f4ddbfb92a24a817b5f8f1b698ff5d18245152ad Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jan 03 2018 08:48:38 +0000 Subject: [PATCH 2/8] Catch the TypeError raised when running tasks in the tests Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/tasks.py b/pagure/lib/tasks.py index 11d1333..1382319 100644 --- a/pagure/lib/tasks.py +++ b/pagure/lib/tasks.py @@ -59,7 +59,10 @@ def set_status(function): def decorated_function(self, *args, **kwargs): """ Decorated function, actually does the work. """ if self is not None: - self.update_state(state='RUNNING') + try: + self.update_state(state='RUNNING') + except TypeError: + pass return function(self, *args, **kwargs) return decorated_function From 20a73c344508bb5368fe953cb0027d70c1ede772 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jan 03 2018 08:49:35 +0000 Subject: [PATCH 3/8] Fix running the unit-tests in F27 Signed-off-by: Pierre-Yves Chibon --- diff --git a/tests/test_pagure_flask_internal.py b/tests/test_pagure_flask_internal.py index 1310264..74bf72b 100644 --- a/tests/test_pagure_flask_internal.py +++ b/tests/test_pagure_flask_internal.py @@ -1414,9 +1414,11 @@ class PagureFlaskInternaltests(tests.Modeltests): output = self.app.get(js_data['url']) js_data2 = json.loads(output.data.decode('utf-8')) - self.assertDictEqual( - js_data2, - {u'results': u"Reference 'refs/heads/master' not found"} + self.assertTrue( + js_data2 in [ + {u'results': u"reference 'refs/heads/master' not found"}, + {u'results': u"Reference 'refs/heads/master' not found"} + ] ) def test_get_stats_commits_git_populated(self): @@ -1526,9 +1528,11 @@ class PagureFlaskInternaltests(tests.Modeltests): output = self.app.get(js_data['url']) js_data2 = json.loads(output.data.decode('utf-8')) - self.assertDictEqual( - js_data2, - {u'results': u"Reference 'refs/heads/master' not found"} + self.assertTrue( + js_data2 in [ + {u'results': u"reference 'refs/heads/master' not found"}, + {u'results': u"Reference 'refs/heads/master' not found"} + ] ) def test_get_stats_commits_trend_git_populated(self): diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index ba528a2..53c1149 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -89,6 +89,7 @@ class PagureFlaskForktests(tests.Modeltests): # list of binary strings representing parents of the new commit [] ) + time.sleep(1) refname = 'refs/heads/master:refs/heads/master' ori_remote = clone_repo.remotes[0] PagureRepo.push(ori_remote, refname) @@ -2189,8 +2190,8 @@ index 0000000..2a552bb commits = _get_commits(output.data) self.assertEqual(commits, [ 'Merge #1 `PR from the feature branch`', - 'Add sources file for testing', 'A commit on branch feature', + 'Add sources file for testing', ]) # Check if the closing notification was added diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index c4acb59..8b40fd5 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -14,6 +14,7 @@ import pkg_resources from unittest.case import SkipTest import json import unittest +import urlparse import shutil import sys import os @@ -708,26 +709,38 @@ class PagureFlaskIssuestests(tests.Modeltests): # down next to the Opened column th_elements = re.findall(r'(.*?)', output.data, re.M | re.S) - href = ('href="/test/issues?status=Open&order_key=title&' - 'order=desc"') - self.assertIn(href, th_elements[0]) - href = ('/test/issues?status=Open&order_key=date_created&' - 'order=asc"') - self.assertIn(href, th_elements[1]) + self.assertDictEqual( + {'status': ['Open'], 'order_key': ['title'], 'order': ['desc']}, + urlparse.parse_qs(urlparse.urlparse( + th_elements[0].split('"')[1]).query) + ) + self.assertDictEqual( + {'status': ['Open'], 'order_key': ['date_created'], 'order': ['asc']}, + urlparse.parse_qs(urlparse.urlparse( + th_elements[1].split('"')[1]).query) + ) arrow = '' self.assertIn(arrow, th_elements[1]) - href = ('href="/test/issues?status=Open&order_key=last_updated&' - 'amp;order=desc"') - self.assertIn(href, th_elements[2]) - href = ('href="/test/issues?status=Open&order_key=priority&' - 'order=desc"') - self.assertIn(href, th_elements[3]) - href = ('href="/test/issues?status=Open&order_key=user&' - 'order=desc"') - self.assertIn(href, th_elements[4]) - href = ('href="/test/issues?status=Open&order_key=assignee&' - 'order=desc"') - self.assertIn(href, th_elements[5]) + self.assertDictEqual( + {'status': ['Open'], 'order_key': ['last_updated'], 'order': ['desc']}, + urlparse.parse_qs(urlparse.urlparse( + th_elements[2].split('"')[1]).query) + ) + self.assertDictEqual( + {'status': ['Open'], 'order_key': ['priority'], 'order': ['desc']}, + urlparse.parse_qs(urlparse.urlparse( + th_elements[3].split('"')[1]).query) + ) + self.assertDictEqual( + {'status': ['Open'], 'order_key': ['user'], 'order': ['desc']}, + urlparse.parse_qs(urlparse.urlparse( + th_elements[4].split('"')[1]).query) + ) + self.assertDictEqual( + {'status': ['Open'], 'order_key': ['assignee'], 'order': ['desc']}, + urlparse.parse_qs(urlparse.urlparse( + th_elements[5].split('"')[1]).query) + ) # Status = closed (all but open) output = self.app.get('/test/issues?status=cloSED') diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 13e091e..2de46a5 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -1863,11 +1863,13 @@ class PagureFlaskRepotests(tests.Modeltests): tests.add_commit_git_repo( os.path.join(self.path, 'repos', 'test.git'), ncommits=1) c1 = repo.revparse_single('HEAD') + time.sleep(1) # Add another commit to git repo tests.add_commit_git_repo( os.path.join(self.path, 'repos', 'test.git'), ncommits=1) c2 = repo.revparse_single('HEAD') + time.sleep(1) # Add one more commit to git repo tests.add_commit_git_repo( diff --git a/tests/test_pagure_lib_git_diff_pr.py b/tests/test_pagure_lib_git_diff_pr.py index a82407e..a42af03 100644 --- a/tests/test_pagure_lib_git_diff_pr.py +++ b/tests/test_pagure_lib_git_diff_pr.py @@ -107,6 +107,7 @@ class PagureFlaskForkPrtests(tests.Modeltests): # list of binary strings representing parents of the new commit parents ) + time.sleep(1) # Push to the main repo refname = 'refs/heads/master:refs/heads/master' @@ -142,6 +143,7 @@ class PagureFlaskForkPrtests(tests.Modeltests): # list of binary strings representing parents of the new commit [last_commit.oid.hex] ) + time.sleep(1) # Push to the main repo refname = 'refs/heads/master:refs/heads/master' ori_remote = clone_repo.remotes[0] @@ -174,6 +176,7 @@ class PagureFlaskForkPrtests(tests.Modeltests): # list of binary strings representing parents of the new commit [last_commit.oid.hex] ) + time.sleep(1) with open(os.path.join(repopath, 'sources'), 'w') as stream: stream.write('foo\n bar\nbaz\n') diff --git a/tests/test_pagure_lib_gitolite_config.py b/tests/test_pagure_lib_gitolite_config.py index fa2c845..6b64a13 100644 --- a/tests/test_pagure_lib_gitolite_config.py +++ b/tests/test_pagure_lib_gitolite_config.py @@ -728,7 +728,7 @@ repo requests/test pagure.lib.SESSIONMAKER = self.session.session_factory pagure.lib.tasks.generate_gitolite_acls( - self=None, namespace=None, name='test', user=None, group=None) + namespace=None, name='test', user=None, group=None) get_helper.assert_called_with('gitolite3') args = helper.generate_acls.call_args From e1a0b2a2ca43a3dd64849742aad71b3f072e3f86 Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jan 03 2018 14:57:56 +0000 Subject: [PATCH 4/8] Add a new decorators module. This commit move the decorator that checks if a project has an issue tracker to a module dedicated to custom decorator. Signed-off-by: Clement Verna --- diff --git a/pagure/lib/decorators.py b/pagure/lib/decorators.py new file mode 100644 index 0000000..e992d33 --- /dev/null +++ b/pagure/lib/decorators.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2017 - Copyright Red Hat Inc + + Authors: + Clement Verna + +""" +import flask +from functools import wraps + + +def has_issue_tracker(function): + """ + Decorator that checks if the current pagure project has the + issue tracker active + If not active returns a 404 page + """ + @wraps(function) + def check_issue_tracker(*args, **kwargs): + repo = flask.g.repo + if not repo.settings.get('issue_tracker', True): + flask.abort(404, 'No issue tracker found for this project') + return function(*args, **kwargs) + + return check_issue_tracker diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 6a472bc..dc32815 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -19,7 +19,6 @@ import logging import os import re from collections import defaultdict -from functools import wraps from math import ceil import flask @@ -32,6 +31,7 @@ import pagure.doc_utils import pagure.exceptions import pagure.lib import pagure.lib.mimetype +from pagure.lib.decorators import has_issue_tracker import pagure.forms from pagure.config import config as pagure_config from pagure.ui import UI_NS @@ -46,22 +46,6 @@ from pagure.utils import ( _log = logging.getLogger(__name__) -def has_issue_tracker(function): - """ - Decorator that checks if the current pagure project has the - issue tracker active - If not active returns a 404 page - """ - @wraps(function) - def check_issue_tracker(*args, **kwargs): - repo = flask.g.repo - if not repo.settings.get('issue_tracker', True): - flask.abort(404, 'No issue tracker found for this project') - return function(*args, **kwargs) - - return check_issue_tracker - - @UI_NS.route( '//issue//update/', methods=['GET', 'POST']) @@ -1356,9 +1340,6 @@ def view_issue_raw_file( repo = flask.g.repo - if not repo.settings.get('issue_tracker', True): - flask.abort(404, 'No issue tracker found for this project') - attachdir = os.path.join( pagure_config['ATTACHMENTS_FOLDER'], repo.fullname) attachpath = os.path.join(attachdir, filename) From 3b26bec614dff987df6dfb3559db14e38e62a8c4 Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jan 03 2018 14:57:56 +0000 Subject: [PATCH 5/8] Add decorator to check admin permission. This commit adds a new decorator that check if a user has admin permission to the project. Introduce the decorator in the ui/issues.py module. Signed-off-by: Clement Verna --- diff --git a/pagure/lib/decorators.py b/pagure/lib/decorators.py index e992d33..5878c27 100644 --- a/pagure/lib/decorators.py +++ b/pagure/lib/decorators.py @@ -25,3 +25,18 @@ def has_issue_tracker(function): return function(*args, **kwargs) return check_issue_tracker + + +def is_repo_admin(function): + """ + Decorator that checks if the current user is the admin of + the project. + If not active returns a 403 page + """ + @wraps(function) + def check_repo_admin(*args, **kwargs): + if not flask.g.repo_admin: + flask.abort(403, 'You are not allowed to change the \ + settings for this project') + return function(*args, **kwargs) + return check_repo_admin diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index dc32815..f8c6d5b 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -31,7 +31,7 @@ import pagure.doc_utils import pagure.exceptions import pagure.lib import pagure.lib.mimetype -from pagure.lib.decorators import has_issue_tracker +from pagure.lib.decorators import has_issue_tracker, is_repo_admin import pagure.forms from pagure.config import config as pagure_config from pagure.ui import UI_NS @@ -379,17 +379,13 @@ def update_issue(repo, issueid, username=None, namespace=None): '/fork////tag//edit', methods=('GET', 'POST')) @login_required +@is_repo_admin @has_issue_tracker def edit_tag(repo, tag, username=None, namespace=None): """ Edit the specified tag associated with the issues of a project. """ repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to edit tags associated with the issues of \ - this project') tags = pagure.lib.get_tags_of_project(flask.g.session, repo) if not tags: @@ -446,6 +442,7 @@ def edit_tag(repo, tag, username=None, namespace=None): @UI_NS.route('//update/tags', methods=['POST']) @UI_NS.route('///update/tags', methods=['POST']) @login_required +@is_repo_admin @has_issue_tracker def update_tags(repo, username=None, namespace=None): """ Update the tags of a project. @@ -453,11 +450,6 @@ def update_tags(repo, username=None, namespace=None): repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.ConfirmationForm() error = False @@ -537,18 +529,13 @@ def update_tags(repo, username=None, namespace=None): @UI_NS.route('/fork///droptag/', methods=['POST']) @UI_NS.route('/fork////droptag/', methods=['POST']) @login_required +@is_repo_admin @has_issue_tracker def remove_tag(repo, username=None, namespace=None): """ Remove the specified tag, associated with the issues, from the project. """ repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to remove tags associated with the issues \ - of this project') - form = pagure.forms.DeleteIssueTagForm() if form.validate_on_submit(): tags = form.tag.data @@ -1487,13 +1474,10 @@ def edit_comment_issue( @UI_NS.route( '/fork////issues/reports', methods=['POST']) @login_required +@is_repo_admin def save_reports(repo, username=None, namespace=None): """ Marked for watching or Unwatching """ - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to create reports for this project') return_point = flask.url_for( 'ui_ns.view_issues', repo=repo, username=username, namespace=namespace) From 1be3ff9d8ae574e3e2aa96c966b87580ef1722ee Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jan 03 2018 14:57:56 +0000 Subject: [PATCH 6/8] Add is_repo_admin decorator to ui/plugins.py Signed-off-by: Clement Verna --- diff --git a/pagure/ui/plugins.py b/pagure/ui/plugins.py index 88ac26d..fc61ed1 100644 --- a/pagure/ui/plugins.py +++ b/pagure/ui/plugins.py @@ -23,6 +23,7 @@ import pagure.forms from pagure.exceptions import FileNotFoundException from pagure.ui import UI_NS from pagure.utils import login_required +from pagure.lib.decorators import is_repo_admin _log = logging.getLogger(__name__) @@ -69,16 +70,12 @@ _log = logging.getLogger(__name__) '/fork////settings//', methods=('GET', 'POST')) @login_required +@is_repo_admin def view_plugin(repo, plugin, username=None, namespace=None, full=True): """ Presents the settings of the project. """ repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - # Private repos are not allowed to leak information outside so disabling CI # enables us to keep the repos totally discreate and prevents from leaking # information outside From fac711e004b7a0b8bff6d1faa8b7c30a5dcb0346 Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jan 03 2018 14:57:56 +0000 Subject: [PATCH 7/8] New decorator for admin session timeout. This commit adds a new decorator to check if an admin session has timedout. It introduce this decorator and the is_repo_admin to the ui/repo.py module Signed-off-by: Clement Verna --- diff --git a/pagure/lib/decorators.py b/pagure/lib/decorators.py index 5878c27..4ed0615 100644 --- a/pagure/lib/decorators.py +++ b/pagure/lib/decorators.py @@ -8,6 +8,7 @@ """ import flask +from pagure import admin_session_timedout from functools import wraps @@ -40,3 +41,19 @@ def is_repo_admin(function): settings for this project') return function(*args, **kwargs) return check_repo_admin + + +def is_admin_sess_timedout(function): + """ + Decorator that checks if the admin session has timeout. + If not true redirect to the login page + """ + @wraps(function) + def check_session_timeout(*args, **kwargs): + if admin_session_timedout(): + if flask.request.method == 'POST': + flask.flash('Action canceled, try it again', 'error') + return flask.redirect( + flask.url_for('auth_login', next=flask.request.url)) + return function(*args, **kwargs) + return check_session_timeout diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 7a9537f..243828e 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -49,7 +49,6 @@ import pagure.lib.tasks import pagure.forms import pagure.ui.plugins from pagure.config import config as pagure_config -from pagure.flask_app import admin_session_timedout from pagure.lib import encoding_utils from pagure.ui import UI_NS from pagure.utils import ( @@ -57,6 +56,7 @@ from pagure.utils import ( authenticated, login_required, ) +from pagure.lib.decorators import is_repo_admin, is_admin_sess_timedout _log = logging.getLogger(__name__) @@ -927,6 +927,7 @@ def view_tags(repo, username=None, namespace=None): @UI_NS.route( '/fork////upload', methods=('GET', 'POST')) @login_required +@is_repo_admin def new_release(repo, username=None, namespace=None): """ Upload a new release. """ @@ -936,11 +937,6 @@ def new_release(repo, username=None, namespace=None): repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.UploadFileForm() if form.validate_on_submit(): @@ -997,23 +993,15 @@ def new_release(repo, username=None, namespace=None): @UI_NS.route( '/fork////settings', methods=('GET', 'POST')) @login_required +@is_admin_sess_timedout +@is_repo_admin def view_settings(repo, username=None, namespace=None): """ Presents the settings of the project. """ - if admin_session_timedout(): - if flask.request.method == 'POST': - flask.flash('Action canceled, try it again', 'error') - return flask.redirect( - flask.url_for('auth_login', next=flask.request.url)) repo = flask.g.repo repo_obj = flask.g.repo_obj - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - plugins = pagure.lib.plugins.get_plugin_names( pagure_config.get('DISABLED_PLUGINS')) tags = pagure.lib.get_tags_of_project(flask.g.session, repo) @@ -1087,24 +1075,15 @@ def view_settings(repo, username=None, namespace=None): '/fork////settings/test_hook', methods=('GET', 'POST')) @login_required +@is_admin_sess_timedout +@is_repo_admin def test_web_hook(repo, username=None, namespace=None): """ Endpoint that can be called to send a test message to the web-hook service allowing to test the web-hooks set. """ - if admin_session_timedout(): - if flask.request.method == 'POST': - flask.flash('Action canceled, try it again', 'error') - return flask.redirect( - flask.url_for('auth_login', next=flask.request.url)) repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to trigger a test notification for this ' - 'project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): if pagure.lib.REDIS: @@ -1133,24 +1112,14 @@ def test_web_hook(repo, username=None, namespace=None): @UI_NS.route('/fork///update', methods=['POST']) @UI_NS.route('/fork////update', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def update_project(repo, username=None, namespace=None): """ Update the description of a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.ProjectFormSimplified() if form.validate_on_submit(): @@ -1186,27 +1155,17 @@ def update_project(repo, username=None, namespace=None): '/fork////update/priorities', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def update_priorities(repo, username=None, namespace=None): """ Update the priorities of a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.ConfirmationForm() error = False @@ -1288,27 +1247,17 @@ def update_priorities(repo, username=None, namespace=None): '/fork////update/default_priority', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def default_priority(repo, username=None, namespace=None): """ Update the default priority of a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.DefaultPriorityForm( priorities=repo.priorities.values()) @@ -1339,27 +1288,17 @@ def default_priority(repo, username=None, namespace=None): '/fork////update/milestones', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def update_milestones(repo, username=None, namespace=None): """ Update the milestones of a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.ConfirmationForm() error = False @@ -1431,26 +1370,15 @@ def update_milestones(repo, username=None, namespace=None): @UI_NS.route( '/fork////default/branch/', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def change_ref_head(repo, username=None, namespace=None): """ Change HEAD reference """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) - repo = flask.g.repo repo_obj = flask.g.repo_obj - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - branches = repo_obj.listall_branches() form = pagure.forms.DefaultBranchForm(branches=branches) @@ -1474,6 +1402,8 @@ def change_ref_head(repo, username=None, namespace=None): @UI_NS.route('/fork///delete', methods=['POST']) @UI_NS.route('/fork////delete', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def delete_repo(repo, username=None, namespace=None): """ Delete the present project. """ @@ -1485,19 +1415,6 @@ def delete_repo(repo, username=None, namespace=None): or (repo.is_fork and not del_fork): flask.abort(404) - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) - - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - if repo.read_only: flask.flash( 'The ACLs of this project are being refreshed in the backend ' @@ -1521,26 +1438,15 @@ def delete_repo(repo, username=None, namespace=None): @UI_NS.route( '/fork////hook_token', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def new_repo_hook_token(repo, username=None, namespace=None): """ Re-generate a hook token for the present project. """ if not pagure_config.get('WEBHOOK', False): flask.abort(404) - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) - - repo = flask.g.repo - - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') + repo = flask.g.repo form = pagure.forms.ConfirmationForm() if not form.validate_on_submit(): @@ -1568,6 +1474,8 @@ def new_repo_hook_token(repo, username=None, namespace=None): '/fork////dropdeploykey/', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def remove_deploykey(repo, keyid, username=None, namespace=None): """ Remove the specified deploy key from the project. """ @@ -1575,21 +1483,8 @@ def remove_deploykey(repo, keyid, username=None, namespace=None): if not pagure_config.get('DEPLOY_KEY', True): flask.abort(404, 'This pagure instance disabled deploy keys') - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) - repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the deploy keys for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): keyids = [str(key.id) for key in repo.deploykeys] @@ -1632,6 +1527,8 @@ def remove_deploykey(repo, keyid, username=None, namespace=None): '/fork////dropuser/', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def remove_user(repo, userid, username=None, namespace=None): """ Remove the specified user from the project. """ @@ -1639,21 +1536,8 @@ def remove_user(repo, userid, username=None, namespace=None): if not pagure_config.get('ENABLE_USER_MNGT', True): flask.abort(404, 'User management not allowed in the pagure instance') - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) - repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the users for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): userids = [str(user.id) for user in repo.users] @@ -1709,6 +1593,8 @@ def remove_user(repo, userid, username=None, namespace=None): '/fork////adddeploykey', methods=('GET', 'POST')) @login_required +@is_admin_sess_timedout +@is_repo_admin def add_deploykey(repo, username=None, namespace=None): """ Add the specified deploy key to the project. """ @@ -1716,19 +1602,8 @@ def add_deploykey(repo, username=None, namespace=None): if not pagure_config.get('DEPLOY_KEY', True): flask.abort(404, 'This pagure instance disabled deploy keys') - if admin_session_timedout(): - if flask.request.method == 'POST': - flask.flash('Action canceled, try it again', 'error') - return flask.redirect( - flask.url_for('auth_login', next=flask.request.url)) - repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to add deploy keys to this project') - form = pagure.forms.AddDeployKeyForm() if form.validate_on_submit(): @@ -1776,6 +1651,8 @@ def add_deploykey(repo, username=None, namespace=None): @UI_NS.route( '/fork////adduser', methods=('GET', 'POST')) @login_required +@is_admin_sess_timedout +@is_repo_admin def add_user(repo, username=None, namespace=None): """ Add the specified user to the project. """ @@ -1784,19 +1661,8 @@ def add_user(repo, username=None, namespace=None): flask.abort( 404, 'User management is not allowed in this pagure instance') - if admin_session_timedout(): - if flask.request.method == 'POST': - flask.flash('Action canceled, try it again', 'error') - return flask.redirect( - flask.url_for('auth_login', next=flask.request.url)) - repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to add users to this project') - user_to_update = flask.request.args.get('user', '').strip() user_to_update_obj = None user_access = None @@ -1856,6 +1722,8 @@ def add_user(repo, username=None, namespace=None): '/fork////dropgroup/', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def remove_group_project(repo, groupid, username=None, namespace=None): """ Remove the specified group from the project. """ @@ -1864,21 +1732,8 @@ def remove_group_project(repo, groupid, username=None, namespace=None): flask.abort( 404, 'User management is not allowed in this pagure instance') - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) - repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the users for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): grpids = [grp.id for grp in repo.groups] @@ -1922,6 +1777,8 @@ def remove_group_project(repo, groupid, username=None, namespace=None): @UI_NS.route( '/fork////addgroup', methods=('GET', 'POST')) @login_required +@is_admin_sess_timedout +@is_repo_admin def add_group_project(repo, username=None, namespace=None): """ Add the specified group to the project. """ @@ -1930,19 +1787,8 @@ def add_group_project(repo, username=None, namespace=None): flask.abort( 404, 'User management is not allowed in this pagure instance') - if admin_session_timedout(): - if flask.request.method == 'POST': - flask.flash('Action canceled, try it again', 'error') - return flask.redirect( - flask.url_for('auth_login', next=flask.request.url)) - repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to add groups to this project') - group_to_update = flask.request.args.get('group', '').strip() group_to_update_obj = None group_access = None @@ -2001,22 +1847,14 @@ def add_group_project(repo, username=None, namespace=None): @UI_NS.route( '/fork////regenerate', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def regenerate_git(repo, username=None, namespace=None): """ Regenerate the specified git repo with the content in the project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort(403, 'You are not allowed to regenerate the git repos') - regenerate = flask.request.form.get('regenerate') if not regenerate or regenerate.lower() not in ['tickets', 'requests']: flask.abort(400, 'You can only regenerate tickest or requests repos') @@ -2074,14 +1912,10 @@ def regenerate_git(repo, username=None, namespace=None): '/fork////token/new', methods=('GET', 'POST')) @login_required +@is_admin_sess_timedout def add_token(repo, username=None, namespace=None): """ Add a token to a specified project. """ - if admin_session_timedout(): - if flask.request.method == 'POST': - flask.flash('Action canceled, try it again', 'error') - return flask.redirect( - flask.url_for('auth_login', next=flask.request.url)) repo = flask.g.repo @@ -2135,24 +1969,14 @@ def add_token(repo, username=None, namespace=None): '/fork////token/revoke/', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def revoke_api_token(repo, token_id, username=None, namespace=None): """ Revokie a token to a specified project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - token = pagure.lib.get_api_token(flask.g.session, token_id) if not token \ @@ -2194,17 +2018,13 @@ def revoke_api_token(repo, token_id, username=None, namespace=None): '/fork////edit//f/' '', methods=('GET', 'POST')) @login_required +@is_repo_admin def edit_file(repo, branchname, filename, username=None, namespace=None): """ Edit a file online. """ repo = flask.g.repo repo_obj = flask.g.repo_obj - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - user = pagure.lib.search_user( flask.g.session, username=flask.g.fas_user.username) @@ -2457,24 +2277,14 @@ def watch_repo(repo, watch, username=None, namespace=None): @UI_NS.route( '/fork////public_notif', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def update_public_notifications(repo, username=None, namespace=None): """ Update the public notification settings of a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.PublicNotificationForm() if form.validate_on_submit(): @@ -2517,27 +2327,17 @@ def update_public_notifications(repo, username=None, namespace=None): '/fork////update/close_status', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def update_close_status(repo, username=None, namespace=None): """ Update the close_status of a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): @@ -2566,16 +2366,11 @@ def update_close_status(repo, username=None, namespace=None): '/fork////update/quick_replies', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def update_quick_replies(repo, username=None, namespace=None): """ Update the quick_replies of a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo @@ -2585,11 +2380,6 @@ def update_quick_replies(repo, username=None, namespace=None): 404, 'Issue tracker and pull requests are disabled for this project') - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): @@ -2618,27 +2408,17 @@ def update_quick_replies(repo, username=None, namespace=None): '/fork////update/custom_keys', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def update_custom_keys(repo, username=None, namespace=None): """ Update the custom_keys of a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): @@ -2680,27 +2460,17 @@ def update_custom_keys(repo, username=None, namespace=None): '/fork////delete/report', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def delete_report(repo, username=None, namespace=None): """ Delete a report from a project. """ - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) repo = flask.g.repo if not repo.settings.get('issue_tracker', True): flask.abort(404, 'No issue tracker found for this project') - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): @@ -2731,27 +2501,16 @@ def delete_report(repo, username=None, namespace=None): '/fork////give', methods=['POST']) @login_required +@is_admin_sess_timedout +@is_repo_admin def give_project(repo, username=None, namespace=None): """ Give a project to someone else. """ if not pagure_config.get('ENABLE_GIVE_PROJECTS', True): flask.abort(404) - if admin_session_timedout(): - flask.flash('Action canceled, try it again', 'error') - url = flask.url_for( - 'ui_ns.view_settings', username=username, repo=repo, - namespace=namespace) - return flask.redirect( - flask.url_for('auth_login', next=url)) - repo = flask.g.repo - if not flask.g.repo_admin: - flask.abort( - 403, - 'You are not allowed to change the settings for this project') - if flask.g.fas_user.username != repo.user.user \ and not pagure.utils.is_admin(): flask.abort( diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 2de46a5..46c31a5 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -45,7 +45,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['UPLOAD_FOLDER_PATH'] = os.path.join( self.path, 'releases') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_add_user_when_user_mngt_off(self, ast): """ Test the add_user endpoint when user management is turned off in the pagure instance """ @@ -97,7 +97,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['ENABLE_USER_MNGT'] = True - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_add_deploykey(self, ast): """ Test the add_deploykey endpoint. """ ast.return_value = False @@ -199,7 +199,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertIn('Deploy key added', output.data) self.assertIn('PUSH ACCESS', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') @patch.dict('pagure.config.config', {'DEPLOY_KEY': False}) def test_add_deploykey_disabled(self, ast): """ Test the add_deploykey endpoint when it's disabled in the config. @@ -216,7 +216,7 @@ class PagureFlaskRepotests(tests.Modeltests): output = self.app.post('/test/adddeploykey') self.assertEqual(output.status_code, 404) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') @patch('pagure.lib.notify.log') def test_add_user(self, mock_log, ast): """ Test the add_user endpoint. """ @@ -312,7 +312,7 @@ class PagureFlaskRepotests(tests.Modeltests): mock_log.assert_called_with(ANY, topic='project.user.added', msg=ANY, redis=ANY) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_add_group_project_when_user_mngt_off(self, ast): """ Test the add_group_project endpoint when user management is turned off in the pagure instance""" @@ -397,7 +397,7 @@ class PagureFlaskRepotests(tests.Modeltests): output.data) self.assertIn(u'No group ralph found.', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_add_group_project(self, ast): """ Test the add_group_project endpoint. """ ast.return_value = False @@ -488,7 +488,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertIn( '\n Group added', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_remove_user_when_user_mngt_off(self, ast): """ Test the remove_user endpoint when user management is turned off in the pagure instance""" @@ -541,7 +541,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['ENABLE_USER_MNGT'] = True - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_remove_deploykey(self, ast): """ Test the remove_deploykey endpoint. """ ast.return_value = False @@ -616,7 +616,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertIn('

Settings for test

', output.data) self.assertIn('Deploy key removed', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') @patch.dict('pagure.config.config', {'DEPLOY_KEY': False}) def test_remove_deploykey_disabled(self, ast): """ Test the remove_deploykey endpoint when it's disabled in the @@ -631,7 +631,7 @@ class PagureFlaskRepotests(tests.Modeltests): output = self.app.post('/test/dropdeploykey/1') self.assertEqual(output.status_code, 404) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') @patch('pagure.lib.notify.log') def test_remove_user(self, mock_log, ast): """ Test the remove_user endpoint. """ @@ -722,7 +722,7 @@ class PagureFlaskRepotests(tests.Modeltests): mock_log.assert_called_with(ANY, topic='project.user.removed', msg=ANY) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_remove_group_project_when_user_mngt_off(self, ast): """ Test the remove_group_project endpoint when user management is turned off in the pagure instance""" @@ -790,7 +790,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['ENABLE_USER_MNGT'] = True - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_remove_group_project(self, ast): """ Test the remove_group_project endpoint. """ ast.return_value = False @@ -896,7 +896,7 @@ class PagureFlaskRepotests(tests.Modeltests): repo = pagure.lib.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.groups), 0) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_update_project(self, ast): """ Test the update_project endpoint. """ ast.return_value = True @@ -992,7 +992,7 @@ class PagureFlaskRepotests(tests.Modeltests): '\n Project updated', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_update_project_update_tag(self, ast): """ Test the view_settings endpoint when updating the project's tags. @@ -1069,7 +1069,7 @@ class PagureFlaskRepotests(tests.Modeltests): '\n Project updated', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_view_settings(self, ast): """ Test the view_settings endpoint. """ ast.return_value = False @@ -1195,7 +1195,7 @@ class PagureFlaskRepotests(tests.Modeltests): 'name="issue_tracker" checked=""/>', output.data) @patch('pagure.lib.git.generate_gitolite_acls') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_view_settings_pr_only(self, ast, gen_acl): """ Test the view_settings endpoint when turning on PR only. """ ast.return_value = False @@ -1254,7 +1254,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertEqual(args[1].keys(), ['project']) self.assertEqual(args[1]['project'].fullname, 'test') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_fields_in_view_settings(self, ast): """ Test the default fields in view_settings endpoint. """ ast.return_value = False @@ -2740,7 +2740,7 @@ index 0000000..fb7093d @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch('pagure.lib.notify.send_email') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_delete_repo_when_turned_off(self, ast, send_email): """ Test the delete_repo endpoint when deletion of a repo is turned off in the pagure instance """ @@ -2958,7 +2958,7 @@ index 0000000..fb7093d self.assertEqual(output.status_code, 404) @patch('pagure.lib.notify.send_email') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_delete_read_only_repo(self, ast, send_email): """ Test the delete_repo endpoint when the repo is read_only """ ast.return_value = False @@ -3008,7 +3008,7 @@ index 0000000..fb7093d output.data) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_delete_repo(self, ast): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -3277,7 +3277,7 @@ index 0000000..fb7093d @patch.dict('pagure.config.config', {'TICKETS_FOLDER': None}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', MagicMock(return_value=False)) + @patch('pagure.lib.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_repo_no_ticket(self): """ Test the delete_repo endpoint when tickets aren't enabled in this pagure instance. """ @@ -3316,7 +3316,7 @@ index 0000000..fb7093d output.data) @patch('pagure.lib.notify.send_email') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_delete_repo_with_users(self, ast, send_email): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -3404,7 +3404,7 @@ index 0000000..fb7093d self.assertEqual(repo, None) @patch('pagure.lib.notify.send_email') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_delete_repo_with_group(self, ast, send_email): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -3506,7 +3506,7 @@ index 0000000..fb7093d self.assertEqual(repo, None) @patch('pagure.lib.notify.send_email') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_delete_repo_with_coloredtag(self, ast, send_email): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -3600,7 +3600,7 @@ index 0000000..fb7093d repo = pagure.lib.get_authorized_project(self.session, 'test2') self.assertEqual(repo, None) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_new_repo_hook_token(self, ast): """ Test the new_repo_hook_token endpoint. """ ast.return_value = False @@ -3660,7 +3660,7 @@ index 0000000..fb7093d self.assertNotEqual(repo.hook_token, 'aaabbbccc') @patch('pagure.lib.notify.send_email') - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') @patch('pagure.lib.git.update_git') def test_regenerate_git(self, upgit, ast, sendmail): """ Test the regenerate_git endpoint. """ @@ -3970,7 +3970,7 @@ index 0000000..fb7093d self.assertIn( '

No content found

', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_change_ref_head(self,ast): """ Test the change_ref_head endpoint. """ ast.return_value = True @@ -4170,7 +4170,7 @@ index 0000000..fb7093d 'been uploaded', output.data) self.assertIn('This project has not been tagged.', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_add_token_all_tokens(self, ast): """ Test the add_token endpoint. """ ast.return_value = False @@ -4189,7 +4189,7 @@ index 0000000..fb7093d ) @patch.dict('pagure.config.config', {'USER_ACLS': ['create_project']}) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_add_token_one_token(self, ast): """ Test the add_token endpoint. """ ast.return_value = False @@ -4207,7 +4207,7 @@ index 0000000..fb7093d 1 ) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_add_token(self, ast): """ Test the add_token endpoint. """ ast.return_value = False @@ -4281,7 +4281,7 @@ index 0000000..fb7093d 'Valid until: ', output.data) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.lib.decorators.admin_session_timedout') def test_revoke_api_token(self, ast): """ Test the revoke_api_token endpoint. """ ast.return_value = False From ec2232e20a9bcf8b057b036375c24257e3cc9487 Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jan 04 2018 06:22:59 +0000 Subject: [PATCH 8/8] Use issue tracker decorator in ui/repo.py This commit adds the decorators to ui/repo.py and also move out the decorator module out of the lib folder. --- diff --git a/pagure/decorators.py b/pagure/decorators.py new file mode 100644 index 0000000..628a95b --- /dev/null +++ b/pagure/decorators.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2017 - Copyright Red Hat Inc + + Authors: + Clement Verna + +""" +import flask +from pagure.flask_app import admin_session_timedout +from functools import wraps + + +def has_issue_tracker(function): + """ + Decorator that checks if the current pagure project has the + issue tracker active + If not active returns a 404 page + """ + @wraps(function) + def check_issue_tracker(*args, **kwargs): + repo = flask.g.repo + if not repo.settings.get('issue_tracker', True): + flask.abort(404, 'No issue tracker found for this project') + return function(*args, **kwargs) + + return check_issue_tracker + + +def is_repo_admin(function): + """ + Decorator that checks if the current user is the admin of + the project. + If not active returns a 403 page + """ + @wraps(function) + def check_repo_admin(*args, **kwargs): + if not flask.g.repo_admin: + flask.abort(403, 'You are not allowed to change the ' + 'settings for this project') + return function(*args, **kwargs) + return check_repo_admin + + +def is_admin_sess_timedout(function): + """ + Decorator that checks if the admin session has timeout. + If not true redirect to the login page + """ + @wraps(function) + def check_session_timeout(*args, **kwargs): + if admin_session_timedout(): + if flask.request.method == 'POST': + flask.flash('Action canceled, try it again', 'error') + return flask.redirect( + flask.url_for('auth_login', next=flask.request.url)) + return function(*args, **kwargs) + return check_session_timeout diff --git a/pagure/lib/decorators.py b/pagure/lib/decorators.py index 4ed0615..6abd41b 100644 --- a/pagure/lib/decorators.py +++ b/pagure/lib/decorators.py @@ -8,7 +8,7 @@ """ import flask -from pagure import admin_session_timedout +from pagure.flask_app import admin_session_timedout from functools import wraps diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index f8c6d5b..de21801 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -31,7 +31,7 @@ import pagure.doc_utils import pagure.exceptions import pagure.lib import pagure.lib.mimetype -from pagure.lib.decorators import has_issue_tracker, is_repo_admin +from pagure.decorators import has_issue_tracker, is_repo_admin import pagure.forms from pagure.config import config as pagure_config from pagure.ui import UI_NS @@ -386,7 +386,6 @@ def edit_tag(repo, tag, username=None, namespace=None): """ repo = flask.g.repo - tags = pagure.lib.get_tags_of_project(flask.g.session, repo) if not tags: flask.abort(404, 'Project has no tags to edit') diff --git a/pagure/ui/plugins.py b/pagure/ui/plugins.py index fc61ed1..bc0207a 100644 --- a/pagure/ui/plugins.py +++ b/pagure/ui/plugins.py @@ -23,7 +23,7 @@ import pagure.forms from pagure.exceptions import FileNotFoundException from pagure.ui import UI_NS from pagure.utils import login_required -from pagure.lib.decorators import is_repo_admin +from pagure.decorators import is_repo_admin _log = logging.getLogger(__name__) diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 243828e..14ea73a 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -56,8 +56,10 @@ from pagure.utils import ( authenticated, login_required, ) -from pagure.lib.decorators import is_repo_admin, is_admin_sess_timedout - +from pagure.decorators import ( + is_repo_admin, + is_admin_sess_timedout, + has_issue_tracker) _log = logging.getLogger(__name__) @@ -1155,6 +1157,7 @@ def update_project(repo, username=None, namespace=None): '/fork////update/priorities', methods=['POST']) @login_required +@has_issue_tracker @is_admin_sess_timedout @is_repo_admin def update_priorities(repo, username=None, namespace=None): @@ -1163,9 +1166,6 @@ def update_priorities(repo, username=None, namespace=None): repo = flask.g.repo - if not repo.settings.get('issue_tracker', True): - flask.abort(404, 'No issue tracker found for this project') - form = pagure.forms.ConfirmationForm() error = False @@ -1247,6 +1247,7 @@ def update_priorities(repo, username=None, namespace=None): '/fork////update/default_priority', methods=['POST']) @login_required +@has_issue_tracker @is_admin_sess_timedout @is_repo_admin def default_priority(repo, username=None, namespace=None): @@ -1255,9 +1256,6 @@ def default_priority(repo, username=None, namespace=None): repo = flask.g.repo - if not repo.settings.get('issue_tracker', True): - flask.abort(404, 'No issue tracker found for this project') - form = pagure.forms.DefaultPriorityForm( priorities=repo.priorities.values()) @@ -1288,6 +1286,7 @@ def default_priority(repo, username=None, namespace=None): '/fork////update/milestones', methods=['POST']) @login_required +@has_issue_tracker @is_admin_sess_timedout @is_repo_admin def update_milestones(repo, username=None, namespace=None): @@ -1296,9 +1295,6 @@ def update_milestones(repo, username=None, namespace=None): repo = flask.g.repo - if not repo.settings.get('issue_tracker', True): - flask.abort(404, 'No issue tracker found for this project') - form = pagure.forms.ConfirmationForm() error = False @@ -1446,7 +1442,7 @@ def new_repo_hook_token(repo, username=None, namespace=None): if not pagure_config.get('WEBHOOK', False): flask.abort(404) - repo = flask.g.repo + repo = flask.g.repo form = pagure.forms.ConfirmationForm() if not form.validate_on_submit(): @@ -2327,6 +2323,7 @@ def update_public_notifications(repo, username=None, namespace=None): '/fork////update/close_status', methods=['POST']) @login_required +@has_issue_tracker @is_admin_sess_timedout @is_repo_admin def update_close_status(repo, username=None, namespace=None): @@ -2335,9 +2332,6 @@ def update_close_status(repo, username=None, namespace=None): repo = flask.g.repo - if not repo.settings.get('issue_tracker', True): - flask.abort(404, 'No issue tracker found for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): @@ -2366,6 +2360,7 @@ def update_close_status(repo, username=None, namespace=None): '/fork////update/quick_replies', methods=['POST']) @login_required +@has_issue_tracker @is_admin_sess_timedout @is_repo_admin def update_quick_replies(repo, username=None, namespace=None): @@ -2374,11 +2369,8 @@ def update_quick_replies(repo, username=None, namespace=None): repo = flask.g.repo - if (not repo.settings.get('issue_tracker', True) and - not repo.settings.get('pull_requests', True)): - flask.abort( - 404, - 'Issue tracker and pull requests are disabled for this project') + if (not repo.settings.get('pull_requests', True)): + flask.abort(404, 'Pull requests are disabled for this project') form = pagure.forms.ConfirmationForm() @@ -2408,6 +2400,7 @@ def update_quick_replies(repo, username=None, namespace=None): '/fork////update/custom_keys', methods=['POST']) @login_required +@has_issue_tracker @is_admin_sess_timedout @is_repo_admin def update_custom_keys(repo, username=None, namespace=None): @@ -2416,9 +2409,6 @@ def update_custom_keys(repo, username=None, namespace=None): repo = flask.g.repo - if not repo.settings.get('issue_tracker', True): - flask.abort(404, 'No issue tracker found for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): @@ -2460,6 +2450,7 @@ def update_custom_keys(repo, username=None, namespace=None): '/fork////delete/report', methods=['POST']) @login_required +@has_issue_tracker @is_admin_sess_timedout @is_repo_admin def delete_report(repo, username=None, namespace=None): @@ -2468,9 +2459,6 @@ def delete_report(repo, username=None, namespace=None): repo = flask.g.repo - if not repo.settings.get('issue_tracker', True): - flask.abort(404, 'No issue tracker found for this project') - form = pagure.forms.ConfirmationForm() if form.validate_on_submit(): diff --git a/tests/test_pagure_flask_api_ui_private_repo.py b/tests/test_pagure_flask_api_ui_private_repo.py index 339214c..af0c242 100644 --- a/tests/test_pagure_flask_api_ui_private_repo.py +++ b/tests/test_pagure_flask_api_ui_private_repo.py @@ -537,7 +537,7 @@ class PagurePrivateRepotest(tests.Modeltests): self.assertEqual( output.get_data(as_text=True).count('
'), 6) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_private_settings_ui(self, ast): """ Test UI for private repo""" ast.return_value = False @@ -588,7 +588,7 @@ class PagurePrivateRepotest(tests.Modeltests): '', output.get_data(as_text=True)) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_private_settings_ui_update_privacy_false(self, ast): """ Test UI for private repo""" ast.return_value = False @@ -644,7 +644,7 @@ class PagurePrivateRepotest(tests.Modeltests): repo = pagure.lib._get_project(self.session, 'test4') self.assertFalse(repo.private) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_private_settings_ui_update_privacy_true(self, ast): """ Test UI for private repo""" ast.return_value = False diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 46c31a5..1214bfe 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -45,7 +45,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['UPLOAD_FOLDER_PATH'] = os.path.join( self.path, 'releases') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_add_user_when_user_mngt_off(self, ast): """ Test the add_user endpoint when user management is turned off in the pagure instance """ @@ -97,7 +97,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['ENABLE_USER_MNGT'] = True - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_add_deploykey(self, ast): """ Test the add_deploykey endpoint. """ ast.return_value = False @@ -199,7 +199,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertIn('Deploy key added', output.data) self.assertIn('PUSH ACCESS', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') @patch.dict('pagure.config.config', {'DEPLOY_KEY': False}) def test_add_deploykey_disabled(self, ast): """ Test the add_deploykey endpoint when it's disabled in the config. @@ -216,7 +216,7 @@ class PagureFlaskRepotests(tests.Modeltests): output = self.app.post('/test/adddeploykey') self.assertEqual(output.status_code, 404) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') @patch('pagure.lib.notify.log') def test_add_user(self, mock_log, ast): """ Test the add_user endpoint. """ @@ -312,7 +312,7 @@ class PagureFlaskRepotests(tests.Modeltests): mock_log.assert_called_with(ANY, topic='project.user.added', msg=ANY, redis=ANY) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_add_group_project_when_user_mngt_off(self, ast): """ Test the add_group_project endpoint when user management is turned off in the pagure instance""" @@ -372,7 +372,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['ENABLE_USER_MNGT'] = True @patch.dict('pagure.config.config', {'ENABLE_GROUP_MNGT': False}) - @patch('pagure.ui.repo.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_add_group_project_grp_mngt_off(self, ast): """ Test the add_group_project endpoint when group management is turned off in the pagure instance""" @@ -397,7 +397,7 @@ class PagureFlaskRepotests(tests.Modeltests): output.data) self.assertIn(u'No group ralph found.', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_add_group_project(self, ast): """ Test the add_group_project endpoint. """ ast.return_value = False @@ -488,7 +488,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertIn( '\n Group added', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_remove_user_when_user_mngt_off(self, ast): """ Test the remove_user endpoint when user management is turned off in the pagure instance""" @@ -541,7 +541,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['ENABLE_USER_MNGT'] = True - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_remove_deploykey(self, ast): """ Test the remove_deploykey endpoint. """ ast.return_value = False @@ -616,7 +616,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertIn('

Settings for test

', output.data) self.assertIn('Deploy key removed', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') @patch.dict('pagure.config.config', {'DEPLOY_KEY': False}) def test_remove_deploykey_disabled(self, ast): """ Test the remove_deploykey endpoint when it's disabled in the @@ -631,7 +631,7 @@ class PagureFlaskRepotests(tests.Modeltests): output = self.app.post('/test/dropdeploykey/1') self.assertEqual(output.status_code, 404) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') @patch('pagure.lib.notify.log') def test_remove_user(self, mock_log, ast): """ Test the remove_user endpoint. """ @@ -722,7 +722,7 @@ class PagureFlaskRepotests(tests.Modeltests): mock_log.assert_called_with(ANY, topic='project.user.removed', msg=ANY) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_remove_group_project_when_user_mngt_off(self, ast): """ Test the remove_group_project endpoint when user management is turned off in the pagure instance""" @@ -790,7 +790,7 @@ class PagureFlaskRepotests(tests.Modeltests): pagure.config.config['ENABLE_USER_MNGT'] = True - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_remove_group_project(self, ast): """ Test the remove_group_project endpoint. """ ast.return_value = False @@ -896,7 +896,7 @@ class PagureFlaskRepotests(tests.Modeltests): repo = pagure.lib.get_authorized_project(self.session, 'test') self.assertEqual(len(repo.groups), 0) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_update_project(self, ast): """ Test the update_project endpoint. """ ast.return_value = True @@ -992,7 +992,7 @@ class PagureFlaskRepotests(tests.Modeltests): '\n Project updated', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_update_project_update_tag(self, ast): """ Test the view_settings endpoint when updating the project's tags. @@ -1069,7 +1069,7 @@ class PagureFlaskRepotests(tests.Modeltests): '\n Project updated', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_view_settings(self, ast): """ Test the view_settings endpoint. """ ast.return_value = False @@ -1195,7 +1195,7 @@ class PagureFlaskRepotests(tests.Modeltests): 'name="issue_tracker" checked=""/>', output.data) @patch('pagure.lib.git.generate_gitolite_acls') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_view_settings_pr_only(self, ast, gen_acl): """ Test the view_settings endpoint when turning on PR only. """ ast.return_value = False @@ -1254,7 +1254,7 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertEqual(args[1].keys(), ['project']) self.assertEqual(args[1]['project'].fullname, 'test') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_fields_in_view_settings(self, ast): """ Test the default fields in view_settings endpoint. """ ast.return_value = False @@ -2740,7 +2740,7 @@ index 0000000..fb7093d @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch('pagure.lib.notify.send_email') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_delete_repo_when_turned_off(self, ast, send_email): """ Test the delete_repo endpoint when deletion of a repo is turned off in the pagure instance """ @@ -2958,7 +2958,7 @@ index 0000000..fb7093d self.assertEqual(output.status_code, 404) @patch('pagure.lib.notify.send_email') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_delete_read_only_repo(self, ast, send_email): """ Test the delete_repo endpoint when the repo is read_only """ ast.return_value = False @@ -3008,7 +3008,7 @@ index 0000000..fb7093d output.data) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_delete_repo(self, ast): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -3277,7 +3277,7 @@ index 0000000..fb7093d @patch.dict('pagure.config.config', {'TICKETS_FOLDER': None}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.lib.decorators.admin_session_timedout', MagicMock(return_value=False)) + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_repo_no_ticket(self): """ Test the delete_repo endpoint when tickets aren't enabled in this pagure instance. """ @@ -3316,7 +3316,7 @@ index 0000000..fb7093d output.data) @patch('pagure.lib.notify.send_email') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_delete_repo_with_users(self, ast, send_email): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -3404,7 +3404,7 @@ index 0000000..fb7093d self.assertEqual(repo, None) @patch('pagure.lib.notify.send_email') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_delete_repo_with_group(self, ast, send_email): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -3506,7 +3506,7 @@ index 0000000..fb7093d self.assertEqual(repo, None) @patch('pagure.lib.notify.send_email') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_delete_repo_with_coloredtag(self, ast, send_email): """ Test the delete_repo endpoint. """ ast.return_value = False @@ -3600,7 +3600,7 @@ index 0000000..fb7093d repo = pagure.lib.get_authorized_project(self.session, 'test2') self.assertEqual(repo, None) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_new_repo_hook_token(self, ast): """ Test the new_repo_hook_token endpoint. """ ast.return_value = False @@ -3660,7 +3660,7 @@ index 0000000..fb7093d self.assertNotEqual(repo.hook_token, 'aaabbbccc') @patch('pagure.lib.notify.send_email') - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') @patch('pagure.lib.git.update_git') def test_regenerate_git(self, upgit, ast, sendmail): """ Test the regenerate_git endpoint. """ @@ -3970,7 +3970,7 @@ index 0000000..fb7093d self.assertIn( '

No content found

', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_change_ref_head(self,ast): """ Test the change_ref_head endpoint. """ ast.return_value = True @@ -4170,7 +4170,7 @@ index 0000000..fb7093d 'been uploaded', output.data) self.assertIn('This project has not been tagged.', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_add_token_all_tokens(self, ast): """ Test the add_token endpoint. """ ast.return_value = False @@ -4189,7 +4189,7 @@ index 0000000..fb7093d ) @patch.dict('pagure.config.config', {'USER_ACLS': ['create_project']}) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_add_token_one_token(self, ast): """ Test the add_token endpoint. """ ast.return_value = False @@ -4207,7 +4207,7 @@ index 0000000..fb7093d 1 ) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_add_token(self, ast): """ Test the add_token endpoint. """ ast.return_value = False @@ -4281,7 +4281,7 @@ index 0000000..fb7093d 'Valid until: ', output.data) - @patch('pagure.lib.decorators.admin_session_timedout') + @patch('pagure.decorators.admin_session_timedout') def test_revoke_api_token(self, ast): """ Test the revoke_api_token endpoint. """ ast.return_value = False diff --git a/tests/test_pagure_flask_ui_repo_delete_project.py b/tests/test_pagure_flask_ui_repo_delete_project.py index 838da74..0301aab 100644 --- a/tests/test_pagure_flask_ui_repo_delete_project.py +++ b/tests/test_pagure_flask_ui_repo_delete_project.py @@ -70,7 +70,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_repo_when_turned_off(self): """ Test the delete_repo endpoint for a fork when only deleting main @@ -86,7 +86,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): self.assertEqual(len(projects), 4) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_button_present(self): """ Test that the delete button is present when deletions are @@ -105,7 +105,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_button_absent(self): """ Test that the delete button is absent when deletions are not @@ -125,7 +125,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': True}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_fork_when_project_off_refreshing(self): """ Test the delete_repo endpoint for a fork when only deleting main @@ -156,7 +156,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': True}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_fork_when_project_off(self): """ Test the delete_repo endpoint for a fork when only deleting main @@ -182,7 +182,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': False}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_fork_when_fork_and_project_off(self): """ Test the delete_repo endpoint for a fork when deleting fork and @@ -201,7 +201,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': False}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_fork_button_absent(self): """ Test that the delete button is absent when deletions are not @@ -223,7 +223,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': True}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_fork_button_fork_del_allowed(self): """ Test that the delete button is present when deletions of projects @@ -253,7 +253,7 @@ class PagureFlaskDeleteRepotests(tests.Modeltests): @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False}) @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': True}) @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - @patch('pagure.ui.repo.admin_session_timedout', + @patch('pagure.decorators.admin_session_timedout', MagicMock(return_value=False)) def test_delete_fork_button_fork_del_allowed_read_only(self): """ Test that the delete button is absent when deletions of projects