def _insertChildrenDefects(self): """Insert every children defect in database as DefectView under this node""" defects = self.controller.getDefects() for defect in defects: defect_o = DefectController(Defect(defect)) defect_vw = DefectView(self.appliTw, self.appliViewFrame, self.mainApp, defect_o) defect_vw.addInTreeview(str(self.controller.getDbId()))
def createDefectCallback(self, _event=None): """Callback for tool click #TODO move to ToolController Creates an empty defect view and open it's insert window with notes = tools notes. """ modelData = self.controller.getData() toExport = modelData["notes"] for widget in self.appliViewFrame.winfo_children(): widget.destroy() dv = DefectView(self.appliTw, self.appliViewFrame, self.mainApp, DefectController(Defect(modelData))) dv.openInsertWindow(toExport)
def addDefectCallback(self, _event): """ Create an empty defect model and its attached view. Open this view insert window. Args: _event: Automatically generated with a button Callback, not used. """ for widget in self.appliViewFrame.winfo_children(): widget.destroy() modelData = self.controller.getData() dv = DefectView(self.appliTw, self.appliViewFrame, self.mainApp, DefectController(Defect(modelData))) dv.openInsertWindow(modelData.get("notes", ""))
def addInTreeview(self, parentNode=None, addChildren=True): """Add this view in treeview. Also stores infos in application treeview. Args: parentNode: if None, will calculate the parent. If setted, forces the node to be inserted inside given parentNode. addChildren: If False, skip the tool and defects insert. Useful when displaying search results """ if parentNode is None: parentNode = self.getParent() nodeText = str(self.controller.getModelRepr()) elif parentNode == '': nodeText = self.controller.getDetailedString() else: nodeText = str(self.controller.getModelRepr()) self.appliTw.views[str(self.controller.getDbId())] = {"view": self} try: self.appliTw.insert(parentNode, "end", str(self.controller.getDbId()), text=nodeText, tags=self.controller.getTags(), image=self.getClassIcon()) except TclError: pass if addChildren: defects = self.controller.getDefects() for defect in defects: defect_o = DefectController(Defect(defect)) defect_vw = DefectView(self.appliTw, self.appliViewFrame, self.mainApp, defect_o) defect_vw.addInTreeview(str(self.controller.getDbId())) tools = self.controller.getTools() for tool in tools: tool_o = ToolController(Tool(tool)) tool_vw = ToolView(self.appliTw, self.appliViewFrame, self.mainApp, tool_o) tool_vw.addInTreeview(str(self.controller.getDbId())) tools = self.controller.getTools() atleastone = False for tool in tools: # SALE atleastone = True break if not atleastone: if len(self.controller.getTags()) == 0: self.controller.addTag("unscanned") self.appliTw.sort(parentNode) if "hidden" in self.controller.getTags(): self.hide()
def __init__(self, parent, settings, defectModel=None): """ Open a child dialog of a tkinter application to choose autoscan settings. Args: parent: the tkinter parent view to use for this window construction. defectModel : A Defect Model object to load default values. None to have empty fields, default is None. """ self.app = tk.Toplevel(parent) self.app.title("Add a security defect") self.app.resizable(False, False) self.rvalue = None appFrame = ttk.Frame(self.app) self.isInsert = defectModel is None if self.isInsert: defectModel = Defect() self.defect_vw = DefectView(None, appFrame, DummyMainApp(settings), DefectController(defectModel)) if self.isInsert: self.defect_vw.openInsertWindow(addButtons=False) else: self.defect_vw.openModifyWindow(addButtons=False) ok_button = ttk.Button(appFrame, text="OK") ok_button.pack(side="right", padx=5, pady=10) ok_button.bind('<Button-1>', self.okCallback) cancel_button = ttk.Button(appFrame, text="Cancel") cancel_button.pack(side="right", padx=5, pady=10) cancel_button.bind('<Button-1>', self.cancel) appFrame.pack(fill=tk.BOTH, ipady=10, ipadx=10) self.app.transient(parent) try: self.app.wait_visibility() self.app.grab_set() except tk.TclError: pass
def _load(self): """ Load the treeview with database information """ mongoInstance = MongoCalendar.getInstance() dialog = ChildDialogProgress(self.appli, "Loading "+str( mongoInstance.calendarName), "Opening "+str(mongoInstance.calendarName) + ". Please wait for a few seconds.", 200, "determinate") step = 0 dialog.show(100) nbObjects = mongoInstance.find("waves").count() nbObjects += mongoInstance.find("scopes").count() nbObjects += mongoInstance.find("intervals").count() nbObjects += mongoInstance.find("scopes").count() nbObjects += mongoInstance.find("ips").count() nbObjects += mongoInstance.find("ports").count() nbObjects += mongoInstance.find("tools").count() onePercentNbObject = nbObjects//100 if nbObjects > 100 else 1 nbObjectTreated = 0 for child in self.get_children(): self.delete(child) self._hidden = [] self._detached = [] self.waves_node = self.insert("", "end", str( "waves"), text="Waves", image=WaveView.getClassIcon()) # Loading every category separatly is faster than recursivly. # This is due to cursor.next function calls in pymongo # Adding wave objects waves = Wave.fetchObjects({}) for wave in waves: wave_o = WaveController(wave) wave_vw = WaveView(self, self.appli.viewframe, self.appli, wave_o) wave_vw.addInTreeview(self.waves_node, False) nbObjectTreated += 1 if nbObjectTreated % onePercentNbObject == 0: step += 1 dialog.update(step) scopes = Scope.fetchObjects({}) for scope in scopes: scope_o = ScopeController(scope) scope_vw = ScopeView(self, self.appli.viewframe, self.appli, scope_o) scope_vw.addInTreeview(None, False) nbObjectTreated += 1 if nbObjectTreated % onePercentNbObject == 0: step += 1 dialog.update(step) intervals = Interval.fetchObjects({}) for interval in intervals: interval_o = IntervalController(interval) interval_vw = IntervalView(self, self.appli.viewframe, self.appli, interval_o) interval_vw.addInTreeview(None, False) nbObjectTreated += 1 if nbObjectTreated % onePercentNbObject == 0: step += 1 dialog.update(step) # Adding ip objects self.ips_node = self.insert("", "end", str( "ips"), text="IPs", image=IpView.getClassIcon()) ips = Ip.fetchObjects({}) for ip in ips: ip_o = IpController(ip) ip_vw = IpView(self, self.appli.viewframe, self.appli, ip_o) ip_vw.addInTreeview(None, False) self.appli.statusbar.notify(ip_vw.controller.getTags()) nbObjectTreated += 1 if nbObjectTreated % onePercentNbObject == 0: step += 1 dialog.update(step) # Adding port objects ports = Port.fetchObjects({}) for port in ports: port_o = PortController(port) port_vw = PortView(self, self.appli.viewframe, self.appli, port_o) port_vw.addInTreeview(None, False) self.appli.statusbar.notify(port_vw.controller.getTags()) nbObjectTreated += 1 if nbObjectTreated % onePercentNbObject == 0: step += 1 dialog.update(step) # Adding defect objects defects = Defect.fetchObjects({"ip":{"$ne":""}}) for defect in defects: defect_o = DefectController(defect) defect_vw = DefectView( self, self.appli.viewframe, self.appli, defect_o) defect_vw.addInTreeview(None) nbObjectTreated += 1 if nbObjectTreated % onePercentNbObject == 0: step += 1 dialog.update(step) # Adding tool objects tools = Tool.fetchObjects({}) for tool in tools: tool_o = ToolController(tool) tool_vw = ToolView(self, self.appli.viewframe, self.appli, tool_o) tool_vw.addInTreeview(None, False) self.appli.statusbar.notify(tool_vw.controller.getTags()) nbObjectTreated += 1 if nbObjectTreated % onePercentNbObject == 0: step += 1 dialog.update(step) self.sort(self.ips_node) self.appli.statusbar.update() dialog.destroy()
def notify(self, db, collection, iid, action, _parent): """ Callback for the observer implemented in mongo.py. Each time an object is inserted, updated or deleted the standard way, this function will be called. Args: collection: the collection that has been modified iid: the mongo ObjectId _id that was modified/inserted/deleted action: string "update" or "insert" or "delete". It was the action performed on the iid _parent: Not used. the mongo ObjectId of the parent. Only if action in an insert. Not used anymore """ mongoInstance = MongoCalendar.getInstance() if not mongoInstance.hasACalendarOpen(): return if mongoInstance.calendarName != db: return # Delete if action == "delete": if collection == "defects": view = self.getViewFromId(str(iid)) if view is not None: view.beforeDelete() self.appli.statusbar.notify([],view.controller.getTags()) try: self.delete(ObjectId(iid)) except tk.TclError: pass # item was not inserted in the treeview # Insert if action == "insert": view = None res = mongoInstance.find(collection, {"_id": ObjectId(iid)}, False) if collection == "tools": view = ToolView(self, self.appli.viewframe, self.appli, ToolController(Tool(res))) elif collection == "waves": view = WaveView(self, self.appli.viewframe, self.appli, WaveController(Wave(res))) elif collection == "scopes": view = ScopeView(self, self.appli.viewframe, self.appli, ScopeController(Scope(res))) elif collection == "ports": view = PortView(self, self.appli.viewframe, self.appli, PortController(Port(res))) elif collection == "ips": view = IpView(self, self.appli.viewframe, self.appli, IpController(Ip(res))) elif collection == "intervals": view = IntervalView(self, self.appli.viewframe, self.appli, IntervalController(Interval(res))) elif collection == "defects": view = DefectView(self, self.appli.viewframe, self.appli, DefectController(Defect(res))) try: if view is not None: view.addInTreeview() view.insertReceived() self.appli.statusbar.notify(view.controller.getTags()) except tk.TclError: pass if action == "update": try: view = self.getViewFromId(str(iid)) if view is not None: oldTags = self.item(str(iid))["tags"] view.controller.actualize() self.appli.statusbar.notify(view.controller.getTags(), oldTags) self.item(str(iid), text=str( view.controller.getModelRepr()), image=view.getIcon()) except tk.TclError: if view is not None: view.addInTreeview() if str(self.appli.openedViewFrameId) == str(iid): for widget in self.appli.viewframe.winfo_children(): widget.destroy() view.openModifyWindow() if view is not None: view.updateReceived() self.appli.statusbar.update()