Improve stubs for oauthlib.oauth2.rfc6749 (#13752)

This commit is contained in:
Semyon Moroz
2025-04-02 19:45:05 +04:00
committed by GitHub
parent 54e1817439
commit ffb8b0bfa0
11 changed files with 257 additions and 140 deletions
@@ -57,3 +57,4 @@ from .rfc6749.grant_types import (
from .rfc6749.request_validator import RequestValidator as RequestValidator
from .rfc6749.tokens import BearerToken as BearerToken, OAuth2Token as OAuth2Token
from .rfc6749.utils import is_secure_transport as is_secure_transport
from .rfc8628.clients import DeviceClient as DeviceClient
@@ -1,4 +1,4 @@
from typing import Any
from logging import Logger
from .endpoints.base import BaseEndpoint as BaseEndpoint, catch_errors_and_unavailability as catch_errors_and_unavailability
from .errors import (
@@ -8,4 +8,4 @@ from .errors import (
TemporarilyUnavailableError as TemporarilyUnavailableError,
)
log: Any
log: Logger
@@ -1,97 +1,122 @@
from _typeshed import Incomplete
from typing import Any
from _typeshed import ConvertibleToInt, Incomplete
from collections.abc import Callable
from typing import Final, Literal
from typing_extensions import TypeAlias
AUTH_HEADER: str
URI_QUERY: str
BODY: str
FORM_ENC_HEADERS: Any
from oauthlib.common import _HTTPMethod
from oauthlib.oauth2.rfc6749.tokens import OAuth2Token
_TokenPlacement: TypeAlias = Literal["auth_header", "query", "body"]
AUTH_HEADER: Final[_TokenPlacement]
URI_QUERY: Final[_TokenPlacement]
BODY: Final[_TokenPlacement]
FORM_ENC_HEADERS: Final[dict[str, str]]
class Client:
refresh_token_key: str
client_id: Any
default_token_placement: Any
token_type: Any
access_token: Any
refresh_token: Any
mac_key: Any
mac_algorithm: Any
token: Any
scope: Any
state_generator: Any
state: Any
redirect_url: Any
code: Any
expires_in: Any
code_verifier: str
code_challenge: str
code_challenge_method: str
client_id: str
default_token_placement: _TokenPlacement
token_type: str
access_token: str | None
refresh_token: str | None
mac_key: str | bytes | bytearray | None
mac_algorithm: str | None
token: dict[str, Incomplete]
scope: str | set[object] | tuple[object] | list[object]
state_generator: Callable[[], str]
state: str | None
redirect_url: str | None
code: Incomplete
expires_in: ConvertibleToInt | None
code_verifier: str | None
code_challenge: str | None
code_challenge_method: str | None
def __init__(
self,
client_id,
default_token_placement="auth_header",
client_id: str,
default_token_placement: _TokenPlacement = "auth_header",
token_type: str = "Bearer",
access_token: Incomplete | None = None,
refresh_token: Incomplete | None = None,
mac_key: Incomplete | None = None,
mac_algorithm: Incomplete | None = None,
token: Incomplete | None = None,
scope: Incomplete | None = None,
state: Incomplete | None = None,
redirect_url: Incomplete | None = None,
state_generator=...,
access_token: str | None = None,
refresh_token: str | None = None,
mac_key: str | bytes | bytearray | None = None,
mac_algorithm: str | None = None,
token: dict[str, Incomplete] | None = None,
scope: str | set[object] | tuple[object] | list[object] | None = None,
state: str | None = None,
redirect_url: str | None = None,
state_generator: Callable[[], str] = ...,
code_verifier: str | None = None,
code_challenge: str | None = None,
code_challenge_method: str | None = None,
**kwargs,
) -> None: ...
@property
def token_types(self): ...
def token_types(
self,
) -> dict[
Literal["Bearer", "MAC"],
Callable[
[str, str, str | None, dict[str, str] | None, str | None, Incomplete], tuple[str, dict[str, str] | None, str | None]
],
]: ...
def prepare_request_uri(self, *args, **kwargs) -> str: ...
def prepare_request_body(self, *args, **kwargs) -> str: ...
def parse_request_uri_response(self, *args, **kwargs) -> dict[str, str]: ...
def add_token(
self,
uri,
http_method: str = "GET",
body: Incomplete | None = None,
headers: Incomplete | None = None,
token_placement: Incomplete | None = None,
uri: str,
http_method: _HTTPMethod = "GET",
body: str | None = None,
headers: dict[str, str] | None = None,
token_placement: _TokenPlacement | None = None,
**kwargs,
): ...
) -> tuple[str, dict[str, str] | None, str | None]: ...
def prepare_authorization_request(
self,
authorization_url,
state: Incomplete | None = None,
redirect_url: Incomplete | None = None,
scope: Incomplete | None = None,
authorization_url: str,
state: str | None = None,
redirect_url: str | None = None,
scope: str | set[object] | tuple[object] | list[object] | None = None,
**kwargs,
): ...
) -> tuple[str, dict[str, str], str]: ...
def prepare_token_request(
self,
token_url,
authorization_response: Incomplete | None = None,
redirect_url: Incomplete | None = None,
state: Incomplete | None = None,
token_url: str,
authorization_response: str | None = None,
redirect_url: str | None = None,
state: str | None = None,
body: str = "",
**kwargs,
): ...
) -> tuple[str, dict[str, str], str]: ...
def prepare_refresh_token_request(
self, token_url, refresh_token: Incomplete | None = None, body: str = "", scope: Incomplete | None = None, **kwargs
): ...
self,
token_url: str,
refresh_token: str | None = None,
body: str = "",
scope: str | set[object] | tuple[object] | list[object] | None = None,
**kwargs,
) -> tuple[str, dict[str, str], str]: ...
def prepare_token_revocation_request(
self,
revocation_url,
token,
token_type_hint: str = "access_token",
token_type_hint: Literal["access_token", "refresh_token"] | None = "access_token",
body: str = "",
callback: Incomplete | None = None,
callback: Callable[[Incomplete], Incomplete] | None = None,
**kwargs,
): ...
def parse_request_body_response(self, body, scope: Incomplete | None = None, **kwargs): ...
def parse_request_body_response(
self, body: str, scope: str | set[object] | tuple[object] | list[object] | None = None, **kwargs
) -> OAuth2Token: ...
def prepare_refresh_body(
self, body: str = "", refresh_token: Incomplete | None = None, scope: Incomplete | None = None, **kwargs
): ...
self,
body: str = "",
refresh_token: str | None = None,
scope: str | set[object] | tuple[object] | list[object] | None = None,
**kwargs,
) -> str: ...
def create_code_verifier(self, length: int) -> str: ...
def create_code_challenge(self, code_verifier: str, code_challenge_method: str | None = None) -> str: ...
def populate_code_attributes(self, response) -> None: ...
def populate_token_attributes(self, response) -> None: ...
def populate_code_attributes(self, response: dict[str, Incomplete]) -> None: ...
def populate_token_attributes(self, response: dict[str, Incomplete]) -> None: ...
@@ -1,11 +1,13 @@
from _typeshed import Incomplete
from typing import Any
from typing import Any, NoReturn
from oauthlib.common import Request
class OAuth2Error(Exception):
error: Any
error: str | None
status_code: int
description: str
uri: Any
uri: str | None
state: Any
redirect_uri: Any
client_id: Any
@@ -15,21 +17,21 @@ class OAuth2Error(Exception):
grant_type: Any
def __init__(
self,
description: Incomplete | None = None,
uri: Incomplete | None = None,
description: str | None = None,
uri: str | None = None,
state: Incomplete | None = None,
status_code: Incomplete | None = None,
request: Incomplete | None = None,
status_code: int | None = None,
request: Request | None = None,
) -> None: ...
def in_uri(self, uri): ...
def in_uri(self, uri: str) -> str: ...
@property
def twotuples(self): ...
def twotuples(self) -> list[tuple[str, Incomplete | str | None]]: ...
@property
def urlencoded(self): ...
def urlencoded(self) -> str: ...
@property
def json(self): ...
def json(self) -> str: ...
@property
def headers(self): ...
def headers(self) -> dict[str, str]: ...
class TokenExpiredError(OAuth2Error):
error: str
@@ -135,7 +137,14 @@ class LoginRequired(OAuth2Error):
error: str
class CustomOAuth2Error(OAuth2Error):
error: Any
def __init__(self, error, *args, **kwargs) -> None: ...
def __init__(
self,
error: str,
description: str | None = None,
uri: str | None = None,
state: Incomplete | None = None,
status_code: int | None = None,
request: Request | None = None,
) -> None: ...
def raise_from_error(error, params: Incomplete | None = None) -> None: ...
def raise_from_error(error: str, params: dict[str, Incomplete] | None = None) -> NoReturn: ...
@@ -1,23 +1,44 @@
from _typeshed import Incomplete
from collections.abc import Callable
from typing import Literal
from .tokens import OAuth2Token
def prepare_grant_uri(
uri,
client_id,
response_type,
redirect_uri: Incomplete | None = None,
scope: Incomplete | None = None,
state: Incomplete | None = None,
uri: str,
client_id: str,
response_type: Literal["code", "token"],
redirect_uri: str | None = None,
scope: str | set[object] | tuple[object] | list[object] | None = None,
state: str | None = None,
code_challenge: str | None = None,
code_challenge_method: str | None = "plain",
**kwargs,
): ...
) -> str: ...
def prepare_token_request(
grant_type, body: str = "", include_client_id: bool = True, code_verifier: str | None = None, **kwargs
): ...
grant_type: str,
body: str = "",
include_client_id: bool = True,
code_verifier: str | None = None,
*,
scope: str | set[object] | tuple[object] | list[object] | None = None,
client_id: str | None = None,
client_secret: str | None = None,
**kwargs,
) -> str: ...
def prepare_token_revocation_request(
url, token, token_type_hint: str = "access_token", callback: Incomplete | None = None, body: str = "", **kwargs
): ...
def parse_authorization_code_response(uri, state: Incomplete | None = None): ...
def parse_implicit_response(uri, state: Incomplete | None = None, scope: Incomplete | None = None): ...
def parse_token_response(body, scope: Incomplete | None = None): ...
def validate_token_parameters(params) -> None: ...
url: str,
token: str,
token_type_hint: Literal["access_token", "refresh_token"] | None = "access_token",
callback: Callable[[Incomplete], Incomplete] | None = None,
body: str = "",
**kwargs,
) -> tuple[str, dict[str, str], str]: ...
def parse_authorization_code_response(uri: str, state: str | None = None) -> dict[str, str]: ...
def parse_implicit_response(
uri: str, state: str | None = None, scope: str | set[object] | tuple[object] | list[object] | None = None
) -> OAuth2Token: ...
def parse_token_response(
body: str | bytes | bytearray, scope: str | set[object] | tuple[object] | list[object] | None = None
) -> OAuth2Token: ...
def validate_token_parameters(params: dict[str, Incomplete]) -> None: ...
@@ -1,5 +1,6 @@
from collections.abc import Mapping
from typing import Any, Literal, TypedDict
from logging import Logger
from typing import Literal, TypedDict
from typing_extensions import NotRequired
from oauthlib.common import Request
@@ -18,7 +19,7 @@ class _AuthorizationCode(TypedDict):
state: NotRequired[str]
nonce: NotRequired[str]
log: Any
log: Logger
class RequestValidator:
def client_authentication_required(self, request: Request, *args, **kwargs) -> bool: ...
@@ -1,60 +1,67 @@
import datetime
from _typeshed import Incomplete
from typing import Any
from collections.abc import Callable
from typing import Literal
class OAuth2Token(dict[Any, Any]):
def __init__(self, params, old_scope: Incomplete | None = None) -> None: ...
from oauthlib.common import Request, _HTTPMethod
from oauthlib.oauth2.rfc6749.request_validator import RequestValidator
class OAuth2Token(dict[str, Incomplete]):
def __init__(
self, params: dict[str, Incomplete], old_scope: str | set[object] | tuple[object] | list[object] | None = None
) -> None: ...
@property
def scope_changed(self): ...
def scope_changed(self) -> bool: ...
@property
def old_scope(self): ...
def old_scope(self) -> str | None: ...
@property
def old_scopes(self): ...
def old_scopes(self) -> list[str]: ...
@property
def scope(self): ...
def scope(self) -> str | None: ...
@property
def scopes(self): ...
def scopes(self) -> list[str]: ...
@property
def missing_scopes(self): ...
def missing_scopes(self) -> list[str]: ...
@property
def additional_scopes(self): ...
def additional_scopes(self) -> list[str]: ...
def prepare_mac_header(
token,
uri,
key,
http_method,
nonce: Incomplete | None = None,
headers: Incomplete | None = None,
body: Incomplete | None = None,
token: str,
uri: str,
key: str | bytes | bytearray,
http_method: _HTTPMethod,
nonce: str | None = None,
headers: dict[str, str] | None = None,
body: str | None = None,
ext: str = "",
hash_algorithm: str = "hmac-sha-1",
issue_time: Incomplete | None = None,
issue_time: datetime.datetime | None = None,
draft: int = 0,
): ...
def prepare_bearer_uri(token, uri): ...
def prepare_bearer_headers(token, headers: Incomplete | None = None): ...
def prepare_bearer_body(token, body: str = ""): ...
def random_token_generator(request, refresh_token: bool = False): ...
def signed_token_generator(private_pem, **kwargs): ...
def get_token_from_header(request): ...
) -> dict[str, str]: ...
def prepare_bearer_uri(token: str, uri: str) -> str: ...
def prepare_bearer_headers(token: str, headers: dict[str, str] | None = None) -> dict[str, str]: ...
def prepare_bearer_body(token: str, body: str = "") -> str: ...
def random_token_generator(request: Request, refresh_token: bool = False) -> str: ...
def signed_token_generator(private_pem: str, **kwargs) -> Callable[[Request], str]: ...
def get_token_from_header(request: Request) -> str | None: ...
class TokenBase:
def __call__(self, request, refresh_token: bool = False) -> None: ...
def validate_request(self, request) -> None: ...
def estimate_type(self, request) -> None: ...
def __call__(self, request: Request, refresh_token: bool = False) -> None: ...
def validate_request(self, request: Request) -> bool: ...
def estimate_type(self, request: Request) -> int: ...
class BearerToken(TokenBase):
request_validator: Any
token_generator: Any
refresh_token_generator: Any
expires_in: Any
request_validator: RequestValidator | None
token_generator: Callable[[Request], str]
refresh_token_generator: Callable[[Request], str]
expires_in: int
def __init__(
self,
request_validator: Incomplete | None = None,
token_generator: Incomplete | None = None,
expires_in: Incomplete | None = None,
refresh_token_generator: Incomplete | None = None,
request_validator: RequestValidator | None = None,
token_generator: Callable[[Request], str] | None = None,
expires_in: int | None = None,
refresh_token_generator: Callable[[Request], str] | None = None,
) -> None: ...
def create_token(self, request, refresh_token: bool = False, **kwargs): ...
def validate_request(self, request): ...
def estimate_type(self, request): ...
def create_token(self, request: Request, refresh_token: bool = False, **kwargs) -> OAuth2Token: ...
def validate_request(self, request: Request) -> bool: ...
def estimate_type(self, request: Request) -> Literal[9, 5, 0]: ...
@@ -1,7 +1,16 @@
def list_to_scope(scope): ...
def scope_to_list(scope): ...
def params_from_uri(uri): ...
def host_from_uri(uri): ...
def escape(u): ...
def generate_age(issue_time): ...
def is_secure_transport(uri): ...
import datetime
from typing import overload
@overload
def list_to_scope(scope: None) -> None: ...
@overload
def list_to_scope(scope: str | set[object] | tuple[object] | list[object]) -> str: ...
@overload
def scope_to_list(scope: None) -> None: ...
@overload
def scope_to_list(scope: str | set[object] | tuple[object] | list[object]) -> list[str]: ...
def params_from_uri(uri: str) -> dict[str, str | list[str]]: ...
def host_from_uri(uri: str) -> tuple[str, str | None]: ...
def escape(u: str) -> str: ...
def generate_age(issue_time: datetime.datetime | datetime.timedelta) -> str: ...
def is_secure_transport(uri: str) -> bool: ...
@@ -0,0 +1,3 @@
from logging import Logger
log: Logger
@@ -0,0 +1 @@
from .device import DeviceClient as DeviceClient
@@ -0,0 +1,40 @@
from _typeshed import Incomplete
from collections.abc import Callable
from oauthlib.oauth2.rfc6749.clients.base import Client, _TokenPlacement
class DeviceClient(Client):
grant_type: str
client_secret: str | None
def __init__(
self,
client_id: str,
*,
client_secret: str | None = None,
default_token_placement: _TokenPlacement = "auth_header",
token_type: str = "Bearer",
access_token: str | None = None,
refresh_token: str | None = None,
mac_key: str | bytes | bytearray | None = None,
mac_algorithm: str | None = None,
token: dict[str, Incomplete] | None = None,
scope: str | set[object] | tuple[object] | list[object] | None = None,
state: str | None = None,
redirect_url: str | None = None,
state_generator: Callable[[], str] = ...,
code_verifier: str | None = None,
code_challenge: str | None = None,
code_challenge_method: str | None = None,
**kwargs,
) -> None: ...
def prepare_request_uri(
self, uri: str, scope: str | set[object] | tuple[object] | list[object] | None = None, **kwargs
) -> str: ...
def prepare_request_body(
self,
device_code: str,
body: str = "",
scope: str | set[object] | tuple[object] | list[object] | None = None,
include_client_id: bool = False,
**kwargs,
) -> str: ...