Initial commit
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
commit
37c7ae2c9e
1 changed files with 60 additions and 0 deletions
60
aesgcm-dl.py
Executable file
60
aesgcm-dl.py
Executable file
|
@ -0,0 +1,60 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim:fenc=utf-8 et ts=4 sts=4 sw=4
|
||||||
|
#
|
||||||
|
# Copyright © 2022 Maxime “pep” Buquet <pep@bouah.net>
|
||||||
|
#
|
||||||
|
# This file is licensed under AGPL-3.0-or-later
|
||||||
|
|
||||||
|
"""
|
||||||
|
AESGCM URIs downloader
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import asyncio
|
||||||
|
from io import BytesIO
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from aiohttp import ClientSession
|
||||||
|
from slixmpp.version import __version__ as slixmpp_version
|
||||||
|
from slixmpp.plugins.xep_0454 import XEP_0454
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidURI(Exception):
|
||||||
|
"""Raised when an invalid aesgcm URI is specified"""
|
||||||
|
|
||||||
|
def __init__(self, url) -> None:
|
||||||
|
self.url = url
|
||||||
|
|
||||||
|
|
||||||
|
async def handle_file(uri: str) -> None:
|
||||||
|
"""Downloads, decrypts, and writes specified URI"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
aesurl, fragment = uri.rsplit('#', 1)
|
||||||
|
except ValueError as exn:
|
||||||
|
raise InvalidURI(uri) from exn
|
||||||
|
|
||||||
|
url = aesurl.replace('aesgcm://', 'https://')
|
||||||
|
filename = Path(url.rsplit('/', 1)[1])
|
||||||
|
|
||||||
|
async with ClientSession(headers={'User-Agent': 'slixmpp ' + slixmpp_version}) as session:
|
||||||
|
async with session.get(url) as response:
|
||||||
|
print(f'Got response for {url}')
|
||||||
|
input_file = BytesIO(await response.read())
|
||||||
|
|
||||||
|
with filename.open('wb') as file:
|
||||||
|
print(f'Writing to {filename}')
|
||||||
|
file.write(XEP_0454.decrypt(input_file, fragment))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print('usage: aesgcm-dl <URI>', file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
try:
|
||||||
|
asyncio.run(handle_file(sys.argv[1]))
|
||||||
|
except InvalidURI as exn:
|
||||||
|
print(f'Invalid aesgcm URI: {exn.url}', file=sys.stderr)
|
||||||
|
sys.exit(2)
|
Loading…
Reference in a new issue