Beispiel #1
0
class MasterForm(QMainWindow):
    def __init__(self, parent=None):
        super(MasterForm, self).__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Encrypt/Decrypt button
        self.ui.pushEncrypt.clicked.connect(self.tamponencrypt)
        self.ui.pushDecrypt.clicked.connect(self.tampondecrypt)
        self.ui.pushSign.clicked.connect(self.tamponsign)
        self.ui.pushVerify.clicked.connect(self.tamponverify)

        # Menu connexions
        self.ui.actionCopier.triggered.connect(self.ui.plainTextEdit.copy)
        self.ui.actionColler.triggered.connect(self.ui.plainTextEdit.paste)
        self.ui.actionCut.triggered.connect(self.ui.plainTextEdit.cut)
        self.ui.actionCacher.triggered.connect(self.toolbarvisibility)
        self.ui.actionShow_text_icons.triggered.connect(
            self.texticonsvisibility)
        self.ui.actionKeymanager.triggered.connect(keymanager)
        self.ui.actionInfos_QPyCrypto.triggered.connect(openabout)
        self.ui.actionInfos_Qt.triggered.connect(self.aboutqt)
        self.ui.actionChiffrerfichier.triggered.connect(self.encryptfile)
        self.ui.actionDechiffrerfichier.triggered.connect(self.decryptfile)

        self.ui.actionChiffrer_un_fichier_Enigma.triggered.connect(
            self.encryptfileenigma)
        self.ui.actionD_chiffrer_un_fichier_Enigma.triggered.connect(
            self.decryptfileenigma)

        self.ui.actionSigner_un_fichier.triggered.connect(self.signfile)
        self.ui.actionVerifier_signature.triggered.connect(self.verifysignfile)

        self.ui.actionVider_Tampon.triggered.connect(self.vidertampon)
        self.ui.actionOuvrir.triggered.connect(self.ouvrirtexte)
        self.ui.actionSauver.triggered.connect(self.sauvertexte)
        self.ui.actionQuitter.triggered.connect(sys.exit)

        # Menu HASH File:
        self.ui.actionSHA512.triggered.connect(self.hashfilesha512)
        self.ui.actionSHA384.triggered.connect(self.hashfilesha384)
        self.ui.actionSHA256.triggered.connect(self.hashfilesha256)
        self.ui.actionSHA224.triggered.connect(self.hashfilesha224)
        self.ui.actionSHA_1.triggered.connect(self.hashfilesha)
        self.ui.actionMD5_2.triggered.connect(self.hashfilemd5)
        self.ui.actionMD2.triggered.connect(self.hashfilemd2)
        self.ui.actionMD4.triggered.connect(self.hashfilemd4)
        self.ui.actionRIPEMD_160.triggered.connect(self.hashfileripemd_160)
        self.ui.actionRIPEMD_128.triggered.connect(self.hashfileripemd_128)
        self.ui.actionWhirlpool.triggered.connect(self.hashfileWhirlpool)
        self.ui.actionTiger.triggered.connect(self.hashfileTiger)
        self.ui.actionAdler32.triggered.connect(self.hashfileAdler32)
        self.ui.actionCRC24.triggered.connect(self.hashfileCrc24)
        self.ui.actionCRC32.triggered.connect(self.hashfileCrc32)
        self.ui.actionSHA_3_winner_Keccak_1600.triggered.connect(
            self.hashfileKeccak_1600)
        self.ui.actionSHA_3_candidate_Skein_512.triggered.connect(
            self.hashfileSkein_512)
        self.ui.actionGOST_34_11.triggered.connect(self.hashfileGOST_34_11)

    def encryptfileenigma(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "Select the file to encrypt", "", "All Files (*)")
        if filename:
            dialog = Fenselectkey(self)
            if dialog.exec_() == QDialog.Accepted:
                m_key = dialog.ui.EditPass.text()
                algorithm = dialog.ui.comboAlgo.currentText()
                if algorithm == "Serpent-256":
                    algo = "srp"
                if algorithm == "AES-256":
                    algo = "aes"
                if algorithm == "Twofish-256":
                    algo = "twf"

                result = encryptfile(filename, m_key, algo)
                if result["success"] == "successfully encrypted":
                    QMessageBox.information(
                        self, "Successfully encrypted", "File: " + filename +
                        " is encrypted with " + algorithm, QMessageBox.Ok)
                else:
                    QMessageBox.information(
                        self, "Encryption Error",
                        "Encryption error: " + result["success"],
                        QMessageBox.Ok)

                self.ui.statusbar.showMessage(
                    "File " + filename + " is encrypted.", 50000)
                return

    def decryptfileenigma(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "Select the file to decrypt", "",
            "Cryptoshop Files (*.cryptoshop);;All Files (*)")

        if filename:
            m_key, ok = QInputDialog.getText(self, "Enter your passphrase",
                                             "Key:", QLineEdit.Normal)
            if ok and m_key != '':
                try:
                    result = decryptfile(filename, m_key)
                    if result["success"] == "successfully decrypted":
                        QMessageBox.information(
                            self, "Successfully Decrypted",
                            "File: " + filename + " encrypted with " +
                            result["algorithm"] +
                            " was successfully decrypted", QMessageBox.Ok)
                    else:
                        QMessageBox.warning(
                            self, "Decryption Error",
                            "Decryption Error " + result["success"],
                            QMessageBox.Ok)

                except Exception as e:
                    QMessageBox.warning(self,
                                        appname + version + "What that bug ??",
                                        (str(e)), QMessageBox.Ok)

    def signfile(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Select a file to sign", "",
                                                  "All files (*)")
        if filename:
            gpg = gnupg.GPG(use_agent=False)
            gpg.encoding = 'utf-8'
            dialog = Fenselectsignkey(self)
            if dialog.exec_() == QDialog.Accepted:
                keyid = dialog.ui.comboBox.currentText()
                key = dialog.ui.editKey.text()
                with open(filename, 'rb') as data:
                    signed_data = gpg.sign_file(file=data,
                                                keyid=keyid,
                                                output=filename + ".sig",
                                                detach=True)
                    print(signed_data)
                    data.close()

    def verifysignfile(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "Select the sig file", "",
            "sig Files (*.sig);;asc Files (*.asc);;All Files (*)")
        if filename:
            with open(filename, 'rb') as stream:
                gpg = gnupg.GPG(use_agent=False)
                gpg.encoding = 'utf-8'
                data = os.path.splitext(filename)[0].split("_")[-1]
                verified = gpg.verify_file(stream, data)
                stream.close()

            if verified.valid is True:
                QMessageBox.information(
                    self, appname + version + "Good Signature",
                    "Good signature from:  " + verified.username +
                    "\n\nFingerprint:  " + verified.fingerprint +
                    "\nKey Id:  " + verified.key_id +
                    "\nThe signature was created at " +
                    verified.creation_date + "\n\nTrust  :" +
                    verified.trust_text, QMessageBox.Ok)
                return
            if verified.valid is False and verified.username is None:
                QMessageBox.warning(self,
                                    appname + version + "No signature found",
                                    "No signature found:  " + verified.stderr,
                                    QMessageBox.Ok)
                return
            else:
                QMessageBox.warning(
                    self, appname + version + "Bad Signature",
                    "Bad signature from:  " + verified.username +
                    "\nKey Id:  " + verified.key_id +
                    "\n\nTHE FILE IS CORRUPTED." + "\n\nDetails  :\n" +
                    verified.stderr, QMessageBox.Ok)

    def tamponverify(self):
        texttoverify = self.ui.plainTextEdit.toPlainText()
        gpg = gnupg.GPG(use_agent=False)
        gpg.encoding = 'utf-8'
        verified_data = gpg.verify(texttoverify)
        if verified_data.valid is False and verified_data.status is None:
            QMessageBox.warning(self, "No valid signature",
                                "No valid signature.", QMessageBox.Ok)
            return
        if verified_data.valid is False:
            QMessageBox.warning(
                self, appname + version + "Bad Signature",
                "BAD SIGNATURE " + "\nDATA ARE CORRUPTED:\n\n" +
                "GnuPG Message: \n" + verified_data.stderr, QMessageBox.Ok)
            return
        if verified_data.valid is True:
            QMessageBox.information(
                self, appname + version + "Good Signature",
                "Good signature from:  " + verified_data.username + "\nID " +
                verified_data.key_id + "\n\nFingerprint: \n" +
                verified_data.fingerprint + "\n\nGnuPG Message:\n" +
                verified_data.stderr, QMessageBox.Ok)
        else:
            QMessageBox.warning(self, appname + version + "Error", " Error ",
                                QMessageBox.Ok)

    def updatePixmap(self, boll):
        if boll == "False":
            QMessageBox.warning(self, appname + version + "Error",
                                " Wrong passphrase " + self.originalfile,
                                QMessageBox.Ok)
            return
        else:
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Cryptoshop-->The file " +
                                                  self.originalfile +
                                                  " is decrypted")
            self.ui.plainTextEdit.appendPlainText(
                str("----->>>") + self.afterfile)

    def tamponsign(self):
        texttosign = self.ui.plainTextEdit.toPlainText()
        gpg = gnupg.GPG(use_agent=False)
        dialog = Fenselectsignkey(self)
        if dialog.exec_() == QDialog.Accepted:
            key = dialog.ui.comboBox.currentText()
            signed_data = gpg.sign(texttosign, keyid=key)
            if str(signed_data) == "":
                QMessageBox.critical(
                    self, appname + version + "Can't Sign...",
                    '''The passphrase is invalid for unlock this key.''',
                    QMessageBox.Ok)
                return
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(str(signed_data))

    def toolbarvisibility(self):
        if self.ui.actionCacher.isChecked():
            self.ui.toolBar.hide()
        else:
            self.ui.toolBar.show()

    def texticonsvisibility(self):
        if self.ui.actionShow_text_icons.isChecked():
            self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        else:
            self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly)

    def hidetexticons(self):
        self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly)

    def encryptfile(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Select file to encrypt", "",
                                                  "All (*)")

        if filename:

            dialog = Fenselectkeygpg(self)

            if dialog.exec_() == QDialog.Accepted:
                m_key = dialog.ui.editKey.text().strip()

                if dialog.ui.checkSymetric.isChecked():
                    if dialog.ui.editKey.text() == "":
                        QMessageBox.warning(self,
                                            appname + version + "Error...",
                                            '''You must type a passphrase.''',
                                            QMessageBox.Ok)
                        return
                    encryordecry = True
                    lname = "not used for encrypt"
                    sym = True
                    self.originalfile = filename

                    self.myLongTask = Crypto_gpg.Worker(
                        filename, m_key, encryordecry, lname, sym)
                    self.myLongTask.renderedImage.connect(self.updatePixmap)
                    self.myLongTask.isstarted.connect(self.isstarted)

                    self.myLongTask.start()

                    QMessageBox.warning(
                        self, appname + version + "The file is encrypted",
                        filename + ".gpg", QMessageBox.Ok)

                else:
                    sym = False
                    item = dialog.ui.comboBox.currentText()
                    print(item)
                    gpg = gnupg.GPG(use_agent=False)
                    keylist = gpg.list_keys()

                    uid_strings = []
                    uid_string2key = {}
                    for key in keylist:
                        for uid_string in key['uids']:
                            uid_strings.append(uid_string)
                            uid_string2key[uid_string] = key
                    uid = item
                    m_key = uid_string2key[uid]
                    encryordecry = True
                    lname = "not used for encrypt"
                    sym = False
                    self.myLongTask = Crypto_gpg.Worker(
                        filename, m_key, encryordecry, lname, sym)
                    self.myLongTask.renderedImage.connect(self.updatePixmap)
                    self.myLongTask.isstarted.connect(self.isstarted)

                    self.myLongTask.start()

                    self.ui.plainTextEdit.clear()
                    self.ui.plainTextEdit.appendPlainText(
                        "----------------------------------------------")
                    self.ui.plainTextEdit.appendPlainText(
                        "Cryptoshop-->The file is encrypted.")
                    self.ui.plainTextEdit.appendPlainText(
                        str(filename + ".gpg"))

    def aboutqt(self):
        QMessageBox.aboutQt(self, appname + version + "Qt is the best !")

    def tamponencrypt(self):
        dialog = Fenselectkeygpg(self)

        if dialog.exec_() == QDialog.Accepted:
            self.m_key = dialog.ui.editKey.text().strip()
            if dialog.ui.checkSymetric.isChecked():
                if dialog.ui.editKey.text() == "":
                    QMessageBox.warning(self, appname + version + "Error",
                                        '''You must type a passphrase.''',
                                        QMessageBox.Ok)
                    return

                gpg = gnupg.GPG(use_agent=False)
                plaintext = self.ui.plainTextEdit.toPlainText()
                crypted = gpg.encrypt(plaintext,
                                      False,
                                      passphrase=self.m_key,
                                      symmetric='AES256',
                                      armor=True)
                self.ui.plainTextEdit.clear()
                self.ui.plainTextEdit.appendPlainText(str(crypted))

            else:
                item = dialog.ui.comboBox.currentText()
                print(item)
                gpg = gnupg.GPG()
                keylist = gpg.list_keys()

                uid_strings = []
                uid_string2key = {}

                for key in keylist:
                    for uid_string in key['uids']:
                        uid_strings.append(uid_string)
                        uid_string2key[uid_string] = key

                uid = item
                key = uid_string2key[uid]
                unencrypted_string = self.ui.plainTextEdit.toPlainText()
                encrypted_data = gpg.encrypt(unencrypted_string,
                                             key['fingerprint'],
                                             always_trust=True)
                encrypted_string = str(encrypted_data)
                self.ui.plainTextEdit.clear()
                self.ui.plainTextEdit.appendPlainText(encrypted_string)

    def sauvertexte(self):
        filename, _ = QFileDialog.getSaveFileName(self)
        if filename:
            file = QFile(filename)
            if not file.open(QFile.WriteOnly | QFile.Text):
                QMessageBox.critical(
                    self, appname + version + "Save",
                    "Writing Error %s:\n%s." % (filename, file.errorString()))
                return
            outstr = QTextStream(file)
            outstr << self.ui.plainTextEdit.toPlainText()
            QMessageBox.information(
                self, appname + version + "Save file",
                "The file is saved. \n%s" % (file.fileName()))

    def ouvrirtexte(self):
        filename, _ = QFileDialog.getOpenFileName(self)
        if filename:
            file = QFile(filename)
            if not file.open(QFile.ReadOnly | QFile.Text):
                QMessageBox.critical(
                    self, appname + version + "Open File",
                    "Reading Error %s:\n%s." % (filename, file.errorString()))
                return
            instr = QTextStream(file)
            self.ui.plainTextEdit.setPlainText(instr.readAll())

    def vidertampon(self):
        self.ui.plainTextEdit.clear()

    def tampondecrypt(self):
        encrypted_string = str(self.ui.plainTextEdit.toPlainText())
        gpg = gnupg.GPG(use_agent=False)

        decrypted_data = gpg.decrypt(encrypted_string)

        if decrypted_data.ok is True:
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(str(decrypted_data))
        else:
            QMessageBox.warning(self, appname + version + "Invalid passphrase",
                                ''' Invalid passphrase.''', QMessageBox.Ok)
            return

    def hashfileripemd_160(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "RIPEMD-160: Select File", "",
            "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'RIPEMD-160')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash RIPEMD-160 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileripemd_128(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "RIPEMD-128: Select File", "",
            "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'RIPEMD-128')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash RIPEMD-128 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilemd2(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "MD2: Select File", "", "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'MD2')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash MD2 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilemd4(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "MD4: Select File", "", "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'MD4')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash MD4 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilemd5(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "MD5: Select File", "", "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'MD5')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash MD5 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha512(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "SHA-512: Select File", "",
            "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-512')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-512 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha384(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "SHA-384: Select File", "",
            "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-384')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-384 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha256(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "SHA-256: Select File", "",
            "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-256')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-256 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha224(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "SHA-224: Select File", "",
            "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-224')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-224 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "SHA-1: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-1')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-1 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileWhirlpool(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Whirlpool: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Whirlpool')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash Whirlpool -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileTiger(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Tiger: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Tiger')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash Tiger -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileAdler32(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Adler32: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Adler32')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash Adler32 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileCrc24(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Crc24: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'CRC24')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash CRC24 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileCrc32(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Crc32: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'CRC32')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash CRC32 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileKeccak_1600(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "SHA-3 Keccak-1600: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Keccak-1600')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText(
                "Hash SHA-3 Keccak-1600 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileSkein_512(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Skein_512: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Skein-512')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash Skein-512 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileGOST_34_11(self):
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "GOST 34.11: Select File",
            "",
            "All Files (*);;Text Files (*.txt)",
        )
        if filename:
            output = simplehash.get_file_checksum(filename, 'GOST-34.11')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(
                "----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash GOST 34.11 -->" +
                                                  filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def decryptfile(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "Select encrypted file", "", "GPG files (*.gpg);;Tous (*)")
        if filename:
            m_key, ok = QInputDialog.getText(self, "Enter your passphrase",
                                             "Key:", QLineEdit.Normal)
            if ok and m_key != '':
                lname = os.path.splitext(filename)[0].split("_")[-1]

                self.originalfile = filename
                self.afterfile = lname
                encryordecry = False
                sym = False

                self.myLongTask = Crypto_gpg.Worker(filename, m_key,
                                                    encryordecry, lname, sym)
                self.myLongTask.renderedImage.connect(self.updatePixmap)
                self.myLongTask.isstarted.connect(self.isstarted)
                self.myLongTask.start()

            else:
                QMessageBox.warning(self, appname + version + "Error",
                                    ''' You must enter a passphrase ''',
                                    QMessageBox.Ok)

    def isstarted(self, status):
        if status == "True":
            self.progress = QProgressDialog("Work in progress...", "Cancel", 0,
                                            0)
            self.progress.setWindowTitle(appname + version)
            self.progress.setWindowModality(Qt.ApplicationModal)
            self.progress.exec()
        else:
            self.progress.close()
class MasterForm(QMainWindow):
    def __init__(self, parent=None):
        super(MasterForm, self).__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Encrypt/Decrypt button
        self.ui.pushEncrypt.clicked.connect(self.tamponencrypt)
        self.ui.pushDecrypt.clicked.connect(self.tampondecrypt)
        self.ui.pushSign.clicked.connect(self.tamponsign)
        self.ui.pushVerify.clicked.connect(self.tamponverify)

        # Menu connexions
        self.ui.actionCopier.triggered.connect(self.ui.plainTextEdit.copy)
        self.ui.actionColler.triggered.connect(self.ui.plainTextEdit.paste)
        self.ui.actionCut.triggered.connect(self.ui.plainTextEdit.cut)
        self.ui.actionCacher.triggered.connect(self.toolbarvisibility)
        self.ui.actionShow_text_icons.triggered.connect(self.texticonsvisibility)
        self.ui.actionKeymanager.triggered.connect(keymanager)
        self.ui.actionInfos_QPyCrypto.triggered.connect(openabout)
        self.ui.actionInfos_Qt.triggered.connect(self.aboutqt)
        self.ui.actionChiffrerfichier.triggered.connect(self.encryptfile)
        self.ui.actionDechiffrerfichier.triggered.connect(self.decryptfile)

        self.ui.actionChiffrer_un_fichier_Enigma.triggered.connect(self.encryptfileenigma)
        self.ui.actionD_chiffrer_un_fichier_Enigma.triggered.connect(self.decryptfileenigma)

        self.ui.actionSigner_un_fichier.triggered.connect(self.signfile)
        self.ui.actionVerifier_signature.triggered.connect(self.verifysignfile)

        self.ui.actionVider_Tampon.triggered.connect(self.vidertampon)
        self.ui.actionOuvrir.triggered.connect(self.ouvrirtexte)
        self.ui.actionSauver.triggered.connect(self.sauvertexte)
        self.ui.actionQuitter.triggered.connect(sys.exit)

        # Menu HASH File:
        self.ui.actionSHA512.triggered.connect(self.hashfilesha512)
        self.ui.actionSHA384.triggered.connect(self.hashfilesha384)
        self.ui.actionSHA256.triggered.connect(self.hashfilesha256)
        self.ui.actionSHA224.triggered.connect(self.hashfilesha224)
        self.ui.actionSHA_1.triggered.connect(self.hashfilesha)
        self.ui.actionMD5_2.triggered.connect(self.hashfilemd5)
        self.ui.actionMD2.triggered.connect(self.hashfilemd2)
        self.ui.actionMD4.triggered.connect(self.hashfilemd4)
        self.ui.actionRIPEMD_160.triggered.connect(self.hashfileripemd_160)
        self.ui.actionRIPEMD_128.triggered.connect(self.hashfileripemd_128)
        self.ui.actionWhirlpool.triggered.connect(self.hashfileWhirlpool)
        self.ui.actionTiger.triggered.connect(self.hashfileTiger)
        self.ui.actionAdler32.triggered.connect(self.hashfileAdler32)
        self.ui.actionCRC24.triggered.connect(self.hashfileCrc24)
        self.ui.actionCRC32.triggered.connect(self.hashfileCrc32)
        self.ui.actionSHA_3_winner_Keccak_1600.triggered.connect(self.hashfileKeccak_1600)
        self.ui.actionSHA_3_candidate_Skein_512.triggered.connect(self.hashfileSkein_512)
        self.ui.actionGOST_34_11.triggered.connect(self.hashfileGOST_34_11)

    def encryptfileenigma(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Select the file to encrypt", "",
                                                  "All Files (*)")
        if filename:
            dialog = Fenselectkey(self)
            if dialog.exec_() == QDialog.Accepted:
                m_key = dialog.ui.EditPass.text()
                algorithm = dialog.ui.comboAlgo.currentText()
                if algorithm == "Serpent-256":
                    algo = "srp"
                if algorithm == "AES-256":
                    algo = "aes"
                if algorithm == "Twofish-256":
                    algo = "twf"

                result = encryptfile(filename, m_key, algo)
                if result["success"] == "successfully encrypted":
                    QMessageBox.information(self, "Successfully encrypted",
                                            "File: " + filename + " is encrypted with " + algorithm,
                                            QMessageBox.Ok)
                else:
                    QMessageBox.information(self, "Encryption Error",
                                            "Encryption error: " + result["success"],
                                            QMessageBox.Ok)

                self.ui.statusbar.showMessage("File " + filename + " is encrypted.", 50000)
                return

    def decryptfileenigma(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Select the file to decrypt", "",
                                                  "Cryptoshop Files (*.cryptoshop);;All Files (*)")

        if filename:
            m_key, ok = QInputDialog.getText(self, "Enter your passphrase",
                                             "Key:", QLineEdit.Normal)
            if ok and m_key != '':
                try:
                    result = decryptfile(filename, m_key)
                    if result["success"] == "successfully decrypted":
                        QMessageBox.information(self, "Successfully Decrypted",
                                                "File: " + filename + " encrypted with " + result[
                                                    "algorithm"] + " was successfully decrypted",
                                                QMessageBox.Ok)
                    else:
                        QMessageBox.warning(self, "Decryption Error",
                                            "Decryption Error " + result["success"],
                                            QMessageBox.Ok)

                except Exception as e:
                    QMessageBox.warning(self, appname + version + "What that bug ??", (str(e)), QMessageBox.Ok)

    def signfile(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Select a file to sign", "",
                                                  "All files (*)")
        if filename:
            gpg = gnupg.GPG(use_agent=False)
            gpg.encoding = 'utf-8'
            dialog = Fenselectsignkey(self)
            if dialog.exec_() == QDialog.Accepted:
                keyid = dialog.ui.comboBox.currentText()
                key = dialog.ui.editKey.text()
                with open(filename, 'rb') as data:
                    signed_data = gpg.sign_file(file=data, keyid=keyid, output=filename + ".sig", detach=True)
                    print(signed_data)
                    data.close()

    def verifysignfile(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Select the sig file", "",
                                                  "sig Files (*.sig);;asc Files (*.asc);;All Files (*)")
        if filename:
            with open(filename, 'rb') as stream:
                gpg = gnupg.GPG(use_agent=False)
                gpg.encoding = 'utf-8'
                data = os.path.splitext(filename)[0].split("_")[-1]
                verified = gpg.verify_file(stream, data)
                stream.close()

            if verified.valid is True:
                QMessageBox.information(self, appname + version + "Good Signature",
                                        "Good signature from:  " + verified.username +
                                        "\n\nFingerprint:  " + verified.fingerprint +
                                        "\nKey Id:  " + verified.key_id +
                                        "\nThe signature was created at " + verified.creation_date + "\n\nTrust  :" + verified.trust_text,
                                        QMessageBox.Ok)
                return
            if verified.valid is False and verified.username is None:
                QMessageBox.warning(self, appname + version + "No signature found",
                                    "No signature found:  " + verified.stderr, QMessageBox.Ok)
                return
            else:
                QMessageBox.warning(self, appname + version + "Bad Signature",
                                    "Bad signature from:  " + verified.username +
                                    "\nKey Id:  " + verified.key_id + "\n\nTHE FILE IS CORRUPTED." + "\n\nDetails  :\n" + verified.stderr,
                                    QMessageBox.Ok)

    def tamponverify(self):
        texttoverify = self.ui.plainTextEdit.toPlainText()
        gpg = gnupg.GPG(use_agent=False)
        gpg.encoding = 'utf-8'
        verified_data = gpg.verify(texttoverify)
        if verified_data.valid is False and verified_data.status is None:
            QMessageBox.warning(self, "No valid signature",
                                "No valid signature.",
                                QMessageBox.Ok)
            return
        if verified_data.valid is False:
            QMessageBox.warning(self, appname + version + "Bad Signature",
                                "BAD SIGNATURE " + "\nDATA ARE CORRUPTED:\n\n" + "GnuPG Message: \n" + verified_data.stderr,
                                QMessageBox.Ok)
            return
        if verified_data.valid is True:
            QMessageBox.information(self, appname + version + "Good Signature",
                                    "Good signature from:  " + verified_data.username +
                                    "\nID " + verified_data.key_id + "\n\nFingerprint: \n"
                                    + verified_data.fingerprint + "\n\nGnuPG Message:\n" + verified_data.stderr,
                                    QMessageBox.Ok)
        else:
            QMessageBox.warning(self, appname + version + "Error",
                                " Error ",
                                QMessageBox.Ok)

    def updatePixmap(self, boll):
        if boll == "False":
            QMessageBox.warning(self, appname + version + "Error",
                                " Wrong passphrase " + self.originalfile,
                                QMessageBox.Ok)
            return
        else:
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Cryptoshop-->The file " + self.originalfile + " is decrypted")
            self.ui.plainTextEdit.appendPlainText(str("----->>>") + self.afterfile)

    def tamponsign(self):
        texttosign = self.ui.plainTextEdit.toPlainText()
        gpg = gnupg.GPG(use_agent=False)
        dialog = Fenselectsignkey(self)
        if dialog.exec_() == QDialog.Accepted:
            key = dialog.ui.comboBox.currentText()
            signed_data = gpg.sign(texttosign, keyid=key)
            if str(signed_data) == "":
                QMessageBox.critical(self, appname + version + "Can't Sign...",
                                     '''The passphrase is invalid for unlock this key.''',
                                     QMessageBox.Ok)
                return
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(str(signed_data))

    def toolbarvisibility(self):
        if self.ui.actionCacher.isChecked():
            self.ui.toolBar.hide()
        else:
            self.ui.toolBar.show()

    def texticonsvisibility(self):
        if self.ui.actionShow_text_icons.isChecked():
            self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        else:
            self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly)

    def hidetexticons(self):
        self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly)

    def encryptfile(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Select file to encrypt", "",
                                                  "All (*)")

        if filename:

            dialog = Fenselectkeygpg(self)

            if dialog.exec_() == QDialog.Accepted:
                m_key = dialog.ui.editKey.text().strip()

                if dialog.ui.checkSymetric.isChecked():
                    if dialog.ui.editKey.text() == "":
                        QMessageBox.warning(self, appname + version + "Error...",
                                            '''You must type a passphrase.''',
                                            QMessageBox.Ok)
                        return
                    encryordecry = True
                    lname = "not used for encrypt"
                    sym = True
                    self.originalfile = filename

                    self.myLongTask = Crypto_gpg.Worker(filename, m_key, encryordecry, lname, sym)
                    self.myLongTask.renderedImage.connect(self.updatePixmap)
                    self.myLongTask.isstarted.connect(self.isstarted)

                    self.myLongTask.start()

                    QMessageBox.warning(self, appname + version + "The file is encrypted",
                                        filename + ".gpg",
                                        QMessageBox.Ok)

                else:
                    sym = False
                    item = dialog.ui.comboBox.currentText()
                    print(item)
                    gpg = gnupg.GPG(use_agent=False)
                    keylist = gpg.list_keys()

                    uid_strings = []
                    uid_string2key = {}
                    for key in keylist:
                        for uid_string in key['uids']:
                            uid_strings.append(uid_string)
                            uid_string2key[uid_string] = key
                    uid = item
                    m_key = uid_string2key[uid]
                    encryordecry = True
                    lname = "not used for encrypt"
                    sym = False
                    self.myLongTask = Crypto_gpg.Worker(filename, m_key, encryordecry, lname, sym)
                    self.myLongTask.renderedImage.connect(self.updatePixmap)
                    self.myLongTask.isstarted.connect(self.isstarted)

                    self.myLongTask.start()

                    self.ui.plainTextEdit.clear()
                    self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
                    self.ui.plainTextEdit.appendPlainText("Cryptoshop-->The file is encrypted.")
                    self.ui.plainTextEdit.appendPlainText(str(filename + ".gpg"))

    def aboutqt(self):
        QMessageBox.aboutQt(self, appname + version + "Qt is the best !")

    def tamponencrypt(self):
        dialog = Fenselectkeygpg(self)

        if dialog.exec_() == QDialog.Accepted:
            self.m_key = dialog.ui.editKey.text().strip()
            if dialog.ui.checkSymetric.isChecked():
                if dialog.ui.editKey.text() == "":
                    QMessageBox.warning(self, appname + version + "Error",
                                        '''You must type a passphrase.''',
                                        QMessageBox.Ok)
                    return

                gpg = gnupg.GPG(use_agent=False)
                plaintext = self.ui.plainTextEdit.toPlainText()
                crypted = gpg.encrypt(plaintext, False, passphrase=self.m_key, symmetric='AES256',
                                      armor=True)
                self.ui.plainTextEdit.clear()
                self.ui.plainTextEdit.appendPlainText(str(crypted))

            else:
                item = dialog.ui.comboBox.currentText()
                print(item)
                gpg = gnupg.GPG()
                keylist = gpg.list_keys()

                uid_strings = []
                uid_string2key = {}

                for key in keylist:
                    for uid_string in key['uids']:
                        uid_strings.append(uid_string)
                        uid_string2key[uid_string] = key

                uid = item
                key = uid_string2key[uid]
                unencrypted_string = self.ui.plainTextEdit.toPlainText()
                encrypted_data = gpg.encrypt(unencrypted_string, key['fingerprint'], always_trust=True)
                encrypted_string = str(encrypted_data)
                self.ui.plainTextEdit.clear()
                self.ui.plainTextEdit.appendPlainText(encrypted_string)

    def sauvertexte(self):
        filename, _ = QFileDialog.getSaveFileName(self)
        if filename:
            file = QFile(filename)
            if not file.open(QFile.WriteOnly | QFile.Text):
                QMessageBox.critical(self, appname + version + "Save",
                                     "Writing Error %s:\n%s." % (filename, file.errorString()))
                return
            outstr = QTextStream(file)
            outstr << self.ui.plainTextEdit.toPlainText()
            QMessageBox.information(self, appname + version + "Save file",
                                    "The file is saved. \n%s" % (file.fileName()))

    def ouvrirtexte(self):
        filename, _ = QFileDialog.getOpenFileName(self)
        if filename:
            file = QFile(filename)
            if not file.open(QFile.ReadOnly | QFile.Text):
                QMessageBox.critical(self, appname + version + "Open File",
                                     "Reading Error %s:\n%s." % (filename, file.errorString()))
                return
            instr = QTextStream(file)
            self.ui.plainTextEdit.setPlainText(instr.readAll())

    def vidertampon(self):
        self.ui.plainTextEdit.clear()

    def tampondecrypt(self):
        encrypted_string = str(self.ui.plainTextEdit.toPlainText())
        gpg = gnupg.GPG(use_agent=False)

        decrypted_data = gpg.decrypt(encrypted_string)

        if decrypted_data.ok is True:
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText(str(decrypted_data))
        else:
            QMessageBox.warning(self, appname + version + "Invalid passphrase",
                                ''' Invalid passphrase.''',
                                QMessageBox.Ok)
            return

    def hashfileripemd_160(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "RIPEMD-160: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'RIPEMD-160')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash RIPEMD-160 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileripemd_128(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "RIPEMD-128: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'RIPEMD-128')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash RIPEMD-128 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilemd2(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "MD2: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'MD2')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash MD2 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilemd4(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "MD4: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'MD4')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash MD4 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilemd5(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "MD5: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'MD5')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash MD5 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha512(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "SHA-512: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-512')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-512 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha384(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "SHA-384: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-384')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-384 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha256(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "SHA-256: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-256')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-256 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha224(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "SHA-224: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)")
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-224')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-224 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfilesha(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "SHA-1: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'SHA-1')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-1 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileWhirlpool(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Whirlpool: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Whirlpool')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash Whirlpool -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileTiger(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Tiger: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Tiger')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash Tiger -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileAdler32(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Adler32: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Adler32')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash Adler32 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileCrc24(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Crc24: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'CRC24')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash CRC24 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileCrc32(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Crc32: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'CRC32')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash CRC32 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileKeccak_1600(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "SHA-3 Keccak-1600: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Keccak-1600')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash SHA-3 Keccak-1600 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileSkein_512(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Skein_512: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'Skein-512')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash Skein-512 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def hashfileGOST_34_11(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "GOST 34.11: Select File", "",
                                                  "All Files (*);;Text Files (*.txt)", )
        if filename:
            output = simplehash.get_file_checksum(filename, 'GOST-34.11')
            self.ui.plainTextEdit.clear()
            self.ui.plainTextEdit.appendPlainText("----------------------------------------------")
            self.ui.plainTextEdit.appendPlainText("Hash GOST 34.11 -->" + filename)
            self.ui.plainTextEdit.appendPlainText(output)

    def decryptfile(self):
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  "Select encrypted file", "",
                                                  "GPG files (*.gpg);;Tous (*)")
        if filename:
            m_key, ok = QInputDialog.getText(self, "Enter your passphrase",
                                             "Key:", QLineEdit.Normal)
            if ok and m_key != '':
                lname = os.path.splitext(filename)[0].split("_")[-1]

                self.originalfile = filename
                self.afterfile = lname
                encryordecry = False
                sym = False

                self.myLongTask = Crypto_gpg.Worker(filename, m_key, encryordecry, lname, sym)
                self.myLongTask.renderedImage.connect(self.updatePixmap)
                self.myLongTask.isstarted.connect(self.isstarted)
                self.myLongTask.start()

            else:
                QMessageBox.warning(self, appname + version + "Error",
                                    ''' You must enter a passphrase ''',
                                    QMessageBox.Ok)

    def isstarted(self, status):
        if status == "True":
            self.progress = QProgressDialog("Work in progress...", "Cancel", 0, 0)
            self.progress.setWindowTitle(appname + version)
            self.progress.setWindowModality(Qt.ApplicationModal)
            self.progress.exec()
        else:
            self.progress.close()
