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,13 +1,4 @@
1
- #.
2
- # crawler.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
- %w( constants bags grabber engine uri_mp status ).each do |l|
11
- require_relative File.join("lib", l)
12
- end
13
-
1
+ %w( constants bags grabber engine uri_mp status ).each do |l|
2
+ require_relative File.join("lib", l)
3
+ end
4
+
@@ -1,15 +1,6 @@
1
- #.
2
- # gui.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
1
+ require_relative 'crawler.rb'
9
2
 
10
- require_relative 'crawler.rb'
11
-
12
- %w( crawler_gui settings_tabbook general_settings_frame status_frame hooks_frame auth_frame scope_frame ).each do |l|
13
- #puts "Loading >> #{l}"
14
- require_relative File.join("gui", l)
15
- end
3
+ %w( crawler_gui settings_tabbook general_settings_frame status_frame hooks_frame auth_frame scope_frame ).each do |l|
4
+ #puts "Loading >> #{l}"
5
+ require_relative File.join("gui", l)
6
+ end
@@ -1,105 +1,96 @@
1
- #.
2
- # auth_frame.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 Plugin
13
- module Crawler
14
- class Gui
15
- class FormFieldsTable < FXTable
16
- def subscribe(event, &callback)
17
- (@event_dispatcher_listeners[event] ||= []) << callback
18
- end
19
-
20
- def clearEvents(event)
21
- @event_dispatcher_listener[event].clear
22
- end
23
-
24
- def update_fields
25
- self.getNumRows.times do |i|
26
- self.getItemData(i,0).value = self.getItemText(i,2)
27
- end
28
- end
29
-
30
- def clear_fields
31
- initTable
32
- end
33
-
34
- def initialize(owner, opts={})
35
- super(owner, opts)
36
-
37
- @event_dispatcher_listeners = Hash.new
38
- initTable()
39
-
40
- self.connect(SEL_COMMAND, method(:onTableClick))
41
-
42
- self.columnHeader.connect(SEL_COMMAND) do |sender, sel, index|
43
- # self.fitColumnsToContents(index)
44
- end
45
- end
46
-
47
- def add_field(field)
48
- lastRowIndex = self.getNumRows
49
- self.appendRows(1)
50
- self.setItemData(lastRowIndex, 0, field)
51
- self.setItemText(lastRowIndex, 0, field.name)
52
- self.getItem(lastRowIndex, 0).justify = FXTableItem::LEFT
53
- self.setItemText(lastRowIndex, 1, field.type)
54
- puts field.methods.sort
55
- self.getItem(lastRowIndex, 1).justify = FXTableItem::LEFT
56
- self.setItemText(lastRowIndex, 2, field.value)
57
- self.getItem(lastRowIndex, 2).justify = FXTableItem::LEFT
58
-
59
- end
60
- private
61
-
62
- def onTableClick(sender, sel, item)
63
- begin
64
- row = item.row
65
- self.selectRow(row, false)
66
- self.startInput(row,2)
67
- rescue => bang
68
- puts bang
69
- end
70
- end
71
-
72
- def notify(event, *args)
73
- if @event_dispatcher_listeners[event]
74
- @event_dispatcher_listeners[event].each do |m|
75
- m.call(*args) if m.respond_to? :call
76
- end
77
- end
78
- end
79
-
80
- def initTable
81
- self.clearItems()
82
- self.setTableSize(0, 3)
83
-
84
- self.setColumnText( 0, "Name" )
85
- self.setColumnText( 1, "Type" )
86
- self.setColumnText( 2, "Value" )
87
-
88
- self.rowHeader.width = 0
89
- self.setColumnWidth(0, 100)
90
- self.setColumnWidth(1, 100)
91
- self.setColumnWidth(2, 100)
92
- end
93
- end
94
-
95
- class AuthFrame < FXVerticalFrame
96
- attr_accessor :crawler
97
- def subscribe(event, &callback)
98
- (@event_dispatcher_listeners[event] ||= []) << callback
99
- end
100
-
101
- def clearEvents(event)
102
- @event_dispatcher_listener[event].clear
2
+ module Watobo#:nodoc: all
3
+ module Plugin
4
+ module Crawler
5
+ class Gui
6
+ class FormFieldsTable < FXTable
7
+ def subscribe(event, &callback)
8
+ (@event_dispatcher_listeners[event] ||= []) << callback
9
+ end
10
+
11
+ def clearEvents(event)
12
+ @event_dispatcher_listener[event].clear
13
+ end
14
+
15
+ def update_fields
16
+ self.getNumRows.times do |i|
17
+ self.getItemData(i,0).value = self.getItemText(i,2)
18
+ end
19
+ end
20
+
21
+ def clear_fields
22
+ initTable
23
+ end
24
+
25
+ def initialize(owner, opts={})
26
+ super(owner, opts)
27
+
28
+ @event_dispatcher_listeners = Hash.new
29
+ initTable()
30
+
31
+ self.connect(SEL_COMMAND, method(:onTableClick))
32
+
33
+ self.columnHeader.connect(SEL_COMMAND) do |sender, sel, index|
34
+ # self.fitColumnsToContents(index)
35
+ end
36
+ end
37
+
38
+ def add_field(field)
39
+ lastRowIndex = self.getNumRows
40
+ self.appendRows(1)
41
+ self.setItemData(lastRowIndex, 0, field)
42
+ self.setItemText(lastRowIndex, 0, field.name)
43
+ self.getItem(lastRowIndex, 0).justify = FXTableItem::LEFT
44
+ self.setItemText(lastRowIndex, 1, field.type)
45
+ puts field.methods.sort
46
+ self.getItem(lastRowIndex, 1).justify = FXTableItem::LEFT
47
+ self.setItemText(lastRowIndex, 2, field.value)
48
+ self.getItem(lastRowIndex, 2).justify = FXTableItem::LEFT
49
+
50
+ end
51
+ private
52
+
53
+ def onTableClick(sender, sel, item)
54
+ begin
55
+ row = item.row
56
+ self.selectRow(row, false)
57
+ self.startInput(row,2)
58
+ rescue => bang
59
+ puts bang
60
+ end
61
+ end
62
+
63
+ def notify(event, *args)
64
+ if @event_dispatcher_listeners[event]
65
+ @event_dispatcher_listeners[event].each do |m|
66
+ m.call(*args) if m.respond_to? :call
67
+ end
68
+ end
69
+ end
70
+
71
+ def initTable
72
+ self.clearItems()
73
+ self.setTableSize(0, 3)
74
+
75
+ self.setColumnText( 0, "Name" )
76
+ self.setColumnText( 1, "Type" )
77
+ self.setColumnText( 2, "Value" )
78
+
79
+ self.rowHeader.width = 0
80
+ self.setColumnWidth(0, 100)
81
+ self.setColumnWidth(1, 100)
82
+ self.setColumnWidth(2, 100)
83
+ end
84
+ end
85
+
86
+ class AuthFrame < FXVerticalFrame
87
+ attr_accessor :crawler
88
+ def subscribe(event, &callback)
89
+ (@event_dispatcher_listeners[event] ||= []) << callback
90
+ end
91
+
92
+ def clearEvents(event)
93
+ @event_dispatcher_listener[event].clear
103
94
  end
