Adding new stuff
This commit is contained in:
parent
39ee792ad4
commit
a410da0e04
722 changed files with 331 additions and 189 deletions
|
|
@ -1,89 +0,0 @@
|
|||
from __future__ import print_function
|
||||
|
||||
import logging
|
||||
import urllib2
|
||||
|
||||
import kerberos as krb
|
||||
|
||||
class GssapiAuthError(Exception):
|
||||
"""raised on error during authentication process"""
|
||||
|
||||
import re
|
||||
RGX = re.compile('(?:.*,)*\s*Negotiate\s*([^,]*),?', re.I)
|
||||
|
||||
def get_negociate_value(headers):
|
||||
for authreq in headers.getheaders('www-authenticate'):
|
||||
match = RGX.search(authreq)
|
||||
if match:
|
||||
return match.group(1)
|
||||
|
||||
class HTTPGssapiAuthHandler(urllib2.BaseHandler):
|
||||
"""Negotiate HTTP authentication using context from GSSAPI"""
|
||||
|
||||
handler_order = 400 # before Digest Auth
|
||||
|
||||
def __init__(self):
|
||||
self._reset()
|
||||
|
||||
def _reset(self):
|
||||
self._retried = 0
|
||||
self._context = None
|
||||
|
||||
def clean_context(self):
|
||||
if self._context is not None:
|
||||
krb.authGSSClientClean(self._context)
|
||||
|
||||
def http_error_401(self, req, fp, code, msg, headers):
|
||||
try:
|
||||
if self._retried > 5:
|
||||
raise urllib2.HTTPError(req.get_full_url(), 401,
|
||||
"negotiate auth failed", headers, None)
|
||||
self._retried += 1
|
||||
logging.debug('gssapi handler, try %s' % self._retried)
|
||||
negotiate = get_negociate_value(headers)
|
||||
if negotiate is None:
|
||||
logging.debug('no negociate found in a www-authenticate header')
|
||||
return None
|
||||
logging.debug('HTTPGssapiAuthHandler: negotiate 1 is %r' % negotiate)
|
||||
result, self._context = krb.authGSSClientInit("HTTP@%s" % req.get_host())
|
||||
if result < 1:
|
||||
raise GssapiAuthError("HTTPGssapiAuthHandler: init failed with %d" % result)
|
||||
result = krb.authGSSClientStep(self._context, negotiate)
|
||||
if result < 0:
|
||||
raise GssapiAuthError("HTTPGssapiAuthHandler: step 1 failed with %d" % result)
|
||||
client_response = krb.authGSSClientResponse(self._context)
|
||||
logging.debug('HTTPGssapiAuthHandler: client response is %s...' % client_response[:10])
|
||||
req.add_unredirected_header('Authorization', "Negotiate %s" % client_response)
|
||||
server_response = self.parent.open(req)
|
||||
negotiate = get_negociate_value(server_response.info())
|
||||
if negotiate is None:
|
||||
logging.warning('HTTPGssapiAuthHandler: failed to authenticate server')
|
||||
else:
|
||||
logging.debug('HTTPGssapiAuthHandler negotiate 2: %s' % negotiate)
|
||||
result = krb.authGSSClientStep(self._context, negotiate)
|
||||
if result < 1:
|
||||
raise GssapiAuthError("HTTPGssapiAuthHandler: step 2 failed with %d" % result)
|
||||
return server_response
|
||||
except GssapiAuthError as exc:
|
||||
logging.error(repr(exc))
|
||||
finally:
|
||||
self.clean_context()
|
||||
self._reset()
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
# debug
|
||||
import httplib
|
||||
httplib.HTTPConnection.debuglevel = 1
|
||||
httplib.HTTPSConnection.debuglevel = 1
|
||||
# debug
|
||||
import logging
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
# handle cookies
|
||||
import cookielib
|
||||
cj = cookielib.CookieJar()
|
||||
ch = urllib2.HTTPCookieProcessor(cj)
|
||||
# test with url sys.argv[1]
|
||||
h = HTTPGssapiAuthHandler()
|
||||
response = urllib2.build_opener(h, ch).open(sys.argv[1])
|
||||
print('\nresponse: %s\n--------------\n' % response.code, response.info())
|
||||
Loading…
Add table
Add a link
Reference in a new issue