watobo 0.9.19 → 0.9.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (266) hide show
  1. data/CHANGELOG.md +104 -0
  2. data/bin/nfq_server.rb +8 -20
  3. data/bin/watobo_gui.rb +8 -20
  4. data/config/forwarding_proxy.yml +2 -2
  5. data/lib/watobo.rb +12 -22
  6. data/lib/watobo/adapters.rb +12 -24
  7. data/lib/watobo/adapters/data_store.rb +76 -66
  8. data/lib/watobo/adapters/file/file_store.rb +295 -307
  9. data/lib/watobo/adapters/session_store.rb +13 -25
  10. data/lib/watobo/ca.rb +9 -21
  11. data/lib/watobo/config.rb +205 -217
  12. data/lib/watobo/constants.rb +8 -20
  13. data/lib/watobo/core.rb +11 -23
  14. data/lib/watobo/core/active_check.rb +11 -21
  15. data/lib/watobo/core/active_checks.rb +57 -69
  16. data/lib/watobo/core/ca.rb +388 -398
  17. data/lib/watobo/core/cert_store.rb +42 -54
  18. data/lib/watobo/core/chat.rb +100 -112
  19. data/lib/watobo/core/chats.rb +271 -275
  20. data/lib/watobo/core/client_cert_store.rb +33 -45
  21. data/lib/watobo/core/conversation.rb +56 -68
  22. data/lib/watobo/core/cookie.rb +31 -43
  23. data/lib/watobo/core/finding.rb +74 -86
  24. data/lib/watobo/core/findings.rb +113 -125
  25. data/lib/watobo/core/forwarding_proxy.rb +44 -35
  26. data/lib/watobo/core/fuzz_gen.rb +8 -20
  27. data/lib/watobo/core/intercept_carver.rb +176 -188
  28. data/lib/watobo/core/intercept_filter.rb +243 -255
  29. data/lib/watobo/core/interceptor.rb +106 -118
  30. data/lib/watobo/core/min_class.rb +12 -24
  31. data/lib/watobo/core/netfilter_queue.rb +178 -190
  32. data/lib/watobo/core/ott_cache.rb +152 -148
  33. data/lib/watobo/core/parameter.rb +53 -58
  34. data/lib/watobo/core/passive_check.rb +8 -20
  35. data/lib/watobo/core/passive_checks.rb +56 -68
  36. data/lib/watobo/core/passive_scanner.rb +54 -66
  37. data/lib/watobo/core/plugin.rb +19 -31
  38. data/lib/watobo/core/project.rb +8 -20
  39. data/lib/watobo/core/proxy.rb +51 -63
  40. data/lib/watobo/core/request.rb +128 -120
  41. data/lib/watobo/core/response.rb +59 -61
  42. data/lib/watobo/core/scanner.rb +8 -20
  43. data/lib/watobo/core/scanner3.rb +413 -425
  44. data/lib/watobo/core/scope.rb +91 -103
  45. data/lib/watobo/core/session.rb +109 -87
  46. data/lib/watobo/core/sid_cache.rb +106 -118
  47. data/lib/watobo/core/subscriber.rb +33 -45
  48. data/lib/watobo/defaults.rb +29 -41
  49. data/lib/watobo/external/diff/lcs.rb +8 -20
  50. data/lib/watobo/external/diff/lcs/array.rb +8 -20
  51. data/lib/watobo/external/diff/lcs/block.rb +8 -20
  52. data/lib/watobo/external/diff/lcs/callbacks.rb +8 -20
  53. data/lib/watobo/external/diff/lcs/change.rb +8 -20
  54. data/lib/watobo/external/diff/lcs/hunk.rb +8 -20
  55. data/lib/watobo/external/diff/lcs/ldiff.rb +8 -20
  56. data/lib/watobo/external/diff/lcs/string.rb +8 -20
  57. data/lib/watobo/externals.rb +14 -26
  58. data/lib/watobo/framework.rb +12 -24
  59. data/lib/watobo/framework/create_project.rb +68 -80
  60. data/lib/watobo/framework/init.rb +8 -20
  61. data/lib/watobo/framework/init_modules.rb +8 -20
  62. data/lib/watobo/framework/license_text.rb +36 -48
  63. data/lib/watobo/framework/load_chat.rb +21 -33
  64. data/lib/watobo/gui.rb +121 -133
  65. data/lib/watobo/gui/about_watobo.rb +8 -20
  66. data/lib/watobo/gui/browser_preview.rb +8 -20
  67. data/lib/watobo/gui/certificate_dialog.rb +8 -20
  68. data/lib/watobo/gui/chat_diff.rb +11 -21
  69. data/lib/watobo/gui/chatviewer_frame.rb +10 -22
  70. data/lib/watobo/gui/checkboxtree.rb +8 -20
  71. data/lib/watobo/gui/checks_policy_frame.rb +8 -20
  72. data/lib/watobo/gui/client_cert_dialog.rb +10 -21
  73. data/lib/watobo/gui/confirm_scan_dialog.rb +8 -20
  74. data/lib/watobo/gui/conversation_table.rb +54 -44
  75. data/lib/watobo/gui/conversation_table_ctrl.rb +215 -227
  76. data/lib/watobo/gui/conversation_table_ctrl2.rb +385 -393
  77. data/lib/watobo/gui/csrf_token_dialog.rb +11 -25
  78. data/lib/watobo/gui/custom_viewer.rb +357 -369
  79. data/lib/watobo/gui/dashboard.rb +8 -20
  80. data/lib/watobo/gui/define_scope_frame.rb +8 -20
  81. data/lib/watobo/gui/differ_frame.rb +223 -235
  82. data/lib/watobo/gui/edit_comment.rb +8 -20
  83. data/lib/watobo/gui/edit_scope_dialog.rb +8 -20
  84. data/lib/watobo/gui/export_dialog.rb +114 -0
  85. data/lib/watobo/gui/finding_info.rb +9 -21
  86. data/lib/watobo/gui/findings_tree.rb +8 -20
  87. data/lib/watobo/gui/full_scan_dialog.rb +8 -20
  88. data/lib/watobo/gui/fuzzer_gui.rb +8 -20
  89. data/lib/watobo/gui/goto_url_dialog.rb +78 -90
  90. data/lib/watobo/gui/hex_viewer.rb +25 -27
  91. data/lib/watobo/gui/html_viewer.rb +295 -307
  92. data/lib/watobo/gui/intercept_filter_dialog.rb +196 -208
  93. data/lib/watobo/gui/interceptor_gui.rb +1046 -1041
  94. data/lib/watobo/gui/interceptor_settings_dialog.rb +8 -20
  95. data/lib/watobo/gui/list_box.rb +109 -121
  96. data/lib/watobo/gui/log_file_viewer.rb +40 -52
  97. data/lib/watobo/gui/log_viewer.rb +87 -99
  98. data/lib/watobo/gui/login_wizzard.rb +8 -20
  99. data/lib/watobo/gui/main_window.rb +34 -33
  100. data/lib/watobo/gui/manual_request_editor.rb +25 -35
  101. data/lib/watobo/gui/master_pw_dialog.rb +8 -20
  102. data/lib/watobo/gui/mixins/gui_settings.rb +37 -49
  103. data/lib/watobo/gui/page_tree.rb +225 -237
  104. data/lib/watobo/gui/password_policy_dialog.rb +8 -20
  105. data/lib/watobo/gui/plugin_board.rb +8 -20
  106. data/lib/watobo/gui/preferences_dialog.rb +8 -20
  107. data/lib/watobo/gui/progress_window.rb +8 -20
  108. data/lib/watobo/gui/project_wizzard.rb +8 -20
  109. data/lib/watobo/gui/proxy_dialog.rb +117 -85
  110. data/lib/watobo/gui/quick_scan_dialog.rb +8 -20
  111. data/lib/watobo/gui/request_builder_frame.rb +125 -122
  112. data/lib/watobo/gui/request_editor.rb +53 -28
  113. data/lib/watobo/gui/rewrite_filters_dialog.rb +402 -414
  114. data/lib/watobo/gui/rewrite_rules_dialog.rb +380 -392
  115. data/lib/watobo/gui/save_chat_dialog.rb +148 -160
  116. data/lib/watobo/gui/scanner_settings_dialog.rb +8 -20
  117. data/lib/watobo/gui/select_chat_dialog.rb +8 -20
  118. data/lib/watobo/gui/session_management_dialog.rb +8 -20
  119. data/lib/watobo/gui/sites_tree.rb +118 -22
  120. data/lib/watobo/gui/status_bar.rb +8 -20
  121. data/lib/watobo/gui/table_editor.rb +76 -53
  122. data/lib/watobo/gui/tagless_viewer.rb +10 -21
  123. data/lib/watobo/gui/templates/plugin.rb +8 -20
  124. data/lib/watobo/gui/templates/plugin2.rb +99 -111
  125. data/lib/watobo/gui/templates/plugin_base.rb +152 -164
  126. data/lib/watobo/gui/text_viewer.rb +8 -20
  127. data/lib/watobo/gui/transcoder_window.rb +15 -22
  128. data/lib/watobo/gui/utils/gui_utils.rb +8 -20
  129. data/lib/watobo/gui/utils/init_icons.rb +94 -106
  130. data/lib/watobo/gui/utils/load_icons.rb +41 -53
  131. data/lib/watobo/gui/utils/load_plugins.rb +118 -130
  132. data/lib/watobo/gui/utils/master_password.rb +76 -88
  133. data/lib/watobo/gui/utils/save_default_settings.rb +121 -133
  134. data/lib/watobo/gui/utils/save_project_settings.rb +8 -20
  135. data/lib/watobo/gui/utils/save_proxy_settings.rb +53 -21
  136. data/lib/watobo/gui/utils/save_scanner_settings.rb +26 -38
  137. data/lib/watobo/gui/utils/session_history.rb +120 -132
  138. data/lib/watobo/gui/workspace_dialog.rb +8 -20
  139. data/lib/watobo/gui/www_auth_dialog.rb +8 -20
  140. data/lib/watobo/gui/xml_viewer_frame.rb +8 -20
  141. data/lib/watobo/http.rb +12 -23
  142. data/lib/watobo/http/cookies/cookies.rb +63 -70
  143. data/lib/watobo/http/data/data.rb +56 -64
  144. data/lib/watobo/http/data/json.rb +51 -0
  145. data/lib/watobo/http/url/url.rb +46 -58
  146. data/lib/watobo/http/xml/xml.rb +129 -141
  147. data/lib/watobo/interceptor.rb +11 -23
  148. data/lib/watobo/interceptor/proxy.rb +624 -625
  149. data/lib/watobo/interceptor/transparent.rb +22 -34
  150. data/lib/watobo/mixins.rb +18 -30
  151. data/lib/watobo/mixins/check_info.rb +35 -47
  152. data/lib/watobo/mixins/httpparser.rb +42 -35
  153. data/lib/watobo/mixins/request_parser.rb +8 -20
  154. data/lib/watobo/mixins/shapers.rb +484 -477
  155. data/lib/watobo/mixins/transcoders.rb +8 -20
  156. data/lib/watobo/parser.rb +9 -21
  157. data/lib/watobo/parser/html.rb +91 -103
  158. data/lib/watobo/sockets.rb +11 -23
  159. data/lib/watobo/sockets/agent.rb +836 -848
  160. data/lib/watobo/sockets/client_socket.rb +283 -277
  161. data/lib/watobo/sockets/connection.rb +409 -421
  162. data/lib/watobo/sockets/http_socket.rb +16 -23
  163. data/lib/watobo/sockets/ntlm_auth.rb +137 -149
  164. data/lib/watobo/utils.rb +18 -30
  165. data/lib/watobo/utils/check_regex.rb +8 -20
  166. data/lib/watobo/utils/copy_object.rb +8 -20
  167. data/lib/watobo/utils/crypto.rb +8 -20
  168. data/lib/watobo/utils/expand_range.rb +31 -43
  169. data/lib/watobo/utils/export_xml.rb +108 -0
  170. data/lib/watobo/utils/file_management.rb +8 -20
  171. data/lib/watobo/utils/hexprint.rb +17 -29
  172. data/lib/watobo/utils/load_chat.rb +8 -20
  173. data/lib/watobo/utils/load_icon.rb +8 -20
  174. data/lib/watobo/{external/ntlm → utils}/ntlm.rb +874 -796
  175. data/lib/watobo/utils/print_debug.rb +20 -32
  176. data/lib/watobo/utils/response_builder.rb +98 -110
  177. data/lib/watobo/utils/response_hash.rb +9 -20
  178. data/lib/watobo/utils/secure_eval.rb +10 -22
  179. data/lib/watobo/utils/strings.rb +18 -30
  180. data/lib/watobo/utils/text2request.rb +12 -20
  181. data/lib/watobo/utils/url.rb +31 -43
  182. data/lib/watobo/utils/utf16.rb +22 -0
  183. data/modules/active/Apache/mod_status.rb +9 -0
  184. data/modules/active/Apache/multiview.rb +161 -0
  185. data/modules/active/Flash/crossdomain.rb +9 -0
  186. data/modules/active/directories/dirwalker.rb +8 -20
  187. data/modules/active/discovery/fileextensions.rb +10 -22
  188. data/modules/active/discovery/http_methods.rb +8 -20
  189. data/modules/active/domino/domino_db.rb +8 -20
  190. data/modules/active/dotNET/custom_errors.rb +110 -122
  191. data/modules/active/dotNET/dotnet_files.rb +98 -110
  192. data/modules/active/fileinclusion/lfi_simple.rb +8 -20
  193. data/modules/active/jboss/jboss_basic.rb +8 -20
  194. data/modules/active/sap/business_objects.rb +63 -0
  195. data/modules/active/sap/its_commands.rb +8 -20
  196. data/modules/active/sap/its_service_parameter.rb +8 -20
  197. data/modules/active/sap/its_services.rb +8 -20
  198. data/modules/active/sap/its_xss.rb +8 -20
  199. data/modules/active/shell_shock/shell_shock.rb +149 -0
  200. data/modules/active/siebel/siebel_apps.rb +168 -180
  201. data/modules/active/sqlinjection/sql_boolean.rb +9 -21
  202. data/modules/active/sqlinjection/sqli_error.rb +10 -22
  203. data/modules/active/sqlinjection/sqli_timing.rb +228 -240
  204. data/modules/active/struts2/default_handler_ognl.rb +114 -126
  205. data/modules/active/struts2/include_params_ognl.rb +113 -125
  206. data/modules/active/xml/xml_xxe.rb +122 -127
  207. data/modules/active/xss/xss_ng.rb +223 -234
  208. data/modules/active/xss/xss_simple.rb +8 -20
  209. data/modules/passive/ajax.rb +76 -84
  210. data/modules/passive/autocomplete.rb +64 -76
  211. data/modules/passive/cookie_options.rb +8 -20
  212. data/modules/passive/cookie_xss.rb +9 -21
  213. data/modules/passive/detect_code.rb +9 -21
  214. data/modules/passive/detect_fileupload.rb +11 -22
  215. data/modules/passive/detect_infrastructure.rb +23 -35
  216. data/modules/passive/detect_one_time_tokens.rb +8 -20
  217. data/modules/passive/dirindexing.rb +9 -21
  218. data/modules/passive/disclosure_domino.rb +66 -79
  219. data/modules/passive/disclosure_emails.rb +9 -21
  220. data/modules/passive/disclosure_ipaddr.rb +15 -23
  221. data/modules/passive/filename_as_parameter.rb +8 -20
  222. data/modules/passive/form_spotter.rb +15 -21
  223. data/modules/passive/hidden_fields.rb +64 -70
  224. data/modules/passive/hotspots.rb +13 -22
  225. data/modules/passive/in_script_parameter.rb +15 -24
  226. data/modules/passive/multiple_server_headers.rb +8 -20
  227. data/modules/passive/possible_login.rb +12 -23
  228. data/modules/passive/redirect_url.rb +10 -22
  229. data/modules/passive/redirectionz.rb +9 -21
  230. data/modules/passive/sap-headers.rb +64 -76
  231. data/modules/passive/xss_dom.rb +10 -21
  232. data/plugins/catalog/catalog.rb +17 -23
  233. data/plugins/crawler/crawler.rb +12 -24
  234. data/plugins/crawler/gui.rb +13 -25
  235. data/plugins/crawler/gui/auth_frame.rb +278 -290
  236. data/plugins/crawler/gui/crawler_gui.rb +302 -320
  237. data/plugins/crawler/gui/general_settings_frame.rb +104 -116
  238. data/plugins/crawler/gui/hooks_frame.rb +88 -100
  239. data/plugins/crawler/gui/scope_frame.rb +58 -70
  240. data/plugins/crawler/gui/settings_tabbook.rb +46 -58
  241. data/plugins/crawler/gui/status_frame.rb +67 -78
  242. data/plugins/crawler/lib/bags.rb +26 -38
  243. data/plugins/crawler/lib/constants.rb +19 -31
  244. data/plugins/crawler/lib/engine.rb +505 -508
  245. data/plugins/crawler/lib/grabber.rb +77 -87
  246. data/plugins/crawler/lib/status.rb +82 -0
  247. data/plugins/crawler/lib/uri_mp.rb +20 -32
  248. data/plugins/filefinder/dbs/siebel_paths.txt +1118 -0
  249. data/plugins/filefinder/dbs/subs-big.lst +31986 -0
  250. data/plugins/filefinder/filefinder.rb +13 -23
  251. data/plugins/sqlmap/bin/test.rb +86 -98
  252. data/plugins/sqlmap/gui.rb +12 -24
  253. data/plugins/sqlmap/gui/main.rb +226 -238
  254. data/plugins/sqlmap/gui/options_frame.rb +105 -117
  255. data/plugins/sqlmap/lib/sqlmap_ctrl.rb +103 -115
  256. data/plugins/sqlmap/sqlmap.rb +10 -22
  257. data/plugins/sslchecker/cli/sslchecker_cli.rb +8 -20
  258. data/plugins/sslchecker/gui/cipher_table.rb +252 -264
  259. data/plugins/sslchecker/gui/gui.rb +267 -276
  260. data/plugins/sslchecker/gui/sslchecker.rb +12 -24
  261. data/plugins/sslchecker/lib/check.rb +172 -80
  262. data/plugins/wshell/gui/main.rb +115 -127
  263. data/plugins/wshell/lib/core.rb +85 -97
  264. data/plugins/wshell/wshell.rb +19 -31
  265. metadata +14 -6
  266. data/.yardopts +0 -24
