diff --git a/pagure/utils.py b/pagure/utils.py index a875c1f..3d71822 100644 --- a/pagure/utils.py +++ b/pagure/utils.py @@ -632,3 +632,28 @@ def get_merge_options(request, merge_status): merge_status += "-non-ff-ok" return MERGE_OPTIONS[merge_status] + + +def lookup_deploykey(project, username): + """ Finds the Deploy Key specified by the username. + + Args: + project (model.Project): The project to look in + username (string): The username string provided for the deploy key + Returns (model.SSHKey or None): The SSHKey instance representing the + project-specific deploy key by the username. None if the username is + not a deploykey username or is not a valid deploy key for project. + """ + # The username to look for is: deploykey_(filename(project.fullname))_keyid + if not username.startswith("deploykey_"): + return None + username = username[len("deploykey_") :] + rest, keyid = username.rsplit("_", 1) + if rest != werkzeug.secure_filename(project.fullname): + # This is not a deploykey for the specified project + return None + keyid = int(keyid) + for key in project.deploykeys: + if key.id == keyid: + return key + return None diff --git a/tests/test_pagure_utils.py b/tests/test_pagure_utils.py new file mode 100644 index 0000000..5150f95 --- /dev/null +++ b/tests/test_pagure_utils.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2018 - Copyright Red Hat Inc + + Authors: + Patrick Uiterwijk + +""" + +from __future__ import unicode_literals + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import unittest +import shutil +import sys +import os + +import mock +import munch +import pygit2 +import werkzeug + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib +import pagure.lib.model +import pagure.utils +import tests + + +class PagureUtilsTests(tests.SimplePagureTest): + """ Tests for pagure.utils """ + + def setUp(self): + """ Set up the environnment, run before every tests. """ + super(PagureUtilsTests, self).setUp() + + tests.create_projects(self.session) + tests.create_projects_git(os.path.join(self.path, 'repos'), bare=True) + tests.add_content_git_repo(os.path.join(self.path, 'repos', 'test2.git')) + + project = pagure.lib._get_project(self.session, 'test') + # Add a deploy key to the project + new_key_obj = pagure.lib.model.SSHKey( + project_id=project.id, + pushaccess=False, + public_ssh_key='\n foo bar', + ssh_short_key='\n foo bar', + ssh_search_key='\n foo bar', + creator_user_id=1 # pingou + ) + + self.session.add(new_key_obj) + self.session.commit() + + def test_lookup_deploykey_non_deploykey(self): + """ Test lookup_deploykey with a non-deploykey username. """ + project = pagure.lib._get_project(self.session, 'test') + res = pagure.utils.lookup_deploykey(project, 'pingou') + self.assertEquals(res, None) + + def test_lookup_deploykey_different_project(self): + """ Test lookup_deploykey with a username for another project. """ + project = pagure.lib._get_project(self.session, 'test2') + res = pagure.utils.lookup_deploykey(project, 'deploykey_test_1') + self.assertEquals(res, None) + + def test_lookup_deploykey_non_existent_key(self): + """ Test lookup_deploykey with a non-existing deploykey. """ + project = pagure.lib._get_project(self.session, 'test') + res = pagure.utils.lookup_deploykey(project, 'deploykey_test_2') + self.assertEquals(res, None) + + def test_lookup_deploykey(self): + """ Test lookup_deploykey with a correct username. """ + project = pagure.lib._get_project(self.session, 'test') + res = pagure.utils.lookup_deploykey(project, 'deploykey_test_1') + self.assertNotEquals(res, None) + self.assertFalse(res.pushaccess)