watobo 0.9.8.677

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 (260) hide show
  1. data/bin/watobo_gui.rb +39 -0
  2. data/certificates/cert.pem +19 -0
  3. data/certificates/privkey.pem +15 -0
  4. data/certificates/watobo_dh.key +5 -0
  5. data/config/datastore.yml +5 -0
  6. data/config/forwarding_proxy.yml +12 -0
  7. data/config/general.yml +4 -0
  8. data/config/gui.yml +23 -0
  9. data/config/interceptor.yml +16 -0
  10. data/config/scan_policy.yml +13 -0
  11. data/config/scanner.yml +34 -0
  12. data/icons/Add.ico +0 -0
  13. data/icons/Add_24x24.ico +0 -0
  14. data/icons/Bandwidth.ico +0 -0
  15. data/icons/Bandwidth_24x24.ico +0 -0
  16. data/icons/Mr. Bomb.ico +0 -0
  17. data/icons/Mr. Bomb_16x16.ico +0 -0
  18. data/icons/Mr. Bomb_24x24.ico +0 -0
  19. data/icons/Orange Ball.ico +0 -0
  20. data/icons/Orange Ball_16x16.ico +0 -0
  21. data/icons/Orange Ball_24x24.ico +0 -0
  22. data/icons/Pause.ico +0 -0
  23. data/icons/Play.ico +0 -0
  24. data/icons/Play_24x24.ico +0 -0
  25. data/icons/Red Ball.ico +0 -0
  26. data/icons/Red Ball_16x16.ico +0 -0
  27. data/icons/Red Ball_24x24.ico +0 -0
  28. data/icons/Run.ico +0 -0
  29. data/icons/Stop.ico +0 -0
  30. data/icons/Stop_24x24.ico +0 -0
  31. data/icons/Terminal.ico +0 -0
  32. data/icons/Transfer.ico +0 -0
  33. data/icons/Transfer_16x16.ico +0 -0
  34. data/icons/User.ico +0 -0
  35. data/icons/User_16x16.ico +0 -0
  36. data/icons/User_24x24.ico +0 -0
  37. data/icons/Web Browser.ico +0 -0
  38. data/icons/Web Browser_16x16.ico +0 -0
  39. data/icons/Write Document.ico +0 -0
  40. data/icons/Yellow Ball.ico +0 -0
  41. data/icons/Yellow Ball_16x16.ico +0 -0
  42. data/icons/Yellow Ball_24x24.ico +0 -0
  43. data/icons/advanced.ico +0 -0
  44. data/icons/advanced_16x16.ico +0 -0
  45. data/icons/advanced_24x24.ico +0 -0
  46. data/icons/applications.ico +0 -0
  47. data/icons/applications_16x16.ico +0 -0
  48. data/icons/applications_24x24.ico +0 -0
  49. data/icons/browser_16x16.ico +0 -0
  50. data/icons/browser_24x24.ico +0 -0
  51. data/icons/burn.ico +0 -0
  52. data/icons/burn_16x16.ico +0 -0
  53. data/icons/burn_24x24.ico +0 -0
  54. data/icons/calculator.ico +0 -0
  55. data/icons/calculator_24x24.ico +0 -0
  56. data/icons/cb_checked.ico +0 -0
  57. data/icons/cb_checked_orange.ico +0 -0
  58. data/icons/cb_unchecked.ico +0 -0
  59. data/icons/coin_24x24.ico +0 -0
  60. data/icons/conversation.ico +0 -0
  61. data/icons/conversation_24x24.ico +0 -0
  62. data/icons/engine.ico +0 -0
  63. data/icons/filter.ico +0 -0
  64. data/icons/folder.ico +0 -0
  65. data/icons/folder_16x16.ico +0 -0
  66. data/icons/fuzzer_16x16.ico +0 -0
  67. data/icons/fuzzer_24x24.ico +0 -0
  68. data/icons/go-down_16x16.png +0 -0
  69. data/icons/go-up_16x16.png +0 -0
  70. data/icons/help.ico +0 -0
  71. data/icons/help_16x16.ico +0 -0
  72. data/icons/help_24x24.ico +0 -0
  73. data/icons/iChat.ico +0 -0
  74. data/icons/iChat_16x16.ico +0 -0
  75. data/icons/iChat_24x24.ico +0 -0
  76. data/icons/icons.txt +3 -0
  77. data/icons/info.ico +0 -0
  78. data/icons/info_16x16.ico +0 -0
  79. data/icons/info_24x24.ico +0 -0
  80. data/icons/interceptor_24x24.ico +0 -0
  81. data/icons/lock.ico +0 -0
  82. data/icons/lock_12x12.ico +0 -0
  83. data/icons/lock_16x16.ico +0 -0
  84. data/icons/monitor.ico +0 -0
  85. data/icons/plugin.ico +0 -0
  86. data/icons/plugin_24x24.ico +0 -0
  87. data/icons/scan_16x16.png +0 -0
  88. data/icons/send.ico +0 -0
  89. data/icons/server.ico +0 -0
  90. data/icons/server_16x16.ico +0 -0
  91. data/icons/siberas_logo_x24.gif +0 -0
  92. data/icons/tag_blue_32x32.ico +0 -0
  93. data/icons/watobo-48x48.png +0 -0
  94. data/icons/watobo-logo.png +0 -0
  95. data/icons/watobo.ico +0 -0
  96. data/lib/watobo/adapters/data_store.rb +38 -0
  97. data/lib/watobo/adapters/file/file_store.rb +211 -0
  98. data/lib/watobo/adapters/session_store.rb +27 -0
  99. data/lib/watobo/adapters.rb +26 -0
  100. data/lib/watobo/config.rb +143 -0
  101. data/lib/watobo/constants.rb +92 -0
  102. data/lib/watobo/core/active_check.rb +404 -0
  103. data/lib/watobo/core/cookie.rb +69 -0
  104. data/lib/watobo/core/fuzz_gen.rb +160 -0
  105. data/lib/watobo/core/http_socket.rb +142 -0
  106. data/lib/watobo/core/interceptor.rb +729 -0
  107. data/lib/watobo/core/passive_check.rb +141 -0
  108. data/lib/watobo/core/project.rb +1058 -0
  109. data/lib/watobo/core/scanner.rb +396 -0
  110. data/lib/watobo/core/session.rb +1320 -0
  111. data/lib/watobo/core/simple_ca.rb +393 -0
  112. data/lib/watobo/core.rb +34 -0
  113. data/lib/watobo/defaults.rb +40 -0
  114. data/lib/watobo/external/diff/lcs/array.rb +42 -0
  115. data/lib/watobo/external/diff/lcs/block.rb +72 -0
  116. data/lib/watobo/external/diff/lcs/callbacks.rb +343 -0
  117. data/lib/watobo/external/diff/lcs/change.rb +190 -0
  118. data/lib/watobo/external/diff/lcs/hunk.rb +279 -0
  119. data/lib/watobo/external/diff/lcs/ldiff.rb +247 -0
  120. data/lib/watobo/external/diff/lcs/string.rb +40 -0
  121. data/lib/watobo/external/diff/lcs.rb +1124 -0
  122. data/lib/watobo/external/ntlm/ntlm.rb +797 -0
  123. data/lib/watobo/externals.rb +28 -0
  124. data/lib/watobo/framework/create_project.rb +55 -0
  125. data/lib/watobo/framework/init.rb +149 -0
  126. data/lib/watobo/framework/init_modules.rb +116 -0
  127. data/lib/watobo/framework/license_text.rb +50 -0
  128. data/lib/watobo/framework.rb +26 -0
  129. data/lib/watobo/gui/about_watobo.rb +68 -0
  130. data/lib/watobo/gui/browser_preview.rb +460 -0
  131. data/lib/watobo/gui/certificate_dialog.rb +132 -0
  132. data/lib/watobo/gui/chat_diff.rb +415 -0
  133. data/lib/watobo/gui/chatviewer_frame.rb +427 -0
  134. data/lib/watobo/gui/checkboxtree.rb +221 -0
  135. data/lib/watobo/gui/checks_policy_frame.rb +123 -0
  136. data/lib/watobo/gui/client_cert_dialog.rb +227 -0
  137. data/lib/watobo/gui/confirm_scan_dialog.rb +67 -0
  138. data/lib/watobo/gui/conversation_table.rb +386 -0
  139. data/lib/watobo/gui/conversation_table_ctrl.rb +175 -0
  140. data/lib/watobo/gui/csrf_token_dialog.rb +446 -0
  141. data/lib/watobo/gui/dashboard.rb +341 -0
  142. data/lib/watobo/gui/define_scope_frame.rb +380 -0
  143. data/lib/watobo/gui/edit_comment.rb +70 -0
  144. data/lib/watobo/gui/edit_scope_dialog.rb +69 -0
  145. data/lib/watobo/gui/finding_info.rb +212 -0
  146. data/lib/watobo/gui/findings_tree.rb +459 -0
  147. data/lib/watobo/gui/full_scan_dialog.rb +269 -0
  148. data/lib/watobo/gui/fuzzer_gui.rb +1522 -0
  149. data/lib/watobo/gui/hex_viewer.rb +106 -0
  150. data/lib/watobo/gui/interceptor_gui.rb +994 -0
  151. data/lib/watobo/gui/interceptor_settings_dialog.rb +201 -0
  152. data/lib/watobo/gui/log_viewer.rb +97 -0
  153. data/lib/watobo/gui/login_wizzard.rb +301 -0
  154. data/lib/watobo/gui/main_window.rb +1815 -0
  155. data/lib/watobo/gui/manual_request_editor.rb +1105 -0
  156. data/lib/watobo/gui/master_pw_dialog.rb +142 -0
  157. data/lib/watobo/gui/password_policy_dialog.rb +98 -0
  158. data/lib/watobo/gui/plugin/base.rb +82 -0
  159. data/lib/watobo/gui/plugin_board.rb +95 -0
  160. data/lib/watobo/gui/preferences_dialog.rb +116 -0
  161. data/lib/watobo/gui/progress_window.rb +102 -0
  162. data/lib/watobo/gui/project_wizzard.rb +369 -0
  163. data/lib/watobo/gui/proxy_dialog.rb +550 -0
  164. data/lib/watobo/gui/quick_scan_dialog.rb +242 -0
  165. data/lib/watobo/gui/request_editor.rb +480 -0
  166. data/lib/watobo/gui/save_chat_dialog.rb +158 -0
  167. data/lib/watobo/gui/scanner_settings_dialog.rb +360 -0
  168. data/lib/watobo/gui/select_chat_dialog.rb +169 -0
  169. data/lib/watobo/gui/session_management_dialog.rb +688 -0
  170. data/lib/watobo/gui/sites_tree.rb +347 -0
  171. data/lib/watobo/gui/status_bar.rb +88 -0
  172. data/lib/watobo/gui/table_editor.rb +445 -0
  173. data/lib/watobo/gui/tagless_viewer.rb +62 -0
  174. data/lib/watobo/gui/templates/plugin.rb +80 -0
  175. data/lib/watobo/gui/templates/plugin2.rb +103 -0
  176. data/lib/watobo/gui/text_viewer.rb +247 -0
  177. data/lib/watobo/gui/transcoder_window.rb +215 -0
  178. data/lib/watobo/gui/utils/gui_utils.rb +129 -0
  179. data/lib/watobo/gui/utils/init_icons.rb +106 -0
  180. data/lib/watobo/gui/utils/load_icons.rb +54 -0
  181. data/lib/watobo/gui/utils/load_plugins.rb +94 -0
  182. data/lib/watobo/gui/utils/master_password.rb +90 -0
  183. data/lib/watobo/gui/utils/save_default_settings.rb +99 -0
  184. data/lib/watobo/gui/utils/save_project_settings.rb +21 -0
  185. data/lib/watobo/gui/utils/save_proxy_settings.rb +45 -0
  186. data/lib/watobo/gui/utils/save_session_settings.rb +21 -0
  187. data/lib/watobo/gui/utils/session_history.rb +134 -0
  188. data/lib/watobo/gui/workspace_dialog.rb +89 -0
  189. data/lib/watobo/gui/www_auth_dialog.rb +348 -0
  190. data/lib/watobo/gui/xml_viewer_frame.rb +114 -0
  191. data/lib/watobo/gui.rb +139 -0
  192. data/lib/watobo/mixins/httpparser.rb +664 -0
  193. data/lib/watobo/mixins/request_parser.rb +210 -0
  194. data/lib/watobo/mixins/shapers.rb +345 -0
  195. data/lib/watobo/mixins/transcoders.rb +88 -0
  196. data/lib/watobo/mixins.rb +32 -0
  197. data/lib/watobo/utils/check_regex.rb +36 -0
  198. data/lib/watobo/utils/copy_object.rb +29 -0
  199. data/lib/watobo/utils/crypto.rb +74 -0
  200. data/lib/watobo/utils/expand_range.rb +45 -0
  201. data/lib/watobo/utils/file_management.rb +73 -0
  202. data/lib/watobo/utils/load_chat.rb +219 -0
  203. data/lib/watobo/utils/load_icon.rb +47 -0
  204. data/lib/watobo/utils/print_debug.rb +34 -0
  205. data/lib/watobo/utils/response_hash.rb +143 -0
  206. data/lib/watobo/utils/secure_eval.rb +57 -0
  207. data/lib/watobo/utils/text2request.rb +96 -0
  208. data/lib/watobo/utils.rb +32 -0
  209. data/lib/watobo.rb +76 -0
  210. data/modules/active/Apache/mod_status.rb +123 -0
  211. data/modules/active/Flash/crossdomain.rb +102 -0
  212. data/modules/active/directories/dirwalker.rb +89 -0
  213. data/modules/active/discovery/fileextensions.rb +151 -0
  214. data/modules/active/discovery/http_methods.rb +135 -0
  215. data/modules/active/domino/domino_db.lst +164 -0
  216. data/modules/active/domino/domino_db.rb +128 -0
  217. data/modules/active/fileinclusion/lfi_simple.rb +134 -0
  218. data/modules/active/jboss/jboss_basic.rb +119 -0
  219. data/modules/active/sap/business_objects.rb +73 -0
  220. data/modules/active/sap/its_commands.rb +101 -0
  221. data/modules/active/sap/its_service_parameter.rb +105 -0
  222. data/modules/active/sap/its_services.rb +103 -0
  223. data/modules/active/sap/its_xss.rb +98 -0
  224. data/modules/active/sqlinjection/sql_boolean.rb +262 -0
  225. data/modules/active/sqlinjection/sqli_simple.rb +205 -0
  226. data/modules/active/xss/xss_simple.rb +179 -0
  227. data/modules/passive/cookie_options.rb +97 -0
  228. data/modules/passive/cookie_xss.rb +85 -0
  229. data/modules/passive/detect_code.rb +89 -0
  230. data/modules/passive/detect_fileupload.rb +80 -0
  231. data/modules/passive/detect_infrastructure.rb +98 -0
  232. data/modules/passive/detect_one_time_tokens.rb +86 -0
  233. data/modules/passive/dirindexing.rb +81 -0
  234. data/modules/passive/disclosure_emails.rb +82 -0
  235. data/modules/passive/disclosure_ipaddr.rb +87 -0
  236. data/modules/passive/filename_as_parameter.rb +85 -0
  237. data/modules/passive/form_spotter.rb +75 -0
  238. data/modules/passive/hotspots.rb +86 -0
  239. data/modules/passive/in_script_parameter.rb +92 -0
  240. data/modules/passive/multiple_server_headers.rb +98 -0
  241. data/modules/passive/possible_login.rb +134 -0
  242. data/modules/passive/redirect_url.rb +88 -0
  243. data/modules/passive/redirectionz.rb +96 -0
  244. data/modules/passive/xss_dom.rb +91 -0
  245. data/plugins/catalog/catalog.ico +0 -0
  246. data/plugins/catalog/catalog.rb +726 -0
  247. data/plugins/catalog/db_tests +6483 -0
  248. data/plugins/catalog/db_variables +29 -0
  249. data/plugins/filefinder/dbs/hbci.db +12 -0
  250. data/plugins/filefinder/filefinder.rb +602 -0
  251. data/plugins/sslchecker/cli/sslchecker_cli.rb +21 -0
  252. data/plugins/sslchecker/gui/cipher_table.rb +260 -0
  253. data/plugins/sslchecker/gui/gui.rb +245 -0
  254. data/plugins/sslchecker/gui/sslchecker.rb +26 -0
  255. data/plugins/sslchecker/icons/green_16x16.ico +0 -0
  256. data/plugins/sslchecker/icons/grey_16x16.ico +0 -0
  257. data/plugins/sslchecker/icons/red_16x16.ico +0 -0
  258. data/plugins/sslchecker/icons/sslchecker.ico +0 -0
  259. data/plugins/sslchecker/lib/check.rb +117 -0
  260. metadata +317 -0
