in src/request.py [0:0]
def gethttpdigestauth(self, si, wwwauthorize=None):
# Check the nonce cache to see if we've used this user before, or if the nonce is more than 5 minutes old
user = [self.user, si.user][self.user == ""]
pswd = [self.pswd, si.pswd][self.pswd == ""]
details = None
if user in self.manager.digestCache and self.manager.digestCache[user]["max-nonce-time"] > time.time():
details = self.manager.digestCache[user]
else:
# Redo digest auth from scratch to get a new nonce etc
http = SmartHTTPConnection(si.host, si.port, si.ssl, si.afunix)
try:
puri = list(urlparse.urlparse(self.getURI(si)))
puri[2] = urllib.quote(puri[2])
quri = urlparse.urlunparse(puri)
http.request("OPTIONS", quri)
response = http.getresponse()
finally:
http.close()
if response.status == 401:
wwwauthorize = response.msg.getheaders("WWW-Authenticate")
for item in wwwauthorize:
if not item.lower().startswith("digest "):
continue
wwwauthorize = item[7:]
def unq(s):
if s[0] == s[-1] == '"':
return s[1:-1]
return s
parts = wwwauthorize.split(',')
details = {}
for (k, v) in [p.split('=', 1) for p in parts]:
details[k.strip()] = unq(v.strip())
details["max-nonce-time"] = time.time() + 600
self.manager.digestCache[user] = details
break
if details:
if details.get('qop'):
if self.nc.get(details.get('nonce')) is None:
self.nc[details.get('nonce')] = 1
else:
self.nc[details.get('nonce')] += 1
details['nc'] = "%08x" % self.nc[details.get('nonce')]
if details.get('cnonce') is None:
details['cnonce'] = "D4AAE4FF-ADA1-4149-BFE2-B506F9264318"
digest = calcResponse(
calcHA1(details.get('algorithm', 'md5'), user, details.get('realm'), pswd, details.get('nonce'), details.get('cnonce')),
details.get('algorithm', 'md5'), details.get('nonce'), details.get('nc'), details.get('cnonce'), details.get('qop'), self.method, self.getURI(si), None
)
if details.get('qop'):
response = (
'Digest username="%s", realm="%s", '
'nonce="%s", uri="%s", '
'response=%s, algorithm=%s, cnonce="%s", qop=%s, nc=%s' %
(user, details.get('realm'), details.get('nonce'), self.getURI(si), digest, details.get('algorithm', 'md5'), details.get('cnonce'), details.get('qop'), details.get('nc'),)
)
else:
response = (
'Digest username="%s", realm="%s", '
'nonce="%s", uri="%s", '
'response=%s, algorithm=%s' %
(user, details.get('realm'), details.get('nonce'), self.getURI(si), digest, details.get('algorithm'),)
)
return response
else:
return ""