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,386 @@
1
+ # .
2
+ # conversation_table.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
+ TABLE_COL_METHOD = 0x0001
25
+ TABLE_COL_HOST = 0x0002
26
+ TABLE_COL_PATH = 0x0004
27
+ TABLE_COL_PARMS = 0x0008
28
+ TABLE_COL_STATUS = 0x0010
29
+ TABLE_COL_COOKIE = 0x0020
30
+ TABLE_COL_COMMENT = 0x0040
31
+ TABLE_COL_SSL = 0x0100
32
+ class ConversationTable < FXTable
33
+
34
+ attr_accessor :autoscroll
35
+
36
+ include Watobo::Gui::Icons
37
+
38
+ def subscribe(event, &callback)
39
+ (@event_dispatcher_listeners[event] ||= []) << callback
40
+ #puts callback.class_
41
+ puts callback.object_id
42
+ end
43
+
44
+ def clearEvents(event)
45
+ @event_dispatcher_listeners[event] ||= []
46
+ @event_dispatcher_listeners[event].clear
47
+ end
48
+
49
+ def notify(event, *args)
50
+ if @event_dispatcher_listeners[event]
51
+ puts "NOTIFY: #{self}(:#{event}) [#{@event_dispatcher_listeners[event].length}]" if $DEBUG
52
+ @event_dispatcher_listeners[event].each do |m|
53
+ m.call(*args) if m.respond_to? :call
54
+ end
55
+ end
56
+ end
57
+
58
+ def num_total
59
+ @current_chat_list.length
60
+ end
61
+
62
+ def num_visible
63
+ self.numRows
64
+ end
65
+
66
+ def reset_filter
67
+ @filter = {
68
+ :show_scope_only => false,
69
+ :text => '',
70
+ :url => false,
71
+ :request => false,
72
+ :response => false,
73
+ :hide_tested => false,
74
+ :doc_filter => []
75
+ }
76
+ end
77
+
78
+ # :show_scope_only => false,
79
+ # :text => '',
80
+ # :url => false,
81
+ # :request => false,
82
+ # :response => false,
83
+ # :hide_tested => false
84
+ def apply_filter(filter={})
85
+
86
+ @filter.update filter
87
+ @uniq_chats.clear
88
+ puts @filter.to_yaml if $DEBUG
89
+ update_table
90
+ end
91
+
92
+ def chat_visible?(chat)
93
+ begin
94
+ #if @active_project and @active_project.settings[:site_filter]
95
+ # #puts chat.request.url
96
+ #puts @active_project.settings[:site_filter]
97
+ # return false if @active_project.settings[:site_filter] != '' and chat.request.url =~ /^http(s)?:\/\/#{Regexp.quote(@active_project.settings[:site_filter])}/
98
+ # return true
99
+ # end
100
+
101
+ if @filter[:unique]
102
+ unless Watobo::Gui.active_project.nil?
103
+ uniq_hash = Watobo::Gui.active_project.uniqueRequestHash chat.request
104
+ return false if @uniq_chats.has_key? uniq_hash
105
+ @uniq_chats[uniq_hash] = nil
106
+ end
107
+ end
108
+
109
+ if @filter[:show_scope_only]
110
+ unless Watobo::Gui.active_project.nil?
111
+ return false unless Watobo::Gui.active_project.siteInScope?(chat.request.site)
112
+ end
113
+ end
114
+ # puts "* passed scope"
115
+ if @filter[:hide_tested]
116
+ return false if chat.tested?
117
+ end
118
+ # puts "* passed hide tested"
119
+ unless @filter[:doc_filter].include?(chat.request.doctype)
120
+ return true if @filter[:text].empty?
121
+
122
+ return true if @filter[:url] and chat.request.first =~ /#{@filter[:text]}/i
123
+
124
+ return true if @filter[:request] and chat.request.join =~ /#{@filter[:text]}/i
125
+
126
+ if chat.response.content_type =~ /(text|javascript)/
127
+ return true if @filter[:response] and chat.response.join.unpack("C*").pack("C*") =~ /#{@filter[:text]}/i
128
+ end
129
+
130
+ end
131
+ rescue => bang
132
+ puts "! could not add chat to table !".upcase
133
+ # puts chat.id
134
+ puts bang
135
+ puts bang.backtrace if $DEBUG
136
+ end
137
+ false
138
+ end
139
+
140
+ def showConversation( chat_list = [] )
141
+ clearConversation()
142
+ chat_list.each do |chat|
143
+ addChat(chat)
144
+ end
145
+ adjustCellWidth()
146
+ end
147
+
148
+ def setNewFont(font_type=nil, size=nil)
149
+ begin
150
+ new_size = size.nil? ? GUI_REGULAR_FONT_SIZE : size
151
+ new_font_type = font_type.nil? ? "helvetica" : font_type
152
+ new_font = FXFont.new(getApp(), new_font_type, new_size)
153
+ new_font.create
154
+
155
+ self.font = new_font
156
+ self.rowHeader.font = new_font
157
+ self.defRowHeight = new_size+10
158
+
159
+ update_table()
160
+
161
+ rescue => bang
162
+ puts bang
163
+ puts bang.backtrace if $DEBUG
164
+ end
165
+ end
166
+
167
+ def updateComment(row, comment)
168
+ col = @col_order.index(TABLE_COL_COMMENT)
169
+ self.setItemText(row, col, comment.gsub(/[^[:print:]]/,' '))
170
+ end
171
+
172
+ def addChat(chat, *prefs)
173
+ if self.getNumRows <= 0 then
174
+ clearConversation()
175
+ # initColumns()
176
+ end
177
+
178
+ @current_chat_list.push chat unless chat.nil?
179
+ add_chat_row(chat) if chat_visible?(chat)
180
+
181
+ end
182
+
183
+ def initColumns()
184
+ self.setTableSize(0, @columns.length)
185
+ self.visibleRows = 20
186
+ self.visibleColumns = @columns.length
187
+
188
+ @columns.each do |type, name|
189
+ index = @col_order.index(type)
190
+ self.setColumnText( index, name )
191
+ self.setColumnIcon(@col_order.index(TABLE_COL_SSL), TBL_ICON_LOCK)# puts self.getItem(@col_order.index(col), 0 ).class.to_s
192
+ end
193
+
194
+ end
195
+
196
+ def initialize( owner, unused = nil )
197
+ @event_dispatcher_listeners = Hash.new
198
+
199
+ super(owner, :opts => TABLE_COL_SIZABLE|TABLE_ROW_SIZABLE|LAYOUT_FILL_X|LAYOUT_FILL_Y|TABLE_READONLY|LAYOUT_SIDE_TOP, :padding => 2)
200
+
201
+ self.setBackColor(FXRGB(255, 255, 255))
202
+ self.setCellColor(0, 0, FXRGB(255, 255, 255))
203
+ self.setCellColor(0, 1, FXRGB(255, 240, 240))
204
+ self.setCellColor(1, 0, FXRGB(240, 255, 240))
205
+ self.setCellColor(1, 1, FXRGB(240, 240, 255))
206
+
207
+ reset_filter
208
+ # FXMAPFUNC(SEL_CLICKED, FXTable::ID_SELECT_CELL, :onSelectCell)
209
+ @current_chat_list = []
210
+ @uniq_chats = Hash.new
211
+
212
+ @columns = Hash.new
213
+ @cell_width = Hash.new
214
+ @col_order = []
215
+ @autoscroll = false
216
+
217
+ @columns = Hash.new
218
+
219
+ @columns[TABLE_COL_METHOD] = "Method"
220
+ @columns[TABLE_COL_HOST] = "Host"
221
+ @columns[TABLE_COL_PATH] = "Path"
222
+ @columns[TABLE_COL_PARMS] = "Parameters"
223
+ @columns[TABLE_COL_STATUS] = "Status"
224
+ @columns[TABLE_COL_COOKIE] = "Set-Cookie"
225
+ @columns[TABLE_COL_COMMENT] = "Comment"
226
+ @columns[TABLE_COL_SSL] = ""
227
+
228
+ # initialize columns order
229
+ @col_order = [ TABLE_COL_SSL, TABLE_COL_METHOD, TABLE_COL_HOST, TABLE_COL_PATH, TABLE_COL_PARMS, TABLE_COL_STATUS, TABLE_COL_COOKIE, TABLE_COL_COMMENT ]
230
+
231
+ # init cell width
232
+ @cell_width = Hash.new
233
+ @cell_width[TABLE_COL_METHOD] = 50
234
+ @cell_width[TABLE_COL_HOST] = 120
235
+ @cell_width[TABLE_COL_PATH] = 200
236
+ @cell_width[TABLE_COL_PARMS] = 150
237
+ @cell_width[TABLE_COL_STATUS] = 50
238
+ @cell_width[TABLE_COL_COOKIE] = 70
239
+ @cell_width[TABLE_COL_COMMENT] = 100
240
+ @cell_width[TABLE_COL_SSL] = 20
241
+
242
+ @cell_width_defaults = Hash.new
243
+ @cell_width_defaults.update YAML.load(YAML.dump(@cell_width))
244
+
245
+ @cell_auto_max = 400
246
+ @cell_min_width = 30
247
+
248
+ initColumns()
249
+
250
+ self.columnHeader.connect(SEL_CHANGED) do |sender, sel, index|
251
+ type = @col_order[index]
252
+ @cell_width[type] = self.getColumnWidth(index)
253
+ end
254
+
255
+ self.columnHeader.connect(SEL_COMMAND) do |sender, sel, index|
256
+ type = @col_order[index]
257
+ column_width = self.getColumnWidth(index)
258
+
259
+ new_width = case column_width
260
+ when column_width > @cell_auto_max
261
+ @cell_auto_max
262
+ when ( column_width > @cell_width_defaults[type] )
263
+ @cell_width_defaults[type]
264
+ when @cell_width_defaults[type]
265
+ self.fitColumnsToContents(index)
266
+ w = self.getColumnWidth(index)
267
+ w = @cell_auto_max if self.getColumnWidth(index) > @cell_auto_max
268
+ w = @cell_width_defaults[type] if self.getColumnWidth(index) < @cell_width_defaults[type]
269
+ w
270
+ else
271
+ @cell_width_defaults[type]
272
+ end
273
+ self.setColumnWidth(index, new_width)
274
+ @cell_width[type] = new_width
275
+
276
+ adjustCellWidth()
277
+ end
278
+
279
+ adjustCellWidth()
280
+ end
281
+
282
+ def scrollUp()
283
+ self.makePositionVisible(0, 0)
284
+ end
285
+
286
+ def scrollDown()
287
+ self.makePositionVisible(self.numRows-1, 0)
288
+ end
289
+
290
+ def clearConversation()
291
+ self.clearItems
292
+ @current_chat_list = []
293
+ initColumns()
294
+ adjustCellWidth()
295
+ end
296
+
297
+ private
298
+
299
+ def add_chat_row(chat)
300
+ lastRowIndex = self.getNumRows
301
+ self.appendRows(1)
302
+
303
+ self.rowHeader.setItemJustify(lastRowIndex, FXHeaderItem::RIGHT)
304
+ self.setRowText(lastRowIndex, chat.id.to_s)
305
+
306
+ index = @col_order.index(TABLE_COL_SSL)
307
+ self.setItemIcon(lastRowIndex, index, TBL_ICON_LOCK) if chat.request.is_ssl?
308
+
309
+ index = @col_order.index(TABLE_COL_METHOD)
310
+
311
+ self.setItemText(lastRowIndex, index, chat.request.method)
312
+ self.getItem(lastRowIndex, index).justify = FXTableItem::LEFT
313
+
314
+ index = @col_order.index(TABLE_COL_HOST)
315
+ self.setItemText(lastRowIndex, index, chat.request.host)
316
+ self.getItem(lastRowIndex,index).justify = FXTableItem::LEFT
317
+
318
+ index = @col_order.index(TABLE_COL_PATH)
319
+ self.setItemText(lastRowIndex, index, chat.request.path)
320
+ self.getItem(lastRowIndex, index).justify = FXTableItem::LEFT
321
+
322
+ index = @col_order.index(TABLE_COL_PARMS)
323
+ ps = ""
324
+ if chat.request.method =~ /POST/ then
325
+ ps = chat.request.post_parms.join("&")
326
+ else
327
+ ps = chat.request.urlparms
328
+ end
329
+ parms = ""
330
+ unless ps.nil?
331
+ # parms = ps[0..50]
332
+ # parms += "..." if ps.length > 50
333
+ parms = ps
334
+ parms.gsub!(/[^[:print:]]/,'.')
335
+ end
336
+
337
+ self.setItemText(lastRowIndex, index, parms)
338
+ self.getItem(lastRowIndex, index).justify = FXTableItem::LEFT
339
+
340
+ index = @col_order.index(TABLE_COL_STATUS)
341
+ self.setItemText(lastRowIndex, index, chat.response.status)
342
+ self.getItem(lastRowIndex,index).justify = FXTableItem::LEFT
343
+
344
+ if chat.response.header_value("set-cookie").first then
345
+ index = @col_order.index(TABLE_COL_COOKIE)
346
+ self.setItemText(lastRowIndex, index, chat.response.header_value("set-cookie").first.chomp)
347
+ self.getItem(lastRowIndex, index).justify = FXTableItem::LEFT
348
+ end
349
+
350
+ if chat.comment then
351
+ index = @col_order.index(TABLE_COL_COMMENT)
352
+ comment = chat.comment.split(/\n/).join(" ")
353
+ cc = comment[0..50]
354
+ cc += "..." if comment.length > 50
355
+ self.setItemText(lastRowIndex, index, cc)
356
+ self.getItem(lastRowIndex, index).justify = FXTableItem::LEFT
357
+ end
358
+
359
+ self.makePositionVisible(self.numRows-1, 0) if @autoscroll == true
360
+ end
361
+
362
+ def update_table()
363
+ self.clearItems
364
+ initColumns()
365
+ adjustCellWidth()
366
+ @current_chat_list.each do |chat|
367
+ add_chat_row(chat) if chat_visible? chat
368
+ end
369
+ end
370
+
371
+ def adjustCellWidth()
372
+ begin
373
+ self.rowHeader.width = 35
374
+ @cell_width.each do |col, width|
375
+ pos = @col_order.index(col)
376
+ self.setColumnWidth(pos, width)
377
+ end
378
+ rescue => bang
379
+ puts "!!!ERROR: adjustCellWidth"
380
+ end
381
+
382
+ end
383
+
384
+ end
385
+ end
386
+ end
@@ -0,0 +1,175 @@
1
+ # .
2
+ # conversation_table_ctrl.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
+
25
+ class ConversationTableCtrl < FXVerticalFrame
26
+
27
+ include Watobo::Constants
28
+ include Watobo::Gui::Icons
29
+
30
+ def table=(table)
31
+ @table = table
32
+ @table.subscribe(:table_changed) { update_info }
33
+ end
34
+
35
+ def initialize(owner, opts)
36
+ super(owner, opts )
37
+ @table = nil
38
+ @tabBook = FXTabBook.new(self, nil, 0, :opts => LAYOUT_FILL_X|LAYOUT_RIGHT, :padding => 0)
39
+
40
+ docfilter_tab = FXTabItem.new(@tabBook, "Doc Filter", nil)
41
+
42
+ docfilter_frame = FXHorizontalFrame.new(@tabBook, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED)
43
+
44
+ @foption_nopix = FXCheckButton.new(docfilter_frame, "excl. pics", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
45
+ @foption_nopix.setCheck(true)
46
+ @foption_nodocs = FXCheckButton.new(docfilter_frame, "excl. docs", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
47
+ @foption_nodocs.setCheck(true)
48
+ @foption_nojs = FXCheckButton.new(docfilter_frame, "excl. javascript", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
49
+ @foption_nojs.setCheck(true)
50
+ @foption_nocss = FXCheckButton.new(docfilter_frame, "excl. style sheets", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
51
+ @foption_nocss.setCheck(true)
52
+
53
+ search_tab = FXTabItem.new(@tabBook, "Text Filter", nil)
54
+
55
+ search_frame = FXHorizontalFrame.new(@tabBook, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED)
56
+
57
+ FXButton.new(search_frame, "Clear", nil, nil, 0, FRAME_RAISED|FRAME_THICK).connect(SEL_COMMAND) { clear_text_filter }
58
+
59
+ @text_filter = FXTextField.new(search_frame, 20, nil, 0, FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X)
60
+ # filterOptionsFrame =FXHorizontalFrame.new(fbox, LAYOUT_FILL_X)
61
+ @foption_url = FXCheckButton.new(search_frame, "URL", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
62
+ @foption_url.setCheck(true)
63
+ @foption_url.connect(SEL_COMMAND){ update_text_filter }
64
+ @foption_req = FXCheckButton.new(search_frame, "Full Request", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
65
+ @foption_req .connect(SEL_COMMAND){ update_text_filter }
66
+ @foption_res = FXCheckButton.new(search_frame, "Full Response", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
67
+ @foption_res.connect(SEL_COMMAND){ update_text_filter }
68
+
69
+ options_tab = FXTabItem.new(@tabBook, "Options", nil)
70
+ options_frame = FXHorizontalFrame.new(@tabBook, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED)
71
+ @table_option_autoscroll = FXCheckButton.new(options_frame, "autoscroll", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
72
+ @table_option_autoscroll.setCheck(true)
73
+
74
+ @table_option_unique = FXCheckButton.new(options_frame, "unique chats", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
75
+ @table_option_unique.setCheck(false)
76
+
77
+ @table_option_scope = FXCheckButton.new(options_frame, "scope only", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
78
+ @table_option_scope.setCheck(false)
79
+
80
+ @table_option_hidetested_cb = FXCheckButton.new(options_frame, "hide tested", nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT)
81
+ @table_option_hidetested_cb.setCheck(false)
82
+
83
+ @table_option_autoscroll.connect(SEL_COMMAND) {
84
+ @table.autoscroll = @table_option_autoscroll.checked? unless @table.nil?
85
+ }
86
+
87
+ #applyFilterButton = FXButton.new(conversation_frame, "Apply", nil, nil, 0, FRAME_RAISED|FRAME_THICK)
88
+ button_frame = FXHorizontalFrame.new(self, :opts => LAYOUT_FILL_X, :padding => 0)
89
+ FXButton.new(button_frame, "Apply", nil, nil, 0, FRAME_RAISED|FRAME_THICK).connect(SEL_COMMAND) { apply_filter }
90
+ #FXButton.new(docfilter_button_frame, "Clear", nil, nil, 0, FRAME_RAISED|FRAME_THICK).connect(SEL_COMMAND, method(:onClear))
91
+
92
+ @text_filter.connect(SEL_COMMAND){
93
+ apply_filter
94
+ }
95
+
96
+ FXButton.new(button_frame, "", ICON_BTN_UP, nil, 0, FRAME_RAISED|FRAME_THICK).connect(SEL_COMMAND) {
97
+ @table.scrollUp() unless @table.nil?
98
+ }
99
+
100
+ FXButton.new(button_frame, "", ICON_BTN_DOWN, nil, 0, FRAME_RAISED|FRAME_THICK).connect(SEL_COMMAND) {
101
+ @table.scrollDown() unless @table.nil?
102
+ }
103
+
104
+ @info_txt = FXLabel.new( button_frame, "0/0", :opts => LAYOUT_RIGHT)
105
+ end
106
+
107
+ def subscribe(event, &callback)
108
+ (@event_dispatcher_listeners[event] ||= []) << callback
109
+ end
110
+
111
+ private
112
+
113
+ def update_info
114
+ if @table.respond_to? :num_total
115
+ @info_txt.text = "#{@table.num_visible}/#{@table.num_total}"
116
+ end
117
+ end
118
+
119
+ def clearEvents(event)
120
+ @event_dispatcher_listener[event].clear
121
+ end
122
+
123
+ def notify(event, *args)
124
+ if @event_dispatcher_listeners[event]
125
+ @event_dispatcher_listeners[event].each do |m|
126
+ m.call(*args) if m.respond_to? :call
127
+ end
128
+ end
129
+ end
130
+
131
+ def clear_text_filter
132
+ @text_filter.text = ''
133
+ apply_filter
134
+ end
135
+
136
+ def apply_filter
137
+ unless @table.nil?
138
+ @table.apply_filter(filter_settings)
139
+ update_info
140
+ end
141
+ end
142
+
143
+ def update_text_filter
144
+ if @foption_url.checked? or @foption_req.checked? or @foption_res.checked?
145
+ @text_filter.enable
146
+ else
147
+ @text_filter.disable
148
+ end
149
+ end
150
+
151
+ def filter_settings
152
+ doctype_filter = []
153
+ doctype_filter.concat(Watobo::Conf::Gui.fext_img) if @foption_nopix.checked?
154
+ doctype_filter.concat(Watobo::Conf::Gui.fext_docs) if @foption_nodocs.checked?
155
+ doctype_filter.concat(Watobo::Conf::Gui.fext_javascript) if @foption_nojs.checked?
156
+ doctype_filter.concat(Watobo::Conf::Gui.fext_style) if @foption_nocss.checked?
157
+
158
+ text = @text_filter.enabled? ? @text_filter.text : ""
159
+
160
+ fs = {
161
+ :show_scope_only => @table_option_scope.checked?,
162
+ :text => text,
163
+ :url => @foption_url.checked?,
164
+ :request => @foption_req.checked?,
165
+ :response => @foption_res.checked?,
166
+ :hide_tested => @table_option_hidetested_cb.checked?,
167
+ :doc_filter => doctype_filter,
168
+ :unique => @table_option_unique.checked?
169
+ }
170
+ fs
171
+ end
172
+
173
+ end
174
+ end
175
+ end