

def http_digest(r, username, password):
    'Attaches HTTP Digest Authentication to the given Request object.\n    Arguments should be considered non-positional.\n    '

    def handle_401(r):
        'Takes the given response and tries digest-auth, if needed.'
        s_auth = r.headers.get('www-authenticate', '')
        if ('digest' in s_auth.lower()):
            last_nonce = ''
            nonce_count = 0
            chal = parse_dict_header(s_auth.replace('Digest ', ''))
            realm = chal['realm']
            nonce = chal['nonce']
            qop = chal.get('qop')
            algorithm = chal.get('algorithm', 'MD5')
            opaque = chal.get('opaque', None)
            algorithm = algorithm.upper()
            if (algorithm == 'MD5'):
                H = (lambda x: hashlib.md5(x).hexdigest())
            elif (algorithm == 'SHA'):
                H = (lambda x: hashlib.sha1(x).hexdigest())
            KD = (lambda s, d: H(('%s:%s' % (s, d))))
            if (H is None):
                return None
            entdig = None
            p_parsed = urlparse(r.request.url)
            path = (p_parsed.path + p_parsed.query)
            A1 = ('%s:%s:%s' % (username, realm, password))
            A2 = ('%s:%s' % (r.request.method, path))
            if (qop == 'auth'):
                if (nonce == last_nonce):
                    nonce_count += 1
                else:
                    nonce_count = 1
                    last_nonce = nonce
                ncvalue = ('%08x' % nonce_count)
                cnonce = hashlib.sha1(('%s:%s:%s:%s' % (nonce_count, nonce, time.ctime(), randombytes(8)))).hexdigest()[:16]
                noncebit = ('%s:%s:%s:%s:%s' % (nonce, ncvalue, cnonce, qop, H(A2)))
                respdig = KD(H(A1), noncebit)
            elif (qop is None):
                respdig = KD(H(A1), ('%s:%s' % (nonce, H(A2))))
            else:
                return None
            base = ('username="%s", realm="%s", nonce="%s", uri="%s", response="%s"' % (username, realm, nonce, path, respdig))
            if opaque:
                base += (', opaque="%s"' % opaque)
            if entdig:
                base += (', digest="%s"' % entdig)
            base += (', algorithm="%s"' % algorithm)
            if qop:
                base += (', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce))
            r.request.headers['Authorization'] = ('Digest %s' % base)
            r.request.send(anyway=True)
            _r = r.request.response
            _r.history.append(r)
            return _r
        return r
    r.hooks['response'] = handle_401
    return r

dataset/ETHPy150Open bububa/pyTOP/pyTOP/packages/requests/auth.py http_digest/original