diff options
Diffstat (limited to 'mastodon')
-rw-r--r-- | mastodon/Mastodon.py | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/mastodon/Mastodon.py b/mastodon/Mastodon.py index 9386882..2adcd74 100644 --- a/mastodon/Mastodon.py +++ b/mastodon/Mastodon.py | |||
@@ -40,7 +40,6 @@ try: | |||
40 | except: | 40 | except: |
41 | IMPL_HAS_ECE = False | 41 | IMPL_HAS_ECE = False |
42 | 42 | ||
43 | |||
44 | IMPL_HAS_BLURHASH = True | 43 | IMPL_HAS_BLURHASH = True |
45 | try: | 44 | try: |
46 | import blurhash | 45 | import blurhash |
@@ -262,6 +261,7 @@ class Mastodon: | |||
262 | __DICT_VERSION_REACTION = "3.1.0" | 261 | __DICT_VERSION_REACTION = "3.1.0" |
263 | __DICT_VERSION_ANNOUNCEMENT = bigger_version("3.1.0", __DICT_VERSION_REACTION) | 262 | __DICT_VERSION_ANNOUNCEMENT = bigger_version("3.1.0", __DICT_VERSION_REACTION) |
264 | __DICT_VERSION_STATUS_EDIT = "3.5.0" | 263 | __DICT_VERSION_STATUS_EDIT = "3.5.0" |
264 | __DICT_VERSION_FAMILIAR_FOLLOWERS = bigger_version("3.5.0", __DICT_VERSION_ACCOUNT) | ||
265 | __DICT_VERSION_ADMIN_DOMAIN_BLOCK = "4.0.0" | 265 | __DICT_VERSION_ADMIN_DOMAIN_BLOCK = "4.0.0" |
266 | __DICT_VERSION_ADMIN_MEASURE = "3.5.0" | 266 | __DICT_VERSION_ADMIN_MEASURE = "3.5.0" |
267 | __DICT_VERSION_ADMIN_DIMENSION = "3.5.0" | 267 | __DICT_VERSION_ADMIN_DIMENSION = "3.5.0" |
@@ -1357,7 +1357,7 @@ class Mastodon: | |||
1357 | """ | 1357 | """ |
1358 | return self.__api_request('GET', '/api/v1/accounts/lookup', self.__generate_params(locals())) | 1358 | return self.__api_request('GET', '/api/v1/accounts/lookup', self.__generate_params(locals())) |
1359 | 1359 | ||
1360 | @api_version("3.5.0", "3.5.0", __DICT_VERSION_ACCOUNT) | 1360 | @api_version("3.5.0", "3.5.0", __DICT_VERSION_FAMILIAR_FOLLOWERS) |
1361 | def account_familiar_followers(self, id): | 1361 | def account_familiar_followers(self, id): |
1362 | """ | 1362 | """ |
1363 | Find followers for the account given by id (can be a list) that also follow the | 1363 | Find followers for the account given by id (can be a list) that also follow the |
@@ -2457,8 +2457,19 @@ class Mastodon: | |||
2457 | Returns a `relationship dict`_ containing the updated relationship to the user. | 2457 | Returns a `relationship dict`_ containing the updated relationship to the user. |
2458 | """ | 2458 | """ |
2459 | id = self.__unpack_id(id) | 2459 | id = self.__unpack_id(id) |
2460 | url = '/api/v1/accounts/{0}/unfollow'.format(str(id)) | 2460 | return self.__api_request('POST', '/api/v1/accounts/{0}/unfollow'.format(str(id))) |
2461 | return self.__api_request('POST', url) | 2461 | |
2462 | @api_version("3.5.0", "3.5.0", __DICT_VERSION_RELATIONSHIP) | ||
2463 | def account_remove_from_followers(self, id): | ||
2464 | """ | ||
2465 | Remove a user from the logged in users followers (i.e. make them unfollow the logged in | ||
2466 | user / "softblock" them). | ||
2467 | |||
2468 | Returns a `relationship dict`_ reflecting the updated following status. | ||
2469 | """ | ||
2470 | id = self.__unpack_id(id) | ||
2471 | return self.__api_request('POST', '/api/v1/accounts/{0}/remove_from_followers'.format(str(id))) | ||
2472 | |||
2462 | 2473 | ||
2463 | @api_version("1.0.0", "1.4.0", __DICT_VERSION_RELATIONSHIP) | 2474 | @api_version("1.0.0", "1.4.0", __DICT_VERSION_RELATIONSHIP) |
2464 | def account_block(self, id): | 2475 | def account_block(self, id): |
@@ -3618,16 +3629,14 @@ class Mastodon: | |||
3618 | raise NotImplementedError( | 3629 | raise NotImplementedError( |
3619 | 'To use the crypto tools, please install the webpush feature dependencies.') | 3630 | 'To use the crypto tools, please install the webpush feature dependencies.') |
3620 | 3631 | ||
3621 | push_key_pair = ec.generate_private_key( | 3632 | push_key_pair = ec.generate_private_key(ec.SECP256R1(), default_backend()) |
3622 | ec.SECP256R1(), default_backend()) | ||
3623 | push_key_priv = push_key_pair.private_numbers().private_value | 3633 | push_key_priv = push_key_pair.private_numbers().private_value |
3624 | 3634 | ||
3625 | crypto_ver = cryptography.__version__ | 3635 | crypto_ver = cryptography.__version__ |
3626 | if len(crypto_ver) < 5: | 3636 | if len(crypto_ver) < 5: |
3627 | crypto_ver += ".0" | 3637 | crypto_ver += ".0" |
3628 | if bigger_version(crypto_ver, "2.5.0") == crypto_ver: | 3638 | if bigger_version(crypto_ver, "2.5.0") == crypto_ver: |
3629 | push_key_pub = push_key_pair.public_key().public_bytes( | 3639 | push_key_pub = push_key_pair.public_key().public_bytes(serialization.Encoding.X962, serialization.PublicFormat.UncompressedPoint) |
3630 | serialization.Encoding.X962, serialization.PublicFormat.UncompressedPoint) | ||
3631 | else: | 3640 | else: |
3632 | push_key_pub = push_key_pair.public_key().public_numbers().encode_point() | 3641 | push_key_pub = push_key_pair.public_key().public_numbers().encode_point() |
3633 | push_shared_secret = os.urandom(16) | 3642 | push_shared_secret = os.urandom(16) |
@@ -3657,14 +3666,10 @@ class Mastodon: | |||
3657 | raise NotImplementedError( | 3666 | raise NotImplementedError( |
3658 | 'To use the crypto tools, please install the webpush feature dependencies.') | 3667 | 'To use the crypto tools, please install the webpush feature dependencies.') |
3659 | 3668 | ||
3660 | salt = self.__decode_webpush_b64( | 3669 | salt = self.__decode_webpush_b64(encryption_header.split("salt=")[1].strip()) |
3661 | encryption_header.split("salt=")[1].strip()) | 3670 | dhparams = self.__decode_webpush_b64(crypto_key_header.split("dh=")[1].split(";")[0].strip()) |
3662 | dhparams = self.__decode_webpush_b64( | 3671 | p256ecdsa = self.__decode_webpush_b64(crypto_key_header.split("p256ecdsa=")[1].strip()) |
3663 | crypto_key_header.split("dh=")[1].split(";")[0].strip()) | 3672 | dec_key = ec.derive_private_key(decrypt_params['privkey'], ec.SECP256R1(), default_backend()) |
3664 | p256ecdsa = self.__decode_webpush_b64( | ||
3665 | crypto_key_header.split("p256ecdsa=")[1].strip()) | ||
3666 | dec_key = ec.derive_private_key( | ||
3667 | decrypt_params['privkey'], ec.SECP256R1(), default_backend()) | ||
3668 | decrypted = http_ece.decrypt( | 3673 | decrypted = http_ece.decrypt( |
3669 | data, | 3674 | data, |
3670 | salt=salt, | 3675 | salt=salt, |
@@ -3703,8 +3708,7 @@ class Mastodon: | |||
3703 | 'To use the blurhash functions, please install the blurhash Python module.') | 3708 | 'To use the blurhash functions, please install the blurhash Python module.') |
3704 | 3709 | ||
3705 | # Figure out what size to decode to | 3710 | # Figure out what size to decode to |
3706 | decode_components_x, decode_components_y = blurhash.components( | 3711 | decode_components_x, decode_components_y = blurhash.components(media_dict["blurhash"]) |
3707 | media_dict["blurhash"]) | ||
3708 | if size_per_component: | 3712 | if size_per_component: |
3709 | decode_size_x = decode_components_x * out_size[0] | 3713 | decode_size_x = decode_components_x * out_size[0] |
3710 | decode_size_y = decode_components_y * out_size[1] | 3714 | decode_size_y = decode_components_y * out_size[1] |
@@ -3713,8 +3717,7 @@ class Mastodon: | |||
3713 | decode_size_y = out_size[1] | 3717 | decode_size_y = out_size[1] |
3714 | 3718 | ||
3715 | # Decode | 3719 | # Decode |
3716 | decoded_image = blurhash.decode( | 3720 | decoded_image = blurhash.decode(media_dict["blurhash"], decode_size_x, decode_size_y, linear=return_linear) |
3717 | media_dict["blurhash"], decode_size_x, decode_size_y, linear=return_linear) | ||
3718 | 3721 | ||
3719 | # And that's pretty much it. | 3722 | # And that's pretty much it. |
3720 | return decoded_image | 3723 | return decoded_image |