示例#1
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(QMainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.retranslateUi(self)

        self.ui.tabClients.setTabsClosable(True)
        self.ui.tabClients.tabCloseRequested.connect(self.tab_close_requested)

        self.scanDevice = ScanDevice()
        self.scanDevice.new_device.connect(self.ui.lwdScanResult.addItem)
        self.ui.cmbServiceIp.addItems(self.scanDevice.get_host_ip())
        self.ui.cmbServiceIp.currentIndexChanged.connect(
            self.scanDevice.set_current_index)

        self.server = Server(self.ui.cmbServiceIp.currentText(),
                             int(self.ui.leServerPort.text()), self)
        self.server.new_client.connect(self.new_client)
        self.ui.btnRestartServer.clicked.connect(self.restart_server)

        self.ui.btnScanDevice.clicked.connect(self.scan_device)
        self.ui.lwdScanResult.itemDoubleClicked.connect(
            self.lwd_scan_result_double_clicked)

        self.__double_tag = None

        self.titleToClient = {}

    def new_client(self, client):
        tag = self.__double_tag
        if tag:
            index = self.find_tab(tag)
            if index == -1:
                message_ctrl = MessageCtrl(client, self)
                self.ui.tabClients.addTab(message_ctrl, self.__double_tag)
            else:
                message_ctrl = self.ui.tabClients.widget(index)
                message_ctrl.set_new_client(client)
            self.__double_tag = None

    def restart_server(self):
        self.clear_result()
        self.server.restart_server(self.ui.cmbServiceIp.currentText(),
                                   int(self.ui.leServerPort.text()))

    # 找到指定title,return index,否则return -1
    def find_tab(self, title):
        for index in range(self.ui.tabClients.count()):
            if self.ui.tabClients.tabText(index) == title:
                return index
        return -1

    def scan_device(self):
        self.ui.lwdScanResult.clear()
        self.scanDevice.search()

    def lwd_scan_result_double_clicked(self, item):
        tag = item.text()
        self.__double_tag = tag
        if self.find_tab(tag) == -1:
            self.scanDevice.connect_device(tag.split(":")[1])

    def close_tab(self, index):
        tag = self.ui.tabClients.tabText(index)
        self.scanDevice.disconnect_device(tag.split(":")[1])
        self.ui.tabClients.removeTab(index)

    def tab_close_requested(self, index):
        self.close_tab(index)

    def clear_result(self):
        self.ui.lwdScanResult.clear()
        count = self.ui.tabClients.count()
        for index in range(count):
            self.close_tab(0)
示例#2
0
class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(ApplicationWindow, self).__init__()
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self._translate = self.ui.retranslateUi(self)

        self.ui.tabWidget.clear()

        self.model = QFileSystemModel()
        self.model.setRootPath(QtCore.QDir().rootPath())
        #        self.model.setFilter(QtCore.QDir().AllDirs|QtCore.QDir().NoDot)
        self.model.setNameFilters(filters)
        source = self.model.index(QtCore.QDir().homePath())

        self.proxyModel = QtCore.QSortFilterProxyModel(self)
        self.proxyModel.setSourceModel(self.model)
        self.proxyModel.setDynamicSortFilter(True)
        index = self.proxyModel.mapFromSource(source)

        self.ui.treeView.setModel(self.model)
        self.ui.treeView.setRootIndex(source)

        #        self.ui.treeView.setModel(self.proxyModel)
        #        self.ui.treeView.setRootIndex(index)

        #        self.ui.treeView.setRootIndex(self.model.index(user_home()))
        #        self.ui.treeView.setModel(self.proxyModel)
        #        self.ui.treeView.setRootIndex(self.proxyModel)

        [self.ui.treeView.setColumnHidden(cols, True) for cols in range(1, 4)]
        self.ui.treeView.doubleClicked.connect(self.onClick)
        self.ui.treeView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.ui.treeView.customContextMenuRequested.connect(
            self.create_popup_menu)

        self.ui.filedirsearch.textChanged.connect(self.textFilter)
        self.ui.actionOpenProject.triggered.connect(self.openProjDialog)
        self.ui.actionOpenFile.triggered.connect(self.openFileDialog)
        self.ui.actionAbout_Qt.triggered.connect(self.aboutQt)
        self.ui.actionQuit.triggered.connect(self.close)
        self.ui.action_Save.triggered.connect(self.save)

        self.ui.tabWidget.tabCloseRequested.connect(self.removeTab)
        self.textFilter()

    def add_cb(self):
        print "add callback"

    def new_file(self):
        pass

    def load_yaml_to_gui(self, path):
        self.ui.tabWidget.addTab(self.addXCCDFTab(path),
                                 os.path.basename(path))
        data = open_yaml(path)
        if data is not None:
            if "title" in data:
                self.ui.txtTitle.setText(data['title'])
            if "description" in data:
                self.ui.txtDesc.setPlainText(data['description'])

            if path.endswith(".rule"):
                if "severity" in data:
                    self.ui.severityComboBox.setCurrentText(
                        data['severity'].title())
                if "ocil_clause" in data:
                    self.ui.txtOCILclause.setText(data['ocil_clause'])
                if "ocil" in data:
                    self.ui.txtOCIL.setPlainText(data['ocil'])
                if "rationale" in data:
                    self.ui.txtRationale.setPlainText(data['rationale'])
                header = self.ui.identsTable
                header.setHorizontalHeaderLabels(["OS", "CCE"])
                header.setColumnCount(3)
                header.verticalHeader().hide()
                header.setHorizontalHeaderItem(
                    0, QtWidgets.QTableWidgetItem("Identifier Type"))
                header.setHorizontalHeaderItem(
                    1, QtWidgets.QTableWidgetItem("Operating System"))
                header.setHorizontalHeaderItem(
                    2, QtWidgets.QTableWidgetItem("Identifier"))
                header.setColumnWidth(0, 137)
                header.setColumnWidth(1, 160)
                header.setColumnWidth(2, 137)
                header.insertRow(header.rowCount())
                if "identifiers" in data:
                    for row, keys in enumerate(data["identifiers"].keys()):
                        val = data["identifiers"][keys]
                        if "@" in keys:
                            ident_type = keys.split("@")[0]
                            os_type = keys.split("@")[1]
                        else:
                            ident_type = keys
                            os_type = "All"
                        header.setItem(row, 0,
                                       QtWidgets.QTableWidgetItem(ident_type))
                        header.setItem(row, 1,
                                       QtWidgets.QTableWidgetItem(os_type))
                        header.setItem(row, 2, QtWidgets.QTableWidgetItem(val))
                        header.insertRow(header.rowCount())
#                header.doubleClicked.connect()

                self.ui.severityComboBox.activated.connect(self.onChange)
                self.ui.txtOCIL.textChanged.connect(self.onChange)
                self.ui.txtOCILclause.textChanged.connect(self.onChange)
                self.ui.txtRationale.textChanged.connect(self.onChange)


#        if path.endswith(".profile"):
#            tv = self.ui.tableView
#            header = ['rule_selection']
#        tm = MyTableModel(self.tabledata, header, self)
#        tv.setModel(tm)
#
#        # hide grid
##            tv.setShowGrid(True)
#
#        # set the font
#        font = QFont("Courier New", 8)
#        tv.setFont(font)
#
#        # hide vertical header
#            vh = tv.verticalHeader()
#            vh.setVisible(False)
#
#        # set horizontal header properties
#            hh = tv.horizontalHeader()
#            hh.setStretchLastSection(True)
#
#        # set column width to fit contents
#            tv.resizeColumnsToContents()
#
#        # set row height
#        nrows = len(self.tabledata)
#        for row in xrange(nrows):
#            tv.setRowHeight(row, 18)
#
##        # enable sorting
#            tv.setSortingEnabled(True)
#
#        self.model = QtGui.QStandardItemModel(parent=self)
#        self.model.setHorizontalHeaderLabels(['Source', 'Destination', 'Protoco', 'Info'])
#        self.setModel(self.model)
#        self.setColumnWidth(0, 120)
#        self.setColumnWidth(1, 120)
#        self.setColumnWidth(2, 100)
#        self.setColumnWidth(3, 350)
#        self.setAlternatingRowColors(True)
#        self.setAutoScroll(True)
#        self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
#        self.setEditTriggers(QtGui.QTableView.NoEditTriggers)
#        self.setSelectionMode(QtGui.QTableView.SingleSelection)
#            for selection in data["selections"]:
#                tv.setItem(selection)
#
#
#
        self.ui.txtDesc.textChanged.connect(self.onChange)
        self.ui.txtTitle.textChanged.connect(self.onChange)

    def addXCCDFTab(self, path):
        self.ui.tab = QtWidgets.QWidget()
        _translate = QtCore.QCoreApplication.translate
        self.ui.tab.setObjectName("tab")
        self.ui.formLayoutWidget = QtWidgets.QWidget(self.ui.tab)
        self.ui.formLayoutWidget.setGeometry(QtCore.QRect(10, 10, 501, 541))
        self.ui.formLayoutWidget.setObjectName("formLayoutWidget")
        self.ui.scap = QtWidgets.QFormLayout(self.ui.formLayoutWidget)
        self.ui.scap.setContentsMargins(1, 1, 1, 1)
        self.ui.scap.setObjectName("scap")
        self.ui.lblscap = QtWidgets.QLabel(self.ui.formLayoutWidget)
        self.ui.lblscap.setObjectName("lblscap")
        self.ui.scap.setWidget(0, QtWidgets.QFormLayout.LabelRole,
                               self.ui.lblscap)
        self.ui.txtTitle = QtWidgets.QLineEdit(self.ui.formLayoutWidget)
        self.ui.txtTitle.setObjectName("txtTitle")
        self.ui.scap.setWidget(0, QtWidgets.QFormLayout.FieldRole,
                               self.ui.txtTitle)
        self.ui.lbldesc = QtWidgets.QLabel(self.ui.formLayoutWidget)
        self.ui.lbldesc.setObjectName("lbldesc")
        self.ui.scap.setWidget(1, QtWidgets.QFormLayout.LabelRole,
                               self.ui.lbldesc)
        self.ui.txtDesc = QtWidgets.QPlainTextEdit(self.ui.formLayoutWidget)
        self.ui.txtDesc.setObjectName("txtDesc")
        self.ui.scap.setWidget(1, QtWidgets.QFormLayout.FieldRole,
                               self.ui.txtDesc)

        self.ui.lblscap.setText(_translate("MainWindow", "Title"))
        self.ui.lbldesc.setText(_translate("MainWindow", "Description"))

        if path.endswith(".rule"):
            self.ui.severityLabel = QtWidgets.QLabel(self.ui.formLayoutWidget)
            self.ui.severityLabel.setObjectName("severityLabel")
            self.ui.scap.setWidget(2, QtWidgets.QFormLayout.LabelRole,
                                   self.ui.severityLabel)
            self.ui.severityComboBox = QtWidgets.QComboBox(
                self.ui.formLayoutWidget)
            self.ui.severityComboBox.setObjectName("severityComboBox")
            self.ui.scap.setWidget(2, QtWidgets.QFormLayout.FieldRole,
                                   self.ui.severityComboBox)
            self.ui.identsLabel = QtWidgets.QLabel(self.ui.formLayoutWidget)
            self.ui.identsLabel.setObjectName("identsLabel")
            self.ui.scap.setWidget(3, QtWidgets.QFormLayout.LabelRole,
                                   self.ui.identsLabel)
            self.ui.identsTable = QtWidgets.QTableWidget(
                self.ui.formLayoutWidget)
            self.ui.identsTable.setObjectName("identsTable")
            self.ui.scap.setWidget(3, QtWidgets.QFormLayout.FieldRole,
                                   self.ui.identsTable)

            self.ui.oCILClauseLabel = QtWidgets.QLabel(
                self.ui.formLayoutWidget)
            self.ui.oCILClauseLabel.setObjectName("oCILClauseLabel")
            self.ui.scap.setWidget(4, QtWidgets.QFormLayout.LabelRole,
                                   self.ui.oCILClauseLabel)
            self.ui.txtOCILclause = QtWidgets.QLineEdit(
                self.ui.formLayoutWidget)
            self.ui.txtOCILclause.setObjectName("txtOCILclause")
            self.ui.scap.setWidget(4, QtWidgets.QFormLayout.FieldRole,
                                   self.ui.txtOCILclause)
            self.ui.oCILLabel = QtWidgets.QLabel(self.ui.formLayoutWidget)
            self.ui.oCILLabel.setObjectName("oCILLabel")
            self.ui.scap.setWidget(5, QtWidgets.QFormLayout.LabelRole,
                                   self.ui.oCILLabel)
            self.ui.txtOCIL = QtWidgets.QPlainTextEdit(
                self.ui.formLayoutWidget)
            self.ui.txtOCIL.setObjectName("txtOCIL")
            self.ui.scap.setWidget(5, QtWidgets.QFormLayout.FieldRole,
                                   self.ui.txtOCIL)
            self.ui.oRationaleLabel = QtWidgets.QLabel(
                self.ui.formLayoutWidget)
            self.ui.oRationaleLabel.setFrameShape(QtWidgets.QFrame.NoFrame)
            self.ui.oRationaleLabel.setObjectName("oRationaleLabel")
            self.ui.scap.setWidget(6, QtWidgets.QFormLayout.LabelRole,
                                   self.ui.oRationaleLabel)
            self.ui.txtRationale = QtWidgets.QPlainTextEdit(
                self.ui.formLayoutWidget)
            self.ui.txtRationale.setObjectName("txtRationale")
            self.ui.scap.setWidget(6, QtWidgets.QFormLayout.FieldRole,
                                   self.ui.txtRationale)

            self.ui.identsLabel.setText(
                _translate("MainWindow", "Indentifiers"))
            self.ui.severityLabel.setText(_translate("MainWindow", "Severity"))
            self.ui.oCILClauseLabel.setText(
                _translate("MainWindow", "OCIL Clause"))
            self.ui.oCILLabel.setText(_translate("MainWindow", "OCIL"))
            self.ui.oRationaleLabel.setText(
                _translate("MainWindow", "Rationale"))

            [self.ui.severityComboBox.addItem(sevs) for sevs in severity]
        if path.endswith(".profile"):
            self.ui.selectionLabel = QtWidgets.QLabel(self.ui.formLayoutWidget)
            self.ui.selectionLabel.setObjectName("selectionLabel")
            self.ui.scap.setWidget(2, QtWidgets.QFormLayout.LabelRole,
                                   self.ui.selectionLabel)

            self.ui.selectionLabel.setText(
                _translate("MainWindow", "Rule Selection"))

        return self.ui.tab

    def onClick(self, index):
        path = self.sender().model().filePath(index)
        if not self.sender().model().isDir(index):
            self.load_yaml_to_gui(path)
        else:
            #            if path.endswith(".."):
            #                path = path.rsplit("/", 2)[0]
            #                print index
            self.ui.treeView.setRootIndex(index)

    def openProjDialog(self):
        dirname = QFileDialog()
        dirname.setFileMode(QFileDialog.Directory)
        dirname = QFileDialog.getExistingDirectory(
            self,
            "Open Project Folder",
            options=QFileDialog.DontUseNativeDialog
            | QFileDialog.HideNameFilterDetails | QFileDialog.ShowDirsOnly)

        if dirname != "":
            self.setDirectory(dirname)
        else:
            self.setDirectory(QtCore.QDir().homePath())

    def openFileDialog(self):
        fname = QFileDialog()
        fname.setFileMode(QFileDialog.Directory)
        fname = QFileDialog.getOpenFileNames(
            self,
            "Select File to Open",
            QtCore.QDir().homePath(),
            "All (*.rule *.group *.profile);;Rules ( *.rule);;Groups (*.group);;Profiles (*.profile)",
            options=QFileDialog.DontUseNativeDialog)
        path = "".join(fname[0])
        if path:
            self.load_yaml_to_gui(path)

    def saveFileDialog(self, path):
        quit_msg = "Save changes before closing?"
        reply = QtWidgets.QMessageBox.question(self, 'Message', quit_msg,
                                               QtWidgets.QMessageBox.Yes,
                                               QtWidgets.QMessageBox.No)

        if reply == QtWidgets.QMessageBox.Yes:
            yaml_dict = UnsortableOrderedDict([
                ("documentation_complete", "true"),
            ])
            yaml_dict["title"] = self.ui.txtTitle.text()
            yaml_dict["description"] = self.ui.txtDesc.toPlainText()
            if path.endswith("*.rule"):
                yaml_dict["severity"] = self.ui.severityComboBox.currentText(
                ).lower()
                yaml_dict["ocil_clause"] = self.ui.txtOCILclause.text()
                yaml_dict["ocil"] = self.ui.txtOCIL.toPlainText()
                yaml_dict["rationale"] = self.ui.txtRationale.toPlainText()

            write_yaml(yaml_dict, path.strip("*"))

    def save(self, index):
        index = self.ui.tabWidget.currentIndex()
        filename = self.ui.tabWidget.tabText(index)
        yaml_dict = UnsortableOrderedDict([
            ("documentation_complete", "true"),
        ])
        yaml_dict["title"] = self.ui.txtTitle.text()
        yaml_dict["description"] = self.ui.txtDesc.toPlainText()
        if filename.endswith(".rule"):
            yaml_dict["severity"] = self.ui.severityComboBox.currentText(
            ).lower()
            yaml_dict["ocil_clause"] = self.ui.txtOCILclause.text()
            yaml_dict["ocil"] = self.ui.txtOCIL.toPlainText()
            yaml_dict["rationale"] = self.ui.txtRationale.toPlainText()

        write_yaml(yaml_dict, self.ui.tabWidget.tabText(index).strip("*"))
        self.ui.tabWidget.setTabText(index, filename.strip("*"))

    def setDirectory(self, directory):
        self.ui.treeView.setModel(self.model)
        self.ui.treeView.setRootIndex(self.model.index(directory))

    def create_popup_menu(self, pos):
        self.popup_menu = QtWidgets.QMenu()
        self.popup_menu.addAction("New", self.add_cb)
        self.popup_menu.addAction("Rename", self.add_cb)
        self.popup_menu.addSeparator()
        self.popup_menu.addAction("Delete", self.add_cb)

        self.popup_menu.exec_(self.ui.treeView.viewport().mapToGlobal(pos))

    def on_context_menu(self, pos):
        node = self.treeWidget.mapToGlobal(pos)
        self.popup_menu.exec_(self.treeWidget.mapToGlobal(pos))

    def textFilter(self):
        regExp = QtCore.QRegExp(self.ui.filedirsearch.text(),
                                QtCore.Qt.CaseInsensitive)
        self.proxyModel.setFilterRegExp(regExp)

    def removeTab(self, index):
        if self.ui.tabWidget.tabText(index).startswith("*"):
            self.saveFileDialog(self.ui.tabWidget.tabText(index))
        self.ui.tabWidget.removeTab(index)

    def onChange(self):
        index = self.ui.tabWidget.currentIndex()
        filename = self.ui.tabWidget.tabText(index)
        if not filename.startswith("*"):
            filename = "*" + filename
        self.ui.tabWidget.setTabText(index, filename)

    def aboutQt(self):
        QMessageBox.aboutQt(self)