Пример #1
0
    def create_ui(self):
        self.locator = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)

        sw = gtk.ScrolledWindow()
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)

        # Country / IP
        self.store = gtk.ListStore(str, str)
        self.tree = gtk.TreeView(self.store)

        self.tree.append_column(
            gtk.TreeViewColumn('Country', gtk.CellRendererText(), text=0))
        self.tree.append_column(
            gtk.TreeViewColumn('Hits', gtk.CellRendererText(), text=1))

        sw.add(self.tree)

        btn = gtk.Button(stock=gtk.STOCK_REFRESH)
        btn.connect('clicked', self.__on_refresh)

        self._main_widget.pack_start(sw)
        self._main_widget.pack_end(btn, False, False)
        self._main_widget.show_all()

        tab = PMApp().main_window.get_tab("MainTab")
        tab.session_notebook.connect('switch-page', self.__on_switch_page)
Пример #2
0
    def __init__(self, ctx):
        super(Session, self).__init__(False, 2)

        if self.session_orientation == gtk.ORIENTATION_HORIZONTAL:
            self.paneds = [HMultiPaned()]
        else:
            self.paneds = [VMultiPaned()]

        self.paned_nb = gtk.Notebook()
        self.paned_nb.set_show_tabs(False)
        self.paned_nb.set_show_border(False)
        self.paned_nb.append_page(self.paneds[0], gtk.Label('Main'))

        self.pages = ['Main']

        self.perspectives = []
        self.container_cbs = []
        self.editor_cbs = []

        self.packet = None
        self.context = ctx
        self.context.title_callback = self.__on_change_title

        self._label = ClosableLabel(ctx.title)
        self._label.connect('context-menu', self.__on_popup)

        self.set_border_width(4)
        self.create_ui()

        # Now apply the bindings for this Session
        PMApp().main_window.apply_bindings(self, self.session_id)
Пример #3
0
    def __on_activate_plugin(self, cell, path):
        model = self.tree.get_model()
        iter = model.get_iter(path)

        plugin = model.get_value(iter, COLUMN_OBJECT)

        if not plugin:
            return

        if not plugin.enabled:
            func = self.p_window.engine.load_plugin
        else:
            func = self.p_window.engine.unload_plugin

        ret, errmsg = func(plugin)

        if not ret:
            dialog = HIGAlertDialog(PMApp().main_window,
                                    gtk.DIALOG_MODAL,
                                    gtk.MESSAGE_ERROR,
                                    message_format=errmsg,
                                    secondary_text=errmsg.summary)
            dialog.run()
            dialog.hide()
            dialog.destroy()
Пример #4
0
    def __on_open(self, act):
        dialog = gtk.FileChooserDialog(_('Select a query file'),
                                       PMApp().main_window,
                                       gtk.FILE_CHOOSER_ACTION_OPEN,
                                       (gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT,
                                        gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))

        if dialog.run() == gtk.RESPONSE_ACCEPT:
            fname = dialog.get_filename()

            if fname:
                fd = open(fname, 'r')
                contents = fd.read()
                fd.close()

                self.store.clear()

                for line in contents.splitlines():
                    line = line.strip()

                    if line:
                        self.store.append((False, line, 0))

        dialog.hide()
        dialog.destroy()
Пример #5
0
    def __on_run(self, action):
        # We have to construct a sequence and run our operation :D

        tree = Node()

        def complete_sequence(model, path, iter, tree):
            path = list(path)[:-1]
            node = Node(SequencePacket(model.get_value(iter, 0)))

            if path:
                tree = tree.get_from_path(path)

            tree.append_node(node)

        self.store.foreach(complete_sequence, tree)

        count = self.packet_count.get_value_as_int()
        inter = self.packet_interval.get_value_as_int()

        operation = SequenceOperation(tree, count, inter,
                                      self.intf_combo.get_interface(),
                                      self.check_strict.get_active(),
                                      self.check_received.get_active(),
                                      self.check_sent.get_active())

        tab = PMApp().main_window.get_tab("OperationsTab")
        tab.tree.append_operation(operation)
Пример #6
0
    def connect_tab_signals(self):
        # I need to connect the session-notebook
        # signals from main tab here so we have
        # overriden this method to avoid errors

        tab = PMApp().main_window.get_tab("MainTab")
        tab.session_notebook.connect('switch-page', self.__on_repopulate)
        tab.session_notebook.connect('page-removed', self.__on_clear)
