watobo 0.9.21 → 0.9.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +46 -1
  3. data/bin/nfq_server.rb +0 -9
  4. data/bin/watobo_gui.rb +3 -13
  5. data/custom-views/prettify-json.rb +9 -18
  6. data/icons/watobo.ico +0 -0
  7. data/icons/watobo.ico.old +0 -0
  8. data/lib/watobo.rb +10 -19
  9. data/lib/watobo/adapters.rb +5 -14
  10. data/lib/watobo/adapters/data_store.rb +50 -59
  11. data/lib/watobo/adapters/file/file_store.rb +287 -296
  12. data/lib/watobo/adapters/file/marshal_store.rb +293 -296
  13. data/lib/watobo/adapters/session_store.rb +5 -14
  14. data/lib/watobo/ca.rb +1 -10
  15. data/lib/watobo/config.rb +197 -206
  16. data/lib/watobo/constants.rb +0 -9
  17. data/lib/watobo/core.rb +3 -12
  18. data/lib/watobo/core/active_check.rb +72 -135
  19. data/lib/watobo/core/active_checks.rb +49 -58
  20. data/lib/watobo/core/ca.rb +369 -389
  21. data/lib/watobo/core/cert_store.rb +34 -43
  22. data/lib/watobo/core/chat.rb +92 -101
  23. data/lib/watobo/core/chats.rb +271 -280
  24. data/lib/watobo/core/client_cert_store.rb +106 -35
  25. data/lib/watobo/core/conversation.rb +48 -57
  26. data/lib/watobo/core/cookie.rb +23 -32
  27. data/lib/watobo/core/egress_handlers.rb +98 -0
  28. data/lib/watobo/core/finding.rb +66 -75
  29. data/lib/watobo/core/findings.rb +107 -114
  30. data/lib/watobo/core/forwarding_proxy.rb +13 -22
  31. data/lib/watobo/core/fuzz_gen.rb +0 -9
  32. data/lib/watobo/core/intercept_carver.rb +166 -177
  33. data/lib/watobo/core/intercept_filter.rb +235 -244
  34. data/lib/watobo/core/interceptor.rb +98 -107
  35. data/lib/watobo/core/min_class.rb +4 -13
  36. data/lib/watobo/core/netfilter_queue.rb +170 -179
  37. data/lib/watobo/core/ott_cache.rb +132 -141
  38. data/lib/watobo/core/parameter.rb +43 -52
  39. data/lib/watobo/core/passive_check.rb +103 -102
  40. data/lib/watobo/core/passive_checks.rb +48 -57
  41. data/lib/watobo/core/passive_scanner.rb +54 -55
  42. data/lib/watobo/core/plugin.rb +11 -20
  43. data/lib/watobo/core/project.rb +3 -9
  44. data/lib/watobo/core/proxy.rb +43 -52
  45. data/lib/watobo/core/request.rb +125 -123
  46. data/lib/watobo/core/response.rb +44 -53
  47. data/lib/watobo/core/scanner.rb +0 -9
  48. data/lib/watobo/core/scanner3.rb +405 -414
  49. data/lib/watobo/core/scope.rb +83 -92
  50. data/lib/watobo/core/session.rb +1043 -1026
  51. data/lib/watobo/core/sid_cache.rb +98 -107
  52. data/lib/watobo/core/subscriber.rb +25 -34
  53. data/lib/watobo/defaults.rb +21 -30
  54. data/lib/watobo/external/diff/lcs.rb +0 -9
  55. data/lib/watobo/external/diff/lcs/array.rb +0 -9
  56. data/lib/watobo/external/diff/lcs/block.rb +0 -9
  57. data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
  58. data/lib/watobo/external/diff/lcs/change.rb +0 -9
  59. data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
  60. data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
  61. data/lib/watobo/external/diff/lcs/string.rb +0 -9
  62. data/lib/watobo/externals.rb +6 -15
  63. data/lib/watobo/framework.rb +4 -13
  64. data/lib/watobo/framework/create_project.rb +60 -69
  65. data/lib/watobo/framework/init.rb +0 -9
  66. data/lib/watobo/framework/init_modules.rb +0 -9
  67. data/lib/watobo/framework/license_text.rb +28 -37
  68. data/lib/watobo/framework/load_chat.rb +13 -22
  69. data/lib/watobo/gui.rb +132 -123
  70. data/lib/watobo/gui/about_watobo.rb +0 -9
  71. data/lib/watobo/gui/browser_preview.rb +0 -9
  72. data/lib/watobo/gui/certificate_dialog.rb +0 -9
  73. data/lib/watobo/gui/chat_diff.rb +0 -9
  74. data/lib/watobo/gui/chatviewer_frame.rb +73 -72
  75. data/lib/watobo/gui/checkboxtree.rb +0 -9
  76. data/lib/watobo/gui/checks_policy_frame.rb +0 -9
  77. data/lib/watobo/gui/client_cert_dialog.rb +96 -87
  78. data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
  79. data/lib/watobo/gui/conversation_table.rb +158 -164
  80. data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
  81. data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
  82. data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
  83. data/lib/watobo/gui/custom_viewer.rb +374 -383
  84. data/lib/watobo/gui/dashboard.rb +296 -303
  85. data/lib/watobo/gui/define_scope_frame.rb +0 -9
  86. data/lib/watobo/gui/differ_frame.rb +215 -224
  87. data/lib/watobo/gui/edit_comment.rb +0 -9
  88. data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
  89. data/lib/watobo/gui/export_dialog.rb +104 -113
  90. data/lib/watobo/gui/finding_info.rb +0 -9
  91. data/lib/watobo/gui/findings_tree.rb +210 -217
  92. data/lib/watobo/gui/full_scan_dialog.rb +0 -9
  93. data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
  94. data/lib/watobo/gui/fxsave_thread.rb +14 -0
  95. data/lib/watobo/gui/goto_url_dialog.rb +70 -79
  96. data/lib/watobo/gui/hex_viewer.rb +0 -9
  97. data/lib/watobo/gui/html_viewer.rb +287 -296
  98. data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
  99. data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
  100. data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
  101. data/lib/watobo/gui/json_viewer.rb +287 -0
  102. data/lib/watobo/gui/list_box.rb +101 -110
  103. data/lib/watobo/gui/log_file_viewer.rb +32 -41
  104. data/lib/watobo/gui/log_viewer.rb +83 -88
  105. data/lib/watobo/gui/login_wizzard.rb +0 -9
  106. data/lib/watobo/gui/main_window.rb +587 -618
  107. data/lib/watobo/gui/manual_request_editor.rb +620 -565
  108. data/lib/watobo/gui/master_pw_dialog.rb +0 -9
  109. data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
  110. data/lib/watobo/gui/page_tree.rb +217 -226
  111. data/lib/watobo/gui/password_policy_dialog.rb +0 -9
  112. data/lib/watobo/gui/plugin_board.rb +0 -9
  113. data/lib/watobo/gui/preferences_dialog.rb +0 -9
  114. data/lib/watobo/gui/progress_window.rb +17 -27
  115. data/lib/watobo/gui/project_wizzard.rb +0 -9
  116. data/lib/watobo/gui/proxy_dialog.rb +1 -10
  117. data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
  118. data/lib/watobo/gui/request_builder_frame.rb +102 -111
  119. data/lib/watobo/gui/request_editor.rb +181 -137
  120. data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
  121. data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
  122. data/lib/watobo/gui/save_chat_dialog.rb +140 -149
  123. data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
  124. data/lib/watobo/gui/select_chat_dialog.rb +0 -9
  125. data/lib/watobo/gui/session_management_dialog.rb +0 -9
  126. data/lib/watobo/gui/sites_tree.rb +0 -9
  127. data/lib/watobo/gui/status_bar.rb +0 -9
  128. data/lib/watobo/gui/table_editor.rb +0 -9
  129. data/lib/watobo/gui/tagless_viewer.rb +0 -9
  130. data/lib/watobo/gui/templates/plugin.rb +0 -9
  131. data/lib/watobo/gui/templates/plugin2.rb +92 -100
  132. data/lib/watobo/gui/templates/plugin_base.rb +144 -153
  133. data/lib/watobo/gui/text_viewer.rb +0 -9
  134. data/lib/watobo/gui/transcoder_window.rb +0 -9
  135. data/lib/watobo/gui/utils/gui_utils.rb +0 -9
  136. data/lib/watobo/gui/utils/init_icons.rb +86 -95
  137. data/lib/watobo/gui/utils/load_icons.rb +33 -42
  138. data/lib/watobo/gui/utils/load_plugins.rb +116 -119
  139. data/lib/watobo/gui/utils/master_password.rb +68 -77
  140. data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
  141. data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
  142. data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
  143. data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
  144. data/lib/watobo/gui/utils/session_history.rb +112 -121
  145. data/lib/watobo/gui/workspace_dialog.rb +0 -9
  146. data/lib/watobo/gui/www_auth_dialog.rb +0 -9
  147. data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
  148. data/lib/watobo/http.rb +4 -13
  149. data/lib/watobo/http/cookies/cookies.rb +26 -35
  150. data/lib/watobo/http/data/data.rb +45 -54
  151. data/lib/watobo/http/data/json.rb +47 -55
  152. data/lib/watobo/http/url/url.rb +38 -47
  153. data/lib/watobo/http/xml/xml.rb +124 -130
  154. data/lib/watobo/interceptor.rb +3 -12
  155. data/lib/watobo/interceptor/proxy.rb +742 -739
  156. data/lib/watobo/interceptor/transparent.rb +22 -24
  157. data/lib/watobo/mixins.rb +10 -19
  158. data/lib/watobo/mixins/check_info.rb +27 -36
  159. data/lib/watobo/mixins/httpparser.rb +613 -637
  160. data/lib/watobo/mixins/request_parser.rb +88 -97
  161. data/lib/watobo/mixins/shapers.rb +515 -529
  162. data/lib/watobo/mixins/transcoders.rb +3 -11
  163. data/lib/watobo/parser.rb +1 -10
  164. data/lib/watobo/parser/html.rb +83 -92
  165. data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
  166. data/lib/watobo/sockets.rb +3 -12
  167. data/lib/watobo/sockets/agent.rb +828 -837
  168. data/lib/watobo/sockets/client_socket.rb +308 -312
  169. data/lib/watobo/sockets/connection.rb +401 -410
  170. data/lib/watobo/sockets/http_socket.rb +11 -13
  171. data/lib/watobo/sockets/ntlm_auth.rb +129 -138
  172. data/lib/watobo/utils.rb +10 -19
  173. data/lib/watobo/utils/check_regex.rb +0 -9
  174. data/lib/watobo/utils/copy_object.rb +0 -9
  175. data/lib/watobo/utils/crypto.rb +0 -9
  176. data/lib/watobo/utils/expand_range.rb +23 -32
  177. data/lib/watobo/utils/export_xml.rb +97 -106
  178. data/lib/watobo/utils/file_management.rb +9 -11
  179. data/lib/watobo/utils/hexprint.rb +9 -18
  180. data/lib/watobo/utils/load_chat.rb +0 -9
  181. data/lib/watobo/utils/load_icon.rb +0 -9
  182. data/lib/watobo/utils/ntlm.rb +866 -875
  183. data/lib/watobo/utils/print_debug.rb +12 -21
  184. data/lib/watobo/utils/response_builder.rb +90 -99
  185. data/lib/watobo/utils/response_hash.rb +0 -9
  186. data/lib/watobo/utils/secure_eval.rb +0 -9
  187. data/lib/watobo/utils/strings.rb +10 -19
  188. data/lib/watobo/utils/text2request.rb +0 -9
  189. data/lib/watobo/utils/url.rb +23 -32
  190. data/lib/watobo/utils/utf16.rb +11 -20
  191. data/modules/active/Apache/mod_status.rb +0 -9
  192. data/modules/active/Apache/multiview.rb +151 -160
  193. data/modules/active/Flash/crossdomain.rb +0 -9
  194. data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
  195. data/modules/active/cq5/cq5_default_selectors.rb +106 -115
  196. data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
  197. data/modules/active/directories/dirwalker.rb +0 -9
  198. data/modules/active/discovery/fileextensions.rb +0 -9
  199. data/modules/active/discovery/http_methods.rb +0 -9
  200. data/modules/active/discovery/jsmapfiles.rb +79 -0
  201. data/modules/active/domino/domino_db.rb +68 -76
  202. data/modules/active/dotNET/custom_errors.rb +102 -111
  203. data/modules/active/dotNET/dotnet_files.rb +90 -99
  204. data/modules/active/fileinclusion/lfi_simple.rb +0 -9
  205. data/modules/active/jboss/jboss_basic.rb +0 -9
  206. data/modules/active/sap/business_objects.rb +51 -60
  207. data/modules/active/sap/its_commands.rb +0 -9
  208. data/modules/active/sap/its_service_parameter.rb +0 -9
  209. data/modules/active/sap/its_services.rb +0 -9
  210. data/modules/active/sap/its_xss.rb +0 -9
  211. data/modules/active/shell_shock/shell_shock.rb +139 -148
  212. data/modules/active/siebel/siebel_apps.rb +160 -169
  213. data/modules/active/sqlinjection/sql_boolean.rb +0 -9
  214. data/modules/active/sqlinjection/sql_numerical.rb +198 -0
  215. data/modules/active/sqlinjection/sqli_error.rb +0 -9
  216. data/modules/active/sqlinjection/sqli_timing.rb +220 -229
  217. data/modules/active/struts2/default_handler_ognl.rb +106 -115
  218. data/modules/active/struts2/include_params_ognl.rb +105 -114
  219. data/modules/active/xml/xml_xxe.rb +112 -123
  220. data/modules/active/xss/xss_ng.rb +214 -223
  221. data/modules/active/xss/xss_simple.rb +0 -9
  222. data/modules/passive/ajax.rb +68 -77
  223. data/modules/passive/autocomplete.rb +56 -65
  224. data/modules/passive/cookie_options.rb +0 -9
  225. data/modules/passive/cookie_xss.rb +0 -9
  226. data/modules/passive/detect_code.rb +0 -9
  227. data/modules/passive/detect_fileupload.rb +0 -9
  228. data/modules/passive/detect_infrastructure.rb +0 -9
  229. data/modules/passive/detect_one_time_tokens.rb +0 -9
  230. data/modules/passive/dirindexing.rb +0 -9
  231. data/modules/passive/disclosure_domino.rb +55 -64
  232. data/modules/passive/disclosure_emails.rb +0 -9
  233. data/modules/passive/disclosure_ipaddr.rb +55 -53
  234. data/modules/passive/filename_as_parameter.rb +0 -9
  235. data/modules/passive/form_spotter.rb +0 -9
  236. data/modules/passive/hidden_fields.rb +50 -59
  237. data/modules/passive/hotspots.rb +0 -9
  238. data/modules/passive/in_script_parameter.rb +0 -9
  239. data/modules/passive/json_web_token.rb +93 -0
  240. data/modules/passive/multiple_server_headers.rb +0 -9
  241. data/modules/passive/possible_login.rb +0 -9
  242. data/modules/passive/redirect_url.rb +0 -9
  243. data/modules/passive/redirectionz.rb +0 -9
  244. data/modules/passive/sap-headers.rb +56 -65
  245. data/modules/passive/xss_dom.rb +0 -9
  246. data/plugins/aem/aem.rb +11 -20
  247. data/plugins/aem/gui/main.rb +118 -127
  248. data/plugins/aem/gui/tree_view.rb +171 -180
  249. data/plugins/aem/lib/agent.rb +130 -138
  250. data/plugins/aem/lib/dispatcher.rb +45 -51
  251. data/plugins/aem/lib/engine.rb +177 -186
  252. data/plugins/catalog/catalog.rb +345 -355
  253. data/plugins/crawler/crawler.rb +4 -13
  254. data/plugins/crawler/gui.rb +5 -14
  255. data/plugins/crawler/gui/auth_frame.rb +270 -279
  256. data/plugins/crawler/gui/crawler_gui.rb +271 -276
  257. data/plugins/crawler/gui/general_settings_frame.rb +96 -105
  258. data/plugins/crawler/gui/hooks_frame.rb +80 -89
  259. data/plugins/crawler/gui/scope_frame.rb +50 -59
  260. data/plugins/crawler/gui/settings_tabbook.rb +38 -47
  261. data/plugins/crawler/gui/status_frame.rb +59 -68
  262. data/plugins/crawler/lib/bags.rb +18 -27
  263. data/plugins/crawler/lib/constants.rb +11 -20
  264. data/plugins/crawler/lib/engine.rb +488 -497
  265. data/plugins/crawler/lib/grabber.rb +68 -77
  266. data/plugins/crawler/lib/status.rb +71 -80
  267. data/plugins/crawler/lib/uri_mp.rb +12 -21
  268. data/plugins/filefinder/filefinder.rb +326 -333
  269. data/plugins/sqlmap/bin/test.rb +78 -87
  270. data/plugins/sqlmap/gui.rb +4 -13
  271. data/plugins/sqlmap/gui/main.rb +218 -227
  272. data/plugins/sqlmap/gui/options_frame.rb +97 -106
  273. data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
  274. data/plugins/sqlmap/sqlmap.rb +2 -11
  275. data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
  276. data/plugins/sslchecker/gui/cipher_table.rb +246 -254
  277. data/plugins/sslchecker/gui/gui.rb +258 -264
  278. data/plugins/sslchecker/gui/sslchecker.rb +4 -13
  279. data/plugins/sslchecker/lib/check.rb +127 -133
  280. data/plugins/wshell/gui/main.rb +119 -117
  281. data/plugins/wshell/lib/core.rb +38 -88
  282. data/plugins/wshell/wshell.rb +11 -20
  283. metadata +170 -164
