mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2024-11-26 03:13:45 +03:00
Expose key and iv parameter in downloads/uploads (#1397)
This commit is contained in:
parent
1ec38aa5b2
commit
0e0052888f
|
@ -5,6 +5,8 @@ import pathlib
|
||||||
import typing
|
import typing
|
||||||
import inspect
|
import inspect
|
||||||
|
|
||||||
|
from ..crypto import AES
|
||||||
|
|
||||||
from .. import utils, helpers, errors, hints
|
from .. import utils, helpers, errors, hints
|
||||||
from ..requestiter import RequestIter
|
from ..requestiter import RequestIter
|
||||||
from ..tl import TLObject, types, functions
|
from ..tl import TLObject, types, functions
|
||||||
|
@ -17,7 +19,6 @@ except ImportError:
|
||||||
if typing.TYPE_CHECKING:
|
if typing.TYPE_CHECKING:
|
||||||
from .telegramclient import TelegramClient
|
from .telegramclient import TelegramClient
|
||||||
|
|
||||||
|
|
||||||
# Chunk sizes for upload.getFile must be multiples of the smallest size
|
# Chunk sizes for upload.getFile must be multiples of the smallest size
|
||||||
MIN_CHUNK_SIZE = 4096
|
MIN_CHUNK_SIZE = 4096
|
||||||
MAX_CHUNK_SIZE = 512 * 1024
|
MAX_CHUNK_SIZE = 512 * 1024
|
||||||
|
@ -376,7 +377,9 @@ class DownloadMethods:
|
||||||
part_size_kb: float = None,
|
part_size_kb: float = None,
|
||||||
file_size: int = None,
|
file_size: int = None,
|
||||||
progress_callback: 'hints.ProgressCallback' = None,
|
progress_callback: 'hints.ProgressCallback' = None,
|
||||||
dc_id: int = None) -> typing.Optional[bytes]:
|
dc_id: int = None,
|
||||||
|
key: bytes = None,
|
||||||
|
iv: bytes = None) -> typing.Optional[bytes]:
|
||||||
"""
|
"""
|
||||||
Low-level method to download files from their input location.
|
Low-level method to download files from their input location.
|
||||||
|
|
||||||
|
@ -415,6 +418,13 @@ class DownloadMethods:
|
||||||
The data center the library should connect to in order
|
The data center the library should connect to in order
|
||||||
to download the file. You shouldn't worry about this.
|
to download the file. You shouldn't worry about this.
|
||||||
|
|
||||||
|
key ('bytes', optional):
|
||||||
|
In case of an encrypted upload (secret chats) a key is supplied
|
||||||
|
|
||||||
|
iv ('bytes', optional):
|
||||||
|
In case of an encrypted upload (secret chats) an iv is supplied
|
||||||
|
|
||||||
|
|
||||||
Example
|
Example
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
|
@ -446,6 +456,8 @@ class DownloadMethods:
|
||||||
try:
|
try:
|
||||||
async for chunk in self.iter_download(
|
async for chunk in self.iter_download(
|
||||||
input_location, request_size=part_size, dc_id=dc_id):
|
input_location, request_size=part_size, dc_id=dc_id):
|
||||||
|
if iv and key:
|
||||||
|
chunk = AES.decrypt_ige(chunk, key, iv)
|
||||||
r = f.write(chunk)
|
r = f.write(chunk)
|
||||||
if inspect.isawaitable(r):
|
if inspect.isawaitable(r):
|
||||||
await r
|
await r
|
||||||
|
|
|
@ -8,6 +8,8 @@ import typing
|
||||||
import inspect
|
import inspect
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
|
from ..crypto import AES
|
||||||
|
|
||||||
from .. import utils, helpers, hints
|
from .. import utils, helpers, hints
|
||||||
from ..tl import types, functions, custom
|
from ..tl import types, functions, custom
|
||||||
|
|
||||||
|
@ -439,6 +441,8 @@ class UploadMethods:
|
||||||
part_size_kb: float = None,
|
part_size_kb: float = None,
|
||||||
file_name: str = None,
|
file_name: str = None,
|
||||||
use_cache: type = None,
|
use_cache: type = None,
|
||||||
|
key: bytes = None,
|
||||||
|
iv: bytes = None,
|
||||||
progress_callback: 'hints.ProgressCallback' = None) -> 'types.TypeInputFile':
|
progress_callback: 'hints.ProgressCallback' = None) -> 'types.TypeInputFile':
|
||||||
"""
|
"""
|
||||||
Uploads a file to Telegram's servers, without sending it.
|
Uploads a file to Telegram's servers, without sending it.
|
||||||
|
@ -476,6 +480,12 @@ class UploadMethods:
|
||||||
backward-compatibility (and it may get its use back in
|
backward-compatibility (and it may get its use back in
|
||||||
the future).
|
the future).
|
||||||
|
|
||||||
|
key ('bytes', optional):
|
||||||
|
In case of an encrypted upload (secret chats) a key is supplied
|
||||||
|
|
||||||
|
iv ('bytes', optional):
|
||||||
|
In case of an encrypted upload (secret chats) an iv is supplied
|
||||||
|
|
||||||
progress_callback (`callable`, optional):
|
progress_callback (`callable`, optional):
|
||||||
A callback function accepting two parameters:
|
A callback function accepting two parameters:
|
||||||
``(sent bytes, total)``.
|
``(sent bytes, total)``.
|
||||||
|
@ -586,6 +596,10 @@ class UploadMethods:
|
||||||
# Read the file by in chunks of size part_size
|
# Read the file by in chunks of size part_size
|
||||||
part = stream.read(part_size)
|
part = stream.read(part_size)
|
||||||
|
|
||||||
|
# encryption part if needed
|
||||||
|
if key and iv:
|
||||||
|
part = AES.encrypt_ige(part, key, iv)
|
||||||
|
|
||||||
# The SavePartRequest is different depending on whether
|
# The SavePartRequest is different depending on whether
|
||||||
# the file is too large or not (over or less than 10MB)
|
# the file is too large or not (over or less than 10MB)
|
||||||
if is_large:
|
if is_large:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user