104
95
 
105
96
  def set(settings)
@@ -115,182 +106,182 @@ module Watobo#:nodoc: all
115
106
  @switcher.current = @auth_type_dt.value
116
107
  update_form
117
108
  return true
118
- end
119
-
120
- def to_h
121
- a = case @auth_type_dt.value
122
- when 0
123
- {
124
- :auth_type => :none
125
- }
126
- when 1
127
- {
128
- :auth_type => :basic,
129
- :username => @basic_auth_user_txt.text,
130
- :password => @basic_auth_passwd_txt.text,
131
- :retype => @basic_auth_retype_txt.text
132
- # :uri => URI.parse
133
- }
134
- when 2
135
- @form_fields_table.update_fields
136
-
137
- {
138
- :auth_type => :form,
139
- :form => @auth_form,
140
- :cookie_jar => @agent.respond_to?(:cookie_jar) ? @agent.cookie_jar : nil
141
- }
142
- end
143
- a
144
-
145
- end
146
-
147
- # def set(settings)
148
- # @form_auth_url_txt.text = settings[:form_auth_url].to_s if settings.has_key? :form_auth_url
149
- # update_form
150
- # end
151
-
152
- def update_form
153
- [ @form_auth_url_txt, @no_auth_rb, @basic_auth_rb, @form_auth_rb ].each do |e|
154
- e.handle(self, FXSEL(SEL_UPDATE, 0), nil)
155
- end
156
- end
157
-
158
- def initialize(owner, opts={})
159
- super(owner, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_THICK|FRAME_RAISED, :padding => 0)
160
- frame = FXHorizontalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
161
- #left_frm = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_Y|FRAME_NONE)
162
- @event_dispatcher_listeners = Hash.new
163
- @crawler = opts[:crawler] if opts.has_key? :crawler
164
- @start_url = ""
165
-
166
- auth_gb= FXGroupBox.new(frame, "Authentication", LAYOUT_SIDE_RIGHT|FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0, 0, 0, 0)
167
- auth_frm = FXVerticalFrame.new(auth_gb, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
168
- @auth_form = nil
169
- @auth_type_dt = FXDataTarget.new(0)
170
-
171
- @no_auth_rb = FXRadioButton.new(auth_frm, "None", @auth_type_dt, FXDataTarget::ID_OPTION)
172
-
173
- @basic_auth_rb = FXRadioButton.new(auth_frm, "Basic", @auth_type_dt, FXDataTarget::ID_OPTION + 1)
174
-
175
- @form_auth_rb = FXRadioButton.new(auth_frm, "Form", @auth_type_dt, FXDataTarget::ID_OPTION + 2)
176
-
177
- # group_box = FXGroupBox.new(self, "Collection",LAYOUT_SIDE_TOP|FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0, 0, 0, 0)
178
- # frame = FXVerticalFrame.new(group_box, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_GROOVE)
179
- # @collectionList = FXList.new(frame, :opts => LIST_EXTENDEDSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
180
-
181
- @switcher = FXSwitcher.new(auth_frm,LAYOUT_FILL_X|LAYOUT_FILL_Y)
182
- frame = FXHorizontalFrame.new(@switcher, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
183
- FXLabel.new(frame, "No Authentication Selected", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
184
- frame = FXHorizontalFrame.new(@switcher, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
185
- FXLabel.new(frame, "Username:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
186
- @basic_auth_user_txt = FXTextField.new(frame, 10, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT)
187
- FXLabel.new(frame, "Password:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
188
- @basic_auth_passwd_txt = FXTextField.new(frame, 10, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT|TEXTFIELD_PASSWD)
189
- FXLabel.new(frame, "Retype:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
190
- @basic_auth_retype_txt = FXTextField.new(frame, 10, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT|TEXTFIELD_PASSWD)
191
-
192
- form_auth_frame = FXVerticalFrame.new(@switcher, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
193
- frame = FXHorizontalFrame.new(form_auth_frame, :opts => LAYOUT_FILL_X|FRAME_NONE)
194
- FXLabel.new(frame, "URL of LoginForm, leave empty to use Start URL:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
195
- @form_auth_url_txt = FXTextField.new(frame, 10, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_FILL_X)
196
- @fetch_button = FXButton.new(frame, "load page", :opts => BUTTON_DEFAULT|BUTTON_NORMAL )
197
-
198
- form_frame = FXHorizontalFrame.new(form_auth_frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
199
- frame = FXHorizontalFrame.new(form_frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding => 0)
200
- @page_tree = Watobo::Gui::PageTree.new(frame)
201
- frame = FXHorizontalFrame.new(form_frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_THICK)
202
- @form_fields_table = FormFieldsTable.new(frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
203
-
204
- @auth_type_dt.connect(SEL_COMMAND) {
205
- @basic_auth_rb.handle(self, FXSEL(SEL_UPDATE, 0), nil)
206
- @form_auth_rb.handle(self, FXSEL(SEL_UPDATE, 0), nil)
207
- @no_auth_rb.handle(self, FXSEL(SEL_UPDATE, 0), nil)
208
- @switcher.current = @auth_type_dt.value
209
- }
210
-
211
- @basic_auth_passwd_txt.connect(SEL_CHANGED){ password_check }
212
- @basic_auth_retype_txt.connect(SEL_CHANGED){ password_check }
213
-
214
- @fetch_button.connect(SEL_COMMAND){
215
- begin
216
- @form_fields_table.clear_fields
217
- @page_tree.clearItems
218
-
219
- page = nil
220
- url = nil
221
-
222
- if @form_auth_url_txt.text.empty?
223
- unless Watobo::Plugin::Crawler.start_url.nil?
224
- uri = Watobo::Plugin::Crawler.start_url
225
- end
226
- else
227
- url = @form_auth_url_txt.text unless @form_auth_url_txt.text.empty?
228
- uri = URI.parse(url)
229
- end
230
-
231
- notify(:log, "GET PAGE << #{uri.to_s}")
232
- @agent, page = @crawler.get_page(uri)
233
- notify(:log, "PAGE LOADED")
234
- @page_tree.page = page
235
- rescue => bang
236
- notify(:log, "could not get page #{uri.to_s}")
237
- puts "Could not get page for #{uri.to_s}"
238
- puts bang
239
- puts bang.backtrace if $DEBUG
240
- end
241
- true
242
- }
243
- @switcher.current = @auth_type_dt.value
244
-
245
- @page_tree.subscribe(:form_selected){|form|
246
- @auth_form = form
247
- @form_fields_table.clear_fields
248
- form.fields.each do |field|
249
- @form_fields_table.add_field field
250
- end
251
- form.buttons.each do |field|
252
- @form_fields_table.add_field field
253
- end
254
- }
255
-
256
- end
257
-
258
- private
259
-
260
- def password_check
261
- unless @basic_auth_passwd_txt.text == @basic_auth_retype_txt.text
262
- @basic_auth_retype_txt.backColor = FXColor::Red
263
- else
264
- @basic_auth_retype_txt.backColor = FXColor::Green
265
- end
266
- end
267
-
268
- def notify(event, *args)
269
- if @event_dispatcher_listeners[event]
270
- @event_dispatcher_listeners[event].each do |m|
271
- m.call(*args) if m.respond_to? :call
272
- end
273
- end
274
- end
275
-
276
- def enable_basic_auth
277
-
278
- end
279
-
280
- def disable_basic_auth
281
-
282
- end
283
-
284
- def enable_form_auth
285
-
286
- end
287
-
288
- def disable_form_auth
289
-
290
- end
291
-
292
- end
293
- end
294
- end
295
- end
109
+ end
110
+
111
+ def to_h
112
+ a = case @auth_type_dt.value
113
+ when 0
114
+ {
115
+ :auth_type => :none
116
+ }
117
+ when 1
118
+ {
119
+ :auth_type => :basic,
120
+ :username => @basic_auth_user_txt.text,
121
+ :password => @basic_auth_passwd_txt.text,
122
+ :retype => @basic_auth_retype_txt.text
123
+ # :uri => URI.parse
124
+ }
125
+ when 2
126
+ @form_fields_table.update_fields
127
+
128
+ {
129
+ :auth_type => :form,
130
+ :form => @auth_form,
131
+ :cookie_jar => @agent.respond_to?(:cookie_jar) ? @agent.cookie_jar : nil
132
+ }
133
+ end
134
+ a
135
+
136
+ end
137
+
138
+ # def set(settings)
139
+ # @form_auth_url_txt.text = settings[:form_auth_url].to_s if settings.has_key? :form_auth_url
140
+ # update_form
141
+ # end
142
+
143
+ def update_form
144
+ [ @form_auth_url_txt, @no_auth_rb, @basic_auth_rb, @form_auth_rb ].each do |e|
145
+ e.handle(self, FXSEL(SEL_UPDATE, 0), nil)
146
+ end
147
+ end
148
+
149
+ def initialize(owner, opts={})
150
+ super(owner, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_THICK|FRAME_RAISED, :padding => 0)
151
+ frame = FXHorizontalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
152
+ #left_frm = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_Y|FRAME_NONE)
153
+ @event_dispatcher_listeners = Hash.new
154
+ @crawler = opts[:crawler] if opts.has_key? :crawler
155
+ @start_url = ""
156
+
157
+ auth_gb= FXGroupBox.new(frame, "Authentication", LAYOUT_SIDE_RIGHT|FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0, 0, 0, 0)
158
+ auth_frm = FXVerticalFrame.new(auth_gb, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
159
+ @auth_form = nil
160
+ @auth_type_dt = FXDataTarget.new(0)
161
+
162
+ @no_auth_rb = FXRadioButton.new(auth_frm, "None", @auth_type_dt, FXDataTarget::ID_OPTION)
163
+
164
+ @basic_auth_rb = FXRadioButton.new(auth_frm, "Basic", @auth_type_dt, FXDataTarget::ID_OPTION + 1)
165
+
166
+ @form_auth_rb = FXRadioButton.new(auth_frm, "Form", @auth_type_dt, FXDataTarget::ID_OPTION + 2)
167
+
168
+ # group_box = FXGroupBox.new(self, "Collection",LAYOUT_SIDE_TOP|FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0, 0, 0, 0)
169
+ # frame = FXVerticalFrame.new(group_box, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_GROOVE)
170
+ # @collectionList = FXList.new(frame, :opts => LIST_EXTENDEDSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
171
+
172
+ @switcher = FXSwitcher.new(auth_frm,LAYOUT_FILL_X|LAYOUT_FILL_Y)
173
+ frame = FXHorizontalFrame.new(@switcher, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
174
+ FXLabel.new(frame, "No Authentication Selected", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
175
+ frame = FXHorizontalFrame.new(@switcher, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
176
+ FXLabel.new(frame, "Username:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
177
+ @basic_auth_user_txt = FXTextField.new(frame, 10, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT)
178
+ FXLabel.new(frame, "Password:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
179
+ @basic_auth_passwd_txt = FXTextField.new(frame, 10, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT|TEXTFIELD_PASSWD)
180
+ FXLabel.new(frame, "Retype:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
181
+ @basic_auth_retype_txt = FXTextField.new(frame, 10, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT|TEXTFIELD_PASSWD)
182
+
183
+ form_auth_frame = FXVerticalFrame.new(@switcher, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
184
+ frame = FXHorizontalFrame.new(form_auth_frame, :opts => LAYOUT_FILL_X|FRAME_NONE)
185
+ FXLabel.new(frame, "URL of LoginForm, leave empty to use Start URL:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
186
+ @form_auth_url_txt = FXTextField.new(frame, 10, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_FILL_X)
187
+ @fetch_button = FXButton.new(frame, "load page", :opts => BUTTON_DEFAULT|BUTTON_NORMAL )
188
+
189
+ form_frame = FXHorizontalFrame.new(form_auth_frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_NONE)
190
+ frame = FXHorizontalFrame.new(form_frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding => 0)
191
+ @page_tree = Watobo::Gui::PageTree.new(frame)
192
+ frame = FXHorizontalFrame.new(form_frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_THICK)
193
+ @form_fields_table = FormFieldsTable.new(frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
194
+
195
+ @auth_type_dt.connect(SEL_COMMAND) {
196
+ @basic_auth_rb.handle(self, FXSEL(SEL_UPDATE, 0), nil)
197
+ @form_auth_rb.handle(self, FXSEL(SEL_UPDATE, 0), nil)
198
+ @no_auth_rb.handle(self, FXSEL(SEL_UPDATE, 0), nil)
199
+ @switcher.current = @auth_type_dt.value
200
+ }
201
+
202
+ @basic_auth_passwd_txt.connect(SEL_CHANGED){ password_check }
203
+ @basic_auth_retype_txt.connect(SEL_CHANGED){ password_check }
204
+
205
+ @fetch_button.connect(SEL_COMMAND){
206
+ begin
207
+ @form_fields_table.clear_fields
208
+ @page_tree.clearItems
209
+
210
+ page = nil
211
+ url = nil
212
+
213
+ if @form_auth_url_txt.text.empty?
214
+ unless Watobo::Plugin::Crawler.start_url.nil?
215
+ uri = Watobo::Plugin::Crawler.start_url
216
+ end
217
+ else
218
+ url = @form_auth_url_txt.text unless @form_auth_url_txt.text.empty?
219
+ uri = URI.parse(url)
220
+ end
221
+
222
+ notify(:log, "GET PAGE << #{uri.to_s}")
223
+ @agent, page = @crawler.get_page(uri)
224
+ notify(:log, "PAGE LOADED")
225
+ @page_tree.page = page
226
+ rescue => bang
227
+ notify(:log, "could not get page #{uri.to_s}")
228
+ puts "Could not get page for #{uri.to_s}"
229
+ puts bang
230
+ puts bang.backtrace if $DEBUG
231
+ end
232
+ true
233
+ }
234
+ @switcher.current = @auth_type_dt.value
235
+
236
+ @page_tree.subscribe(:form_selected){|form|
237
+ @auth_form = form
238
+ @form_fields_table.clear_fields
239
+ form.fields.each do |field|
240
+ @form_fields_table.add_field field
241
+ end
242
+ form.buttons.each do |field|
243
+ @form_fields_table.add_field field
244
+ end
245
+ }
246
+
247
+ end
248
+
249
+ private
250
+
251
+ def password_check
252
+ unless @basic_auth_passwd_txt.text == @basic_auth_retype_txt.text
253
+ @basic_auth_retype_txt.backColor = FXColor::Red
254
+ else
255
+ @basic_auth_retype_txt.backColor = FXColor::Green
256
+ end
257
+ end
258
+
259
+ def notify(event, *args)
260
+ if @event_dispatcher_listeners[event]
261
+ @event_dispatcher_listeners[event].each do |m|
262
+ m.call(*args) if m.respond_to? :call
263
+ end
264
+ end
265
+ end
266
+
267
+ def enable_basic_auth
268
+
269
+ end
270
+
271
+ def disable_basic_auth
272
+
273
+ end
274
+
275
+ def enable_form_auth
276
+
277
+ end
278
+
279
+ def disable_form_auth
280
+
281
+ end
282
+
283
+ end
284
+ end
285
+ end
286
+ end
296
287
  end