Skip to content

Commit b613a76

Browse files
Port main code to python-gssapi
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
1 parent bf61755 commit b613a76

File tree

1 file changed

+29
-44
lines changed

1 file changed

+29
-44
lines changed

requests_gssapi/gssapi_.py

Lines changed: 29 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import kerberos
21
import re
32
import logging
43

4+
import gssapi
5+
56
from requests.auth import AuthBase
67
from requests.models import Response
78
from requests.compat import urlparse, StringIO
@@ -102,56 +103,45 @@ def generate_request_header(self, response, host, is_preemptive=False):
102103
103104
"""
104105

105-
# Flags used by kerberos module.
106-
gssflags = kerberos.GSS_C_MUTUAL_FLAG | kerberos.GSS_C_SEQUENCE_FLAG
106+
gssflags = [gssapi.RequirementFlag.mutual_authentication,
107+
gssapi.RequirementFlag.out_of_sequence_detection]
107108
if self.delegate:
108-
gssflags |= kerberos.GSS_C_DELEG_FLAG
109+
gssflags.append(gssapi.RequirementFlag.delegate_to_peer)
109110

110111
try:
111-
kerb_stage = "authGSSClientInit()"
112112
# contexts still need to be stored by host, but hostname_override
113113
# allows use of an arbitrary hostname for the kerberos exchange
114114
# (eg, in cases of aliased hosts, internal vs external, CNAMEs
115115
# w/ name-based HTTP hosting)
116116
kerb_host = self.hostname_override if self.hostname_override is not None else host
117117
kerb_spn = "{0}@{1}".format(self.service, kerb_host)
118118

119-
result, self.context[host] = kerberos.authGSSClientInit(kerb_spn,
120-
gssflags=gssflags, principal=self.principal)
121-
122-
if result < 1:
123-
raise EnvironmentError(result, kerb_stage)
124-
125-
# if we have a previous response from the server, use it to continue
126-
# the auth process, otherwise use an empty value
127-
negotiate_resp_value = '' if is_preemptive else _negotiate_value(response)
128-
129-
kerb_stage = "authGSSClientStep()"
130-
result = kerberos.authGSSClientStep(self.context[host],
131-
negotiate_resp_value)
119+
creds = None
120+
if self.principal:
121+
gss_stage = "acquiring credentials"
122+
creds = gssapi.Credentials(name=gssapi.Name(self.principal),
123+
usage="initiate")
132124

133-
if result < 0:
134-
raise EnvironmentError(result, kerb_stage)
125+
gss_stage = "initiating context"
126+
self.context[host] = gssapi.SecurityContext(
127+
usage="initiate", flags=gssflags, name=gssapi.Name(kerb_spn),
128+
creds=creds)
135129

136-
kerb_stage = "authGSSClientResponse()"
137-
gss_response = kerberos.authGSSClientResponse(self.context[host])
130+
gss_stage = "stepping context"
131+
if is_preemptive:
132+
gss_response = self.context[host].step()
133+
else:
134+
gss_response = self.context[host].step(
135+
_negotiate_value(response))
138136

139137
return "Negotiate {0}".format(gss_response)
140138

141-
except kerberos.GSSError as error:
139+
except gssapi.exceptions.GSSError as error:
140+
msg = error.gen_message()
142141
log.exception(
143-
"generate_request_header(): {0} failed:".format(kerb_stage))
144-
log.exception(error)
145-
raise KerberosExchangeError("%s failed: %s" % (kerb_stage, str(error.args)))
146-
147-
except EnvironmentError as error:
148-
# ensure we raised this for translation to KerberosExchangeError
149-
# by comparing errno to result, re-raise if not
150-
if error.errno != result:
151-
raise
152-
message = "{0} failed, result: {1}".format(kerb_stage, result)
153-
log.error("generate_request_header(): {0}".format(message))
154-
raise KerberosExchangeError(message)
142+
"generate_request_header(): {0} failed:".format(gss_stage))
143+
log.exception(msg)
144+
raise KerberosExchangeError("%s failed: %s" % (gss_stage, msg))
155145

156146
def authenticate_user(self, response, **kwargs):
157147
"""Handles user authentication with gssapi/kerberos"""
@@ -251,15 +241,10 @@ def authenticate_server(self, response):
251241
host = urlparse(response.url).hostname
252242

253243
try:
254-
result = kerberos.authGSSClientStep(self.context[host],
255-
_negotiate_value(response))
256-
except kerberos.GSSError:
257-
log.exception("authenticate_server(): authGSSClientStep() failed:")
258-
return False
259-
260-
if result < 1:
261-
log.error("authenticate_server(): authGSSClientStep() failed: "
262-
"{0}".format(result))
244+
result = self.context[host].step(_negotiate_value(response))
245+
except gssapi.exceptions.GSSError as error:
246+
log.exception("authenticate_server(): context stepping failed:")
247+
log.exception(error.gen_message())
263248
return False
264249

265250
log.debug("authenticate_server(): returning {0}".format(response))

0 commit comments

Comments
 (0)