From 0afde5faf7e6d8a9a66198480f32cee4b13c8eed Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Mon, 20 Feb 2017 23:44:59 +0300 Subject: [PATCH] avatars encryption plugin --- AvatarEncryption/ae.py | 75 ++++++++++++++++++++++++++++++++++ AvatarEncryption/ae/readme.txt | 2 + README.md | 2 +- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 AvatarEncryption/ae.py create mode 100644 AvatarEncryption/ae/readme.txt diff --git a/AvatarEncryption/ae.py b/AvatarEncryption/ae.py new file mode 100644 index 0000000..ec12827 --- /dev/null +++ b/AvatarEncryption/ae.py @@ -0,0 +1,75 @@ +import plugin_super_class +import json +import settings +import os + + +class AvatarEncryption(plugin_super_class.PluginSuperClass): + + def __init__(self, *args): + super(AvatarEncryption, self).__init__('AvatarEncryption', 'ae', *args) + self._path = settings.ProfileHelper.get_path() + 'avatars/' + self._contacts = self._profile._contacts[:] + + def close(self): + if not self._encrypt_save.has_password(): + return + i, data = 1, {} + + self.save_contact_avatar(data, self._profile, 0) + for friend in self._contacts: + self.save_contact_avatar(data, friend, i) + i += 1 + self.save_settings(json.dumps(data)) + + def start(self): + if not self._encrypt_save.has_password(): + return + data = json.loads(self.load_settings()) + + self.load_contact_avatar(data, self._profile) + for friend in self._contacts: + self.load_contact_avatar(data, friend) + self._profile.update() + + def save_contact_avatar(self, data, contact, i): + tox_id = contact.tox_id[:64] + data[str(tox_id)] = str(i) + path = self._path + tox_id + '.png' + if os.path.isfile(path): + with open(path, 'rb') as fl: + avatar = fl.read() + encr_avatar = self._encrypt_save.pass_encrypt(avatar) + with open(self._path + self._settings.name + '_' + str(i) + '.png', 'wb') as fl: + fl.write(encr_avatar) + os.remove(path) + + def load_contact_avatar(self, data, contact): + tox_id = str(contact.tox_id[:64]) + if tox_id not in data: + return + path = self._path + self._settings.name + '_' + data[tox_id] + '.png' + if os.path.isfile(path): + with open(path, 'rb') as fl: + avatar = fl.read() + decr_avatar = self._encrypt_save.pass_decrypt(avatar) + with open(self._path + str(tox_id) + '.png', 'wb') as fl: + fl.write(decr_avatar) + os.remove(path) + contact.load_avatar() + + def load_settings(self): + try: + with open(plugin_super_class.path_to_data(self._short_name) + self._settings.name + '.json', 'rb') as fl: + data = fl.read() + return str(self._encrypt_save.pass_decrypt(data), 'utf-8') if data else '{}' + except: + return '{}' + + def save_settings(self, data): + try: + data = self._encrypt_save.pass_encrypt(bytes(data, 'utf-8')) + with open(plugin_super_class.path_to_data(self._short_name) + self._settings.name + '.json', 'wb') as fl: + fl.write(data) + except: + pass diff --git a/AvatarEncryption/ae/readme.txt b/AvatarEncryption/ae/readme.txt new file mode 100644 index 0000000..7fe7851 --- /dev/null +++ b/AvatarEncryption/ae/readme.txt @@ -0,0 +1,2 @@ +Plugin for avatars encryption. Works with encrypted profiles only. +Note that it breaks compability with other clients. diff --git a/README.md b/README.md index 5cc653a..8489b44 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,4 @@ For more info visit [plugins.md](https://github.com/toxygen-project/toxygen/blob - Garland - changes your status like it's garland. - AutoAnswer - calls auto answering. - uToxInlineSending - send inlines with the same name as uTox does. - +- AvatarEncryption - encrypt all avatars using profile password