Пример #7
0
    def start(self, reader):
        if reader:
            catalog = reader.bind_translation("geostats")

            if catalog:
                global _
                _ = catalog.gettext

        self.geo_tab = GeoTab()
        PMApp().main_window.register_tab(self.geo_tab, True)
Пример #8
0
    def start(self, reader):
        log.info('HTTP Analyzer plugin started')
        PMApp().main_window.bind_session(SessionType.SNIFF_SESSION, HTTPage)

        if reader:
            contents = reader.file.read('data/protovis.js')
        else:
            contents = "alert('Protovis not loaded!');"

        global g_js_graph
        g_js_graph = g_js_graph.replace('$script$', contents)
Пример #9
0
    def __on_open(self, btn, entry):
        dialog = gtk.FileChooserDialog(_('Select a file to inject'),
                                       PMApp().main_window,
                                       gtk.FILE_CHOOSER_ACTION_OPEN,
                                       (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                                        gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT))

        if dialog.run() == gtk.RESPONSE_ACCEPT:
            entry.set_text(dialog.get_filename())

        dialog.hide()
        dialog.destroy()
Пример #10
0
    def __init__(self, cookies):
        gtk.Dialog.__init__(self, 'Cookie selector',
                            PMApp().main_window,
                            gtk.DIALOG_DESTROY_WITH_PARENT,
                            (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                             gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))

        self.store = gtk.ListStore(str, int, str)
        self.tree = gtk.TreeView(self.store)

        rend = gtk.CellRendererText()

        col = gtk.TreeViewColumn('Cookie', rend, text=0, cell_background=2)
        col.set_expand(True)
        self.tree.append_column(col)

        col = gtk.TreeViewColumn('Count', rend, text=1, cell_background=2)
        self.tree.append_column(col)

        self.store.set_sort_column_id(1, gtk.SORT_DESCENDING)

        self.tree.set_headers_clickable(True)
        self.tree.get_selection().connect('changed', self.__on_sel_changed)

        sw = gtk.ScrolledWindow()
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw.add(self.tree)

        for k, v in cookies.items():
            found = False

            for i in v:
                if i.isdigit():
                    found = True
                    break

            if found:
                self.store.append([k, len(v), '#8DFF7F'])
            else:
                self.store.append([k, len(v), '#FFE3E5'])

        self.tree.get_selection().select_path((0, ))

        self.vbox.pack_start(sw)
        sw.show_all()

        self.vbox.set_border_width(4)
        self.set_size_request(350, 200)

        self.get_action_area().get_children()[0].set_sensitive(False)
Пример #11
0
    def __on_send(self, action):
        packet = self.session.packet

        if not packet:
            return

        # We start a background process in Operations tab

        count = self.packet_count.get_value_as_int()
        inter = self.packet_interval.get_value_as_int()

        tab = PMApp().main_window.get_tab("OperationsTab")
        tab.tree.append_operation(
            SendOperation(packet, count, inter,
                          self.intf_combo.get_interface()))
Пример #12
0
    def start(self, reader):
        if reader:
            catalog = reader.bind_translation("traceroute")

            if catalog:
                global _
                _ = catalog.gettext

            ret = reader.extract_file('data/GeoLiteCity.dat')

            global glocator
            glocator = Locator(os.path.dirname(ret))

            log.debug(glocator)

        id = PMApp().main_window.register_session(TracerouteSession,
                                                  TracerouteContext)
        log.debug("Traceroute session binded with id %d" % id)
