class PyDead(QMainWindow): def __init__(self): super().__init__() self.directory = '' self.layout = QVBoxLayout() # Set some main window's properties self.setWindowTitle('PyDead') self.setFixedSize(600, 350) self.centralWidget = QWidget(self) self.setCentralWidget(self.centralWidget) self.encrypt_UI_components() self.decrypt_UI_components() def encrypt_UI_components(self): """Create and add the encryption UI components to the layout""" label_1 = QLabel('Choose a directory to be encrypted then shredded: ') label_1.setFont(QFont('Arial', 14, weight=QFont.Bold)) label_1.setAlignment(Qt.AlignCenter) self.directory_button = QPushButton('Choose a directory') self.directory_button.clicked.connect(self.get_dir) label_2 = QLabel('Enter a strong password: '******'Arial', 12)) self.password = PasswordEdit() start_button = QPushButton('Start encrypting') start_button.clicked.connect(self.start_encrypting) self.layout.addWidget(label_1, alignment=Qt.AlignVCenter) self.layout.addWidget(self.directory_button, alignment=Qt.AlignVCenter) self.layout.addWidget(label_2, alignment=Qt.AlignVCenter) self.layout.addWidget(self.password) self.layout.addWidget(start_button, alignment=Qt.AlignVCenter) self.centralWidget.setLayout(self.layout) def decrypt_UI_components(self): """Create and add the decryption UI components to the layout""" line = QLabel('=' * 250) line.setFont(QFont('Arial', 14, weight=QFont.Bold)) line.setAlignment(Qt.AlignCenter) self.layout.addWidget(line) decrypt_label = QLabel('Or Choose a file to decrypt: ') decrypt_label.setFont(QFont('Arial', 14, weight=QFont.Bold)) decrypt_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(decrypt_label) self.file_button = QPushButton('Choose a file') self.file_button.clicked.connect(self.get_file) self.layout.addWidget(self.file_button) self.decryption_password = PasswordEdit() self.layout.addWidget(self.decryption_password) self.decrypt_button = QPushButton('decrypt') self.decrypt_button.clicked.connect(self.decrypt) self.layout.addWidget(self.decrypt_button) # The hide button self.hide_button = QPushButton('hide') self.hide_button.clicked.connect(self.hide) self.layout.addWidget(self.hide_button) def get_file(self): self.file = QFileDialog.getOpenFileName(self, "Choose a File to Decrypt", "AES files (*.aes)") if self.file: self.file_button.setText('{}'.format(self.file[0])) def get_dir(self): self.directory = str( QFileDialog.getExistingDirectory(self, "Choose a Directory to Encrypt")) if self.directory: self.directory_button.setText('{}'.format(self.directory)) def start_encrypting(self): """Check if there are directory and password selected, then clear the password field, then compress,shred and encrypt the compressed file""" if (self.directory) and (self.password.text()): self.captured_encrypt_pass = self.password.text() self.password.clear() QtTest.QTest.qWait(5 * 1000) compress(self.directory) shred(self.directory) encrypt(self.captured_encrypt_pass) alert = QMessageBox() alert.setText('Done') alert.exec_() else: alert = QMessageBox() alert.setText('Choose a directory and password first') alert.exec_() def decrypt(self): if self.file and self.decryption_password.text(): print(self.decryption_password.text()) self.captured_decrypt_pass = self.decryption_password.text() self.decryption_password.clear() try: decrypt(self.captured_decrypt_pass) except ValueError: print('--> Wrong password') alert = QMessageBox() alert.setText('Decrypted :)') alert.exec_() else: alert = QMessageBox() alert.setText('Choose an AES file and password first please') alert.exec_()
class Login(QWidget): accesso_utente = None autorizzazione_accesso = None def __init__(self, parent=None): super(Login, self).__init__(parent) self.setWindowTitle('Login - Centro Polisportivo') self.setFixedSize(380, 300) self.controller = ControlloreListaDipendenti() self.setStyleSheet("background-color: Azure;") self.lista_suggerimenti = [] for dipendente in self.controller.get_lista_dipendenti(): nome = dipendente.id self.lista_suggerimenti.append(nome) # definisco un layout verticale per il login login_layout = QVBoxLayout() login_layout.setAlignment(Qt.AlignCenter) login_layout.setSpacing(25) # definisco un layout orizzontale per i pulsanti btn_layout = QHBoxLayout() # creazione campi inserimento username labelUsername = QLabel('<font size = "5"> <b> Username </b> </font>') self.username = QLineEdit() self.username.setCompleter(QCompleter(self.lista_suggerimenti)) #self.username.setStyleSheet("background-color: #ffffff; font-size: 20px;") self.impostaGrandezzaMassima(self.username) self.username.setPlaceholderText('Inserisci username - id') # creazione campi inserimento password labelPassword = QLabel('<font size = "5"> <b> Password </b> </font>') self.password = PasswordEdit() #self.password.setStyleSheet("background-color: #ffffff; font-size: 20px;") self.impostaGrandezzaMassima(self.password) self.password.setPlaceholderText('Inserisci password') # creazione pulsante del login btn_login = QPushButton('Login') btn_login.setStyleSheet( "background-color: #b0c4de; font-size: 15px; font-weight: bold;") self.impostaGrandezzaMassima(btn_login) btn_login.setShortcut("Return") btn_login.clicked.connect(self.check_credenziali) # creazione pulsante esci btn_esci = QPushButton('Esci') btn_esci.setStyleSheet( "background-color: #b0c4de; font-size: 15px; font-weight: bold;") btn_esci.setShortcut("Esc") self.impostaGrandezzaMassima(btn_esci) btn_esci.clicked.connect(self.close) # aggiunta pulsanti al layout dei pulsanti btn_layout.addWidget(btn_login) btn_layout.addWidget(btn_esci) # aggiunta username al layout login_layout.addWidget(labelUsername) login_layout.addWidget(self.username) # aggiunta password al layout login_layout.addWidget(labelPassword) login_layout.addWidget(self.password) # aggiunta layout pulsanti al layout principale login_layout.addLayout(btn_layout) # setting del layout della finestra self.setLayout(login_layout) # funzione che esegue la verifica dell'utente e l'accesso all'area di competenza def check_credenziali(self): msg = QMessageBox() i = 0 if self.username.text() == Amministratore().get_username( ) and self.password.text() == Amministratore().get_password(): Login.autorizzazione_accesso = "Amministratore" self.close() self.vistahome = VistaHome() self.vistahome.show() else: for dipendente in self.controller.get_lista_dipendenti(): i += 1 if self.password.text( ) == dipendente.password and self.username.text( ) == dipendente.id: if dipendente.abilitazione == "Personal Trainer": Login.autorizzazione_accesso = "Personal Trainer" if dipendente.abilitazione == "Collaboratore": Login.autorizzazione_accesso = "Collaboratore" Login.accesso_utente = dipendente self.close() self.vistahome = VistaHome() self.vistahome.show() break if i == (len(self.controller.get_lista_dipendenti())) and ( self.password.text() != dipendente.password or self.username.text() != dipendente.id): if Login.autorizzazione_accesso == None: msg.setWindowTitle("Login errato") msg.setText('Password o Username errati. Riprova!') msg.exec_() # in caso di mancata autenticazione i campi di inserimento vengono resettati self.password.setText("") self.username.setText("") #imposta la grandezza massima di un "oggetto" def impostaGrandezzaMassima(self, oggetto): oggetto.setMinimumSize(25, 25)
class SettingsWindow(QWidget): def __init__(self, translation): super().__init__() layout = QVBoxLayout() self.chosen_algo = "" self.chosen_hash = "" self.chosen_salt = "" self.chosen_key = "" self.window = None self.settings_translate = translation enc_key = self.settings_translate["buttons"]["encryption_key_prompt"] enc_key_confirm = self.settings_translate["buttons"][ "encryption_key_confirm"] algorithm = self.settings_translate["buttons"]["algorithm"] salt_select = self.settings_translate["buttons"]["salt_select"] self.automatic_salt = self.settings_translate["buttons"][ "automatic_salt"] self.click_salt = self.settings_translate["buttons"]["click_salt"] self.write_salt = self.settings_translate["buttons"]["write_salt"] hash = self.settings_translate["buttons"]["hash"] salt = self.settings_translate["buttons"]["salt"] close_btn = self.settings_translate["prompts"]["close_button"] self.setWindowIcon(QIcon(IMG_LOCATION + "win_icon.png")) self.setWindowTitle("Set default encryption settings") self.hash = QPushButton(hash) self.algorithm = QPushButton(algorithm) self.salt_selection = QPushButton(salt_select) self.text_box_salt = PasswordEdit(self) self.text_box_salt.setPlaceholderText(salt) self.text_box_enc_text = PasswordEdit(self) self.text_box_enc_text.setPlaceholderText(enc_key) self.text_box_enc_text_confirm = PasswordEdit(self) self.text_box_enc_text_confirm.setPlaceholderText(enc_key_confirm) self.close_button = QPushButton(close_btn) self.close_button.clicked.connect(self.close_settings) # Define Hash functions menu self.menu = QMenu(self) self.menu.setObjectName("default_hash_menu") self.menu.addAction("MD5") self.menu.addSeparator() self.menu.addAction("SHA-256") self.menu.addSeparator() self.menu.addAction("SHA-512") self.menu.addSeparator() self.menu.addAction("SHA3-512") self.hash.setMenu(self.menu) self.menu.triggered.connect(self.hashes) # Define Algorithms functions menu self.menu_algo = QMenu(self) self.menu_algo.setObjectName("default_algo_menu") self.menu_algo.addAction("ChaCha20") self.menu_algo.addSeparator() self.menu_algo.addAction("RSA") self.menu_algo.addSeparator() self.menu_algo.addAction("AES") self.algorithm.setMenu(self.menu_algo) self.menu_algo.triggered.connect(self.algorithms) # Define Salt type functions menu self.salt_selection_menu = QMenu(self) self.salt_selection_menu.setObjectName("default_salt_menu") self.salt_selection_menu.addAction(self.automatic_salt) self.salt_selection_menu.addSeparator() self.salt_selection_menu.addAction(self.click_salt) self.salt_selection_menu.addSeparator() self.salt_selection_menu.addAction(self.write_salt) self.salt_selection.setMenu(self.salt_selection_menu) self.salt_selection_menu.triggered.connect(self.choose_salt) layout.addWidget(self.hash) layout.addWidget(self.algorithm) layout.addWidget(self.salt_selection) # layout.addWidget(self.salt) layout.addWidget(self.text_box_salt) layout.addWidget(self.text_box_enc_text) layout.addWidget(self.text_box_enc_text_confirm) layout.addSpacing(50) layout.addWidget(self.close_button) self.setLayout(layout) self.Width = 700 self.height = int(0.8 * self.Width) self.setFixedSize(self.Width, self.height) # center the window relative to screensize centering = self.frameGeometry() centerOfScreen = QDesktopWidget().availableGeometry().center() centering.moveCenter(centerOfScreen) self.move(centering.topLeft()) def hashes(self, language): self.chosen_hash = language.text() self.hash.setText(self.chosen_hash) print(language.text()) return language def algorithms(self, language): self.chosen_algo = language.text() print(language.text()) print(self.chosen_salt) self.algorithm.setText(self.chosen_algo) return language def choose_salt(self, salt_type): print("Chosen salt type: ", salt_type.text()) if salt_type.text() == self.write_salt: self.text_box_salt.setFocus() self.salt_selection.setText(self.write_salt) return if salt_type.text() == self.automatic_salt: salt_gen = generate_salt.salt_generator().generate_salt() self.text_box_salt.setText(salt_gen) self.salt_selection.setText(self.automatic_salt) return self.salt_selection.setText(self.click_salt) self.window = salt_generation.SaltWindow(self.settings_translate, self) self.window.show() def close_settings(self, event): pwd_mismatch = self.settings_translate["prompts"]["password_mismatch"] confirm_no_enc_key_set = self.settings_translate["prompts"][ "confirm_no_password"] no_enc_key_prompt = self.settings_translate["prompts"]["no_enc_key"] print("Chosen algorithm: ", self.chosen_algo) print("Chosen salt: ", self.text_box_salt.text()) print("Chosen enc key: ", self.text_box_enc_text.text()) print("Chosen enc key: ", self.text_box_enc_text_confirm.text()) if str(self.text_box_enc_text.text()) == str( self.text_box_enc_text_confirm.text()): if (str(self.text_box_enc_text.text()) == "" and str(self.text_box_enc_text_confirm.text()) == ""): confirm_no_pwd = QMessageBox.question( self, no_enc_key_prompt, confirm_no_enc_key_set, QMessageBox.Yes | QMessageBox.No, ) if confirm_no_pwd == QMessageBox.Yes: defaults = { "hash": "", "algorithm": "", "salt": "", "key": "" } if self.chosen_hash != "": defaults["hash"] = self.chosen_hash if self.chosen_algo != "": defaults["algorithm"] = self.chosen_algo if self.text_box_salt.text() != "": defaults["salt"] = self.text_box_salt.text() if self.text_box_enc_text.text() != "": defaults["key"] = self.text_box_enc_text.text() write_encryption_defaults( db_location, ( defaults["hash"], defaults["algorithm"], defaults["salt"], defaults["key"], ), ) self.close() return return if (str(self.text_box_enc_text.text()) == "" and str(self.text_box_enc_text_confirm.text()) == ""): msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(pwd_mismatch) display = msg.exec_() return if str(self.text_box_enc_text.text()) != str( self.text_box_enc_text_confirm.text()): msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(pwd_mismatch) display = msg.exec_() return defaults = {"hash": "", "algorithm": "", "salt": "", "key": ""} if self.chosen_hash != "": defaults["hash"] = self.chosen_hash if self.chosen_algo != "": defaults["algorithm"] = self.chosen_algo if self.text_box_salt.text() != "": defaults["salt"] = self.text_box_salt.text() if self.text_box_enc_text.text() != "": defaults["key"] = self.text_box_enc_text.text() write_encryption_defaults( db_location, ( defaults["hash"], defaults["algorithm"], defaults["salt"], defaults["key"], ), ) self.close()
class LoginDialog(QDialog): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle(constants.LOGIN_DIALOG_TITLE) self.setFixedSize(constants.LOGIN_WINDOW_WIDTH, constants.LOGIN_WINDOW_HEIGHT) self.login_label = QLabel(constants.LOGIN_LABEL_TEXT, self) self.status_label = QLabel(self) self.password_label = QLabel(constants.PASSWORD_LABEL_TEXT, self) self.login_edit = QLineEdit(self) self.password_edit = PasswordEdit(True, self) self.login_button = QPushButton(constants.LOGIN_BUTTON_TEXT, self) self.register_button = QPushButton(constants.REGISTER_BUTTON_TEXT, self) self.login_label.resize(self.login_label.sizeHint()) self.password_label.resize(self.password_label.sizeHint()) self.register_button.resize(self.register_button.sizeHint()) self.login_button.resize(self.register_button.size()) self.login_edit.setValidator( QRegExpValidator(QRegExp("[a-zA-Z0-9_]*", False))) self.password_edit.setValidator( QRegExpValidator(QRegExp("[^\s]*", False))) self.login_edit.move(constants.LOGIN_WIDGET_X_OFFSET, constants.LOGIN_WIDGET_Y_OFFSET * 2) self.password_edit.move(constants.LOGIN_WIDGET_X_OFFSET, offset_y(self.login_edit)) self.login_button.move(constants.LOGIN_WIDGET_X_OFFSET, offset_y(self.password_edit)) self.register_button.move(offset_x(self.login_button), offset_y(self.password_edit)) self.status_label.move(constants.LOGIN_WIDGET_X_OFFSET, offset_y(self.login_button)) self.login_edit.resize(self.register_button.pos().x() * 2, constants.LOGIN_EDITS_HEIGHT) self.password_edit.resize(self.login_edit.width(), constants.LOGIN_EDITS_HEIGHT) self.login_label.move(constants.LOGIN_WIDGET_X_OFFSET, offset_y(self.login_edit, offset=0, down=False)) self.password_label.move( constants.LOGIN_WIDGET_X_OFFSET, offset_y(self.password_edit, offset=0, down=False)) self.accepted.connect(self.accepted_event) self.rejected.connect(self.rejected_event) self.login_button.clicked.connect(self.login_clicked) self.register_button.clicked.connect(self.register_clicked) self.api_client = None def exec(self, *args, **kwargs): super().exec(*args, **kwargs) return self.api_client def rejected_event(self): sys.exit() def accepted_event(self): self.close() def get_creds(self): login = self.login_edit.text() password = self.password_edit.text() self.api_client = ApiClient(login, password) return login, password def check_creds(self, login, password): if login and password: return True self.label_error(constants.NO_LOGIN_OR_PASSWORD) return False def label_error(self, message): self.status_label.setStyleSheet("color: red") self.status_label.setText(message) self.status_label.resize(self.status_label.sizeHint()) def login_clicked(self): if not self.check_creds(*self.get_creds()): return try: if not self.api_client.req("GET", "register/check").ok: raise ValueError(constants.INCORRECT_CREDS) except ValueError as e: self.label_error(str(e)) return except Exception as e: self.label_error(constants.SERVER_ERROR) return self.accept() def register_clicked(self): login, password = self.get_creds() if not self.check_creds(login, password): return request_json = {"credentials": {"login": login, "password": password}} try: if not self.api_client.req("POST", "register", json=request_json).ok: raise ValueError(constants.ALREADY_REGISTERED) except ValueError as e: self.label_error(str(e)) return except Exception: self.label_error(constants.SERVER_ERROR) return self.accept()
class VistaLogin(QWidget): def __init__(self, parent=None): super(VistaLogin, self).__init__(parent) self.controllore = ControlloreListaClienti() self.font = QFont("Arial", 15, 15, True) self.v_layout = QVBoxLayout() # titolo self.label_alto = QLabel("Inserisci i dati per il login: "******"color: rgb(0, 0, 255)") self.v_layout.addWidget(self.label_alto) self.v_layout.addSpacing(20) # campo email self.label_email = QLabel("E-mail") self.label_email.setFont(self.font) self.v_layout.addWidget(self.label_email) self.campo_email = QLineEdit() self.campo_email.setFont(self.font) self.v_layout.addSpacing(5) self.v_layout.addWidget(self.campo_email) self.v_layout.addSpacing(10) # campo password self.label_password = QLabel("Password") self.label_password.setFont(self.font) self.v_layout.addWidget(self.label_password) self.campo_password = PasswordEdit() self.campo_password.setFont(self.font) self.campo_password.setEchoMode(QLineEdit.Password) self.v_layout.addSpacing(5) self.v_layout.addWidget(self.campo_password) self.v_layout.addSpacing(20) # bottone login self.bottone_login = QPushButton("Login") self.bottone_login.setFont(self.font) self.bottone_login.setStyleSheet("background-color:#ccd9ff;") self.bottone_login.clicked.connect(self.login) self.shortcut_open = QShortcut(QKeySequence('Return'), self) self.shortcut_open.activated.connect(self.login) self.v_layout.addWidget(self.bottone_login) self.setLayout(self.v_layout) self.resize(200, 200) self.setWindowTitle("Login") #Controlla le credenziali inserite dall'utente def login(self): email = self.campo_email.text() password = self.campo_password.text() #Controlla se le credenziali inserite sono quelle di un amministratore if self.controlla_admin(email, password): return #Controlla che le credenziali inserite corrispondano a quelle di un cliente if self.controllore.get_cliente_by_email(email) is not None: da_mostrare = self.controllore.get_cliente_by_email(email) #In caso affermativo visualizza il profilo del cliente if da_mostrare.password == password: self.vista_cliente = VistaCliente( ControlloreCliente(da_mostrare)) self.vista_cliente.show() self.close() #Altrimenti mostra un messaggio di errore else: QMessageBox.critical(self, "Errore", "La password è errata", QMessageBox.Ok, QMessageBox.Ok) else: QMessageBox.critical( self, "Errore", "L'email inserita non è associata ad alcun cliente", QMessageBox.Ok, QMessageBox.Ok) #Controlla che l'email e la password inseriti coincidano con le credenziali di una admin, in caso affermativo #ritorna True e visualizza il profilo dell'amministratore, altrimenti ritorna False def controlla_admin(self, email, password): if os.path.isfile("Amministratore/data/lista_amministratori.json"): with open("Amministratore/data/lista_amministratori.json") as file: lista_admin = json.load(file) for admin in lista_admin: if email == admin["email"] and password == admin[ "password"]: self.vista_admin = VistaAmministratore(admin["nome"]) self.vista_admin.show() self.close() return True return False
class Messenger(QtWidgets.QMainWindow, Ui_Messenger): """ The messenger object acts as the main object and is managed by client. Shows UI and is responsible for UX. UI is separated on 3 main parts, which have their indexes: 0 - Login form, 1 - Registration form, 2 - Chat. Every 5 seconds requests server status. Every second shows new messages, if user logged in. Under main label "Python Messenger" there is server status, which displays whether server is working, if yes, you can hover on it to see full server status. In case of disconnection from server it'll show server-off message and navigate to login form. It's possible to change server IP address in preferences menu. :param translate: properly shows all content :param password_line1: input line with icons to show/hide password entries on login form :param password_line2: input line with icons to show/hide password entries on registration form :param username: user nickname string :param password: user password string :param last_message_time: last time of getting messages, defaults to 0 :param max_text_len: maximum text message length to send in chat, defaults to 250 :param server_IP: server IPv4 string :param message_style: style for messages defined in :func:`get_message_style` :param warning_messages: dict of warning messages defined in :func:`get_warning_messages` :param message_box_text: dict of content for message box defined in :func:`get_message_box_text` :param client_commands: list of dicts with client-side commands defined in :func:`get_client_commands` :param run_client_command: dict, where key is the name of client command and value is the function of this command :param server_commands: list of dicts with server-side commands defined in :func:`get_server_commands` :param run_server_command: dict, where key is the name of server command and value is the function of this command :param timer_get_messages: timer, which every second runs :func:`get_messages` :param timer_get_status: timer, which every 5 seconds runs :func:`get_status` """ def __init__(self, parent=None): """Initialize messenger object.""" super().__init__(parent) self.setupUi(self) self.translate = QtCore.QCoreApplication.translate self.password_line1 = PasswordEdit(True, self.login_page) self.password_line2 = PasswordEdit(True, self.registration_page) self.modify_password_lines() # Connect buttons to the methods. self.send_button.pressed.connect(self.send) self.sign_up_button.pressed.connect(self.sign_up_user) self.login_button.pressed.connect(self.login_user) # Connect actions to the methods. self.action_shortcuts.triggered.connect(self.show_shortcuts_box) self.action_commands.triggered.connect(self.show_commands_box) self.action_about.triggered.connect(self.show_about_box) self.action_contacts.triggered.connect(self.show_contacts_box) self.action_preferences.triggered.connect(self.open_preferences_window) self.action_logout.triggered.connect(self.logout) self.action_close.triggered.connect(self.close) # Filter shortcuts and text overflow. self.plain_text_edit.installEventFilter(self) self.username = None self.password = None self.last_message_time = 0 self.max_text_len = 250 self.server_IP = '0.0.0.0:9000' # Load client content. self.message_style = get_message_style() self.warning_messages = get_warning_messages() self.message_box_text = get_message_box_text() # Load commands. self.client_commands = get_client_commands() self.run_client_command = { 'close': self.close, 'logout': self.logout, 'reload': self.reload } self.server_commands = [] self.run_server_command = {} self.timer_get_messages = QtCore.QTimer() self.timer_get_messages.timeout.connect(self.get_messages) self.timer_get_messages.start(1000) self.timer_get_status = QtCore.QTimer() self.timer_get_status.timeout.connect(self.get_status) self.timer_get_status.start(5000) clickable(self.go_to_sign_up).connect(self.go_to_registration_form) clickable(self.go_to_login).connect(self.go_to_login_form) self.get_status() def eventFilter(self, obj, event): """ Filters Enter key press and message text length. If Enter key pressed, sends user's message. If length of message is above maximum, doesn't allow writing. """ if event.type( ) == QtCore.QEvent.KeyPress and obj is self.plain_text_edit: text = self.plain_text_edit.toPlainText() if event.key( ) == QtCore.Qt.Key_Return and self.plain_text_edit.hasFocus(): self.send() return True elif len(text) > self.max_text_len: text = text[:self.max_text_len] self.plain_text_edit.setPlainText(text) cursor = self.plain_text_edit.textCursor() cursor.setPosition(self.max_text_len) self.plain_text_edit.setTextCursor(cursor) return True return super().eventFilter(obj, event) def closeEvent(self, event): """ Shows question message box for acception or ignoring to close the messenger. Asks user does he really wants to close the messenger, if yes, than marks logout of user and closes the messenger. Otherwise, ignores closing messenger event. :param event: event to close the messenger """ reply = QMessageBox.question(self, 'Quit', self.message_box_text["close"], QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) # User closes the messenger and is logged in. if reply == QMessageBox.Yes and self.stacked_widget.currentIndex( ) == 2: try: post(f'http://{self.server_IP}/logout', json={"username": self.username}, verify=False) except exceptions.RequestException as e: raise SystemExit event.accept() # User closes the messenger and is logged out. elif reply == QMessageBox.Yes: event.accept() else: event.ignore() def logout(self): """ Shows question message box for acception or ignoring to log out from account. Asks user does he really wants to log out, if yes, than marks logout and navigates to login form. Otherwise, ignores logout event. """ reply = QMessageBox.question(self, 'Logout', self.message_box_text["logout"], QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if reply == QMessageBox.Yes: try: post(f'http://{self.server_IP}/logout', json={"username": self.username}, verify=False) except exceptions.RequestException as e: self.show_server_off_box() self.clear_user_data() return self.go_to_login_form() self.clear_user_data() self.action_logout.setEnabled(False) self.action_commands.setEnabled(False) self.action_preferences.setEnabled(True) else: return def modify_password_lines(self): """Modifies and appears password lines.""" geometry = QtCore.QRect(60, 200, 291, 41) font = QFont() font.setPointSize(14) self.password_line1.setGeometry(geometry) self.password_line1.setFont(font) self.password_line1.setEchoMode(QtWidgets.QLineEdit.Password) self.password_line1.setObjectName("password_line1") self.password_line1.setPlaceholderText( self.translate("Messenger", "Password")) self.password_line2.setGeometry(geometry) self.password_line2.setFont(font) self.password_line2.setEchoMode(QtWidgets.QLineEdit.Password) self.password_line2.setObjectName("password_line2") self.password_line2.setPlaceholderText( self.translate("Messenger", "Enter Your Password")) def open_preferences_window(self): """Opens settings window.""" settings = Preferences(self) if settings.exec(): self.server_IP = settings.server_IP.text() def clear_user_data(self): """Clears user data after logout.""" self.username = None self.plain_text_edit.clear() self.text_browser.clear() self.last_message_time = 0 def reload(self): """Reloads all messages and deletes commands output.""" self.text_browser.clear() self.last_message_time = 0 def go_to_registration_form(self): """Navigates to registration menu.""" self.stacked_widget.setCurrentIndex(1) def go_to_login_form(self): """Navigates to login menu.""" self.stacked_widget.setCurrentIndex(0) def go_to_chat(self): """Navigates to chat.""" self.get_server_commands() self.stacked_widget.setCurrentIndex(2) self.action_logout.setEnabled(True) self.action_commands.setEnabled(True) self.action_preferences.setEnabled(False) self.plain_text_edit.setFocus() self.clear_credentials() def clear_credentials(self): """Clears login and password lines after log in or sign up.""" self.password_line1.clear() self.login_line1.clear() self.password_line2.clear() self.login_line2.clear() self.password = None def show_about_box(self): """Shows message box with content about messenger.""" QMessageBox.information(self, 'About', self.message_box_text["about"]) def show_contacts_box(self): """Shows message box with contacts information.""" QMessageBox.information(self, 'Contacts', self.message_box_text["contacts"]) def show_server_off_box(self): """Shows message box about server off information.""" QMessageBox.critical(self, 'Opsss...', self.message_box_text["server_is_off"]) self.go_to_login_form() def show_shortcuts_box(self): """Shows message box with shortcuts.""" QMessageBox.information(self, 'Shortcuts', self.message_box_text["shortcuts"]) def show_commands_box(self): """Shows message box with available commands.""" output = help_client(self.client_commands, self.server_commands, []) output = output.replace('=', '') QMessageBox.information(self, 'Commands', output) def sign_up_user(self): """ Registers user. Verifies correctness of login and password input. Sends request to sign up user. """ # Clear registration form. self.login_error2.setText( self.translate("Messenger", self.warning_messages['empty_str'])) self.password_error2.setText( self.translate("Messenger", self.warning_messages['empty_str'])) self.login_line2.setStyleSheet("border: 1px solid #B8B5B2") self.password_line2.setStyleSheet("border: 1px solid #B8B5B2") self.username = self.login_line2.text() self.password = self.password_line2.text() # Check that form isn't empty. if not self.username: if not self.password: self.login_error2.setText( self.translate("Messenger", self.warning_messages['login_required'])) self.password_error2.setText( self.translate("Messenger", self.warning_messages['password_required'])) self.login_line2.setStyleSheet("border: 1px solid red") self.password_line2.setStyleSheet("border: 1px solid red") return else: self.login_error2.setText( self.translate("Messenger", self.warning_messages['login_required'])) self.login_line2.setStyleSheet("border: 1px solid red") return else: if not self.password: self.password_error2.setText( self.translate("Messenger", self.warning_messages['password_required'])) self.password_line2.setStyleSheet("border: 1px solid red") return if not self.username.isalnum(): self.login_error2.setText( self.translate("Messenger", self.warning_messages['not_alphanumeric'])) self.login_error2.adjustSize() self.login_line2.setStyleSheet("border: 1px solid red") return try: response = post(f'http://{self.server_IP}/sign_up', auth=(self.username, self.password), verify=False) except exceptions.RequestException as e: self.show_server_off_box() self.clear_credentials() return # Process bad request. if response.json()['login_out_of_range']: self.login_error2.setText( self.translate("Messenger", self.warning_messages['login_out_of_range'])) self.login_error2.adjustSize() self.login_line2.setStyleSheet("border: 1px solid red") return elif response.json()['password_out_of_range']: self.password_error2.setText( self.translate("Messenger", self.warning_messages['password_out_of_range'])) self.password_error2.adjustSize() self.password_line2.setStyleSheet("border: 1px solid red") return elif not response.json()['ok']: self.login_error2.setText( self.translate("Messenger", self.warning_messages['registered'])) self.login_error2.adjustSize() self.login_line2.setStyleSheet("border: 1px solid red") return self.go_to_chat() def login_user(self): """ Allows user to log in. Verifies correctness of login and password input. Sends request to authenticate user. """ # Clear login form. self.login_error1.setText( self.translate("Messenger", self.warning_messages['empty_str'])) self.password_error1.setText( self.translate("Messenger", self.warning_messages['empty_str'])) self.login_line1.setStyleSheet("border: 1px solid #B8B5B2") self.password_line1.setStyleSheet("border: 1px solid #B8B5B2") self.username = self.login_line1.text() self.password = self.password_line1.text() # Check that form isn't empty. if not self.username: if not self.password: self.login_error1.setText( self.translate("Messenger", self.warning_messages['login_required'])) self.password_error1.setText( self.translate("Messenger", self.warning_messages['password_required'])) self.login_line1.setStyleSheet("border: 1px solid red") self.password_line1.setStyleSheet("border: 1px solid red") return else: self.login_error1.setText( self.translate("Messenger", self.warning_messages['login_required'])) self.login_line1.setStyleSheet("border: 1px solid red") return else: if not self.password: self.password_error1.setText( self.translate("Messenger", self.warning_messages['password_required'])) self.password_line1.setStyleSheet("border: 1px solid red") return try: response = post(f'http://{self.server_IP}/auth', auth=(self.username, self.password), verify=False) except exceptions.RequestException as e: self.show_server_off_box() self.clear_credentials() return # Process bad request. if not response.json()['exist']: self.login_error1.setText( self.translate("Messenger", self.warning_messages['invalid_login'])) self.login_line1.setStyleSheet("border: 1px solid red") return if not response.json()['match']: self.password_error1.setText( self.translate("Messenger", self.warning_messages['invalid_password'])) self.password_line1.setStyleSheet("border: 1px solid red") return if response.json()['banned']: self.login_error1.setText( self.translate("Messenger", self.warning_messages['banned'])) self.login_line1.setStyleSheet("border: 1px solid red") return self.go_to_chat() def get_server_commands(self): """Sends request to get available server-side commands for user.""" try: response = post(f'http://{self.server_IP}/command', json={ "username": self.username, "command": 'help' }, verify=False) except exceptions.RequestException as e: self.clear_user_data() self.show_server_off_box() return if not response.json()['ok']: self.show_text(response.json()['output'] + "<br>") self.plain_text_edit.clear() return self.server_commands = response.json()['output'] # Connect command name with function. for cmd in self.server_commands: if cmd['name'] != 'help': self.run_server_command[f"{cmd['name']}"] = globals()[ cmd['name']] def send(self): """Separates and directs messages & commands to relevant function.""" self.plain_text_edit.setFocus() text = self.plain_text_edit.toPlainText() text = text.strip() # Validate text don't execute HTML. text = text.replace('</', '') text = text.replace('<', '') text = text.replace('>', '') if len(text) > self.max_text_len: text = text[:self.max_text_len] if not text: return elif text.startswith('/'): self.send_command(text[1:]) else: self.send_message(text) def send_message(self, text): """ Stores message on the server. :param text: text of message """ try: post(f'http://{self.server_IP}/send_message', json={ "username": self.username, "text": text }, verify=False) except exceptions.RequestException as e: self.clear_user_data() self.show_server_off_box() return self.plain_text_edit.clear() self.plain_text_edit.repaint() def send_command(self, cmd_string): """ Executes command. If it's client-side command, executes directly from client. If it's server-side command, sends command to execute on the server and processes the output. :param cmd_string: command with parameters to execute """ command = cmd_string.split()[0] args = cmd_string.split()[1:] if len(cmd_string) > 1 else None # Run client-side command. if command in [cmd['name'] for cmd in self.client_commands]: self.run_client_command.get(command)() self.plain_text_edit.clear() return # Invalid command name. elif command not in [cmd['name'] for cmd in self.server_commands]: self.show_text( f"<b>Error:</b> Command '/{command}' not found.<br>" f"Try '/help' to list all available commands :)<br>") self.plain_text_edit.clear() return # Process 'help' command. elif command == 'help': output = help_client(self.client_commands, self.server_commands, args) self.show_text(output) self.plain_text_edit.clear() return try: response = post(f'http://{self.server_IP}/command', json={ "username": self.username, "command": cmd_string }, verify=False) except exceptions.RequestException as e: self.clear_user_data() self.show_server_off_box() return if not response.json()['ok']: self.show_text("<b>Error:</b> " + response.json()['output'] + "<br>") self.plain_text_edit.clear() return # Assign command function & run it with output from server. run_command = self.run_server_command.get(command) output = run_command(response.json()['output'], args) self.show_text(output) self.plain_text_edit.clear() self.plain_text_edit.repaint() def get_messages(self): """Sends request to get new messages and appears them in style.""" if not self.stacked_widget.currentIndex() == 2: return try: response = get(f'http://{self.server_IP}/get_messages', params={'after': self.last_message_time}, verify=False) data = response.json() except exceptions.RequestException as e: self.clear_user_data() self.show_server_off_box() return # Generate message. for message in data['messages']: # float -> datetime. beauty_time = datetime.fromtimestamp(message['time']) beauty_time = beauty_time.strftime('%d/%m %H:%M:%S') # User will see his messages from the right side. if message['username'] == self.username: self.show_text(self.message_style['begin'] + beauty_time + ' ' + message['username'] + self.message_style['middle'] + message['text'] + self.message_style['end']) self.last_message_time = message['time'] else: self.show_text(message['username'] + ' ' + beauty_time) self.show_text(message['text'] + "<br>") self.last_message_time = message['time'] def get_status(self): """Sends request to get server status.""" try: response = get(f'http://{self.server_IP}/status', verify=False) status = response.json() # Server is off. except exceptions.RequestException as e: self.server_status.setText( self.translate( "Messenger", '<p style="font-size:12px">' '<img src="images/server-is-off.png"> Offline</p>')) tool_tip = f"Can't connect to the server<br>" \ f"Maybe server isn't run or you've entered an invalid IP address in Preferences" self.server_status.setToolTip(tool_tip) return # Server is on. self.server_status.setText( self.translate( "Messenger", '<p style="font-size:12px">' '<img src="images/server-is-on.png"> Online</p>')) tool_tip = f"Server is working<br>" \ f"Users online: {status['users_online']}<br>" \ f"Date and time: {status['time']}<br>" \ f"Registered users: {status['users_count']}<br>" \ f"Written messages: {status['messages_count']}" self.server_status.setToolTip(tool_tip) def show_text(self, text): """Shows given text in messenger chat.""" self.text_browser.append(text) self.text_browser.repaint()
class Decrypt_page: def __init__(self, translations, mainwindow): self.translations = translations self.enc_key = "" self.salt = "" self.filepath = "" self.filepath_rsa = "" self.chosen_algo = "" self.parent_win = mainwindow def button_dec_t(self): #self.bottom_widget_dec.setCurrentIndex(0) if check_dark_mode(db_location) == "False": pass #self.btn_dec_t.setStyleSheet(DEC_TEXT_PRESSED_QSS) #self.btn_dec_f.setStyleSheet(DEC_FILE_DEPRESSED_QSS) else: pass #self.btn_dec_t.setStyleSheet(DARK_DEC_TEXT_PRESSED_QSS) #self.btn_dec_f.setStyleSheet(DARK_DEC_FILE_DEPRESSED_QSS) def button_dec_f(self): #self.bottom_widget_dec.setCurrentIndex(1) if check_dark_mode(db_location) == "False": pass #self.btn_dec_t.setStyleSheet(DEC_TEXT_DEPRESSED_QSS) #self.btn_dec_f.setStyleSheet(DEC_FILE_PRESSED_QSS) else: pass #self.btn_dec_t.setStyleSheet(DARK_DEC_TEXT_DEPRESSED_QSS) #self.btn_dec_f.setStyleSheet(DARK_DEC_FILE_PRESSED_QSS) def decryption(self): """ This method handles the frame for the entire decrypt tab #final_layout = QVBoxLayout() # DEFINE TOP WIDGET (TABS AND SWITCHING BETWEEN THEM) #dec_button_text = self.translations["buttons"]["decrypt_text"] #dec_button_files = self.translations["buttons"]["decrypt_files"] #self.btn_dec_t = QPushButton(f"{dec_button_text}") #self.btn_dec_t.setObjectName("btn_dec_t") #self.btn_dec_t.clicked.connect(self.button_dec_t) #self.btn_dec_f = QPushButton(f"{dec_button_files}") #self.btn_dec_f.setObjectName("btn_dec_f") #self.btn_dec_f.clicked.connect(self.button_dec_f) #if check_dark_mode(db_location) == "False": #self.btn_dec_t.setStyleSheet(DEC_TEXT_PRESSED_QSS) #else: #self.btn_dec_t.setStyleSheet(DARK_DEC_TEXT_PRESSED_QSS) top_actions = QHBoxLayout() top_actions.setSpacing(0) top_actions.setContentsMargins(0, 16, 0, 0) #top_actions.addWidget(self.btn_dec_t) #top_actions.addWidget(self.btn_dec_f) self.top_widget_dec = QWidget() self.top_widget_dec.setLayout(top_actions) # DEFINE BOTTOM WIDGET (TAB CONTENTS) #self.tab_dec_t = self.tab_dec_text() #self.tab_dec_f = self.tab_dec_files() self.bottom_widget_dec = QTabWidget() self.bottom_widget_dec.tabBar().setObjectName("DecryptionTab") #self.bottom_widget_dec.addTab(self.tab_dec_t, "") #self.bottom_widget_dec.addTab(self.tab_dec_f, "") self.bottom_widget_dec.setCurrentIndex(1) # default to text decryption tab # add top and bottom widgets to layout final_layout.addWidget(self.top_widget_dec) final_layout.addWidget(self.bottom_widget_dec) # Finish layout main = QWidget() main.setLayout(final_layout) return main """ # init layout self.layout = QGridLayout() title_label = QLabel(self.translations["labels"]["decryption_file"]) title_label.setAlignment(Qt.AlignCenter) title_label.setObjectName("title_label") title_label.setSizePolicy( QSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Fixed)) title_label.setAlignment(Qt.AlignmentFlag.AlignHCenter) self.layout.addWidget(title_label, 0, 1, 1, 8) pad = QLabel(" ") self.layout.addWidget(pad, 1, 0, 1, 2) self.layout.addWidget(pad, 1, 8, 1, 2) # FILE BROWSE LABEL open_file_label = QLabel( self.translations["labels"]["insert_file_dec"]) open_file_label.setObjectName("large_label") open_file_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(open_file_label, 1, 2, 1, 3) # FILE BROWSE open_file_btn = QPushButton( self.translations["buttons"]["browse_files"]) open_file_btn.clicked.connect(self.filedialogopen) self.layout.addWidget(open_file_btn, 1, 5, 1, 3) # ALGORITHM LABEL algo_label = QLabel(self.translations["labels"]["set_dec_algorithm"]) self.layout.addWidget(algo_label, 2, 2, 1, 3) # ALGORITHM DROPDOWN MENU self.algo_button = QPushButton( self.translations["buttons"]["algorithm"]) self.algo_dropdown = QMenu() self.algo_dropdown.setObjectName("algo_menu_dec") for algo in ENC_ALGORITHMS_FILES: self.algo_dropdown.addAction(algo) self.algo_dropdown.addSeparator() self.algo_button.setMenu(self.algo_dropdown) self.algo_dropdown.triggered.connect(self.algorithms) self.layout.addWidget(self.algo_button, 2, 5, 1, 3) # CUSTOM RSA KEY SELECTION LABEL self.rsa_key_selection_label = QLabel( self.translations["labels"]["encryption_rsa_key_label"]) self.layout.addWidget(self.rsa_key_selection_label, 3, 3, 1, 1) self.rsa_key_selection_label.setHidden(True) # CUSTOM RSA KEY FILEOPEN PROMPT self.rsa_selection_btn = QPushButton( self.translations["buttons"]["browse_files"]) self.rsa_selection_btn.setText("private.pem") self.rsa_selection_btn.clicked.connect(self.filedialogopen_rsa) self.layout.addWidget(self.rsa_selection_btn, 3, 5, 1, 3) self.rsa_selection_btn.setHidden(True) # ENCRYPTION KEY LABEL self.enc_key_label = QLabel( self.translations["labels"]["encryption_key_label"]) self.enc_key_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(self.enc_key_label, 3, 2, 1, 2) # ENCRYPTION KEY INPUT self.text_box_dec_text = PasswordEdit() self.layout.addWidget(self.text_box_dec_text, 3, 4, 1, 5) # ENCRYPTION SALT LABEL self.enc_salt_label = QLabel(self.translations["labels"]["salt_label"]) self.layout.addWidget(self.enc_salt_label, 4, 2, 1, 3) # ENCRYPTION SALT INPUT self.text_box_salt_text = PasswordEdit() self.layout.addWidget(self.text_box_salt_text, 4, 4, 1, 5) # DECRYPT BUTTON decrypt_button = QPushButton( self.translations["buttons"]["final_decrypt"]) decrypt_button.clicked.connect(self.decrypt_file) self.layout.addWidget(decrypt_button, 5, 2, 1, 6) # finish layout main = QWidget() main.setLayout(self.layout) return main def tab_dec_text(self): """ This method handles the text decryption tab """ # init layout and set suitable column widths layout = QGridLayout() pad = QLabel() layout.addWidget(pad, 0, 0, 1, 1) layout.addWidget(pad, 0, 9, 1, 1) # INSERT TEXT LABEL text_ins_label = QLabel(self.translations["labels"]["insert_text_dec"]) text_ins_label.setObjectName( "large_label") # set object name for qss tag effects text_ins_label.setAlignment(Qt.AlignCenter) layout.addWidget(text_ins_label, 0, 1, 1, 3) # INSERT TEXT BOX text_insert = QLineEdit() layout.addWidget(text_insert, 0, 4, 1, 5) # ALGORITHM LABEL algo_label = QLabel(self.translations["labels"]["set_dec_algorithm"]) algo_label.setAlignment(Qt.AlignCenter) layout.addWidget(algo_label, 1, 1, 1, 3) # ALGORITHM DROPDOWN MENU self.algo_button_ttab = QPushButton( self.translations["buttons"]["algorithm"]) self.algo_dropdown = QMenu() self.algo_dropdown.setObjectName("algo_menu_dec") for algo in ENC_ALGORITHMS: self.algo_dropdown.addAction(algo) self.algo_dropdown.addSeparator() self.algo_button_ttab.setMenu(self.algo_dropdown) self.algo_dropdown.triggered.connect(self.algorithms_text_tab) layout.addWidget(self.algo_button_ttab, 1, 4, 1, 3) # ENCRYPTION SALT LABEL self.enc_salt_label = QLabel(self.translations["labels"]["salt_label"]) self.enc_salt_label.setAlignment(Qt.AlignCenter) layout.addWidget(self.enc_salt_label, 2, 1, 1, 3) # ENCRYPTION SALT INPUT self.text_box_salt_text = PasswordEdit() layout.addWidget(self.text_box_salt_text, 2, 4, 1, 5) # DECRYPT BUTTON decrypt_button = QPushButton( self.translations["buttons"]["final_decrypt"]) layout.addWidget(decrypt_button, 3, 2, 1, 6) main = QWidget() main.setLayout(layout) return main def filedialogopen(self): self._files = FileDialog().fileOpen() self.filepath = self._files def filedialogopen_rsa(self): """ File dialog opening method """ self._files_rsa = FileDialog().fileOpen() self.filepath_rsa = self._files_rsa fileout = "" try: fileout = os.path.basename(self.filepath_rsa) self.rsa_selection_btn.setText(fileout) except TypeError: self.rsa_selection_btn.setText("private.pem") def filedialogsave(self): self._save = FileDialog().fileSave() # Decrypt parameters set and function call def decrypt_file(self): self.enc_key = self.text_box_dec_text.text() self.salt = self.text_box_salt_text.text() salt = self.salt print("salt:", salt) filepath = self.filepath try: fileout = os.path.basename(self.filepath) except TypeError: return enc_key = self.enc_key print(enc_key) # File out gets the name of the file for saving the file if self.chosen_algo == "AES": decryptor = decrypt.Decryption(password=enc_key, salt=salt) result = decryptor.decrypt_with_aes(filepath, fileout) if result == -1: print("failed decrypting") failed_decrypt = self.translations["prompts"]["failed_decrypt"] msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(failed_decrypt) msg.exec_() return inprogresslist.append(f"Decrypted: {fileout}") progress = self.translations["prompts"]["ready"] self.parent_win.right_layout.clear() self.parent_win.right_layout.addItems( [f"{progress} ({len(inprogresslist)})"]) self.parent_win.right_layout.addItems(inprogresslist) self.parent_win.right_layout.setHidden(False) return if self.chosen_algo == "RSA": if self.filepath_rsa == "": decryptor = decrypt.Decryption(password=enc_key, salt=salt) result = decryptor.decrypt_with_rsa(filename=filepath, priv_key="private.pem", fileout=fileout) if result == -2: no_RSA_keys = self.translations["prompts"]["no_rsa_keys"] print("Cant open key file") msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(no_RSA_keys) msg.exec_() return if result == -1: print("failed decrypting") failed_decrypt = self.translations["prompts"][ "failed_decrypt"] msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(failed_decrypt) msg.exec_() return else: decryptor = decrypt.Decryption(password=enc_key, salt=salt) result = decryptor.decrypt_with_rsa(filename=filepath, priv_key=self.filepath_rsa, fileout=fileout) if result == -2: no_RSA_keys = self.translations["prompts"]["no_rsa_keys"] print("Cant open key file") msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(no_RSA_keys) msg.exec_() return if result == -1: print("failed decrypting") failed_decrypt = self.translations["prompts"][ "failed_decrypt"] msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(failed_decrypt) msg.exec_() return inprogresslist.append(f"Decrypted: {fileout}") progress = self.translations["prompts"]["ready"] self.parent_win.right_layout.clear() self.parent_win.right_layout.addItems( [f"{progress} ({len(inprogresslist)})"]) self.parent_win.right_layout.addItems(inprogresslist) self.parent_win.right_layout.setHidden(False) return if self.chosen_algo == "Chacha": decryptor = decrypt.Decryption(password=enc_key, salt=salt) result = decryptor.decrypt_with_chacha(filepath, fileout) if result == -1: print("failed decrypting") failed_decrypt = self.translations["prompts"]["failed_decrypt"] msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(failed_decrypt) msg.exec_() return inprogresslist.append(f"Decrypted: {fileout}") progress = self.translations["prompts"]["ready"] self.parent_win.right_layout.clear() self.parent_win.right_layout.addItems( [f"{progress} ({len(inprogresslist)})"]) self.parent_win.right_layout.addItems(inprogresslist) self.parent_win.right_layout.setHidden(False) return # Filepath is the path for the file # Fileout is the name of the file, comes out with added # .dec prefix after decryption return def algorithms(self, algorithm): """ Change the encryption button text to chosen algorithm """ disabled_password = self.translations["prompts"]["encryption_disabled"] disabled_salt = self.translations["prompts"]["salt_disabled"] self.chosen_algo = algorithm.text() self.algo_button.setText(self.chosen_algo) if self.chosen_algo == "RSA": self.text_box_dec_text.setHidden(True) # self.text_box_dec_text.setToolTip(disabled_password) self.text_box_salt_text.setHidden(True) # self.text_box_salt_text.setToolTip(disabled_salt) self.rsa_key_selection_label.setHidden(False) self.rsa_selection_btn.setHidden(False) self.enc_key_label.setHidden(True) self.enc_salt_label.setHidden(True) else: self.text_box_dec_text.setHidden(False) # self.text_box_dec_text.setToolTip("") # self.text_box_dec_text.setToolTip("") self.text_box_salt_text.setHidden(False) # self.text_box_salt_text.setToolTip("") self.rsa_key_selection_label.setHidden(True) self.rsa_selection_btn.setHidden(True) self.enc_key_label.setHidden(False) self.enc_salt_label.setHidden(False) self.layout.update() return algorithm def algorithms_text_tab(self, algorithm): """ Change the encryption button text to chosen algorithm """ self.chosen_algo = algorithm.text() self.algo_button_ttab.setText(self.chosen_algo) self.layout.update() return algorithm def tab_dec_files(self): """ This method handles the file decryption tab """ # init layout self.layout = QGridLayout() pad = QLabel(" ") self.layout.addWidget(pad, 0, 0, 1, 2) self.layout.addWidget(pad, 0, 8, 1, 2) # FILE BROWSE LABEL open_file_label = QLabel( self.translations["labels"]["insert_file_dec"]) open_file_label.setObjectName("large_label") open_file_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(open_file_label, 0, 2, 1, 3) # FILE BROWSE open_file_btn = QPushButton( self.translations["buttons"]["browse_files"]) open_file_btn.clicked.connect(self.filedialogopen) self.layout.addWidget(open_file_btn, 0, 5, 1, 3) # ALGORITHM LABEL algo_label = QLabel(self.translations["labels"]["set_dec_algorithm"]) self.layout.addWidget(algo_label, 1, 2, 1, 3) # ALGORITHM DROPDOWN MENU self.algo_button = QPushButton( self.translations["buttons"]["algorithm"]) self.algo_dropdown = QMenu() self.algo_dropdown.setObjectName("algo_menu_dec") for algo in ENC_ALGORITHMS_FILES: self.algo_dropdown.addAction(algo) self.algo_dropdown.addSeparator() self.algo_button.setMenu(self.algo_dropdown) self.algo_dropdown.triggered.connect(self.algorithms) self.layout.addWidget(self.algo_button, 1, 5, 1, 3) # CUSTOM RSA KEY SELECTION LABEL self.rsa_key_selection_label = QLabel( self.translations["labels"]["encryption_rsa_key_label"]) self.layout.addWidget(self.rsa_key_selection_label, 2, 3, 1, 1) self.rsa_key_selection_label.setHidden(True) # CUSTOM RSA KEY FILEOPEN PROMPT self.rsa_selection_btn = QPushButton( self.translations["buttons"]["browse_files"]) self.rsa_selection_btn.setText("private.pem") self.rsa_selection_btn.clicked.connect(self.filedialogopen_rsa) self.layout.addWidget(self.rsa_selection_btn, 2, 5, 1, 3) self.rsa_selection_btn.setHidden(True) # ENCRYPTION KEY LABEL self.enc_key_label = QLabel( self.translations["labels"]["encryption_key_label"]) self.enc_key_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(self.enc_key_label, 2, 2, 1, 2) # ENCRYPTION KEY INPUT self.text_box_dec_text = PasswordEdit() self.layout.addWidget(self.text_box_dec_text, 2, 4, 1, 5) # ENCRYPTION SALT LABEL self.enc_salt_label = QLabel(self.translations["labels"]["salt_label"]) self.layout.addWidget(self.enc_salt_label, 3, 2, 1, 3) # ENCRYPTION SALT INPUT self.text_box_salt_text = PasswordEdit() self.layout.addWidget(self.text_box_salt_text, 3, 4, 1, 5) # DECRYPT BUTTON decrypt_button = QPushButton( self.translations["buttons"]["final_decrypt"]) decrypt_button.clicked.connect(self.decrypt_file) self.layout.addWidget(decrypt_button, 4, 2, 1, 6) # finish layout main = QWidget() main.setLayout(self.layout) return main
class Encrypt_page: def __init__(self, translations, mainwindow): # Define used class parameters to be set in the selections self.translations = translations self.defaults = check_encryption_defaults(db_location) self.filepath = "" self.filepath_rsa = "" self.salt = "" self.enc_key = "" self.parent_win = mainwindow if self.defaults["default_hash"] != "": self.chosen_algo = self.defaults["default_hash"] else: self.chosen_algo = "" if self.defaults["default_algo"] != "": self.chosen_algorithm = self.defaults["default_algo"] else: self.chosen_algorithm = "" def button_enc_t(self): self.bottom_widget.setCurrentIndex(0) if check_dark_mode(db_location) == "False": self.btn_enc_t.setStyleSheet(ENC_TEXT_PRESSED_QSS) self.btn_enc_f.setStyleSheet(ENC_FILE_DEPRESSED_QSS) else: self.btn_enc_t.setStyleSheet(DARK_ENC_TEXT_PRESSED_QSS) self.btn_enc_f.setStyleSheet(DARK_ENC_FILE_DEPRESSED_QSS) def button_enc_f(self): self.bottom_widget.setCurrentIndex(1) if check_dark_mode(db_location) == "False": self.btn_enc_t.setStyleSheet(ENC_TEXT_DEPRESSED_QSS) self.btn_enc_f.setStyleSheet(ENC_FILE_PRESSED_QSS) else: self.btn_enc_t.setStyleSheet(DARK_ENC_TEXT_DEPRESSED_QSS) self.btn_enc_f.setStyleSheet(DARK_ENC_FILE_PRESSED_QSS) def encryption(self): """ This method handles frame for the entire encrypt tab """ final_layout = QVBoxLayout() # DEFINE TOP WIDGET (TABS AND SWITCHING BETWEEN THEM) enc_button_text = self.translations["buttons"]["encrypt_text"] enc_button_files = self.translations["buttons"]["encrypt_files"] self.btn_enc_t = QPushButton(f"{enc_button_text}") self.btn_enc_t.setObjectName("btn_enc_t") self.btn_enc_t.clicked.connect(self.button_enc_t) self.btn_enc_f = QPushButton(f"{enc_button_files}") self.btn_enc_f.setObjectName("btn_enc_f") self.btn_enc_f.clicked.connect(self.button_enc_f) if check_dark_mode(db_location) == "False": self.btn_enc_t.setStyleSheet(ENC_TEXT_PRESSED_QSS) else: self.btn_enc_t.setStyleSheet(DARK_ENC_TEXT_PRESSED_QSS) top_actions = QHBoxLayout() top_actions.setSpacing(0) top_actions.setContentsMargins(0, 16, 0, 0) top_actions.addWidget(self.btn_enc_t) top_actions.addWidget(self.btn_enc_f) self.top_widget = QWidget() self.top_widget.setLayout(top_actions) # DEFINE BOTTOM WIDGET (TAB CONTENTS) self.tab_enc_t = self.tab_enc_text() self.tab_enc_f = self.tab_enc_files() self.bottom_widget = QTabWidget() self.bottom_widget.tabBar().setObjectName("EncryptionTab") self.bottom_widget.addTab(self.tab_enc_t, "") self.bottom_widget.addTab(self.tab_enc_f, "") self.bottom_widget.setCurrentIndex(0) # default to the text tab # Add top and bottom parts to the layout final_layout.addWidget(self.top_widget) final_layout.addWidget(self.bottom_widget) # Finish layout main = QWidget() main.setLayout(final_layout) return main def tab_enc_text(self): """ This method handles the text encryption tab """ # init layout layout = QGridLayout() # INSERT TEXT LABEL text_to_enc_label = QLabel(self.translations["labels"]["insert_text_enc"]) text_to_enc_label.setAlignment(Qt.AlignCenter) text_to_enc_label.setObjectName("large_label") layout.addWidget(text_to_enc_label, 0, 1, 1, 3) # INSERT TEXT BOX self.text_insert = QLineEdit() layout.addWidget(self.text_insert, 0, 4, 1, 5) # ALGORITHM SET LABEL algo_text_label = QLabel(self.translations["labels"]["set_enc_algorithm"]) algo_text_label.setAlignment(Qt.AlignCenter) layout.addWidget(algo_text_label, 1, 1, 1, 3) # ALGORITHM DROPDOWN MENU algo_trans = self.translations["buttons"]["algorithm"] self.algo_button_ttab = QPushButton(algo_trans) self.algo_dropdown = QMenu() self.algo_dropdown.setObjectName("algo_menu_enc_text") for algo in ENC_ALGORITHMS: self.algo_dropdown.addAction(algo) self.algo_dropdown.addSeparator() self.algo_button_ttab.setMenu(self.algo_dropdown) self.algo_dropdown.triggered.connect(self.algorithms_text) if self.defaults["default_hash"] != "": self.algo_button_ttab.setText(self.defaults["default_hash"]) layout.addWidget(self.algo_button_ttab, 1, 4, 1, 3) # ENCRYPTION KEY INPUT AND CONFIRM LABELS enc_text_label = QLabel(self.translations["labels"]["encryption_key_label"]) enc_text_label.setAlignment(Qt.AlignCenter) enc_conf_label = QLabel( self.translations["labels"]["encryption_key_confirm_label"] ) enc_conf_label.setAlignment(Qt.AlignCenter) enc_text_label.setHidden(True) enc_conf_label.setHidden(True) layout.addWidget(enc_text_label, 2, 3, 1, 1) layout.addWidget(enc_conf_label, 3, 2, 1, 2) # ENCRYPTION KEY INPUT AND CONFIRM self.text_box_enc_text_ttab = PasswordEdit() self.text_box_enc_text_ttab.setHidden(True) if self.defaults["default_key"] != "": self.text_box_enc_text_ttab.setText(self.defaults["default_key"]) self.text_box_enc_text_confirm_ttab = PasswordEdit() self.text_box_enc_text_confirm_ttab.setHidden(True) if self.defaults["default_key"] != "": self.text_box_enc_text_confirm_ttab.setText(self.defaults["default_key"]) layout.addWidget(self.text_box_enc_text_ttab, 2, 4, 1, 3) layout.addWidget(self.text_box_enc_text_confirm_ttab, 3, 4, 1, 3) # SALT INPUT LABEL salt_label = QLabel(self.translations["labels"]["salt_label"]) salt_label.setAlignment(Qt.AlignCenter) salt_label.setObjectName("large_label") layout.addWidget(salt_label, 4, 1, 1, 3) # SALT INPUT self.salt_insert_box_ttab = PasswordEdit() if self.defaults["default_salt"] != "": self.salt_insert_box_ttab.setText(self.defaults["default_salt"]) layout.addWidget(self.salt_insert_box_ttab, 4, 4, 1, 5) # ENCRYPT BUTTON enc_trans = self.translations["buttons"]["final_encrypt"] encrypt_button = QPushButton(enc_trans) encrypt_button.clicked.connect(self.encrypt_text) self.encrypt_result = QLineEdit() self.encrypt_result.setHidden(True) layout.addWidget(encrypt_button, 5, 2, 1, 6) layout.addWidget(self.encrypt_result, 6, 0, 1, 10) # finish and set layout main = QWidget() main.setLayout(layout) return main def filedialogopen(self): """ File dialog opening method """ self._files = FileDialog().fileOpen() self.filepath = self._files def filedialogopen_rsa(self): """ File dialog opening method """ self._files_rsa = FileDialog().fileOpen() self.filepath_rsa = self._files_rsa if self.filepath_rsa != None: fileout = os.path.basename(self.filepath_rsa) self.rsa_selection_btn.setText(fileout) return fileout = "public.pem" self.rsa_selection_btn.setText(fileout) def filedialogsave(self): """ File save method """ self._save = FileDialog().fileSave() # Encrypt parameters set and function call def encrypt_file(self): self.enc_key = self.text_box_enc_text.text() self.enc_key_confirm = self.text_box_enc_text_confirm.text() self.salt = self.salt_insert_box.text() filepath = self.filepath try: fileout = os.path.basename(self.filepath) except TypeError: return salt = self.salt enc_key = self.enc_key print(self.chosen_algorithm) if str(self.enc_key) != str(self.enc_key_confirm): pwd_mismatch = self.translations["prompts"]["password_mismatch"] msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(pwd_mismatch) display = msg.exec_() return # File out gets the name of the file for saving the file if self.chosen_algorithm == "AES": encryptor = encrypt.Encryption(password=enc_key, salt=salt) encryptor.encrypt_with_aes(filepath, fileout) if self.chosen_algorithm == "RSA": if self.filepath_rsa == "": encryptor = encrypt.Encryption(password=enc_key, salt=salt) encryptor.encrypt_with_rsa( filename=filepath, fileout=fileout, pub_key=None ) else: encryptor = encrypt.Encryption(password=enc_key, salt=salt) encryptor.encrypt_with_rsa( filename=filepath, fileout=fileout, pub_key=self.filepath_rsa ) if self.chosen_algorithm == "Chacha": encryptor = encrypt.Encryption(password=enc_key, salt=salt) encryptor.encrypt_with_chacha(filepath, fileout) # Filepath is the path for the file # Fileout is the name of the file, comes out with added # _encryted prefix after ecnryption inprogresslist.append(f"Encrypted: {fileout}") progress = self.translations["prompts"]["ready"] self.parent_win.right_layout.clear() self.parent_win.right_layout.addItems([f"{progress} ({len(inprogresslist)})"]) self.parent_win.right_layout.addItems(inprogresslist) self.parent_win.right_layout.setHidden(False) return def encrypt_text(self): result = "" self.encrypt_result.setHidden(False) text_hasher = encrypt.Encryption(salt=self.salt_insert_box_ttab.text()) if self.chosen_algo == "MD5": result = text_hasher.hash_with_md5(self.text_insert.text()) if self.chosen_algo == "SHA-256": result = text_hasher.hash_with_sha256(self.text_insert.text()) if self.chosen_algo == "SHA-512": result = text_hasher.hash_with_sha512(self.text_insert.text()) if self.chosen_algo == "SHA3-512": result = text_hasher.hash_with_sha3_512(self.text_insert.text()) self.encrypt_result.setText(result) def algorithms(self, algorithm): disabled_password = self.translations["prompts"]["encryption_disabled"] disabled_salt = self.translations["prompts"]["salt_disabled"] self.chosen_algorithm = algorithm.text() self.algo_button.setText(self.chosen_algorithm) if self.chosen_algorithm == "RSA": self.enc_text_label.setHidden(True) self.enc_conf_label.setHidden(True) self.salt_label.setHidden(True) self.text_box_enc_text.setHidden(True) self.text_box_enc_text.setDisabled(True) self.text_box_enc_text.setToolTip(disabled_password) self.text_box_enc_text_confirm.setHidden(True) self.text_box_enc_text_confirm.setDisabled(True) self.text_box_enc_text_confirm.setToolTip(disabled_password) self.salt_insert_box.setHidden(True) self.salt_insert_box.setDisabled(True) self.salt_insert_box.setToolTip(disabled_salt) self.rsa_key_selection_label.setHidden(False) self.rsa_selection_btn.setHidden(False) else: self.enc_text_label.setHidden(False) self.enc_conf_label.setHidden(False) self.salt_label.setHidden(False) self.text_box_enc_text.setHidden(False) self.text_box_enc_text.setDisabled(False) self.text_box_enc_text.setToolTip("") self.text_box_enc_text_confirm.setHidden(False) self.text_box_enc_text_confirm.setDisabled(False) self.text_box_enc_text.setToolTip("") self.salt_insert_box.setHidden(False) self.salt_insert_box.setDisabled(False) self.text_box_enc_text.setToolTip("") self.rsa_key_selection_label.setHidden(True) self.rsa_selection_btn.setHidden(True) self.layout.update() return algorithm def algorithms_text(self, algorithm): """ Change the encryption button text to chosen algorithm """ self.chosen_algo = algorithm.text() self.algo_button_ttab.setText(self.chosen_algo) self.layout.update() return algorithm def tab_enc_files(self): """ This method handles the file encryption tab """ # init layout self.layout = QGridLayout() self.layout.setContentsMargins(0, 0, 0, 0) pad = QLabel(" ") self.layout.addWidget(pad, 0, 8, 1, 2) self.layout.addWidget(pad, 0, 0, 1, 1) # FILE BROWSER LABEL file_browse_label = QLabel(self.translations["labels"]["browse_file_enc"]) file_browse_label.setObjectName("large_label") file_browse_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(file_browse_label, 0, 2, 1, 3) # INSERT FILE BROWSER file_browse_btn = QPushButton(self.translations["buttons"]["browse_files"]) file_browse_btn.clicked.connect(self.filedialogopen) self.layout.addWidget(file_browse_btn, 0, 5, 1, 3) # ALGORITHM SET LABEL self.algo_text_label = QLabel(self.translations["labels"]["set_enc_algorithm"]) self.algo_text_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(self.algo_text_label, 1, 2, 1, 3) # ALGORITHM DROPDOWN MENU self.algo_button = QPushButton(self.translations["buttons"]["algorithm"]) self.algo_dropdown = QMenu() self.algo_dropdown.setObjectName("algo_menu_enc_files") for algo in ENC_ALGORITHMS_FILES: self.algo_dropdown.addAction(algo) self.algo_dropdown.addSeparator() self.algo_button.setMenu(self.algo_dropdown) self.algo_dropdown.triggered.connect(self.algorithms) if self.defaults["default_algo"] != "": self.algo_button.setText(self.defaults["default_algo"]) # if self.algo_dropdown.triggered: # self.algo_button.setText(self.chosen_algo) # self.layout.update() self.layout.addWidget(self.algo_button, 1, 5, 1, 3) # CUSTOM RSA KEY SELECTION LABEL self.rsa_key_selection_label = QLabel( self.translations["labels"]["encryption_rsa_key_label"] ) self.layout.addWidget(self.rsa_key_selection_label, 2, 3, 1, 1) self.rsa_key_selection_label.setHidden(True) # CUSTOM RSA KEY FILEOPEN PROMPT self.rsa_selection_btn = QPushButton( self.translations["buttons"]["browse_files"] ) self.rsa_selection_btn.setText("public.pem") self.rsa_selection_btn.clicked.connect(self.filedialogopen_rsa) self.layout.addWidget(self.rsa_selection_btn, 2, 5, 1, 3) self.rsa_selection_btn.setHidden(True) # ENCRYPTION KEY INPUT AND CONFIRM LABELS self.enc_text_label = QLabel( self.translations["labels"]["encryption_key_label"] ) self.enc_conf_label = QLabel( self.translations["labels"]["encryption_key_confirm_label"] ) self.enc_text_label.setAlignment(Qt.AlignCenter) self.enc_conf_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(self.enc_text_label, 2, 2, 1, 2) self.layout.addWidget(self.enc_conf_label, 3, 2, 1, 2) # ENCRYPTION KEY INPUT AND CONFIRM self.text_box_enc_text = PasswordEdit() if self.defaults["default_key"] != "": self.text_box_enc_text.setText(self.defaults["default_key"]) self.text_box_enc_text_confirm = PasswordEdit() if self.defaults["default_key"] != "": self.text_box_enc_text_confirm.setText(self.defaults["default_key"]) self.layout.addWidget(self.text_box_enc_text, 2, 4, 1, 5) self.layout.addWidget(self.text_box_enc_text_confirm, 3, 4, 1, 5) # SALT INPUT LABEL self.salt_label = QLabel(self.translations["labels"]["salt_label"]) self.salt_label.setObjectName("large_label") self.salt_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(self.salt_label, 4, 2, 1, 2) # SALT INPUT self.salt_insert_box = PasswordEdit() if self.defaults["default_salt"] != "": self.salt_insert_box.setText(self.defaults["default_salt"]) self.layout.addWidget(self.salt_insert_box, 4, 4, 1, 5) # ENCRYPT BUTTON self.encrypt_button = QPushButton(self.translations["buttons"]["final_encrypt"]) self.layout.addWidget(self.encrypt_button, 5, 3, 1, 5) self.encrypt_button.clicked.connect(self.encrypt_file) # finish and set layout self.main = QWidget() self.main.setLayout(self.layout) return self.main