Use requests_gssapi instead of requests_kerberos

Retain ability to use the old requests_kerberos where request_gssapi is
not available yet.

Signed-off-by: Simo Sorce <simo@redhat.com>
This commit is contained in:
Simo Sorce 2020-05-22 10:56:59 -04:00 committed by Mike McLean
parent 9063f33b07
commit 2c663f0b73
7 changed files with 36 additions and 25 deletions

View file

@ -70,10 +70,14 @@ from koji.tasks import (
from koji.util import dslice, dslice_ex, isSuccess, parseStatus, to_list
try:
import requests_kerberos
Krb5Error = requests_kerberos.exceptions.RequestException
import requests_gssapi as reqgssapi
Krb5Error = reqgssapi.exceptions.RequestException
except ImportError: # pragma: no cover
requests_kerberos = None
try:
import requests_kerberos as reqgssapi
Krb5Error = reqgssapi.exceptions.RequestException
except ImportError: # pragma: no cover
reqgssapi = None
try:
import librepo
@ -6597,7 +6601,7 @@ if __name__ == "__main__":
quit("Error: Unable to log in. Bad credentials?")
except requests.exceptions.ConnectionError:
quit("Error: Unable to connect to server %s" % (options.server))
elif requests_kerberos:
elif reqgssapi:
krb_principal = options.krb_principal
if krb_principal is None:
krb_principal = options.host_principal_format % socket.getfqdn()

View file

@ -145,7 +145,11 @@ Requires: rpm-python%{python3_pkgversion}
%endif
Requires: python%{python3_pkgversion}-pyOpenSSL
Requires: python%{python3_pkgversion}-requests
%if 0%{?fedora} >= 32
Requires: python%{python3_pkgversion}-requests-gssapi
%else
Requires: python%{python3_pkgversion}-requests-kerberos
%endif
Requires: python%{python3_pkgversion}-dateutil
Requires: python%{python3_pkgversion}-six

View file

@ -72,9 +72,12 @@ except Exception: # pragma: no cover
# we ignore it here
pass
try:
import requests_kerberos
import requests_gssapi as reqgssapi
except ImportError: # pragma: no cover
requests_kerberos = None
try:
import requests_kerberos as reqgssapi
except ImportError: # pragma: no cover
reqgssapi = None
try:
import rpm
except ImportError:
@ -2460,9 +2463,9 @@ class ClientSession(object):
ccache=ccache, proxyuser=proxyuser)
def gssapi_login(self, principal=None, keytab=None, ccache=None, proxyuser=None):
if not requests_kerberos:
if not reqgssapi:
raise PythonImportError(
"Please install python-requests-kerberos to use GSSAPI."
"Please install python-requests-gssapi to use GSSAPI."
)
# force https
old_baseurl = self.baseurl
@ -2489,14 +2492,14 @@ class ClientSession(object):
old_env['KRB5CCNAME'] = os.environ.get('KRB5CCNAME')
os.environ['KRB5CCNAME'] = ccache
if principal:
if re.match(r'0[.][1-8]\b', requests_kerberos.__version__):
if re.match(r'0[.][1-8]\b', reqgssapi.__version__):
raise PythonImportError(
'python-requests-kerberos >= 0.9.0 required for '
'python-requests-gssapi >= 0.9.0 required for '
'keytab auth'
)
else:
kwargs['principal'] = principal
self.opts['auth'] = requests_kerberos.HTTPKerberosAuth(**kwargs)
self.opts['auth'] = reqgssapi.HTTPKerberosAuth(**kwargs)
try:
# Depending on the server configuration, we might not be able to
# connect without client certificate, which means that the conn

View file