Пример #13
0
    def __init__(self, conn, inj_file=False):
        gtk.Dialog.__init__(self, _('Active connections'),
                            PMApp().main_window,
                            gtk.DIALOG_DESTROY_WITH_PARENT,
                            (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT,
                             gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))

        tbl = gtk.Table(2, 2, False)

        self.rsrc = gtk.RadioButton(None,
                                    '%s:%d' % (conn.l3_addr1, conn.l4_addr1))
        self.rdst = gtk.RadioButton(self.rsrc,
                                    '%s:%d' % (conn.l3_addr2, conn.l4_addr2))
        self.rdst.set_active(True)

        lbl = gtk.Label(_('Send to:'))
        lbl.set_alignment(.0, .5)

        tbl.attach(lbl, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
        tbl.attach(self.rsrc, 1, 2, 0, 1, gtk.FILL, gtk.FILL)
        tbl.attach(self.rdst, 2, 3, 0, 1, gtk.FILL, gtk.FILL)

        if inj_file:
            self.entry = gtk.Entry()
            btn = gtk.Button(stock=gtk.STOCK_OPEN)
            btn.connect('clicked', self.__on_open, self.entry)

            tbl.attach(self.entry, 0, 2, 1, 2, yoptions=gtk.FILL)
            tbl.attach(btn, 2, 3, 1, 2, gtk.FILL, gtk.FILL)

        else:
            self.view = gtk.TextView()

            sw = gtk.ScrolledWindow()
            sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
            sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)

            sw.add(self.view)

            tbl.attach(sw, 0, 3, 1, 2)

        tbl.show_all()
        self.vbox.pack_start(tbl, False, False)
Пример #14
0
    def __on_send_receive(self, action):
        packet = self.session.packet

        if not packet:
            return

        # We start a background process in Operations tab

        count = self.packet_count.get_value_as_int()
        inter = self.packet_interval.get_value_as_int()

        strict = self.check_strict.get_active()
        recv = self.check_received.get_active()
        sent = self.check_sent.get_active()

        tab = PMApp().main_window.get_tab("OperationsTab")
        tab.tree.append_operation(
            SendReceiveOperation(packet, count, inter,
                                 self.intf_combo.get_interface(), strict, recv,
                                 sent))
Пример #15
0
    def __on_merge(self, action):
        tab = PMApp().main_window.get_tab('PropertyTab')

        if self.active_diff:
            tab.remove_notify_for(self.active_diff, self.__diff_editing)
            self.active_diff = None

        if not self.active_layer or not self.active_packets:
            return

        log.debug("Merging %d packets" % len(self.active_packets))

        self.active_diff = backend.MetaPacket(self.active_layer())
        self.session.set_active_packet(self.active_diff)

        # Now we should connect the property tree signals to our
        # but we should check if the packet edited is our or not
        # because the property manages the edit phase of multiple
        # packets in multiple changes.

        tab.register_notify_for(self.active_diff, self.__diff_editing)
Пример #16
0
    def __on_filter(self, combo):
        self.active_layer = self.combo.get_active_protocol()

        if self.active_layer:
            self.merging = True

            self.tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE)

            self.refilter()
            self.tree.set_model(self.filter_store)
        else:
            self.merging = False
            self.tree.get_selection().set_mode(gtk.SELECTION_SINGLE)
            self.tree.set_model(self.store)

            if self.active_diff:
                tab = PMApp().main_window.get_tab('PropertyTab')
                tab.remove_notify_for(self.active_diff, self.__diff_editing)

                self.active_diff = None
                self.active_packets = []
                self.active_layer = None

                self.tree.get_selection().select_path((0, ))
Пример #17
0
 def stop(self):
     PMApp().main_window.deregister_tab(self.snoop_tab)
Пример #18
0
 def stop(self):
     PMApp().main_window.unbind_session(SessionType.SNIFF_SESSION, HTTPage)
Пример #19
0
 def __on_refresh(self, btn):
     self.__load_session(PMApp().bus.call('pm.sessions',
                                          'get_current_session'))
Пример #20
0
 def stop(self):
     PMApp().main_window.deregister_session(TracerouteSession)
Пример #21
0
    def start(self, reader):
        self.status = PMApp().main_window.get_tab('StatusTab').status

        a, self.item = self.add_menu_entry('ARPPoison', 'ARP cache poisoning ...',
                                           _('Poison the ARP cache of an host.'),
                                           gtk.STOCK_EXECUTE)
