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