@@ -1,12 +1,3 @@
1
- #.
2
- # interceptor_settings_dialog.rb
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
1
  # @private
11
2
  module Watobo#:nodoc: all
12
3
  module Gui
@@ -0,0 +1,287 @@
1
+ # @private
2
+ module Watobo #:nodoc: all
3
+ module Gui
4
+
5
+ class JsonViewer < FXVerticalFrame
6
+ SEL_TYPE_GREP = 0
7
+ SEL_TYPE_HIGHLIGHT = 1
8
+ attr_accessor :max_len
9
+
10
+ def style=(new_style)
11
+ @simple_text_view.style = new_style
12
+ end
13
+
14
+ def editable=(value)
15
+ @simple_text_view.editable = value
16
+ end
17
+
18
+ def setText(object=nil, prefs={})
19
+
20
+ o = object.nil? ? @object : object
21
+ return false if o.nil?
22
+ #@object = o
23
+ normalized_text = o.to_s
24
+ begin
25
+ jb = JSON.parse(o.body.to_s)
26
+ normalized_text = JSON.pretty_generate jb
27
+ rescue => bang
28
+ normalized_text = "No JSON in body\n\n"
29
+ normalized_text << bang.to_s if $DEBUG
30
+ end
31
+
32
+ @text = normalized_text
33
+ #@text = text
34
+ @simple_text_view.max_len = -1
35
+ @simple_text_view.setText(normalized_text, prefs)
36
+ @match_pos_label.text = "0/0"
37
+ @match_pos_label.textColor = 'grey'
38
+
39
+ applyFilter() if @auto_apply_cbtn.checked?
40
+ end
41
+
42
+ def highlight(pattern)
43
+ highlightPattern(pattern)
44
+ end
45
+
46
+ def setFont(font_type=nil, size=nil)
47
+ @simple_text_view.setFont(font_type, size)
48
+ end
49
+
50
+ def getText
51
+ @simple_text_view.textbox.to_s
52
+ end
53
+
54
+ def initialize(owner, opts)
55
+ super(owner, opts)
56
+
57
+ @text_matches = []
58
+
59
+ @style = 2 # default style
60
+ @text = ''
61
+ @object = nil
62
+ @max_len = 5000
63
+ @filter_mode = SEL_TYPE_HIGHLIGHT
64
+ @cur_match_pos = 0
65
+ @text_dt = FXDataTarget.new('')
66
+ @filter_dt = FXDataTarget.new('')
67
+
68
+ @handler = nil
69
+ @handler_file = nil
70
+ @handler_path = nil
71
+
72
+ # @handler_ctrl = ViewerHandlerCtrl.new(self)
73
+
74
+ text_view_header = FXHorizontalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_SIDE_BOTTOM|LAYOUT_FIX_HEIGHT, :height => 24, :padding => 0)
75
+
76
+ #@auto_apply_cbtn.connect(SEL_COMMAND, method(:onInterceptChanged))
77
+
78
+ pmatch_btn = FXButton.new(text_view_header, "<", nil, nil, 0, FRAME_RAISED|LAYOUT_FILL_Y)
79
+ @match_pos_label = FXLabel.new(text_view_header, "0/0", :opts => LAYOUT_FILL_Y)
80
+ @match_pos_label.textColor = 'grey'
81
+ pmatch_btn.connect(SEL_COMMAND) { gotoPrevMatch() }
82
+ nmatch_btn = FXButton.new(text_view_header, ">", nil, nil, 0, FRAME_RAISED|LAYOUT_FILL_Y)
83
+ nmatch_btn.connect(SEL_COMMAND) { gotoNextMatch() }
84
+
85
+ # @filter_text = FXTextField.new(text_view_header, 10,
86
+ # :target => @filter_dt, :selector => FXDataTarget::ID_VALUE,
87
+ # :opts => FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y)
88
+
89
+ @filter_text = FXComboBox.new(text_view_header, 20, @filter_dt, 0, FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
90
+ @filter_text.connect(SEL_COMMAND) {
91
+ applyFilter()
92
+ addFilterHistory()
93
+ }
94
+
95
+ @filter_text.connect(SEL_CHANGED) {
96
+ applyFilter()
97
+ }
98
+
99
+ menu = FXMenuPane.new(self)
100
+ FXMenuCommand.new(menu, "&Highlight").connect(SEL_COMMAND) {
101
+ @filter_mode = SEL_TYPE_HIGHLIGHT
102
+ applyFilter()
103
+ @mode_btn.text = "Highlight"
104
+ } #, method(:switchMethod))
105
+ FXMenuCommand.new(menu, "&Grep").connect(SEL_COMMAND) {
106
+ @filter_mode = SEL_TYPE_GREP
107
+ applyFilter()
108
+ @mode_btn.text = "Grep"
109
+ } #, method(:switchMethod))
110
+
111
+ @auto_apply_cbtn = FXCheckButton.new(text_view_header, "auto-apply", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP|LAYOUT_RIGHT|LAYOUT_FILL_Y)
112
+ @mode_btn = FXMenuButton.new(text_view_header, "Highlight", nil, menu,
113
+ :opts => MENUBUTTON_DOWN|FRAME_RAISED|FRAME_THICK|ICON_AFTER_TEXT|LAYOUT_RIGHT|LAYOUT_FILL_Y)
114
+
115
+ reset_button = FXButton.new(text_view_header, "&Reset", nil, nil, 0, FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y)
116
+ reset_button.connect(SEL_COMMAND) { resetFilter() }
117
+
118
+ text_box_frame = FXVerticalFrame.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding => 0)
119
+
120
+ @simple_text_view = SimpleTextView.new(text_box_frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
121
+ @simple_text_view.style = 1
122
+ @simple_text_view.editable = false
123
+ @simple_text_view.textStyle -= TEXT_WORDWRAP
124
+
125
+ addHotkeyHandler(@simple_text_view.textbox)
126
+ addHotkeyHandler(@filter_text)
127
+
128
+ @filter_dt.connect(SEL_COMMAND) { applyFilter() }
129
+
130
+ end
131
+
132
+ def applyFilter
133
+ pattern = @filter_text.text
134
+ @match_pos_label.text = "0/0"
135
+ @simple_text_view.resetMatches()
136
+ @simple_text_view.setText(@text)
137
+ @match_pos_label.textColor = 'grey'
138
+ return true if pattern == ''
139
+ case @filter_mode
140
+ when SEL_TYPE_GREP
141
+ grepPattern(pattern)
142
+ when SEL_TYPE_HIGHLIGHT
143
+ highlightPattern(pattern)
144
+ end
145
+ end
146
+
147
+ private
148
+
149
+ def gotoNextMatch()
150
+ @cur_match_pos += 1 if @cur_match_pos < @simple_text_view.numMatches-1
151
+ @simple_text_view.makeMatchVisible(@cur_match_pos)
152
+ @match_pos_label.text = "#{@cur_match_pos+1}/#{@simple_text_view.numMatches}" if @simple_text_view.numMatches > 0
153
+ end
154
+
155
+ def gotoPrevMatch()
156
+ @cur_match_pos -= 1 if @cur_match_pos > 0
157
+ @simple_text_view.makeMatchVisible(@cur_match_pos)
158
+ @match_pos_label.text = "#{@cur_match_pos+1}/#{@simple_text_view.numMatches}" if @simple_text_view.numMatches > 0
159
+ end
160
+
161
+ def addFilterHistory()
162
+ text = @filter_text.text
163
+ return true if text == ''
164
+ has_item = false
165
+ @filter_text.each do |item, data|
166
+ has_item = true if data == text
167
+ end
168
+ @filter_text.appendItem(text, text) unless has_item == true
169
+ @filter_text.numVisible = @filter_text.numItems
170
+ end
171
+
172
+ def resetFilter
173
+ @simple_text_view.max_len = 0
174
+ @simple_text_view.setText(@text)
175
+ @match_pos_label.text = "0/0"
176
+ @match_pos_label.textColor = 'grey'
177
+ @filter_text.text = ''
178
+ end
179
+
180
+ def highlightPattern(pattern)
181
+ @cur_match_pos = 0
182
+ @simple_text_view.max_len = 0
183
+
184
+ @match_pos_label.textColor = 'black'
185
+
186
+ @simple_text_view.setText(@text)
187
+ @simple_text_view.highlight(pattern)
188
+ @match_pos_label.text = "0/#{@simple_text_view.numMatches()}"
189
+
190
+ @simple_text_view.makeMatchVisible(0)
191
+
192
+ @match_pos_label.text = "1/#{@simple_text_view.numMatches()}" if @simple_text_view.numMatches() > 0
193
+
194
+ end
195
+
196
+ def grepPattern(pattern)
197
+ @cur_match_pos = 0
198
+ @simple_text_view.max_len = 0
199
+
200
+ @match_pos_label.textColor = 'black'
201
+
202
+ @simple_text_view.setText(@text)
203
+
204
+ @simple_text_view.filter(pattern)
205
+ @match_pos_label.text = "0/#{@simple_text_view.numMatches()}"
206
+ @simple_text_view.highlight(pattern)
207
+ @simple_text_view.makeMatchVisible(0)
208
+
209
+ @filter_mode = SEL_TYPE_GREP
210
+
211
+ @match_pos_label.text = "1/#{@simple_text_view.numMatches()}" if @simple_text_view.numMatches() > 0
212
+
213
+ end
214
+
215
+ def addHotkeyHandler(widget)
216
+ @ctrl_pressed = false
217
+
218
+ widget.connect(SEL_KEYPRESS) { |sender, sel, event|
219
+ # puts event.code
220
+ @ctrl_pressed = true if event.code == KEY_Control_L or event.code == KEY_Control_R
221
+ # @shift_pressed = true if @ctrl_pressed and ( event.code == KEY_Shift_L or event.code == KEY_Shift_R )
222
+ if event.code == KEY_Return
223
+ highlight(@filter_text.text)
224
+ true # special handling of KEY_Return, because we don't want a linebreak in textbox.
225
+ end
226
+
227
+ if event.code == KEY_F1
228
+
229
+ unless event.moved?
230
+ FXMenuPane.new(self) do |menu_pane|
231
+ FXMenuCaption.new(menu_pane, "Hotkeys:")
232
+ FXMenuSeparator.new(menu_pane)
233
+ ["<ctrl-r> - Reset Filter",
234
+ "<ctrl-g> - Grep",
235
+ "<ctrl-h> - Highlight",
236
+ "<ctrl-n> - Goto Next",
237
+ "<ctrl-shift-n> - Goto Prev",
238
+ "<ctrl-w> - Switch Wordwrap"
239
+ ].each do |hk|
240
+ FXMenuCaption.new(menu_pane, hk).backColor = 'yellow'
241
+ end
242
+
243
+ menu_pane.create
244
+ menu_pane.popup(nil, event.root_x, event.root_y)
245
+ app.runModalWhileShown(menu_pane)
246
+ end
247
+
248
+ end
249
+ end
250
+
251
+ if @ctrl_pressed
252
+ case event.code
253
+ when KEY_n
254
+ gotoNextMatch()
255
+ addFilterHistory()
256
+ when KEY_N
257
+ gotoPrevMatch()
258
+ addFilterHistory()
259
+ when KEY_w
260
+ @simple_text_view.textbox.textStyle ^= TEXT_WORDWRAP
261
+ when KEY_h
262
+ @mode_btn.text = "Highlight"
263
+ @filter_mode = SEL_TYPE_HIGHLIGHT
264
+ addFilterHistory()
265
+ applyFilter()
266
+ when KEY_g
267
+ @mode_btn.text = "Grep"
268
+ @filter_mode = SEL_TYPE_GREP
269
+ addFilterHistory()
270
+ applyFilter()
271
+ when KEY_r
272
+ resetFilter()
273
+
274
+ end
275
+ end
276
+ false
277
+ }
278
+
279
+ widget.connect(SEL_KEYRELEASE) { |sender, sel, event|
280
+ @ctrl_pressed = false if event.code == KEY_Control_L or event.code == KEY_Control_R
281
+ false
282
+ }
283
+ end
284
+
285
+ end
286
+ end
287
+ end
@@ -1,112 +1,103 @@
1
- #.
2
- # list_box.rb
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
1
  # @private
11
- module Watobo#:nodoc: all
12
- module Gui
13
- class ListBox < FXGroupBox
14
- def to_a
15
- a=[]
16
- @list.each do |i|
17
- a << i.to_s
18
- end
19
- a
20
- end
21
-
22
- def set(list)
23
- @list.clearItems
24
- list.each do |le|
25
- addPattern(le)
26
- end
27
- end
28
-
29
- def append(list)
30
- if list.is_a? Array
31
- list.each do |e|
32
- addPattern(e) if e.is_a? String
33
- end
34
- elsif list.is_a? String
35
- addPattern(list)
36
- else
37
- raise ArgumentError, "Need String or Array"
38
- end
39
- end
40
-
41
- def removePattern(pattern)
42
- index = @list.currentItem
43
- if index >= 0
44
- @list.removeItem(index)
45
- end
46
- end
47
-
48
- def addPattern(pattern)
49
- if pattern != "" then
50
- pattern_ok, *error = Watobo::Utils.checkRegex(pattern)
51
- if pattern_ok == true
52
- item = @list.appendItem("#{pattern}")
53
- @list.setItemData(item, pattern)
54
- @list.sortItems()
55
-
56
- else
57
- FXMessageBox.information(self, MBOX_OK, "Wrong Path Format", "Path must be a Regex!!!\nError: #{error.join('\n')}")
58
- end
59
- end
60
- end
61
-
62
- def initialize(owner, title="", info_text="", opts= LAYOUT_SIDE_RIGHT|FRAME_GROOVE|LAYOUT_FILL_X)
63
- gbframe = super(owner, title, opts , 0, 0, 0, 0)
64
- frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X, :padding => 0)
65
-
66
- unless info_text.empty?
67
- fxtext = FXText.new(frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|TEXT_WORDWRAP)
68
- fxtext.backColor = fxtext.parent.backColor
69
- fxtext.disable
70
- text = "#{info_text}"
71
- fxtext.setText(text)
72
- end
73
-
74
- input_frame = FXHorizontalFrame.new(frame, :opts => LAYOUT_FILL_X)
75
- #@text = FXTextField.new(input_frame, 20, :target => @expath_dt, :selector => FXDataTarget::ID_VALUE, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_LEFT|LAYOUT_FILL_X)
76
- @text = FXTextField.new(input_frame, 20, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_LEFT|LAYOUT_FILL_X)
77
- @rem_btn = FXButton.new(input_frame, "Remove" , :opts => BUTTON_NORMAL|BUTTON_DEFAULT|LAYOUT_RIGHT)
78
- @add_btn = FXButton.new(input_frame, "Add" , :opts => BUTTON_NORMAL|BUTTON_DEFAULT|LAYOUT_RIGHT)
79
-
80
- list_frame = FXVerticalFrame.new(frame, :opts => LAYOUT_FILL_X|FRAME_SUNKEN, :padding => 0)
81
- @list = FXList.new(list_frame, :opts => LIST_EXTENDEDSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
82
- @list.numVisible = 5
83
-
84
- @list.connect(SEL_COMMAND){ |sender, sel, item|
85
- @text.text = sender.getItemText(item)
86
- @text.handle(self, FXSEL(SEL_UPDATE, 0), nil)
87
- }
88
-
89
- @rem_btn.connect(SEL_COMMAND){ |sender, sel, item|
90
- removePattern(@text.text) if @text.text != ''
91
- @text.text = ''
92
- @text.handle(self, FXSEL(SEL_UPDATE, 0), nil)
93
- }
94
-
95
- @text.connect(SEL_COMMAND){
96
- @add_btn.setFocus()
97
- # @add_btn.setDefault()
98
-
99
- }
100
-
101
- @add_btn.connect(SEL_COMMAND){ |sender, sel, item|
102
-
103
- addPattern(@text.text) if @text.text != ''
104
- @text.text = ''
105
- @text.handle(self, FXSEL(SEL_UPDATE, 0), nil)
106
- @text.setFocus()
107
- #@text.setDefault()
108
- }
109
- end
110
- end
111
- end
2
+ module Watobo#:nodoc: all
3
+ module Gui
4
+ class ListBox < FXGroupBox
5
+ def to_a
6
+ a=[]
7
+ @list.each do |i|
8
+ a << i.to_s
9
+ end
10
+ a
11
+ end
12
+
13
+ def set(list)
14
+ @list.clearItems
15
+ list.each do |le|
16
+ addPattern(le)
17
+ end
18
+ end
19
+
20
+ def append(list)
21
+ if list.is_a? Array
22
+ list.each do |e|
23
+ addPattern(e) if e.is_a? String
24
+ end
25
+ elsif list.is_a? String
26
+ addPattern(list)
27
+ else
28
+ raise ArgumentError, "Need String or Array"
29
+ end
30
+ end
31
+
32
+ def removePattern(pattern)
33
+ index = @list.currentItem
34
+ if index >= 0
35
+ @list.removeItem(index)
36
+ end
37
+ end
38
+
39
+ def addPattern(pattern)
40
+ if pattern != "" then
41
+ pattern_ok, *error = Watobo::Utils.checkRegex(pattern)
42
+ if pattern_ok == true
43
+ item = @list.appendItem("#{pattern}")
44
+ @list.setItemData(item, pattern)
45
+ @list.sortItems()
46
+
47
+ else
48
+ FXMessageBox.information(self, MBOX_OK, "Wrong Path Format", "Path must be a Regex!!!\nError: #{error.join('\n')}")
49
+ end
50
+ end
51
+ end
52
+
53
+ def initialize(owner, title="", info_text="", opts= LAYOUT_SIDE_RIGHT|FRAME_GROOVE|LAYOUT_FILL_X)
54
+ gbframe = super(owner, title, opts , 0, 0, 0, 0)
55
+ frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X, :padding => 0)
56
+
57
+ unless info_text.empty?
58
+ fxtext = FXText.new(frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|TEXT_WORDWRAP)
59
+ fxtext.backColor = fxtext.parent.backColor
60
+ fxtext.disable
61
+ text = "#{info_text}"
62
+ fxtext.setText(text)
63
+ end
64
+
65
+ input_frame = FXHorizontalFrame.new(frame, :opts => LAYOUT_FILL_X)
66
+ #@text = FXTextField.new(input_frame, 20, :target => @expath_dt, :selector => FXDataTarget::ID_VALUE, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_LEFT|LAYOUT_FILL_X)
67
+ @text = FXTextField.new(input_frame, 20, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_LEFT|LAYOUT_FILL_X)
68
+ @rem_btn = FXButton.new(input_frame, "Remove" , :opts => BUTTON_NORMAL|BUTTON_DEFAULT|LAYOUT_RIGHT)
69
+ @add_btn = FXButton.new(input_frame, "Add" , :opts => BUTTON_NORMAL|BUTTON_DEFAULT|LAYOUT_RIGHT)
70
+
71
+ list_frame = FXVerticalFrame.new(frame, :opts => LAYOUT_FILL_X|FRAME_SUNKEN, :padding => 0)
72
+ @list = FXList.new(list_frame, :opts => LIST_EXTENDEDSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
73
+ @list.numVisible = 5
74
+
75
+ @list.connect(SEL_COMMAND){ |sender, sel, item|
76
+ @text.text = sender.getItemText(item)
77
+ @text.handle(self, FXSEL(SEL_UPDATE, 0), nil)
78
+ }
79
+
80
+ @rem_btn.connect(SEL_COMMAND){ |sender, sel, item|
81
+ removePattern(@text.text) if @text.text != ''
82
+ @text.text = ''
83
+ @text.handle(self, FXSEL(SEL_UPDATE, 0), nil)
84
+ }
85
+
86
+ @text.connect(SEL_COMMAND){
87
+ @add_btn.setFocus()
88
+ # @add_btn.setDefault()
89
+
90
+ }
91
+
92
+ @add_btn.connect(SEL_COMMAND){ |sender, sel, item|
93
+
94
+ addPattern(@text.text) if @text.text != ''
95
+ @text.text = ''
96
+ @text.handle(self, FXSEL(SEL_UPDATE, 0), nil)
97
+ @text.setFocus()
98
+ #@text.setDefault()
99
+ }
100
+ end
101
+ end
102
+ end
112
103
  end