Esempio n. 1
0
 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()))
Esempio n. 2
0
 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)
Esempio n. 3
0
    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()
Esempio n. 4
0
    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")
Esempio n. 7
0
    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()
Esempio n. 8
0
    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()