@@ -1,24 +1,12 @@
1
- # .
1
+ #.
2
2
  # quick_scan_dialog.rb
3
- #
4
- # Copyright 2013 by siberas, http://www.siberas.de
5
- #
6
- # This file is part of WATOBO (Web Application Tool Box)
7
- # http://watobo.sourceforge.com
8
- #
9
- # WATOBO is free software; you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation version 2 of the License.
12
- #
13
- # WATOBO is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with WATOBO; if not, write to the Free Software
20
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
- # .
3
+ #.
4
+ # Copyright 2014 by siberas, http://www.siberas.de
5
+ # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
+ # WATOBO 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 version 2 of the License.
7
+ # WATOBO 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.
8
+ # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
+
22
10
  # @private
23
11
  module Watobo#:nodoc: all
24
12
  module Gui
@@ -1,134 +1,137 @@
1
- # .
1
+ #.
2
2
  # request_builder_frame.rb
3
- #
4
- # Copyright 2013 by siberas, http://www.siberas.de
5
- #
6
- # This file is part of WATOBO (Web Application Tool Box)
7
- # http://watobo.sourceforge.com
8
- #
9
- # WATOBO is free software; you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation version 2 of the License.
12
- #
13
- # WATOBO is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with WATOBO; if not, write to the Free Software
20
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
- # .
22
- # @private
23
- module Watobo#:nodoc: all
24
- module Gui
25
- class RequestBuilder < FXVerticalFrame
26
- def subscribe(event, &callback)
27
- (@event_dispatcher_listeners[event] ||= []) << callback
28
- end
29
-
30
- def clearEvents(event)
31
- @event_dispatcher_listener[event].clear
32
- end
33
-
34
- def setRequest(raw_request)
35
- begin
36
- # request
37
- if raw_request.is_a? String
38
- request = Watobo::Utils.text2request(raw_request)
39
- else
40
- request = Watobo::Request.new raw_request
41
- end
42
-
43
-
44
- @editors.each do |name, item|
3
+ #.
4
+ # Copyright 2014 by siberas, http://www.siberas.de
5
+ # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
+ # WATOBO 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 version 2 of the License.
7
+ # WATOBO 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.
8
+ # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
+
10
+ # @private
11
+ module Watobo#:nodoc: all
12
+ module Gui
13
+ class RequestBuilder < FXVerticalFrame
14
+ def subscribe(event, &callback)
15
+ (@event_dispatcher_listeners[event] ||= []) << callback
16
+ end
17
+
18
+ def clearEvents(event)
19
+ @event_dispatcher_listener[event].clear
20
+ end
21
+
22
+ def setRequest(raw_request)
23
+ begin
24
+ # request
25
+ if raw_request.is_a? String
26
+ request = Watobo::Utils.text2request(raw_request)
27
+ else
28
+ request = Watobo::Request.new raw_request
29
+ end
30
+
31
+ @editors.each do |name, item|
45
32
  e = item[:editor]
