Add hmac
This commit is contained in:
parent
d695dd9e9b
commit
91a25b6bd6
|
@ -2,7 +2,12 @@ telegram:
|
||||||
api_id: 0
|
api_id: 0
|
||||||
api_hash: https://my.telegram.org
|
api_hash: https://my.telegram.org
|
||||||
bot_token: https://t.me/BotFather
|
bot_token: https://t.me/BotFather
|
||||||
# If authorized tokens does not exist, no authorization is required
|
# If authorized tokens and hmac does not exist, no authorization is required
|
||||||
authorized_tokens:
|
authorized_tokens:
|
||||||
- DIi4aXHn440PTPXJE1yVyIoU2L4bLGiyjC1Fd7usKAMZYWVcp5p0P792G4YlbNnIcWCLypXbUFJkVzKqhh0AkJYSWqJbsAy8TjA
|
- DIi4aXHn440PTPXJE1yVyIoU2L4bLGiyjC1Fd7usKAMZYWVcp5p0P792G4YlbNnIcWCLypXbUFJkVzKqhh0AkJYSWqJbsAy8TjA
|
||||||
- RCywhzEkwqWmDjsqhBdNMwO1cQNi72SWsvAKZxdoeFylbioqKCZjEKyjgDXkYn6xeMQLj4dDq6QoonVAU1b1MDyOUX9CvT5W4MP
|
- RCywhzEkwqWmDjsqhBdNMwO1cQNi72SWsvAKZxdoeFylbioqKCZjEKyjgDXkYn6xeMQLj4dDq6QoonVAU1b1MDyOUX9CvT5W4MP
|
||||||
|
hmac:
|
||||||
|
- key: QgTz0hoawBdIMUEULxMa0QXHOPjBujO5Vl3Liao87H0687JPDbd6ixB08vWWZOqXpOKv7kcDb1QGkkYeAirlrnvzkC7ZYwN63lR
|
||||||
|
digest: sha512
|
||||||
|
- key: ni1KHr52uvpO1tEBFXIYylha2CTfnTafY2b3qE0V7qNMj5eYtSMN0VGnuJHoFxDLSe2lUebyH3d2zA9q5IDfAs9qYWQ27mFV099
|
||||||
|
digest: sha256
|
||||||
|
|
38
streamtg.py
38
streamtg.py
|
@ -3,6 +3,7 @@ logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import yaml
|
import yaml
|
||||||
|
import hmac
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
from telethon import TelegramClient
|
from telethon import TelegramClient
|
||||||
from telethon.utils import _get_file_info
|
from telethon.utils import _get_file_info
|
||||||
|
@ -13,27 +14,52 @@ with open('config.yaml') as file:
|
||||||
|
|
||||||
client = TelegramClient('streamtg', config['telegram']['api_id'], config['telegram']['api_hash'])
|
client = TelegramClient('streamtg', config['telegram']['api_id'], config['telegram']['api_hash'])
|
||||||
authorized_tokens = config.get('authorized_tokens')
|
authorized_tokens = config.get('authorized_tokens')
|
||||||
|
hmacs = [hmac.new(i['key'].encode(), digestmod=i['digest']) for i in config.get('hmac', ())]
|
||||||
port = os.environ.get('PORT', 8080)
|
port = os.environ.get('PORT', 8080)
|
||||||
|
|
||||||
|
def verify_token(token):
|
||||||
|
return token in authorized_tokens
|
||||||
|
|
||||||
|
def verify_hmac(hexdigest, chat_id, message_ids):
|
||||||
|
text = f'{chat_id}|{"|".join(message_ids)}'.encode()
|
||||||
|
for i in hmacs:
|
||||||
|
i = i.copy()
|
||||||
|
i.update(text)
|
||||||
|
if hmac.compare_digest(hexdigest, i.hexdigest()):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
async def handler(request):
|
async def handler(request):
|
||||||
query = request.query
|
query = request.query
|
||||||
if authorized_tokens:
|
token = query.get('token')
|
||||||
if 'token' not in query:
|
hexdigest = query.get('hmac')
|
||||||
return web.Response(status=401, text='Unauthorized')
|
if not token and not hexdigest and (authorized_tokens or hmacs):
|
||||||
if query['token'] not in authorized_tokens:
|
return web.Response(status=401, text='Missing token or hmac')
|
||||||
return web.Response(status=403, text='Forbidden')
|
|
||||||
if 'chat_id' not in query:
|
if 'chat_id' not in query:
|
||||||
return web.Response(status=400, text='Missing chat_id')
|
return web.Response(status=400, text='Missing chat_id')
|
||||||
chat_id = query['chat_id']
|
chat_id = query['chat_id']
|
||||||
try:
|
try:
|
||||||
chat_id = int(chat_id)
|
chat_id = int(chat_id)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
try:
|
||||||
|
chat_id = await client.get_peer_id(chat_id)
|
||||||
|
except BaseException:
|
||||||
|
if authorized_tokens or hmacs:
|
||||||
|
logging.exception('Exception occured while getting chat id of %s, returning 403 to hide known chats', chat_id)
|
||||||
|
return web.Response(status=403, text='Forbidden')
|
||||||
|
raise
|
||||||
if 'message_id' not in query:
|
if 'message_id' not in query:
|
||||||
return web.Response(status=400, text='Missing message_id')
|
return web.Response(status=400, text='Missing message_id')
|
||||||
message_ids = query.getall('message_id')
|
message_ids = query.getall('message_id')
|
||||||
if any(True for i in message_ids if not i.isnumeric() or i == '0'):
|
if any(True for i in message_ids if not i.isnumeric() or i == '0'):
|
||||||
return web.Response(status=400, text='Invalid message_id')
|
return web.Response(status=400, text='Invalid message_id')
|
||||||
|
if authorized_tokens or hmacs:
|
||||||
|
if not token or not verify_token(token):
|
||||||
|
if hexdigest:
|
||||||
|
if not verify_hmac(hexdigest, chat_id, message_ids):
|
||||||
|
return web.Response(status=403, text='Forbidden')
|
||||||
|
else:
|
||||||
|
return web.Response(status=403, text='Forbidden')
|
||||||
message_ids = list(map(int, message_ids))
|
message_ids = list(map(int, message_ids))
|
||||||
messages = await client.get_messages(chat_id, ids=message_ids)
|
messages = await client.get_messages(chat_id, ids=message_ids)
|
||||||
if any(True for i in messages if i is None):
|
if any(True for i in messages if i is None):
|
||||||
|
|
Loading…
Reference in New Issue