diff --git a/stubs/oauthlib/oauthlib/oauth2/__init__.pyi b/stubs/oauthlib/oauthlib/oauth2/__init__.pyi index c56170abc..8d5cb1a61 100644 --- a/stubs/oauthlib/oauthlib/oauth2/__init__.pyi +++ b/stubs/oauthlib/oauthlib/oauth2/__init__.pyi @@ -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 diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc6749/__init__.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc6749/__init__.pyi index efc812cce..f168fb8a2 100644 --- a/stubs/oauthlib/oauthlib/oauth2/rfc6749/__init__.pyi +++ b/stubs/oauthlib/oauthlib/oauth2/rfc6749/__init__.pyi @@ -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 diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc6749/clients/base.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc6749/clients/base.pyi index 126332226..dc5ae3608 100644 --- a/stubs/oauthlib/oauthlib/oauth2/rfc6749/clients/base.pyi +++ b/stubs/oauthlib/oauthlib/oauth2/rfc6749/clients/base.pyi @@ -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: ... diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc6749/errors.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc6749/errors.pyi index 3eb2db2c0..a10c600c2 100644 --- a/stubs/oauthlib/oauthlib/oauth2/rfc6749/errors.pyi +++ b/stubs/oauthlib/oauthlib/oauth2/rfc6749/errors.pyi @@ -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: ... diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc6749/parameters.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc6749/parameters.pyi index c0dd38f9a..78420ebe0 100644 --- a/stubs/oauthlib/oauthlib/oauth2/rfc6749/parameters.pyi +++ b/stubs/oauthlib/oauthlib/oauth2/rfc6749/parameters.pyi @@ -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: ... diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc6749/request_validator.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc6749/request_validator.pyi index 6c823b7fa..a057ee5aa 100644 --- a/stubs/oauthlib/oauthlib/oauth2/rfc6749/request_validator.pyi +++ b/stubs/oauthlib/oauthlib/oauth2/rfc6749/request_validator.pyi @@ -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: ... diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc6749/tokens.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc6749/tokens.pyi index 9ef160a13..e11777274 100644 --- a/stubs/oauthlib/oauthlib/oauth2/rfc6749/tokens.pyi +++ b/stubs/oauthlib/oauthlib/oauth2/rfc6749/tokens.pyi @@ -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]: ... diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc6749/utils.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc6749/utils.pyi index dc660b791..be3fff47b 100644 --- a/stubs/oauthlib/oauthlib/oauth2/rfc6749/utils.pyi +++ b/stubs/oauthlib/oauthlib/oauth2/rfc6749/utils.pyi @@ -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: ... diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc8628/__init__.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc8628/__init__.pyi new file mode 100644 index 000000000..cb35af911 --- /dev/null +++ b/stubs/oauthlib/oauthlib/oauth2/rfc8628/__init__.pyi @@ -0,0 +1,3 @@ +from logging import Logger + +log: Logger diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc8628/clients/__init__.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc8628/clients/__init__.pyi new file mode 100644 index 000000000..e03f44a72 --- /dev/null +++ b/stubs/oauthlib/oauthlib/oauth2/rfc8628/clients/__init__.pyi @@ -0,0 +1 @@ +from .device import DeviceClient as DeviceClient diff --git a/stubs/oauthlib/oauthlib/oauth2/rfc8628/clients/device.pyi b/stubs/oauthlib/oauthlib/oauth2/rfc8628/clients/device.pyi new file mode 100644 index 000000000..e79192581 --- /dev/null +++ b/stubs/oauthlib/oauthlib/oauth2/rfc8628/clients/device.pyi @@ -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: ...