46
- if e.setRequest(request)
47
- item[:tab_item].enable
48
- else
49
- item[:tab_item].disable
50
- end
51
-
52
- end
53
-
54
- rescue => bang
55
- puts bang
56
- puts bang.backtrace
57
- # puts request
58
- # puts "== EOE =="
59
- end
60
- end
61
-
62
- def highlight(pattern)
63
- # @text_edit.highlight(pattern)
33
+ r = e.setRequest(request)
34
+ if r
35
+ item[:tab_item].enable
36
+ else
37
+ item[:tab_item].disable
38
+ end
39
+
40
+ end
41
+
42
+ rescue => bang
43
+ puts bang
44
+ puts bang.backtrace
45
+
46
+ end
64
47
  end
65
48
 
66
- def rawRequest
67
- @current.rawRequest
68
- end
49
+ def highlight(pattern)
50
+ # @text_edit.highlight(pattern)
51
+ end
69
52
 
70
- def parseRequest
53
+ def rawRequest
54
+ @current.rawRequest
55
+ end
71
56
 
72
- @current.parseRequest
73
-
57
+ def parseRequest
58
+
59
+ @current.parseRequest
60
+
74
61
  end
75
62
 
76
- def initialize(owner, opts)
77
- super(owner,opts)
78
-
79
- @event_dispatcher_listeners = Hash.new
80
- @last_editor = nil
81
-
82
- @tab = FXTabBook.new(self, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_RIGHT)
83
- @tab.connect(SEL_COMMAND){
84
- @current = @editors.to_a[@tab.current][1][:editor]
85
- unless @last_editor.nil?
86
- last_request = @last_editor.rawRequest
87
- @current.setRequest(last_request)
88
- end
89
- @last_editor = @editors.to_a[@tab.current][1][:editor]
90
- #puts @current.class
91
- }
92
- @editors = {}
93
- @current = nil
94
-
95
- add_editor("Text") do |frame|
96
- Watobo::Gui::RequestEditor.new(frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding => 0)
97
- end
98
-
99
- add_editor("Table") do |frame|
100
- Watobo::Gui::TableEditorFrame.new(frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding => 0)
63
+ def clear
64
+ puts "* clear tabs"
65
+ @editors.each do |name, item|
66
+ e = item[:editor]
67
+ r = e.clear
68
+ item[:tab_item].disable
101
69
  end
