PHP 7.4.33
Preview: auth.py Size: 2.11 KB
//usr/lib/python3/dist-packages/httplib2/auth.py
import base64
import re

import pyparsing as pp

from .error import *


try:  # pyparsing>=3.0.0
    downcaseTokens = pp.common.downcaseTokens
except AttributeError:
    downcaseTokens = pp.downcaseTokens

UNQUOTE_PAIRS = re.compile(r"\\(.)")
unquote = lambda s, l, t: UNQUOTE_PAIRS.sub(r"\1", t[0][1:-1])

# https://tools.ietf.org/html/rfc7235#section-1.2
# https://tools.ietf.org/html/rfc7235#appendix-B
tchar = "!#$%&'*+-.^_`|~" + pp.nums + pp.alphas
token = pp.Word(tchar).setName("token")
token68 = pp.Combine(pp.Word("-._~+/" + pp.nums + pp.alphas) + pp.Optional(pp.Word("=").leaveWhitespace())).setName(
    "token68"
)

quoted_string = pp.dblQuotedString.copy().setName("quoted-string").setParseAction(unquote)
auth_param_name = token.copy().setName("auth-param-name").addParseAction(downcaseTokens)
auth_param = auth_param_name + pp.Suppress("=") + (quoted_string | token)
params = pp.Dict(pp.delimitedList(pp.Group(auth_param)))

scheme = token("scheme")
challenge = scheme + (params("params") | token68("token"))

authentication_info = params.copy()
www_authenticate = pp.delimitedList(pp.Group(challenge))


def _parse_authentication_info(headers, headername="authentication-info"):
    """https://tools.ietf.org/html/rfc7615
    """
    header = headers.get(headername, "").strip()
    if not header:
        return {}
    try:
        parsed = authentication_info.parseString(header)
    except pp.ParseException as ex:
        # print(ex.explain(ex))
        raise MalformedHeader(headername)

    return parsed.asDict()


def _parse_www_authenticate(headers, headername="www-authenticate"):
    """Returns a dictionary of dictionaries, one dict per auth_scheme."""
    header = headers.get(headername, "").strip()
    if not header:
        return {}
    try:
        parsed = www_authenticate.parseString(header)
    except pp.ParseException as ex:
        # print(ex.explain(ex))
        raise MalformedHeader(headername)

    retval = {
        challenge["scheme"].lower(): challenge["params"].asDict()
        if "params" in challenge
        else {"token": challenge.get("token")}
        for challenge in parsed
    }
    return retval

Directory Contents

Dirs: 1 × Files: 6
Name Size Perms Modified Actions
- drwxr-xr-x 2022-08-09 11:56:55
Edit Download
2.11 KB lrw-r--r-- 2021-11-02 06:35:56
Edit Download
930 B lrw-r--r-- 2021-11-26 11:06:34
Edit Download
954 B lrw-r--r-- 2021-02-06 21:09:37
Edit Download
4.06 KB lrw-r--r-- 2020-11-17 11:01:45
Edit Download
19.24 KB lrw-r--r-- 2020-11-17 11:01:45
Edit Download
67.40 KB lrw-r--r-- 2021-11-02 06:41:42
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).