Skip to content

Commit 9507b8b

Browse files
Deprecate service and hostname_override in favor of explicit names
Signed-off-by: Robbie Harwood <[email protected]>
1 parent cdcc45b commit 9507b8b

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

requests_gssapi/compat.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,18 @@ class HTTPKerberosAuth(HTTPSPNEGOAuth):
2424
def __init__(self, mutual_authentication=REQUIRED, service="HTTP",
2525
delegate=False, force_preemptive=False, principal=None,
2626
hostname_override=None, sanitize_mutual_error_response=True):
27-
# put this here for later
27+
# put these here for later
2828
self.principal = principal
29+
self.service = service
30+
self.hostname_override = hostname_override
2931

3032
HTTPSPNEGOAuth.__init__(
3133
self,
3234
mutual_authentication=mutual_authentication,
33-
service=service,
35+
target_name=None,
3436
delegate=delegate,
3537
opportunistic_auth=force_preemptive,
3638
creds=None,
37-
hostname_override=hostname_override,
3839
sanitize_mutual_error_response=sanitize_mutual_error_response)
3940

4041
def generate_request_header(self, response, host, is_preemptive=False):
@@ -47,6 +48,19 @@ def generate_request_header(self, response, host, is_preemptive=False):
4748
name = gssapi.Name(self.principal)
4849
self.creds = gssapi.Credentials(name=name, usage="initiate")
4950

51+
# contexts still need to be stored by host, but hostname_override
52+
# allows use of an arbitrary hostname for the GSSAPI exchange (eg,
53+
# in cases of aliased hosts, internal vs external, CNAMEs w/
54+
# name-based HTTP hosting)
55+
if self.service is not None:
56+
gss_stage = "initiating context"
57+
kerb_host = host
58+
if self.hostname_override:
59+
kerb_host = self.hostname_override
60+
61+
kerb_spn = "{0}@{1}".format(self.service, kerb_host)
62+
self.target_name = gssapi.Name(kerb_spn)
63+
5064
return HTTPSPNEGOAuth.generate_request_header(self, response,
5165
host, is_preemptive)
5266
except gssapi.exceptions.GSSError as error:

requests_gssapi/gssapi_.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,16 @@ def _negotiate_value(response):
8080

8181
class HTTPSPNEGOAuth(AuthBase):
8282
"""Attaches HTTP GSSAPI Authentication to the given Request object."""
83-
def __init__(self, mutual_authentication=REQUIRED, service="HTTP",
83+
def __init__(self, mutual_authentication=REQUIRED, target_name="HTTP",
8484
delegate=False, opportunistic_auth=False, creds=None,
85-
hostname_override=None, sanitize_mutual_error_response=True):
85+
sanitize_mutual_error_response=True):
8686
self.context = {}
87+
self.pos = None
8788
self.mutual_authentication = mutual_authentication
89+
self.target_name = target_name
8890
self.delegate = delegate
89-
self.pos = None
90-
self.service = service
9191
self.opportunistic_auth = opportunistic_auth
9292
self.creds = creds
93-
self.hostname_override = hostname_override
9493
self.sanitize_mutual_error_response = sanitize_mutual_error_response
9594

9695
def generate_request_header(self, response, host, is_preemptive=False):
@@ -108,19 +107,14 @@ def generate_request_header(self, response, host, is_preemptive=False):
108107
gssflags.append(gssapi.RequirementFlag.delegate_to_peer)
109108

110109
try:
111-
# contexts still need to be stored by host, but hostname_override
112-
# allows use of an arbitrary hostname for the GSSAPI exchange
113-
# (eg, in cases of aliased hosts, internal vs external, CNAMEs
114-
# w/ name-based HTTP hosting)
115-
kerb_host = host
116-
if self.hostname_override:
117-
kerb_host = self.hostname_override
118-
119-
kerb_spn = "{0}@{1}".format(self.service, kerb_host)
120-
121110
gss_stage = "initiating context"
111+
if type(self.target_name) != gssapi.Name:
112+
if '@' not in self.target_name:
113+
self.target_name = "%s@%s" % (self.target_name, host)
114+
115+
self.target_name = gssapi.Name(self.target_name)
122116
self.context[host] = gssapi.SecurityContext(
123-
usage="initiate", flags=gssflags, name=gssapi.Name(kerb_spn),
117+
usage="initiate", flags=gssflags, name=self.target_name,
124118
creds=self.creds)
125119

126120
gss_stage = "stepping context"

test_requests_gssapi.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,21 @@ def test_explicit_creds(self):
589589
usage="initiate", flags=gssflags, creds="fake creds")
590590
fake_resp.assert_called_with("token")
591591

592+
def test_target_name(self):
593+
with patch.multiple("gssapi.SecurityContext", __init__=fake_init,
594+
step=fake_resp):
595+
response = requests.Response()
596+
response.url = "http://www.example.org/"
597+
response.headers = {'www-authenticate': 'negotiate token'}
598+
host = urlparse(response.url).hostname
599+
auth = requests_gssapi.HTTPSPNEGOAuth(
600+
target_name="[email protected]")
601+
auth.generate_request_header(response, host)
602+
fake_init.assert_called_with(
603+
name=gssapi.Name("[email protected]"),
604+
usage="initiate", flags=gssflags, creds=None)
605+
fake_resp.assert_called_with("token")
606+
592607

593608
if __name__ == '__main__':
594609
unittest.main()

0 commit comments

Comments
 (0)