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)
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)