kopia lustrzana https://github.com/halcy/Mastodon.py
Add Terms of Service
rodzic
1e4293ae3e
commit
02d38084ea
|
@ -2,8 +2,9 @@ A note on versioning: This librarys major version will grow with the APIs
|
||||||
version number. Breaking changes will be indicated by a change in the minor
|
version number. Breaking changes will be indicated by a change in the minor
|
||||||
(or major) version number, and will generally be avoided.
|
(or major) version number, and will generally be avoided.
|
||||||
|
|
||||||
v2.1.0 (IN PROGRESS)
|
v2.1.0
|
||||||
--------------------
|
------
|
||||||
|
* Bumped support level to 4.4.3
|
||||||
* Fixed to_json breaking on python 3.14 (Thanks @limburgher for the report)
|
* Fixed to_json breaking on python 3.14 (Thanks @limburgher for the report)
|
||||||
* Replaced pytest-vcr (deprecated) with pytest-recording (Thanks @CyberTailor)
|
* Replaced pytest-vcr (deprecated) with pytest-recording (Thanks @CyberTailor)
|
||||||
* Improved timeline documentation (Thanks @adamse)
|
* Improved timeline documentation (Thanks @adamse)
|
||||||
|
@ -27,6 +28,7 @@ v2.1.0 (IN PROGRESS)
|
||||||
* Added `date_of_birth` parameter to `create_account`.
|
* Added `date_of_birth` parameter to `create_account`.
|
||||||
* Added `account_endorse` and `account_unendorse` methods (replacing "pin" methods)
|
* Added `account_endorse` and `account_unendorse` methods (replacing "pin" methods)
|
||||||
* Added `tag_feature` and `tag_unfeature` methods (replacing previous featured tag api)
|
* Added `tag_feature` and `tag_unfeature` methods (replacing previous featured tag api)
|
||||||
|
* Added `instance_terms_of_service` method.
|
||||||
|
|
||||||
v2.0.1
|
v2.0.1
|
||||||
------
|
------
|
||||||
|
|
2
TODO.md
2
TODO.md
|
@ -7,7 +7,7 @@ Refer to mastodon changelog and API docs for details when implementing, add or m
|
||||||
* [x] Fix all the issues
|
* [x] Fix all the issues
|
||||||
* [x] New endpoints for endorsements, replacing "pin" api, which is now deprecated: accounts_endorsements(id), account_endorse(id), account_unendorse(id)
|
* [x] New endpoints for endorsements, replacing "pin" api, which is now deprecated: accounts_endorsements(id), account_endorse(id), account_unendorse(id)
|
||||||
* [x] New endpoints for featured tags: tag_feature(name), tag_unfeature(name)
|
* [x] New endpoints for featured tags: tag_feature(name), tag_unfeature(name)
|
||||||
* [ ] New endpoint: instance_terms, with or without date (format?)
|
* [x] New endpoint: instance_terms, with or without date (format?)
|
||||||
* [x] Some oauth stuff (userinfo? capability discovery? see issue for that)
|
* [x] Some oauth stuff (userinfo? capability discovery? see issue for that)
|
||||||
* [x] status_delete now has a media delete param
|
* [x] status_delete now has a media delete param
|
||||||
* [x] push_subscribe now has a "standard" parameter to switch between two versions. may also need to update crypto impls?
|
* [x] push_subscribe now has a "standard" parameter to switch between two versions. may also need to update crypto impls?
|
||||||
|
|
|
@ -398,6 +398,9 @@ Return types
|
||||||
.. autoclass:: mastodon.return_types.OAuthUserInfo
|
.. autoclass:: mastodon.return_types.OAuthUserInfo
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: mastodon.return_types.TermsOfService
|
||||||
|
:members:
|
||||||
|
|
||||||
Deprecated types
|
Deprecated types
|
||||||
================
|
================
|
||||||
.. autoclass:: mastodon.return_types.Filter
|
.. autoclass:: mastodon.return_types.Filter
|
||||||
|
|
|
@ -19,6 +19,7 @@ current instance as well as data from the instance-wide profile directory.
|
||||||
.. automethod:: Mastodon.instance_nodeinfo
|
.. automethod:: Mastodon.instance_nodeinfo
|
||||||
.. automethod:: Mastodon.instance_rules
|
.. automethod:: Mastodon.instance_rules
|
||||||
.. automethod:: Mastodon.instance_extended_description
|
.. automethod:: Mastodon.instance_extended_description
|
||||||
|
.. automethod:: Mastodon.instance_terms_of_service
|
||||||
|
|
||||||
Profile directory
|
Profile directory
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
|
@ -4,10 +4,12 @@ from mastodon.utility import api_version
|
||||||
from mastodon.compat import urlparse
|
from mastodon.compat import urlparse
|
||||||
|
|
||||||
from mastodon.internals import Mastodon as Internals
|
from mastodon.internals import Mastodon as Internals
|
||||||
from mastodon.return_types import Instance, InstanceV2, NonPaginatableList, Activity, Nodeinfo, AttribAccessDict, Rule, Announcement, CustomEmoji, Account, IdType, ExtendedDescription, DomainBlock, SupportedLocale
|
from mastodon.return_types import Instance, InstanceV2, NonPaginatableList, Activity, Nodeinfo, AttribAccessDict, Rule, Announcement, CustomEmoji, Account, IdType, ExtendedDescription, DomainBlock, SupportedLocale, TermsOfService
|
||||||
|
|
||||||
from typing import Union, Optional, Dict, List
|
from typing import Union, Optional, Dict, List
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
class Mastodon(Internals):
|
class Mastodon(Internals):
|
||||||
###
|
###
|
||||||
# Reading data: Instances
|
# Reading data: Instances
|
||||||
|
@ -127,6 +129,22 @@ class Mastodon(Internals):
|
||||||
"""
|
"""
|
||||||
return self.__api_request('GET', '/api/v1/instance/rules')
|
return self.__api_request('GET', '/api/v1/instance/rules')
|
||||||
|
|
||||||
|
@api_version("4.4.0", "4.4.0")
|
||||||
|
def instance_terms_of_service(self, date: Optional[datetime.date] = None) -> TermsOfService:
|
||||||
|
"""
|
||||||
|
Retrieve the instance's terms of service.
|
||||||
|
|
||||||
|
If `date` is specified, it will return the terms of service that were put in effect on that date.
|
||||||
|
|
||||||
|
NB: This is not (currently?) a range lookup, you can only get the terms of service for a specific, exact date.
|
||||||
|
"""
|
||||||
|
if date is not None and not isinstance(date, datetime.date):
|
||||||
|
raise MastodonIllegalArgumentError("Date parameter should be a datetime.date object")
|
||||||
|
if date is not None:
|
||||||
|
date = date.strftime("%Y-%m-%d")
|
||||||
|
params = self.__generate_params(locals())
|
||||||
|
return self.__api_request('GET', '/api/v1/instance/terms_of_service', params)
|
||||||
|
|
||||||
###
|
###
|
||||||
# Reading data: Directory
|
# Reading data: Directory
|
||||||
###
|
###
|
||||||
|
|
|
@ -7178,6 +7178,55 @@ class OAuthUserInfo(AttribAccessDict):
|
||||||
|
|
||||||
_version = "4.4.0"
|
_version = "4.4.0"
|
||||||
|
|
||||||
|
class TermsOfService(AttribAccessDict):
|
||||||
|
"""
|
||||||
|
The terms of service for the instance.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
# Returns a TermsOfService object
|
||||||
|
mastodon.instance_terms_of_service()
|
||||||
|
|
||||||
|
See also (Mastodon API documentation): https://docs.joinmastodon.org/methods/instance/#terms_of_service
|
||||||
|
"""
|
||||||
|
|
||||||
|
effective_date: "datetime"
|
||||||
|
"""
|
||||||
|
The date when the terms of service became effective.
|
||||||
|
|
||||||
|
Version history:
|
||||||
|
* 4.4.0: added
|
||||||
|
"""
|
||||||
|
|
||||||
|
effective: "bool"
|
||||||
|
"""
|
||||||
|
Whether the terms of service are currently in effect.
|
||||||
|
|
||||||
|
Version history:
|
||||||
|
* 4.4.0: added
|
||||||
|
"""
|
||||||
|
|
||||||
|
content: "str"
|
||||||
|
"""
|
||||||
|
The contents of the terms of service.
|
||||||
|
Should contain (as text): HTML
|
||||||
|
|
||||||
|
Version history:
|
||||||
|
* 4.4.0: added
|
||||||
|
"""
|
||||||
|
|
||||||
|
succeeded_by: "Optional[datetime]"
|
||||||
|
"""
|
||||||
|
If there are newer terms of service, their effective date. (optional)
|
||||||
|
|
||||||
|
Version history:
|
||||||
|
* 4.4.0: added
|
||||||
|
"""
|
||||||
|
|
||||||
|
_version = "4.4.0"
|
||||||
|
|
||||||
ENTITY_NAME_MAP = {
|
ENTITY_NAME_MAP = {
|
||||||
"Account": Account,
|
"Account": Account,
|
||||||
"AccountField": AccountField,
|
"AccountField": AccountField,
|
||||||
|
@ -7295,6 +7344,7 @@ ENTITY_NAME_MAP = {
|
||||||
"SupportedLocale": SupportedLocale,
|
"SupportedLocale": SupportedLocale,
|
||||||
"OAuthServerInfo": OAuthServerInfo,
|
"OAuthServerInfo": OAuthServerInfo,
|
||||||
"OAuthUserInfo": OAuthUserInfo,
|
"OAuthUserInfo": OAuthUserInfo,
|
||||||
|
"TermsOfService": TermsOfService,
|
||||||
}
|
}
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"Account",
|
"Account",
|
||||||
|
@ -7413,5 +7463,6 @@ __all__ = [
|
||||||
"SupportedLocale",
|
"SupportedLocale",
|
||||||
"OAuthServerInfo",
|
"OAuthServerInfo",
|
||||||
"OAuthUserInfo",
|
"OAuthUserInfo",
|
||||||
|
"TermsOfService",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -209,7 +209,7 @@ if sys.version_info < (3, 9):
|
||||||
FilterKeyword, FilterStatus, IdentityProof, StatusSource, Suggestion, Translation, \
|
FilterKeyword, FilterStatus, IdentityProof, StatusSource, Suggestion, Translation, \
|
||||||
AccountCreationError, AccountCreationErrorDetails, AccountCreationErrorDetailsField, NotificationPolicy, NotificationPolicySummary, RelationshipSeveranceEvent, \
|
AccountCreationError, AccountCreationErrorDetails, AccountCreationErrorDetailsField, NotificationPolicy, NotificationPolicySummary, RelationshipSeveranceEvent, \
|
||||||
GroupedNotificationsResults, PartialAccountWithAvatar, NotificationGroup, AccountWarning, UnreadNotificationsCount, Appeal, \
|
GroupedNotificationsResults, PartialAccountWithAvatar, NotificationGroup, AccountWarning, UnreadNotificationsCount, Appeal, \
|
||||||
NotificationRequest, SupportedLocale, OAuthServerInfo, OAuthUserInfo
|
NotificationRequest, SupportedLocale, OAuthServerInfo, OAuthUserInfo, TermsOfService
|
||||||
if isinstance(t, ForwardRef):
|
if isinstance(t, ForwardRef):
|
||||||
try:
|
try:
|
||||||
t = t._evaluate(globals(), locals(), frozenset())
|
t = t._evaluate(globals(), locals(), frozenset())
|
||||||
|
|
|
@ -80,17 +80,8 @@
|
||||||
"# Here you can test things manually during development\n",
|
"# Here you can test things manually during development\n",
|
||||||
"# results = {}\n",
|
"# results = {}\n",
|
||||||
"import pickle as pkl\n",
|
"import pickle as pkl\n",
|
||||||
"mastodon_soc.instance_v1()"
|
"#mastodon_soc.oauth_authorization_server_info()\n",
|
||||||
]
|
"#mastodon_ico_admin.instance_terms_of_service(datetime(2025, 8, 17))"
|
||||||
},
|
|
||||||
{
|
|
||||||
"cell_type": "code",
|
|
||||||
"execution_count": null,
|
|
||||||
"metadata": {},
|
|
||||||
"outputs": [],
|
|
||||||
"source": [
|
|
||||||
"print(json_data)\n",
|
|
||||||
"Entity.from_json(json_data)"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -101,6 +92,15 @@
|
||||||
"### Entity verification"
|
"### Entity verification"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"results = {}"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
|
@ -108,8 +108,8 @@
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"entities = json.load(open(\"return_types.json\", \"r\"))\n",
|
"entities = json.load(open(\"return_types.json\", \"r\"))\n",
|
||||||
"# update_only = \"RuleTranslation\"\n",
|
"update_only = \"TermsOfService\"\n",
|
||||||
"update_only = None\n",
|
"# update_only = None\n",
|
||||||
"\n",
|
"\n",
|
||||||
"if update_only is None:\n",
|
"if update_only is None:\n",
|
||||||
" results = {}\n",
|
" results = {}\n",
|
||||||
|
@ -207,15 +207,6 @@
|
||||||
" print(entity_name + \": field\", field, \"documented but missing from all retrieved entities\")\n"
|
" print(entity_name + \": field\", field, \"documented but missing from all retrieved entities\")\n"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"cell_type": "code",
|
|
||||||
"execution_count": null,
|
|
||||||
"metadata": {},
|
|
||||||
"outputs": [],
|
|
||||||
"source": [
|
|
||||||
"mastodon_soc.featured_tags()[0]"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"attachments": {},
|
"attachments": {},
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
|
|
|
@ -10552,5 +10552,58 @@
|
||||||
"is_nullable": false
|
"is_nullable": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Instance Terms of Service",
|
||||||
|
"python_name": "TermsOfService",
|
||||||
|
"func_call": "mastodon.instance_terms_of_service()",
|
||||||
|
"func_call_real": null,
|
||||||
|
"func_call_additional": "mastodon.instance_terms_of_service(datetime(2025, 8, 17))",
|
||||||
|
"func_alternate_acc": true,
|
||||||
|
"manual_update": false,
|
||||||
|
"masto_doc_link": "https://docs.joinmastodon.org/methods/instance/#terms_of_service",
|
||||||
|
"description": "The terms of service for the instance.",
|
||||||
|
"fields": {
|
||||||
|
"effective_date": {
|
||||||
|
"description": "The date when the terms of service became effective.",
|
||||||
|
"enum": null,
|
||||||
|
"version_history": [["4.4.0", "added"]],
|
||||||
|
"field_type": "datetime",
|
||||||
|
"field_subtype": null,
|
||||||
|
"field_structuretype": null,
|
||||||
|
"is_optional": false,
|
||||||
|
"is_nullable": false
|
||||||
|
},
|
||||||
|
"effective": {
|
||||||
|
"description": "Whether the terms of service are currently in effect.",
|
||||||
|
"enum": null,
|
||||||
|
"version_history": [["4.4.0", "added"]],
|
||||||
|
"field_type": "bool",
|
||||||
|
"field_subtype": null,
|
||||||
|
"field_structuretype": null,
|
||||||
|
"is_optional": false,
|
||||||
|
"is_nullable": false
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"description": "The contents of the terms of service.",
|
||||||
|
"enum": null,
|
||||||
|
"version_history": [["4.4.0", "added"]],
|
||||||
|
"field_type": "str",
|
||||||
|
"field_subtype": null,
|
||||||
|
"field_structuretype": "HTML",
|
||||||
|
"is_optional": false,
|
||||||
|
"is_nullable": false
|
||||||
|
},
|
||||||
|
"succeeded_by": {
|
||||||
|
"description": "If there are newer terms of service, their effective date.",
|
||||||
|
"enum": null,
|
||||||
|
"version_history": [["4.4.0", "added"]],
|
||||||
|
"field_type": "datetime",
|
||||||
|
"field_subtype": null,
|
||||||
|
"field_structuretype": null,
|
||||||
|
"is_optional": true,
|
||||||
|
"is_nullable": false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -0,0 +1,312 @@
|
||||||
|
interactions:
|
||||||
|
- request:
|
||||||
|
body: null
|
||||||
|
headers:
|
||||||
|
Accept:
|
||||||
|
- '*/*'
|
||||||
|
Accept-Encoding:
|
||||||
|
- gzip, deflate, br
|
||||||
|
Authorization:
|
||||||
|
- DUMMY
|
||||||
|
Connection:
|
||||||
|
- keep-alive
|
||||||
|
User-Agent:
|
||||||
|
- mastodonpy
|
||||||
|
method: GET
|
||||||
|
uri: https://icosahedron.website/api/v1/instance/terms_of_service
|
||||||
|
response:
|
||||||
|
body:
|
||||||
|
string: '{"effective_date": "2025-08-17", "effective": false, "content": "<h1>What
|
||||||
|
information do we collect?</h1>\n\n<p>We collect information from you when
|
||||||
|
you register on our site and gather data when you participate in the forum
|
||||||
|
by reading, writing, and evaluating the content shared here.</p>\n\n<p>When
|
||||||
|
registering on our site, you may be asked to enter your name and e-mail address.
|
||||||
|
You may, however, visit our site without registering. Your e-mail address
|
||||||
|
will be verified by an email containing a unique link. If that link is visited,
|
||||||
|
we know that you control the e-mail address.</p>\n\n<p>When registered and
|
||||||
|
posting, we record the IP address that the post originated from. We also may
|
||||||
|
retain server logs which include the IP address of every request to our server
|
||||||
|
and diagnostic information for errors.\nWhat do we use your information for?</p>\n\n<p>Any
|
||||||
|
of the information we collect from you may be used in one of the following
|
||||||
|
ways:</p>\n\n<ul>\n<li>To function as a social media website - we display
|
||||||
|
and share the posts that you make, associated with a pseudonym of your choosing.
|
||||||
|
We do not require you to provide your legal name to use this website.</li>\n<li>To
|
||||||
|
personalize your experience - your information helps us to better respond
|
||||||
|
to your individual needs.</li>\n<li>To improve service - your information
|
||||||
|
helps us to more effectively respond to your support needs and to fix operational
|
||||||
|
problems.</li>\n<li>To send periodic emails - The email address you provide
|
||||||
|
may be used to send you information, notifications that you request about
|
||||||
|
changes to topics or in response to your user name, respond to inquiries,
|
||||||
|
and/or other requests or questions. You can opt out of automatic e-mails by
|
||||||
|
indicating that you do not with to receive notification e-mails in the website
|
||||||
|
settings.</li>\n<li>To prevent abuse - your information helps us to moderate
|
||||||
|
the content on this website and to prevent use of the website that contravenes
|
||||||
|
our rules.</li>\n</ul>\n\n<h1>How do we protect your information?</h1>\n\n<p>We
|
||||||
|
implement a variety of security measures to maintain the safety of your personal
|
||||||
|
information when you enter, submit, or access your personal information. Communication
|
||||||
|
is encrypted using modern cryptographic standards (Using SSL with a certificate
|
||||||
|
signed by LetsEncrypt). Full access to data is restricted to people who unavoidably
|
||||||
|
require such access to perform maintenance operations, such as the administrator
|
||||||
|
(located in Estonia).</p>\n\n<p>All data we collect is stored on a dedicated
|
||||||
|
server in Germany, operated by Hetzner Online GmbH. A daily backup copy of
|
||||||
|
all data excluding log files is stored on a computer operated by the web site
|
||||||
|
administrator on private premises in Estonia. A continuous streaming backup
|
||||||
|
is additonally stored on a second server operated by Hetzner Online GmbH,
|
||||||
|
located in Finland.</p>\n\n<h1>What is your data retention policy?</h1>\n\n<p>We
|
||||||
|
will make a good faith effort to:</p>\n\n<ul>\n<li>Retain server logs containing
|
||||||
|
the IP address of all requests to this server no more than 30 days.</li>\n<li>Retain
|
||||||
|
the IP addresses associated with registered users and their posts no more
|
||||||
|
than 5 years.</li>\n</ul>\n\n<h1>Data portability</h1>\n\n<p>You can export
|
||||||
|
most of the data we collect about you using site features. You can contact
|
||||||
|
us via e-mail to get exports of your data beyond that.</p>\n\n<h1>Do we use
|
||||||
|
cookies?</h1>\n\n<p>Yes. Cookies are small files that a site or its service
|
||||||
|
provider transfers to your computer's hard drive through your Web browser
|
||||||
|
(if you allow). These cookies enable the site to recognize your browser and,
|
||||||
|
if you have a registered account, associate it with your registered account.
|
||||||
|
We use cookies to understand and save your preferences for future visits and
|
||||||
|
compile aggregate data about site traffic and site interaction so that we
|
||||||
|
can offer better site experiences and tools in the future.</p>\n\n<h1>Do we
|
||||||
|
disclose any information to outside parties?</h1>\n\n<p>We do not sell, trade,
|
||||||
|
or otherwise transfer to outside parties your personally identifiable information.
|
||||||
|
This does not include trusted third parties who assist us in operating our
|
||||||
|
site, so long as those parties agree to keep this information confidential.
|
||||||
|
We may also release your information when we believe release is appropriate
|
||||||
|
to comply with the law, enforce our site policies, or protect ours or others
|
||||||
|
rights, property, or safety. Non-personally identifiable visitor and aggregate
|
||||||
|
information may be provided to other parties to help improve the website.</p>\n\n<p>We
|
||||||
|
do transfer some of your data, such as posts you make and the pseudonym with
|
||||||
|
which you have registered on this website, to other servers in the ActivityPub
|
||||||
|
and OStatus networks. We also store and display such data that we receive
|
||||||
|
from other servers on the network. We do this because it is neccesary to do
|
||||||
|
it for this website to provide the services of a distributed social network.
|
||||||
|
You can opt out of this by only allowing people from your local server to
|
||||||
|
follow you. If you use web notifications, we share your data (in an encrypted
|
||||||
|
form) with your web notification provider. You can opt out of this by not
|
||||||
|
using web notifications.</p>\n\n<p>This website is hosted on a server located
|
||||||
|
in a Hetzner datacenter in Germany. While we do not explicitly share any information
|
||||||
|
with them and they do not regularly process any of your data, they may as
|
||||||
|
part of maintenance operations or to comply with the law gain access to that
|
||||||
|
data. You can review their privacy policy on the Hetzner website.\nThird party
|
||||||
|
links</p>\n\n<p>Occasionally, we or our users may include or offer third party
|
||||||
|
products or services on our site. These third party sites have separate and
|
||||||
|
independent privacy policies. We therefore have no responsibility or liability
|
||||||
|
for the content and activities of these linked sites. Nonetheless, we seek
|
||||||
|
to protect the integrity of our site and welcome any feedback about these
|
||||||
|
sites.\nAge restrictions</p>\n\n<p>Our site and services are all directed
|
||||||
|
to people who are at least 16 years old. If you are under 16, you must get
|
||||||
|
parental consent to be allowed to use this website. If you are below the age
|
||||||
|
of 13, you may not use this website.</p>\n\n<h1>Online Privacy Policy Only</h1>\n\n<p>This
|
||||||
|
online privacy policy applies only to information collected through our site
|
||||||
|
and not to information collected offline.</p>\n\n<h1>Contact</h1>\n\n<p>All
|
||||||
|
inquiries and requests (for export, correction, deletion or other things)
|
||||||
|
regarding the use of your data on this website should be directed to lorenzd+icosa@gmail.com.</p>\n\n<h1>Your
|
||||||
|
Consent</h1>\n\n<p>By using our site, you consent to our web site privacy
|
||||||
|
policy and to us using your data in the ways described here.\nChanges to our
|
||||||
|
Privacy Policy</p>\n\n<p>If we decide to change our privacy policy, we will
|
||||||
|
post those changes on this page.</p>\n\n<p>This document is CC-BY-SA. It was
|
||||||
|
originally adapted from the Discourse privacy policy.</p>\n", "succeeded_by":
|
||||||
|
"2025-08-27"}'
|
||||||
|
headers:
|
||||||
|
Connection:
|
||||||
|
- keep-alive
|
||||||
|
Content-Type:
|
||||||
|
- application/json; charset=utf-8
|
||||||
|
Date:
|
||||||
|
- Sun, 17 Aug 2025 20:41:50 GMT
|
||||||
|
Transfer-Encoding:
|
||||||
|
- chunked
|
||||||
|
Vary:
|
||||||
|
- Accept-Encoding
|
||||||
|
- Accept, Origin
|
||||||
|
X-Cached:
|
||||||
|
- HIT
|
||||||
|
cache-control:
|
||||||
|
- max-age=300, public, stale-while-revalidate=30, stale-if-error=86400
|
||||||
|
content-length:
|
||||||
|
- '7695'
|
||||||
|
content-security-policy:
|
||||||
|
- default-src 'none'; frame-ancestors 'none'; form-action 'none'
|
||||||
|
etag:
|
||||||
|
- W/"35a393f5110a365869e8429ce7155fb6"
|
||||||
|
referrer-policy:
|
||||||
|
- same-origin
|
||||||
|
server:
|
||||||
|
- Mastodon
|
||||||
|
strict-transport-security:
|
||||||
|
- max-age=63072000; includeSubDomains
|
||||||
|
- max-age=31536000
|
||||||
|
x-content-type-options:
|
||||||
|
- nosniff
|
||||||
|
x-frame-options:
|
||||||
|
- DENY
|
||||||
|
x-ratelimit-limit:
|
||||||
|
- '300'
|
||||||
|
x-ratelimit-remaining:
|
||||||
|
- '298'
|
||||||
|
x-ratelimit-reset:
|
||||||
|
- '2025-08-17T20:40:00.693662Z'
|
||||||
|
x-request-id:
|
||||||
|
- a98c4cfe-c91f-472c-baec-ef6d2a120521
|
||||||
|
x-runtime:
|
||||||
|
- '0.013353'
|
||||||
|
x-xss-protection:
|
||||||
|
- '0'
|
||||||
|
status:
|
||||||
|
code: 200
|
||||||
|
message: OK
|
||||||
|
- request:
|
||||||
|
body: null
|
||||||
|
headers:
|
||||||
|
Accept:
|
||||||
|
- '*/*'
|
||||||
|
Accept-Encoding:
|
||||||
|
- gzip, deflate, br
|
||||||
|
Authorization:
|
||||||
|
- DUMMY
|
||||||
|
Connection:
|
||||||
|
- keep-alive
|
||||||
|
User-Agent:
|
||||||
|
- mastodonpy
|
||||||
|
method: GET
|
||||||
|
uri: https://icosahedron.website/api/v1/instance/terms_of_service?date=2025-08-17
|
||||||
|
response:
|
||||||
|
body:
|
||||||
|
string: '{"effective_date": "2025-08-17", "effective": false, "content": "<h1>What
|
||||||
|
information do we collect?</h1>\n\n<p>We collect information from you when
|
||||||
|
you register on our site and gather data when you participate in the forum
|
||||||
|
by reading, writing, and evaluating the content shared here.</p>\n\n<p>When
|
||||||
|
registering on our site, you may be asked to enter your name and e-mail address.
|
||||||
|
You may, however, visit our site without registering. Your e-mail address
|
||||||
|
will be verified by an email containing a unique link. If that link is visited,
|
||||||
|
we know that you control the e-mail address.</p>\n\n<p>When registered and
|
||||||
|
posting, we record the IP address that the post originated from. We also may
|
||||||
|
retain server logs which include the IP address of every request to our server
|
||||||
|
and diagnostic information for errors.\nWhat do we use your information for?</p>\n\n<p>Any
|
||||||
|
of the information we collect from you may be used in one of the following
|
||||||
|
ways:</p>\n\n<ul>\n<li>To function as a social media website - we display
|
||||||
|
and share the posts that you make, associated with a pseudonym of your choosing.
|
||||||
|
We do not require you to provide your legal name to use this website.</li>\n<li>To
|
||||||
|
personalize your experience - your information helps us to better respond
|
||||||
|
to your individual needs.</li>\n<li>To improve service - your information
|
||||||
|
helps us to more effectively respond to your support needs and to fix operational
|
||||||
|
problems.</li>\n<li>To send periodic emails - The email address you provide
|
||||||
|
may be used to send you information, notifications that you request about
|
||||||
|
changes to topics or in response to your user name, respond to inquiries,
|
||||||
|
and/or other requests or questions. You can opt out of automatic e-mails by
|
||||||
|
indicating that you do not with to receive notification e-mails in the website
|
||||||
|
settings.</li>\n<li>To prevent abuse - your information helps us to moderate
|
||||||
|
the content on this website and to prevent use of the website that contravenes
|
||||||
|
our rules.</li>\n</ul>\n\n<h1>How do we protect your information?</h1>\n\n<p>We
|
||||||
|
implement a variety of security measures to maintain the safety of your personal
|
||||||
|
information when you enter, submit, or access your personal information. Communication
|
||||||
|
is encrypted using modern cryptographic standards (Using SSL with a certificate
|
||||||
|
signed by LetsEncrypt). Full access to data is restricted to people who unavoidably
|
||||||
|
require such access to perform maintenance operations, such as the administrator
|
||||||
|
(located in Estonia).</p>\n\n<p>All data we collect is stored on a dedicated
|
||||||
|
server in Germany, operated by Hetzner Online GmbH. A daily backup copy of
|
||||||
|
all data excluding log files is stored on a computer operated by the web site
|
||||||
|
administrator on private premises in Estonia. A continuous streaming backup
|
||||||
|
is additonally stored on a second server operated by Hetzner Online GmbH,
|
||||||
|
located in Finland.</p>\n\n<h1>What is your data retention policy?</h1>\n\n<p>We
|
||||||
|
will make a good faith effort to:</p>\n\n<ul>\n<li>Retain server logs containing
|
||||||
|
the IP address of all requests to this server no more than 30 days.</li>\n<li>Retain
|
||||||
|
the IP addresses associated with registered users and their posts no more
|
||||||
|
than 5 years.</li>\n</ul>\n\n<h1>Data portability</h1>\n\n<p>You can export
|
||||||
|
most of the data we collect about you using site features. You can contact
|
||||||
|
us via e-mail to get exports of your data beyond that.</p>\n\n<h1>Do we use
|
||||||
|
cookies?</h1>\n\n<p>Yes. Cookies are small files that a site or its service
|
||||||
|
provider transfers to your computer's hard drive through your Web browser
|
||||||
|
(if you allow). These cookies enable the site to recognize your browser and,
|
||||||
|
if you have a registered account, associate it with your registered account.
|
||||||
|
We use cookies to understand and save your preferences for future visits and
|
||||||
|
compile aggregate data about site traffic and site interaction so that we
|
||||||
|
can offer better site experiences and tools in the future.</p>\n\n<h1>Do we
|
||||||
|
disclose any information to outside parties?</h1>\n\n<p>We do not sell, trade,
|
||||||
|
or otherwise transfer to outside parties your personally identifiable information.
|
||||||
|
This does not include trusted third parties who assist us in operating our
|
||||||
|
site, so long as those parties agree to keep this information confidential.
|
||||||
|
We may also release your information when we believe release is appropriate
|
||||||
|
to comply with the law, enforce our site policies, or protect ours or others
|
||||||
|
rights, property, or safety. Non-personally identifiable visitor and aggregate
|
||||||
|
information may be provided to other parties to help improve the website.</p>\n\n<p>We
|
||||||
|
do transfer some of your data, such as posts you make and the pseudonym with
|
||||||
|
which you have registered on this website, to other servers in the ActivityPub
|
||||||
|
and OStatus networks. We also store and display such data that we receive
|
||||||
|
from other servers on the network. We do this because it is neccesary to do
|
||||||
|
it for this website to provide the services of a distributed social network.
|
||||||
|
You can opt out of this by only allowing people from your local server to
|
||||||
|
follow you. If you use web notifications, we share your data (in an encrypted
|
||||||
|
form) with your web notification provider. You can opt out of this by not
|
||||||
|
using web notifications.</p>\n\n<p>This website is hosted on a server located
|
||||||
|
in a Hetzner datacenter in Germany. While we do not explicitly share any information
|
||||||
|
with them and they do not regularly process any of your data, they may as
|
||||||
|
part of maintenance operations or to comply with the law gain access to that
|
||||||
|
data. You can review their privacy policy on the Hetzner website.\nThird party
|
||||||
|
links</p>\n\n<p>Occasionally, we or our users may include or offer third party
|
||||||
|
products or services on our site. These third party sites have separate and
|
||||||
|
independent privacy policies. We therefore have no responsibility or liability
|
||||||
|
for the content and activities of these linked sites. Nonetheless, we seek
|
||||||
|
to protect the integrity of our site and welcome any feedback about these
|
||||||
|
sites.\nAge restrictions</p>\n\n<p>Our site and services are all directed
|
||||||
|
to people who are at least 16 years old. If you are under 16, you must get
|
||||||
|
parental consent to be allowed to use this website. If you are below the age
|
||||||
|
of 13, you may not use this website.</p>\n\n<h1>Online Privacy Policy Only</h1>\n\n<p>This
|
||||||
|
online privacy policy applies only to information collected through our site
|
||||||
|
and not to information collected offline.</p>\n\n<h1>Contact</h1>\n\n<p>All
|
||||||
|
inquiries and requests (for export, correction, deletion or other things)
|
||||||
|
regarding the use of your data on this website should be directed to lorenzd+icosa@gmail.com.</p>\n\n<h1>Your
|
||||||
|
Consent</h1>\n\n<p>By using our site, you consent to our web site privacy
|
||||||
|
policy and to us using your data in the ways described here.\nChanges to our
|
||||||
|
Privacy Policy</p>\n\n<p>If we decide to change our privacy policy, we will
|
||||||
|
post those changes on this page.</p>\n\n<p>This document is CC-BY-SA. It was
|
||||||
|
originally adapted from the Discourse privacy policy.</p>\n", "succeeded_by":
|
||||||
|
"2025-08-27"}'
|
||||||
|
headers:
|
||||||
|
Connection:
|
||||||
|
- keep-alive
|
||||||
|
Content-Type:
|
||||||
|
- application/json; charset=utf-8
|
||||||
|
Date:
|
||||||
|
- Sun, 17 Aug 2025 20:41:51 GMT
|
||||||
|
Transfer-Encoding:
|
||||||
|
- chunked
|
||||||
|
Vary:
|
||||||
|
- Accept-Encoding
|
||||||
|
- Accept, Origin
|
||||||
|
X-Cached:
|
||||||
|
- HIT
|
||||||
|
cache-control:
|
||||||
|
- max-age=300, public, stale-while-revalidate=30, stale-if-error=86400
|
||||||
|
content-length:
|
||||||
|
- '7695'
|
||||||
|
content-security-policy:
|
||||||
|
- default-src 'none'; frame-ancestors 'none'; form-action 'none'
|
||||||
|
etag:
|
||||||
|
- W/"35a393f5110a365869e8429ce7155fb6"
|
||||||
|
referrer-policy:
|
||||||
|
- same-origin
|
||||||
|
server:
|
||||||
|
- Mastodon
|
||||||
|
strict-transport-security:
|
||||||
|
- max-age=63072000; includeSubDomains
|
||||||
|
- max-age=31536000
|
||||||
|
x-content-type-options:
|
||||||
|
- nosniff
|
||||||
|
x-frame-options:
|
||||||
|
- DENY
|
||||||
|
x-ratelimit-limit:
|
||||||
|
- '300'
|
||||||
|
x-ratelimit-remaining:
|
||||||
|
- '299'
|
||||||
|
x-ratelimit-reset:
|
||||||
|
- '2025-08-17T20:40:00.006257Z'
|
||||||
|
x-request-id:
|
||||||
|
- c3d993b2-7a1a-4a55-acd8-6daadbde0be0
|
||||||
|
x-runtime:
|
||||||
|
- '0.014082'
|
||||||
|
x-xss-protection:
|
||||||
|
- '0'
|
||||||
|
status:
|
||||||
|
code: 200
|
||||||
|
message: OK
|
||||||
|
version: 1
|
|
@ -1818,3 +1818,25 @@ def test_entity_oauthuserinfo(mastodon_base, mastodon_admin):
|
||||||
if sys.version_info >= (3, 9):
|
if sys.version_info >= (3, 9):
|
||||||
assert real_issubclass(type(result), OAuthUserInfo), str(type(result)) + ' is not a subclass of OAuthUserInfo after to_json/from_json'
|
assert real_issubclass(type(result), OAuthUserInfo), str(type(result)) + ' is not a subclass of OAuthUserInfo 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_termsofservice(mastodon_base, mastodon_admin):
|
||||||
|
mastodon = mastodon_admin
|
||||||
|
result = mastodon.instance_terms_of_service()
|
||||||
|
assert real_issubclass(type(result), TermsOfService), str(type(result)) + ' is not a subclass of TermsOfService'
|
||||||
|
result = Entity.from_json(result.to_json())
|
||||||
|
if sys.version_info >= (3, 9):
|
||||||
|
assert real_issubclass(type(result), TermsOfService), str(type(result)) + ' is not a subclass of TermsOfService after to_json/from_json'
|
||||||
|
result = mastodon.instance_terms_of_service(datetime(2025, 8, 17))
|
||||||
|
assert real_issubclass(type(result), TermsOfService), str(type(result)) + ' is not a subclass of TermsOfService (additional function)'
|
||||||
|
result = Entity.from_json(result.to_json())
|
||||||
|
if sys.version_info >= (3, 9):
|
||||||
|
assert real_issubclass(type(result), TermsOfService), str(type(result)) + ' is not a subclass of TermsOfService after to_json/from_json (additional function)'
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue