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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +46 -1
- data/bin/nfq_server.rb +0 -9
- data/bin/watobo_gui.rb +3 -13
- data/custom-views/prettify-json.rb +9 -18
- data/icons/watobo.ico +0 -0
- data/icons/watobo.ico.old +0 -0
- data/lib/watobo.rb +10 -19
- data/lib/watobo/adapters.rb +5 -14
- data/lib/watobo/adapters/data_store.rb +50 -59
- data/lib/watobo/adapters/file/file_store.rb +287 -296
- data/lib/watobo/adapters/file/marshal_store.rb +293 -296
- data/lib/watobo/adapters/session_store.rb +5 -14
- data/lib/watobo/ca.rb +1 -10
- data/lib/watobo/config.rb +197 -206
- data/lib/watobo/constants.rb +0 -9
- data/lib/watobo/core.rb +3 -12
- data/lib/watobo/core/active_check.rb +72 -135
- data/lib/watobo/core/active_checks.rb +49 -58
- data/lib/watobo/core/ca.rb +369 -389
- data/lib/watobo/core/cert_store.rb +34 -43
- data/lib/watobo/core/chat.rb +92 -101
- data/lib/watobo/core/chats.rb +271 -280
- data/lib/watobo/core/client_cert_store.rb +106 -35
- data/lib/watobo/core/conversation.rb +48 -57
- data/lib/watobo/core/cookie.rb +23 -32
- data/lib/watobo/core/egress_handlers.rb +98 -0
- data/lib/watobo/core/finding.rb +66 -75
- data/lib/watobo/core/findings.rb +107 -114
- data/lib/watobo/core/forwarding_proxy.rb +13 -22
- data/lib/watobo/core/fuzz_gen.rb +0 -9
- data/lib/watobo/core/intercept_carver.rb +166 -177
- data/lib/watobo/core/intercept_filter.rb +235 -244
- data/lib/watobo/core/interceptor.rb +98 -107
- data/lib/watobo/core/min_class.rb +4 -13
- data/lib/watobo/core/netfilter_queue.rb +170 -179
- data/lib/watobo/core/ott_cache.rb +132 -141
- data/lib/watobo/core/parameter.rb +43 -52
- data/lib/watobo/core/passive_check.rb +103 -102
- data/lib/watobo/core/passive_checks.rb +48 -57
- data/lib/watobo/core/passive_scanner.rb +54 -55
- data/lib/watobo/core/plugin.rb +11 -20
- data/lib/watobo/core/project.rb +3 -9
- data/lib/watobo/core/proxy.rb +43 -52
- data/lib/watobo/core/request.rb +125 -123
- data/lib/watobo/core/response.rb +44 -53
- data/lib/watobo/core/scanner.rb +0 -9
- data/lib/watobo/core/scanner3.rb +405 -414
- data/lib/watobo/core/scope.rb +83 -92
- data/lib/watobo/core/session.rb +1043 -1026
- data/lib/watobo/core/sid_cache.rb +98 -107
- data/lib/watobo/core/subscriber.rb +25 -34
- data/lib/watobo/defaults.rb +21 -30
- data/lib/watobo/external/diff/lcs.rb +0 -9
- data/lib/watobo/external/diff/lcs/array.rb +0 -9
- data/lib/watobo/external/diff/lcs/block.rb +0 -9
- data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
- data/lib/watobo/external/diff/lcs/change.rb +0 -9
- data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
- data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
- data/lib/watobo/external/diff/lcs/string.rb +0 -9
- data/lib/watobo/externals.rb +6 -15
- data/lib/watobo/framework.rb +4 -13
- data/lib/watobo/framework/create_project.rb +60 -69
- data/lib/watobo/framework/init.rb +0 -9
- data/lib/watobo/framework/init_modules.rb +0 -9
- data/lib/watobo/framework/license_text.rb +28 -37
- data/lib/watobo/framework/load_chat.rb +13 -22
- data/lib/watobo/gui.rb +132 -123
- data/lib/watobo/gui/about_watobo.rb +0 -9
- data/lib/watobo/gui/browser_preview.rb +0 -9
- data/lib/watobo/gui/certificate_dialog.rb +0 -9
- data/lib/watobo/gui/chat_diff.rb +0 -9
- data/lib/watobo/gui/chatviewer_frame.rb +73 -72
- data/lib/watobo/gui/checkboxtree.rb +0 -9
- data/lib/watobo/gui/checks_policy_frame.rb +0 -9
- data/lib/watobo/gui/client_cert_dialog.rb +96 -87
- data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
- data/lib/watobo/gui/conversation_table.rb +158 -164
- data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
- data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
- data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
- data/lib/watobo/gui/custom_viewer.rb +374 -383
- data/lib/watobo/gui/dashboard.rb +296 -303
- data/lib/watobo/gui/define_scope_frame.rb +0 -9
- data/lib/watobo/gui/differ_frame.rb +215 -224
- data/lib/watobo/gui/edit_comment.rb +0 -9
- data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
- data/lib/watobo/gui/export_dialog.rb +104 -113
- data/lib/watobo/gui/finding_info.rb +0 -9
- data/lib/watobo/gui/findings_tree.rb +210 -217
- data/lib/watobo/gui/full_scan_dialog.rb +0 -9
- data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
- data/lib/watobo/gui/fxsave_thread.rb +14 -0
- data/lib/watobo/gui/goto_url_dialog.rb +70 -79
- data/lib/watobo/gui/hex_viewer.rb +0 -9
- data/lib/watobo/gui/html_viewer.rb +287 -296
- data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
- data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
- data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
- data/lib/watobo/gui/json_viewer.rb +287 -0
- data/lib/watobo/gui/list_box.rb +101 -110
- data/lib/watobo/gui/log_file_viewer.rb +32 -41
- data/lib/watobo/gui/log_viewer.rb +83 -88
- data/lib/watobo/gui/login_wizzard.rb +0 -9
- data/lib/watobo/gui/main_window.rb +587 -618
- data/lib/watobo/gui/manual_request_editor.rb +620 -565
- data/lib/watobo/gui/master_pw_dialog.rb +0 -9
- data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
- data/lib/watobo/gui/page_tree.rb +217 -226
- data/lib/watobo/gui/password_policy_dialog.rb +0 -9
- data/lib/watobo/gui/plugin_board.rb +0 -9
- data/lib/watobo/gui/preferences_dialog.rb +0 -9
- data/lib/watobo/gui/progress_window.rb +17 -27
- data/lib/watobo/gui/project_wizzard.rb +0 -9
- data/lib/watobo/gui/proxy_dialog.rb +1 -10
- data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
- data/lib/watobo/gui/request_builder_frame.rb +102 -111
- data/lib/watobo/gui/request_editor.rb +181 -137
- data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
- data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
- data/lib/watobo/gui/save_chat_dialog.rb +140 -149
- data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
- data/lib/watobo/gui/select_chat_dialog.rb +0 -9
- data/lib/watobo/gui/session_management_dialog.rb +0 -9
- data/lib/watobo/gui/sites_tree.rb +0 -9
- data/lib/watobo/gui/status_bar.rb +0 -9
- data/lib/watobo/gui/table_editor.rb +0 -9
- data/lib/watobo/gui/tagless_viewer.rb +0 -9
- data/lib/watobo/gui/templates/plugin.rb +0 -9
- data/lib/watobo/gui/templates/plugin2.rb +92 -100
- data/lib/watobo/gui/templates/plugin_base.rb +144 -153
- data/lib/watobo/gui/text_viewer.rb +0 -9
- data/lib/watobo/gui/transcoder_window.rb +0 -9
- data/lib/watobo/gui/utils/gui_utils.rb +0 -9
- data/lib/watobo/gui/utils/init_icons.rb +86 -95
- data/lib/watobo/gui/utils/load_icons.rb +33 -42
- data/lib/watobo/gui/utils/load_plugins.rb +116 -119
- data/lib/watobo/gui/utils/master_password.rb +68 -77
- data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
- data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
- data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
- data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
- data/lib/watobo/gui/utils/session_history.rb +112 -121
- data/lib/watobo/gui/workspace_dialog.rb +0 -9
- data/lib/watobo/gui/www_auth_dialog.rb +0 -9
- data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
- data/lib/watobo/http.rb +4 -13
- data/lib/watobo/http/cookies/cookies.rb +26 -35
- data/lib/watobo/http/data/data.rb +45 -54
- data/lib/watobo/http/data/json.rb +47 -55
- data/lib/watobo/http/url/url.rb +38 -47
- data/lib/watobo/http/xml/xml.rb +124 -130
- data/lib/watobo/interceptor.rb +3 -12
- data/lib/watobo/interceptor/proxy.rb +742 -739
- data/lib/watobo/interceptor/transparent.rb +22 -24
- data/lib/watobo/mixins.rb +10 -19
- data/lib/watobo/mixins/check_info.rb +27 -36
- data/lib/watobo/mixins/httpparser.rb +613 -637
- data/lib/watobo/mixins/request_parser.rb +88 -97
- data/lib/watobo/mixins/shapers.rb +515 -529
- data/lib/watobo/mixins/transcoders.rb +3 -11
- data/lib/watobo/parser.rb +1 -10
- data/lib/watobo/parser/html.rb +83 -92
- data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
- data/lib/watobo/sockets.rb +3 -12
- data/lib/watobo/sockets/agent.rb +828 -837
- data/lib/watobo/sockets/client_socket.rb +308 -312
- data/lib/watobo/sockets/connection.rb +401 -410
- data/lib/watobo/sockets/http_socket.rb +11 -13
- data/lib/watobo/sockets/ntlm_auth.rb +129 -138
- data/lib/watobo/utils.rb +10 -19
- data/lib/watobo/utils/check_regex.rb +0 -9
- data/lib/watobo/utils/copy_object.rb +0 -9
- data/lib/watobo/utils/crypto.rb +0 -9
- data/lib/watobo/utils/expand_range.rb +23 -32
- data/lib/watobo/utils/export_xml.rb +97 -106
- data/lib/watobo/utils/file_management.rb +9 -11
- data/lib/watobo/utils/hexprint.rb +9 -18
- data/lib/watobo/utils/load_chat.rb +0 -9
- data/lib/watobo/utils/load_icon.rb +0 -9
- data/lib/watobo/utils/ntlm.rb +866 -875
- data/lib/watobo/utils/print_debug.rb +12 -21
- data/lib/watobo/utils/response_builder.rb +90 -99
- data/lib/watobo/utils/response_hash.rb +0 -9
- data/lib/watobo/utils/secure_eval.rb +0 -9
- data/lib/watobo/utils/strings.rb +10 -19
- data/lib/watobo/utils/text2request.rb +0 -9
- data/lib/watobo/utils/url.rb +23 -32
- data/lib/watobo/utils/utf16.rb +11 -20
- data/modules/active/Apache/mod_status.rb +0 -9
- data/modules/active/Apache/multiview.rb +151 -160
- data/modules/active/Flash/crossdomain.rb +0 -9
- data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
- data/modules/active/cq5/cq5_default_selectors.rb +106 -115
- data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
- data/modules/active/directories/dirwalker.rb +0 -9
- data/modules/active/discovery/fileextensions.rb +0 -9
- data/modules/active/discovery/http_methods.rb +0 -9
- data/modules/active/discovery/jsmapfiles.rb +79 -0
- data/modules/active/domino/domino_db.rb +68 -76
- data/modules/active/dotNET/custom_errors.rb +102 -111
- data/modules/active/dotNET/dotnet_files.rb +90 -99
- data/modules/active/fileinclusion/lfi_simple.rb +0 -9
- data/modules/active/jboss/jboss_basic.rb +0 -9
- data/modules/active/sap/business_objects.rb +51 -60
- data/modules/active/sap/its_commands.rb +0 -9
- data/modules/active/sap/its_service_parameter.rb +0 -9
- data/modules/active/sap/its_services.rb +0 -9
- data/modules/active/sap/its_xss.rb +0 -9
- data/modules/active/shell_shock/shell_shock.rb +139 -148
- data/modules/active/siebel/siebel_apps.rb +160 -169
- data/modules/active/sqlinjection/sql_boolean.rb +0 -9
- data/modules/active/sqlinjection/sql_numerical.rb +198 -0
- data/modules/active/sqlinjection/sqli_error.rb +0 -9
- data/modules/active/sqlinjection/sqli_timing.rb +220 -229
- data/modules/active/struts2/default_handler_ognl.rb +106 -115
- data/modules/active/struts2/include_params_ognl.rb +105 -114
- data/modules/active/xml/xml_xxe.rb +112 -123
- data/modules/active/xss/xss_ng.rb +214 -223
- data/modules/active/xss/xss_simple.rb +0 -9
- data/modules/passive/ajax.rb +68 -77
- data/modules/passive/autocomplete.rb +56 -65
- data/modules/passive/cookie_options.rb +0 -9
- data/modules/passive/cookie_xss.rb +0 -9
- data/modules/passive/detect_code.rb +0 -9
- data/modules/passive/detect_fileupload.rb +0 -9
- data/modules/passive/detect_infrastructure.rb +0 -9
- data/modules/passive/detect_one_time_tokens.rb +0 -9
- data/modules/passive/dirindexing.rb +0 -9
- data/modules/passive/disclosure_domino.rb +55 -64
- data/modules/passive/disclosure_emails.rb +0 -9
- data/modules/passive/disclosure_ipaddr.rb +55 -53
- data/modules/passive/filename_as_parameter.rb +0 -9
- data/modules/passive/form_spotter.rb +0 -9
- data/modules/passive/hidden_fields.rb +50 -59
- data/modules/passive/hotspots.rb +0 -9
- data/modules/passive/in_script_parameter.rb +0 -9
- data/modules/passive/json_web_token.rb +93 -0
- data/modules/passive/multiple_server_headers.rb +0 -9
- data/modules/passive/possible_login.rb +0 -9
- data/modules/passive/redirect_url.rb +0 -9
- data/modules/passive/redirectionz.rb +0 -9
- data/modules/passive/sap-headers.rb +56 -65
- data/modules/passive/xss_dom.rb +0 -9
- data/plugins/aem/aem.rb +11 -20
- data/plugins/aem/gui/main.rb +118 -127
- data/plugins/aem/gui/tree_view.rb +171 -180
- data/plugins/aem/lib/agent.rb +130 -138
- data/plugins/aem/lib/dispatcher.rb +45 -51
- data/plugins/aem/lib/engine.rb +177 -186
- data/plugins/catalog/catalog.rb +345 -355
- data/plugins/crawler/crawler.rb +4 -13
- data/plugins/crawler/gui.rb +5 -14
- data/plugins/crawler/gui/auth_frame.rb +270 -279
- data/plugins/crawler/gui/crawler_gui.rb +271 -276
- data/plugins/crawler/gui/general_settings_frame.rb +96 -105
- data/plugins/crawler/gui/hooks_frame.rb +80 -89
- data/plugins/crawler/gui/scope_frame.rb +50 -59
- data/plugins/crawler/gui/settings_tabbook.rb +38 -47
- data/plugins/crawler/gui/status_frame.rb +59 -68
- data/plugins/crawler/lib/bags.rb +18 -27
- data/plugins/crawler/lib/constants.rb +11 -20
- data/plugins/crawler/lib/engine.rb +488 -497
- data/plugins/crawler/lib/grabber.rb +68 -77
- data/plugins/crawler/lib/status.rb +71 -80
- data/plugins/crawler/lib/uri_mp.rb +12 -21
- data/plugins/filefinder/filefinder.rb +326 -333
- data/plugins/sqlmap/bin/test.rb +78 -87
- data/plugins/sqlmap/gui.rb +4 -13
- data/plugins/sqlmap/gui/main.rb +218 -227
- data/plugins/sqlmap/gui/options_frame.rb +97 -106
- data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
- data/plugins/sqlmap/sqlmap.rb +2 -11
- data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
- data/plugins/sslchecker/gui/cipher_table.rb +246 -254
- data/plugins/sslchecker/gui/gui.rb +258 -264
- data/plugins/sslchecker/gui/sslchecker.rb +4 -13
- data/plugins/sslchecker/lib/check.rb +127 -133
- data/plugins/wshell/gui/main.rb +119 -117
- data/plugins/wshell/lib/core.rb +38 -88
- data/plugins/wshell/wshell.rb +11 -20
- metadata +170 -164
|
@@ -1,45 +1,36 @@
|
|
|
1
|
-
#.
|
|
2
|
-
# cert_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
1
|
# @private
|
|
11
|
-
module Watobo#:nodoc: all
|
|
12
|
-
module CertStore
|
|
13
|
-
@fake_certs = Hash.new
|
|
14
|
-
def self.acquire_ssl_ctx(target, cn)
|
|
15
|
-
ctx = OpenSSL::SSL::SSLContext.new()
|
|
16
|
-
|
|
17
|
-
unless @fake_certs.has_key? target
|
|
18
|
-
cert_prefs = {
|
|
19
|
-
:hostname => cn,
|
|
20
|
-
:type => 'server',
|
|
21
|
-
:user => 'watobo',
|
|
22
|
-
:email => 'watobo@localhost',
|
|
23
|
-
}
|
|
24
|
-
cert_file, key_file = Watobo::CA.create_cert cert_prefs
|
|
25
|
-
fake_cert = OpenSSL::X509::Certificate.new(File.read(cert_file))
|
|
26
|
-
fake_key = OpenSSL::PKey::RSA.new(File.read(key_file))
|
|
27
|
-
|
|
28
|
-
#ctx = OpenSSL::SSL::SSLContext.new('SSLv23_server')
|
|
29
|
-
@fake_certs[target] = { :cert => fake_cert, :key => fake_key }
|
|
30
|
-
|
|
31
|
-
end
|
|
32
|
-
fc = @fake_certs[target]
|
|
33
|
-
ctx.cert = fc[:cert]
|
|
34
|
-
ctx.key = fc[:key]
|
|
35
|
-
|
|
36
|
-
ctx.tmp_dh_callback = proc { |*args|
|
|
37
|
-
Watobo::CA.dh_key
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
41
|
-
ctx.timeout = 10
|
|
42
|
-
return ctx
|
|
43
|
-
end
|
|
44
|
-
end
|
|
2
|
+
module Watobo#:nodoc: all
|
|
3
|
+
module CertStore
|
|
4
|
+
@fake_certs = Hash.new
|
|
5
|
+
def self.acquire_ssl_ctx(target, cn)
|
|
6
|
+
ctx = OpenSSL::SSL::SSLContext.new()
|
|
7
|
+
|
|
8
|
+
unless @fake_certs.has_key? target
|
|
9
|
+
cert_prefs = {
|
|
10
|
+
:hostname => cn,
|
|
11
|
+
:type => 'server',
|
|
12
|
+
:user => 'watobo',
|
|
13
|
+
:email => 'watobo@localhost',
|
|
14
|
+
}
|
|
15
|
+
cert_file, key_file = Watobo::CA.create_cert cert_prefs
|
|
16
|
+
fake_cert = OpenSSL::X509::Certificate.new(File.read(cert_file))
|
|
17
|
+
fake_key = OpenSSL::PKey::RSA.new(File.read(key_file))
|
|
18
|
+
|
|
19
|
+
#ctx = OpenSSL::SSL::SSLContext.new('SSLv23_server')
|
|
20
|
+
@fake_certs[target] = { :cert => fake_cert, :key => fake_key }
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
fc = @fake_certs[target]
|
|
24
|
+
ctx.cert = fc[:cert]
|
|
25
|
+
ctx.key = fc[:key]
|
|
26
|
+
|
|
27
|
+
ctx.tmp_dh_callback = proc { |*args|
|
|
28
|
+
Watobo::CA.dh_key
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
32
|
+
ctx.timeout = 10
|
|
33
|
+
return ctx
|
|
34
|
+
end
|
|
35
|
+
end
|
|
45
36
|
end
|
data/lib/watobo/core/chat.rb
CHANGED
|
@@ -1,65 +1,56 @@
|
|
|
1
|
-
#.
|
|
2
|
-
# chat.rb
|
|
3
|
-
#.
|
|
4
|
-
# Copyright 2014 by siberas, http://www.siberas.de
|
|
5
|
-
# This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
|
|
6
|
-
# WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
|
|
7
|
-
# WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
8
|
-
# You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
9
|
-
|
|
10
1
|
# @private
|
|
11
|
-
module Watobo#:nodoc: all
|
|
12
|
-
class Chat < Conversation
|
|
13
|
-
attr :request
|
|
14
|
-
attr :response
|
|
15
|
-
attr :settings
|
|
16
|
-
|
|
17
|
-
@@numChats = 0
|
|
18
|
-
@@max_id = 0
|
|
19
|
-
|
|
20
|
-
@@lock = Mutex.new
|
|
21
|
-
|
|
22
|
-
public
|
|
23
|
-
def resetCounters()
|
|
24
|
-
@@numChats = 0
|
|
25
|
-
@@max_id = 0
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def tested?()
|
|
29
|
-
return false unless @settings.has_key?(:tested)
|
|
30
|
-
return @settings[:tested]
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def tested=(truefalse)
|
|
34
|
-
@settings[:tested] = truefalse
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def tstart()
|
|
38
|
-
@settings[:tstart]
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def tstop()
|
|
42
|
-
@settings[:tstop]
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def id()
|
|
46
|
-
@settings[:id]
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def comment=(c)
|
|
50
|
-
@settings[:comment] = c
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def comment()
|
|
54
|
-
@settings[:comment]
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def use_ssl?
|
|
58
|
-
request.proto =~ /https/
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def source()
|
|
62
|
-
@settings[:source]
|
|
2
|
+
module Watobo#:nodoc: all
|
|
3
|
+
class Chat < Conversation
|
|
4
|
+
attr :request
|
|
5
|
+
attr :response
|
|
6
|
+
attr :settings
|
|
7
|
+
|
|
8
|
+
@@numChats = 0
|
|
9
|
+
@@max_id = 0
|
|
10
|
+
|
|
11
|
+
@@lock = Mutex.new
|
|
12
|
+
|
|
13
|
+
public
|
|
14
|
+
def resetCounters()
|
|
15
|
+
@@numChats = 0
|
|
16
|
+
@@max_id = 0
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def tested?()
|
|
20
|
+
return false unless @settings.has_key?(:tested)
|
|
21
|
+
return @settings[:tested]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def tested=(truefalse)
|
|
25
|
+
@settings[:tested] = truefalse
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def tstart()
|
|
29
|
+
@settings[:tstart]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def tstop()
|
|
33
|
+
@settings[:tstop]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def id()
|
|
37
|
+
@settings[:id]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def comment=(c)
|
|
41
|
+
@settings[:comment] = c
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def comment()
|
|
45
|
+
@settings[:comment]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def use_ssl?
|
|
49
|
+
request.proto =~ /https/
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def source()
|
|
53
|
+
@settings[:source]
|
|
63
54
|
end
|
|
64
55
|
|
|
65
56
|
def to_h
|
|
@@ -68,19 +59,19 @@ module Watobo#:nodoc: all
|
|
|
68
59
|
h[:request] = @request.to_a
|
|
69
60
|
h[:response] = @response.to_a
|
|
70
61
|
h
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
# INITIALIZE ( request, response, prefs )
|
|
75
|
-
# prefs:
|
|
76
|
-
# :source - source of request/response CHAT_SOURCE
|
|
77
|
-
# :id - an initial id, if no id is given it will be set to the @@max_id, if id == 0 counters will be ignored.
|
|
78
|
-
# :start - starting time of request format is Time.now.to_f
|
|
79
|
-
# :stop - time of loading response has finished
|
|
80
|
-
# :
|
|
81
|
-
def initialize(request, response, prefs = {})
|
|
82
|
-
|
|
83
|
-
begin
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# INITIALIZE ( request, response, prefs )
|
|
66
|
+
# prefs:
|
|
67
|
+
# :source - source of request/response CHAT_SOURCE
|
|
68
|
+
# :id - an initial id, if no id is given it will be set to the @@max_id, if id == 0 counters will be ignored.
|
|
69
|
+
# :start - starting time of request format is Time.now.to_f
|
|
70
|
+
# :stop - time of loading response has finished
|
|
71
|
+
# :
|
|
72
|
+
def initialize(request, response, prefs = {})
|
|
73
|
+
|
|
74
|
+
begin
|
|
84
75
|
@settings = {
|
|
85
76
|
:source => CHAT_SOURCE_UNDEF,
|
|
86
77
|
:id => -1,
|
|
@@ -90,31 +81,31 @@ module Watobo#:nodoc: all
|
|
|
90
81
|
:tested => false
|
|
91
82
|
}
|
|
92
83
|
|
|
93
|
-
super(request, response)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
@settings.update prefs
|
|
98
|
-
# puts @settings[:id].to_s
|
|
99
|
-
|
|
100
|
-
@@lock.synchronize{
|
|
101
|
-
# enter critical section here ???
|
|
102
|
-
if @settings[:id] > @@max_id
|
|
103
|
-
@@max_id = @settings[:id]
|
|
104
|
-
elsif @settings[:id] < 0
|
|
105
|
-
@@max_id += 1
|
|
106
|
-
@settings[:id] = @@max_id
|
|
107
|
-
end
|
|
108
|
-
@@numChats += 1
|
|
109
|
-
# @comment = ''
|
|
110
|
-
# leafe critical section here ???
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
rescue => bang
|
|
114
|
-
puts bang
|
|
115
|
-
puts bang.backtrace if $DEBUG
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
end
|
|
84
|
+
super(request, response)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@settings.update prefs
|
|
89
|
+
# puts @settings[:id].to_s
|
|
90
|
+
|
|
91
|
+
@@lock.synchronize{
|
|
92
|
+
# enter critical section here ???
|
|
93
|
+
if @settings[:id] > @@max_id
|
|
94
|
+
@@max_id = @settings[:id]
|
|
95
|
+
elsif @settings[:id] < 0
|
|
96
|
+
@@max_id += 1
|
|
97
|
+
@settings[:id] = @@max_id
|
|
98
|
+
end
|
|
99
|
+
@@numChats += 1
|
|
100
|
+
# @comment = ''
|
|
101
|
+
# leafe critical section here ???
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
rescue => bang
|
|
105
|
+
puts bang
|
|
106
|
+
puts bang.backtrace if $DEBUG
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
120
111
|
end
|
data/lib/watobo/core/chats.rb
CHANGED
|
@@ -1,298 +1,289 @@
|
|
|
1
|
-
#.
|
|
2
|
-
# chats.rb
|
|
3
|
-
#.
|
|
4
|
-
# Copyright 2014 by siberas, http://www.siberas.de
|
|
5
|
-
# This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
|
|
6
|
-
# WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
|
|
7
|
-
# WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
8
|
-
# You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
9
|
-
|
|
10
1
|
# @private
|
|
11
|
-
module Watobo#:nodoc: all
|
|
12
|
-
class Chats
|
|
13
|
-
@chats = []
|
|
14
|
-
@chats_lock = Mutex.new
|
|
15
|
-
@event_dispatcher_listeners = Hash.new
|
|
16
|
-
def self.subscribe(event, &callback)
|
|
17
|
-
(@event_dispatcher_listeners[event] ||= []) << callback
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def self.clearEvents(event)
|
|
21
|
-
@event_dispatcher_listeners[event] ||= []
|
|
22
|
-
@event_dispatcher_listeners[event].clear
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def self.notify(event, *args)
|
|
26
|
-
if @event_dispatcher_listeners[event]
|
|
27
|
-
@event_dispatcher_listeners[event].each do |m|
|
|
28
|
-
m.call(*args) if m.respond_to? :call
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def self.reset
|
|
34
|
-
@chats = []
|
|
35
|
-
@event_dispatcher_listeners = Hash.new
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def self.load
|
|
39
|
-
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def self.select(site, opts={}, &block)
|
|
43
|
-
o = {
|
|
44
|
-
:dir => "",
|
|
45
|
-
#:file => nil,
|
|
46
|
-
:method => nil,
|
|
47
|
-
:max_count => 0
|
|
48
|
-
}
|
|
49
|
-
o.update opts
|
|
50
|
-
o[:dir].strip!
|
|
51
|
-
o[:dir].gsub!(/^\//,"")
|
|
52
|
-
|
|
53
|
-
matches = []
|
|
54
|
-
@chats.each do |c|
|
|
55
|
-
if c.request.site == site then
|
|
2
|
+
module Watobo#:nodoc: all
|
|
3
|
+
class Chats
|
|
4
|
+
@chats = []
|
|
5
|
+
@chats_lock = Mutex.new
|
|
6
|
+
@event_dispatcher_listeners = Hash.new
|
|
7
|
+
def self.subscribe(event, &callback)
|
|
8
|
+
(@event_dispatcher_listeners[event] ||= []) << callback
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.clearEvents(event)
|
|
12
|
+
@event_dispatcher_listeners[event] ||= []
|
|
13
|
+
@event_dispatcher_listeners[event].clear
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.notify(event, *args)
|
|
17
|
+
if @event_dispatcher_listeners[event]
|
|
18
|
+
@event_dispatcher_listeners[event].each do |m|
|
|
19
|
+
m.call(*args) if m.respond_to? :call
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.reset
|
|
25
|
+
@chats = []
|
|
26
|
+
@event_dispatcher_listeners = Hash.new
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.load
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.select(site, opts={}, &block)
|
|
34
|
+
o = {
|
|
35
|
+
:dir => "",
|
|
36
|
+
#:file => nil,
|
|
37
|
+
:method => nil,
|
|
38
|
+
:max_count => 0
|
|
39
|
+
}
|
|
40
|
+
o.update opts
|
|
41
|
+
o[:dir].strip!
|
|
42
|
+
o[:dir].gsub!(/^\//,"")
|
|
43
|
+
|
|
44
|
+
matches = []
|
|
45
|
+
@chats.each do |c|
|
|
46
|
+
if c.request.site == site then
|
|
56
47
|
matches.push c if o[:dir] == c.request.dir
|
|
57
|
-
yield c if block_given?
|
|
58
|
-
end
|
|
59
|
-
return matches if o[:max_count] > 0 and matches.length >= o[:max_count]
|
|
60
|
-
end
|
|
61
|
-
return matches
|
|
62
|
-
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def self.sites(prefs={}, &block)
|
|
66
|
-
list = Hash.new
|
|
67
|
-
|
|
68
|
-
cprefs = { :in_scope => false,
|
|
69
|
-
:ssl => false
|
|
70
|
-
}
|
|
71
|
-
cprefs.update prefs
|
|
72
|
-
|
|
73
|
-
Watobo::Chats.each do |chat|
|
|
74
|
-
next if list.has_key?(chat.request.site)
|
|
75
|
-
site = chat.request.site
|
|
76
|
-
next if cprefs[:in_scope] == true and not Watobo::Scope.match_site?(site)
|
|
77
|
-
next if cprefs[:ssl] and not chat.use_ssl?
|
|
78
|
-
|
|
79
|
-
yield site if block_given?
|
|
80
|
-
list[site] = nil
|
|
81
|
-
|
|
82
|
-
end
|
|
83
|
-
return list.keys
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def self.dirs(site, list_opts={}, &block)
|
|
87
|
-
opts = { :base_dir => "",
|
|
88
|
-
:include_subdirs => true
|
|
89
|
-
}
|
|
90
|
-
opts.update(list_opts) if list_opts.is_a? Hash
|
|
91
|
-
list = Hash.new
|
|
92
|
-
@chats.each do |chat|
|
|
93
|
-
next if chat.request.site != site
|
|
94
|
-
next if list.has_key?(chat.request.path)
|
|
95
|
-
next if opts[:base_dir] != "" and chat.request.path !~ /^#{Regexp.quote(opts[:base_dir])}/
|
|
96
|
-
subdirs = chat.request.subDirs
|
|
97
|
-
subdirs.each do |dir|
|
|
98
|
-
next if dir.nil?
|
|
99
|
-
next if list.has_key?(dir)
|
|
100
|
-
list[dir] = :path
|
|
101
|
-
if opts[:include_subdirs] == true then
|
|
102
|
-
yield dir if block_given?
|
|
103
|
-
else
|
|
104
|
-
d = dir.gsub(/#{Regexp.quote(opts[:base_dir])}/,"")
|
|
105
|
-
yield dir unless d =~ /\// and block_given?
|
|
106
|
-
# otherwise it is a subdir of base_dir
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def self.get_by_id(chatid)
|
|
113
|
-
@chats_lock.synchronize do
|
|
114
|
-
@chats.each do |c|
|
|
115
|
-
if c.id.to_s == chatid.to_s then
|
|
116
|
-
return c
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
return nil
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def self.each(&block)
|
|
124
|
-
if block_given?
|
|
125
|
-
@chats_lock.synchronize do
|
|
126
|
-
@chats.map{|c| yield c }
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def self.to_a
|
|
132
|
-
@chats
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def self.length
|
|
136
|
-
l = 0
|
|
137
|
-
@chats_lock.synchronize do
|
|
138
|
-
l = @chats.length
|
|
139
|
-
end
|
|
140
|
-
l
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def self.in_scope(&block)
|
|
144
|
-
scan_prefs = Watobo::Conf::Scanner.to_h
|
|
145
|
-
#puts scan_prefs.to_yaml
|
|
146
|
-
unique_list = Hash.new
|
|
147
|
-
cis = []
|
|
148
|
-
|
|
149
|
-
@chats.each do |chat|
|
|
150
|
-
next if scan_prefs[:excluded_chats].include?(chat.id)
|
|
151
|
-
uch = chat.request.uniq_hash
|
|
152
|
-
|
|
153
|
-
next if unique_list.has_key?(uch) and scan_prefs[:smart_scan] == true
|
|
154
|
-
unique_list[uch] = nil
|
|
155
|
-
if Watobo::Scope.match_chat? chat
|
|
156
|
-
cis << chat
|
|
157
|
-
yield chat if block_given?
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
cis
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
# only returns/yields chats wich match filter
|
|
164
|
-
#
|
|
165
|
-
#
|
|
166
|
-
def self.filtered(filter, &block)
|
|
167
|
-
#puts filter.to_yaml
|
|
168
|
-
@uniq_chats = {}
|
|
169
|
-
filtered_chats = []
|
|
170
|
-
@chats.each do |chat|
|
|
171
|
-
if match?(chat, filter)
|
|
172
|
-
yield chat if block_given?
|
|
173
|
-
filtered_chats << chat
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
filtered_chats
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
def self.add(chat, prefs={})
|
|
181
|
-
@chats_lock.synchronize do
|
|
182
|
-
begin
|
|
183
|
-
if chat.request.host then
|
|
184
|
-
@chats << chat
|
|
185
|
-
|
|
186
|
-
options = {
|
|
187
|
-
:run_passive_checks => true,
|
|
188
|
-
:notify => true
|
|
189
|
-
}
|
|
190
|
-
options.update prefs
|
|
191
|
-
|
|
192
|
-
Watobo::PassiveScanner.add(chat) if options[:run_passive_checks] == true
|
|
193
|
-
# puts "[#{self}] add"
|
|
194
|
-
|
|
195
|
-
#@interface.addChat(self, chat) if @interface
|
|
196
|
-
notify(:new, chat) if options[:notify] == true
|
|
197
|
-
|
|
198
|
-
if chat.id != 0 then
|
|
199
|
-
Watobo::DataStore.add_chat(chat)
|
|
200
|
-
else
|
|
201
|
-
puts "!!! Could not add chat #{chat.id}"
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
# p "!P!"
|
|
206
|
-
rescue => bang
|
|
207
|
-
puts bang
|
|
208
|
-
puts bang.backtrace if $DEBUG
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
private
|
|
214
|
-
|
|
215
|
-
def self.match?(chat, filter)
|
|
48
|
+
yield c if block_given?
|
|
49
|
+
end
|
|
50
|
+
return matches if o[:max_count] > 0 and matches.length >= o[:max_count]
|
|
51
|
+
end
|
|
52
|
+
return matches
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def self.sites(prefs={}, &block)
|
|
57
|
+
list = Hash.new
|
|
58
|
+
|
|
59
|
+
cprefs = { :in_scope => false,
|
|
60
|
+
:ssl => false
|
|
61
|
+
}
|
|
62
|
+
cprefs.update prefs
|
|
63
|
+
|
|
64
|
+
Watobo::Chats.each do |chat|
|
|
65
|
+
next if list.has_key?(chat.request.site)
|
|
66
|
+
site = chat.request.site
|
|
67
|
+
next if cprefs[:in_scope] == true and not Watobo::Scope.match_site?(site)
|
|
68
|
+
next if cprefs[:ssl] and not chat.use_ssl?
|
|
69
|
+
|
|
70
|
+
yield site if block_given?
|
|
71
|
+
list[site] = nil
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
return list.keys
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.dirs(site, list_opts={}, &block)
|
|
78
|
+
opts = { :base_dir => "",
|
|
79
|
+
:include_subdirs => true
|
|
80
|
+
}
|
|
81
|
+
opts.update(list_opts) if list_opts.is_a? Hash
|
|
82
|
+
list = Hash.new
|
|
83
|
+
@chats.each do |chat|
|
|
84
|
+
next if chat.request.site != site
|
|
85
|
+
next if list.has_key?(chat.request.path)
|
|
86
|
+
next if opts[:base_dir] != "" and chat.request.path !~ /^#{Regexp.quote(opts[:base_dir])}/
|
|
87
|
+
subdirs = chat.request.subDirs
|
|
88
|
+
subdirs.each do |dir|
|
|
89
|
+
next if dir.nil?
|
|
90
|
+
next if list.has_key?(dir)
|
|
91
|
+
list[dir] = :path
|
|
92
|
+
if opts[:include_subdirs] == true then
|
|
93
|
+
yield dir if block_given?
|
|
94
|
+
else
|
|
95
|
+
d = dir.gsub(/#{Regexp.quote(opts[:base_dir])}/,"")
|
|
96
|
+
yield dir unless d =~ /\// and block_given?
|
|
97
|
+
# otherwise it is a subdir of base_dir
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def self.get_by_id(chatid)
|
|
104
|
+
@chats_lock.synchronize do
|
|
105
|
+
@chats.each do |c|
|
|
106
|
+
if c.id.to_s == chatid.to_s then
|
|
107
|
+
return c
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
return nil
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def self.each(&block)
|
|
115
|
+
if block_given?
|
|
116
|
+
@chats_lock.synchronize do
|
|
117
|
+
@chats.map{|c| yield c }
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def self.to_a
|
|
123
|
+
@chats
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def self.length
|
|
127
|
+
l = 0
|
|
128
|
+
@chats_lock.synchronize do
|
|
129
|
+
l = @chats.length
|
|
130
|
+
end
|
|
131
|
+
l
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def self.in_scope(&block)
|
|
135
|
+
scan_prefs = Watobo::Conf::Scanner.to_h
|
|
136
|
+
#puts scan_prefs.to_yaml
|
|
137
|
+
unique_list = Hash.new
|
|
138
|
+
cis = []
|
|
139
|
+
|
|
140
|
+
@chats.each do |chat|
|
|
141
|
+
next if scan_prefs[:excluded_chats].include?(chat.id)
|
|
142
|
+
uch = chat.request.uniq_hash
|
|
143
|
+
|
|
144
|
+
next if unique_list.has_key?(uch) and scan_prefs[:smart_scan] == true
|
|
145
|
+
unique_list[uch] = nil
|
|
146
|
+
if Watobo::Scope.match_chat? chat
|
|
147
|
+
cis << chat
|
|
148
|
+
yield chat if block_given?
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
cis
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# only returns/yields chats wich match filter
|
|
155
|
+
#
|
|
156
|
+
#
|
|
157
|
+
def self.filtered(filter, &block)
|
|
158
|
+
#puts filter.to_yaml
|
|
159
|
+
@uniq_chats = {}
|
|
160
|
+
filtered_chats = []
|
|
161
|
+
@chats.each do |chat|
|
|
162
|
+
if match?(chat, filter)
|
|
163
|
+
yield chat if block_given?
|
|
164
|
+
filtered_chats << chat
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
filtered_chats
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def self.add(chat, prefs={})
|
|
172
|
+
@chats_lock.synchronize do
|
|
173
|
+
begin
|
|
174
|
+
if chat.request.host then
|
|
175
|
+
@chats << chat
|
|
176
|
+
|
|
177
|
+
options = {
|
|
178
|
+
:run_passive_checks => true,
|
|
179
|
+
:notify => true
|
|
180
|
+
}
|
|
181
|
+
options.update prefs
|
|
182
|
+
|
|
183
|
+
Watobo::PassiveScanner.add(chat) if options[:run_passive_checks] == true
|
|
184
|
+
# puts "[#{self}] add"
|
|
185
|
+
|
|
186
|
+
#@interface.addChat(self, chat) if @interface
|
|
187
|
+
notify(:new, chat) if options[:notify] == true
|
|
188
|
+
|
|
189
|
+
if chat.id != 0 then
|
|
190
|
+
Watobo::DataStore.add_chat(chat)
|
|
191
|
+
else
|
|
192
|
+
puts "!!! Could not add chat #{chat.id}"
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# p "!P!"
|
|
197
|
+
rescue => bang
|
|
198
|
+
puts bang
|
|
199
|
+
puts bang.backtrace if $DEBUG
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
private
|
|
205
|
+
|
|
206
|
+
def self.match?(chat, filter)
|
|
216
207
|
begin
|
|
217
208
|
|
|
218
|
-
filtered = false
|
|
219
|
-
# return false if filter[:ok_only] == true and chat.response.responseCode !~ /200/
|
|
220
|
-
|
|
221
|
-
if filter[:unique]
|
|
222
|
-
uniq_hash = chat.request.uniq_hash
|
|
223
|
-
return false if @uniq_chats.has_key? uniq_hash
|
|
224
|
-
@uniq_chats[uniq_hash] = nil
|
|
225
|
-
end
|
|
226
|
-
#puts "scope"
|
|
227
|
-
if filter[:scope_only]
|
|
228
|
-
return false unless Watobo::Scope.match_site?(chat.request.site)
|
|
229
|
-
end
|
|
230
|
-
# puts "* passed scope"
|
|
231
|
-
if filter[:hide_tested]
|
|
232
|
-
return false if chat.tested?
|
|
233
|
-
end
|
|
209
|
+
filtered = false
|
|
210
|
+
# return false if filter[:ok_only] == true and chat.response.responseCode !~ /200/
|
|
211
|
+
|
|
212
|
+
if filter[:unique]
|
|
213
|
+
uniq_hash = chat.request.uniq_hash
|
|
214
|
+
return false if @uniq_chats.has_key? uniq_hash
|
|
215
|
+
@uniq_chats[uniq_hash] = nil
|
|
216
|
+
end
|
|
217
|
+
#puts "scope"
|
|
218
|
+
if filter[:scope_only]
|
|
219
|
+
return false unless Watobo::Scope.match_site?(chat.request.site)
|
|
220
|
+
end
|
|
221
|
+
# puts "* passed scope"
|
|
222
|
+
if filter[:hide_tested]
|
|
223
|
+
return false if chat.tested?
|
|
224
|
+
end
|
|
234
225
|
|
|
235
226
|
if filter.has_key?(:status_codes) and not filter[:status_codes].empty?
|
|
236
227
|
return false if filter[:status_codes].find_index{|i| chat.response.status =~ /#{i}/}.nil?
|
|
237
228
|
end
|
|
238
|
-
|
|
239
|
-
if filter.has_key?(:mime_types) and not filter[:mime_types].empty?
|
|
240
|
-
match = false
|
|
241
|
-
filter[:mime_types].each do |mt|
|
|
242
|
-
if chat.response.content_type =~ /#{mt}/i
|
|
243
|
-
match = true
|
|
244
|
-
end
|
|
245
|
-
end
|
|
246
|
-
puts "MIME_TYPE: #{match}"
|
|
247
|
-
return false if match == false
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
#puts "extensions"
|
|
251
|
-
# puts "* passed hide tested"
|
|
252
|
-
if filter[:hidden_extensions] == true
|
|
253
|
-
return false if filter[:hidden_extension_patterns].include?(chat.request.doctype)
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
if filter[:show_extension_patterns]
|
|
257
|
-
unless filter[:show_extension_patterns].empty? or filter[:show_extensions] == false
|
|
258
|
-
return false unless filter[:show_extension_patterns].include?(chat.request.doctype)
|
|
229
|
+
|
|
230
|
+
if filter.has_key?(:mime_types) and not filter[:mime_types].empty?
|
|
231
|
+
match = false
|
|
232
|
+
filter[:mime_types].each do |mt|
|
|
233
|
+
if chat.response.content_type =~ /#{mt}/i
|
|
234
|
+
match = true
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
puts "MIME_TYPE: #{match}"
|
|
238
|
+
return false if match == false
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
#puts "extensions"
|
|
242
|
+
# puts "* passed hide tested"
|
|
243
|
+
if filter[:hidden_extensions] == true
|
|
244
|
+
return false if filter[:hidden_extension_patterns].include?(chat.request.doctype)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
if filter[:show_extension_patterns]
|
|
248
|
+
unless filter[:show_extension_patterns].empty? or filter[:show_extensions] == false
|
|
249
|
+
return false unless filter[:show_extension_patterns].include?(chat.request.doctype)
|
|
259
250
|
end
|
|
260
|
-
end
|
|
261
|
-
#return true if filter[:text].empty?
|
|
251
|
+
end
|
|
252
|
+
#return true if filter[:text].empty?
|
|
262
253
|
# puts "url pattern"
|
|
263
|
-
if filter[:url_pattern]
|
|
254
|
+
if filter[:url_pattern]
|
|
264
255
|
unless filter[:url_pattern].empty?
|
|
265
|
-
filtered = true
|
|
266
|
-
return true if chat.request.first =~ /#{filter[:url_pattern]}/i
|
|
267
|
-
#return false
|
|
256
|
+
filtered = true
|
|
257
|
+
return true if chat.request.first =~ /#{filter[:url_pattern]}/i
|
|
258
|
+
#return false
|
|
268
259
|
end
|
|
269
|
-
end
|
|
260
|
+
end
|
|
270
261
|
|
|
271
|
-
if filter[:request_pattern]
|
|
262
|
+
if filter[:request_pattern]
|
|
272
263
|
unless filter[:request_pattern].empty?
|
|
273
|
-
filtered = true
|
|
274
|
-
return true if chat.request.join =~ /#{filter[:request_pattern]}/i
|
|
275
|
-
#return false
|
|
276
|
-
end
|
|
277
|
-
end
|
|
278
|
-
# puts filter.to_yaml
|
|
264
|
+
filtered = true
|
|
265
|
+
return true if chat.request.join =~ /#{filter[:request_pattern]}/i
|
|
266
|
+
#return false
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
# puts filter.to_yaml
|
|
279
270
|
# puts chat.response.responseCode
|
|
280
|
-
if filter[:response_pattern]
|
|
271
|
+
if filter[:response_pattern]
|
|
281
272
|
unless filter[:response_pattern].empty?
|
|
282
|
-
filtered = true
|
|
283
|
-
#return false if filter[:text_only] == true and chat.response.content_type !~ /(text|javascript|xml|json)/
|
|
284
|
-
return true if chat.response.join.unpack("C*").pack("C*") =~ /#{filter[:response_pattern]}/i
|
|
285
|
-
#return false
|
|
273
|
+
filtered = true
|
|
274
|
+
#return false if filter[:text_only] == true and chat.response.content_type !~ /(text|javascript|xml|json)/
|
|
275
|
+
return true if chat.response.join.unpack("C*").pack("C*") =~ /#{filter[:response_pattern]}/i
|
|
276
|
+
#return false
|
|
286
277
|
end
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
return !filtered
|
|
290
|
-
|
|
291
|
-
rescue => bang
|
|
292
|
-
puts bang
|
|
293
|
-
puts bang.backtrace if $DEBUG
|
|
294
|
-
end
|
|
295
|
-
false
|
|
296
|
-
end
|
|
297
|
-
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
return !filtered
|
|
281
|
+
|
|
282
|
+
rescue => bang
|
|
283
|
+
puts bang
|
|
284
|
+
puts bang.backtrace if $DEBUG
|
|
285
|
+
end
|
|
286
|
+
false
|
|
287
|
+
end
|
|
288
|
+
end
|
|
298
289
|
end
|