@ -14,7 +14,7 @@ def get_install_requires():
requires = [
'python-dateutil',
'requests',
'requests-kerberos',
'requests-gssapi',
'six',
# 'libcomps',
# 'rpm-py-installer', # it is optional feature

View file

@ -21,7 +21,7 @@ class TestGSSAPI(unittest.TestCase):
maxDiff = None
@mock.patch('koji.requests_kerberos', new=None)
@mock.patch('koji.reqgssapi', new=None)
def test_gssapi_disabled(self):
with self.assertRaises(ImportError):
self.session.gssapi_login()
@ -33,13 +33,13 @@ class TestGSSAPI(unittest.TestCase):
retry=False)
self.assertEqual(old_environ, dict(**os.environ))
@mock.patch('requests_kerberos.HTTPKerberosAuth')
@mock.patch('koji.reqgssapi.HTTPKerberosAuth')
def test_gssapi_login_keytab(self, HTTPKerberosAuth_mock):
principal = 'user@EXAMPLE.COM'
keytab = '/path/to/keytab'
ccache = '/path/to/cache'
old_environ = dict(**os.environ)
current_version = koji.requests_kerberos.__version__
current_version = koji.reqgssapi.__version__
accepted_versions = ['0.12.0.beta1',
'0.12.0dev',
'0.12.0a1',
@ -47,7 +47,7 @@ class TestGSSAPI(unittest.TestCase):
'0.10.0',
'0.9.0']
for accepted_version in accepted_versions:
koji.requests_kerberos.__version__ = accepted_version
koji.reqgssapi.__version__ = accepted_version
rv = self.session.gssapi_login(principal, keytab, ccache)
self.session._callMethod.assert_called_once_with('sslLogin',
[None],
@ -55,14 +55,14 @@ class TestGSSAPI(unittest.TestCase):
self.assertEqual(old_environ, dict(**os.environ))
self.assertTrue(rv)
self.session._callMethod.reset_mock()
koji.requests_kerberos.__version__ = current_version
koji.reqgssapi.__version__ = current_version
def test_gssapi_login_keytab_unsupported_requests_kerberos_version(self):
def test_gssapi_login_keytab_unsupported_requests_kerberos(self):
principal = 'user@EXAMPLE.COM'
keytab = '/path/to/keytab'
ccache = '/path/to/cache'
old_environ = dict(**os.environ)
current_version = koji.requests_kerberos.__version__
current_version = koji.reqgssapi.__version__
old_versions = ['0.8.0',
'0.7.0',
'0.6.1',
@ -72,15 +72,15 @@ class TestGSSAPI(unittest.TestCase):
'0.2',
'0.1']
for old_version in old_versions:
koji.requests_kerberos.__version__ = old_version
koji.reqgssapi.__version__ = old_version
with self.assertRaises(koji.PythonImportError) as cm:
self.session.gssapi_login(principal, keytab, ccache)
self.assertEqual(cm.exception.args[0],
'python-requests-kerberos >= 0.9.0 required for '
'python-requests-gssapi >= 0.9.0 required for '
'keytab auth')
self.session._callMethod.assert_not_called()
self.assertEqual(old_environ, dict(**os.environ))
koji.requests_kerberos.__version__ = current_version
koji.reqgssapi.__version__ = current_version
def test_gssapi_login_error(self):
old_environ = dict(**os.environ)

View file

@ -374,7 +374,7 @@ def activate_session(session):
elif options.user:
# authenticate using user/password
session.login()
elif koji.requests_kerberos:
elif koji.reqgssapi:
session.gssapi_login(principal=options.principal, keytab=options.keytab,
proxyuser=options.runas)
if not options.noauth and not session.logged_in:

View file

@ -1191,8 +1191,8 @@ if __name__ == "__main__":
elif options.user:
# authenticate using user/password
session.login()
elif koji.requests_kerberos and options.principal and options.keytab:
session.gssapi_login(options.principal, options.keytab, options.ccache)
elif koji.reqgssapi and options.principal and options.keytab:
session.krb_login(options.principal, options.keytab, options.ccache)
else:
quit("No username/password/certificate supplied and Kerberos missing or not configured")
# get an exclusive session