Пример #22
0
class Session(gtk.VBox):
    session_id = 0 # Setted automatically
    session_name = "" # Shoud be setted
    session_menu = None # Set it if you want a menu item added in main window
    session_menu_object = None
    session_orientation = [gtk.ORIENTATION_VERTICAL]

    def __init__(self, ctx):
        super(Session, self).__init__(False, 2)

        if self.session_orientation == gtk.ORIENTATION_HORIZONTAL:
            self.paneds = [HMultiPaned()]
        else:
            self.paneds = [VMultiPaned()]

        self.paned_nb = gtk.Notebook()
        self.paned_nb.set_show_tabs(False)
        self.paned_nb.set_show_border(False)
        self.paned_nb.append_page(self.paneds[0], gtk.Label('Main'))

        self.pages = ['Main']

        self.perspectives = []
        self.container_cbs = []
        self.editor_cbs = []

        self.packet = None
        self.context = ctx
        self.context.title_callback = self.__on_change_title

        self._label = ClosableLabel(ctx.title)
        self._label.connect('context-menu', self.__on_popup)

        self.set_border_width(4)
        self.create_ui()

        # Now apply the bindings for this Session
        PMApp().main_window.apply_bindings(self, self.session_id)

    def create_ui(self):
        self.paned_nb.set_current_page(0)
        self.pack_start(self.paned_nb)
        self.show_all()

    def remove_perspective(self, klass):
        """
        Remove the perspective from the current session

        @param klass the perspective klass to remove
        @return True if everything is ok
        """

        for paned in self.paneds:
            for persp in self.perspectives:
                if isinstance(persp, klass):
                    widget = persp

                    while not isinstance(widget.get_parent(), gtk.Paned):
                        widget = widget.get_parent()

                    widget.hide()
                    self.perspectives.remove(persp)
                    paned.remove_child(widget)

    def add_perspective(self, klass, show_pers=True, resize=False, page=0):
        """
        Add the perspective to the current session

        @param klass a Perspective base class of the perspective to add
        @param show_pers choose to show the perspective
        @param resize if True child should resize when the paned is resized
        @param page page index where the perspective will be inserted
        @return the perspective instance
        """

        pers = klass(self)
        self.perspectives.append(pers)

        if Prefs()['gui.expander.standard'].value:
            widget = gtk.Expander(pers.title)
            widget.add(pers)
            widget.set_expanded(True)
        else:
            widget = AnimatedExpander(pers.title, pers.icon,
                                      self.session_orientation[page])
            widget.add_widget(pers, show_pers)

        self.paneds[page].add_child(widget, resize)

        widget.show()

        return pers

    def append_page(self, page_name, orientation=gtk.ORIENTATION_VERTICAL):
        self.session_orientation.append(orientation)

        page_id = len(self.session_orientation) - 1

        child = orientation is gtk.ORIENTATION_HORIZONTAL and \
              HMultiPaned() or VMultiPaned()

        self.pages.append(page_name)
        self.paneds.append(child)

        child.show()

        self.paned_nb.append_page(child, gtk.Label(page_name))
        self._label.set_menu_active(True)

    def get_current_page(self):
        return self.paned_nb.get_current_page()

    def get_current_page_name(self):
        return self.pages[self.paned_nb.get_current_page()].upper()

    def reload(self):
        self.reload_containers()
        self.reload_editors()

    def save(self):
        "@return True if the content is saved or False"
        return self._on_save(None)

    def save_as(self):
        return self._on_save_as(None)

    def save_session(self, fname, async=True):
        """
        Override this method to do the real save phase
        @param fname the filename on witch save the context will be saved
        @param async specify if you want to have an async saving in a separate
                     thread (new FileOperation) without freezing the gui.
        @return True if the content is saved or False (if async is False)
        """

        if not self.context.file_types:
            log.debug("Saving is disabled (%s)" % self.context)
            return False

        self.context.cap_file = fname

        if not async:
            return self.context.save()
        else:
            tab = PMApp().main_window.get_tab("OperationsTab")
            tab.tree.append_operation(FileOperation(self,
                                                    FileOperation.TYPE_SAVE))
Пример #23
0
 def start(self, reader):
     self.snoop_tab = SnoopTab()
     PMApp().main_window.register_tab(self.snoop_tab, True)
Пример #24
0
 def connect_tab_signals(self):
     PMApp().main_window.add_accel_group(self.tree.accel_group)
Пример #25
0
 def start(self, reader):
     PMApp().main_window.bind_session(SessionType.SNIFF_SESSION, Explorer)
