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 but mandatory. """ 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()
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.getParentNode() 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())) self.appliTw.sort(parentNode) if "hidden" in self.controller.getTags(): self.hide()
def __init__(self, parent, settings, defectModel=None, multi=False): """ 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) if defectModel is not None: if defectModel.isTemplate: self.app.title("Edit a security defect template") else: self.app.title("Edit a security defect") else: self.app.title("Add a security defect") self.app.resizable(True, True) self.app.geometry("800x600") container = ttk.Frame(self.app) container.columnconfigure(0, weight=1) container.rowconfigure(0, weight=1) self.rvalue = None self.canvas = tk.Canvas(container, bg="white") self.appFrame = ttk.Frame(self.canvas) self.myscrollbar = tk.Scrollbar(container, orient="vertical", command=self.canvas.yview) self.canvas.bind('<Enter>', self.boundToMousewheel) self.canvas.bind('<Leave>', self.unboundToMousewheel) self.canvas.bind( '<Configure>', lambda e: self.canvas.configure(scrollregion=self. canvas.bbox("all"))) self.canvas_main_frame = self.canvas.create_window( (0, 0), window=self.appFrame, anchor='nw') self.canvas.configure(yscrollcommand=self.myscrollbar.set) self.isInsert = defectModel is None self.multi = multi if self.isInsert: defectModel = Defect() self.defect_vw = DefectView(None, self.appFrame, parent, DefectController(defectModel)) if self.isInsert: if multi: self.defect_vw.openMultiInsertWindow(addButtons=False) else: self.defect_vw.openInsertWindow(addButtons=False) else: self.defect_vw.openModifyWindow(addButtons=False) ok_button = ttk.Button(self.appFrame, text="OK") ok_button.pack(side="right", padx=5, pady=10) ok_button.bind('<Button-1>', self.okCallback) cancel_button = ttk.Button(self.appFrame, text="Cancel") cancel_button.pack(side="right", padx=5, pady=10, ipadx=10) cancel_button.bind('<Button-1>', self.cancel) self.canvas.configure(scrollregion=self.canvas.bbox("all")) self.canvas.bind("<Configure>", self.resizeAppFrame) self.canvas.grid(column=0, row=0, sticky="nsew") self.myscrollbar.grid(column=1, row=0, sticky="ns") container.pack(fill=tk.BOTH, ipady=10, ipadx=10, expand=True) # self.appFrame.pack(fill=tk.X, ipady=10, ipadx=10, expand=True) this break the canvas drawing with scrollbar try: self.app.wait_visibility() self.app.transient(parent) self.app.grab_set() self.app.focus_force() self.app.lift() except tk.TclError: pass
class ChildDialogDefectView: """ Open a child dialog of a tkinter application to answer a question. """ def __init__(self, parent, settings, defectModel=None, multi=False): """ 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) if defectModel is not None: if defectModel.isTemplate: self.app.title("Edit a security defect template") else: self.app.title("Edit a security defect") else: self.app.title("Add a security defect") self.app.resizable(True, True) self.app.geometry("800x600") container = ttk.Frame(self.app) container.columnconfigure(0, weight=1) container.rowconfigure(0, weight=1) self.rvalue = None self.canvas = tk.Canvas(container, bg="white") self.appFrame = ttk.Frame(self.canvas) self.myscrollbar = tk.Scrollbar(container, orient="vertical", command=self.canvas.yview) self.canvas.bind('<Enter>', self.boundToMousewheel) self.canvas.bind('<Leave>', self.unboundToMousewheel) self.canvas.bind( '<Configure>', lambda e: self.canvas.configure(scrollregion=self. canvas.bbox("all"))) self.canvas_main_frame = self.canvas.create_window( (0, 0), window=self.appFrame, anchor='nw') self.canvas.configure(yscrollcommand=self.myscrollbar.set) self.isInsert = defectModel is None self.multi = multi if self.isInsert: defectModel = Defect() self.defect_vw = DefectView(None, self.appFrame, parent, DefectController(defectModel)) if self.isInsert: if multi: self.defect_vw.openMultiInsertWindow(addButtons=False) else: self.defect_vw.openInsertWindow(addButtons=False) else: self.defect_vw.openModifyWindow(addButtons=False) ok_button = ttk.Button(self.appFrame, text="OK") ok_button.pack(side="right", padx=5, pady=10) ok_button.bind('<Button-1>', self.okCallback) cancel_button = ttk.Button(self.appFrame, text="Cancel") cancel_button.pack(side="right", padx=5, pady=10, ipadx=10) cancel_button.bind('<Button-1>', self.cancel) self.canvas.configure(scrollregion=self.canvas.bbox("all")) self.canvas.bind("<Configure>", self.resizeAppFrame) self.canvas.grid(column=0, row=0, sticky="nsew") self.myscrollbar.grid(column=1, row=0, sticky="ns") container.pack(fill=tk.BOTH, ipady=10, ipadx=10, expand=True) # self.appFrame.pack(fill=tk.X, ipady=10, ipadx=10, expand=True) this break the canvas drawing with scrollbar try: self.app.wait_visibility() self.app.transient(parent) self.app.grab_set() self.app.focus_force() self.app.lift() except tk.TclError: pass def resizeAppFrame(self, event): self.canvas.itemconfig(self.canvas_main_frame, height=self.appFrame.winfo_height(), width=event.width) self.canvas.configure(scrollregion=self.canvas.bbox("all")) def boundToMousewheel(self, _event=None): """Called when the **command canvas** is on focus. Bind the command scrollbar button on linux to the command canvas Args: _event: not used but mandatory """ if self.canvas is None: return self.canvas.bind_all("<Button-4>", self._onMousewheel) self.canvas.bind_all("<Button-5>", self._onMousewheel) def unboundToMousewheel(self, _event=None): """Called when the **command canvas** is unfocused. Unbind the command scrollbar button on linux to the command canvas Args: _event: not used but mandatory""" if self.canvas is None: return self.canvas.unbind_all("<Button-4>") self.canvas.unbind_all("<Button-5>") def cancel(self, _event=None): """called when canceling the window. Close the window and set rvalue to False Args: _event: Not used but mandatory""" self.rvalue = False self.unboundToMousewheel() self.app.destroy() def okCallback(self, _event=None): """called when pressing the validating button Close the window if the form is valid. Set rvalue to True and perform the defect update/insert if validated. Args: _event: Not used but mandatory""" if self.isInsert: if self.multi: res = self.defect_vw.multi_insert() else: res, _ = self.defect_vw.insert() else: res, _ = self.defect_vw.update() if res: self.rvalue = True self.unboundToMousewheel() self.app.destroy() def _onMousewheel(self, event): """Scroll the settings canvas Args: event: scroll info filled when scroll event is triggered""" if event.num == 5 or event.delta == -120: count = 1 if event.num == 4 or event.delta == 120: count = -1 self.canvas.yview_scroll(count, "units")
def _load(self): """ Load the treeview with database information """ apiclient = APIClient.getInstance() dialog = ChildDialogProgress( self.appli, "Loading " + str(apiclient.getCurrentPentest()), "Opening " + str(apiclient.getCurrentPentest()) + ". Please wait for a few seconds.", 200, "determinate") step = 0 dialog.show(100) nbObjects = apiclient.count("waves", ) nbObjects += apiclient.count("scopes") nbObjects += apiclient.count("intervals") nbObjects += apiclient.count("scopes") nbObjects += apiclient.count("ips") nbObjects += apiclient.count("ports") nbObjects += apiclient.count("tools") nbObjects += apiclient.count("commands") onePercentNbObject = nbObjects // 100 if nbObjects > 100 else 1 nbObjectTreated = 0 self.delete(*self.get_children()) 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 self.commands_node = self.insert("", "end", "commands", text="Commands", image=CommandView.getClassIcon()) self.group_command_node = self.insert( "", "end", "groupcommands", text="Command Groups", image=CommandGroupView.getClassIcon()) self.my_group_command_node = self.insert( self.group_command_node, "end", "mygroupcommands", text="My Command Groups", image=CommandGroupView.getClassIcon()) self.worker_group_command_node = self.insert( self.group_command_node, "end", "workergroupcommands", text="Worker Command Groups", image=CommandGroupView.getClassIcon()) self.my_commands_node = self.insert(self.commands_node, "end", "mycommands", text="My commands", image=CommandView.getClassIcon()) self.worker_commands_node = self.insert( self.commands_node, "end", "workercommands", text="Worker commands", image=CommandView.getClassIcon()) self.others_commands_node = self.insert( self.commands_node, "end", "otherscommands", text="Others commands", image=CommandView.getClassIcon()) commands = Command.fetchObjects({}, apiclient.getCurrentPentest()) for command in commands: command_vw = CommandView(self, self.appli.viewframe, self.appli, CommandController(command)) command_vw.addInTreeview() group_commands = CommandGroup.fetchObjects( {}, apiclient.getCurrentPentest()) for command_groupe_vw in group_commands: command_groupe_vw = CommandGroupView( self, self.appli.viewframe, self.appli, CommandGroupController(command_groupe_vw)) command_groupe_vw.addInTreeview() 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 """ apiclient = APIClient.getInstance() if not apiclient.getCurrentPentest() != "": return if db == "pollenisator": if collection == "settings": self.configureTags() return if apiclient.getCurrentPentest() != db: return # Delete if action == "delete": if collection == "defects": view = self.getViewFromId(str(iid)) if view is not None: 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 = apiclient.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))) elif collection == "commands": view = CommandView(self, self.appli.viewframe, self.appli, CommandController(Command(res))) elif collection == "group_commands": view = CommandGroupView( self, self.appli.viewframe, self.appli, CommandGroupController(CommandGroup(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: item = self.item(str(iid)) oldTags = item["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()