22Compatibility library for older versions of python and requests_kerberos
33"""
44
5+ import socket
56import sys
67
78import gssapi
@@ -32,6 +33,8 @@ def __init__(
3233 principal = None ,
3334 hostname_override = None ,
3435 sanitize_mutual_error_response = True ,
36+ dns_canonicalize_hostname = False ,
37+ use_reverse_dns = False
3538 ):
3639 # put these here for later
3740 self .principal = principal
@@ -46,12 +49,27 @@ def __init__(
4649 opportunistic_auth = force_preemptive ,
4750 creds = None ,
4851 sanitize_mutual_error_response = sanitize_mutual_error_response ,
52+ dns_canonicalize_hostname = dns_canonicalize_hostname ,
53+ use_reverse_dns = use_reverse_dns
4954 )
5055
5156 def generate_request_header (self , response , host , is_preemptive = False ):
5257 # This method needs to be shimmed because `host` isn't exposed to
5358 # __init__() and we need to derive things from it. Also, __init__()
5459 # can't fail, in the strictest compatability sense.
60+ canonhost = host
61+ if self .dns_canonicalize_hostname :
62+ try :
63+ ai = socket .getaddrinfo (host , 0 , flags = socket .AI_CANONNAME )
64+ canonhost = ai [0 ][3 ]
65+
66+ if self .use_reverse_dns :
67+ ni = socket .getnameinfo (ai [0 ][4 ], socket .NI_NAMEREQD )
68+ canonhost = ni [0 ]
69+
70+ except socket .gaierror as e :
71+ if e .errno == socket .EAI_MEMORY :
72+ raise e
5573 try :
5674 if self .principal is not None :
5775 gss_stage = "acquiring credentials"
@@ -64,7 +82,7 @@ def generate_request_header(self, response, host, is_preemptive=False):
6482 # name-based HTTP hosting)
6583 if self .service is not None :
6684 gss_stage = "initiating context"
67- kerb_host = host
85+ kerb_host = canonhost
6886 if self .hostname_override :
6987 kerb_host = self .hostname_override
7088
0 commit comments