Beispiel #3
0
class TLabAppQt(QWidget, McSimulationRunner):
    """"""
    def __init__(self,
                 name,
                 env_config,
                 instr_params,
                 gui=True,
                 dummy=False,
                 vr_name=''):
        QWidget.__init__(self,
                         env_config=env_config,
                         instr_params=instr_params)

        self.gui = gui
        self.dummy = dummy
        self.vr_name = vr_name
        self.progress_dialog = None
        self.timer = None
        self.time_passed = 0.
        self.steps_passed = 0
        self.log_scale_y = False
        self.sq_scale_x = False
        self.sim_status = '1/2 Подготовка'
        self.timer_p_int = self.configuration['Simulation poll timer']  # mcsec

        if not gui:
            return

        # setting up the figure and its canvas for plots
        self.figure = Figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        self.canvas.setFixedWidth(self.configuration['Plot Width'])
        self.canvas.setFixedHeight(self.configuration['Plot Height'])

        # setting up plot axes
        if ('1D detector file name'
                in self.configuration) and ('2D detector file name'
                                            in self.configuration):
            self.axes_1d_detector, self.axes_2d_detector = self.canvas.figure.subplots(
                nrows=1, ncols=2)
        elif '1D detector file name' in self.configuration:
            self.axes_1d_detector = self.canvas.figure.subplots()
            self.axes_2d_detector = None
        elif '2D detector file name' in self.configuration:
            self.axes_1d_detector = None
            self.axes_2d_detector = self.canvas.figure.subplots()
        self.figure.tight_layout()

        # adding plot scale button and registering click callback
        self.log_by = QPushButton('Лог. интенсивность')
        self.log_by.setFixedWidth(0.2 * self.configuration['Plot Width'])
        self.log_by.clicked.connect(self.on_btn_log_y)
        self.sq_bx = QPushButton('Кв. ось x')
        self.sq_bx.setFixedWidth(0.2 * self.configuration['Plot Width'])
        self.sq_bx.clicked.connect(self.on_btn_sq_x)

        # adding the button to run the fit app
        self.fit_b = QPushButton('Анализ результатов')
        self.fit_b.setFixedWidth(0.2 * self.configuration['Plot Width'])
        self.fit_b.clicked.connect(self.on_btn_fit)

        self.save_b = QPushButton('Сохранить результаты')
        self.save_b.setFixedWidth(0.2 * self.configuration['Plot Width'])
        self.save_b.clicked.connect(self.on_btn_save)

        # adding simulation parameters buttons and labels
        self.param_buttons, self.param_labels = [], []
        for i, param in enumerate(self.instr_params):
            self.param_buttons.append(QPushButton(param.gui_name))
            self.param_labels.append(QLabel(str(param)))
            self.param_labels[i].setFrameStyle(QFrame.Sunken | QFrame.Panel)
            self.param_buttons[i].clicked.connect(self.make_callback(i))

        # adding "Simulate" button and registering click callback
        self.run_b = QPushButton('Запуск эксперимента')
        self.run_b.clicked.connect(self.on_btn_run)

        # adding instrument scheme picture
        p_map = QPixmap(self.configuration['instrument scheme'])
        p_map = p_map.scaledToHeight(200, Qt.SmoothTransformation)
        scheme_label = QLabel()
        scheme_label.setPixmap(p_map)

        # setting up Qt window layout
        main_layout = QHBoxLayout()
        param_layout = QGridLayout()
        plot_layout = QVBoxLayout()
        tbr_layout = QHBoxLayout()
        log_layout = QVBoxLayout()
        u_plot_layout = QHBoxLayout()

        tbr_layout.addWidget(self.toolbar, 0)
        log_layout.addWidget(self.log_by, 0)
        log_layout.addWidget(self.sq_bx, 1)
        tbr_layout.addLayout(log_layout, 1)
        plot_layout.addLayout(tbr_layout, 0)
        plot_layout.addWidget(self.canvas, 1)
        u_plot_layout.addWidget(self.fit_b, 0, Qt.AlignRight)
        u_plot_layout.addWidget(self.save_b, 1, Qt.AlignLeft)
        plot_layout.addLayout(u_plot_layout, 3)
        plot_layout.addWidget(scheme_label, 4, Qt.AlignCenter)

        for i, param in enumerate(self.instr_params):
            param_layout.addWidget(self.param_buttons[i], i, 0)
            param_layout.addWidget(self.param_labels[i], i, 1)
        param_layout.addWidget(self.run_b, len(self.instr_params), 1)

        main_layout.addLayout(param_layout, 0)
        main_layout.addLayout(plot_layout, 1)

        self.setLayout(main_layout)

        self.setWindowTitle(name)

    def send_params(self, status='', params=True):
        if not self.configuration['Send VR Data']:
            return
        msg = dict()
        msg['id'] = self.vr_name

        if status:
            msg['id'] += '_' + status

        if status == 'nextstep':
            for param in self.instr_params:
                if type(param.dtype) == ValueRange:
                    msg['next' + param.vr_name] = param.value.start + (param.value.end - param.value.start) * \
                                                  float(self.steps_passed) / self.n_points
                    if self.vr_name == 'stoik':
                        msg['curstep'] = self.steps_passed
                    break

        if params:
            for param in self.instr_params:
                if type(param.dtype) == ValueRange:
                    msg[param.vr_name + 'start'] = param.value.start
                    msg[param.vr_name + 'end'] = param.value.end
                else:
                    msg[param.vr_name] = param.value

        msg = json.dumps(msg)

        async def send_data(data):
            async with websockets.connect(
                    self.configuration['VR server uri']) as websocket:
                await websocket.send(data)

        try:
            asyncio.get_event_loop().run_until_complete(send_data(msg))
            print('Sent', self.configuration['VR server uri'], 'data', msg)
        except (OSError, asyncio.exceptions.TimeoutError) as e:
            print(e)

    def make_callback(self, ii):
        if self.instr_params[ii].value_names:

            def callback():
                item, ok = QInputDialog.getItem(
                    self, self.instr_params[ii].gui_name,
                    self.instr_params[ii].gui_name,
                    self.instr_params[ii].value_names,
                    self.instr_params[ii].values.index(
                        self.instr_params[ii].value), False)
                if ok:
                    self.instr_params[ii].update_by_name(item)
                    self.param_labels[ii].setText("%s" %
                                                  str(self.instr_params[ii]))
                    self.send_params()
        elif self.instr_params[ii].dtype == int:

            def callback():
                res, ok = QInputDialog.getInt(self,
                                              self.instr_params[ii].gui_name,
                                              self.instr_params[ii].gui_name,
                                              self.instr_params[ii].value)
                if ok:
                    self.instr_params[ii].update(res)
                    self.param_labels[ii].setText("%s" %
                                                  str(self.instr_params[ii]))
                    self.send_params()
        elif self.instr_params[ii].dtype == float:

            def callback():
                d, ok = QInputDialog.getDouble(self,
                                               self.instr_params[ii].gui_name,
                                               self.instr_params[ii].gui_name,
                                               self.instr_params[ii].value)
                if ok:
                    self.instr_params[ii].update(d)
                    self.param_labels[ii].setText("%s" %
                                                  str(self.instr_params[ii]))
                    self.send_params()
        elif type(self.instr_params[ii].dtype) == ValueRange:

            def callback():
                text, ok = QInputDialog.getText(self,
                                                self.instr_params[ii].gui_name,
                                                self.instr_params[ii].gui_name,
                                                QLineEdit.Normal,
                                                str(self.instr_params[ii]))
                if ok and text != '':
                    self.instr_params[ii].update(text)
                    self.param_labels[ii].setText("%s" %
                                                  str(self.instr_params[ii]))
                    self.send_params()
        else:

            def callback():
                pass

            print(self.instr_params[ii].dtype)
        return callback

    def _update_plot_axes(self):
        if self.axes_1d_detector:
            self.axes_1d_detector.clear()
            self.axes_1d_detector.set_title(self.result1d.title)
            self.axes_1d_detector.set_xlabel(self.result1d.xlabel)
            self.axes_1d_detector.set_ylabel(self.result1d.ylabel)
            if self.log_scale_y:
                self.axes_1d_detector.set_yscale('log')
            else:
                self.axes_1d_detector.set_yscale('linear')
            if self.sq_scale_x:
                self.axes_1d_detector.errorbar(np.sqrt(self.result1d.xdata),
                                               self.result1d.ydata,
                                               yerr=self.result1d.yerrdata,
                                               zorder=1)
                self.axes_1d_detector.xaxis.set_major_formatter(
                    ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x**2)))
            else:
                self.axes_1d_detector.errorbar(self.result1d.xdata,
                                               self.result1d.ydata,
                                               yerr=self.result1d.yerrdata,
                                               zorder=1)
                self.axes_1d_detector.xaxis.set_major_formatter(
                    ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x)))
        if self.axes_2d_detector:
            self.axes_2d_detector.clear()
            self.axes_2d_detector.set_title(self.result2d.title)
            self.axes_2d_detector.set_xlabel(self.result2d.xlabel)
            self.axes_2d_detector.set_ylabel(self.result2d.ylabel)
            if self.log_scale_y:
                self.axes_2d_detector.imshow(np.log(self.result2d.data),
                                             extent=self.result2d.extent)
            else:
                self.axes_2d_detector.imshow(self.result2d.data,
                                             extent=self.result2d.extent)
        self.figure.tight_layout()
        self.canvas.draw()

    def on_timeout_dummy(self):
        self.time_passed += 1E-3 * self.timer_p_int
        self.progress_dialog.setValue(
            int(100. * self.time_passed / self.sim_eta))
        self.progress_dialog.setLabelText(
            self.sim_status + ": %d сек" %
            (self.sim_eta - int(self.time_passed)))

    def on_timeout(self):
        status = self.sim_process.poll()

        if status is not None:
            self.progress_dialog.setValue(self.progress_dialog.maximum())
            print('Child process returned', status)
            return

        self.time_passed += 1E-3 * self.timer_p_int

        self.sim_stdout.flush()
        self.sim_stderr.flush()

        try:
            out_line = self.sim_stdout.readline().decode()
        except Exception:
            out_line = ''

        try:
            err_line = self.sim_stderr.readline().decode()
        except Exception:
            err_line = ''

        if out_line:
            print(out_line)
        if err_line:
            print(err_line)

        m = re.match(r'Trace ETA (?P<mes>[\d.]+) \[(?P<scale>min|s|h)\]',
                     out_line)
        if m:
            self.time_passed = 0.
            if self.sim_status != '2/2 Вычисление':
                self.sim_status = '2/2 Вычисление'
                if m.group('scale') == 's':
                    self.sim_eta = float(m.group('mes'))
                elif m.group('scale') == 'min':
                    self.sim_eta = float(m.group('mes')) * 60.
                elif m.group('scale') == 'h':
                    self.sim_eta = float(m.group('mes')) * 3600.
            else:
                if m.group('scale') == 's':
                    self.sim_eta = max(self.sim_eta, float(m.group('mes')))
                elif m.group('scale') == 'min':
                    self.sim_eta = max(self.sim_eta,
                                       float(m.group('mes')) * 60.)
                elif m.group('scale') == 'h':
                    self.sim_eta = max(self.sim_eta,
                                       float(m.group('mes')) * 3600.)

        if (self.n_points == 1) or (self.sim_status == '1/2 Подготовка'):
            self.progress_dialog.setValue(
                int(100. * self.time_passed / self.sim_eta))
            self.progress_dialog.setLabelText(
                self.sim_status + ": %d сек" %
                (self.sim_eta - int(self.time_passed)))

        m = re.match(r'INFO: (?P<param>[\S.]+): (?P<val>[\d.]+)$', err_line)
        if m:
            self.sim_status = '2/2 Вычисление'
            self.steps_passed += 1
            self.send_params(status='nextstep', params=False)
        if (self.n_points > 1) and (self.sim_status == '2/2 Вычисление'):
            self.progress_dialog.setValue(
                int(100. * self.steps_passed / self.n_points))
            self.progress_dialog.setLabelText(
                self.sim_status + ": %d / %d шагов" %
                (int(self.steps_passed), self.n_points))

    def await_simulation(self):
        if self.sim_process is None:
            return
        self.sim_eta = self.configuration['Compilation ETA']
        self.time_passed = 0.
        self.steps_passed = 0
        self.sim_status = '1/2 Подготовка'

        self.progress_dialog = QProgressDialog('Ход эксперимента', 'Стоп', 0,
                                               100)
        self.progress_dialog.resize(300, self.progress_dialog.height())
        self.progress_dialog.canceled.connect(self.kill_simulation)

        self.timer = QTimer()
        self.timer.timeout.connect(self.on_timeout)
        self.timer.start(self.timer_p_int)
        self.progress_dialog.exec()
        self.timer.stop()

        self.sim_process.wait()

    def on_btn_run(self, *args, **kwargs):
        self.send_params(status='experiment', params=True)

        if self.dummy:
            self.update_sim_results(
                self.configuration['Backup Data Directory'])

            self.sim_eta = self.configuration['Dummy ETA']
            self.time_passed = 0.
            self.steps_passed = 0
            self.sim_status = 'Вычисление'

            self.progress_dialog = QProgressDialog('Ход эксперимента', 'Стоп',
                                                   0, 100)
            self.progress_dialog.resize(300, self.progress_dialog.height())

            self.timer = QTimer()
            self.timer.timeout.connect(self.on_timeout_dummy)
            self.timer.start(self.timer_p_int)
            self.progress_dialog.exec()
            self.timer.stop()

            self._update_plot_axes()
            self.send_params(status='experiment_end', params=False)
            return

        self.open_simulation(*args, **kwargs)
        self.await_simulation()

        if self.sim_process.poll() >= 0:
            self.update_sim_results()
            self._update_plot_axes()
            self._cleanup()
            self.send_params(status='experiment_end', params=False)
        else:
            self.send_params(status='experiment_cancel', params=False)

    def on_btn_log_y(self, *args):
        self.log_scale_y = not self.log_scale_y

        if self.log_scale_y:
            self.log_by.setText('Лин. интенсивность')
        else:
            self.log_by.setText('Лог. интенсивность')

        self._update_plot_axes()

    def on_btn_sq_x(self, *args):
        self.sq_scale_x = not self.sq_scale_x

        if self.sq_scale_x:
            self.sq_bx.setText('Лин. ось x')
        else:
            self.sq_bx.setText('Кв. ось x')

        self._update_plot_axes()

    def on_btn_fit(self, *args):
        if self.axes_1d_detector is not None and len(self.result1d.xdata) > 0:
            fit_app = TFitAppQt(self.result1d)
            fit_app.show()

    def on_btn_save(self, *args):
        options = QFileDialog.Options() | QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(
            self,
            "Сохранить файл",
            "",
            "All Files (*);;Text Files (*.txt)",
            options=options)
        if fileName:
            print('Results saved to %s' % fileName)
            np.savetxt(
                fileName,
                np.stack((self.result1d.xdata, self.result1d.ydata,
                          self.result1d.yerrdata)).T)