add return type for oauth server info

pull/419/head
halcy 2025-08-16 23:17:53 +03:00
rodzic baf7dd457c
commit bdc25ade29
7 zmienionych plików z 271 dodań i 28 usunięć

Wyświetl plik

@ -383,6 +383,9 @@ Return types
.. autoclass:: mastodon.return_types.SupportedLocale .. autoclass:: mastodon.return_types.SupportedLocale
:members: :members:
.. autoclass:: mastodon.return_types.OAuthServerInfo
:members:
Deprecated types Deprecated types
================ ================
.. autoclass:: mastodon.return_types.Filter .. autoclass:: mastodon.return_types.Filter

Wyświetl plik

@ -14,7 +14,7 @@ from mastodon.utility import parse_version_string, api_version
from mastodon.internals import Mastodon as Internals from mastodon.internals import Mastodon as Internals
from mastodon.utility import Mastodon as Utility from mastodon.utility import Mastodon as Utility
from typing import List, Optional, Union, Tuple from typing import List, Optional, Union, Tuple
from mastodon.return_types import Application, AttribAccessDict from mastodon.return_types import Application, AttribAccessDict, OAuthServerInfo
from mastodon.compat import PurePath from mastodon.compat import PurePath
class Mastodon(Internals): class Mastodon(Internals):
@ -339,7 +339,7 @@ class Mastodon(Internals):
oauth_url = oauth_info["authorization_endpoint"] + "?" + formatted_params oauth_url = oauth_info["authorization_endpoint"] + "?" + formatted_params
return oauth_url return oauth_url
def oauth_authorization_server_info(self) -> AttribAccessDict: # TODO real type for this def oauth_authorization_server_info(self) -> Union[OAuthServerInfo, AttribAccessDict]:
""" """
Returns the OAuth authorization server information, including the supported grant types. Returns the OAuth authorization server information, including the supported grant types.
This is useful to determine which authentication methods are available on the server, supported scopes, This is useful to determine which authentication methods are available on the server, supported scopes,

Wyświetl plik