102
-
103
- @current = @editors.first[1][:editor]
104
-
105
-
106
-
107
- end
108
-
109
- private
110
-
111
- def add_editor(tab_name, &b)
112
- tab_item = FXTabItem.new(@tab, tab_name, nil)
113
- frame = FXVerticalFrame.new(@tab, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED)
114
- editor = yield(frame) if block_given?
115
-
116
- @editors[tab_name.to_sym] = {
117
- :editor => editor,
118
- :tab_item => tab_item
119
- }
120
- editor.subscribe(:hotkey_ctrl_enter){ notify(:hotkey_ctrl_enter) }
121
- editor.subscribe(:error) { |msg| notify(:error, msg) }
122
-
123
70
  end
124
71
 
125
- def notify(event, *args)
126
- if @event_dispatcher_listeners[event]
127
- @event_dispatcher_listeners[event].each do |m|
128
- m.call(*args) if m.respond_to? :call
129
- end
130
- end
131
- end
132
- end
133
- end
72
+ def to_s
73
+ s = @current.parseRequest
74
+ puts "* [requestBox] .to_s"
75
+ # puts s
76
+ # puts s.class
77
+ # puts s.empty?
78
+ s
79
+ end
80
+
81
+ def initialize(owner, opts)
82
+ super(owner,opts)
83
+
84
+ @event_dispatcher_listeners = Hash.new
85
+ @last_editor = nil
86
+
87
+ @tab = FXTabBook.new(self, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_RIGHT)
88
+ @tab.connect(SEL_COMMAND){
89
+ @current = @editors.to_a[@tab.current][1][:editor]
90
+ unless @last_editor.nil?
91
+ last_request = @last_editor.rawRequest
92
+ @current.setRequest(last_request)
93
+ end
94
+ @last_editor = @editors.to_a[@tab.current][1][:editor]
95
+ #puts @current.class
96
+ }
97
+ @editors = {}
98
+ @current = nil
99
+
100
+ add_editor("Text") do |frame|
101
+ Watobo::Gui::RequestEditor.new(frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding => 0)
102
+ end
103
+
104
+ add_editor("Table") do |frame|
105
+ Watobo::Gui::TableEditorFrame.new(frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding => 0)
106
+ end
107
+
108
+ @current = @editors.first[1][:editor]
109
+
110
+ end
111
+
112
+ private
113
+
114
+ def add_editor(tab_name, &b)
115
+ tab_item = FXTabItem.new(@tab, tab_name, nil)
116
+ frame = FXVerticalFrame.new(@tab, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED)
117
+ editor = yield(frame) if block_given?
118
+
119
+ @editors[tab_name.to_sym] = {
120
+ :editor => editor,
121
+ :tab_item => tab_item
122
+ }
123
+ editor.subscribe(:hotkey_ctrl_enter){ notify(:hotkey_ctrl_enter) }
124
+ editor.subscribe(:error) { |msg| notify(:error, msg) }
125
+
126
+ end
127
+
128
+ def notify(event, *args)
129
+ if @event_dispatcher_listeners[event]
130
+ @event_dispatcher_listeners[event].each do |m|
131
+ m.call(*args) if m.respond_to? :call
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
134
137
  end
@@ -1,24 +1,12 @@
1
- # .
1
+ #.
2
2
  # request_editor.rb
3
- #
4
- # Copyright 2013 by siberas, http://www.siberas.de
5
- #
6
- # This file is part of WATOBO (Web Application Tool Box)
7
- # http://watobo.sourceforge.com
8
- #
9
- # WATOBO is free software; you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation version 2 of the License.
12
- #
13
- # WATOBO is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with WATOBO; if not, write to the Free Software
20
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
- # .
3
+ #.
4
+ # Copyright 2014 by siberas, http://www.siberas.de
5
+ # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
+ # WATOBO 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 version 2 of the License.
7
+ # WATOBO 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.
8
+ # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
+
22
10
  # @private
23
11
  module Watobo#:nodoc: all
24
12
  module Gui
@@ -59,6 +47,10 @@ module Watobo#:nodoc: all
59
47
  def textStyle()
60
48
  @textbox.textStyle
61
49
  end
50
+
51
+ def clear
52
+ @textbox.setText('')
53
+ end
62
54
 
63
55
  def setFont(font_type=nil, size=nil)
64
56
  new_size = size.nil? ? GUI_REGULAR_FONT_SIZE : size
@@ -173,6 +165,8 @@ module Watobo#:nodoc: all
173
165
  def editable?()
174
166
  @textbox.editable?
175
167
  end
168
+
169
+
176
170
 
177
171
  def setText(text, prefs={})
178
172
  @text = normalizeText(text)
@@ -279,20 +273,23 @@ module Watobo#:nodoc: all
279
273
 
280
274
  def showText(text)
281
275
  begin
282
- if @max_len > 0 and @max_len < text.length
283
- text = text[0..@max_len] + "\n---8<--- WATOBO ---8<---\n* PRESS RESET TO SEE FULL RESPONSE *"
284
- end
276
+ # if @max_len > 0 and @max_len < text.length
277
+ # text = text[0..@max_len] + "\n---8<--- WATOBO ---8<---\n* PRESS RESET TO SEE FULL RESPONSE *"
278
+ # end
285
279
  # text.encode('iso_8859_1')
286
280
  # UTF-8 CleanUp
287
281
  text = text.unpack("C*").pack("C*")
288
282
  text.gsub!(/\x0d/u, '')
289
- text.gsub!(/[\x00-\x09\x0b-\x1f\x7f-\xff]+/m,'.')
283
+ r = Regexp.new '[\x00-\x09\x0b-\x1f\x7f-\xff]+', nil, 'n'
284
+ text.gsub!(r,'.')
290
285
  @textbox.setText(text)
286
+ return true
291
287
  rescue => bang
292
288
  puts bang
293
289
  puts bang.backtrace if $DEBUG
294
290
  @textbox.setText(text)
295
291
  end
292
+ return false
296
293
  end
297
294
 
298
295
  def notify(event, *args)
