diff --git a/toxygen/history.py b/toxygen/history.py index 53280d7..4242809 100644 --- a/toxygen/history.py +++ b/toxygen/history.py @@ -2,7 +2,7 @@ from sqlite3 import connect import settings from os import chdir import os.path -from toxencryptsave import ToxEncryptSave +from toxes import ToxES PAGE_SIZE = 42 @@ -25,7 +25,7 @@ class History: chdir(settings.ProfileHelper.get_path()) path = settings.ProfileHelper.get_path() + self._name + '.hstr' if os.path.exists(path): - decr = ToxEncryptSave.get_instance() + decr = ToxES.get_instance() try: with open(path, 'rb') as fin: data = fin.read() @@ -43,7 +43,7 @@ class History: db.close() def save(self): - encr = ToxEncryptSave.get_instance() + encr = ToxES.get_instance() if encr.has_password(): path = settings.ProfileHelper.get_path() + self._name + '.hstr' with open(path, 'rb') as fin: @@ -57,7 +57,7 @@ class History: new_path = directory + self._name + '.hstr' with open(path, 'rb') as fin: data = fin.read() - encr = ToxEncryptSave.get_instance() + encr = ToxES.get_instance() if encr.has_password(): data = encr.pass_encrypt(data) with open(new_path, 'wb') as fout: diff --git a/toxygen/main.py b/toxygen/main.py index 8980d71..99622a9 100644 --- a/toxygen/main.py +++ b/toxygen/main.py @@ -12,7 +12,7 @@ from callbacks import init_callbacks, stop, start from util import curr_directory, program_version, remove, is_64_bit import styles.style import platform -import toxencryptsave +import toxes from passwordscreen import PasswordScreen, UnlockAppScreen, SetProfilePasswordScreen from plugin_support import PluginLoader import updater @@ -37,7 +37,7 @@ class Toxygen: Show password screen """ tmp = [data] - p = PasswordScreen(toxencryptsave.ToxEncryptSave.get_instance(), tmp) + p = PasswordScreen(toxes.ToxES.get_instance(), tmp) p.show() self.app.connect(self.app, QtCore.SIGNAL("lastWindowClosed()"), self.app, QtCore.SLOT("quit()")) self.app.exec_() @@ -62,7 +62,7 @@ class Toxygen: dark_style = fl.read() app.setStyleSheet(dark_style) - encrypt_save = toxencryptsave.ToxEncryptSave() + encrypt_save = toxes.ToxES() if self.path is not None: path = os.path.dirname(self.path) + '/' @@ -248,7 +248,7 @@ class Toxygen: def correct_pass(): show() Settings.get_instance().locked = False - self.p = UnlockAppScreen(toxencryptsave.ToxEncryptSave.get_instance(), correct_pass) + self.p = UnlockAppScreen(toxes.ToxES.get_instance(), correct_pass) self.p.show() def tray_activated(reason): diff --git a/toxygen/mainscreen.py b/toxygen/mainscreen.py index a112db1..90cea71 100644 --- a/toxygen/mainscreen.py +++ b/toxygen/mainscreen.py @@ -6,6 +6,7 @@ import plugin_support from mainscreen_widgets import * import settings import platform +import toxes class MainWindow(QtGui.QMainWindow, Singleton): @@ -478,7 +479,7 @@ class MainWindow(QtGui.QMainWindow, Singleton): msgBox.exec_() def lock_app(self): - if toxencryptsave.ToxEncryptSave.get_instance().has_password(): + if toxes.ToxES.get_instance().has_password(): Settings.get_instance().locked = True self.hide() else: diff --git a/toxygen/menu.py b/toxygen/menu.py index 4220c70..1fe22cb 100644 --- a/toxygen/menu.py +++ b/toxygen/menu.py @@ -7,7 +7,7 @@ from profile import Profile from util import curr_directory, copy from widgets import CenteredWidget, DataLabel, LineEdit import pyaudio -import toxencryptsave +import toxes import plugin_support import updater @@ -215,7 +215,7 @@ class ProfileSettings(CenteredWidget): def new_password(self): if self.password.text() == self.confirm_password.text(): if not len(self.password.text()) or len(self.password.text()) >= 8: - e = toxencryptsave.ToxEncryptSave.get_instance() + e = toxes.ToxES.get_instance() e.set_password(self.password.text()) self.close() else: diff --git a/toxygen/plugin_support.py b/toxygen/plugin_support.py index 2424f4a..19ccb8e 100644 --- a/toxygen/plugin_support.py +++ b/toxygen/plugin_support.py @@ -4,7 +4,7 @@ import os import importlib import inspect import plugins.plugin_super_class as pl -import toxencryptsave +import toxes import sys @@ -16,7 +16,7 @@ class PluginLoader(util.Singleton): self._settings = settings self._plugins = {} # dict. key - plugin unique short name, value - tuple (plugin instance, is active) self._tox = tox - self._encr = toxencryptsave.ToxEncryptSave.get_instance() + self._encr = toxes.ToxES.get_instance() def set_tox(self, tox): """ diff --git a/toxygen/plugins/plugin_super_class.py b/toxygen/plugins/plugin_super_class.py index b75510b..8192b78 100644 --- a/toxygen/plugins/plugin_super_class.py +++ b/toxygen/plugins/plugin_super_class.py @@ -43,7 +43,7 @@ class PluginSuperClass: :param tox: tox instance :param profile: profile instance :param settings: profile settings - :param encrypt_save: LibToxEncryptSave instance. + :param encrypt_save: ToxES instance. """ self._settings = settings self._profile = profile diff --git a/toxygen/settings.py b/toxygen/settings.py index 2b6bef4..402c097 100644 --- a/toxygen/settings.py +++ b/toxygen/settings.py @@ -3,7 +3,7 @@ import json import os from util import Singleton, curr_directory, log, copy, append_slash import pyaudio -from toxencryptsave import ToxEncryptSave +from toxes import ToxES import smileys @@ -19,7 +19,7 @@ class Settings(dict, Singleton): if os.path.isfile(self.path): with open(self.path, 'rb') as fl: data = fl.read() - inst = ToxEncryptSave.get_instance() + inst = ToxES.get_instance() try: if inst.is_data_encrypted(data): data = inst.pass_decrypt(data) @@ -167,7 +167,7 @@ class Settings(dict, Singleton): def save(self): text = json.dumps(self) - inst = ToxEncryptSave.get_instance() + inst = ToxES.get_instance() if inst.has_password(): text = bytes(inst.pass_encrypt(bytes(text, 'utf-8'))) else: @@ -252,7 +252,7 @@ class ProfileHelper(Singleton): return self._directory def save_profile(self, data): - inst = ToxEncryptSave.get_instance() + inst = ToxES.get_instance() if inst.has_password(): data = inst.pass_encrypt(data) with open(self._path, 'wb') as fl: diff --git a/toxygen/toxencryptsave.py b/toxygen/toxencryptsave.py index 350394c..4af4783 100644 --- a/toxygen/toxencryptsave.py +++ b/toxygen/toxencryptsave.py @@ -1,56 +1,13 @@ import libtox -import util from ctypes import c_size_t, create_string_buffer, byref, c_int, ArgumentError, c_char_p, c_bool +from toxencryptsave_enums_and_consts import * -TOX_ERR_ENCRYPTION = { - # The function returned successfully. - 'OK': 0, - # Some input data, or maybe the output pointer, was null. - 'NULL': 1, - # The crypto lib was unable to derive a key from the given passphrase, which is usually a lack of memory issue. The - # functions accepting keys do not produce this error. - 'KEY_DERIVATION_FAILED': 2, - # The encryption itself failed. - 'FAILED': 3 -} - -TOX_ERR_DECRYPTION = { - # The function returned successfully. - 'OK': 0, - # Some input data, or maybe the output pointer, was null. - 'NULL': 1, - # The input data was shorter than TOX_PASS_ENCRYPTION_EXTRA_LENGTH bytes - 'INVALID_LENGTH': 2, - # The input data is missing the magic number (i.e. wasn't created by this module, or is corrupted) - 'BAD_FORMAT': 3, - # The crypto lib was unable to derive a key from the given passphrase, which is usually a lack of memory issue. The - # functions accepting keys do not produce this error. - 'KEY_DERIVATION_FAILED': 4, - # The encrypted byte array could not be decrypted. Either the data was corrupt or the password/key was incorrect. - 'FAILED': 5, -} - -TOX_PASS_ENCRYPTION_EXTRA_LENGTH = 80 - -# TODO: move logic to separate class - - -class ToxEncryptSave(util.Singleton): +class ToxEncryptSave: def __init__(self): super().__init__() self.libtoxencryptsave = libtox.LibToxEncryptSave() - self._passphrase = None - - def set_password(self, passphrase): - self._passphrase = passphrase - - def has_password(self): - return bool(self._passphrase) - - def is_password(self, password): - return self._passphrase == password def is_data_encrypted(self, data): func = self.libtoxencryptsave.tox_is_data_encrypted @@ -58,9 +15,9 @@ class ToxEncryptSave(util.Singleton): result = func(c_char_p(bytes(data))) return result - def pass_encrypt(self, data): + def pass_encrypt(self, data, password): """ - Encrypts the given data with the given passphrase. + Encrypts the given data with the given password. :return: output array """ @@ -68,8 +25,8 @@ class ToxEncryptSave(util.Singleton): tox_err_encryption = c_int() self.libtoxencryptsave.tox_pass_encrypt(c_char_p(data), c_size_t(len(data)), - c_char_p(bytes(self._passphrase, 'utf-8')), - c_size_t(len(self._passphrase)), + c_char_p(bytes(password, 'utf-8')), + c_size_t(len(password)), out, byref(tox_err_encryption)) tox_err_encryption = tox_err_encryption.value @@ -83,9 +40,9 @@ class ToxEncryptSave(util.Singleton): elif tox_err_encryption == TOX_ERR_ENCRYPTION['FAILED']: raise RuntimeError('The encryption itself failed.') - def pass_decrypt(self, data): + def pass_decrypt(self, data, password): """ - Decrypts the given data with the given passphrase. + Decrypts the given data with the given password. :return: output array """ @@ -93,8 +50,8 @@ class ToxEncryptSave(util.Singleton): tox_err_decryption = c_int() self.libtoxencryptsave.tox_pass_decrypt(c_char_p(bytes(data)), c_size_t(len(data)), - c_char_p(bytes(self._passphrase, 'utf-8')), - c_size_t(len(self._passphrase)), + c_char_p(bytes(password, 'utf-8')), + c_size_t(len(password)), out, byref(tox_err_decryption)) tox_err_decryption = tox_err_decryption.value diff --git a/toxygen/toxencryptsave_enums_and_consts.py b/toxygen/toxencryptsave_enums_and_consts.py new file mode 100644 index 0000000..cf795f8 --- /dev/null +++ b/toxygen/toxencryptsave_enums_and_consts.py @@ -0,0 +1,29 @@ +TOX_ERR_ENCRYPTION = { + # The function returned successfully. + 'OK': 0, + # Some input data, or maybe the output pointer, was null. + 'NULL': 1, + # The crypto lib was unable to derive a key from the given passphrase, which is usually a lack of memory issue. The + # functions accepting keys do not produce this error. + 'KEY_DERIVATION_FAILED': 2, + # The encryption itself failed. + 'FAILED': 3 +} + +TOX_ERR_DECRYPTION = { + # The function returned successfully. + 'OK': 0, + # Some input data, or maybe the output pointer, was null. + 'NULL': 1, + # The input data was shorter than TOX_PASS_ENCRYPTION_EXTRA_LENGTH bytes + 'INVALID_LENGTH': 2, + # The input data is missing the magic number (i.e. wasn't created by this module, or is corrupted) + 'BAD_FORMAT': 3, + # The crypto lib was unable to derive a key from the given passphrase, which is usually a lack of memory issue. The + # functions accepting keys do not produce this error. + 'KEY_DERIVATION_FAILED': 4, + # The encrypted byte array could not be decrypted. Either the data was corrupt or the password/key was incorrect. + 'FAILED': 5, +} + +TOX_PASS_ENCRYPTION_EXTRA_LENGTH = 80 diff --git a/toxygen/toxes.py b/toxygen/toxes.py new file mode 100644 index 0000000..5b7282f --- /dev/null +++ b/toxygen/toxes.py @@ -0,0 +1,28 @@ +import util +import toxencryptsave + + +class ToxES(util.Singleton): + + def __init__(self): + super().__init__() + self._toxencryptsave = toxencryptsave.ToxEncryptSave() + self._passphrase = None + + def set_password(self, passphrase): + self._passphrase = passphrase + + def has_password(self): + return bool(self._passphrase) + + def is_password(self, password): + return self._passphrase == password + + def is_data_encrypted(self, data): + return len(data) > 0 and self._toxencryptsave.is_data_encrypted(data) + + def pass_encrypt(self, data): + return self._toxencryptsave.pass_encrypt(data, self._passphrase) + + def pass_decrypt(self, data): + return self._toxencryptsave.pass_decrypt(data, self._passphrase)