def run(): options = {} for key in window._widgets: dest, type = key widget = window._widgets[key] if hasattr(widget, "get") and not widget.get(): value = None elif type == "string": value = widget.get() elif type == "float": value = float(widget.get()) elif type == "int": value = int(widget.get()) else: value = bool(widget.getint()) options[dest] = value for option in parser.option_list: options[option.dest] = defaults.get(option.dest, None) parser._args = options window.destroy()
def run(): global process global queue ON_POSIX = "posix" in sys.builtin_module_names def enqueue(stream, queue): for line in iter(stream.readline, b''): queue.put(line) stream.close() process = subprocess.Popen("/bin/bash", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, bufsize=1, close_fds=ON_POSIX) # Reference: https://stackoverflow.com/a/4896288 queue = _queue.Queue() thread = threading.Thread(target=enqueue, args=(process.stdout, queue)) thread.daemon = True thread.start() options = {} for key in window._widgets: dest, type = key widget = window._widgets[key] if hasattr(widget, "get") and not widget.get(): value = None elif type == "string": value = widget.get() elif type == "float": value = float(widget.get()) elif type == "int": value = int(widget.get()) else: value = bool(widget.var.get()) options[dest] = value for option in parser.option_list: options[option.dest] = defaults.get(option.dest, None) parser._args = options top = tkinter.Toplevel() top.title("Console") # Reference: https://stackoverflow.com/a/13833338 text = tkinter.scrolledtext.ScrolledText(top, undo=True) text.bind("<Key>", onKeyPress) text.bind("<Return>", onReturnPress) text.pack() text.focus() center(top)
def runGui(parser): try: from thirdparty.six.moves import tkinter as _tkinter from thirdparty.six.moves import tkinter_scrolledtext as _tkinter_scrolledtext from thirdparty.six.moves import tkinter_ttk as _tkinter_ttk from thirdparty.six.moves import tkinter_messagebox as _tkinter_messagebox except ImportError as ex: raise SqlmapMissingDependence("missing dependence ('%s')" % getSafeExString(ex)) # Reference: https://www.reddit.com/r/learnpython/comments/985umy/limit_user_input_to_only_int_with_tkinter/e4dj9k9?utm_source=share&utm_medium=web2x class ConstrainedEntry(_tkinter.Entry): def __init__(self, master=None, **kwargs): self.var = _tkinter.StringVar() self.regex = kwargs["regex"] del kwargs["regex"] _tkinter.Entry.__init__(self, master, textvariable=self.var, **kwargs) self.old_value = '' self.var.trace('w', self.check) self.get, self.set = self.var.get, self.var.set def check(self, *args): if re.search(self.regex, self.get()): self.old_value = self.get() else: self.set(self.old_value) # Reference: https://code.activestate.com/recipes/580726-tkinter-notebook-that-fits-to-the-height-of-every-/ class AutoresizableNotebook(_tkinter_ttk.Notebook): def __init__(self, master=None, **kw): _tkinter_ttk.Notebook.__init__(self, master, **kw) self.bind("<<NotebookTabChanged>>", self._on_tab_changed) def _on_tab_changed(self, event): event.widget.update_idletasks() tab = event.widget.nametowidget(event.widget.select()) event.widget.configure(height=tab.winfo_reqheight()) window = _tkinter.Tk() window.title(VERSION_STRING) # Reference: https://www.holadevs.com/pregunta/64750/change-selected-tab-color-in-ttknotebook style = _tkinter_ttk.Style() settings = { "TNotebook.Tab": { "configure": { "padding": [5, 1], "background": "#fdd57e" }, "map": { "background": [("selected", "#C70039"), ("active", "#fc9292")], "foreground": [("selected", "#ffffff"), ("active", "#000000")] } } } style.theme_create("custom", parent="alt", settings=settings) style.theme_use("custom") # Reference: https://stackoverflow.com/a/10018670 def center(window): window.update_idletasks() width = window.winfo_width() frm_width = window.winfo_rootx() - window.winfo_x() win_width = width + 2 * frm_width height = window.winfo_height() titlebar_height = window.winfo_rooty() - window.winfo_y() win_height = height + titlebar_height + frm_width x = window.winfo_screenwidth() // 2 - win_width // 2 y = window.winfo_screenheight() // 2 - win_height // 2 window.geometry('{}x{}+{}+{}'.format(width, height, x, y)) window.deiconify() def onKeyPress(event): global line global queue if process: if event.char == '\b': line = line[:-1] else: line += event.char def onReturnPress(event): global line global queue if process: try: process.stdin.write(("%s\n" % line.strip()).encode()) process.stdin.flush() except socket.error: line = "" event.widget.master.master.destroy() return "break" except: return event.widget.insert(_tkinter.END, "\n") return "break" def run(): global alive global process global queue config = {} for key in window._widgets: dest, type = key widget = window._widgets[key] if hasattr(widget, "get") and not widget.get(): value = None elif type == "string": value = widget.get() elif type == "float": value = float(widget.get()) elif type == "int": value = int(widget.get()) else: value = bool(widget.var.get()) config[dest] = value for option in parser.option_list: config[option.dest] = defaults.get(option.dest, None) handle, configFile = tempfile.mkstemp(prefix=MKSTEMP_PREFIX.CONFIG, text=True) os.close(handle) saveConfig(config, configFile) def enqueue(stream, queue): global alive for line in iter(stream.readline, b''): queue.put(line) alive = False stream.close() alive = True process = subprocess.Popen([ sys.executable or "python", os.path.join(paths.SQLMAP_ROOT_PATH, "sqlmap.py"), "-c", configFile ], shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, bufsize=1, close_fds=not IS_WIN) # Reference: https://stackoverflow.com/a/4896288 queue = _queue.Queue() thread = threading.Thread(target=enqueue, args=(process.stdout, queue)) thread.daemon = True thread.start() top = _tkinter.Toplevel() top.title("Console") # Reference: https://stackoverflow.com/a/13833338 text = _tkinter_scrolledtext.ScrolledText(top, undo=True) text.bind("<Key>", onKeyPress) text.bind("<Return>", onReturnPress) text.pack() text.focus() center(top) while alive: line = "" try: # line = queue.get_nowait() line = queue.get(timeout=.1) text.insert(_tkinter.END, line) except _queue.Empty: text.see(_tkinter.END) text.update_idletasks() menubar = _tkinter.Menu(window) filemenu = _tkinter.Menu(menubar, tearoff=0) filemenu.add_command(label="Open", state=_tkinter.DISABLED) filemenu.add_command(label="Save", state=_tkinter.DISABLED) filemenu.add_separator() filemenu.add_command(label="Exit", command=window.quit) menubar.add_cascade(label="File", menu=filemenu) menubar.add_command(label="Run", command=run) helpmenu = _tkinter.Menu(menubar, tearoff=0) helpmenu.add_command(label="Official site", command=lambda: webbrowser.open(SITE)) helpmenu.add_command(label="Github pages", command=lambda: webbrowser.open(GIT_PAGE)) helpmenu.add_command(label="Wiki pages", command=lambda: webbrowser.open(WIKI_PAGE)) helpmenu.add_command(label="Report issue", command=lambda: webbrowser.open(ISSUES_PAGE)) helpmenu.add_separator() helpmenu.add_command(label="About", command=lambda: _tkinter_messagebox.showinfo( "About", "Copyright (c) 2006-2020\n\n (%s)" % DEV_EMAIL_ADDRESS)) menubar.add_cascade(label="Help", menu=helpmenu) window.config(menu=menubar) window._widgets = {} notebook = AutoresizableNotebook(window) first = None frames = {} for group in parser.option_groups: frame = frames[group.title] = _tkinter.Frame(notebook, width=200, height=200) notebook.add(frames[group.title], text=group.title) _tkinter.Label(frame).grid(column=0, row=0, sticky=_tkinter.W) row = 1 if group.get_description(): _tkinter.Label(frame, text="%s:" % group.get_description()).grid( column=0, row=1, columnspan=3, sticky=_tkinter.W) _tkinter.Label(frame).grid(column=0, row=2, sticky=_tkinter.W) row += 2 for option in group.option_list: _tkinter.Label( frame, text="%s " % parser.formatter._format_option_strings(option)).grid( column=0, row=row, sticky=_tkinter.W) if option.type == "string": widget = _tkinter.Entry(frame) elif option.type == "float": widget = ConstrainedEntry(frame, regex=r"\A\d*\.?\d*\Z") elif option.type == "int": widget = ConstrainedEntry(frame, regex=r"\A\d*\Z") else: var = _tkinter.IntVar() widget = _tkinter.Checkbutton(frame, variable=var) widget.var = var first = first or widget widget.grid(column=1, row=row, sticky=_tkinter.W) window._widgets[(option.dest, option.type)] = widget default = defaults.get(option.dest) if default: if hasattr(widget, "insert"): widget.insert(0, default) _tkinter.Label(frame, text=" %s" % option.help).grid(column=2, row=row, sticky=_tkinter.W) row += 1 _tkinter.Label(frame).grid(column=0, row=row, sticky=_tkinter.W) notebook.pack(expand=1, fill="both") notebook.enable_traversal() first.focus() window.mainloop()
def run(): global alive global process global queue config = {} for key in window._widgets: dest, type = key widget = window._widgets[key] if hasattr(widget, "get") and not widget.get(): value = None elif type == "string": value = widget.get() elif type == "float": value = float(widget.get()) elif type == "int": value = int(widget.get()) else: value = bool(widget.var.get()) config[dest] = value for option in parser.option_list: config[option.dest] = defaults.get(option.dest, None) handle, configFile = tempfile.mkstemp(prefix=MKSTEMP_PREFIX.CONFIG, text=True) os.close(handle) saveConfig(config, configFile) def enqueue(stream, queue): global alive for line in iter(stream.readline, b''): queue.put(line) alive = False stream.close() alive = True process = subprocess.Popen([ sys.executable or "python", os.path.join(paths.SQLMAP_ROOT_PATH, "sqlmap.py"), "-c", configFile ], shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, bufsize=1, close_fds=not IS_WIN) # Reference: https://stackoverflow.com/a/4896288 queue = _queue.Queue() thread = threading.Thread(target=enqueue, args=(process.stdout, queue)) thread.daemon = True thread.start() top = _tkinter.Toplevel() top.title("Console") # Reference: https://stackoverflow.com/a/13833338 text = _tkinter_scrolledtext.ScrolledText(top, undo=True) text.bind("<Key>", onKeyPress) text.bind("<Return>", onReturnPress) text.pack() text.focus() center(top) while alive: line = "" try: # line = queue.get_nowait() line = queue.get(timeout=.1) text.insert(_tkinter.END, line) except _queue.Empty: text.see(_tkinter.END) text.update_idletasks()
def runGui(parser): import re import tkinter as tk from tkinter import ttk from lib.core.defaults import defaults # Reference: https://www.reddit.com/r/learnpython/comments/985umy/limit_user_input_to_only_int_with_tkinter/e4dj9k9?utm_source=share&utm_medium=web2x class ConstrainedEntry(tk.Entry): def __init__(self, master=None, **kwargs): self.var = tk.StringVar() self.regex = kwargs["regex"] del kwargs["regex"] tk.Entry.__init__(self, master, textvariable=self.var, **kwargs) self.old_value = '' self.var.trace('w', self.check) self.get, self.set = self.var.get, self.var.set def check(self, *args): if re.search(self.regex, self.get()): self.old_value = self.get() else: self.set(self.old_value) # Reference: https://code.activestate.com/recipes/580726-tkinter-notebook-that-fits-to-the-height-of-every-/ class AutoresizableNotebook(ttk.Notebook): def __init__(self, master=None, **kw): ttk.Notebook.__init__(self, master, **kw) self.bind("<<NotebookTabChanged>>", self._on_tab_changed) def _on_tab_changed(self,event): event.widget.update_idletasks() tab = event.widget.nametowidget(event.widget.select()) event.widget.configure(height=tab.winfo_reqheight()) window = tk.Tk() window.title("sqlmap") # Reference: https://www.holadevs.com/pregunta/64750/change-selected-tab-color-in-ttknotebook style = ttk.Style() settings = {"TNotebook.Tab": {"configure": {"padding": [5, 1], "background": "#fdd57e" }, "map": {"background": [("selected", "#C70039"), ("active", "#fc9292")], "foreground": [("selected", "#ffffff"), ("active", "#000000")]}}} style.theme_create("custom", parent="alt", settings=settings) style.theme_use("custom") def dummy(): pass menubar = tk.Menu(window) filemenu = tk.Menu(menubar, tearoff=0) filemenu.add_command(label="Open", command=dummy) filemenu.add_command(label="Save", command=dummy) filemenu.add_separator() filemenu.add_command(label="Exit", command=window.quit) menubar.add_cascade(label="File", menu=filemenu) runmenu = tk.Menu(menubar, tearoff=0) runmenu.add_command(label="Start", command=dummy) runmenu.add_command(label="Stop", command=dummy) menubar.add_cascade(label="Run", menu=runmenu) helpmenu = tk.Menu(menubar, tearoff=0) helpmenu.add_command(label="Wiki pages", command=dummy) helpmenu.add_command(label="Official site", command=dummy) helpmenu.add_separator() helpmenu.add_command(label="About", command=dummy) menubar.add_cascade(label="Help", menu=helpmenu) window.config(menu=menubar) notebook = AutoresizableNotebook(window) frames = {} for group in parser.option_groups: frame = frames[group.title] = tk.Frame(notebook, width=200, height=200) notebook.add(frames[group.title], text=group.title) tk.Label(frame).grid(column=0, row=0, sticky=tk.W) row = 1 if group.get_description(): tk.Label(frame, text="%s:" % group.get_description()).grid(column=0, row=1, columnspan=3, sticky=tk.W) tk.Label(frame).grid(column=0, row=2, sticky=tk.W) row += 2 for option in group.option_list: tk.Label(frame, text="%s " % parser.formatter._format_option_strings(option)).grid(column=0, row=row, sticky=tk.W) if option.type == "string": widget = tk.Entry(frame) elif option.type == "float": widget = ConstrainedEntry(frame, regex=r"\A\d*\.?\d*\Z") elif option.type == "int": widget = ConstrainedEntry(frame, regex=r"\A\d*\Z") else: var = tk.IntVar() widget = tk.Checkbutton(frame, variable=var) widget.var = var widget.grid(column=1, row=row, sticky=tk.W) default = defaults.get(option.dest) if default: if hasattr(widget, "insert"): widget.insert(0, default) tk.Label(frame, text=" %s" % option.help).grid(column=2, row=row, sticky=tk.W) row += 1 tk.Label(frame).grid(column=0, row=row, sticky=tk.W) notebook.pack(expand=1, fill="both") notebook.enable_traversal() window.mainloop()
def runGui(parser): try: import tkinter import tkinter.ttk except ImportError as ex: raise SqlmapMissingDependence("missing dependence ('%s')" % getSafeExString(ex)) # Reference: https://www.reddit.com/r/learnpython/comments/985umy/limit_user_input_to_only_int_with_tkinter/e4dj9k9?utm_source=share&utm_medium=web2x class ConstrainedEntry(tkinter.Entry): def __init__(self, master=None, **kwargs): self.var = tkinter.StringVar() self.regex = kwargs["regex"] del kwargs["regex"] tkinter.Entry.__init__(self, master, textvariable=self.var, **kwargs) self.old_value = '' self.var.trace('w', self.check) self.get, self.set = self.var.get, self.var.set def check(self, *args): if re.search(self.regex, self.get()): self.old_value = self.get() else: self.set(self.old_value) # Reference: https://code.activestate.com/recipes/580726-tkinter-notebook-that-fits-to-the-height-of-every-/ class AutoresizableNotebook(tkinter.ttk.Notebook): def __init__(self, master=None, **kw): tkinter.ttk.Notebook.__init__(self, master, **kw) self.bind("<<NotebookTabChanged>>", self._on_tab_changed) def _on_tab_changed(self, event): event.widget.update_idletasks() tab = event.widget.nametowidget(event.widget.select()) event.widget.configure(height=tab.winfo_reqheight()) window = tkinter.Tk() window.title(VERSION_STRING) # Reference: https://www.holadevs.com/pregunta/64750/change-selected-tab-color-in-ttknotebook style = tkinter.ttk.Style() settings = { "TNotebook.Tab": { "configure": { "padding": [5, 1], "background": "#fdd57e" }, "map": { "background": [("selected", "#C70039"), ("active", "#fc9292")], "foreground": [("selected", "#ffffff"), ("active", "#000000")] } } } style.theme_create("custom", parent="alt", settings=settings) style.theme_use("custom") def run(): options = {} for key in window._widgets: dest, type = key widget = window._widgets[key] if hasattr(widget, "get") and not widget.get(): value = None elif type == "string": value = widget.get() elif type == "float": value = float(widget.get()) elif type == "int": value = int(widget.get()) else: value = bool(widget.getint()) options[dest] = value for option in parser.option_list: options[option.dest] = defaults.get(option.dest, None) parser._args = options window.destroy() menubar = tkinter.Menu(window) filemenu = tkinter.Menu(menubar, tearoff=0) filemenu.add_command(label="Open", state=tkinter.DISABLED) filemenu.add_command(label="Save", state=tkinter.DISABLED) filemenu.add_separator() filemenu.add_command(label="Exit", command=window.quit) menubar.add_cascade(label="File", menu=filemenu) menubar.add_command(label="Run", command=run) helpmenu = tkinter.Menu(menubar, tearoff=0) helpmenu.add_command(label="Official site", command=lambda: webbrowser.open(SITE)) helpmenu.add_command(label="Github pages", command=lambda: webbrowser.open(GIT_PAGE)) helpmenu.add_command(label="Wiki pages", command=lambda: webbrowser.open(WIKI_PAGE)) helpmenu.add_command(label="Report issue", command=lambda: webbrowser.open(ISSUES_PAGE)) helpmenu.add_separator() helpmenu.add_command(label="About", command=lambda: _tkinter_messagebox.showinfo( "About", "Copyright (c) 2006-2019\n\n (%s)" % DEV_EMAIL_ADDRESS)) menubar.add_cascade(label="Help", menu=helpmenu) window.config(menu=menubar) window._widgets = {} notebook = AutoresizableNotebook(window) first = None frames = {} for group in parser.option_groups: frame = frames[group.title] = tkinter.Frame(notebook, width=200, height=200) notebook.add(frames[group.title], text=group.title) tkinter.Label(frame).grid(column=0, row=0, sticky=tkinter.W) row = 1 if group.get_description(): tkinter.Label(frame, text="%s:" % group.get_description()).grid( column=0, row=1, columnspan=3, sticky=tkinter.W) tkinter.Label(frame).grid(column=0, row=2, sticky=tkinter.W) row += 2 for option in group.option_list: tkinter.Label( frame, text="%s " % parser.formatter._format_option_strings(option)).grid( column=0, row=row, sticky=tkinter.W) if option.type == "string": widget = tkinter.Entry(frame) elif option.type == "float": widget = ConstrainedEntry(frame, regex=r"\A\d*\.?\d*\Z") elif option.type == "int": widget = ConstrainedEntry(frame, regex=r"\A\d*\Z") else: var = tkinter.IntVar() widget = tkinter.Checkbutton(frame, variable=var) widget.var = var first = first or widget widget.grid(column=1, row=row, sticky=tkinter.W) window._widgets[(option.dest, option.type)] = widget default = defaults.get(option.dest) if default: if hasattr(widget, "insert"): widget.insert(0, default) tkinter.Label(frame, text=" %s" % option.help).grid(column=2, row=row, sticky=tkinter.W) row += 1 tkinter.Label(frame).grid(column=0, row=row, sticky=tkinter.W) notebook.pack(expand=1, fill="both") notebook.enable_traversal() first.focus() window.mainloop()