Пример #26
0
    def __init__(self, session):
        self.session = session

        self.following = {}

        gtk.Dialog.__init__(self, _('Active connections'),
                            PMApp().main_window,
                            gtk.DIALOG_DESTROY_WITH_PARENT,
                            (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))

        self.vbox.set_border_width(4)

        vbox = gtk.VBox(False, 2)
        vbox.set_border_width(4)

        self.notebook = gtk.Notebook()
        self.notebook.set_scrollable(True)
        self.notebook.append_page(vbox, gtk.Label(_('Connections')))

        self.store = gtk.ListStore(str, int, str, int, str, int, int, object)
        self.tree = gtk.TreeView(self.store)

        idx = 0
        rend = gtk.CellRendererText()

        for lbl in (_('Host'), _('Port'), _('Host'), _('Port'), \
                    _('Protocol'), _('Status'), _('Bytes')):

            col = gtk.TreeViewColumn(lbl, rend, text=idx)

            if idx == COLUMN_STATUS:
                col.set_cell_data_func(rend, self.__status_data_func)

            self.tree.append_column(col)
            idx += 1

        self.tree.set_rules_hint(True)
        self.tree.set_search_column(0)

        sw = gtk.ScrolledWindow()
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)

        sw.add(self.tree)
        vbox.pack_start(sw)

        self.vbox.pack_start(self.notebook)
        self.notebook.show_all()

        self.menu = gtk.Menu()

        lbls = (('details', _('Details'), gtk.STOCK_INFO, self.__on_details),
                ('kill', _('Kill connection'), gtk.STOCK_CLEAR,
                 self.__on_kill), ('clear', _('Clear'), gtk.STOCK_CLEAR,
                                   self.__on_clear))

        for name, lbl, stock, callback in lbls:
            act = gtk.Action(name, lbl, None, stock)
            act.connect('activate', callback)

            item = act.create_menu_item()
            item.show()

            self.menu.append(item)

        self.connect('response', self.__on_response)
        self.tree.connect('button-press-event', self.__on_button_pressed)

        self.update_id = None
        self.last_conn = None
        self.set_size_request(400, 200)
    def on_save_log(self, action, selection=False):
        if selection:
            model, rows = self.get_selection().get_selected_rows()

            if not rows:
                return

        dialog = gtk.FileChooserDialog(_('Save log file'), PMApp().main_window,
                                       gtk.FILE_CHOOSER_ACTION_SAVE,
                                       (gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT,
                                        gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))

        afilter = gtk.FileFilter()
        afilter.add_pattern('*.txt')
        afilter.add_pattern('*.log')
        afilter.add_mime_type('text/plain')
        afilter.set_name('ASCII log file')

        dialog.add_filter(afilter)

        xfilter = gtk.FileFilter()
        xfilter.add_pattern('*.xml')
        xfilter.add_mime_type('text/html')
        xfilter.set_name('XML log file')

        dialog.add_filter(xfilter)

        if dialog.run() == gtk.RESPONSE_ACCEPT:
            outname = dialog.get_filename()
            type = (dialog.get_filter() is xfilter and 1 or 0)

            if exists(outname):
                d = gtk.MessageDialog(PMApp().main_window,
                                      gtk.DIALOG_MODAL,
                                      gtk.BUTTONS_YES_NO,
                                      _('A file named %s already exists. Do '
                                        'want overwrite it?') % outname)
                ret = d.run()
                d.hide()
                d.destroy()

                if ret == gtk.RESPONSE_NO:
                    dialog.hide()
                    dialog.destroy()

                    return

            try:
                f = open(outname, 'w')

                if type == 1:
                    f.write('<?xml version="1.0"?>\n<auditlog>\n')
                    sep = ' '
                else:
                    sep = ''

                if selection:
                    for path in rows:
                        iter = model.get_iter(path)
                        f.write(sep + \
                                self.get_row_txt(model, iter, type) + \
                                '\n')
                else:
                    def dump(model, path, iter, f):
                        f.write(sep + \
                                self.get_row_txt(model, iter, type) + \
                                '\n')

                    self.store.foreach(dump, f)

                if type == 1:
                    f.write('</auditlog>\n')

                f.close()

            except Exception, err:
                try:
                    unlink(outname)
                except:
                    pass

                d = HIGAlertDialog(PMApp().main_window, gtk.DIALOG_MODAL,
                                   gtk.MESSAGE_ERROR,
                                   message_format=_('Error while saving log '
                                                    'file to %s') % outname,
                                   secondary_text=str(err))
                d.run()
                d.hide()
                d.destroy()