From 0fa7ca7b5c8caf3434752b2b2ebfa50d9122545c Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sun, 15 May 2016 19:54:44 +0300 Subject: [PATCH] encrypted .tox files support --- src/main.py | 15 ++++++++++++--- src/menu.py | 17 +++++++++++------ src/passwordscreen.py | 33 +++++++++++++++++++++++++-------- src/settings.py | 5 ++++- 4 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/main.py b/src/main.py index 6e09624..6b784ae 100644 --- a/src/main.py +++ b/src/main.py @@ -10,6 +10,7 @@ from util import curr_directory, get_style import styles.style import locale import toxencryptsave +from passwordscreen import PasswordScreen class Toxygen(object): @@ -19,12 +20,19 @@ class Toxygen(object): self.tox = self.ms = self.init = self.mainloop = self.avloop = None self.path = path - def enter_pass(self, old_data): + def enter_pass(self, data): """ Show password screen """ - # TODO: show password screen and decrypt data - raise NotImplementedError() + tmp = [data] + p = PasswordScreen(toxencryptsave.LibToxEncryptSave.get_instance(), tmp) + p.show() + self.app.connect(self.app, QtCore.SIGNAL("lastWindowClosed()"), self.app, QtCore.SLOT("quit()")) + self.app.exec_() + if tmp[0] == data: + raise SystemExit() + else: + return tmp[0] def main(self): """ @@ -32,6 +40,7 @@ class Toxygen(object): """ app = QtGui.QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon(curr_directory() + '/images/icon.png')) + self.app = app # application color scheme with open(curr_directory() + '/styles/style.qss') as fl: diff --git a/src/menu.py b/src/menu.py index c95e6e6..e0b256e 100644 --- a/src/menu.py +++ b/src/menu.py @@ -145,10 +145,10 @@ class ProfileSettings(CenteredWidget): self.not_match = QtGui.QLabel(self) self.not_match.setGeometry(QtCore.QRect(340, 400, 300, 30)) self.not_match.setVisible(False) - self.not_match.setStyleSheet('QLabel { color: red; }') + self.not_match.setStyleSheet('QLabel { color: #F70D1A; }') self.warning = QtGui.QLabel(self) self.warning.setGeometry(QtCore.QRect(30, 490, 500, 30)) - self.warning.setStyleSheet('QLabel { color: red; }') + self.warning.setStyleSheet('QLabel { color: #F70D1A; }') self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) @@ -225,10 +225,10 @@ class NetworkSettings(CenteredWidget): def initUI(self): self.setObjectName("NetworkSettings") - self.resize(300, 300) - self.setMinimumSize(QtCore.QSize(300, 300)) - self.setMaximumSize(QtCore.QSize(300, 300)) - self.setBaseSize(QtCore.QSize(300, 300)) + self.resize(300, 330) + self.setMinimumSize(QtCore.QSize(300, 330)) + self.setMaximumSize(QtCore.QSize(300, 330)) + self.setBaseSize(QtCore.QSize(300, 330)) self.ipv = QtGui.QCheckBox(self) self.ipv.setGeometry(QtCore.QRect(20, 10, 97, 22)) self.ipv.setObjectName("ipv") @@ -260,6 +260,9 @@ class NetworkSettings(CenteredWidget): self.proxyip.setText(settings['proxy_host']) self.proxyport.setText(unicode(settings['proxy_port'])) self.http.setChecked(settings['proxy_type'] == 1) + self.warning = QtGui.QLabel(self) + self.warning.setGeometry(QtCore.QRect(40, 270, 200, 60)) + self.warning.setStyleSheet('QLabel { color: #F70D1A; }') self.retranslateUi() self.proxy.stateChanged.connect(lambda x: self.activate()) self.activate() @@ -274,6 +277,8 @@ class NetworkSettings(CenteredWidget): self.label_2.setText(QtGui.QApplication.translate("Form", "Port:", None, QtGui.QApplication.UnicodeUTF8)) self.reconnect.setText(QtGui.QApplication.translate("NetworkSettings", "Restart TOX core", None, QtGui.QApplication.UnicodeUTF8)) self.http.setText(QtGui.QApplication.translate("Form", "HTTP", None, QtGui.QApplication.UnicodeUTF8)) + self.warning.setText(QtGui.QApplication.translate("Form", "WARNING:\nusing proxy with enabled UDP\ncan produce IP leak", + None, QtGui.QApplication.UnicodeUTF8)) def activate(self): bl = self.proxy.isChecked() diff --git a/src/passwordscreen.py b/src/passwordscreen.py index 4e4da53..0d666ad 100644 --- a/src/passwordscreen.py +++ b/src/passwordscreen.py @@ -1,36 +1,53 @@ from widgets import CenteredWidget from PySide import QtCore, QtGui -# TODO: add onclick - class PasswordScreen(CenteredWidget): - def __init__(self, encrypt): + def __init__(self, encrypt, data): super(PasswordScreen, self).__init__() self._encrypt = encrypt + self._data = data self.initUI() def initUI(self): - self.resize(360, 200) - self.setMinimumSize(QtCore.QSize(360, 200)) - self.setMaximumSize(QtCore.QSize(360, 200)) + self.resize(360, 170) + self.setMinimumSize(QtCore.QSize(360, 170)) + self.setMaximumSize(QtCore.QSize(360, 170)) self.enter_pass = QtGui.QLabel(self) self.enter_pass.setGeometry(QtCore.QRect(30, 10, 300, 30)) self.password = QtGui.QLineEdit(self) - self.password.setGeometry(QtCore.QRect(30, 80, 300, 30)) + self.password.setGeometry(QtCore.QRect(30, 50, 300, 30)) self.password.setEchoMode(QtGui.QLineEdit.EchoMode.Password) self.button = QtGui.QPushButton(self) - self.button.setGeometry(QtCore.QRect(30, 120, 300, 30)) + self.button.setGeometry(QtCore.QRect(30, 90, 300, 30)) self.button.setText('OK') + self.button.clicked.connect(self.button_click) + + self.warning = QtGui.QLabel(self) + self.warning.setGeometry(QtCore.QRect(30, 130, 300, 30)) + self.warning.setStyleSheet('QLabel { color: #F70D1A; }') + self.warning.setVisible(False) self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) + def button_click(self): + if self.password.text(): + try: + self._encrypt.set_password(self.password.text()) + new_data = self._encrypt.pass_decrypt(self._data[0]) + except RuntimeError: + self.warning.setVisible(True) + else: + self._data[0] = new_data + self.close() + def retranslateUi(self): self.setWindowTitle(QtGui.QApplication.translate("pass", "Enter password", None, QtGui.QApplication.UnicodeUTF8)) self.enter_pass.setText(QtGui.QApplication.translate("pass", "Password:", None, QtGui.QApplication.UnicodeUTF8)) + self.warning.setText(QtGui.QApplication.translate("pass", "Incorrect password", None, QtGui.QApplication.UnicodeUTF8)) diff --git a/src/settings.py b/src/settings.py index e6411c6..5ec3de7 100644 --- a/src/settings.py +++ b/src/settings.py @@ -4,6 +4,7 @@ import os import locale from util import Singleton, curr_directory, log import pyaudio +from toxencryptsave import LibToxEncryptSave class Settings(Singleton, dict): @@ -145,7 +146,6 @@ class Settings(Singleton, dict): return os.getenv('APPDATA') + '/Tox/' -# TODO: encrypted profiles support class ProfileHelper(Singleton): """ Class with methods for search, load and save profiles @@ -171,6 +171,9 @@ class ProfileHelper(Singleton): return self._directory def save_profile(self, data): + inst = LibToxEncryptSave.get_instance() + if inst.has_password(): + data = inst.pass_encrypt(data) with open(self._path, 'wb') as fl: fl.write(data) print 'Profile saved successfully'