@@ -309,9 +306,10 @@ module Watobo#:nodoc: all
309
306
  return "" if text.nil?
310
307
  t = text.join if text.is_a? Array
311
308
  t = t.unpack("C*").pack("C*")
309
+ t.gsub!(/\x0d/, '')
312
310
 
313
- t.gsub!(/\x0d/, '')
314
- t.gsub!(/[\x00-\x09\x0b-\x1f\x7f-\xff]+/m,'.')
311
+ r = Regexp.new '[\x00-\x09\x0b-\x1f\x7f-\xff]+', nil, 'n'
312
+ t.gsub!( r ,'.')
315
313
  return t
316
314
  rescue => bang
317
315
  puts bang
@@ -347,6 +345,28 @@ module Watobo#:nodoc: all
347
345
  @textbox.connect(SEL_RIGHTBUTTONRELEASE) do |sender, sel, event|
348
346
  unless event.moved?
349
347
  FXMenuPane.new(self) do |menu_pane|
348
+ cpos = sender.cursorPos
349
+
350
+ pos = sender.selStartPos
351
+ #puts "*selStartPos: #{pos}"
352
+ #puts "*selEndPos: #{sender.selEndPos}"
353
+ len = sender.selEndPos - pos
354
+ string2decode = sender.extractText(pos, len)
355
+ string2decode.extend Watobo::Mixin::Transcoders
356
+ FXMenuSeparator.new(menu_pane)
357
+ FXMenuCaption.new(menu_pane,"- Insert -")
358
+ FXMenuSeparator.new(menu_pane)
359
+ eh = FXMenuCommand.new(menu_pane,"File")
360
+ eh.connect(SEL_COMMAND) {
361
+ insf = FXFileDialog.getOpenFilename(self, "Select file to insert", nil)
362
+ if insf != "" then
363
+ if File.exists?(insf) then
364
+ # puts "Inserting #{insf}"
365
+ sender.insertText(cpos, "%%File.read('#{insf}')%%")
366
+ end
367
+ end
368
+
369
+ }
350
370
  addStringInfo(menu_pane, sender)
351
371
  addDecoder(menu_pane, sender)
352
372
  addEncoder(menu_pane, sender)
@@ -406,6 +426,10 @@ module Watobo#:nodoc: all
406
426
  rptxt = case event.code
407
427
  when KEY_u
408
428
  CGI::escape(text)
429
+ when KEY_h
430
+ CGI::escapeHTML(text)
431
+ when KEY_H
432
+ CGI::unescapeHTML(text)
409
433
  when KEY_b
410
434
  Base64.strict_encode64(text)
411
435
  when KEY_U
@@ -415,8 +439,9 @@ module Watobo#:nodoc: all
415
439
  else
416
440
  text
417
441
  end
418
- @textbox.replaceText(pos,len,rptxt)
419
- @textbox.setSelection(pos,rptxt.length)
442
+ text = normalizeText(rptxt)
443
+ @textbox.replaceText(pos,len, text)
444
+ @textbox.setSelection(pos, text.length)
420
445
  end
421
446
  false
422
447
  end
@@ -1,417 +1,405 @@
1
- # .
1
+ #.
2
2
  # rewrite_filters_dialog.rb