@@ -0,0 +1,480 @@
1
+ # .
2
+ # request_editor.rb
3
+ #
4
+ # Copyright 2012 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
+ module Watobo
23
+ module Gui
24
+ class SimpleTextView < FXVerticalFrame
25
+
26
+ attr_accessor :textbox
27
+ attr_accessor :style
28
+ attr_accessor :max_len
29
+
30
+ include Watobo::Constants
31
+ include Watobo::Gui::Utils
32
+
33
+ public
34
+ def subscribe(event, &callback)
35
+ (@event_dispatcher_listeners[event] ||= []) << callback
36
+ end
37
+
38
+ def clearEvents(event)
39
+ @event_dispatcher_listener[event].clear
40
+ end
41
+
42
+ def resetMatches()
43
+ @pattern_matches.clear
44
+ end
45
+
46
+ def rawRequest()
47
+ @textbox.text
48
+ end
49
+
50
+ def numMatches()
51
+ @pattern_matches.length
52
+ end
53
+
54
+ def textStyle=(style)
55
+ @textbox.textStyle = style
56
+ end
57
+
58
+ def textStyle()
59
+ @textbox.textStyle
60
+ end
61
+
62
+ def setFont(font_type=nil, size=nil)
63
+ new_size = size.nil? ? GUI_REGULAR_FONT_SIZE : size
64
+ new_font_type = font_type.nil? ? "helvetica" : font_type
65
+ new_font = FXFont.new(getApp(), new_font_type, new_size)
66
+ new_font.create
67
+ @textbox.font = new_font
68
+ end
69
+
70
+ def initialize(owner, opts)
71
+
72
+ @logger = (defined? owner.logger) ? owner.logger : nil
73
+ @pattern_matches = []
74
+ @text = ""
75
+
76
+ @event_dispatcher_listeners = Hash.new
77
+
78
+ super(owner, opts)
79
+ # Construct some hilite styles
80
+ @style = 1 # default style
81
+ @max_len = 0
82
+
83
+ @small_font = FXFont.new(getApp(), "helvetica", GUI_SMALL_FONT_SIZE)
84
+ @small_font.create
85
+
86
+ @big_font = FXFont.new(getApp(), "helvetica", GUI_REGULAR_FONT_SIZE)
87
+ @big_font.create
88
+
89
+ @last_button_pressed = SEL_TYPE_HIGHLIGHT
90
+
91
+ # Construct some hilite styles
92
+ hs_green = FXHiliteStyle.new
93
+ hs_green.normalForeColor = FXRGBA(255,255,255,255) #FXColor::Red
94
+ hs_green.normalBackColor = FXRGBA(0,255,0,1) # FXColor::White
95
+ hs_green.style = FXText::STYLE_BOLD
96
+
97
+ hs_red = FXHiliteStyle.new
98
+ hs_red.normalForeColor = FXRGBA(255,255,255,255) #FXColor::Red
99
+ hs_red.normalBackColor = FXRGBA(255,0,0,1) # FXColor::White
100
+ hs_red.style = FXText::STYLE_BOLD
101
+
102
+ # @req_builder = FXText.new(req_editor, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
103
+
104
+ @textbox = FXText.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
105
+ @textbox.extend Watobo::Mixins::RequestParser
106
+
107
+ # Enable the style buffer for this text widget
108
+ @textbox.styled = true
109
+ # Set the styles
110
+ @textbox.hiliteStyles = [ hs_green, hs_red]
111
+
112
+ @textbox.editable = false
113
+
114
+ @textbox.textStyle |= TEXT_WORDWRAP
115
+
116
+ @textbox.connect(SEL_RIGHTBUTTONRELEASE) do |sender, sel, event|
117
+
118
+ unless event.moved?
119
+ FXMenuPane.new(self) do |menu_pane|
120
+
121
+ pos = @textbox.selStartPos
122
+ len = @textbox.selEndPos - pos
123
+
124
+ selection = @textbox.extractText(pos, len)
125
+ addStringInfo(menu_pane, sender)
126
+ addDecoder(menu_pane, sender)
127
+ addEncoder(menu_pane, sender) if @textbox.editable?
128
+
129
+ FXMenuSeparator.new(menu_pane)
130
+ FXMenuCaption.new(menu_pane,"- Copy -")
131
+ FXMenuSeparator.new(menu_pane)
132
+ copyText = FXMenuCommand.new(menu_pane,"copy text: #{selection}", nil, @textbox, FXText::ID_COPY_SEL)
133
+
134
+ FXMenuSeparator.new(menu_pane)
135
+ FXMenuCaption.new(menu_pane,"- Transcoder -")
136
+ FXMenuSeparator.new(menu_pane)
137
+ send2transcoder = FXMenuCommand.new(menu_pane,"send to transcoder")
138
+ send2transcoder.connect(SEL_COMMAND) {
139
+ t = FXTranscoder.new(FXApp.instance, selection)
140
+ t.create
141
+ t.show(Fox::PLACEMENT_SCREEN)
142
+ }
143
+ FXMenuSeparator.new(menu_pane)
144
+ target = FXMenuCheck.new(menu_pane, "word wrap" )
145
+ target.check = ( @textbox.textStyle & TEXT_WORDWRAP > 0 ) ? true : false
146
+ target.connect(SEL_COMMAND) { @textbox.textStyle ^= TEXT_WORDWRAP }
147
+
148
+ target = FXMenuCheck.new(menu_pane, "big font" )
149
+ target.check = ( @textbox.font == @small_font ) ? false : true
150
+ target.connect(SEL_COMMAND) { |ts, tsel, titem|
151
+ if ts.checked?
152
+ @textbox.font = @big_font
153
+ else
154
+ @textbox.font = @small_font
155
+ end
156
+
157
+ }
158
+
159
+ menu_pane.create
160
+ menu_pane.popup(nil, event.root_x, event.root_y)
161
+ app.runModalWhileShown(menu_pane)
162
+
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ def editable=(e)
169
+ @textbox.editable = e
170
+ end
171
+
172
+ def editable?()
173
+ @textbox.editable?
174
+ end
175
+
176
+ def setText(text, prefs={})
177
+ @text = normalizeText(text)
178
+
179
+ showText(@text)
180
+ end
181
+
182
+ def filter(pattern)
183
+ #dummy = @textbox.to_s.split(/\n/)
184
+ dummy = @text.split(/\n/)
185
+ @textbox.setText('')
186
+ filtered = []
187
+ dummy.each do |line|
188
+ begin
189
+ if line =~ /#{pattern}/i then
190
+ filtered.push line
191
+ end
192
+ rescue => bang
193
+ puts
194
+ puts bang
195
+ pattern = Regexp.quote(pattern)
196
+ retry
197
+ end
198
+ end
199
+ showText(filtered.join("\n"))
200
+ end
201
+
202
+ def highlight(pattern)
203
+ sindex = nil
204
+ eindex = nil
205
+
206
+ dummy = @textbox.to_s
207
+ #remove previous highlighting
208
+ @textbox.setText(dummy)
209
+
210
+ matchPattern(pattern)
211
+
212
+ # puts "* found pattern #{pattern} #{@pattern_matches.length} times"
213
+ @pattern_matches.each do |start, len|
214
+ begin
215
+ @textbox.changeStyle(start, len, @style)
216
+ rescue => bang
217
+ puts "outch"
218
+ puts bang
219
+ end
220
+ end
221
+
222
+ return @pattern_matches.length
223
+ end
224
+
225
+ def makeMatchVisible(match_index=0)
226
+ return true if @pattern_matches.empty?
227
+ return false if match_index > ( @pattern_matches.length - 1 )
228
+ if @pattern_matches[match_index] then
229
+ pos = @pattern_matches[match_index][0]
230
+ len =@pattern_matches[match_index][1]
231
+
232
+ @textbox.setCenterLine(pos)
233
+
234
+ # @textbox.makePositionVisible(pos + len)
235
+ @textbox.makePositionVisible(@textbox.lineEnd(pos))
236
+ @textbox.makePositionVisible(pos)
237
+
238
+ @textbox.setCursorPos(pos)
239
+ end
240
+ return true
241
+ end
242
+
243
+ private
244
+
245
+ # returns an array of matches. each match consists of two values [start, len]
246
+ def matchPattern(pattern)
247
+ sindex = nil
248
+ eindex = nil
249
+
250
+ pos = 0
251
+ @pattern_matches.clear
252
+
253
+ loop do
254
+ sindex, eindex = @textbox.findText(pattern, pos, SEARCH_EXACT|SEARCH_IGNORECASE|SEARCH_FORWARD)
255
+
256
+ sindex, eindex = @textbox.findText(pattern, pos, :flags => SEARCH_REGEX|SEARCH_IGNORECASE|SEARCH_FORWARD) if not sindex
257
+
258
+ sindex, eindex = @textbox.findText(Regexp.quote(pattern),pos, :flags => SEARCH_REGEX|SEARCH_IGNORECASE|SEARCH_FORWARD) if not sindex
259
+
260
+ break if not sindex or sindex.length == 0
261
+
262
+ pos = eindex.last+1
263
+ sindex.length.times do |i|
264
+ start = sindex[i]
265
+ len = eindex[i] - sindex[i]
266
+ @pattern_matches.push [ start, len] if start >= 0
267
+ end
268
+
269
+ break if sindex.last < 0
270
+
271
+ end
272
+
273
+ return @pattern_matches
274
+ end
275
+
276
+ def showText(text)
277
+ begin
278
+ if @max_len > 0 and @max_len < text.length
279
+ text = text[0..@max_len] + "\n---8<--- WATOBO ---8<---\n* PRESS RESET TO SEE FULL RESPONSE *"
280
+ end
281
+ # text.encode('iso_8859_1')
282
+ # UTF-8 CleanUp
283
+ text = text.unpack("C*").pack("C*")
284
+ text.gsub!(/\x0d/u, '')
285
+ text.gsub!(/[\x00-\x09\x0b-\x1f\x7f-\xff]+/m,'.')
286
+ @textbox.setText(text)
287
+ rescue => bang
288
+ puts bang
289
+ puts bang.backtrace if $DEBUG
290
+ @textbox.setText(text)
291
+ end
292
+ end
293
+
294
+ def notify(event, *args)
295
+ if @event_dispatcher_listeners[event]
296
+ @event_dispatcher_listeners[event].each do |m|
297
+ m.call(*args) if m.respond_to? :call
298
+ end
299
+ end
300
+ end
301
+
302
+ def normalizeText(text)
303
+ begin
304
+ t = text
305
+ return "" if text.nil?
306
+ t = text.join if text.is_a? Array
307
+ t = t.unpack("C*").pack("C*")
308
+
309
+ t.gsub!(/\x0d/, '')
310
+ t.gsub!(/[\x00-\x09\x0b-\x1f\x7f-\xff]+/m,'.')
311
+ return t
312
+ rescue => bang
313
+ puts bang
314
+ puts bang.backtrace if $DEBUG
315
+ end
316
+ text.join
317
+ end
318
+
319
+ def log(text,e=nil)
320
+ # @logger.addError "Not a valid expression! \n#{e}"
321
+ t = Time.now
322
+ now = t.strftime("%m/%d/%Y @ %H:%M:%S")
323
+ msg = "[#{now}] #{text}"
324
+ notify(:error, msg)
325
+ puts msg
326
+ if e then
327
+ puts e
328
+ puts e.backtrace
329
+ end
330
+ end
331
+
332
+ end
333
+
334
+ class RequestEditor < SimpleTextView
335
+ def initialize(owner, opts)
336
+ super(owner, opts)
337
+
338
+ @textbox.textStyle -= TEXT_WORDWRAP
339
+
340
+ @textbox.editable = true
341
+ @markers = []
342
+
343
+ @textbox.connect(SEL_RIGHTBUTTONRELEASE) do |sender, sel, event|
344
+ unless event.moved?
345
+ FXMenuPane.new(self) do |menu_pane|
346
+ addStringInfo(menu_pane, sender)
347
+ addDecoder(menu_pane, sender)
348
+ addEncoder(menu_pane, sender)
349
+ menu_pane.create
350
+ menu_pane.popup(nil, event.root_x, event.root_y)
351
+ app.runModalWhileShown(menu_pane)
352
+ end
353
+
354
+ end
355
+ end
356
+
357
+ @textbox.connect(SEL_REPLACED, method(:onTextChanged))
358
+ @textbox.connect(SEL_DELETED, method(:onTextChanged))
359
+
360
+ # KEY_Return
361
+ # KEY_Control_L
362
+ # KEY_Control_R
363
+ # KEY_s
364
+ @ctrl_pressed = false
365
+
366
+ @textbox.connect(SEL_KEYPRESS) do |sender, sel, event|
367
+ @ctrl_pressed = true if event.code == KEY_Control_L or event.code == KEY_Control_R
368
+ # @shift_pressed = true if @ctrl_pressed and ( event.code == KEY_Shift_L or event.code == KEY_Shift_R )
369
+ if event.code == KEY_F1
370
+ unless event.moved?
371
+ FXMenuPane.new(self) do |menu_pane|
372
+ FXMenuCaption.new(menu_pane, "Hotkeys:")
373
+ FXMenuSeparator.new(menu_pane)
374
+ [ "<ctrl-enter> - Send Request",
375
+ "<ctrl-b> - Encode Base64",
376
+ "<ctrl-shift-b> - Decode Base64",
377
+ "<ctrl-u> - Encode URL",
378
+ "<ctrl-shift-u> - Decode URL"
379
+ ].each do |hk|
380
+ FXMenuCaption.new(menu_pane, hk)
381
+ end
382
+
383
+ menu_pane.create
384
+
385
+ menu_pane.popup(nil, event.root_x, event.root_y)
386
+ app.runModalWhileShown(menu_pane)
387
+ end
388
+
389
+ end
390
+ end
391
+ if @ctrl_pressed
392
+ if event.code == KEY_Return
393
+ notify(:hotkey_ctrl_enter)
394
+ true # special handling of KEY_Return, because we don't want a linebreak in textbox.
395
+ else
396
+ notify(:hotkey_ctrl_f) if event.code == KEY_f
397
+ notify(:hotkey_ctrl_s) if event.code == KEY_s
398
+ pos = @textbox.selStartPos
399
+ len = @textbox.selEndPos - pos
400
+ unless len==0
401
+ text = @textbox.extractText(pos,len)
402
+ rptxt = case event.code
403
+ when KEY_u
404
+ CGI::escape(text).strip
405
+ when KEY_b
406
+ Base64.encode64(text).strip
407
+ when KEY_U
408
+ CGI::unescape(text).strip
409
+ when KEY_B
410
+ Base64.decode64(text).strip
411
+ else
412
+ text
413
+ end
414
+ @textbox.replaceText(pos,len,rptxt)
415
+ @textbox.setSelection(pos,rptxt.length)
416
+ end
417
+ false
418
+ end
419
+ else
420
+ #puts "%04x" % event.code
421
+ false
422
+ end
423
+ end
424
+
425
+ @textbox.connect(SEL_KEYRELEASE) do |sender, sel, event|
426
+ @ctrl_pressed = false if event.code == KEY_Control_L or event.code == KEY_Control_R
427
+ false
428
+ end
429
+
430
+ end
431
+
432
+ def parseRequest
433
+ begin
434
+ return @textbox.to_request
435
+ rescue SyntaxError, LocalJumpError, NameError
436
+ # puts bang
437
+ # puts bang.backtrace if $DEBUG
438
+ notify(:error, "#{$!}")
439
+ rescue => bang
440
+ puts bang
441
+ notify(:error, "Could not parse request: #{$!}")
442
+ end
443
+
444
+ return nil
445
+ end
446
+
447
+ private
448
+
449
+ def onTextChanged(sender, sel, changed)
450
+ begin
451
+ dummy = changed.ins
452
+ dummy += changed.del
453
+
454
+ pos = changed.pos
455
+
456
+ pattern = "(%%.*?%%)"
457
+ #if dummy =~ /%/ then
458
+
459
+ @markers = highlight(pattern)
460
+ @textbox.setCursorPos(pos)
461
+ # else
462
+ # @markers.each do |start, len|
463
+ # if pos >= start and pos <= start + len then
464
+ # @markers = highlight(pattern)
465
+ # @textbox.setCursorPos(pos)
466
+ # break
467
+ # end
468
+ # end
469
+ # end
470
+
471
+ rescue => bang
472
+ puts "!!!ERROR: onTextChanged"
473
+ puts bang
474
+ end
475
+ end
476
+ end
477
+
478
+ # -> module Watobo::Gui
479
+ end
480
+ end
@@ -0,0 +1,158 @@
1
+ # .
2
+ # save_chat_dialog.rb
3
+ #
4
+ # Copyright 2012 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
+ module Watobo
23
+ module Gui
24
+ class SaveChatDialog < FXDialogBox
25
+ class Sender < Watobo::Session
26
+ def initialize()
27
+ @project = Watobo::Gui.active_project
28
+ super(@project.object_id, @project.getScanPreferences())
29
+
30
+ end
31
+
32
+ def send_request(new_request, opts = {} )
33
+ prefs = {
34
+ :run_login => false,
35
+ :update_csrf_tokens => false
36
+ }
37
+ prefs.update opts
38
+
39
+ id = 0
40
+ if prefs[:run_login ] == true
41
+ runLogin(@project.getLoginChats(), prefs)
42
+ end
43
+ #if prefs[:update_session ] == true and
44
+ unless prefs[:update_csrf_tokens] == true
45
+ prefs[:csrf_requests] = []
46
+ prefs[:csrf_patterns] = []
47
+ end
48
+
49
+ new_request.extend Watobo::Mixin::Parser::Web10
50
+ new_request.extend Watobo::Mixin::Shaper::Web10
51
+ begin
52
+ test_req, test_resp = self.doRequest(new_request, prefs)
53
+ rescue => bang
54
+ puts bang
55
+ end
56
+ return test_req,test_resp
57
+ end
58
+
59
+ end
60
+ include Responder
61
+
62
+ def filename
63
+ @filename_txt.text
64
+ end
65
+
66
+ def initialize(owner, chat, prefs={})
67
+ raise ArgumentError, "Need Chat Object" unless chat.respond_to? :request
68
+ super(owner, "Save Response", :opts => DECOR_ALL)
69
+ @chat = chat
70
+ @sender = Sender.new
71
+ @response = chat.response
72
+
73
+ FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
74
+
75
+ @path = Watobo.workspace_path
76
+
77
+ main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_GROOVE)
78
+
79
+ frame = FXHorizontalFrame.new(main_frame, :opts => LAYOUT_FILL_X)
80
+ FXLabel.new(frame,"Response:")
81
+ @reload_btn = FXButton.new(frame, "Reload", nil, self, 0, FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_SIDE_RIGHT)
82
+
83
+ @response_viewer = Watobo::Gui::ResponseViewer.new(main_frame, LAYOUT_FILL_X|LAYOUT_FILL_Y)
84
+ @response_viewer.setText(@response)
85
+ @reload_btn.connect(SEL_COMMAND){
86
+ s,a = @sender.send_request(@chat.request)
87
+ @response = a
88
+ @response.extend Watobo::Mixin::Parser::Web10
89
+ @response.extend Watobo::Mixin::Shaper::Web10
90
+ @response_viewer.setText(@response)
91
+ }
92
+
93
+ frame = FXHorizontalFrame.new(main_frame, :opts => LAYOUT_FILL_X)
94
+ FXLabel.new(frame, "Save To:", nil, LAYOUT_TOP|JUSTIFY_RIGHT)
95
+ @filename_txt = FXTextField.new(frame, 25, :opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT)
96
+ @select_btn = FXButton.new(frame, "Select")
97
+ @select_btn.connect(SEL_COMMAND){ select_target_file }
98
+ if @chat.respond_to? :response
99
+ @select_btn.enable
100
+ @filename_txt.enable
101
+ else
102
+ @select_btn.disable
103
+ @filename_txt.disable
104
+ end
105
+
106
+ buttons = FXHorizontalFrame.new(main_frame, :opts => LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,
107
+ :padLeft => 40, :padRight => 40, :padTop => 20, :padBottom => 20)
108
+
109
+ accept = FXButton.new(buttons, "&Save", nil, self, ID_ACCEPT,
110
+ FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
111
+ accept.enable
112
+ # Cancel
113
+ FXButton.new(buttons, "&Cancel", nil, self, ID_CANCEL,
114
+ FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
115
+ end
116
+
117
+ private
118
+
119
+ def select_target_file()
120
+ file = @chat.request.file
121
+ file = "chat.txt" if file.strip.empty?
122
+ dst_file = File.join(@path, file)
123
+ filename = FXFileDialog.getSaveFilename(self, "Select Destination File", dst_file)
124
+ if filename != "" then
125
+ @filename_txt.text = filename
126
+ end
127
+ end
128
+
129
+ def updateFields()
130
+ # @sites_combo.handle(self, FXSEL(SEL_UPDATE, 1), nil)
131
+
132
+ end
133
+
134
+ def onAccept(sender, sel, event)
135
+ begin
136
+ f = @filename_txt.text
137
+ if f != ''
138
+ @path = File.dirname(f)
139
+
140
+ if @response.has_body?
141
+ File.open(f,"wb"){ |fh| fh.print @response.body }
142
+ end
143
+ end
144
+ status = 1
145
+ rescue => bang
146
+ puts bang
147
+ status = 0
148
+ ensure
149
+ getApp().stopModal(self, 1)
150
+ self.hide()
151
+ return status
152
+ end
153
+
154
+ end
155
+ end
156
+
157
+ end
158
+ end