def __pack_widgets(self): ### self.add(self.main_whole_box) # Packing command entry to upper box self.upper_box._pack_expand_fill(self.command_entry) self.upper_box._pack_noexpand_nofill(self.scan_button) # Packing notebook (left) and help box (right) to middle box self.middle_box._pack_expand_fill(self.notebook) self.middle_box._pack_expand_fill(self.help_vbox) # Packing buttons to lower box self.lower_box.pack_end(self.buttons_hbox) # Packing the three vertical boxes to the main box self.main_whole_box._pack_noexpand_nofill(self.upper_box) self.main_whole_box._pack_expand_fill(self.middle_box) self.main_whole_box._pack_noexpand_nofill(self.lower_box) ### # Packing profile information tab on notebook self.notebook.append_page(self.profile_info_vbox, gtk.Label(_('Profile'))) self.profile_info_vbox.set_border_width(5) table = HIGTable() self.profile_info_vbox._pack_noexpand_nofill(self.profile_info_label) self.profile_info_vbox._pack_expand_fill(HIGSpacer(table)) self.profile_description_scroll.add(self.profile_description_text) vbox_desc = HIGVBox() vbox_desc._pack_noexpand_nofill(self.profile_description_label) vbox_desc._pack_expand_fill(hig_box_space_holder()) vbox_ann = HIGVBox() vbox_ann._pack_expand_fill(hig_box_space_holder()) table.attach(self.profile_name_label,0,1,0,1,xoptions=0,yoptions=0) table.attach(self.profile_name_entry,1,2,0,1,yoptions=0) table.attach(vbox_desc,0,1,1,2,xoptions=0) table.attach(self.profile_description_scroll,1,2,1,2) # Packing buttons on button_hbox self.buttons_hbox._pack_expand_fill(hig_box_space_holder()) if self.deletable: self.buttons_hbox._pack_noexpand_nofill(self.delete_button) self.buttons_hbox._pack_noexpand_nofill(self.cancel_button) self.buttons_hbox._pack_noexpand_nofill(self.save_button) self.buttons_hbox.set_border_width(5) self.buttons_hbox.set_spacing(6) ### self.help_vbox._pack_noexpand_nofill(self.help_label) self.help_vbox._pack_expand_fill(self.help_scroll) self.help_scroll.add(self.help_field) self.help_vbox.set_border_width(1) self.help_vbox.set_spacing(1)
def __pack_widgets(self): ### self.add(self.main_whole_box) # Packing command entry to upper box self.upper_box._pack_expand_fill(self.command_entry) self.upper_box._pack_noexpand_nofill(self.scan_button) # Packing notebook (left) and help box (right) to middle box self.middle_box._pack_expand_fill(self.notebook) self.middle_box._pack_expand_fill(self.help_vbox) # Packing buttons to lower box self.lower_box.pack_end(self.buttons_hbox) # Packing the three vertical boxes to the main box self.main_whole_box._pack_noexpand_nofill(self.upper_box) self.main_whole_box._pack_expand_fill(self.middle_box) self.main_whole_box._pack_noexpand_nofill(self.lower_box) ### # Packing profile information tab on notebook self.notebook.append_page(self.profile_info_vbox, gtk.Label(_('Profile'))) self.profile_info_vbox.set_border_width(5) table = HIGTable() self.profile_info_vbox._pack_noexpand_nofill(self.profile_info_label) self.profile_info_vbox._pack_expand_fill(HIGSpacer(table)) self.profile_description_scroll.add(self.profile_description_text) vbox_desc = HIGVBox() vbox_desc._pack_noexpand_nofill(self.profile_description_label) vbox_desc._pack_expand_fill(hig_box_space_holder()) vbox_ann = HIGVBox() vbox_ann._pack_expand_fill(hig_box_space_holder()) table.attach(self.profile_name_label,0,1,0,1,xoptions=0,yoptions=0) table.attach(self.profile_name_entry,1,2,0,1,yoptions=0) table.attach(vbox_desc,0,1,1,2,xoptions=0) table.attach(self.profile_description_scroll,1,2,1,2) # Packing buttons on button_hbox self.buttons_hbox._pack_expand_fill(hig_box_space_holder()) if self.deletable: self.buttons_hbox._pack_noexpand_nofill(self.delete_button) self.buttons_hbox._pack_noexpand_nofill(self.cancel_button) self.buttons_hbox._pack_noexpand_nofill(self.save_button) self.buttons_hbox.set_border_width(5) self.buttons_hbox.set_spacing(6) ### self.help_vbox._pack_noexpand_nofill(self.help_label) self.help_vbox._pack_expand_fill(self.help_scroll) self.help_scroll.add(self.help_field) self.help_vbox.set_border_width(1) self.help_vbox.set_spacing(1)
class ScanResultNotebook(HIGNotebook): """This is the right side of a ScanResult, the notebook with the tabs such as "Nmap Output".""" def __init__(self, inventory, scans_store): HIGNotebook.__init__(self) self.set_border_width(5) self.__create_widgets(inventory, scans_store) self.scans_list.scans_list.connect( "row-activated", self._scan_row_activated) self.append_page(self.nmap_output_page, gtk.Label(_('Nmap Output'))) self.append_page(self.open_ports_page, gtk.Label(_('Ports / Hosts'))) self.append_page(self.topology_page, gtk.Label(_('Topology'))) self.append_page(self.host_details_page, gtk.Label(_('Host Details'))) self.append_page(self.scans_list_page, gtk.Label(_('Scans'))) def host_mode(self): self.open_ports.host.host_mode() def port_mode(self): self.open_ports.host.port_mode() def __create_widgets(self, inventory, scans_store): self.open_ports_page = HIGVBox() self.nmap_output_page = HIGVBox() self.topology_page = HIGVBox() self.host_details_page = HIGScrolledWindow() self.host_details_vbox = HIGVBox() self.scans_list_page = HIGVBox() self.open_ports = ScanOpenPortsPage() self.nmap_output = ScanNmapOutputPage(scans_store) self.topology = TopologyPage(inventory) self.scans_list = ScanScanListPage(scans_store) self.no_selected = gtk.Label(_('No host selected.')) self.host_details = self.no_selected self.open_ports_page.add(self.open_ports) self.nmap_output_page.add(self.nmap_output) self.topology_page.add(self.topology) self.scans_list_page.add(self.scans_list) self.host_details_page.add_with_viewport(self.host_details_vbox) self.host_details_vbox._pack_expand_fill(self.host_details) def _scan_row_activated(self, treeview, path, view_column): """Switch back to the Nmap Output view when a scan is activated (double-clicked) on the scans list.""" self.nmap_output.set_active_iter(treeview.get_model().get_iter(path)) self.set_current_page(0)
class ScanHostsView(HIGVBox, object): HOST_MODE, SERVICE_MODE = range(2) def __init__(self, scan_interface): HIGVBox.__init__(self) self._scan_interface = scan_interface self._create_widgets() self._connect_widgets() self._pack_widgets() self._set_scrolled() self._set_host_list() self._set_service_list() self._pack_expand_fill(self.main_vbox) self.mode = None # Default mode is host mode self.host_mode(self.host_mode_button) self.host_view.show_all() self.service_view.show_all() def _create_widgets(self): # Mode buttons self.host_mode_button = gtk.ToggleButton(_("Hosts")) self.service_mode_button = gtk.ToggleButton(_("Services")) self.buttons_box = gtk.HBox() # Main window vbox self.main_vbox = HIGVBox() # Host list self.host_list = gtk.ListStore(object, str, str) self.host_list.set_sort_func(1000, cmp_treemodel_addr) self.host_list.set_sort_column_id(1000, gtk.SORT_ASCENDING) self.host_view = gtk.TreeView(self.host_list) self.pic_column = gtk.TreeViewColumn(_('OS')) self.host_column = gtk.TreeViewColumn(_('Host')) self.os_cell = gtk.CellRendererPixbuf() self.host_cell = gtk.CellRendererText() # Service list self.service_list = gtk.ListStore(str) self.service_list.set_sort_column_id(0, gtk.SORT_ASCENDING) self.service_view = gtk.TreeView(self.service_list) self.service_column = gtk.TreeViewColumn(_('Service')) self.service_cell = gtk.CellRendererText() self.scrolled = gtk.ScrolledWindow() def _pack_widgets(self): self.main_vbox.set_spacing(0) self.main_vbox.set_border_width(0) self.main_vbox._pack_noexpand_nofill(self.buttons_box) self.main_vbox._pack_expand_fill(self.scrolled) self.host_mode_button.set_active(True) self.buttons_box.set_border_width(5) self.buttons_box.pack_start(self.host_mode_button) self.buttons_box.pack_start(self.service_mode_button) def _connect_widgets(self): self.host_mode_button.connect("toggled", self.host_mode) self.service_mode_button.connect("toggled", self.service_mode) def host_mode(self, widget): self._remove_scrolled_child() if widget.get_active(): self.mode = self.HOST_MODE self.service_mode_button.set_active(False) self.scrolled.add(self.host_view) else: self.service_mode_button.set_active(True) def service_mode(self, widget): self._remove_scrolled_child() if widget.get_active(): self.mode = self.SERVICE_MODE self.host_mode_button.set_active(False) self.scrolled.add(self.service_view) else: self.host_mode_button.set_active(True) def _remove_scrolled_child(self): try: child = self.scrolled.get_child() self.scrolled.remove(child) except: pass def _set_scrolled(self): self.scrolled.set_border_width(5) self.scrolled.set_size_request(150, -1) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) def _set_service_list(self): self.service_view.set_enable_search(True) self.service_view.set_search_column(0) selection = self.service_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) self.service_view.append_column(self.service_column) self.service_column.set_resizable(True) self.service_column.set_sort_column_id(0) self.service_column.set_reorderable(True) self.service_column.pack_start(self.service_cell, True) self.service_column.set_attributes(self.service_cell, text=0) def _set_host_list(self): self.host_view.set_enable_search(True) self.host_view.set_search_column(1) selection = self.host_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) self.host_view.append_column(self.pic_column) self.host_view.append_column(self.host_column) self.host_column.set_resizable(True) self.pic_column.set_resizable(True) self.host_column.set_sort_column_id(1000) self.pic_column.set_sort_column_id(1) self.host_column.set_reorderable(True) self.pic_column.set_reorderable(True) self.pic_column.pack_start(self.os_cell, True) self.host_column.pack_start(self.host_cell, True) self.pic_column.set_min_width(35) self.pic_column.set_attributes(self.os_cell, stock_id = 1) self.host_column.set_attributes(self.host_cell, text = 2) def mass_update(self, hosts): """Update the internal ListStores to reflect the hosts and services passed in. Hosts that have not changed are left alone.""" hosts = set(hosts) services = set() for h in hosts: services.update([s["service_name"] for s in h.services]) # Disable sorting while elements are added. See the PyGTK FAQ 13.43, # "Are there tips for improving performance when adding many rows to a # Treeview?" sort_column_id = self.host_list.get_sort_column_id() self.host_list.set_default_sort_func(lambda *args: -1) self.host_list.set_sort_column_id(-1, gtk.SORT_ASCENDING) self.host_view.freeze_child_notify() self.host_view.set_model(None) it = self.host_list.get_iter_first() # Remove any of our ListStore hosts that aren't in the list passed in. while it: host = self.host_list.get_value(it, 0) if host in hosts: hosts.remove(host) self.host_list.set(it, 1, get_os_icon(host)) it = self.host_list.iter_next(it) else: if not self.host_list.remove(it): it = None # Add any remaining hosts into our ListStore. for host in hosts: self.add_host(host) # Reenable sorting. if sort_column_id != (None, None): self.host_list.set_sort_column_id(*sort_column_id) self.host_view.set_model(self.host_list) self.host_view.thaw_child_notify() it = self.service_list.get_iter_first() # Remove any of our ListStore services that aren't in the list passed # in. while it: service_name = self.service_list.get_value(it, 0) if service_name in services: services.remove(service_name) it = self.service_list.iter_next(it) else: if not self.service_list.remove(it): it = None # Add any remaining services into our ListStore. for service_name in services: self.add_service(service_name) def add_host(self, host): self.host_list.append([host, get_os_icon(host), host.get_hostname()]) def add_service(self, service): self.service_list.append([service])
class ProfileEditor(HIGWindow): def __init__(self, command=None, profile_name=None, deletable=True, overwrite=False): HIGWindow.__init__(self) self.connect("delete_event", self.exit) self.set_title(_('Profile Editor')) self.set_position(gtk.WIN_POS_CENTER) self.deletable = deletable self.profile_name = profile_name self.overwrite = overwrite # Used to block recursive updating of the command entry when the # command entry causes the OptionBuilder widgets to change. self.inhibit_command_update = False self.__create_widgets() self.__pack_widgets() self.profile = CommandProfile() self.ops = NmapOptions() if profile_name: log.debug("Showing profile %s" % profile_name) prof = self.profile.get_profile(profile_name) # Interface settings self.profile_name_entry.set_text(profile_name) self.profile_description_text.get_buffer().set_text( prof['description']) command_string = prof['command'] self.ops.parse_string(command_string) if command: self.ops.parse_string(command) self.option_builder = OptionBuilder( Path.profile_editor, self.ops, self.update_command, self.help_field.get_buffer()) log.debug("Option groups: %s" % str(self.option_builder.groups)) log.debug("Option section names: %s" % str( self.option_builder.section_names)) #log.debug("Option tabs: %s" % str(self.option_builder.tabs)) for tab in self.option_builder.groups: self.__create_tab( _(tab), _(self.option_builder.section_names[tab]), self.option_builder.tabs[tab]) self.update_command() def command_entry_changed_cb(self, widget): command_string = self.command_entry.get_text().decode("UTF-8") self.ops.parse_string(command_string) self.inhibit_command_update = True self.option_builder.update() self.inhibit_command_update = False def update_command(self): """Regenerate and display the command.""" if not self.inhibit_command_update: # Block recursive updating of the OptionBuilder widgets when they # cause a change in the command entry. self.command_entry.handler_block(self.command_entry_changed_cb_id) self.command_entry.set_text(self.ops.render_string()) self.command_entry.handler_unblock( self.command_entry_changed_cb_id) def update_help_name(self, widget, extra): self.help_field.get_buffer().set_text( "Profile name\n\nThis is how the profile will be identified " "in the drop-down combo box in the scan tab.") def update_help_desc(self, widget, extra): self.help_field.get_buffer().set_text( "Description\n\nThe description is a full description of what " "the scan does, which may be long.") def __create_widgets(self): ### # Vertical box to keep 3 boxes self.main_whole_box = HIGVBox() self.upper_box = HIGHBox() self.middle_box = HIGHBox() self.lower_box = HIGHBox() #self.main_vbox = HIGVBox() self.command_entry = gtk.Entry() self.command_entry_changed_cb_id = self.command_entry.connect( "changed", self.command_entry_changed_cb) self.scan_button = HIGButton(_("Scan")) self.scan_button.connect("clicked", self.run_scan) self.notebook = gtk.Notebook() # Profile info page self.profile_info_vbox = HIGVBox() self.profile_info_label = HIGSectionLabel(_('Profile Information')) self.profile_name_label = HIGEntryLabel(_('Profile name')) self.profile_name_entry = gtk.Entry() self.profile_name_entry.connect( 'enter-notify-event', self.update_help_name) self.profile_description_label = HIGEntryLabel(_('Description')) self.profile_description_scroll = HIGScrolledWindow() self.profile_description_scroll.set_border_width(0) self.profile_description_text = HIGTextView() self.profile_description_text.connect( 'motion-notify-event', self.update_help_desc) # Buttons self.buttons_hbox = HIGHBox() self.cancel_button = HIGButton(stock=gtk.STOCK_CANCEL) self.cancel_button.connect('clicked', self.exit) self.delete_button = HIGButton(stock=gtk.STOCK_DELETE) self.delete_button.connect('clicked', self.delete_profile) self.save_button = HIGButton(_("Save Changes"), stock=gtk.STOCK_SAVE) self.save_button.connect('clicked', self.save_profile) ### self.help_vbox = HIGVBox() self.help_label = HIGSectionLabel(_('Help')) self.help_scroll = HIGScrolledWindow() self.help_scroll.set_border_width(0) self.help_field = HIGTextView() self.help_field.set_cursor_visible(False) self.help_field.set_left_margin(5) self.help_field.set_editable(False) self.help_vbox.set_size_request(200, -1) ### def __pack_widgets(self): ### self.add(self.main_whole_box) # Packing command entry to upper box self.upper_box._pack_expand_fill(self.command_entry) self.upper_box._pack_noexpand_nofill(self.scan_button) # Packing notebook (left) and help box (right) to middle box self.middle_box._pack_expand_fill(self.notebook) self.middle_box._pack_expand_fill(self.help_vbox) # Packing buttons to lower box self.lower_box.pack_end(self.buttons_hbox) # Packing the three vertical boxes to the main box self.main_whole_box._pack_noexpand_nofill(self.upper_box) self.main_whole_box._pack_expand_fill(self.middle_box) self.main_whole_box._pack_noexpand_nofill(self.lower_box) ### # Packing profile information tab on notebook self.notebook.append_page( self.profile_info_vbox, gtk.Label(_('Profile'))) self.profile_info_vbox.set_border_width(5) table = HIGTable() self.profile_info_vbox._pack_noexpand_nofill(self.profile_info_label) self.profile_info_vbox._pack_expand_fill(HIGSpacer(table)) self.profile_description_scroll.add(self.profile_description_text) vbox_desc = HIGVBox() vbox_desc._pack_noexpand_nofill(self.profile_description_label) vbox_desc._pack_expand_fill(hig_box_space_holder()) vbox_ann = HIGVBox() vbox_ann._pack_expand_fill(hig_box_space_holder()) table.attach( self.profile_name_label, 0, 1, 0, 1, xoptions=0, yoptions=0) table.attach(self.profile_name_entry, 1, 2, 0, 1, yoptions=0) table.attach(vbox_desc, 0, 1, 1, 2, xoptions=0) table.attach(self.profile_description_scroll, 1, 2, 1, 2) # Packing buttons on button_hbox self.buttons_hbox._pack_expand_fill(hig_box_space_holder()) if self.deletable: self.buttons_hbox._pack_noexpand_nofill(self.delete_button) self.buttons_hbox._pack_noexpand_nofill(self.cancel_button) self.buttons_hbox._pack_noexpand_nofill(self.save_button) self.buttons_hbox.set_border_width(5) self.buttons_hbox.set_spacing(6) ### self.help_vbox._pack_noexpand_nofill(self.help_label) self.help_vbox._pack_expand_fill(self.help_scroll) self.help_scroll.add(self.help_field) self.help_vbox.set_border_width(1) self.help_vbox.set_spacing(1) ### def __create_tab(self, tab_name, section_name, tab): log.debug(">>> Tab name: %s" % tab_name) log.debug(">>>Creating profile editor section: %s" % section_name) vbox = HIGVBox() if tab.notscripttab: # if notscripttab is set table = HIGTable() table.set_row_spacings(2) section = HIGSectionLabel(section_name) vbox._pack_noexpand_nofill(section) vbox._pack_noexpand_nofill(HIGSpacer(table)) vbox.set_border_width(5) tab.fill_table(table, True) else: hbox = tab.get_hmain_box() vbox.pack_start(hbox, True, True, 0) self.notebook.append_page(vbox, gtk.Label(tab_name)) def save_profile(self, widget): if self.overwrite: self.profile.remove_profile(self.profile_name) profile_name = self.profile_name_entry.get_text() if profile_name == '': alert = HIGAlertDialog( message_format=_('Unnamed profile'), secondary_text=_( 'You must provide a name for this profile.')) alert.run() alert.destroy() self.profile_name_entry.grab_focus() return None command = self.ops.render_string() buf = self.profile_description_text.get_buffer() description = buf.get_text( buf.get_start_iter(), buf.get_end_iter()) try: self.profile.add_profile( profile_name, command=command, description=description) except ValueError: alert = HIGAlertDialog( message_format=_('Disallowed profile name'), secondary_text=_('Sorry, the name "%s" is not allowed due ' 'to technical limitations. (The underlying ' 'ConfigParser used to store profiles does not allow ' 'it.) Choose a different name.' % profile_name)) alert.run() alert.destroy() return self.scan_interface.toolbar.profile_entry.update() self.destroy() def clean_profile_info(self): self.profile_name_entry.set_text('') self.profile_description_text.get_buffer().set_text('') def set_scan_interface(self, interface): self.scan_interface = interface def exit(self, *args): self.destroy() def delete_profile(self, widget=None, extra=None): if self.deletable: dialog = HIGDialog(buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) alert = HIGEntryLabel('<b>' + _("Deleting Profile") + '</b>') text = HIGEntryLabel(_( 'Your profile is going to be deleted! ClickOk to continue, ' 'or Cancel to go back to Profile Editor.')) hbox = HIGHBox() hbox.set_border_width(5) hbox.set_spacing(12) vbox = HIGVBox() vbox.set_border_width(5) vbox.set_spacing(12) image = gtk.Image() image.set_from_stock( gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG) vbox.pack_start(alert) vbox.pack_start(text) hbox.pack_start(image) hbox.pack_start(vbox) dialog.vbox.pack_start(hbox) dialog.vbox.show_all() response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_CANCEL: return True self.profile.remove_profile(self.profile_name) self.update_profile_entry() self.destroy() def run_scan(self, widget=None): command_string = self.command_entry.get_text().decode("UTF-8") self.scan_interface.command_toolbar.command = command_string self.scan_interface.start_scan_cb() self.exit() def update_profile_entry(self, widget=None, extra=None): self.scan_interface.toolbar.profile_entry.update() list = self.scan_interface.toolbar.profile_entry.get_model() length = len(list) if length > 0: self.scan_interface.toolbar.profile_entry.set_active(0)
class CrashReport(HIGWindow): def __init__(self, summary, description): HIGWindow.__init__(self) gtk.Window.__init__(self) self.set_title(_('Crash Report')) self.set_position(gtk.WIN_POS_CENTER_ALWAYS) self.response_id = False self._create_widgets() self._pack_widgets() self._connect_widgets() self.summary = summary self.description = "\n----\n" + description def _create_widgets(self): self.vbox = HIGVBox() self.button_box = gtk.HButtonBox() self.email_label = gtk.Label(_("""\ An email address is optional. Sometimes we use it to get more information. If \ you provide an email address your report will be marked private so only \ project developers can read it.\ """)) self.email_entry = gtk.Entry() self.summary_entry = gtk.Entry() self.description_label = gtk.Label(_("\ What were you doing when the crash happened?\ ")) self.description_scrolled = gtk.ScrolledWindow() self.description_text = gtk.TextView() self.bug_text = gtk.Label(_("""\ An unhandled exception has crashed Zenmap. This dialog allows you to tell us \ what you did to cause the crash and help us to fix it. Submitting the report \ will open a description of the new bug at the bug tracker. Feel free to edit \ the report to remove any identifying information such as your home directory.\ """)) self.btn_ok = gtk.Button(stock=gtk.STOCK_OK) self.btn_cancel = gtk.Button(stock=gtk.STOCK_CANCEL) self.hbox = HIGHBox() self.table = HIGTable() def _pack_widgets(self): self.description_label.set_line_wrap(True) self.description_label.set_alignment(0.0, 0.5) self.description_scrolled.add(self.description_text) self.description_scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.description_scrolled.set_size_request(400, 150) self.description_text.set_wrap_mode(gtk.WRAP_WORD) self.email_label.set_line_wrap(True) self.email_label.set_alignment(0.0, 0.5) self.bug_text.set_line_wrap(True) self.hbox.set_border_width(12) self.vbox.set_border_width(6) self.table.attach_label(gtk.Label(_("Summary")), 0, 1, 0, 1) self.table.attach_entry(self.summary_entry, 1, 2, 0, 1) self.table.attach_entry(self.description_label, 0, 2, 1, 2) self.table.attach_entry(self.description_scrolled, 0, 2, 2, 3) self.table.attach(self.email_label, 0, 2, 3, 4) self.table.attach_label(gtk.Label(_("Email")), 0, 1, 4, 5) self.table.attach_entry(self.email_entry, 1, 2, 4, 5) self.hbox._pack_expand_fill(self.bug_text) self.button_box.set_layout(gtk.BUTTONBOX_END) self.button_box.pack_start(self.btn_ok) self.button_box.pack_start(self.btn_cancel) self.vbox._pack_noexpand_nofill(self.hbox) self.vbox._pack_expand_fill(self.table) self.vbox._pack_noexpand_nofill(self.button_box) self.add(self.vbox) def _connect_widgets(self): self.btn_ok.connect("clicked", self.send_report) self.btn_cancel.connect("clicked", self.close) self.connect("delete-event", self.close) def send_report(self, widget): bug_register = BugRegister() description_text = self.description private = False if self.email != "": description_text += "\n\n" + self.email private = True report_url = bug_register.get_report_url(self.summary, description_text, private = private) # First we try reporting the bug with a web browser because that gives # better feedback on what happened. If that doesn't work try with # urllib2. try: webbrowser.open(report_url) except webbrowser.Error: try: urllib2.urlopen(report_url) ok_dialog = HIGAlertDialog(type=gtk.MESSAGE_INFO, message_format=_("Bug reported"), secondary_text=_("The bug was successfully reported.")) ok_dialog.run() ok_dialog.destroy() except urllib2.URLError, e: cancel_dialog = HIGAlertDialog(type=gtk.MESSAGE_ERROR, message_format=_("Bug not reported"), secondary_text=_("This error occurred while trying to report the bug:\n\n" + str(e))) cancel_dialog.run() cancel_dialog.destroy() self.close()
class UmitCredits(HIGWindow): def __init__(self): HIGWindow.__init__(self) self.set_title(_("%s credits") % UMIT_DISPLAY_NAME) self.set_size_request(-1, 250) self.set_position(gtk.WIN_POS_CENTER) self.__create_widgets() self.__packing() self.set_text() def __create_widgets(self): self.vbox = HIGVBox() self.hbox = HIGHBox() self.notebook = HIGNotebook() self.btn_close = HIGButton(stock=gtk.STOCK_CLOSE) self.written_by_scroll = HIGScrolledWindow() self.written_by_text = HIGTextView() self.design_scroll = HIGScrolledWindow() self.design_text = HIGTextView() self.soc2007_scroll = HIGScrolledWindow() self.soc2007_text = HIGTextView() self.contributors_scroll = HIGScrolledWindow() self.contributors_text = HIGTextView() self.translation_scroll = HIGScrolledWindow() self.translation_text = HIGTextView() self.nokia_scroll = HIGScrolledWindow() self.nokia_text = HIGTextView() def __packing(self): self.add(self.vbox) self.vbox.set_spacing(12) self.vbox._pack_expand_fill(self.notebook) self.vbox._pack_noexpand_nofill(self.hbox) self.hbox._pack_expand_fill(hig_box_space_holder()) self.hbox._pack_noexpand_nofill(self.btn_close) self.notebook.append_page(self.written_by_scroll, gtk.Label(_("Written by"))) self.notebook.append_page(self.design_scroll, gtk.Label(_("Design"))) self.notebook.append_page(self.soc2007_scroll, gtk.Label(_("SoC 2007"))) self.notebook.append_page(self.contributors_scroll, gtk.Label(_("Contributors"))) self.notebook.append_page(self.translation_scroll, gtk.Label(_("Translation"))) self.notebook.append_page(self.nokia_scroll, gtk.Label(_("Maemo"))) self.written_by_scroll.add(self.written_by_text) self.written_by_text.set_wrap_mode(gtk.WRAP_NONE) self.design_scroll.add(self.design_text) self.design_text.set_wrap_mode(gtk.WRAP_NONE) self.soc2007_scroll.add(self.soc2007_text) self.soc2007_text.set_wrap_mode(gtk.WRAP_NONE) self.contributors_scroll.add(self.contributors_text) self.contributors_text.set_wrap_mode(gtk.WRAP_NONE) self.translation_scroll.add(self.translation_text) self.translation_text.set_wrap_mode(gtk.WRAP_NONE) self.nokia_scroll.add(self.nokia_text) self.nokia_text.set_wrap_mode(gtk.WRAP_NONE) self.btn_close.connect('clicked', lambda x, y=None: self.destroy()) def set_text(self): b = self.written_by_text.get_buffer() b.set_text("""Adriano Monteiro Marques <*****@*****.**>""") b = self.design_text.get_buffer() b.set_text("""Operating System and Vulnerability Icons: Takeshi Alexandre Gondo <*****@*****.**> Logo, Application Icons and Splash screen: Virgílio Carlo de Menezes Vasconcelos <*****@*****.**> The Umit Project Web Site Design: Joao Paulo Pacheco <*****@*****.**>""") b = self.soc2007_text.get_buffer() b.set_text("""Independent Features: Adriano Monteiro Marques <*****@*****.**> Frederico Silva Ribeiro <*****@*****.**> Network Inventory: Guilherme Henrique Polo Gonçalves <*****@*****.**> Umit Radial Mapper: João Paulo de Souza Medeiros <*****@*****.**> Profile/Wizard interface editor: Luis Antonio Bastião Silva <*****@*****.**> NSE Facilitator: Maxim I. Gavrilov <*****@*****.**> Umit Web: Rodolfo da Silva Carvalho <*****@*****.**>""") b = self.contributors_text.get_buffer() b.set_text("""Sponsored by (SoC 2005, 2006 and 2007): Google <*****@*****.**> Mentor of Umit for Google SoC 2005 and 2006: Fyodor <*****@*****.**> Mentor of Umit for Google SoC 2007 Projects: Adriano Monteiro Marques <*****@*****.**> Initial development: Adriano Monteiro Marques <*****@*****.**> Cleber Rodrigues Rosa Junior <*****@*****.**> Nmap students from Google SoC 2007 that helped Umit: Eddie Bell <*****@*****.**> David Fifield <*****@*****.**> Kris Katterjohn <*****@*****.**> The Umit Project WebSite: AbraoBarbosa dos Santos Neto <*****@*****.**> Adriano Monteiro Marques <*****@*****.**> Heitor de Lima Matos <*****@*****.**> Joao Paulo Pacheco <*****@*****.**> João Paulo de Souza Medeiros <*****@*****.**> Luis Antonio Bastião Silva <*****@*****.**> Rodolfo da Silva Carvalho <*****@*****.**> Beta testers for 0.9.5RC1: Drew Miller <*****@*****.**> Igor Feghali <*****@*****.**> Joao Paulo Pacheco <*****@*****.**> Luis Antonio Bastião Silva <*****@*****.**> <*****@*****.**> <*****@*****.**> <*****@*****.**> Initial attempt on Maemo port: Adriano Monteiro Marques <*****@*****.**> Osvaldo Santana Neto <*****@*****.**>""") b = self.translation_text.get_buffer() b.set_text("""Brazilian Portuguese: Adriano Monteiro Marques <*****@*****.**>""") b = self.nokia_text.get_buffer() b.set_text("""Adriano Monteiro Marques <*****@*****.**>""")
class ScanHostsView(HIGVBox, object): HOST_MODE, SERVICE_MODE = range(2) def __init__(self, scan_interface): HIGVBox.__init__(self) self._scan_interface = scan_interface self._create_widgets() self._connect_widgets() self._pack_widgets() self._set_scrolled() self._set_host_list() self._set_service_list() self._pack_expand_fill(self.main_vbox) self.mode = None # Default mode is host mode self.host_mode(self.host_mode_button) self.host_view.show_all() self.service_view.show_all() def _create_widgets(self): # Mode buttons self.host_mode_button = gtk.ToggleButton(_("Hosts")) self.service_mode_button = gtk.ToggleButton(_("Services")) self.buttons_box = gtk.HBox() # Main window vbox self.main_vbox = HIGVBox() # Host list self.host_list = gtk.ListStore(object, str, str) self.host_list.set_sort_func(1000, cmp_treemodel_addr) self.host_list.set_sort_column_id(1000, gtk.SORT_ASCENDING) self.host_view = gtk.TreeView(self.host_list) self.pic_column = gtk.TreeViewColumn(_('OS')) self.host_column = gtk.TreeViewColumn(_('Host')) self.os_cell = gtk.CellRendererPixbuf() self.host_cell = gtk.CellRendererText() # Service list self.service_list = gtk.ListStore(str) self.service_list.set_sort_column_id(0, gtk.SORT_ASCENDING) self.service_view = gtk.TreeView(self.service_list) self.service_column = gtk.TreeViewColumn(_('Service')) self.service_cell = gtk.CellRendererText() self.scrolled = gtk.ScrolledWindow() def _pack_widgets(self): self.main_vbox.set_spacing(0) self.main_vbox.set_border_width(0) self.main_vbox._pack_noexpand_nofill(self.buttons_box) self.main_vbox._pack_expand_fill(self.scrolled) self.host_mode_button.set_active(True) self.buttons_box.set_border_width(5) self.buttons_box.pack_start(self.host_mode_button) self.buttons_box.pack_start(self.service_mode_button) def _connect_widgets(self): self.host_mode_button.connect("toggled", self.host_mode) self.service_mode_button.connect("toggled", self.service_mode) def host_mode(self, widget): self._remove_scrolled_child() if widget.get_active(): self.mode = self.HOST_MODE self.service_mode_button.set_active(False) self.scrolled.add(self.host_view) else: self.service_mode_button.set_active(True) def service_mode(self, widget): self._remove_scrolled_child() if widget.get_active(): self.mode = self.SERVICE_MODE self.host_mode_button.set_active(False) self.scrolled.add(self.service_view) else: self.host_mode_button.set_active(True) def _remove_scrolled_child(self): try: child = self.scrolled.get_child() self.scrolled.remove(child) except: pass def _set_scrolled(self): self.scrolled.set_border_width(5) self.scrolled.set_size_request(150, -1) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) def _set_service_list(self): self.service_view.set_enable_search(True) self.service_view.set_search_column(0) selection = self.service_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) self.service_view.append_column(self.service_column) self.service_column.set_resizable(True) self.service_column.set_sort_column_id(0) self.service_column.set_reorderable(True) self.service_column.pack_start(self.service_cell, True) self.service_column.set_attributes(self.service_cell, text=0) def _set_host_list(self): self.host_view.set_enable_search(True) self.host_view.set_search_column(1) selection = self.host_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) self.host_view.append_column(self.pic_column) self.host_view.append_column(self.host_column) self.host_column.set_resizable(True) self.pic_column.set_resizable(True) self.host_column.set_sort_column_id(1000) self.pic_column.set_sort_column_id(1) self.host_column.set_reorderable(True) self.pic_column.set_reorderable(True) self.pic_column.pack_start(self.os_cell, True) self.host_column.pack_start(self.host_cell, True) self.pic_column.set_min_width(35) self.pic_column.set_attributes(self.os_cell, stock_id = 1) self.host_column.set_attributes(self.host_cell, text = 2) def mass_update(self, hosts): """Update the internal ListStores to reflect the hosts and services passed in. Hosts that have not changed are left alone.""" hosts = set(hosts) services = set() for h in hosts: services.update([s["service_name"] for s in h.services]) # Disable sorting while elements are added. See the PyGTK FAQ 13.43, # "Are there tips for improving performance when adding many rows to a # Treeview?" sort_column_id = self.host_list.get_sort_column_id() self.host_list.set_default_sort_func(lambda *args: -1) self.host_list.set_sort_column_id(-1, gtk.SORT_ASCENDING) self.host_view.freeze_child_notify() self.host_view.set_model(None) it = self.host_list.get_iter_first() # Remove any of our ListStore hosts that aren't in the list passed in. while it: host = self.host_list.get_value(it, 0) if host in hosts: hosts.remove(host) self.host_list.set(it, 1, get_os_icon(host)) it = self.host_list.iter_next(it) else: if not self.host_list.remove(it): it = None # Add any remaining hosts into our ListStore. for host in hosts: self.add_host(host) # Reenable sorting. if sort_column_id != (None, None): self.host_list.set_sort_column_id(*sort_column_id) self.host_view.set_model(self.host_list) self.host_view.thaw_child_notify() it = self.service_list.get_iter_first() # Remove any of our ListStore services that aren't in the list passed # in. while it: service_name = self.service_list.get_value(it, 0) if service_name in services: services.remove(service_name) it = self.service_list.iter_next(it) else: if not self.service_list.remove(it): it = None # Add any remaining services into our ListStore. for service_name in services: self.add_service(service_name) def add_host(self, host): self.host_list.append([host, get_os_icon(host), host.get_hostname()]) def add_service(self, service): self.service_list.append([service])
class ProfileEditor(HIGWindow): def __init__(self, command=None, profile_name=None, deletable=True, overwrite=False): HIGWindow.__init__(self) self.connect("delete_event", self.exit) self.set_title(_('Profile Editor')) self.set_position(gtk.WIN_POS_CENTER) self.deletable = deletable self.profile_name = profile_name self.overwrite = overwrite # Used to block recursive updating of the command entry when the command # entry causes the OptionBuilder widgets to change. self.inhibit_command_update = False self.__create_widgets() self.__pack_widgets() self.profile = CommandProfile() self.ops = NmapOptions() if profile_name: log.debug("Showing profile %s" % profile_name) prof = self.profile.get_profile(profile_name) # Interface settings self.profile_name_entry.set_text(profile_name) self.profile_description_text.get_buffer().set_text(prof['description']) command_string = prof['command'] self.ops.parse_string(command_string) if command: self.ops.parse_string(command) self.option_builder = OptionBuilder(Path.profile_editor, self.ops, self.update_command, self.help_field.get_buffer()) log.debug("Option groups: %s" % str(self.option_builder.groups)) log.debug("Option section names: %s" % str(self.option_builder.section_names)) #log.debug("Option tabs: %s" % str(self.option_builder.tabs)) for tab in self.option_builder.groups: self.__create_tab(_(tab), _(self.option_builder.section_names[tab]), self.option_builder.tabs[tab]) self.update_command() def command_entry_changed_cb(self, widget): command_string = self.command_entry.get_text().decode("UTF-8") self.ops.parse_string(command_string) self.inhibit_command_update = True self.option_builder.update() self.inhibit_command_update = False def update_command(self): """Regenerate and display the command.""" if not self.inhibit_command_update: # Block recursive updating of the OptionBuilder widgets when they # cause a change in the command entry. self.command_entry.handler_block(self.command_entry_changed_cb_id) self.command_entry.set_text(self.ops.render_string()) self.command_entry.handler_unblock(self.command_entry_changed_cb_id) def update_help_name(self, widget, extra): self.help_field.get_buffer().set_text("Profile name\n\nThis is how the" +" profile will be identified in the drop-down combo box in the" +" scan tab.") def update_help_desc(self, widget, extra): self.help_field.get_buffer().set_text("Description\n\nThe description is a" + " full description of what the scan does, which may be long.") def __create_widgets(self): ### # Vertical box to keep 3 boxes self.main_whole_box = HIGVBox() self.upper_box = HIGHBox() self.middle_box = HIGHBox() self.lower_box = HIGHBox() #self.main_vbox = HIGVBox() self.command_entry = gtk.Entry() self.command_entry_changed_cb_id = \ self.command_entry.connect("changed", self.command_entry_changed_cb) self.scan_button = HIGButton(_("Scan")) self.scan_button.connect("clicked", self.run_scan) self.notebook = gtk.Notebook() # Profile info page self.profile_info_vbox = HIGVBox() self.profile_info_label = HIGSectionLabel(_('Profile Information')) self.profile_name_label = HIGEntryLabel(_('Profile name')) self.profile_name_entry = gtk.Entry() self.profile_name_entry.connect('enter-notify-event', self.update_help_name) self.profile_description_label = HIGEntryLabel(_('Description')) self.profile_description_scroll = HIGScrolledWindow() self.profile_description_scroll.set_border_width(0) self.profile_description_text = HIGTextView() self.profile_description_text.connect('motion-notify-event', self.update_help_desc) # Buttons self.buttons_hbox = HIGHBox() self.cancel_button = HIGButton(stock=gtk.STOCK_CANCEL) self.cancel_button.connect('clicked', self.exit) self.delete_button = HIGButton(stock=gtk.STOCK_DELETE) self.delete_button.connect('clicked', self.delete_profile) self.save_button = HIGButton(_("Save Changes"), stock=gtk.STOCK_SAVE) self.save_button.connect('clicked', self.save_profile) ### self.help_vbox = HIGVBox() self.help_label = HIGSectionLabel(_('Help')) self.help_scroll = HIGScrolledWindow() self.help_scroll.set_border_width(0) self.help_field = HIGTextView() self.help_field.set_cursor_visible(False) self.help_field.set_left_margin(5) self.help_field.set_editable(False) self.help_vbox.set_size_request(200,-1) ### def __pack_widgets(self): ### self.add(self.main_whole_box) # Packing command entry to upper box self.upper_box._pack_expand_fill(self.command_entry) self.upper_box._pack_noexpand_nofill(self.scan_button) # Packing notebook (left) and help box (right) to middle box self.middle_box._pack_expand_fill(self.notebook) self.middle_box._pack_expand_fill(self.help_vbox) # Packing buttons to lower box self.lower_box.pack_end(self.buttons_hbox) # Packing the three vertical boxes to the main box self.main_whole_box._pack_noexpand_nofill(self.upper_box) self.main_whole_box._pack_expand_fill(self.middle_box) self.main_whole_box._pack_noexpand_nofill(self.lower_box) ### # Packing profile information tab on notebook self.notebook.append_page(self.profile_info_vbox, gtk.Label(_('Profile'))) self.profile_info_vbox.set_border_width(5) table = HIGTable() self.profile_info_vbox._pack_noexpand_nofill(self.profile_info_label) self.profile_info_vbox._pack_expand_fill(HIGSpacer(table)) self.profile_description_scroll.add(self.profile_description_text) vbox_desc = HIGVBox() vbox_desc._pack_noexpand_nofill(self.profile_description_label) vbox_desc._pack_expand_fill(hig_box_space_holder()) vbox_ann = HIGVBox() vbox_ann._pack_expand_fill(hig_box_space_holder()) table.attach(self.profile_name_label,0,1,0,1,xoptions=0,yoptions=0) table.attach(self.profile_name_entry,1,2,0,1,yoptions=0) table.attach(vbox_desc,0,1,1,2,xoptions=0) table.attach(self.profile_description_scroll,1,2,1,2) # Packing buttons on button_hbox self.buttons_hbox._pack_expand_fill(hig_box_space_holder()) if self.deletable: self.buttons_hbox._pack_noexpand_nofill(self.delete_button) self.buttons_hbox._pack_noexpand_nofill(self.cancel_button) self.buttons_hbox._pack_noexpand_nofill(self.save_button) self.buttons_hbox.set_border_width(5) self.buttons_hbox.set_spacing(6) ### self.help_vbox._pack_noexpand_nofill(self.help_label) self.help_vbox._pack_expand_fill(self.help_scroll) self.help_scroll.add(self.help_field) self.help_vbox.set_border_width(1) self.help_vbox.set_spacing(1) ### def __create_tab(self, tab_name, section_name, tab): log.debug(">>> Tab name: %s" % tab_name) log.debug(">>>Creating profile editor section: %s" % section_name) vbox = HIGVBox() if tab.notscripttab: # if notscripttab is set table = HIGTable() table.set_row_spacings(2) section = HIGSectionLabel(section_name) vbox._pack_noexpand_nofill(section) vbox._pack_noexpand_nofill(HIGSpacer(table)) vbox.set_border_width(5) tab.fill_table(table, True) else: hbox = tab.get_hmain_box() vbox.pack_start(hbox,True,True,0) self.notebook.append_page(vbox, gtk.Label(tab_name)) def save_profile(self, widget): if self.overwrite: self.profile.remove_profile(self.profile_name) profile_name = self.profile_name_entry.get_text() if profile_name == '': alert = HIGAlertDialog(message_format=_('Unnamed profile'),\ secondary_text=_('You must provide a name \ for this profile.')) alert.run() alert.destroy() self.profile_name_entry.grab_focus() return None command = self.ops.render_string() buf = self.profile_description_text.get_buffer() description = buf.get_text(buf.get_start_iter(),\ buf.get_end_iter()) try: self.profile.add_profile(profile_name,\ command=command,\ description=description) except ValueError: alert = HIGAlertDialog(message_format=_('Disallowed profile name'),\ secondary_text=_('Sorry, the name "%s" \ is not allowed due to technical limitations. (The underlying ConfigParser \ used to store profiles does not allow it.) Choose a different \ name.' % profile_name)) alert.run() alert.destroy() return self.scan_interface.toolbar.profile_entry.update() self.destroy() def clean_profile_info(self): self.profile_name_entry.set_text('') self.profile_description_text.get_buffer().set_text('') def set_scan_interface(self, interface): self.scan_interface = interface def exit(self, *args): self.destroy() def delete_profile(self, widget=None, extra=None): if self.deletable: dialog = HIGDialog(buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) alert = HIGEntryLabel('<b>'+_("Deleting Profile")+'</b>') text = HIGEntryLabel(_('Your profile is going to be deleted! Click\ Ok to continue, or Cancel to go back to Profile Editor.')) hbox = HIGHBox() hbox.set_border_width(5) hbox.set_spacing(12) vbox = HIGVBox() vbox.set_border_width(5) vbox.set_spacing(12) image = gtk.Image() image.set_from_stock(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG) vbox.pack_start(alert) vbox.pack_start(text) hbox.pack_start(image) hbox.pack_start(vbox) dialog.vbox.pack_start(hbox) dialog.vbox.show_all() response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_CANCEL: return True self.profile.remove_profile(self.profile_name) self.update_profile_entry() self.destroy() def run_scan(self, widget=None): command_string = self.command_entry.get_text().decode("UTF-8") self.scan_interface.command_toolbar.command = command_string self.scan_interface.start_scan_cb() self.exit() def update_profile_entry(self, widget=None, extra=None): self.scan_interface.toolbar.profile_entry.update() list = self.scan_interface.toolbar.profile_entry.get_model() length = len(list) if length >0 : self.scan_interface.toolbar.profile_entry.set_active(0)
class ScanResultNotebook(HIGNotebook): """ ScanResultNotebook Creates a new Scan Results notebook page, which includes the sections Ports/Hosts, Nmap Output, Host Details, and Scan Details. Organizes the way the results for scan is displayed in its new tab. """ def __init__(self, inventory, scans_store): HIGNotebook.__init__(self) self.set_border_width(5) self.__create_widgets(inventory, scans_store) self.__nmap_output_refreshing() self.scans_list.scans_list.connect("row-activated", self._scan_row_activated) self.append_page(self.nmap_output_page, gtk.Label(_('Nmap Output'))) self.append_page(self.open_ports_page, gtk.Label(_('Ports / Hosts'))) self.append_page(self.topology_page, gtk.Label(_('Topology'))) self.append_page(self.host_details_page, gtk.Label(_('Host Details'))) self.append_page(self.scans_list_page, gtk.Label(_('Scans'))) def host_mode(self): self.open_ports.host.host_mode() def port_mode(self): self.open_ports.host.port_mode() def __create_widgets(self, inventory, scans_store): self.open_ports_page = HIGVBox() self.nmap_output_page = HIGVBox() self.topology_page = HIGVBox() self.host_details_page = HIGScrolledWindow() self.host_details_vbox = HIGVBox() self.scans_list_page = HIGVBox() self.open_ports = ScanOpenPortsPage() self.nmap_output = ScanNmapOutputPage(scans_store) self.topology = TopologyPage(inventory) self.scans_list = ScanScanListPage(scans_store) self.no_selected = gtk.Label(_('No host selected.')) self.host_details = self.no_selected self.open_ports_page.add(self.open_ports) self.nmap_output_page.add(self.nmap_output) self.topology_page.add(self.topology) self.scans_list_page.add(self.scans_list) self.host_details_page.add_with_viewport(self.host_details_vbox) self.host_details_vbox._pack_expand_fill(self.host_details) def __nmap_output_refreshing(self): self.connect('switch-page', self.refresh_cb) def _scan_row_activated(self, treeview, path, view_column): """Switch back to the Nmap Output view when a scan is activated (double-clicked) on the scans list.""" self.nmap_output.set_active_iter(treeview.get_model().get_iter(path)) self.set_current_page(0) def refresh_cb(self, widget, page=None, page_num=None): if self.nmap_output.nmap_output.thread.isAlive(): if page_num == 2: self.nmap_output.nmap_output.refresh_output()
class UmitCredits(HIGWindow): def __init__(self): HIGWindow.__init__(self) self.set_title(_("%s credits") % UMIT_DISPLAY_NAME) self.set_size_request(-1, 250) self.set_position(gtk.WIN_POS_CENTER) self.__create_widgets() self.__packing() self.set_text() def __create_widgets(self): self.vbox = HIGVBox() self.hbox = HIGHBox() self.notebook = HIGNotebook() self.btn_close = HIGButton(stock=gtk.STOCK_CLOSE) self.written_by_scroll = HIGScrolledWindow() self.written_by_text = HIGTextView() self.design_scroll = HIGScrolledWindow() self.design_text = HIGTextView() self.soc2007_scroll = HIGScrolledWindow() self.soc2007_text = HIGTextView() self.contributors_scroll = HIGScrolledWindow() self.contributors_text = HIGTextView() self.translation_scroll = HIGScrolledWindow() self.translation_text = HIGTextView() self.nokia_scroll = HIGScrolledWindow() self.nokia_text = HIGTextView() def __packing(self): self.add(self.vbox) self.vbox.set_spacing(12) self.vbox._pack_expand_fill(self.notebook) self.vbox._pack_noexpand_nofill(self.hbox) self.hbox._pack_expand_fill(hig_box_space_holder()) self.hbox._pack_noexpand_nofill(self.btn_close) self.notebook.append_page( self.written_by_scroll, gtk.Label(_("Written by"))) self.notebook.append_page( self.design_scroll, gtk.Label(_("Design"))) self.notebook.append_page( self.soc2007_scroll, gtk.Label(_("SoC 2007"))) self.notebook.append_page( self.contributors_scroll, gtk.Label(_("Contributors"))) self.notebook.append_page( self.translation_scroll, gtk.Label(_("Translation"))) self.notebook.append_page( self.nokia_scroll, gtk.Label(_("Maemo"))) self.written_by_scroll.add(self.written_by_text) self.written_by_text.set_wrap_mode(gtk.WRAP_NONE) self.design_scroll.add(self.design_text) self.design_text.set_wrap_mode(gtk.WRAP_NONE) self.soc2007_scroll.add(self.soc2007_text) self.soc2007_text.set_wrap_mode(gtk.WRAP_NONE) self.contributors_scroll.add(self.contributors_text) self.contributors_text.set_wrap_mode(gtk.WRAP_NONE) self.translation_scroll.add(self.translation_text) self.translation_text.set_wrap_mode(gtk.WRAP_NONE) self.nokia_scroll.add(self.nokia_text) self.nokia_text.set_wrap_mode(gtk.WRAP_NONE) self.btn_close.connect('clicked', lambda x, y=None: self.destroy()) def set_text(self): b = self.written_by_text.get_buffer() b.set_text("""Adriano Monteiro Marques <*****@*****.**>""") b = self.design_text.get_buffer() b.set_text("""Operating System and Vulnerability Icons: Takeshi Alexandre Gondo <*****@*****.**> Logo, Application Icons and Splash screen: Virgílio Carlo de Menezes Vasconcelos <*****@*****.**> The Umit Project Web Site Design: Joao Paulo Pacheco <*****@*****.**>""") b = self.soc2007_text.get_buffer() b.set_text("""Independent Features: Adriano Monteiro Marques <*****@*****.**> Frederico Silva Ribeiro <*****@*****.**> Network Inventory: Guilherme Henrique Polo Gonçalves <*****@*****.**> Umit Radial Mapper: João Paulo de Souza Medeiros <*****@*****.**> Profile/Wizard interface editor: Luis Antonio Bastião Silva <*****@*****.**> NSE Facilitator: Maxim I. Gavrilov <*****@*****.**> Umit Web: Rodolfo da Silva Carvalho <*****@*****.**>""") b = self.contributors_text.get_buffer() b.set_text("""Sponsored by (SoC 2005, 2006 and 2007): Google <*****@*****.**> Mentor of Umit for Google SoC 2005 and 2006: Fyodor <*****@*****.**> Mentor of Umit for Google SoC 2007 Projects: Adriano Monteiro Marques <*****@*****.**> Initial development: Adriano Monteiro Marques <*****@*****.**> Cleber Rodrigues Rosa Junior <*****@*****.**> Nmap students from Google SoC 2007 that helped Umit: Eddie Bell <*****@*****.**> David Fifield <*****@*****.**> Kris Katterjohn <*****@*****.**> The Umit Project WebSite: AbraoBarbosa dos Santos Neto <*****@*****.**> Adriano Monteiro Marques <*****@*****.**> Heitor de Lima Matos <*****@*****.**> Joao Paulo Pacheco <*****@*****.**> João Paulo de Souza Medeiros <*****@*****.**> Luis Antonio Bastião Silva <*****@*****.**> Rodolfo da Silva Carvalho <*****@*****.**> Beta testers for 0.9.5RC1: Drew Miller <*****@*****.**> Igor Feghali <*****@*****.**> Joao Paulo Pacheco <*****@*****.**> Luis Antonio Bastião Silva <*****@*****.**> <*****@*****.**> <*****@*****.**> <*****@*****.**> Initial attempt on Maemo port: Adriano Monteiro Marques <*****@*****.**> Osvaldo Santana Neto <*****@*****.**>""") b = self.translation_text.get_buffer() b.set_text("""Brazilian Portuguese: Adriano Monteiro Marques <*****@*****.**>""") b = self.nokia_text.get_buffer() b.set_text("""Adriano Monteiro Marques <*****@*****.**>""")
class CrashReport(HIGWindow): def __init__(self, summary, description): HIGWindow.__init__(self) gtk.Window.__init__(self) self.set_title(_('Crash Report')) self.set_position(gtk.WIN_POS_CENTER_ALWAYS) self.response_id = False self._create_widgets() self._pack_widgets() self._connect_widgets() self.summary = summary self.description = description def _create_widgets(self): self.vbox = HIGVBox() self.button_box = gtk.HButtonBox() self.email_label = HIGHintSectionLabel(_("Email"), _("\ Optional. We occasionally contact the reporters of crashes in order to get \ more information.")) self.email_entry = gtk.Entry() self.description_label = gtk.Label(_("\ At the top of this form please write what you were doing when the crash \ happened, as well as any other information you think is relevant.")) self.description_scrolled = gtk.ScrolledWindow() self.description_text = gtk.TextView() self.bug_icon = gtk.Image() self.bug_text = gtk.Label(_("""\ This Bug Report dialog allows you to easily tell us about a problem that you \ may have found in %s. Doing so, you help us to help you, by fixing and \ improving %s faster than usual. Submitting the report will open a description \ of the new bug at the bug tracker.\ """ % (APP_DISPLAY_NAME, APP_DISPLAY_NAME))) self.btn_ok = gtk.Button(stock=gtk.STOCK_OK) self.btn_cancel = gtk.Button(stock=gtk.STOCK_CANCEL) self.hbox = HIGHBox() self.table = HIGTable() def _pack_widgets(self): self.description_label.set_line_wrap(True) self.description_label.set_alignment(0.0, 0.5) self.description_scrolled.add(self.description_text) self.description_scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.description_scrolled.set_size_request(400, 150) self.description_text.set_wrap_mode(gtk.WRAP_WORD) self.bug_icon.set_from_stock(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_DIALOG) self.bug_icon.set_padding(10, 0) self.bug_text.set_line_wrap(True) self.hbox.set_border_width(12) self.vbox.set_border_width(6) self.table.attach_label(self.email_label, 0, 1, 0, 1) self.table.attach_entry(self.email_entry, 1, 2, 0, 1) self.table.attach_entry(self.description_label, 0, 2, 1, 2) self.table.attach_entry(self.description_scrolled, 0, 2, 2, 3) self.hbox._pack_noexpand_nofill(self.bug_icon) self.hbox._pack_expand_fill(self.bug_text) self.button_box.set_layout(gtk.BUTTONBOX_END) self.button_box.pack_start(self.btn_ok) self.button_box.pack_start(self.btn_cancel) self.vbox._pack_noexpand_nofill(self.hbox) self.vbox._pack_expand_fill(self.table) self.vbox._pack_noexpand_nofill(self.button_box) self.add(self.vbox) def _connect_widgets(self): self.btn_ok.connect("clicked", self.send_report) self.btn_cancel.connect("clicked", self.close) self.connect("delete-event", self.close) def send_report(self, widget): bug_register = BugRegister() report_url = bug_register.get_report_url(self.summary, "%s\n\nEmail: %s" % (self.description, self.email)) # First we try reporting the bug with a web browser because that gives # better feedback on what happened. If that doesn't work try with # urllib2. try: webbrowser.open(report_url) except webbrowser.Error: try: urllib2.urlopen(report_url) ok_dialog = HIGAlertDialog(type=gtk.MESSAGE_INFO, message_format=_("Bug reported"), secondary_text=_("The bug was successfully reported.")) ok_dialog.run() ok_dialog.destroy() except urllib2.URLError, e: cancel_dialog = HIGAlertDialog(type=gtk.MESSAGE_ERROR, message_format=_("Bug not reported"), secondary_text=_("This error occurred while trying to report the bug:\n\n" + str(e))) cancel_dialog.run() cancel_dialog.destroy() self.close()
class ProfileEditor(HIGWindow): def __init__(self, profile_name=None, deletable=True, overwrite=False): HIGWindow.__init__(self) self.connect("delete_event", self.exit) self.set_title(_('Profile Editor')) self.set_position(gtk.WIN_POS_CENTER) self.deletable = deletable self.profile_name = profile_name self.overwrite = overwrite self.__create_widgets() self.__pack_widgets() self.profile = CommandProfile() options_used = {} if profile_name: log.debug("Showing profile %s" % profile_name) prof = self.profile.get_profile(profile_name) options_used = prof['options'] # Interface settings self.profile_name_entry.set_text(profile_name) self.profile_description_text.get_buffer().set_text( prof['description']) self.constructor = CommandConstructor(options_used) ### self.profilehelp = ProfileHelp(options_used) ### self.options = OptionBuilder(Path.profile_editor, self.constructor, self.update_command, self.profilehelp) log.debug("Option groups: %s" % str(self.options.groups)) log.debug("Option section names: %s" % str(self.options.section_names)) #log.debug("Option tabs: %s" % str(self.options.tabs)) for tab in self.options.groups: self.__create_tab(tab, self.options.section_names[tab], self.options.tabs[tab]) self.update_command() def update_command(self): """Regenerate command with target '<target>' and set the value for the command entry""" self.command_entry.set_text(self.constructor.get_command('<target>')) ### whenever the command would be updated, thats when we update the help self.update_help() def update_help(self, text=None): helpText = self.help_field.get_buffer() if text: helpText.set_text(text) else: tempText = "" if self.profilehelp.get_currentstate() == "Default": helpText.set_text(" ") else: tempText += self.profilehelp.get_label() tempText += "\n\n" tempText += self.profilehelp.get_shortdesc() if self.profilehelp.get_example(): tempText += "\n\nExample input:\n" tempText += self.profilehelp.get_example() helpText.set_text(tempText) def update_help_name(self, widget, extra): self.update_help( text="Profile name\n\nThis is how the" + " profile will be identified in the drop-down combo box in the" + " scan tab.") def update_help_desc(self, widget, extra): self.update_help( text="Description\n\nThe description is a" + " full description of what the scan does, which may be long.") def help(self, widget): d = HIGAlertDialog( parent=self, message_format=_("Help not implemented"), secondary_text=_("Profile editor help is not implemented yet.")) d.run() d.destroy() def __create_widgets(self): ### # Vertical box to keep 3 boxes self.main_whole_box = HIGVBox() self.upper_box = HIGVBox() self.middle_box = HIGHBox() self.lower_box = HIGHBox() #self.main_vbox = HIGVBox() self.command_expander = HIGExpander('<b>' + _('Command') + '</b>') self.command_expander.set_expanded(True) self.command_entry = gtk.Entry() self.command_entry.set_editable(False) self.notebook = gtk.Notebook() # Profile info page self.profile_info_vbox = HIGVBox() self.profile_info_label = HIGSectionLabel(_('Profile Information')) self.profile_name_label = HIGEntryLabel(_('Profile name')) self.profile_name_entry = gtk.Entry() self.profile_name_entry.connect('enter-notify-event', self.update_help_name) self.profile_description_label = HIGEntryLabel(_('Description')) self.profile_description_scroll = HIGScrolledWindow() self.profile_description_scroll.set_border_width(0) self.profile_description_text = HIGTextView() self.profile_description_text.connect('motion-notify-event', self.update_help_desc) # Buttons self.buttons_hbox = HIGHBox() self.help_button = HIGButton(stock=gtk.STOCK_HELP) self.help_button.connect('clicked', self.help) self.cancel_button = HIGButton(stock=gtk.STOCK_CANCEL) self.cancel_button.connect('clicked', self.exit) self.delete_button = HIGButton(stock=gtk.STOCK_DELETE) self.delete_button.connect('clicked', self.delete_profile) self.ok_button = HIGButton(stock=gtk.STOCK_OK) self.ok_button.connect('clicked', self.save_profile) ### self.help_vbox = HIGVBox() self.help_label = HIGSectionLabel(_('Help')) self.help_scroll = HIGScrolledWindow() self.help_scroll.set_border_width(0) self.help_field = HIGTextView() self.help_field.set_cursor_visible(False) self.help_field.set_left_margin(5) self.help_field.set_editable(False) self.help_vbox.set_size_request(200, -1) ### def __pack_widgets(self): ### self.add(self.main_whole_box) # Packing command expander to upper box self.upper_box._pack_noexpand_nofill(self.command_expander) # Packing notebook (left) and help box (right) to middle box self.middle_box._pack_expand_fill(self.notebook) self.middle_box._pack_expand_fill(self.help_vbox) # Packing buttons to lower box self.lower_box.pack_end(self.buttons_hbox) # Packing the three vertical boxes to the main box self.main_whole_box._pack_noexpand_nofill(self.upper_box) self.main_whole_box._pack_noexpand_nofill(self.middle_box) self.main_whole_box._pack_noexpand_nofill(self.lower_box) ### # Packing command_entry on command_expander self.command_expander.hbox.pack_start(self.command_entry) # Packing profile information tab on notebook self.notebook.append_page(self.profile_info_vbox, gtk.Label(_('Profile'))) self.profile_info_vbox.set_border_width(5) table = HIGTable() self.profile_info_vbox._pack_noexpand_nofill(self.profile_info_label) self.profile_info_vbox._pack_expand_fill(HIGSpacer(table)) self.profile_description_scroll.add(self.profile_description_text) vbox_desc = HIGVBox() vbox_desc._pack_noexpand_nofill(self.profile_description_label) vbox_desc._pack_expand_fill(hig_box_space_holder()) vbox_ann = HIGVBox() vbox_ann._pack_expand_fill(hig_box_space_holder()) table.attach(self.profile_name_label, 0, 1, 0, 1, xoptions=0, yoptions=0) table.attach(self.profile_name_entry, 1, 2, 0, 1, yoptions=0) table.attach(vbox_desc, 0, 1, 1, 2, xoptions=0) table.attach(self.profile_description_scroll, 1, 2, 1, 2) # Packing buttons on button_hbox #self.buttons_hbox.pack_start(self.help_button) self.buttons_hbox._pack_expand_fill(hig_box_space_holder()) if self.deletable: self.buttons_hbox._pack_noexpand_nofill(self.delete_button) self.buttons_hbox._pack_noexpand_nofill(self.cancel_button) self.buttons_hbox._pack_noexpand_nofill(self.ok_button) self.buttons_hbox.set_border_width(5) self.buttons_hbox.set_spacing(6) ### self.help_vbox._pack_noexpand_nofill(self.help_label) self.help_vbox._pack_expand_fill(self.help_scroll) self.help_scroll.add(self.help_field) self.help_vbox.set_border_width(1) self.help_vbox.set_spacing(1) ### def __create_tab(self, tab_name, section_name, tab): log.debug(">>> Tab name: %s" % tab_name) log.debug(">>>Creating profile editor section: %s" % section_name) vbox = HIGVBox() table = HIGTable() table.set_row_spacings(2) section = HIGSectionLabel(section_name) vbox._pack_noexpand_nofill(section) vbox._pack_noexpand_nofill(HIGSpacer(table)) vbox.set_border_width(5) tab.fill_table(table, True) self.notebook.append_page(vbox, gtk.Label(tab_name)) def save_profile(self, widget): if self.overwrite: self.profile.remove_profile(self.profile_name) profile_name = self.profile_name_entry.get_text() if profile_name == '': alert = HIGAlertDialog(message_format=_('Unnamed profile'),\ secondary_text=_('You must provide a name \ for this profile.' )) alert.run() alert.destroy() self.profile_name_entry.grab_focus() return None command = self.constructor.get_command('%s') buf = self.profile_description_text.get_buffer() description = buf.get_text(buf.get_start_iter(),\ buf.get_end_iter()) self.profile.add_profile(profile_name,\ command=command,\ description=description,\ options=self.constructor.get_options()) self.scan_interface.toolbar.profile_entry.update() self.scan_interface.refresh_command(None) self.destroy() def clean_profile_info(self): self.profile_name_entry.set_text('') self.profile_description_text.get_buffer().set_text('') def set_scan_interface(self, interface): self.scan_interface = interface def exit(self, *args): self.destroy() def delete_profile(self, widget=None, extra=None): if self.deletable: dialog = HIGDialog(buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) alert = HIGEntryLabel('<b>' + _("Deleting Profile") + '</b>') text = HIGEntryLabel( _('Your profile is going to be deleted! Click\ Ok to continue, or Cancel to go back to Profile Editor.')) hbox = HIGHBox() hbox.set_border_width(5) hbox.set_spacing(12) vbox = HIGVBox() vbox.set_border_width(5) vbox.set_spacing(12) image = gtk.Image() image.set_from_stock(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG) vbox.pack_start(alert) vbox.pack_start(text) hbox.pack_start(image) hbox.pack_start(vbox) dialog.vbox.pack_start(hbox) dialog.vbox.show_all() response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_CANCEL: return True self.profile.remove_profile(self.profile_name) self.update_profile_entry() self.destroy() def update_profile_entry(self, widget=None, extra=None): self.scan_interface.toolbar.profile_entry.update() list = self.scan_interface.toolbar.profile_entry.get_model() length = len(list) if length > 0: self.scan_interface.toolbar.profile_entry.set_active(0)
class ScanHostsView(HIGVBox, object): def __init__(self, hosts={}, services={}): HIGVBox.__init__(self) self._create_widgets() self._connect_widgets() self._pack_widgets() self._set_scrolled() self._set_host_list(hosts) self._set_service_list(services) self._pack_expand_fill(self.main_vbox) # Default mode is host mode self.host_mode(self.host_mode_button) self.host_view.show_all() self.service_view.show_all() def _create_widgets(self): # Mode buttons self.host_mode_button = gtk.ToggleButton(_("Hosts")) self.service_mode_button = gtk.ToggleButton(_("Services")) self.buttons_box = gtk.HBox() # Main window vbox self.main_vbox = HIGVBox() # Host list self.host_list = gtk.ListStore(str, str) self.host_view = gtk.TreeView(self.host_list) self.pic_column = gtk.TreeViewColumn(_('OS')) self.host_column = gtk.TreeViewColumn(_('Host')) self.os_cell = gtk.CellRendererPixbuf() self.host_cell = gtk.CellRendererText() # Service list self.service_list = gtk.ListStore(str) self.service_view = gtk.TreeView(self.service_list) self.service_column = gtk.TreeViewColumn(_('Service')) self.service_cell = gtk.CellRendererText() self.scrolled = gtk.ScrolledWindow() def _pack_widgets(self): self.main_vbox.set_spacing(0) self.main_vbox.set_border_width(0) self.main_vbox._pack_noexpand_nofill(self.buttons_box) self.main_vbox._pack_expand_fill(self.scrolled) self.host_mode_button.set_active(True) self.buttons_box.set_border_width(5) self.buttons_box.pack_start(self.host_mode_button) self.buttons_box.pack_start(self.service_mode_button) def _connect_widgets(self): self.host_mode_button.connect("toggled", self.host_mode) self.service_mode_button.connect("toggled", self.service_mode) def host_mode(self, widget): self._remove_scrolled_child() if widget.get_active(): self.service_mode_button.set_active(False) self.scrolled.add(self.host_view) else: self.service_mode_button.set_active(True) def service_mode(self, widget): self._remove_scrolled_child() if widget.get_active(): self.host_mode_button.set_active(False) self.scrolled.add(self.service_view) else: self.host_mode_button.set_active(True) def _remove_scrolled_child(self): try: child = self.scrolled.get_child() self.scrolled.remove(child) except: pass def _set_scrolled(self): self.scrolled.set_border_width(5) self.scrolled.set_size_request(150, -1) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) def _set_service_list(self, services): self.service_view.set_enable_search(True) self.service_view.set_search_column(0) selection = self.service_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) self.service_view.append_column(self.service_column) self.service_column.set_resizable(True) self.service_column.set_sort_column_id(0) self.service_column.set_reorderable(True) self.service_column.pack_start(self.service_cell, True) self.service_column.set_attributes(self.service_cell, text=0) self.set_services(services) def _set_host_list(self, hosts): self.host_view.set_enable_search(True) self.host_view.set_search_column(1) selection = self.host_view.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) self.host_view.append_column(self.pic_column) self.host_view.append_column(self.host_column) self.host_column.set_resizable(True) self.pic_column.set_resizable(True) self.host_column.set_sort_column_id(1) self.pic_column.set_sort_column_id(1) self.host_column.set_reorderable(True) self.pic_column.set_reorderable(True) self.pic_column.pack_start(self.os_cell, True) self.host_column.pack_start(self.host_cell, True) self.pic_column.set_attributes(self.os_cell, stock_id=0) self.pic_column.set_min_width(35) self.host_column.set_attributes(self.host_cell, text=1) self.set_hosts(hosts) def clear_host_list(self): for i in range(len(self.host_list)): iter = self.host_list.get_iter_root() del (self.host_list[iter]) def clear_service_list(self): for i in range(len(self.service_list)): iter = self.service_list.get_iter_root() del (self.service_list[iter]) def set_hosts(self, hosts): self.hosts = hosts self.clear_host_list() for host in hosts: self.host_list.append([hosts[host]['stock'], host]) def set_services(self, services): self.services = services self.clear_service_list() for service in services: self.service_list.append([service]) def add_host(self, host): for h in host: self.host_list.append([host[h]['stock'], h]) def add_service(self, service): if type(service) == type([]): for s in service: self.service_list.append([s]) elif type(service) in StringTypes: self.service_list.append([service]) def get_action(self, host): try: return self.hosts[host]['action'] except: return False
class DiffWindow(gtk.Window): def __init__(self, scans): """scans in the format: {"scan_title":parsed_scan} """ gtk.Window.__init__(self) self.set_title(_("Compare Results")) self.scans = scans self.umit_conf = UmitConf() self.colors = Colors() # Diff views self.text_view = DiffText(self.colors, self.umit_conf.colored_diff) self.compare_view = DiffTree(self.colors) self.temp_html_file = None self._create_widgets() self._pack_widgets() self._connect_widgets() # Settings if self.umit_conf.diff_mode == "text": self.text_mode.set_active(True) else: self.compare_mode.set_active(True) self.check_color.set_active(self.umit_conf.colored_diff) # Initial Size Request self.initial_size = self.size_request() def _show_help(self, action): webbrowser.open("file://%s" % os.path.join(Path.docs_dir, "help.html"), new=2) def _create_widgets(self): self.main_vbox = HIGVBox() self.hbox_mode = HIGHBox() self.hbox_settings = HIGHBox() self.hbox_buttons = HIGHBox() self.hbox_result = HIGHBox() self.btn_open_browser = HIGButton(_("Open in Browser"), stock=gtk.STOCK_EXECUTE) self.btn_help = HIGButton(stock=gtk.STOCK_HELP) self.btn_close = HIGButton(stock=gtk.STOCK_CLOSE) self.check_color = gtk.CheckButton(_("Enable colored diffies")) self.btn_legend = HIGButton(_("Color Descriptions"), stock=gtk.STOCK_SELECT_COLOR) self.text_mode = gtk.ToggleButton(_("Text Mode")) self.compare_mode = gtk.ToggleButton(_("Compare Mode")) self.vpaned = gtk.VPaned() self.hpaned = gtk.HPaned() self.scan_chooser1 = ScanChooser(self.scans, "1") self.scan_chooser2 = ScanChooser(self.scans, "2") self.scan_buffer1 = self.scan_chooser1.get_buffer() self.scan_buffer2 = self.scan_chooser2.get_buffer() def _pack_widgets(self): self.main_vbox.set_border_width(6) self.vpaned.pack1(self.hpaned, True, False) self.vpaned.pack2(self.hbox_result) self.hpaned.pack1(self.scan_chooser1, True, False) self.hpaned.pack2(self.scan_chooser2, True, False) self.hbox_buttons._pack_expand_fill(self.btn_help) self.hbox_buttons._pack_expand_fill(self.btn_legend) self.hbox_buttons._pack_expand_fill(self.btn_open_browser) self.hbox_buttons._pack_expand_fill(self.btn_close) self.hbox_buttons.set_homogeneous(True) self.hbox_mode.set_homogeneous(True) self.hbox_mode.pack_start(self.text_mode) self.hbox_mode.pack_start(self.compare_mode) self.hbox_settings._pack_noexpand_nofill(self.hbox_mode) self.hbox_settings._pack_expand_fill(self.check_color) self.main_vbox._pack_expand_fill(self.vpaned) self.main_vbox._pack_noexpand_nofill(self.hbox_settings) self.main_vbox._pack_noexpand_nofill(self.hbox_buttons) self.add(self.main_vbox) def _connect_widgets(self): self.connect("delete-event", self.close) self.btn_legend.connect("clicked", self.show_legend_window) self.btn_help.connect("clicked", self._show_help) self.btn_close.connect("clicked", self.close) self.btn_open_browser.connect("clicked", self.open_browser) self.check_color.connect("toggled", self._set_color) self.text_mode.connect("clicked", self._change_to_text) self.compare_mode.connect("clicked", self._change_to_compare) self.scan_chooser1.exp_scan.connect('activate', self.resize_vpane) self.scan_chooser2.exp_scan.connect('activate', self.resize_vpane) self.scan_chooser1.connect('changed', self.refresh_diff) self.scan_chooser2.connect('changed', self.refresh_diff) def open_browser(self, widget): text1 = self.scan_chooser1.nmap_output text2 = self.scan_chooser2.nmap_output if text1 is None or text2 is None: alert = HIGAlertDialog( message_format='<b>'+_('Select Scan')+'</b>', secondary_text=_("You must select two different scans to \ generate diff.")) alert.run() alert.destroy() return False if text1 == '' and text2 == '': alert = HIGAlertDialog( message_format='<b>'+_('No Text Output')+'</b>', secondary_text=_("Neither of the scans you selected has \ any text output. (Scans loaded from plain Nmap XML output files do not contain \ text output.) The HTML diff shows only differences between text output, so \ there is nothing to show.")) alert.run() alert.destroy() return False # True tells splitlines to keep line endings. text1 = text1.splitlines(True) text2 = text2.splitlines(True) if self.temp_html_file is not None: self.temp_html_file.close() # A NamedTemporaryFile is deleted when it is closed. self.temp_html_file = tempfile.NamedTemporaryFile(suffix = ".html", prefix = "zenmap-diff-") if use_html: diff = DiffHtml(text1, text2) diff = diff.generate() self.temp_html_file.write(''.join(diff)) else: diff = Diff(text1, text2) diff = diff.generate () diff.insert(0, '''<pre>(This diff is been shown in pure text \ because you dont have Python 2.4 or higher.)\n''') diff.append('</pre>') self.temp_html_file.writelines(diff) self.temp_html_file.flush() webbrowser.open("file://" + self.temp_html_file.name, autoraise=1) def show_legend_window(self, widget): legend_window = DiffLegendWindow(self.colors) legend_window.run() legend_window.destroy() self.refresh_diff(None) def refresh_diff (self, widget): """This method is called whenever the diff output might have changed, such as when a different scan was selected in one of the choosers.""" if self.compare_mode.get_active(): # Graphical comparison mode. parsed1 = self.scan_chooser1.parsed_scan parsed2 = self.scan_chooser2.parsed_scan if parsed1 is not None and parsed2 is not None: self.compare_view.make_diff(parsed1, parsed2) else: self.compare_view.clear_diff_tree() self.compare_view.activate_color(self.check_color.get_active()) else: # Text comparison mode. text1 = self.scan_chooser1.nmap_output text2 = self.scan_chooser2.nmap_output if text1 is not None and text2 is not None: diff = Diff(text1.split('\n'), text2.split('\n')) self.text_view.set_text('\n'.join(diff.generate_without_banner())) else: self.text_view.clear() self.text_view.activate_color(self.check_color.get_active()) def resize_vpane(self, widget): exp1 = not widget.get_expanded() if widget == self.scan_chooser1.exp_scan: exp2 = self.scan_chooser2.exp_scan.get_expanded() else: exp2 = self.scan_chooser1.exp_scan.get_expanded() if not exp1 and not exp2: self.vpaned.compute_position(-1, 0, 500) self.size_allocate(gtk.gdk.Rectangle(width=self.initial_size[0], height=self.initial_size[1])) self.queue_resize() def _change_to_text(self, widget): if not widget.get_active(): return self.umit_conf.diff_mode = "text" children = self.hbox_result.get_children() if children: self.hbox_result.remove(children[0]) self.compare_view.hide() self.hbox_result._pack_expand_fill(self.text_view) self.text_view.show_all() self.compare_mode.set_active(False) self.refresh_diff(None) def _change_to_compare(self, widget): if not widget.get_active(): return self.umit_conf.diff_mode = "compare" children = self.hbox_result.get_children() if children: self.hbox_result.remove(children[0]) self.text_view.hide() self.hbox_result._pack_expand_fill(self.compare_view) self.compare_view.show_all() self.text_mode.set_active(False) self.refresh_diff(None) def _set_color(self, widget): activate = widget.get_active() self.umit_conf.colored_diff = activate self.compare_view.activate_color(activate) self.text_view.activate_color(activate) def close(self, widget=None, extra=None): if self.temp_html_file is not None: self.temp_html_file.close() self.destroy()