3
- #
4
- # Copyright 2013 by siberas, http://www.siberas.de
5
- #
6
- # This file is part of WATOBO (Web Application Tool Box)
7
- # http://watobo.sourceforge.com
8
- #
9
- # WATOBO is free software; you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation version 2 of the License.
12
- #
13
- # WATOBO is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with WATOBO; if not, write to the Free Software
20
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
- # .
22
- # @private
23
- module Watobo#:nodoc: all
24
- module Gui
25
- class FilterTableCtrl < FXHorizontalFrame
26
- attr_accessor :target
27
-
28
- def initialize(owner,target = nil, opts)
29
- @target = target
30
- super owner, opts
31
- matrix = FXMatrix.new(self, 4, :opts => MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y)
32
-
33
- %w( Location Match Pattern Flags ).each do |l|
34
- FXLabel.new(matrix, l)
35
- end
36
-
37
- @locations_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
38
- #@filterCombo.width =200
39
-
40
- @locations_combo.numVisible = 0
41
- @locations_combo.numColumns = 10
42
- @locations_combo.editable = false
43
- @locations_combo.connect(SEL_COMMAND){}
44
-
45
- @match_type_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
46
- #@filterCombo.width =200
47
-
48
- @match_type_combo.numVisible = 0
49
- @match_type_combo.numColumns = 10
50
- @match_type_combo.editable = false
51
- @match_type_combo.connect(SEL_COMMAND){}
52
-
53
- @pattern_txt = FXTextField.new(matrix, 20, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_FILL_COLUMN)
54
-
55
- @flags_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
56
- #@filterCombo.width =200
57
-
58
- @flags_combo.numVisible = 0
59
- @flags_combo.numColumns = 10
60
- @flags_combo.editable = false
61
- @flags_combo.connect(SEL_COMMAND){}
62
-
63
- frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
64
- top_btn_frame = FXHorizontalFrame.new(frame,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
65
-
66
- @del_btn = FXButton.new(top_btn_frame, "Del" , nil, nil)
67
- @del_btn.enable
68
- @del_btn.connect(SEL_COMMAND){ delete_filter }
69
-
70
- # @edit_btn = FXButton.new(top_btn_frame, "Edit ..." , nil, nil)
71
- # @edit_btn.enable
72
- # @edit_btn.connect(SEL_COMMAND){ delete_filter }
73
-
74
- @up_btn = FXButton.new(top_btn_frame, "Up" , nil, nil)
75
- @up_btn.enable
76
-
77
- @down_btn = FXButton.new(top_btn_frame, "Down" , nil, nil)
78
- @down_btn.enable
79
-
80
- add_btn_frame = FXHorizontalFrame.new(frame,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
81
- @add_btn = FXButton.new(add_btn_frame, "Add ..." , nil, nil, )
82
- @add_btn.enable
83
- @add_btn.connect(SEL_COMMAND){ add_filter }
84
-
85
- end
86
-
87
- private
88
-
89
- def init_handlers()
90
-
91
- end
92
-
93
-
94
- def add_match_type(l)
95
- @match_type_combo.appendItem(l.to_s, l)
96
- @match_type_combo.numVisible = @match_type_combo.numItems
97
- end
98
-
99
- def add_location(l)
100
- @locations_combo.appendItem(l.to_s, l)
101
- @locations_combo.numVisible = @locations_combo.numItems
102
- end
103
-
104
- def add_flag(l)
105
- @flags_combo.appendItem(l.to_s, l)
106
- @flags_combo.numVisible = @flags_combo.numItems
107
- end
108
-
109
- def delete_filter
110
- @target.delete_current_row if @target.respond_to? :delete_current_row
111
-
112
- end
113
-
114
- def add_filter
115
- return false if @target.nil?
116
- #TODO: Add some checks if filter is ok
117
- location = @locations_combo.getItemData(@locations_combo.currentItem)
118
- pattern = @pattern_txt.text
119
- match_type = @match_type_combo.getItemData(@match_type_combo.currentItem)
120
- flag = @flags_combo.getItemData(@flags_combo.currentItem)
121
-
122
- prefs = {
123
- :match_type => match_type,
124
- :flags => ( flag != :none ) ? [flag] : []
125
- }
126
-
127
- filter = case location
128
- when :url
129
- Watobo::Interceptor::UrlFilter.new(pattern, prefs)
130
- when :method
131
- Watobo::Interceptor::MethodFilter.new(pattern, prefs)
132
- when :url_parms
133
- Watobo::Interceptor::HttpParmsFilter.new(pattern, prefs)
134
- when :status
135
- Watobo::Interceptor::StatusFilter.new(pattern, prefs)
136
- when :flags
137
- Watobo::Interceptor::FlagFilter.new('', prefs)
138
- end
139
- @target.add_filter filter
140
- end
141
-
142
- end
143
-
144
- class RequestFilterCtrl < FilterTableCtrl
145
- def initialize(owner, target, opts)
146
- super owner, target, opts
147
- add_location :url
148
- add_location :method
149
- #add_location :header
150
- #add_location :cookie
151
- add_location :url_parms
152
-
153
- add_match_type :match
154
- add_match_type :not_match
155
-
156
- add_flag :none
157
- add_flag :request
158
- end
159
- end
160
-
161
- class ResponseFilterCtrl < FilterTableCtrl
162
- def initialize(owner, target, opts)
163
- super owner, target, opts
164
- # add_location :body
165
- # add_location :header
166
- add_location :status
167
- add_location :header
168
- add_location :flags
169
-
170
- add_match_type :match
171
- add_match_type :not_match
172
-
173
- add_flag :none
174
- add_flag :request
175
- end
176
- end
177
-
178
- class FilterTable < FXTable
179
- attr :filters
180
- def add_filter(filter)
181
- @filters << filter
182
- add_filter_row(filter)
183
- end
184
-
185
- def get_current_filter
186
- puts self.currentRow
187
- end
188
-
189
- def delete_row_by_index(index)
190
- return false if index < 0
191
- return false if index > self.numRows-1
192
- @filters.delete_at index
193
- self.clearItems
194
- init_columns
195
-
196
- @filters.each do |r|
197
- add_filter_row r
198
- end
199
- adjust_cell_width
200
- self.selectRow self.currentRow if self.currentRow >= 0
201
- true
202
- end
203
-
204
- def delete_current_row
205
- i = self.currentRow
206
- return false if i < 0
207
- delete_row_by_index i
208
- end
209
-
210
- def initialize( owner, filters=[], opts={} )
211
- @event_dispatcher_listeners = Hash.new
212
- parms = { :opts => TABLE_COL_SIZABLE|TABLE_ROW_SIZABLE|LAYOUT_FILL_X|LAYOUT_FILL_Y|TABLE_READONLY|LAYOUT_SIDE_TOP,
213
- :padding => 2
214
- }
215
- parms.update opts
216
-
217
- super(owner, parms)
218
-
219
- self.extend Watobo::Subscriber
220
- self.setBackColor(FXRGB(255, 255, 255))
221
- self.setCellColor(0, 0, FXRGB(255, 255, 255))
222
- self.setCellColor(0, 1, FXRGB(255, 240, 240))
223
- self.setCellColor(1, 0, FXRGB(240, 255, 240))
224
- self.setCellColor(1, 1, FXRGB(240, 240, 255))
225
-
226
- @columns=Hash.new
227
-
228
- @filters = []
229
- @filters.concat filters
230
-
231
- add_column "Location", 80
232
- add_column "Match", 80
233
- add_column "Pattern", 80
234
- add_column "Flags", 80
235
-
236
-
237
- init_columns
238
-
239
- @filters.each do |r|
240
- add_filter_row r
241
- end
242
- adjust_cell_width
243
-
244
- self.connect(SEL_SELECTED){|sender,sel,pos|
245
- self.selectRow pos.row
246
- # notify(:filter_selected, @filters[pos.row])
247
- }
248
- end
249
-
250
- private
251
-
252
- def add_filter_row(filter)
253
- return false if filter.nil?
254
- row_index = self.getNumRows
255
- self.appendRows(1)
256
-
257
- self.rowHeader.setItemJustify(row_index, FXHeaderItem::RIGHT)
258
- self.setRowText(row_index, (row_index+1).to_s)
259
-
260
- index = @columns[:location][:order]
261
- self.setItemText(row_index, index, filter.name)
262
- self.getItem(row_index, index).justify = FXTableItem::LEFT
263
-
264
- index = @columns[:match][:order]
265
- self.setItemText(row_index, index, filter.match_type.to_s)
266
- self.getItem(row_index, index).justify = FXTableItem::LEFT
267
-
268
- index = @columns[:flags][:order]
269
- self.setItemText(row_index, index, filter.flags.join(","))
270
- self.getItem(row_index, index).justify = FXTableItem::LEFT
271
-
272
- index = @columns[:pattern][:order]
273
- self.setItemText(row_index, index, filter.pattern)
274
- self.getItem(row_index, index).justify = FXTableItem::LEFT
275
-
276
-
277
- end
278
- def add_column(name, width, order=0)
279
- o = ( order == 0 ) ? @columns.length : order
280
- @columns[name.downcase.to_sym] = { :name => name,
281
- :width => width,
282
- :order => o
283
- }
284
-
285
- end
286
-
287
- def adjust_cell_width()
288
- begin
289
- self.rowHeader.width = 30
290
- #self.fitColumnsToContents(0)
291
- @columns.each_with_index do |v,i|
3
+ #.
4
+ # Copyright 2014 by siberas, http://www.siberas.de
5
+ # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
+ # WATOBO 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 version 2 of the License.
7
+ # WATOBO 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.
8
+ # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
292
9
 
293
- self.setColumnWidth(i, v[1][:width])
294
- end
295
- rescue => bang
296
- puts "!!!ERROR: adjustCellWidth"
297
- puts bang
298
- puts bang.backtrace
299
- end
300
-
301
- end
302
-
303
- def init_columns
304
- self.setTableSize(0, @columns.length)
305
- self.visibleRows = 5
306
- self.visibleColumns = @columns.length
307
-
308
- @columns.sort_by{|k,v| v[:order] }.each_with_index do |v,i|
309
- self.setColumnText( i, v[1][:name] )
310
- end
311
-
312
- end
313
-
314
- end
315
-
316
- class RequestFilterTable < FilterTable
317
- def initialize(owner, opts={})
318
- super owner, opts
319
- add_column "Action", 50
320
- add_column "Location", 80
321
- add_column "Pattern", 80
322
- add_column "Content", 80
323
- add_column "Filter", 80
324
-
325
- init_columns
326
- adjust_cell_width
327
-
328
- end
329
- end
330
-
331
- class RequestFilterDialog < FXDialogBox
332
-
333
- include Responder
334
- def filter
335
- f = Watobo::Interceptor::FilterChain.new
336
- f.set_filters @table.filters
337
- f
338
- end
339
-
340
- def initialize(owner, rule, settings = {} )
341
- super(owner, "Request Rule Filter", DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE, :width => 650, :height => 300)
342
-
343
- FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
344
-
345
- @main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
346
-
347
- @table = FilterTable.new(@main_frame, rule.filters)
348
- @table_ctrl = RequestFilterCtrl.new(@main_frame, @table, :opts => LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
349
-
350
- buttons_frame = FXHorizontalFrame.new(@main_frame, :opts => LAYOUT_FILL_X|LAYOUT_BOTTOM)
351
- @finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
352
- @finishButton.enable
353
- @finishButton.connect(SEL_COMMAND) do |sender, sel, item|
354
- #self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
355
- self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
356
- end
357
-
358
- @cancelButton = FXButton.new(buttons_frame, "Cancel" ,
359
- :target => self, :selector => FXDialogBox::ID_CANCEL,
360
- :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
361
- end
362
-
363
- private
364
-
365
- def onAccept(sender, sel, event)
366
-
367
- getApp().stopModal(self, 1)
368
- self.hide()
369
- return 1
370
- end
371
-
372
-
373
- end
374
-
375
- class ResponseFilterDialog < FXDialogBox
376
-
377
- include Responder
378
- def filter
379
- f = Watobo::Interceptor::FilterChain.new
380
- f.set_filters @table.filters
381
- f
382
- end
383
-
384
- def initialize(owner, rule, settings = {} )
385
- super(owner, "Response Rule Filters", DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE, :width => 650, :height => 300)
386
-
387
- FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
388
-
389
- @main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
390
-
391
- @table = FilterTable.new(@main_frame, rule.filters)
392
- @table_ctrl = ResponseFilterCtrl.new(@main_frame, @table, :opts => LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
393
-
394
- buttons_frame = FXHorizontalFrame.new(@main_frame, :opts => LAYOUT_FILL_X|LAYOUT_BOTTOM)
395
- @finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
396
- @finishButton.enable
397
- @finishButton.connect(SEL_COMMAND) do |sender, sel, item|
398
- #self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
399
- self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
400
- end
401
-
402
- @cancelButton = FXButton.new(buttons_frame, "Cancel" ,
403
- :target => self, :selector => FXDialogBox::ID_CANCEL,
404
- :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
405
- end
406
-
407
- private
408
-
409
- def onAccept(sender, sel, event)
410
- getApp().stopModal(self, 1)
411
- self.hide()
412
- return 1
413
- end
414
-
415
- end
416
- end
10
+ # @private
11
+ module Watobo#:nodoc: all
12
+ module Gui
13
+ class FilterTableCtrl < FXHorizontalFrame
14
+ attr_accessor :target
15
+
16
+ def initialize(owner,target = nil, opts)
17
+ @target = target
18
+ super owner, opts
19
+ matrix = FXMatrix.new(self, 4, :opts => MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y)
20
+
21
+ %w( Location Match Pattern Flags ).each do |l|
22
+ FXLabel.new(matrix, l)
23
+ end
24
+
25
+ @locations_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
26
+ #@filterCombo.width =200
27
+
28
+ @locations_combo.numVisible = 0
29
+ @locations_combo.numColumns = 10
30
+ @locations_combo.editable = false
31
+ @locations_combo.connect(SEL_COMMAND){}
32
+
33
+ @match_type_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
34
+ #@filterCombo.width =200
35
+
36
+ @match_type_combo.numVisible = 0
37
+ @match_type_combo.numColumns = 10
38
+ @match_type_combo.editable = false
39
+ @match_type_combo.connect(SEL_COMMAND){}
40
+
41
+ @pattern_txt = FXTextField.new(matrix, 20, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_FILL_COLUMN)
42
+
43
+ @flags_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
44
+ #@filterCombo.width =200
45
+
46
+ @flags_combo.numVisible = 0
47
+ @flags_combo.numColumns = 10
48
+ @flags_combo.editable = false
49
+ @flags_combo.connect(SEL_COMMAND){}
50
+
51
+ frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
52
+ top_btn_frame = FXHorizontalFrame.new(frame,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
53
+
54
+ @del_btn = FXButton.new(top_btn_frame, "Del" , nil, nil)
55
+ @del_btn.enable
56
+ @del_btn.connect(SEL_COMMAND){ delete_filter }
57
+
58
+ # @edit_btn = FXButton.new(top_btn_frame, "Edit ..." , nil, nil)
59
+ # @edit_btn.enable
60
+ # @edit_btn.connect(SEL_COMMAND){ delete_filter }
61
+
62
+ @up_btn = FXButton.new(top_btn_frame, "Up" , nil, nil)
63
+ @up_btn.enable
64
+
65
+ @down_btn = FXButton.new(top_btn_frame, "Down" , nil, nil)
66
+ @down_btn.enable
67
+
68
+ add_btn_frame = FXHorizontalFrame.new(frame,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
69
+ @add_btn = FXButton.new(add_btn_frame, "Add ..." , nil, nil, )
70
+ @add_btn.enable
71
+ @add_btn.connect(SEL_COMMAND){ add_filter }
72
+
73
+ end
74
+
75
+ private
76
+
77
+ def init_handlers()
78
+
79
+ end
80
+
81
+
82
+ def add_match_type(l)
83
+ @match_type_combo.appendItem(l.to_s, l)
84
+ @match_type_combo.numVisible = @match_type_combo.numItems
85
+ end
86
+
87
+ def add_location(l)
88
+ @locations_combo.appendItem(l.to_s, l)
89
+ @locations_combo.numVisible = @locations_combo.numItems
90
+ end
91
+
92
+ def add_flag(l)
93
+ @flags_combo.appendItem(l.to_s, l)
94
+ @flags_combo.numVisible = @flags_combo.numItems
95
+ end
96
+
97
+ def delete_filter
98
+ @target.delete_current_row if @target.respond_to? :delete_current_row
99
+
100
+ end
101
+
102
+ def add_filter
103
+ return false if @target.nil?
104
+ #TODO: Add some checks if filter is ok
105
+ location = @locations_combo.getItemData(@locations_combo.currentItem)
106
+ pattern = @pattern_txt.text
107
+ match_type = @match_type_combo.getItemData(@match_type_combo.currentItem)
108
+ flag = @flags_combo.getItemData(@flags_combo.currentItem)
109
+
110
+ prefs = {
111
+ :match_type => match_type,
112
+ :flags => ( flag != :none ) ? [flag] : []
113
+ }
114
+
115
+ filter = case location
116
+ when :url
117
+ Watobo::Interceptor::UrlFilter.new(pattern, prefs)
118
+ when :method
119
+ Watobo::Interceptor::MethodFilter.new(pattern, prefs)
120
+ when :url_parms
121
+ Watobo::Interceptor::HttpParmsFilter.new(pattern, prefs)
122
+ when :status
123
+ Watobo::Interceptor::StatusFilter.new(pattern, prefs)
124
+ when :flags
125
+ Watobo::Interceptor::FlagFilter.new('', prefs)
126
+ end
127
+ @target.add_filter filter
128
+ end
129
+
130
+ end
131
+
132
+ class RequestFilterCtrl < FilterTableCtrl
133
+ def initialize(owner, target, opts)
134
+ super owner, target, opts
135
+ add_location :url
136
+ add_location :method
137
+ #add_location :header
138
+ #add_location :cookie
139
+ add_location :url_parms
140
+
141
+ add_match_type :match
142
+ add_match_type :not_match
143
+
144
+ add_flag :none
145
+ add_flag :request
146
+ end
147
+ end
148
+
149
+ class ResponseFilterCtrl < FilterTableCtrl
150
+ def initialize(owner, target, opts)
151
+ super owner, target, opts
152
+ # add_location :body
153
+ # add_location :header
154
+ add_location :status
155
+ add_location :header
156
+ add_location :flags
157
+
158
+ add_match_type :match
159
+ add_match_type :not_match
160
+
161
+ add_flag :none
162
+ add_flag :request
163
+ end
164
+ end
165
+
166
+ class FilterTable < FXTable
167
+ attr :filters
168
+ def add_filter(filter)
169
+ @filters << filter
170
+ add_filter_row(filter)
171
+ end
172
+
173
+ def get_current_filter
174
+ puts self.currentRow
175
+ end
176
+
177
+ def delete_row_by_index(index)
178
+ return false if index < 0
179
+ return false if index > self.numRows-1
180
+ @filters.delete_at index
181
+ self.clearItems
182
+ init_columns
183
+
184
+ @filters.each do |r|
185
+ add_filter_row r
186
+ end
187
+ adjust_cell_width
188
+ self.selectRow self.currentRow if self.currentRow >= 0
189
+ true
190
+ end
191
+
192
+ def delete_current_row
193
+ i = self.currentRow
194
+ return false if i < 0
195
+ delete_row_by_index i
196
+ end
197
+
198
+ def initialize( owner, filters=[], opts={} )
199
+ @event_dispatcher_listeners = Hash.new
200
+ parms = { :opts => TABLE_COL_SIZABLE|TABLE_ROW_SIZABLE|LAYOUT_FILL_X|LAYOUT_FILL_Y|TABLE_READONLY|LAYOUT_SIDE_TOP,
201
+ :padding => 2
202
+ }
203
+ parms.update opts
204
+
205
+ super(owner, parms)
206
+
207
+ self.extend Watobo::Subscriber
208
+ self.setBackColor(FXRGB(255, 255, 255))
209
+ self.setCellColor(0, 0, FXRGB(255, 255, 255))
210
+ self.setCellColor(0, 1, FXRGB(255, 240, 240))
211
+ self.setCellColor(1, 0, FXRGB(240, 255, 240))
212
+ self.setCellColor(1, 1, FXRGB(240, 240, 255))
213
+
214
+ @columns=Hash.new
215
+
216
+ @filters = []
217
+ @filters.concat filters
218
+
219
+ add_column "Location", 80
220
+ add_column "Match", 80
221
+ add_column "Pattern", 80
222
+ add_column "Flags", 80
223
+
224
+
225
+ init_columns
226
+
227
+ @filters.each do |r|
228
+ add_filter_row r
229
+ end
230
+ adjust_cell_width
231
+
232
+ self.connect(SEL_SELECTED){|sender,sel,pos|
233
+ self.selectRow pos.row
234
+ # notify(:filter_selected, @filters[pos.row])
235
+ }
236
+ end
237
+
238
+ private
239
+
240
+ def add_filter_row(filter)
241
+ return false if filter.nil?
242
+ row_index = self.getNumRows
243
+ self.appendRows(1)
244
+
245
+ self.rowHeader.setItemJustify(row_index, FXHeaderItem::RIGHT)
246
+ self.setRowText(row_index, (row_index+1).to_s)
247
+
248
+ index = @columns[:location][:order]
249
+ self.setItemText(row_index, index, filter.name)
250
+ self.getItem(row_index, index).justify = FXTableItem::LEFT
251
+
252
+ index = @columns[:match][:order]
253
+ self.setItemText(row_index, index, filter.match_type.to_s)
254
+ self.getItem(row_index, index).justify = FXTableItem::LEFT
255
+
256
+ index = @columns[:flags][:order]
257
+ self.setItemText(row_index, index, filter.flags.join(","))
258
+ self.getItem(row_index, index).justify = FXTableItem::LEFT
259
+
260
+ index = @columns[:pattern][:order]
261
+ self.setItemText(row_index, index, filter.pattern)
262
+ self.getItem(row_index, index).justify = FXTableItem::LEFT
263
+
264
+
265
+ end
266
+ def add_column(name, width, order=0)
267
+ o = ( order == 0 ) ? @columns.length : order
268
+ @columns[name.downcase.to_sym] = { :name => name,
269
+ :width => width,
270
+ :order => o
271
+ }
272
+
273
+ end
274
+
275
+ def adjust_cell_width()
276
+ begin
277
+ self.rowHeader.width = 30
278
+ #self.fitColumnsToContents(0)
279
+ @columns.each_with_index do |v,i|
280
+
281
+ self.setColumnWidth(i, v[1][:width])
282
+ end
283
+ rescue => bang
284
+ puts "!!!ERROR: adjustCellWidth"
285
+ puts bang
286
+ puts bang.backtrace
287
+ end
288
+
289
+ end
290
+
291
+ def init_columns
292
+ self.setTableSize(0, @columns.length)
293
+ self.visibleRows = 5
294
+ self.visibleColumns = @columns.length
295
+
296
+ @columns.sort_by{|k,v| v[:order] }.each_with_index do |v,i|
297
+ self.setColumnText( i, v[1][:name] )
298
+ end
299
+
300
+ end
301
+
302
+ end
303
+
304
+ class RequestFilterTable < FilterTable
305
+ def initialize(owner, opts={})
306
+ super owner, opts
307
+ add_column "Action", 50
308
+ add_column "Location", 80
309
+ add_column "Pattern", 80
310
+ add_column "Content", 80
311
+ add_column "Filter", 80
312
+
313
+ init_columns
314
+ adjust_cell_width
315
+
316
+ end
317
+ end
318
+
319
+ class RequestFilterDialog < FXDialogBox
320
+
321
+ include Responder
322
+ def filter
323
+ f = Watobo::Interceptor::FilterChain.new
324
+ f.set_filters @table.filters
325
+ f
326
+ end
327
+
328
+ def initialize(owner, rule, settings = {} )
329
+ super(owner, "Request Rule Filter", DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE, :width => 650, :height => 300)
330
+
331
+ FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
332
+
333
+ @main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
334
+
335
+ @table = FilterTable.new(@main_frame, rule.filters)
336
+ @table_ctrl = RequestFilterCtrl.new(@main_frame, @table, :opts => LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
337
+
338
+ buttons_frame = FXHorizontalFrame.new(@main_frame, :opts => LAYOUT_FILL_X|LAYOUT_BOTTOM)
339
+ @finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
340
+ @finishButton.enable
341
+ @finishButton.connect(SEL_COMMAND) do |sender, sel, item|
342
+ #self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
343
+ self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
344
+ end
345
+
346
+ @cancelButton = FXButton.new(buttons_frame, "Cancel" ,
347
+ :target => self, :selector => FXDialogBox::ID_CANCEL,
348
+ :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
349
+ end
350
+
351
+ private
352
+
353
+ def onAccept(sender, sel, event)
354
+
355
+ getApp().stopModal(self, 1)
356
+ self.hide()
357
+ return 1
358
+ end
359
+
360
+
361
+ end
362
+
363
+ class ResponseFilterDialog < FXDialogBox
364
+
365
+ include Responder
366
+ def filter
367
+ f = Watobo::Interceptor::FilterChain.new
368
+ f.set_filters @table.filters
369
+ f
370
+ end
371
+
372
+ def initialize(owner, rule, settings = {} )
373
+ super(owner, "Response Rule Filters", DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE, :width => 650, :height => 300)
374
+
375
+ FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
376
+
377
+ @main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
378
+
379
+ @table = FilterTable.new(@main_frame, rule.filters)
380
+ @table_ctrl = ResponseFilterCtrl.new(@main_frame, @table, :opts => LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
381
+
382
+ buttons_frame = FXHorizontalFrame.new(@main_frame, :opts => LAYOUT_FILL_X|LAYOUT_BOTTOM)
383
+ @finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
384
+ @finishButton.enable
385
+ @finishButton.connect(SEL_COMMAND) do |sender, sel, item|
386
+ #self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
387
+ self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
388
+ end
389
+
390
+ @cancelButton = FXButton.new(buttons_frame, "Cancel" ,
391
+ :target => self, :selector => FXDialogBox::ID_CANCEL,
392
+ :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
393
+ end
394
+
395
+ private
396
+
397
+ def onAccept(sender, sel, event)
398
+ getApp().stopModal(self, 1)
399
+ self.hide()
400
+ return 1
401
+ end
402
+
403
+ end
404
+ end
417
405
  end