33# 2018-08-29 15:34:10
44
55import time
6- from os import environ , name as OS_NAME
6+ from os import environ
77from pathlib import Path
8+ from shlex import quote
89from urllib .parse import urlparse
910
1011from widgets import (g , GLib , Vte )
1112from handler_api import Api
1213# from basis_and_tool.logging_needle import get_console_logger
1314# logger = get_console_logger()
1415
15- IS_POSIX = True if OS_NAME == 'posix' else False
16- QUOTE = "'%s'" if OS_NAME == 'posix' else '"%s"' # for win, legacy
17-
1816
1917class Handler (object ):
2018 def __init__ (self , window , m ):
@@ -29,32 +27,26 @@ def __init__(self, window, m):
2927 self .api = Api (window , m )
3028
3129 def build_all (self , button ):
32- _opts_list = self ._collect_opts ()
33-
34- _opts_list = '' .join (_opts_list )
35- # print(_opts_list)
36- if _opts_list is not None :
37- self .m ._cmd_entry .set_text (_opts_list .strip ())
38- # self.m._cmd_entry.grab_focus()
30+ _ = self ._collect_opts ()
31+ _ = ' ' .join (_ ).strip ()
32+ # print(_)
33+ self .m ._cmd_entry .set_text (_ )
34+ # self.m._cmd_entry.grab_focus()
3935
4036 def run_cmdline (self , button ):
41- '''
42- won't work at win.
43- '''
4437 sqlmap_path = self .get_sqlmap_path ()
4538 _target = self ._get_target ()
4639 _sqlmap_opts = self .m ._cmd_entry .get_text ().strip ()
4740
48- if IS_POSIX :
49- self .w .main_notebook .next_page ()
50- _cmdline_str = '%s %s %s\n ' % (sqlmap_path , _target , _sqlmap_opts )
51- # print(_cmdline_str, len(_cmdline_str.encode('utf8')))
52- if Vte .MAJOR_VERSION >= 0 and Vte .MINOR_VERSION > 52 :
53- self .m ._page2_terminal .feed_child_binary (_cmdline_str .encode ('utf8' ))
54- else :
55- # old version Vte's api
56- self .m ._page2_terminal .feed_child (_cmdline_str , len (_cmdline_str .encode ('utf8' )))
57- self .m ._page2_terminal .grab_focus ()
41+ self .w .main_notebook .next_page ()
42+ _cmdline_str = '%s %s %s\n ' % (sqlmap_path , _target , _sqlmap_opts )
43+ # print(_cmdline_str, len(_cmdline_str.encode('utf8')))
44+ if Vte .MAJOR_VERSION >= 0 and Vte .MINOR_VERSION > 52 :
45+ self .m ._page2_terminal .feed_child_binary (_cmdline_str .encode ('utf8' ))
46+ else :
47+ # old version Vte's api
48+ self .m ._page2_terminal .feed_child (_cmdline_str , len (_cmdline_str .encode ('utf8' )))
49+ self .m ._page2_terminal .grab_focus ()
5850
5951 def respawn_terminal (self , button ):
6052 '''
@@ -187,19 +179,17 @@ def read_dumped_file(self, button):
187179 def _get_target (self ):
188180 m = self .m
189181 _current_pagenum = self .w ._target_notebook .get_current_page ()
190- _target_list = [("-u " , m ._url_combobox .get_child ().get_text ),
191- ("-l " , m ._burp_logfile .get_text ),
192- ("-r " , m ._request_file .get_text ),
193- ("-m " , m ._bulkfile .get_text ),
194- ("-c " , m ._configfile .get_text ),
195- ("-g " , m ._google_dork .get_text ),
196- ("-d " , m ._direct_connect .get_text )]
197-
198- _target_tmp = _target_list [_current_pagenum ][1 ]().strip ()
199- if _target_tmp :
200- return _target_list [_current_pagenum ][0 ] + QUOTE % _target_tmp
201- else :
202- return ''
182+ _target_list = [("-u" , m ._url_combobox .get_child ().get_text ),
183+ ("-l" , m ._burp_logfile .get_text ),
184+ ("-r" , m ._request_file .get_text ),
185+ ("-m" , m ._bulkfile .get_text ),
186+ ("-c" , m ._configfile .get_text ),
187+ ("-g" , m ._google_dork .get_text ),
188+ ("-d" , m ._direct_connect .get_text )]
189+
190+ _ = _target_list [_current_pagenum ][1 ]().strip ()
191+ if _ :
192+ return "{} {}" .format (_target_list [_current_pagenum ][0 ], quote (_ ))
203193
204194 def _collect_opts (self ):
205195 m = self .m
@@ -295,7 +285,7 @@ def _collect_opts(self):
295285 m ._page1_general_eta_ckbtn ),
296286 self ._get_text_from_entry ("--gpage=" ,
297287 m ._page1_misc_gpage_ckbtn ,
298- m ._page1_misc_gpage_spinbtn , None ),
288+ m ._page1_misc_gpage_spinbtn ),
299289 self ._get_text_only_ckbtn ("--beep" ,
300290 m ._page1_misc_beep_ckbtn ),
301291 self ._get_text_only_ckbtn ("--offline" ,
@@ -418,10 +408,10 @@ def _collect_opts(self):
418408 m ._dump_area_dump_all_ckbtn ),
419409 self ._get_text_from_entry ("--start=" ,
420410 m ._limit_area_start_ckbtn ,
421- m ._limit_area_start_entry , None ),
411+ m ._limit_area_start_entry ),
422412 self ._get_text_from_entry ("--stop=" ,
423413 m ._limit_area_stop_ckbtn ,
424- m ._limit_area_stop_entry , None ),
414+ m ._limit_area_stop_entry ),
425415 self ._get_text_from_entry ("--first=" ,
426416 m ._blind_area_first_ckbtn ,
427417 m ._blind_area_first_entry ),
@@ -487,7 +477,7 @@ def _collect_opts(self):
487477 m ._request_area_headers_entry ),
488478 self ._get_text_from_entry ("--method=" ,
489479 m ._request_area_method_ckbtn ,
490- m ._request_area_method_entry , None ),
480+ m ._request_area_method_entry ),
491481 self ._get_text_from_entry ("--param-del=" ,
492482 m ._request_area_param_del_ckbtn ,
493483 m ._request_area_param_del_entry ),
@@ -537,7 +527,7 @@ def _collect_opts(self):
537527 m ._request_area_ignore_redirects_ckbtn ),
538528 self ._get_text_from_entry ("--ignore-code=" ,
539529 m ._request_area_ignore_code_ckbtn ,
540- m ._request_area_ignore_code_entry , None ),
530+ m ._request_area_ignore_code_entry ),
541531 self ._get_text_only_ckbtn ("--skip-urlencode" ,
542532 m ._request_area_skip_urlencode_ckbtn ),
543533 self ._get_text_only_ckbtn ("--force-ssl" ,
@@ -546,13 +536,13 @@ def _collect_opts(self):
546536 m ._request_area_hpp_ckbtn ),
547537 self ._get_text_from_entry ("--delay=" ,
548538 m ._request_area_delay_ckbtn ,
549- m ._request_area_delay_entry , None ),
539+ m ._request_area_delay_entry ),
550540 self ._get_text_from_entry ("--timeout=" ,
551541 m ._request_area_timeout_ckbtn ,
552- m ._request_area_timeout_entry , None ),
542+ m ._request_area_timeout_entry ),
553543 self ._get_text_from_entry ("--retries=" ,
554544 m ._request_area_retries_ckbtn ,
555- m ._request_area_retries_entry , None ),
545+ m ._request_area_retries_entry ),
556546 self ._get_text_from_entry ("--randomize=" ,
557547 m ._request_area_randomize_ckbtn ,
558548 m ._request_area_randomize_entry ),
@@ -573,8 +563,8 @@ def _collect_opts(self):
573563 m ._request_area_safe_freq_entry ),
574564 self ._get_text_only_ckbtn ("--ignore-proxy" ,
575565 m ._request_area_ignore_proxy_ckbtn ),
576- self ._get_http_proxy (),
577- self ._get_http_proxy_cred (),
566+ self ._get_http_proxy ('--proxy=' ),
567+ self ._get_http_proxy_cred ('--proxy-cred=' ),
578568 self ._get_text_from_entry ("--proxy-freq=" ,
579569 m ._request_area_proxy_freq_ckbtn ,
580570 m ._request_area_proxy_freq_entry ),
@@ -650,7 +640,7 @@ def _collect_opts(self):
650640 m ._detection_area_re_entry ),
651641 self ._get_text_from_entry ("--code=" ,
652642 m ._detection_area_code_ckbtn ,
653- m ._detection_area_code_entry , None ),
643+ m ._detection_area_code_entry ),
654644 self ._get_text_only_ckbtn ("--text-only" ,
655645 m ._detection_area_text_only_ckbtn ),
656646 self ._get_text_only_ckbtn ("--titles" ,
@@ -659,13 +649,13 @@ def _collect_opts(self):
659649 m ._detection_area_smart_ckbtn ),
660650 self ._get_text_from_entry ("--technique=" ,
661651 m ._tech_area_tech_ckbtn ,
662- m ._tech_area_tech_entry , None ),
652+ m ._tech_area_tech_entry ),
663653 self ._get_text_from_entry ("--time-sec=" ,
664654 m ._tech_area_time_sec_ckbtn ,
665- m ._tech_area_time_sec_entry , None ),
655+ m ._tech_area_time_sec_entry ),
666656 self ._get_text_from_entry ("--union-cols=" ,
667657 m ._tech_area_union_col_ckbtn ,
668- m ._tech_area_union_col_entry , None ),
658+ m ._tech_area_union_col_entry ),
669659 self ._get_text_from_entry ("--union-char=" ,
670660 m ._tech_area_union_char_ckbtn ,
671661 m ._tech_area_union_char_entry ),
@@ -685,7 +675,7 @@ def _collect_opts(self):
685675 m ._optimize_area_turn_all_ckbtn ),
686676 self ._get_text_from_entry ("--threads=" ,
687677 m ._optimize_area_thread_num_ckbtn ,
688- m ._optimize_area_thread_num_spinbtn , None ),
678+ m ._optimize_area_thread_num_spinbtn ),
689679 self ._get_text_only_ckbtn ("--predict-output" ,
690680 m ._optimize_area_predict_ckbtn ),
691681 self ._get_text_only_ckbtn ("--keep-alive" ,
@@ -703,7 +693,8 @@ def _collect_opts(self):
703693 m ._general_area_batch_ckbtn ),
704694 self ._get_text_only_ckbtn ("--wizard" ,
705695 m ._page1_misc_wizard_ckbtn ),
706- self ._get_tampers (),
696+ self ._get_tampers ('--tamper=' ,
697+ m ._tamper_area_tamper_view ),
707698 self ._get_text_only_ckbtn ("--crack" ,
708699 m ._hidden_area_crack_ckbtn ),
709700 self ._get_text_only_ckbtn ("--debug" ,
@@ -741,89 +732,55 @@ def _collect_opts(self):
741732 self ._get_text_only_ckbtn ("--database" ,
742733 m ._hidden_area_database_ckbtn ),
743734 ]
744-
745- return (_setting_opts
746- + _request_opts
747- + _enumeration_opts
748- + _file_opts
749- + _other_opts )
750-
751- def _get_http_proxy_cred (self ):
735+ # https://stackoverflow.com/questions/3845423/remove-empty-strings-from-a-list-of-strings
736+ return filter ( None , (_setting_opts
737+ + _request_opts
738+ + _enumeration_opts
739+ + _file_opts
740+ + _other_opts ) )
741+
742+ def _get_http_proxy_cred (self , opt_str ):
752743 m = self .m
753744 _use_proxy = m ._request_area_proxy_ckbtn .get_active ()
754745 _username = m ._request_area_proxy_username_entry .get_text ()
755746 _pass = m ._request_area_proxy_password_entry .get_text ()
756747
757748 if all ((_use_proxy , _username , _pass )) :
758- return '' .join ((" --proxy-cred=" , QUOTE % '{}:{}' .format (_username , _pass )))
759- return ''
749+ return '{}{}:{}' .format (opt_str , _username , _pass )
760750
761- def _get_http_proxy (self ):
751+ def _get_http_proxy (self , opt_str ):
762752 m = self .m
763753 _use_proxy = m ._request_area_proxy_ckbtn .get_active ()
764754 _ip = m ._request_area_proxy_ip_entry .get_text ().strip ()
765755 _port = m ._request_area_proxy_port_entry .get_text ()
766756
767757 if _use_proxy and _ip :
768758 if _port :
769- return "" .join ((" --proxy=" , QUOTE % '{}:{}' .format (_ip , _port )))
770- else :
771- return "" .join ((" --proxy=" , QUOTE % _ip ))
772- return ''
759+ _port = ':%s' % _port
760+ return "{}{}{}" .format (opt_str , _ip , _port )
773761
774- def _get_tampers (self ):
775- _tamper_textbuffer = self .m ._tamper_area_tamper_view .get_buffer ()
776- _tampers = ''
762+ def _get_tampers (self , opt_str , textview ):
763+ _tamper_textbuffer = textview .get_buffer ()
777764
778765 _start = _tamper_textbuffer .get_start_iter ()
779766 _end = _tamper_textbuffer .get_end_iter ()
780- for _tamper_tmp in _tamper_textbuffer .get_text (_start , _end , False ).splitlines ():
781- if _tamper_tmp .strip ():
782- _tampers = _tampers + _tamper_tmp .strip () + ','
783-
784- if _tampers :
785- return " --tamper=" + QUOTE % _tampers .rstrip (',' )
786- return ''
767+ _ = _tamper_textbuffer .get_text (_start , _end , False )
768+ _ = ',' .join (_ .split ())
769+ if _ :
770+ return "{}{}" .format (opt_str , quote (_ ))
787771
788772 def _get_text_from_scale (self , opt_str , ckbtn , scale ):
789773 if ckbtn .get_active ():
790- return '' .join ((' ' , opt_str , str (int (scale .get_value ()))))
791- return ''
774+ return "{}{}" .format (opt_str , int (scale .get_value ()))
792775
793776 def _get_text_only_ckbtn (self , opt_str , ckbtn ):
794777 if ckbtn .get_active ():
795- return '' .join ((' ' , opt_str ))
796- return ''
797-
798- def _get_text_from_entry (self , opt_str , ckbtn , entry , quote = QUOTE ):
799- _entry_str = entry .get_text ().strip ()
800- if ckbtn .get_active () and _entry_str :
801-
802- if quote :
803- return '' .join ((' ' ,
804- opt_str ,
805- quote % self ._escape_quote_in_QUOTE (_entry_str )))
806- else :
807- return '' .join ((' ' ,
808- opt_str ,
809- self ._escape_quote (_entry_str )))
810- return ''
811-
812- def _escape_quote_in_QUOTE (self , widget_text ):
813- '''
814- 注意bash中, 双单引号内无法使用'(即无法转义)
815- '''
816- if widget_text :
817- if IS_POSIX :
818- return widget_text .replace ("'" , r"'\''" )
819- else :
820- return widget_text .replace ('"' , r"\"" )
821- return widget_text
822-
823- def _escape_quote (self , widget_text ):
824- if widget_text :
825- return widget_text .replace ("'" , r"\'" ).replace ('"' , r'\"' )
826- return widget_text
778+ return opt_str
779+
780+ def _get_text_from_entry (self , opt_str , ckbtn , entry ):
781+ _ = entry .get_text ().strip ()
782+ if ckbtn .get_active () and _ :
783+ return '{}{}' .format (opt_str , quote (_ ))
827784
828785
829786def main ():
0 commit comments