@ -6758,6 +6758,131 @@ class SupportedLocale(AttribAccessDict):
_version = "4.2.0" _version = "4.2.0"
class OAuthServerInfo(AttribAccessDict):
"""
Information about the OAuth authorization server.
Example:
.. code-block:: python
# Returns a OAuthServerInfo object
mastodon.oauth_authorization_server_info()
See also (Mastodon API documentation): https://docs.joinmastodon.org/methods/oauth/#authorization-server-metadata
"""
issuer: "str"
"""
The issuer of the OAuth server. Can be used to avoid accidentally getting replies from a wrong server by comparing it against the `iss`field. Not currently used by Mastodon.
Should contain (as text): URL
Version history:
* 4.3.0: added
"""
authorization_endpoint: "str"
"""
The endpoint for authorization requests.
Should contain (as text): URL
Version history:
* 4.3.0: added
"""
token_endpoint: "str"
"""
The endpoint for token requests.
Should contain (as text): URL
Version history:
* 4.3.0: added
"""
revocation_endpoint: "str"
"""
The endpoint for revoking tokens.
Should contain (as text): URL
Version history:
* 4.3.0: added
"""
userinfo_endpoint: "str"
"""
The endpoint for retrieving OAuth user information for the logged in user.
Should contain (as text): URL
Version history:
* 4.4.0: added
"""
scopes_supported: "NonPaginatableList[str]"
"""
List of scopes supported by the OAuth server.
Version history:
* 4.3.0: added
"""
response_types_supported: "NonPaginatableList[str]"
"""
List of response types (i.e. what kind of parameters can the server get back to your callback) supported by the OAuth server.
Version history:
* 4.3.0: added
"""
response_modes_supported: "NonPaginatableList[str]"
"""
List of response modes (i.e. how does the server get callback parameters back to you) supported by the OAuth server.
Version history:
* 4.3.0: added
"""
grant_types_supported: "NonPaginatableList[str]"
"""
List of grant types (i.e. authorization methods) supported by the OAuth server.
Version history:
* 4.3.0: added
"""
token_endpoint_auth_methods_supported: "NonPaginatableList[str]"
"""
List of authentication methods supported by the token endpoint.
Version history:
* 4.3.0: added
"""
code_challenge_methods_supported: "NonPaginatableList[str]"
"""
List of code challenge methods supported by the OAuth server.
Version history:
* 4.3.0: added
"""
service_documentation: "Optional[str]"
"""
URL to the service documentation (e.g. the Mastodon API reference). (optional)
Version history:
* 4.3.0: added
"""
app_registration_endpoint: "Optional[str]"
"""
Endpoint for registering applications. (optional)
Version history:
* 4.3.0: added
"""
_version = "4.4.0"
ENTITY_NAME_MAP = { ENTITY_NAME_MAP = {
"Account": Account, "Account": Account,
"AccountField": AccountField, "AccountField": AccountField,
@ -6870,6 +6995,7 @@ ENTITY_NAME_MAP = {
"Appeal": Appeal, "Appeal": Appeal,
"NotificationRequest": NotificationRequest, "NotificationRequest": NotificationRequest,
"SupportedLocale": SupportedLocale, "SupportedLocale": SupportedLocale,
"OAuthServerInfo": OAuthServerInfo,
} }
__all__ = [ __all__ = [
"Account", "Account",
@ -6983,5 +7109,6 @@ __all__ = [
"Appeal", "Appeal",
"NotificationRequest", "NotificationRequest",
"SupportedLocale", "SupportedLocale",
"OAuthServerInfo",
] ]

Wyświetl plik

@ -184,20 +184,20 @@ if sys.version_info < (3, 9):
Poll, PollOption, Conversation, Tag, TagHistory, CustomEmoji, \ Poll, PollOption, Conversation, Tag, TagHistory, CustomEmoji, \
Application, Relationship, Filter, FilterV2, Notification, Context, \ Application, Relationship, Filter, FilterV2, Notification, Context, \
UserList, MediaAttachment, MediaAttachmentMetadataContainer, MediaAttachmentImageMetadata, MediaAttachmentVideoMetadata, MediaAttachmentAudioMetadata, \ UserList, MediaAttachment, MediaAttachmentMetadataContainer, MediaAttachmentImageMetadata, MediaAttachmentVideoMetadata, MediaAttachmentAudioMetadata, \
MediaAttachmentFocusPoint, MediaAttachmentColors, PreviewCard, PreviewCardAuthor, Search, SearchV2, \ MediaAttachmentFocusPoint, MediaAttachmentColors, PreviewCard, TrendingLinkHistory, PreviewCardAuthor, Search, \
Instance, InstanceConfiguration, InstanceURLs, InstanceV2, InstanceIcon, InstanceConfigurationV2, \ SearchV2, Instance, InstanceConfiguration, InstanceURLs, InstanceV2, InstanceIcon, \
InstanceVapidKey, InstanceURLsV2, InstanceThumbnail, InstanceThumbnailVersions, InstanceStatistics, InstanceUsage, \ InstanceConfigurationV2, InstanceVapidKey, InstanceURLsV2, InstanceThumbnail, InstanceThumbnailVersions, InstanceStatistics, \
InstanceUsageUsers, Rule, InstanceRegistrations, InstanceContact, InstanceAccountConfiguration, InstanceStatusConfiguration, \ InstanceUsage, InstanceUsageUsers, Rule, InstanceRegistrations, InstanceContact, InstanceAccountConfiguration, \
InstanceTranslationConfiguration, InstanceMediaConfiguration, InstancePollConfiguration, Nodeinfo, NodeinfoSoftware, NodeinfoServices, \ InstanceStatusConfiguration, InstanceTranslationConfiguration, InstanceMediaConfiguration, InstancePollConfiguration, Nodeinfo, NodeinfoSoftware, \
NodeinfoUsage, NodeinfoUsageUsers, NodeinfoMetadata, Activity, Report, AdminReport, \ NodeinfoServices, NodeinfoUsage, NodeinfoUsageUsers, NodeinfoMetadata, Activity, Report, \
WebPushSubscription, WebPushSubscriptionAlerts, PushNotification, Preferences, FeaturedTag, Marker, \ AdminReport, WebPushSubscription, WebPushSubscriptionAlerts, PushNotification, Preferences, FeaturedTag, \
Announcement, Reaction, StreamReaction, FamiliarFollowers, AdminAccount, AdminIp, \ Marker, Announcement, Reaction, StreamReaction, FamiliarFollowers, AdminAccount, \
AdminMeasure, AdminMeasureData, AdminDimension, AdminDimensionData, AdminRetention, AdminCohort, \ AdminIp, AdminMeasure, AdminMeasureData, AdminDimension, AdminDimensionData, AdminRetention, \
AdminDomainBlock, AdminCanonicalEmailBlock, AdminDomainAllow, AdminEmailDomainBlock, AdminEmailDomainBlockHistory, AdminIpBlock, \ AdminCohort, AdminDomainBlock, AdminCanonicalEmailBlock, AdminDomainAllow, AdminEmailDomainBlock, AdminEmailDomainBlockHistory, \
DomainBlock, ExtendedDescription, FilterKeyword, FilterStatus, IdentityProof, StatusSource, \ AdminIpBlock, DomainBlock, ExtendedDescription, FilterKeyword, FilterStatus, IdentityProof, \
Suggestion, Translation, AccountCreationError, AccountCreationErrorDetails, AccountCreationErrorDetailsField, NotificationPolicy, \ StatusSource, Suggestion, Translation, AccountCreationError, AccountCreationErrorDetails, AccountCreationErrorDetailsField, \
NotificationPolicySummary, RelationshipSeveranceEvent, GroupedNotificationsResults, PartialAccountWithAvatar, NotificationGroup, AccountWarning, \ NotificationPolicy, NotificationPolicySummary, RelationshipSeveranceEvent, GroupedNotificationsResults, PartialAccountWithAvatar, NotificationGroup, \
UnreadNotificationsCount, Appeal, TrendingLinkHistory, NotificationRequest, SupportedLocale AccountWarning, UnreadNotificationsCount, Appeal, NotificationRequest, SupportedLocale, OAuthServerInfo
if isinstance(t, ForwardRef): if isinstance(t, ForwardRef):
try: try:
t = t._evaluate(globals(), locals(), frozenset()) t = t._evaluate(globals(), locals(), frozenset())

Wyświetl plik

@ -9991,12 +9991,12 @@
"description": "Information about the OAuth authorization server.", "description": "Information about the OAuth authorization server.",
"fields": { "fields": {
"issuer": { "issuer": {
"description": "The issuer of the OAuth server.", "description": "The issuer of the OAuth server. Can be used to avoid accidentally getting replies from a wrong server by comparing it against the `iss`field. Not currently used by Mastodon.",
"enum": null, "enum": null,
"version_history": [["4.3.0", "added"]], "version_history": [["4.3.0", "added"]],
"field_type": "str", "field_type": "str",
"field_subtype": null, "field_subtype": null,
"field_structuretype": null, "field_structuretype": "URL",
"is_optional": false, "is_optional": false,
"is_nullable": false "is_nullable": false
}, },
@ -10006,7 +10006,7 @@
"version_history": [["4.3.0", "added"]], "version_history": [["4.3.0", "added"]],
"field_type": "str", "field_type": "str",
"field_subtype": null, "field_subtype": null,
"field_structuretype": null, "field_structuretype": "URL",
"is_optional": false, "is_optional": false,
"is_nullable": false "is_nullable": false
}, },
@ -10016,7 +10016,7 @@
"version_history": [["4.3.0", "added"]], "version_history": [["4.3.0", "added"]],
"field_type": "str", "field_type": "str",
"field_subtype": null, "field_subtype": null,
"field_structuretype": null, "field_structuretype": "URL",
"is_optional": false, "is_optional": false,
"is_nullable": false "is_nullable": false
}, },
@ -10026,17 +10026,17 @@
"version_history": [["4.3.0", "added"]], "version_history": [["4.3.0", "added"]],
"field_type": "str", "field_type": "str",
"field_subtype": null, "field_subtype": null,
"field_structuretype": null, "field_structuretype": "URL",
"is_optional": false, "is_optional": false,
"is_nullable": false "is_nullable": false
}, },
"userinfo_endpoint": { "userinfo_endpoint": {
"description": "The endpoint for retrieving user information.", "description": "The endpoint for retrieving OAuth user information for the logged in user.",
"enum": null, "enum": null,
"version_history": [["4.3.0", "added"]], "version_history": [["4.4.0", "added"]],
"field_type": "str", "field_type": "str",
"field_subtype": null, "field_subtype": null,
"field_structuretype": null, "field_structuretype": "URL",
"is_optional": false, "is_optional": false,
"is_nullable": false "is_nullable": false
}, },
@ -10051,7 +10051,7 @@
"is_nullable": false "is_nullable": false
}, },
"response_types_supported": { "response_types_supported": {
"description": "List of response types supported by the OAuth server.", "description": "List of response types (i.e. what kind of parameters can the server get back to your callback) supported by the OAuth server.",
"enum": null, "enum": null,
"version_history": [["4.3.0", "added"]], "version_history": [["4.3.0", "added"]],
"field_type": "NonPaginatableList", "field_type": "NonPaginatableList",
@ -10061,7 +10061,7 @@
"is_nullable": false "is_nullable": false
}, },
"response_modes_supported": { "response_modes_supported": {
"description": "List of response modes supported by the OAuth server.", "description": "List of response modes (i.e. how does the server get callback parameters back to you) supported by the OAuth server.",
"enum": null, "enum": null,
"version_history": [["4.3.0", "added"]], "version_history": [["4.3.0", "added"]],
"field_type": "NonPaginatableList", "field_type": "NonPaginatableList",
@ -10071,7 +10071,7 @@
"is_nullable": false "is_nullable": false
}, },
"grant_types_supported": { "grant_types_supported": {
"description": "List of grant types supported by the OAuth server.", "description": "List of grant types (i.e. authorization methods) supported by the OAuth server.",
"enum": null, "enum": null,
"version_history": [["4.3.0", "added"]], "version_history": [["4.3.0", "added"]],
"field_type": "NonPaginatableList", "field_type": "NonPaginatableList",
@ -10101,7 +10101,7 @@
"is_nullable": false "is_nullable": false
}, },
"service_documentation": { "service_documentation": {
"description": "URL to the service documentation.", "description": "URL to the service documentation (e.g. the Mastodon API reference).",
"enum": null, "enum": null,
"version_history": [["4.3.0", "added"]], "version_history": [["4.3.0", "added"]],
"field_type": "str", "field_type": "str",

Wyświetl plik

@ -0,0 +1,96 @@
interactions:
- request:
body: null
headers:
Accept:
- '*/*'
Accept-Encoding:
- gzip, deflate, br
Authorization:
- DUMMY
Connection:
- keep-alive
User-Agent:
- mastodonpy
method: GET
uri: https://mastodon.social/.well-known/oauth-authorization-server
response:
body:
string: '{"issuer": "https://mastodon.social/", "authorization_endpoint": "https://mastodon.social/oauth/authorize",
"token_endpoint": "https://mastodon.social/oauth/token", "revocation_endpoint":
"https://mastodon.social/oauth/revoke", "userinfo_endpoint": "https://mastodon.social/oauth/userinfo",
"scopes_supported": ["read", "profile", "write", "write:accounts", "write:blocks",
"write:bookmarks", "write:conversations", "write:favourites", "write:filters",
"write:follows", "write:lists", "write:media", "write:mutes", "write:notifications",
"write:reports", "write:statuses", "read:accounts", "read:blocks", "read:bookmarks",
"read:favourites", "read:filters", "read:follows", "read:lists", "read:mutes",
"read:notifications", "read:search", "read:statuses", "follow", "push", "admin:read",
"admin:read:accounts", "admin:read:reports", "admin:read:domain_allows", "admin:read:domain_blocks",
"admin:read:ip_blocks", "admin:read:email_domain_blocks", "admin:read:canonical_email_blocks",
"admin:write", "admin:write:accounts", "admin:write:reports", "admin:write:domain_allows",
"admin:write:domain_blocks", "admin:write:ip_blocks", "admin:write:email_domain_blocks",
"admin:write:canonical_email_blocks"], "response_types_supported": ["code"],
"response_modes_supported": ["query", "fragment", "form_post"], "grant_types_supported":
["authorization_code", "client_credentials"], "token_endpoint_auth_methods_supported":
["client_secret_basic", "client_secret_post"], "code_challenge_methods_supported":
["S256"], "service_documentation": "https://docs.joinmastodon.org/", "app_registration_endpoint":
"https://mastodon.social/api/v1/apps"}'
headers:
Connection:
- keep-alive
Date:
- Sat, 16 Aug 2025 20:12:23 GMT
Strict-Transport-Security:
- max-age=31557600
Vary:
- Origin, Accept-Encoding
X-Cache:
- MISS, MISS, MISS
X-Cache-Hits:
- 0, 0, 0
X-Served-By:
- cache-fra-eddf8230103-FRA, cache-fra-eddf8230103-FRA, cache-hel1410030-HEL
X-Timer:
- S1755375143.228865,VS0,VE83
accept-ranges:
- none
alt-svc:
- h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
cache-control:
- max-age=0, private, must-revalidate
content-length:
- '1563'
content-security-policy:
- 'base-uri ''none''; default-src ''none''; frame-ancestors ''none''; font-src
''self'' https://mastodon.social; img-src ''self'' data: blob: https://mastodon.social
https://files.mastodon.social; media-src ''self'' data: https://mastodon.social
https://files.mastodon.social; manifest-src ''self'' https://mastodon.social;
form-action ''self''; child-src ''self'' blob: https://mastodon.social; worker-src
''self'' blob: https://mastodon.social; connect-src ''self'' data: blob: https://mastodon.social
https://files.mastodon.social wss://streaming.mastodon.social; script-src
''self'' https://mastodon.social ''wasm-unsafe-eval''; frame-src ''self''
https:; style-src ''self'' https://mastodon.social ''nonce-5yH82vADHKjnBUGAG/8YpQ=='''
content-type:
- application/json; charset=utf-8
etag:
- W/"6039ea331b50e2b000b155f90aaead96"
referrer-policy:
- same-origin
transfer-encoding:
- chunked
via:
- 1.1 varnish, 1.1 varnish, 1.1 varnish
x-content-type-options:
- nosniff
x-frame-options:
- DENY
x-request-id:
- 8bc5e34e596581252d2d294d61a929c5
x-runtime:
- '0.005838'
x-xss-protection:
- '0'
status:
code: 200
message: OK
version: 1

Wyświetl plik

@ -1731,3 +1731,20 @@ def test_entity_supportedlocale(mastodon_base, mastodon_admin):
if sys.version_info >= (3, 9): if sys.version_info >= (3, 9):
assert real_issubclass(type(result), SupportedLocale), str(type(result)) + ' is not a subclass of SupportedLocale after to_json/from_json' assert real_issubclass(type(result), SupportedLocale), str(type(result)) + ' is not a subclass of SupportedLocale after to_json/from_json'
@pytest.mark.vcr(
filter_query_parameters=[('access_token', 'DUMMY'), ('client_id', 'DUMMY'), ('client_secret', 'DUMMY')],
filter_post_data_parameters=[('access_token', 'DUMMY'), ('client_id', 'DUMMY'), ('client_secret', 'DUMMY')],
filter_headers=[('Authorization', 'DUMMY')],
before_record_request=vcr_filter,
before_record_response=token_scrubber,
match_on=['method', 'uri'],
cassette_library_dir='tests/cassettes_entity_tests'
)
def test_entity_oauthserverinfo(mastodon_base, mastodon_admin):
mastodon = mastodon_base
result = mastodon.oauth_authorization_server_info()
assert real_issubclass(type(result), OAuthServerInfo), str(type(result)) + ' is not a subclass of OAuthServerInfo'
result = Entity.from_json(result.to_json())
if sys.version_info >= (3, 9):
assert real_issubclass(type(result), OAuthServerInfo), str(type(result)) + ' is not a subclass of OAuthServerInfo after to_json/from_json'