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,445 @@
|
|
|
1
|
+
# .
|
|
2
|
+
# table_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 AddTableParmDialog < FXDialogBox
|
|
25
|
+
def location()
|
|
26
|
+
@location_combo.getItemData(@location_combo.currentItem)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def parmName()
|
|
30
|
+
@parm_name_dt.value
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def parmValue()
|
|
34
|
+
@parm_value_dt.value
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def initialize(owner)
|
|
38
|
+
#super(owner, "Edit Target Scope", DECOR_TITLE|DECOR_BORDER, :width => 300, :height => 425)
|
|
39
|
+
super(owner, "Add Parameter", DECOR_ALL)
|
|
40
|
+
|
|
41
|
+
@location = nil
|
|
42
|
+
@pname = nil
|
|
43
|
+
@pval = nil
|
|
44
|
+
|
|
45
|
+
base_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
|
46
|
+
frame = FXHorizontalFrame.new(base_frame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
|
47
|
+
|
|
48
|
+
# puts "create scopeframe with scope:"
|
|
49
|
+
# @project.scope
|
|
50
|
+
FXLabel.new(frame, "Method:")
|
|
51
|
+
@location_combo = FXComboBox.new(frame, 5, nil, 0,
|
|
52
|
+
COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
|
|
53
|
+
%w( Post Url Cookie ).each do |loc|
|
|
54
|
+
item = @location_combo.appendItem(loc)
|
|
55
|
+
@location_combo.setItemData(item, loc)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
@location_combo.numVisible = 3
|
|
59
|
+
@location_combo.numColumns = 8
|
|
60
|
+
@location_combo.currentItem = 0
|
|
61
|
+
@location_combo.editable = false
|
|
62
|
+
# @location_combo.connect(SEL_COMMAND, method(:onLocationChanged))
|
|
63
|
+
|
|
64
|
+
FXLabel.new(frame, "Parameter:")
|
|
65
|
+
@parm_name_dt = FXDataTarget.new('')
|
|
66
|
+
FXTextField.new(frame, 15,
|
|
67
|
+
:target => @parm_name_dt, :selector => FXDataTarget::ID_VALUE,
|
|
68
|
+
:opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT)
|
|
69
|
+
|
|
70
|
+
FXLabel.new(frame, "Value:")
|
|
71
|
+
@parm_value_dt = FXDataTarget.new('')
|
|
72
|
+
FXTextField.new(frame, 15,
|
|
73
|
+
:target => @parm_value_dt, :selector => FXDataTarget::ID_VALUE,
|
|
74
|
+
:opts => TEXTFIELD_NORMAL|LAYOUT_SIDE_RIGHT)
|
|
75
|
+
|
|
76
|
+
buttons_frame = FXHorizontalFrame.new(base_frame,
|
|
77
|
+
:opts => LAYOUT_FILL_X|LAYOUT_SIDE_TOP)
|
|
78
|
+
|
|
79
|
+
@finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
|
|
80
|
+
@finishButton.enable
|
|
81
|
+
@finishButton.connect(SEL_COMMAND) do |sender, sel, item|
|
|
82
|
+
#self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
|
|
83
|
+
self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
@cancelButton = FXButton.new(buttons_frame, "Cancel" ,
|
|
87
|
+
:target => self, :selector => FXDialogBox::ID_CANCEL,
|
|
88
|
+
:opts => BUTTON_NORMAL|LAYOUT_RIGHT)
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
class TableEditor < FXTable
|
|
95
|
+
def subscribe(event, &callback)
|
|
96
|
+
(@event_dispatcher_listeners[event] ||= []) << callback
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def clearEvents(event)
|
|
100
|
+
@event_dispatcher_listener[event].clear
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def notify(event, *args)
|
|
104
|
+
if @event_dispatcher_listeners[event]
|
|
105
|
+
@event_dispatcher_listeners[event].each do |m|
|
|
106
|
+
m.call(*args) if m.respond_to? :call
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def rawRequest
|
|
112
|
+
parseRequest
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def parseRequest
|
|
116
|
+
cookies = []
|
|
117
|
+
post_parms = []
|
|
118
|
+
url_parms = []
|
|
119
|
+
url = ""
|
|
120
|
+
|
|
121
|
+
self.numRows.times do |i|
|
|
122
|
+
case self.getItemText(i, 0)
|
|
123
|
+
when /req/i
|
|
124
|
+
url = self.getItemText(i, 2)
|
|
125
|
+
when /post/i
|
|
126
|
+
val = self.getItemText(i, 1)
|
|
127
|
+
val += "="
|
|
128
|
+
val += self.getItemText(i, 2).strip
|
|
129
|
+
post_parms.push(val)
|
|
130
|
+
when /url/i
|
|
131
|
+
val = self.getItemText(i, 1)
|
|
132
|
+
val += "="
|
|
133
|
+
val += self.getItemText(i, 2).strip
|
|
134
|
+
url_parms.push(val)
|
|
135
|
+
when /cookie2?/i
|
|
136
|
+
val = self.getItemText(i, 1)
|
|
137
|
+
val += "="
|
|
138
|
+
val += self.getItemText(i, 2).strip
|
|
139
|
+
cookies.push(val)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
@request.setRawQueryParms(url_parms.join("&")) unless url_parms.empty?
|
|
144
|
+
|
|
145
|
+
@request.setData(post_parms.join("&")) unless post_parms.empty?
|
|
146
|
+
|
|
147
|
+
unless cookies.empty?
|
|
148
|
+
# puts cookies
|
|
149
|
+
@request.removeHeader("Cookie")
|
|
150
|
+
@request.addHeader("Cookie", cookies.join("; "))
|
|
151
|
+
end
|
|
152
|
+
# puts @request
|
|
153
|
+
@request
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def setRequest(request)
|
|
157
|
+
@request = Watobo::Utils.copyObject(request)
|
|
158
|
+
# now extend the new request with the Watobo mixins
|
|
159
|
+
@request.extend Watobo::Mixin::Parser::Url
|
|
160
|
+
@request.extend Watobo::Mixin::Parser::Web10
|
|
161
|
+
@request.extend Watobo::Mixin::Shaper::Web10
|
|
162
|
+
|
|
163
|
+
initTable()
|
|
164
|
+
@request = Watobo::Utils.text2request(request) if request.is_a? String
|
|
165
|
+
# addParmList("REQ", ["URL=#{request.url}"])
|
|
166
|
+
|
|
167
|
+
if @request.get_parms.length > 0
|
|
168
|
+
addParmList("URL", @request.get_parms)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
if @request.post_parms.length > 0
|
|
172
|
+
addParmList("Post", @request.post_parms)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
if @request.cookies.length > 0
|
|
176
|
+
addParmList("Cookie", @request.cookies)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def initialize(owner, opts)
|
|
182
|
+
super(owner, opts)
|
|
183
|
+
@request = nil
|
|
184
|
+
@event_dispatcher_listeners = Hash.new
|
|
185
|
+
initTable()
|
|
186
|
+
|
|
187
|
+
self.connect(SEL_COMMAND, method(:onTableClick))
|
|
188
|
+
|
|
189
|
+
# KEY_Return
|
|
190
|
+
# KEY_Control_L
|
|
191
|
+
# KEY_Control_R
|
|
192
|
+
# KEY_s
|
|
193
|
+
@ctrl_pressed = false
|
|
194
|
+
|
|
195
|
+
addKeyHandler(self)
|
|
196
|
+
|
|
197
|
+
self.connect(SEL_DOUBLECLICKED) do |sender, sel, data|
|
|
198
|
+
row = sender.getCurrentRow
|
|
199
|
+
if row >= 0 then
|
|
200
|
+
self.selectRow(row, false)
|
|
201
|
+
# open simple editor
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
self.connect(SEL_DOUBLECLICKED) do |sender, sel, data|
|
|
206
|
+
row = sender.getCurrentRow
|
|
207
|
+
return nil unless row >= 0 and row < self.numRows
|
|
208
|
+
transcoder = FXTranscoder.new(FXApp.instance, self.getItemText(row, 2))
|
|
209
|
+
transcoder.create
|
|
210
|
+
transcoder.show(Fox::PLACEMENT_SCREEN)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
self.connect(SEL_RIGHTBUTTONRELEASE) do |sender, sel, event|
|
|
214
|
+
unless event.moved?
|
|
215
|
+
self.cancelInput()
|
|
216
|
+
ypos = event.click_y
|
|
217
|
+
row = self.rowAtY(ypos)
|
|
218
|
+
|
|
219
|
+
next unless row >= 0 and row <= self.numRows
|
|
220
|
+
|
|
221
|
+
self.selectRow(row, false) if row < self.numRows
|
|
222
|
+
FXMenuPane.new(self) do |menu_pane|
|
|
223
|
+
if row < self.numRows
|
|
224
|
+
cell_value = self.getItemText(row, 2)
|
|
225
|
+
cell_value.extend Watobo::Mixin::Transcoders
|
|
226
|
+
|
|
227
|
+
parm_name = self.getItemText(row, 1)
|
|
228
|
+
|
|
229
|
+
FXMenuCaption.new(menu_pane,"- Decoder -")
|
|
230
|
+
FXMenuSeparator.new(menu_pane)
|
|
231
|
+
decodeB64 = FXMenuCommand.new(menu_pane,"Base64: #{cell_value.b64decode}")
|
|
232
|
+
decodeB64.connect(SEL_COMMAND) {
|
|
233
|
+
self.setItemText(row, 2, cell_value.b64decode)
|
|
234
|
+
}
|
|
235
|
+
decodeHex = FXMenuCommand.new(menu_pane,"Hex(A): #{cell_value.hexdecode}")
|
|
236
|
+
decodeHex.connect(SEL_COMMAND) {
|
|
237
|
+
self.setItemText(row, 2, cell_value.hexdecode)
|
|
238
|
+
}
|
|
239
|
+
hex2int = FXMenuCommand.new(menu_pane,"Hex(Int): #{cell_value.hex2int}")
|
|
240
|
+
hex2int.connect(SEL_COMMAND) {
|
|
241
|
+
self.setItemText(row, 2, cell_value.hex2int)
|
|
242
|
+
}
|
|
243
|
+
decodeURL = FXMenuCommand.new(menu_pane,"URL: #{cell_value.url_decode}")
|
|
244
|
+
decodeURL.connect(SEL_COMMAND) {
|
|
245
|
+
self.setItemText(row, 2, cell_value.url_decode)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
FXMenuSeparator.new(menu_pane)
|
|
249
|
+
FXMenuCaption.new(menu_pane,"- Encoder -")
|
|
250
|
+
FXMenuSeparator.new(menu_pane)
|
|
251
|
+
encodeB64 = FXMenuCommand.new(menu_pane,"Base64: #{cell_value.b64encode}")
|
|
252
|
+
encodeB64.connect(SEL_COMMAND) {
|
|
253
|
+
self.setItemText(row, 2, cell_value.b64encode)
|
|
254
|
+
}
|
|
255
|
+
encodeHex = FXMenuCommand.new(menu_pane,"Hex: #{cell_value.hexencode}")
|
|
256
|
+
encodeHex.connect(SEL_COMMAND) {
|
|
257
|
+
self.setItemText(row, 2, cell_value.hexencode)
|
|
258
|
+
}
|
|
259
|
+
encodeURL = FXMenuCommand.new(menu_pane,"URL: #{cell_value.url_encode}")
|
|
260
|
+
encodeURL.connect(SEL_COMMAND) {
|
|
261
|
+
self.setItemText(row, 2, cell_value.url_encode)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
FXMenuSeparator.new(menu_pane)
|
|
265
|
+
remRow = FXMenuCommand.new(menu_pane,"Remove: #{parm_name}")
|
|
266
|
+
remRow.connect(SEL_COMMAND) {
|
|
267
|
+
self.removeRows(row,1, true)
|
|
268
|
+
}
|
|
269
|
+
remRow = FXMenuCommand.new(menu_pane,"Add Parameter..")
|
|
270
|
+
remRow.connect(SEL_COMMAND) { addNewParm() }
|
|
271
|
+
|
|
272
|
+
elsif row >= 0
|
|
273
|
+
remRow = FXMenuCommand.new(menu_pane,"Add Parameter..")
|
|
274
|
+
remRow.connect(SEL_COMMAND) { addNewParm() }
|
|
275
|
+
end
|
|
276
|
+
menu_pane.create
|
|
277
|
+
menu_pane.popup(nil, event.root_x, event.root_y)
|
|
278
|
+
app.runModalWhileShown(menu_pane)
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
self.columnHeader.connect(SEL_COMMAND) do |sender, sel, index|
|
|
286
|
+
self.fitColumnsToContents(index)
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
private
|
|
291
|
+
|
|
292
|
+
def addNewParm()
|
|
293
|
+
|
|
294
|
+
dlg = AddTableParmDialog.new(self)
|
|
295
|
+
if dlg.execute != 0 then
|
|
296
|
+
loc = dlg.location
|
|
297
|
+
pname = dlg.parmName
|
|
298
|
+
pval = dlg.parmValue
|
|
299
|
+
addParmList(loc, ["#{pname}=#{pval}"])
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def onTableClick(sender, sel, item)
|
|
304
|
+
begin
|
|
305
|
+
row = item.row
|
|
306
|
+
self.selectRow(row, false)
|
|
307
|
+
self.startInput(row,2)
|
|
308
|
+
rescue => bang
|
|
309
|
+
puts bang
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def addKeyHandler(item)
|
|
314
|
+
item.connect(SEL_KEYPRESS) do |sender, sel, event|
|
|
315
|
+
cr = self.currentRow
|
|
316
|
+
@ctrl_pressed = true if event.code == KEY_Control_L or event.code == KEY_Control_R
|
|
317
|
+
# @shift_pressed = true if @ctrl_pressed and ( event.code == KEY_Shift_L or event.code == KEY_Shift_R )
|
|
318
|
+
if event.code == KEY_F1
|
|
319
|
+
unless event.moved?
|
|
320
|
+
FXMenuPane.new(self) do |menu_pane|
|
|
321
|
+
FXMenuCaption.new(menu_pane, "Hotkeys:")
|
|
322
|
+
FXMenuSeparator.new(menu_pane)
|
|
323
|
+
[ "<ctrl-enter> - Send Request",
|
|
324
|
+
"<ctrl-b> - Encode Base64",
|
|
325
|
+
"<ctrl-shift-b> - Decode Base64",
|
|
326
|
+
"<ctrl-u> - Encode URL",
|
|
327
|
+
"<ctrl-shift-u> - Decode URL"
|
|
328
|
+
].each do |hk|
|
|
329
|
+
FXMenuCaption.new(menu_pane, hk)
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
menu_pane.create
|
|
333
|
+
|
|
334
|
+
menu_pane.popup(nil, event.root_x, event.root_y)
|
|
335
|
+
app.runModalWhileShown(menu_pane)
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
if @ctrl_pressed
|
|
341
|
+
# special handling of KEY_Return, because we don't want a linebreak in textbox.
|
|
342
|
+
if event.code == KEY_Return
|
|
343
|
+
self.acceptInput(true)
|
|
344
|
+
notify(:hotkey_ctrl_enter)
|
|
345
|
+
true
|
|
346
|
+
else
|
|
347
|
+
notify(:hotkey_ctrl_f) if event.code == KEY_f
|
|
348
|
+
notify(:hotkey_ctrl_s) if event.code == KEY_s
|
|
349
|
+
|
|
350
|
+
if event.code == KEY_u
|
|
351
|
+
text = self.getItemText(cr, 2)
|
|
352
|
+
#puts "* Encode URL: #{text}"
|
|
353
|
+
cgi = CGI::escape(text)
|
|
354
|
+
self.acceptInput(true)
|
|
355
|
+
self.setItemText(cr, 2, cgi.strip, true)
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
if event.code == KEY_b
|
|
359
|
+
text = self.getItemText(cr, 2)
|
|
360
|
+
puts "* Encode B64: #{text}"
|
|
361
|
+
b64 = Base64.encode64(text)
|
|
362
|
+
self.acceptInput(true)
|
|
363
|
+
self.setItemText(cr, 2, b64.strip, true)
|
|
364
|
+
puts b64.class
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
puts "CTRL-SHIFT-U" if event.code == KEY_U
|
|
368
|
+
if event.code == KEY_U
|
|
369
|
+
|
|
370
|
+
text = self.getItemText(cr, 2)
|
|
371
|
+
puts "* Encode URL: #{text}"
|
|
372
|
+
uncgi = CGI::unescape(text)
|
|
373
|
+
self.acceptInput(true)
|
|
374
|
+
self.setItemText(cr, 2, uncgi.strip, true)
|
|
375
|
+
end
|
|
376
|
+
if event.code == KEY_B
|
|
377
|
+
text = self.getItemText(cr, 2)
|
|
378
|
+
puts "* Encode B64: #{text}"
|
|
379
|
+
b64 = Base64.decode64(text)
|
|
380
|
+
self.acceptInput(true)
|
|
381
|
+
self.setItemText(cr, 2, b64.strip, true)
|
|
382
|
+
puts b64.class
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
false
|
|
386
|
+
end
|
|
387
|
+
elsif event.code == KEY_Return
|
|
388
|
+
self.selectRow(cr)
|
|
389
|
+
startInput(cr,2)
|
|
390
|
+
true
|
|
391
|
+
else
|
|
392
|
+
#puts "%04x" % event.code
|
|
393
|
+
false
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
item.connect(SEL_KEYRELEASE) do |sender, sel, event|
|
|
398
|
+
@ctrl_pressed = false if event.code == KEY_Control_L or event.code == KEY_Control_R
|
|
399
|
+
false
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
def addParmList(parm_origin, parm_list)
|
|
404
|
+
parm_list.each do |parm|
|
|
405
|
+
p,v = parm.split("=")
|
|
406
|
+
lastRowIndex = self.getNumRows
|
|
407
|
+
self.appendRows(1)
|
|
408
|
+
self.setItemText(lastRowIndex, 0, parm_origin)
|
|
409
|
+
self.setItemText(lastRowIndex, 1, p)
|
|
410
|
+
self.setItemText(lastRowIndex, 2, v)
|
|
411
|
+
# self.fitColumnsToContents(2)
|
|
412
|
+
# item = getItem(lastRowIndex, 2)
|
|
413
|
+
|
|
414
|
+
3.times do |i|
|
|
415
|
+
self.getItem(lastRowIndex, i).justify = FXTableItem::LEFT
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
def initTable
|
|
422
|
+
self.clearItems()
|
|
423
|
+
self.setTableSize(0, 3)
|
|
424
|
+
|
|
425
|
+
self.setColumnText( 0, "Location" )
|
|
426
|
+
self.setColumnText( 1, "Parm" )
|
|
427
|
+
self.setColumnText( 2, "Value" )
|
|
428
|
+
#self.setColumnText( 3, "Pinned" )
|
|
429
|
+
#self.setColumnText( 4, "Ignore" )
|
|
430
|
+
|
|
431
|
+
self.rowHeader.width = 0
|
|
432
|
+
self.setColumnWidth(0, 60)
|
|
433
|
+
|
|
434
|
+
self.setColumnWidth(1, 80)
|
|
435
|
+
self.setColumnWidth(2, 120)
|
|
436
|
+
#self.setColumnWidth(3, 60)
|
|
437
|
+
#self.setColumnWidth(4, 60)
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
if __FILE__ == $0
|
|
444
|
+
# TODO Generated stub
|
|
445
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# .
|
|
2
|
+
# tagless_viewer.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
|
+
require 'watobo/gui/request_editor'
|
|
23
|
+
module Watobo
|
|
24
|
+
module Gui
|
|
25
|
+
class TaglessViewer < SimpleTextView
|
|
26
|
+
def normalizeText(text)
|
|
27
|
+
return '' if text.nil?
|
|
28
|
+
|
|
29
|
+
raw_text = text
|
|
30
|
+
|
|
31
|
+
if text.is_a? Array then
|
|
32
|
+
raw_text = text.join
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#remove headers
|
|
36
|
+
body_start = raw_text.index("\r\n\r\n")
|
|
37
|
+
body_start = body_start.nil? ? 0 : body_start
|
|
38
|
+
#puts "* start normalizing at pos #{body_start}"
|
|
39
|
+
normalized = raw_text[body_start..-1]
|
|
40
|
+
# UTF-8 Clean-Up
|
|
41
|
+
normalized = normalized.unpack("C*").pack("C*")
|
|
42
|
+
# remove all inbetween tags
|
|
43
|
+
normalized.gsub!(/<.*?>/m, '')
|
|
44
|
+
# remove non printable characters, except LF (\x0a)
|
|
45
|
+
normalized.gsub!(/[\x00-\x09\x0b-\x1f\x7f-\xff]+/m,'')
|
|
46
|
+
# remove empty lines
|
|
47
|
+
normalized.gsub!(/((\x20+)?\x0a(\x20+)?)+/,"\n")
|
|
48
|
+
# decode html entities for better readability
|
|
49
|
+
normalized = CGI.unescapeHTML(normalized)
|
|
50
|
+
# additionally unescape which is not handled by CGI :(
|
|
51
|
+
normalized.gsub!(/(#{Regexp.quote(' ')})+/," ")
|
|
52
|
+
# finally strip it
|
|
53
|
+
normalized.strip
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def initialize(owner, opts)
|
|
57
|
+
super(owner, opts)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# .
|
|
2
|
+
# plugin.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 Template
|
|
24
|
+
class Plugin < FXDialogBox
|
|
25
|
+
attr :plugin_name
|
|
26
|
+
attr :icon
|
|
27
|
+
|
|
28
|
+
include Watobo::Gui
|
|
29
|
+
include Watobo::Gui::Icons
|
|
30
|
+
def subscribe(event, &callback)
|
|
31
|
+
(@event_dispatcher_listeners[event] ||= []) << callback
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def clearEvents(event)
|
|
35
|
+
@event_dispatcher_listener[event].clear
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def notify(event, *args)
|
|
39
|
+
if @event_dispatcher_listeners[event]
|
|
40
|
+
@event_dispatcher_listeners[event].each do |m|
|
|
41
|
+
m.call(*args) if m.respond_to? :call
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def updateView()
|
|
47
|
+
raise "!!! updateView not defined"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def load_icon(file=__FILE__)
|
|
51
|
+
begin
|
|
52
|
+
@icon = ICON_PLUGIN
|
|
53
|
+
path = File.dirname(file)
|
|
54
|
+
# puts "... searching for icons in #{path}"
|
|
55
|
+
file = Dir.glob("#{path}/*.ico").first
|
|
56
|
+
|
|
57
|
+
# puts "* load icon: #{file}"
|
|
58
|
+
@icon = Watobo::Gui.load_icon(file) unless file.nil?
|
|
59
|
+
|
|
60
|
+
self.icon = @icon
|
|
61
|
+
rescue => bang
|
|
62
|
+
puts "!!!Error: could not init icon"
|
|
63
|
+
puts bang
|
|
64
|
+
puts bang.backtrace if $DEBUG
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def initialize(owner, title, project, opts)
|
|
69
|
+
super(owner, title, :opts => DECOR_ALL,:width=>800, :height=>600)
|
|
70
|
+
# Implement Sender
|
|
71
|
+
# Implement Scanner
|
|
72
|
+
@icon = nil
|
|
73
|
+
# load_icon()
|
|
74
|
+
@plugin_name = "undefined"
|
|
75
|
+
@event_dispatcher_listeners = Hash.new
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# .
|
|
2
|
+
# plugin2.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
|
+
class Plugin2 < FXDialogBox
|
|
24
|
+
attr :plugin_name
|
|
25
|
+
attr :icon
|
|
26
|
+
|
|
27
|
+
include Watobo::Gui
|
|
28
|
+
include Watobo::Gui::Icons
|
|
29
|
+
def subscribe(event, &callback)
|
|
30
|
+
(@event_dispatcher_listeners[event] ||= []) << callback
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def clearEvents(event)
|
|
34
|
+
@event_dispatcher_listener[event].clear
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def notify(event, *args)
|
|
38
|
+
if @event_dispatcher_listeners[event]
|
|
39
|
+
@event_dispatcher_listeners[event].each do |m|
|
|
40
|
+
m.call(*args) if m.respond_to? :call
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def updateView()
|
|
46
|
+
raise "!!! updateView not defined"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def logger(msg)
|
|
50
|
+
t = Time.now
|
|
51
|
+
now = t.strftime("%m/%d/%Y @ %H:%M:%S")
|
|
52
|
+
|
|
53
|
+
@log_lock.synchronize do
|
|
54
|
+
text = "\n#{now}: msg"
|
|
55
|
+
@log_messages << text
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def load_icon(file=__FILE__)
|
|
60
|
+
begin
|
|
61
|
+
@icon = ICON_PLUGIN
|
|
62
|
+
path = File.dirname(file)
|
|
63
|
+
# puts "... searching for icons in #{path}/icons"
|
|
64
|
+
file = Dir.glob("#{path}/icons/*.ico").first
|
|
65
|
+
|
|
66
|
+
# puts "* load icon: #{file}"
|
|
67
|
+
@icon = Watobo::Gui.load_icon(file) unless file.nil?
|
|
68
|
+
|
|
69
|
+
self.icon = @icon
|
|
70
|
+
rescue => bang
|
|
71
|
+
puts "!!!Error: could not init icon"
|
|
72
|
+
puts bang
|
|
73
|
+
puts bang.backtrace if $DEBUG
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def initialize(owner, title, project, opts)
|
|
78
|
+
super(owner, title, :opts => DECOR_ALL,:width=>800, :height=>600)
|
|
79
|
+
# Implement Sender
|
|
80
|
+
# Implement Scanner
|
|
81
|
+
@icon = nil
|
|
82
|
+
# load_icon()
|
|
83
|
+
@plugin_name = "undefined"
|
|
84
|
+
@event_dispatcher_listeners = Hash.new
|
|
85
|
+
@log_lock = Mutex.new
|
|
86
|
+
|
|
87
|
+
@log_messages = []
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
private
|
|
92
|
+
|
|
93
|
+
def add_update_timer(ms)
|
|
94
|
+
@update_timer = FXApp.instance.addTimeout( ms, :repeat => true) {
|
|
95
|
+
@update_lock.synchronize do
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
}
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|