optionbuilder.py

来自「Ubuntu packages of security software。 相」· Python 代码 · 共 326 行

PY
326
字号
#!/usr/bin/env python# -*- coding: utf-8 -*-# Copyright (C) 2005 Insecure.Com LLC.## Author: Adriano Monteiro Marques <py.adriano@gmail.com>## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USAimport gtkfrom xml.dom import minidomfrom higwidgets.higboxes import HIGHBoxfrom higwidgets.higlabels import HIGEntryLabelfrom higwidgets.higbuttons import HIGButtonfrom zenmapGUI.FileChoosers import AllFilesFileChooserDialogfrom zenmapCore.NmapOptions import NmapOptionsfrom zenmapCore.I18N import _from zenmapCore.OptionsConf import options_fileclass OptionTab(object):    def __init__(self, root_tab, options, constructor, update_func):        actions = {'option_list':self.__parse_option_list,\                   'option_check':self.__parse_option_check}        self.options = options        self.constructor = constructor        self.update_func = update_func        self.widgets_list = []        options_used = self.constructor.get_options()                # Cannot use list comprehhension because text nodes raise exception        # when tagName is called        for option_element in root_tab.childNodes:            try:option_element.tagName            except:pass            else:                if option_element.tagName in actions.keys():                    self.widgets_list.append(actions[option_element.tagName](option_element, options_used))    def __parse_option_list(self, option_list, options_used):        options = option_list.getElementsByTagName(u'option')                label = HIGEntryLabel(option_list.getAttribute(u'label'))        opt_list = OptionList()                for opt in options:            opt_list.append(self.options.get_option(opt.getAttribute(u'name')))                for i, row in enumerate(opt_list.list):            if row[0] in options_used:                opt_list.set_active(i)                        return label, opt_list        def __parse_option_check(self, option_check, options_used):        arg_type = option_check.getAttribute(u'arg_type')        option = option_check.getAttribute(u'option')        label = option_check.getAttribute(u'label')                check = OptionCheck(label, self.options.get_option(option))        check.set_active(option in options_used)                    type_mapping = {             "str": OptionEntry,            "int": OptionIntSpin,            "float": OptionFloatSpin,            "level": OptionLevelSpin,             "path": OptionFile,            "interface": OptionInterface            }        additional = None        if type_mapping.has_key(arg_type):            value = options_used.get(option, None)            if value:                additional = type_mapping[arg_type](value)            else:                additional = type_mapping[arg_type]()        check.connect('toggled', self.update_check, additional)                return check, additional    def fill_table(self, table, expand_fill = True):        yopt = (0, gtk.EXPAND | gtk.FILL)[expand_fill]        for y, widget in enumerate(self.widgets_list):            if widget[1] == None:                table.attach(widget[0], 0, 2, y, y+1, yoptions=yopt)            else:                table.attach(widget[0], 0, 1, y, y+1, yoptions=yopt)                table.attach(widget[1], 1, 2, y, y+1, yoptions=yopt)        for widget in self.widgets_list:            te = type(widget[1])            if te == type(OptionList()):                widget[1].connect('changed',self.update_list_option)            elif te == type(OptionIntSpin()) or\                 te == type(OptionFloatSpin()) or\                 te == type(OptionEntry()):                widget[1].connect('changed', self.update_entry, widget[0])            elif te == type(OptionLevelSpin()):                widget[1].connect('changed', self.update_level, widget[0])            elif te == type(OptionFile()):                widget[1].entry.connect('changed', self.update_entry, widget[0])            elif te == type(OptionInterface()):                widget[1].child.connect('changed', self.update_entry, widget[0])                def update_check(self, check, extra):        if check.get_active():            te = type(extra)            if te == type(OptionEntry()) or\               te == type(OptionIntSpin()) or\               te == type(OptionFloatSpin()):                self.update_entry(extra, check)            elif te == type(OptionLevelSpin()):                self.update_level(extra, check)            elif te == type(OptionFile()):                self.update_entry(extra.entry, check)            elif te == type(OptionInterface()):                self.update_entry(extra.child, check)            else:                self.constructor.add_option(check.option['name'])        else:            self.constructor.remove_option(check.option['name'])        self.update_command()            def update_entry(self, widget, check):        if not check.get_active():            check.set_active(True)        self.constructor.remove_option(check.option['name'])        self.constructor.add_option(check.option['name'], widget.get_text())                self.update_command()        def update_level(self, widget, check):        if not check.get_active():            check.set_active(True)                try:            self.constructor.remove_option(check.option['name'])            if int(widget.get_text()) == 0:                check.set_active(False)            else:                self.constructor.add_option(check.option['name'],\                                        level=int(widget.get_text()))        except:pass                self.update_command()    def update_list_option(self, widget):        try:widget.last_selected        except:pass        else:            self.constructor.remove_option(widget.last_selected)                option_name = widget.options[widget.get_active()]['name']              self.constructor.add_option(option_name)        widget.last_selected = option_name                self.update_command()    def update_command(self):        if self.update_func:            self.update_func()                     class OptionBuilder(object):    def __init__(self, xml_file, constructor, update_func):        """ OptionBuilder(xml_file, constructor)        xml_file is a UI description xml-file        constructor is a CommandConstructor instance        """        xml_desc = open(xml_file)        self.xml = minidom.parse(xml_desc)        # Closing file to avoid problems with file descriptors        xml_desc.close()        self.constructor = constructor        self.update_func = update_func                self.root_tag = "interface"                self.xml = self.xml.getElementsByTagName(self.root_tag)[0]        self.options = NmapOptions(options_file)                self.groups = self.__parse_groups()        self.section_names = self.__parse_section_names()        self.tabs = self.__parse_tabs()        def __parse_section_names(self):        dic = {}        for group in self.groups:            grp = self.xml.getElementsByTagName(group)[0]            dic[group] = grp.getAttribute(u'label')        return dic        def __parse_groups(self):        return [g_name.getAttribute(u'name') for g_name in \                  self.xml.getElementsByTagName(u'groups')[0].\                  getElementsByTagName(u'group')]    def __parse_tabs(self):        dic = {}        for tab_name in self.groups:            dic[tab_name] = OptionTab(self.xml.getElementsByTagName(tab_name)[0],                                      self.options, self.constructor, self.update_func)        return dic    class OptionWidget:    def enable_widget(self):        self.set_sensitive(True)        def disable_widget(self):        self.set_sensitive(False)class OptionInterface(gtk.ComboBoxEntry, OptionWidget):    def __init__(self):        self.list = gtk.ListStore(str)        gtk.ComboBoxEntry.__init__(self, self.list)                cell = gtk.CellRendererText()        self.pack_start(cell, True)        self.add_attribute(cell, 'text', 0)class OptionList(gtk.ComboBox, OptionWidget):    def __init__(self):        self.list = gtk.ListStore(str)        gtk.ComboBox.__init__(self, self.list)                cell = gtk.CellRendererText()        self.pack_start(cell, True)        self.add_attribute(cell, 'text', 0)                self.options = []        def append(self, option):        self.list.append([option[u'name']])        self.options.append(option)class OptionCheck(gtk.CheckButton, OptionWidget):    def __init__(self, label=None, option=None):        gtk.CheckButton.__init__(self, label)                self.option = option        def get_option(self):        return self.optionclass OptionEntry(gtk.Entry, OptionWidget):    def __init__(self, param = ""):        gtk.Entry.__init__(self)        self.set_text(param)class OptionLevelSpin(gtk.SpinButton, OptionWidget):    def __init__(self, initial=0):        gtk.SpinButton.__init__(self,gtk.Adjustment(int(initial),0,10,1),0.0,0)class OptionIntSpin(gtk.SpinButton, OptionWidget):    def __init__(self, initial=1):        gtk.SpinButton.__init__(self,gtk.Adjustment(int(initial),0,10**100,1),0.0,0)class OptionFloatSpin(gtk.SpinButton, OptionWidget):    def __init__(self, initial=1):        gtk.SpinButton.__init__(self,gtk.Adjustment(float(initial),0,10**100,1),0.1,2)class OptionFile(HIGHBox, OptionWidget, object):    def __init__(self, param=""):        HIGHBox.__init__(self)                self.entry = OptionEntry()        self.button = HIGButton(stock=gtk.STOCK_OPEN)                self._pack_expand_fill(self.entry)        self._pack_noexpand_nofill(self.button)        self.entry.set_text(param)        self.button.connect('clicked', self.open_dialog_cb)        def open_dialog_cb(self, widget):        dialog = AllFilesFileChooserDialog(_("Choose file"))        if dialog.run() == gtk.RESPONSE_OK:            self.entry.set_text(dialog.get_filename())        dialog.destroy()    def get_filename(self):        return "\ ".join(self.entry.get_text().split(" "))    def set_filename(self, filename):        self.entry.set_text(" ".join(filename.split("\ ")))    filename = property(get_filename, set_filename)if __name__ == '__main__':    o = OptionBuilder('profile_editor.xml')        ol = OptionFile()    w = gtk.Window()    w.add(ol)    w.show_all()    w.connect('delete-event', lambda x,y,z=None: gtk.main_quit())    gtk.main()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?