Last active
October 31, 2018 21:43
-
-
Save stek29/82818f1bab1ae95fd471d7c0813fe74f to your computer and use it in GitHub Desktop.
TDesktop link generator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from Crypto.Hash import SHA | |
from Crypto.Signature import PKCS1_v1_5 | |
from Crypto.PublicKey import RSA | |
from base64 import urlsafe_b64encode | |
from requests import get | |
def get_version_signature(version, private_key): | |
signed_data = b'TelegramBeta_%x'%int(version) | |
digest = SHA.new() | |
digest.update(signed_data) | |
signer = PKCS1_v1_5.new(private_key) | |
sig = signer.sign(digest) | |
sig64 = urlsafe_b64encode(sig).decode().replace('-', '8').replace('_', 'B') | |
return sig64[19:][:32] | |
def format_version(v): | |
s = str(v) | |
if len(s)%3 != 0: | |
s = s.rjust(len(s) + 3 - len(s)%3) | |
blocks = [] | |
for d3, d2, d1 in zip(*[iter(s[::-1])]*3): | |
blocks.append(str(int(d1+d2+d3))) | |
return '.'.join(blocks[::-1]) | |
if __name__ == '__main__': | |
update_feed = get('http://updates.tdesktop.com/current').json() | |
os = input('Enter OS ({}): '.format(', '.join(update_feed))).strip() | |
versions = update_feed[os] | |
print('Available versions:') | |
for k, v in versions.items(): | |
print('{}: {} ({})'.format(k, format_version(v['released']), v['released'])) | |
vers = input('Enter version ({}): '.format(', '.join(versions))).strip() | |
linkcontainer = versions[vers] | |
installer = input('Download installer instead of update package? [Yn] ').strip().lower() != 'n' | |
base = 'https://updates.tdesktop.com' | |
link = linkcontainer['link'] | |
def_vers_code = linkcontainer['released'] | |
user_vers_code = input('Enter version (or empty for {}): '.format(def_vers_code)) | |
version_code = int(user_vers_code) if user_vers_code else def_vers_code | |
if vers == 'alpha': | |
with open ('tdbeta_key.pem') as f: | |
private_key = RSA.importKey(f.read()) | |
signature = get_version_signature(version_code, private_key) | |
if not installer: | |
link = link.replace('{version}', str(version_code)) | |
if vers == 'alpha': | |
link = link.replace('{signature}', signature) | |
else: | |
portable = False | |
if os == 'win' and vers != 'alpha': | |
portable = input('Download portable version? [yN] ').strip().lower() == 'y' | |
if os != 'win': | |
link = '/t{}/'.format(os) | |
else: | |
link = '/tsetup/' | |
if vers == 'alpha': | |
link = link + 'tbeta{}_{}.zip'.format(version_code, signature) | |
else: | |
pretty_version = format_version(version_code) | |
if vers == 'beta': | |
pretty_version = pretty_version + '.alpha' | |
if os == 'win': | |
ext = 'exe' if not portable else 'zip' | |
elif 'mac' in os: | |
ext = 'dmg' | |
elif 'linux' in os: | |
ext = 'tar.xz' | |
prefix = 'tsetup' if not portable else 'tportable' | |
link = link + '.'.join((prefix, pretty_version, ext)) | |
print(base + link) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment