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,297 +1,294 @@
1
- #.
2
- # marshal_store.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
- # @private
11
- module Watobo#:nodoc: all
12
- class FileSessionStore < SessionStore
13
- def num_chats
14
- get_file_list(@conversation_path, "*-chat*").length
15
- end
16
-
17
- def num_findings
18
- get_file_list(@findings_path, "*-finding*").length
19
- end
20
-
21
- def add_finding(finding)
22
- return false unless finding.respond_to? :request
23
- return false unless finding.respond_to? :response
24
-
25
- finding_file = File.join("#{@findings_path}", "#{finding.id}-finding.mrs")
26
- unless File.exists?(finding_file)
27
- save_finding(finding_file, finding)
28
- return true
29
- end
30
- false
31
- end
32
-
33
- def delete_finding(finding)
34
- finding_file = File.join("#{@findings_path}", "#{finding.id}-finding")
35
- File.delete finding_file if File.exist? finding_file
36
- file = finding_file + ".yml"
37
- File.delete file if File.exist? file
38
- file = finding_file + ".mrs"
39
- File.delete file if File.exist? file
40
-
41
- end
42
-
43
- def save_finding(fname, finding)
44
- File.open(fname, 'wb'){|f|
45
- f.print Marshal::dump(finding.to_h)
46
- }
47
- end
48
-
49
- def update_finding(finding)
50
- finding_file = File.join("#{@findings_path}", "#{finding.id}-finding.mrs")
51
-
52
- if File.exists?(finding_file) then
53
- save_finding(finding_file, finding)
54
- end
55
-
56
- end
57
-
58
- # add_scan_log
59
- # adds a chat to a specific log store, e.g. if you want to log scan results.
60
- # needs a scan_name (STRING) as its destination which will be created
61
- # if the scan name does not exist.
62
- def add_scan_log(chat, scan_name = nil)
63
- return false unless chat.respond_to? :request
64
- return false unless chat.respond_to? :response
65
- begin
66
-
67
- return false if scan_name.nil?
68
- return false if scan_name.empty?
69
-
70
- scan_name_clean = scan_name.gsub(/[:\\\/\.]*/,"_")
71
- # puts ">> scan_name"
72
- path = File.join(@scanlog_path, scan_name_clean)
73
-
74
- Dir.mkdir path unless File.exist? path
75
-
76
- file = File.join( path, "log_" + Time.now.to_f.to_s + ".mrs")
77
-
78
- unless File.exists?(file)
79
- File.open(file, "wb") { |fh|
80
- fh.print Marshal::dump(chat.to_h)
81
- }
82
- end
83
-
84
- return true
85
- rescue => bang
86
- puts bang
87
- puts bang.backtrace if $DEBUG
88
- end
89
- return false
90
- end
91
-
92
- def add_chat(chat)
93
- return false unless chat_valid? chat
94
- chat_file = File.join("#{@conversation_path}", "#{chat.id}-chat.mrs")
95
-
96
- unless File.exists?(chat_file)
97
- File.open(chat_file, "wb") { |fh|
98
- fh.print Marshal::dump(chat.to_h)
99
- }
100
- chat.file = chat_file
101
- return true
102
- end
103
- return false
104
- end
105
-
106
- def each_chat(&block)
107
- list = get_file_list(@conversation_path, "*-chat*")
108
- list.each do |fname|
109
- #puts
110
- chat = nil
111
- if fname =~ /\.mrs$/
112
- chat = Watobo::Utils.loadChatMarshal(fname)
113
- elsif fname =~ /\.yml$/
114
- chat = Watobo::Utils.loadChatYAML(fname) unless list.include?(fname.gsub(/yml$/,'mrs'))
115
- end
116
- next if chat.nil?
117
- yield chat if block_given?
118
- end
119
- end
120
-
121
- def each_finding(&block)
122
- list = get_file_list(@findings_path, "*-finding*")
123
- list.each do |fname|
124
- f = nil
125
- if fname =~ /\.mrs$/
126
- f = Watobo::Utils.loadFindingMarshal(fname)
127
- elsif fname =~ /\.yml$/
128
- f = Watobo::Utils.loadFindingYAML(fname) unless list.include?(fname.gsub(/yml$/,'mrs'))
129
- end
130
- next if f.nil?
131
- yield f if block_given?
132
- end
133
- end
134
-
135
- def initialize(project_name, session_name)
136
-
137
- wsp = Watobo.workspace_path
138
- return false unless File.exist? wsp
139
- puts "* using workspace path: #{wsp}" if $DEBUG
140
-
141
- @log_file = nil
142
- @log_lock = Mutex.new
143
-
144
- @project_path = File.join(wsp, project_name)
145
- unless File.exist? @project_path
146
- puts "* create project path: #{@project_path}" if $DEBUG
147
- Dir.mkdir(@project_path)
148
- end
149
-
150
- @project_config_path = File.join(@project_path, ".config")
151
- Dir.mkdir @project_config_path unless File.exist? @project_config_path
152
-
153
- @session_path = File.join(@project_path, session_name)
154
-
155
- unless File.exist? @session_path
156
- puts "* create session path: #{@session_path}" if $DEBUG
157
- Dir.mkdir(@session_path)
158
- end
159
-
160
- @session_config_path = File.join(@session_path, ".config")
161
- Dir.mkdir @session_config_path unless File.exist? @session_config_path
162
-
163
- sext = Watobo::Conf::General.session_settings_file_ext
164
-
165
- @session_file = File.join(@session_path, session_name + sext)
166
- @project_file = File.join(@project_path, project_name + Watobo::Conf::General.project_settings_file_ext)
167
-
168
- @conversation_path = File.expand_path(File.join(@session_path, Watobo::Conf::Datastore.conversations))
169
-
170
- @findings_path = File.expand_path(File.join(@session_path, Watobo::Conf::Datastore.findings))
171
- @log_path = File.expand_path(File.join(@session_path, Watobo::Conf::Datastore.event_logs_dir))
172
- @scanlog_path = File.expand_path(File.join(@session_path, Watobo::Conf::Datastore.scan_logs_dir))
173
-
174
- [ @conversation_path, @findings_path, @log_path, @scanlog_path ].each do |folder|
175
- if not File.exists?(folder) then
176
- puts "create path #{folder}"
177
- begin
178
- Dir.mkdir(folder)
179
- rescue SystemCallError => bang
180
- puts "!!!ERROR:"
181
- puts bang
182
- rescue => bang
183
- puts "!!!ERROR:"
184
- puts bang
185
- end
186
- end
187
- end
188
-
189
- @log_file = File.join(@log_path, session_name + ".log")
190
-
191
- # @chat_files = get_file_list(@conversation_path, "*-chat")
192
- # @finding_files = get_file_list(@findings_path, "*-finding")
193
- end
194
-
195
- def save_session_settings(group, session_settings)
196
- # puts ">> save_session_settings <<"
197
- file = Watobo::Utils.snakecase group.gsub(/\.yml/,'')
198
- file << ".yml"
199
-
200
- session_file = File.join(@session_config_path, file)
201
- # puts "Dest.File: #{session_file}"
202
- # puts session_settings.to_yaml
203
- # puts "---"
204
- Watobo::Utils.save_settings(session_file, session_settings)
205
- end
206
-
207
- def load_session_settings(group)
208
- # puts ">> load_session_settings : #{group}"
209
- file = Watobo::Utils.snakecase group.gsub(/\.yml/,'')
210
- file << ".yml"
211
-
212
- session_file = File.join(@session_config_path, file)
213
- # puts "File: #{session_file}"
214
- # puts "---"
215
-
216
- s = Watobo::Utils.load_settings(session_file)
217
- s
218
- end
219
-
220
- def save_project_settings(group, project_settings)
221
- # puts ">> save_project_settings : #{group}"
222
- file = Watobo::Utils.snakecase group.gsub(/\.yml/,'')
223
- file << ".yml"
224
-
225
- project_file = File.join(@project_config_path, file)
226
- # puts "Dest.File: #{project_file}"
227
- # puts project_settings.to_yaml
228
- # puts "---"
229
- Watobo::Utils.save_settings(project_file, project_settings)
230
-
231
- end
232
-
233
- def load_project_settings(group)
234
- # puts ">> load_project_settings : #{group}"
235
- file = Watobo::Utils.snakecase group.gsub(/\.yml/,'')
236
- file << ".yml"
237
-
238
- project_file = File.join(@project_config_path, file)
239
- # puts "File: #{project_file}"
240
- # puts "---"
241
-
242
- s = Watobo::Utils.load_settings(project_file)
243
- s
244
-
245
- end
246
-
247
- def logs
248
- l = ''
249
- @log_lock.synchronize do
250
- l = File.open(@log_file).read
251
- end
252
- l
253
- end
254
-
255
- def logger( message, prefs = {} )
256
- opts = { :sender => "unknown", :level => Watobo::Constants::LOG_INFO }
257
- opts.update prefs
258
- return false if @log_file.nil?
259
- begin
260
- t = Time.now
261
- now = t.strftime("%m/%d/%Y @ %H:%M:%S")
262
- log_message = [ now ]
263
- log_message << "#{opts[:sender]}"
264
- if message.is_a? Array
265
- log_message << message.join("\n| ")
266
- log_message << "\n-"
267
- else
268
- log_message << message
269
- end
270
- @log_lock.synchronize do
271
- File.open(@log_file,"a") do |lfh|
272
- lfh.puts log_message.join("|")
273
- end
274
- end
275
- rescue => bang
276
- puts bang
277
- end
278
-
279
- end
280
-
281
- private
282
-
283
- def chat_valid?(chat)
284
- return false unless chat.respond_to? :request
285
- return false unless chat.respond_to? :response
286
- true
287
- end
288
-
289
- def get_file_list(path, pattern)
290
- fl = Dir["#{path}/#{pattern}"].sort_by{ |x| File.basename(x).sub(/[^0-9]*/,'').to_i }
291
-
292
- fl
293
- end
294
-
295
- end
296
-
1
+ # @private
2
+ module Watobo#:nodoc: all
3
+ class FileSessionStore < SessionStore
4
+ def num_chats
5
+ get_file_list(@conversation_path, "*-chat*").length
6
+ end
7
+
8
+ def num_findings
9
+ get_file_list(@findings_path, "*-finding*").length
10
+ end
11
+
12
+ def add_finding(finding)
13
+ return false unless finding.respond_to? :request
14
+ return false unless finding.respond_to? :response
15
+
16
+ finding_file = File.join("#{@findings_path}", "#{finding.id}-finding.mrs")
17
+ unless File.exist?(finding_file)
18
+ save_finding(finding_file, finding)
19
+ return true
20
+ end
21
+ false
22
+ end
23
+
24
+ def delete_finding(finding)
25
+ finding_file = File.join("#{@findings_path}", "#{finding.id}-finding")
26
+ File.delete finding_file if File.exist? finding_file
27
+ file = finding_file + ".yml"
28
+ File.delete file if File.exist? file
29
+ file = finding_file + ".mrs"
30
+ File.delete file if File.exist? file
31
+
32
+ end
33
+
34
+ def save_finding(fname, finding)
35
+ File.open(fname, 'wb'){|f|
36
+ f.print Marshal::dump(finding.to_h)
37
+ }
38
+ end
39
+
40
+ def save_chat(file, chat)
41
+ File.open(file, 'wb'){|f|
42
+ f.print Marshal::dump(chat.to_h)
43
+ }
44
+ end
45
+
46
+ def update_finding(finding)
47
+ finding_file = File.join("#{@findings_path}", "#{finding.id}-finding.mrs")
48
+
49
+ if File.exist?(finding_file) then
50
+ save_finding(finding_file, finding)
51
+ end
52
+
53
+ end
54
+
55
+ # add_scan_log
56
+ # adds a chat to a specific log store, e.g. if you want to log scan results.
57
+ # needs a scan_name (STRING) as its destination which will be created
58
+ # if the scan name does not exist.
59
+ def add_scan_log(chat, scan_name = nil)
60
+ return false unless chat.respond_to? :request
61
+ return false unless chat.respond_to? :response
62
+ begin
63
+
64
+ return false if scan_name.nil?
65
+ return false if scan_name.empty?
66
+
67
+ scan_name_clean = scan_name.gsub(/[:\\\/\.]*/,"_")
68
+ # puts ">> scan_name"
69
+ path = File.join(@scanlog_path, scan_name_clean)
70
+
71
+ Dir.mkdir path unless File.exist? path
72
+
73
+ file = File.join( path, "log_" + Time.now.to_f.to_s + ".mrs")
74
+
75
+ unless File.exist?(file)
76
+ File.open(file, "wb") { |fh|
77
+ fh.print Marshal::dump(chat.to_h)
78
+ }
79
+ end
80
+
81
+ return true
82
+ rescue => bang
83
+ puts bang
84
+ puts bang.backtrace if $DEBUG
85
+ end
86
+ return false
87
+ end
88
+
89
+ def add_chat(chat)
90
+ return false unless chat_valid? chat
91
+ chat_file = File.join("#{@conversation_path}", "#{chat.id}-chat.mrs")
92
+
93
+ unless File.exist?(chat_file)
94
+ File.open(chat_file, "wb") { |fh|
95
+ fh.print Marshal::dump(chat.to_h)
96
+ }
97
+ chat.file = chat_file
98
+ return true
99
+ end
100
+ return false
101
+ end
102
+
103
+ def each_chat(&block)
104
+ list = get_file_list(@conversation_path, "*-chat*")
105
+ list.each do |fname|
106
+ #puts
107
+ chat = nil
108
+ if fname =~ /\.mrs$/
109
+ chat = Watobo::Utils.loadChatMarshal(fname)
110
+ elsif fname =~ /\.yml$/
111
+ chat = Watobo::Utils.loadChatYAML(fname) unless list.include?(fname.gsub(/yml$/,'mrs'))
112
+ end
113
+ next if chat.nil?
114
+ yield chat if block_given?
115
+ end
116
+ end
117
+
118
+ def each_finding(&block)
119
+ list = get_file_list(@findings_path, "*-finding*")
120
+ list.each do |fname|
121
+ f = nil
122
+ if fname =~ /\.mrs$/
123
+ f = Watobo::Utils.loadFindingMarshal(fname)
124
+ elsif fname =~ /\.yml$/
125
+ f = Watobo::Utils.loadFindingYAML(fname) unless list.include?(fname.gsub(/yml$/,'mrs'))
126
+ end
127
+ next if f.nil?
128
+ yield f if block_given?
129
+ end
130
+ end
131
+
132
+ def initialize(project_name, session_name)
133
+
134
+ wsp = Watobo.workspace_path
135
+ return false unless File.exist? wsp
136
+ puts "* using workspace path: #{wsp}" if $DEBUG
137
+
138
+ @log_file = nil
139
+ @log_lock = Mutex.new
140
+
141
+ @project_path = File.join(wsp, project_name)
142
+ unless File.exist? @project_path
143
+ puts "* create project path: #{@project_path}" if $DEBUG
144
+ Dir.mkdir(@project_path)
145
+ end
146
+
147
+ @project_config_path = File.join(@project_path, ".config")
148
+ Dir.mkdir @project_config_path unless File.exist? @project_config_path
149
+
150
+ @session_path = File.join(@project_path, session_name)
151
+
152
+ unless File.exist? @session_path
153
+ puts "* create session path: #{@session_path}" if $DEBUG
154
+ Dir.mkdir(@session_path)
155
+ end
156
+
157
+ @session_config_path = File.join(@session_path, ".config")
158
+ Dir.mkdir @session_config_path unless File.exist? @session_config_path
159
+
160
+ sext = Watobo::Conf::General.session_settings_file_ext
161
+
162
+ @session_file = File.join(@session_path, session_name + sext)
163
+ @project_file = File.join(@project_path, project_name + Watobo::Conf::General.project_settings_file_ext)
164
+
165
+ @conversation_path = File.expand_path(File.join(@session_path, Watobo::Conf::Datastore.conversations))
166
+
167
+ @findings_path = File.expand_path(File.join(@session_path, Watobo::Conf::Datastore.findings))
168
+ @log_path = File.expand_path(File.join(@session_path, Watobo::Conf::Datastore.event_logs_dir))
169
+ @scanlog_path = File.expand_path(File.join(@session_path, Watobo::Conf::Datastore.scan_logs_dir))
170
+
171
+ [ @conversation_path, @findings_path, @log_path, @scanlog_path ].each do |folder|
172
+ if not File.exist?(folder) then
173
+ puts "create path #{folder}"
174
+ begin
175
+ Dir.mkdir(folder)
176
+ rescue SystemCallError => bang
177
+ puts "!!!ERROR:"
178
+ puts bang
179
+ rescue => bang
180
+ puts "!!!ERROR:"
181
+ puts bang
182
+ end
183
+ end
184
+ end
185
+
186
+ @log_file = File.join(@log_path, session_name + ".log")
187
+
188
+ # @chat_files = get_file_list(@conversation_path, "*-chat")
189
+ # @finding_files = get_file_list(@findings_path, "*-finding")
190
+ end
191
+
192
+ def save_session_settings(group, session_settings)
193
+ # puts ">> save_session_settings <<"
194
+ file = Watobo::Utils.snakecase group.gsub(/\.yml/,'')
195
+ file << ".yml"
196
+
197
+ session_file = File.join(@session_config_path, file)
198
+ # puts "Dest.File: #{session_file}"
199
+ # puts session_settings.to_yaml
200
+ # puts "---"
201
+ Watobo::Utils.save_settings(session_file, session_settings)
202
+ end
203
+
204
+ def load_session_settings(group)
205
+ # puts ">> load_session_settings : #{group}"
206
+ file = Watobo::Utils.snakecase group.gsub(/\.yml/,'')
207
+ file << ".yml"
208
+
209
+ session_file = File.join(@session_config_path, file)
210
+ # puts "File: #{session_file}"
211
+ # puts "---"
212
+
213
+ s = Watobo::Utils.load_settings(session_file)
214
+ s
215
+ end
216
+
217
+ def save_project_settings(group, project_settings)
218
+ # puts ">> save_project_settings : #{group}"
219
+ file = Watobo::Utils.snakecase group.gsub(/\.yml/,'')
220
+ file << ".yml"
221
+
222
+ project_file = File.join(@project_config_path, file)
223
+ # puts "Dest.File: #{project_file}"
224
+ # puts project_settings.to_yaml
225
+ # puts "---"
226
+ Watobo::Utils.save_settings(project_file, project_settings)
227
+
228
+ end
229
+
230
+ def load_project_settings(group)
231
+ # puts ">> load_project_settings : #{group}"
232
+ file = Watobo::Utils.snakecase group.gsub(/\.yml/,'')
233
+ file << ".yml"
234
+
235
+ project_file = File.join(@project_config_path, file)
236
+ # puts "File: #{project_file}"
237
+ # puts "---"
238
+
239
+ s = Watobo::Utils.load_settings(project_file)
240
+ s
241
+
242
+ end
243
+
244
+ def logs
245
+ l = ''
246
+ @log_lock.synchronize do
247
+ l = File.open(@log_file).read
248
+ end
249
+ l
250
+ end
251
+
252
+ def logger( message, prefs = {} )
253
+ opts = { :sender => "unknown", :level => Watobo::Constants::LOG_INFO }
254
+ opts.update prefs
255
+ return false if @log_file.nil?
256
+ begin
257
+ t = Time.now
258
+ now = t.strftime("%m/%d/%Y @ %H:%M:%S")
259
+ log_message = [ now ]
260
+ log_message << "#{opts[:sender]}"
261
+ if message.is_a? Array
262
+ log_message << message.join("\n| ")
263
+ log_message << "\n-"
264
+ else
265
+ log_message << message
266
+ end
267
+ @log_lock.synchronize do
268
+ File.open(@log_file,"a") do |lfh|
269
+ lfh.puts log_message.join("|")
270
+ end
271
+ end
272
+ rescue => bang
273
+ puts bang
274
+ end
275
+
276
+ end
277
+
278
+ private
279
+
280
+ def chat_valid?(chat)
281
+ return false unless chat.respond_to? :request
282
+ return false unless chat.respond_to? :response
283
+ true
284
+ end
285
+
286
+ def get_file_list(path, pattern)
287
+ fl = Dir["#{path}/#{pattern}"].sort_by{ |x| File.basename(x).sub(/[^0-9]*/,'').to_i }
288
+
289
+ fl
290
+ end
291
+
292
+ end
293
+
297
294
  end