redcar 0.12.1 → 0.13
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/CHANGES +18 -0
- data/bin/redcar +1 -0
- data/lib/redcar.rb +4 -5
- data/lib/redcar/usage.rb +0 -1
- data/lib/redcar_quick_start.rb +3 -1
- data/plugins/application/lib/application.rb +1 -0
- data/plugins/application/lib/application/commands/treebook_commands.rb +11 -18
- data/plugins/application/lib/application/dialog.rb +1 -1
- data/plugins/application/lib/application/dialogs/filter_list_dialog.rb +13 -5
- data/plugins/application/lib/application/global_state.rb +21 -0
- data/plugins/application/lib/application/menu/item.rb +37 -11
- data/plugins/application/lib/application/notebook.rb +12 -0
- data/plugins/application/lib/application/tree/mirror.rb +0 -11
- data/plugins/application/lib/application/window.rb +32 -7
- data/plugins/application_swt/lib/application_swt.rb +1 -1
- data/plugins/application_swt/lib/application_swt/dialogs/filter_list_dialog_controller.rb +35 -10
- data/plugins/application_swt/lib/application_swt/icon.rb +1 -1
- data/plugins/application_swt/lib/application_swt/menu.rb +47 -15
- data/plugins/application_swt/lib/application_swt/notebook.rb +11 -2
- data/plugins/application_swt/lib/application_swt/window.rb +37 -34
- data/plugins/auto_indenter/lib/auto_indenter/analyzer.rb +1 -1
- data/plugins/auto_indenter/spec/auto_indenter/analyzer_spec.rb +9 -0
- data/plugins/declarations/lib/declarations.rb +31 -66
- data/plugins/declarations/lib/declarations/commands.rb +142 -0
- data/plugins/declarations/lib/declarations/file.rb +1 -1
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/javascript.js +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/nothing_to_see.rb +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/one_lonely_class.rb +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/similar_names.rb +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/something_fancy.rb +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/trailing_space.rb +0 -0
- data/plugins/edit_view/lib/edit_view.rb +35 -2
- data/plugins/edit_view/lib/edit_view/commands/change_language_command.rb +31 -0
- data/plugins/edit_view/lib/edit_view/commands/language_settings_commands.rb +45 -0
- data/plugins/edit_view/lib/edit_view/document/command.rb +1 -1
- data/plugins/edit_view/lib/edit_view/edit_tab.rb +11 -13
- data/plugins/key_bindings/lib/key_bindings.rb +6 -2
- data/plugins/project/lib/project.rb +27 -32
- data/plugins/project/lib/project/commands.rb +3 -88
- data/plugins/project/lib/project/dir_controller.rb +12 -18
- data/plugins/project/lib/project/dir_mirror.rb +20 -25
- data/plugins/project/lib/project/file_mirror.rb +10 -10
- data/plugins/project/lib/project/find_file_dialog.rb +20 -18
- data/plugins/project/lib/project/find_recent_dialog.rb +6 -3
- data/plugins/project/lib/project/{adapters/local.rb → local_filesystem.rb} +35 -35
- data/plugins/project/lib/project/manager.rb +21 -75
- data/plugins/project/lib/project/sub_project.rb +3 -3
- data/plugins/project/plugin.rb +0 -1
- data/plugins/project_search/lib/project_search/lucene_refresh.rb +0 -1
- data/plugins/redcar/plugin.rb +2 -2
- data/plugins/redcar/redcar.rb +34 -42
- data/plugins/ruby/lib/ruby/syntax_checker.rb +27 -7
- data/plugins/scm/lib/scm.rb +1 -12
- data/plugins/sessions/lib/sessions.rb +22 -0
- data/plugins/sessions/lib/sessions/cursor_saver.rb +162 -0
- data/plugins/sessions/lib/sessions/loader.rb +99 -0
- data/plugins/sessions/lib/sessions/memory.rb +59 -0
- data/plugins/sessions/plugin.rb +8 -0
- data/plugins/strip_trailing_spaces/lib/strip_trailing_spaces.rb +2 -2
- data/plugins/syntax_check/lib/syntax_check.rb +2 -2
- data/plugins/tree_view_swt/lib/tree_view_swt.rb +1 -3
- data/redcar.gemspec +1 -1
- metadata +195 -291
- data/plugins/connection_manager/lib/connection_manager.rb +0 -57
- data/plugins/connection_manager/lib/connection_manager/commands.rb +0 -14
- data/plugins/connection_manager/lib/connection_manager/connection_store.rb +0 -87
- data/plugins/connection_manager/lib/connection_manager/controller.rb +0 -100
- data/plugins/connection_manager/lib/connection_manager/filter_dialog.rb +0 -38
- data/plugins/connection_manager/lib/connection_manager/private_key_store.rb +0 -93
- data/plugins/connection_manager/plugin.rb +0 -12
- data/plugins/connection_manager/views/index.html.erb +0 -284
- data/plugins/edit_view/lib/edit_view/info_speedbar.rb +0 -98
- data/plugins/outline_view/features/outline_view.feature +0 -79
- data/plugins/outline_view/features/project_outline.feature +0 -23
- data/plugins/outline_view/features/step_definitions/outline_steps.rb +0 -61
- data/plugins/outline_view/lib/outline_view.rb +0 -97
- data/plugins/outline_view/lib/outline_view/commands.rb +0 -19
- data/plugins/outline_view/plugin.rb +0 -10
- data/plugins/outline_view_swt/lib/outline_view_swt.rb +0 -79
- data/plugins/outline_view_swt/plugin.rb +0 -7
- data/plugins/project/lib/project/adapters/remote.rb +0 -96
- data/plugins/project/lib/project/adapters/remote_protocols/ftp.rb +0 -93
- data/plugins/project/lib/project/adapters/remote_protocols/protocol.rb +0 -94
- data/plugins/project/lib/project/adapters/remote_protocols/sftp.rb +0 -181
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
|
3
|
-
require 'connection_manager/commands'
|
4
|
-
require 'connection_manager/connection_store'
|
5
|
-
require 'connection_manager/controller'
|
6
|
-
require 'connection_manager/filter_dialog'
|
7
|
-
require 'connection_manager/private_key_store'
|
8
|
-
|
9
|
-
module Redcar
|
10
|
-
class ConnectionManager
|
11
|
-
CONNECTION_SUPER_CLASS ||= Struct.new(:name, :protocol, :host, :port, :user, :path)
|
12
|
-
|
13
|
-
def self.open_connection(c)
|
14
|
-
Project::Manager.connect_to_remote(c.protocol, c.host, c.user, c.path, PrivateKeyStore.paths)
|
15
|
-
end
|
16
|
-
|
17
|
-
class Connection < CONNECTION_SUPER_CLASS
|
18
|
-
def to_hash
|
19
|
-
{
|
20
|
-
"name" => name,
|
21
|
-
"host" => host,
|
22
|
-
"port" => port,
|
23
|
-
"user" => user,
|
24
|
-
"protocol" => protocol,
|
25
|
-
"path" => path
|
26
|
-
}
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class OpenRemoteFilter < Command
|
31
|
-
def execute
|
32
|
-
FilterDialog.new.open
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# def self.keymaps
|
37
|
-
# osx = Redcar::Keymap.build("main", :osx) do
|
38
|
-
# link "Cmd+P", OpenRemoteFilter
|
39
|
-
# end
|
40
|
-
# linwin = Redcar::Keymap.build("main", [:linux, :windows]) do
|
41
|
-
# link "Ctrl+P", OpenRemoteFilter
|
42
|
-
# end
|
43
|
-
# [osx, linwin]
|
44
|
-
# end
|
45
|
-
|
46
|
-
def self.menus
|
47
|
-
Menu::Builder.build do
|
48
|
-
sub_menu "Plugins" do
|
49
|
-
sub_menu "Connections", :priority => 36 do
|
50
|
-
item "Manage", OpenCommand
|
51
|
-
item "Remote Filter", OpenRemoteFilter
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
|
2
|
-
module Redcar
|
3
|
-
class ConnectionManager
|
4
|
-
|
5
|
-
class ConnectionStore
|
6
|
-
class ValidationFailedError < StandardError
|
7
|
-
def errors
|
8
|
-
@errors ||= []
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class AlreadyExistsError < StandardError
|
13
|
-
end
|
14
|
-
|
15
|
-
attr_reader :connections
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
@connections = load_connections
|
19
|
-
end
|
20
|
-
|
21
|
-
def find(name)
|
22
|
-
connections.detect { |c| c.name == name }
|
23
|
-
end
|
24
|
-
|
25
|
-
def add_connection(name, protocol, host, port, user, path)
|
26
|
-
if r = find(name)
|
27
|
-
raise AlreadyExistsError.new
|
28
|
-
end
|
29
|
-
|
30
|
-
validate_connection(name, protocol, host, port, user, path)
|
31
|
-
|
32
|
-
@connections << Connection.new(name, protocol, host, port, user, path)
|
33
|
-
|
34
|
-
save_connections
|
35
|
-
end
|
36
|
-
|
37
|
-
def update_connection(name, protocol, host, port, user, path)
|
38
|
-
connection = find(name)
|
39
|
-
|
40
|
-
validate_connection(name, protocol, host, port, user, path)
|
41
|
-
|
42
|
-
connection.name = name
|
43
|
-
connection.protocol = protocol
|
44
|
-
connection.host = host
|
45
|
-
connection.port = port
|
46
|
-
connection.user = user
|
47
|
-
connection.path = path
|
48
|
-
|
49
|
-
save_connections
|
50
|
-
end
|
51
|
-
|
52
|
-
def validate_connection(name, protocol, host, port, user, path)
|
53
|
-
validation_failed = ValidationFailedError.new
|
54
|
-
%w(name protocol host port user).each do |property|
|
55
|
-
value = eval(property)
|
56
|
-
validation_failed.errors << "#{property} cannot be blank" if !value || value.empty?
|
57
|
-
end
|
58
|
-
|
59
|
-
if validation_failed.errors.any?
|
60
|
-
raise validation_failed
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def delete_connection(name)
|
65
|
-
@connections.delete(find(name))
|
66
|
-
|
67
|
-
save_connections
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def load_connections
|
73
|
-
(storage["connections"] || []).map do |h|
|
74
|
-
Connection.new(h["name"], h["protocol"], h["host"], h["port"], h["user"], h["path"])
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def save_connections
|
79
|
-
storage["connections"] = connections.map { |c| c.to_hash }
|
80
|
-
end
|
81
|
-
|
82
|
-
def storage
|
83
|
-
Redcar::Plugin::Storage.new('connection_manager')
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,100 +0,0 @@
|
|
1
|
-
|
2
|
-
module Redcar
|
3
|
-
class ConnectionManager
|
4
|
-
|
5
|
-
class Controller
|
6
|
-
include Redcar::HtmlController
|
7
|
-
|
8
|
-
attr_reader :store, :private_key_store
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@store = ConnectionStore.new
|
12
|
-
@private_key_store = PrivateKeyStore.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def title
|
16
|
-
"Connections"
|
17
|
-
end
|
18
|
-
|
19
|
-
def index
|
20
|
-
rhtml = ERB.new(File.read(File.join(File.dirname(__FILE__), "..", "..", "views", "index.html.erb")))
|
21
|
-
rhtml.result(binding)
|
22
|
-
end
|
23
|
-
|
24
|
-
def add_connection(name, protocol, host, port, user, path)
|
25
|
-
store.add_connection(name, protocol, host, port, user, path)
|
26
|
-
|
27
|
-
success_response
|
28
|
-
rescue ConnectionStore::AlreadyExistsError
|
29
|
-
{
|
30
|
-
'success' => false,
|
31
|
-
'error' => "Connection #{name} already exists. Choose another name and try again."
|
32
|
-
}
|
33
|
-
rescue ConnectionStore::ValidationFailedError => e
|
34
|
-
validation_failed_response(e)
|
35
|
-
end
|
36
|
-
|
37
|
-
def update_connection(name, protocol, host, port, user, path)
|
38
|
-
store.update_connection(name, protocol, host, port, user, path)
|
39
|
-
|
40
|
-
success_response
|
41
|
-
rescue ConnectionStore::ValidationFailedError => e
|
42
|
-
validation_failed_response(e)
|
43
|
-
end
|
44
|
-
|
45
|
-
def delete_connection(name)
|
46
|
-
store.delete_connection(name)
|
47
|
-
|
48
|
-
success_response
|
49
|
-
end
|
50
|
-
|
51
|
-
def get_connection(name)
|
52
|
-
store.find(name).to_hash
|
53
|
-
end
|
54
|
-
|
55
|
-
def add_private_key_file(path)
|
56
|
-
private_key_store.add_private_key(path)
|
57
|
-
rescue PrivateKeyStore::ValidationError => e
|
58
|
-
validation_failed_response(e)
|
59
|
-
end
|
60
|
-
|
61
|
-
def remove_private_key_file(path)
|
62
|
-
private_key_store.remove_private_key(path)
|
63
|
-
end
|
64
|
-
|
65
|
-
def activate_connection(name)
|
66
|
-
connection = store.find(name)
|
67
|
-
Project::Manager.connect_to_remote(
|
68
|
-
connection.protocol, connection.host,
|
69
|
-
connection.user, connection.path,
|
70
|
-
PrivateKeyStore.paths
|
71
|
-
)
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def connections
|
77
|
-
store.connections
|
78
|
-
end
|
79
|
-
|
80
|
-
def auto_detected_private_key_files
|
81
|
-
PrivateKeyStore.auto_detected_keys
|
82
|
-
end
|
83
|
-
|
84
|
-
def private_key_files
|
85
|
-
private_key_store.paths
|
86
|
-
end
|
87
|
-
|
88
|
-
def success_response
|
89
|
-
{ 'success' => true }
|
90
|
-
end
|
91
|
-
|
92
|
-
def validation_failed_response(e)
|
93
|
-
{
|
94
|
-
'success' => false,
|
95
|
-
'error' => "Please fix the following errors:<ul>#{e.errors.map {|msg| "<li>#{msg}</li>"}}<ul>"
|
96
|
-
}
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module Redcar
|
2
|
-
class ConnectionManager
|
3
|
-
class FilterDialog < FilterListDialog
|
4
|
-
MANAGER_NAME = "(Connection Manager)"
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
super
|
8
|
-
end
|
9
|
-
|
10
|
-
def update_list(query)
|
11
|
-
if query == ""
|
12
|
-
connection_names
|
13
|
-
else
|
14
|
-
filter_and_rank_by(connection_names, query, 1000)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def selected(text, _)
|
19
|
-
close
|
20
|
-
open_connection(text)
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def open_connection(name)
|
26
|
-
ConnectionManager.open_connection(store.find(name))
|
27
|
-
end
|
28
|
-
|
29
|
-
def store
|
30
|
-
ConnectionManager::ConnectionStore.new
|
31
|
-
end
|
32
|
-
|
33
|
-
def connection_names
|
34
|
-
["(Connection Manager)"] + store.connections.map {|con| con.name }
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,93 +0,0 @@
|
|
1
|
-
|
2
|
-
module Redcar
|
3
|
-
class ConnectionManager
|
4
|
-
|
5
|
-
class PrivateKeyStore
|
6
|
-
def self.paths
|
7
|
-
auto_detected_keys + store_keys
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.auto_detected_keys
|
11
|
-
paths = []
|
12
|
-
default_key_globs.each do |default_key_glob|
|
13
|
-
Dir[default_key_glob].each do |filename|
|
14
|
-
unless File.directory?(filename) || !File.readable?(filename)
|
15
|
-
first = File.open(filename).read(100)
|
16
|
-
if first =~ /PRIVATE KEY/
|
17
|
-
paths << filename
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
paths
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.store_keys
|
26
|
-
PrivateKeyStore.new.paths
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.default_key_globs
|
30
|
-
[File.join(Redcar.home_dir, ".ssh", "*")]
|
31
|
-
end
|
32
|
-
|
33
|
-
class ValidationError < StandardError
|
34
|
-
def errors
|
35
|
-
@errors ||= []
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def initialize
|
40
|
-
@private_key_files = load_private_key_files
|
41
|
-
end
|
42
|
-
|
43
|
-
def paths
|
44
|
-
@private_key_files
|
45
|
-
end
|
46
|
-
|
47
|
-
def add_private_key(path)
|
48
|
-
path = File.expand_path(path)
|
49
|
-
validate_private_key(path)
|
50
|
-
|
51
|
-
@private_key_files << path
|
52
|
-
|
53
|
-
save_private_key_files
|
54
|
-
end
|
55
|
-
|
56
|
-
def remove_private_key(path)
|
57
|
-
path = File.expand_path(path)
|
58
|
-
@private_key_files.delete(path)
|
59
|
-
|
60
|
-
save_private_key_files
|
61
|
-
end
|
62
|
-
|
63
|
-
def validate_private_key(path)
|
64
|
-
validation_error = ValidationError.new
|
65
|
-
unless File.exist?(path) and File.file?(path)
|
66
|
-
validation_error.errors << "File not found."
|
67
|
-
raise validation_error
|
68
|
-
end
|
69
|
-
|
70
|
-
begin
|
71
|
-
Net::SSH::KeyFactory.load_private_key(path)
|
72
|
-
rescue OpenSSL::PKey::PKeyError
|
73
|
-
validation_error.errors << "File does not contain a private key."
|
74
|
-
raise validation_error
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
def load_private_key_files
|
81
|
-
storage["private_keys"] || []
|
82
|
-
end
|
83
|
-
|
84
|
-
def save_private_key_files
|
85
|
-
storage["private_keys"] = @private_key_files
|
86
|
-
end
|
87
|
-
|
88
|
-
def storage
|
89
|
-
Redcar::Plugin::Storage.new('connection_manager')
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
@@ -1,284 +0,0 @@
|
|
1
|
-
|
2
|
-
<% jquery_path = File.expand_path(File.join(Redcar.root, %w(plugins html_view assets jquery-1.4.min.js))) %>
|
3
|
-
<% watermark = File.expand_path(File.join(Redcar.root, %w(plugins html_view views watermark-48.png))) %>
|
4
|
-
<% redcar_css = File.expand_path(File.join(Redcar.root, %w(plugins html_view views default.css))) %>
|
5
|
-
<script type="text/javascript" src="file://<%= jquery_path %>"></script>
|
6
|
-
<link rel="stylesheet" href="file://<%= redcar_css %>" type="text/css" media="screen">
|
7
|
-
<div id="top">
|
8
|
-
<img src="file://<%=watermark%>" id="watermark"/>
|
9
|
-
<h1>Connection Manager</h1>
|
10
|
-
</div>
|
11
|
-
<div class="main">
|
12
|
-
<h4>Connections</h4>
|
13
|
-
<div class="inset">
|
14
|
-
<div id='connections'>
|
15
|
-
<% if connections and connections.any? %>
|
16
|
-
<table id='table'>
|
17
|
-
<tr class='grey' style='font-weight:bold;'>
|
18
|
-
<th>Name</th>
|
19
|
-
<th>Protocol</th>
|
20
|
-
<th>Host</th>
|
21
|
-
<th>Port</th>
|
22
|
-
<th>User</th>
|
23
|
-
<th>Remote Path</th>
|
24
|
-
</tr>
|
25
|
-
|
26
|
-
<% connections.each do |c| %>
|
27
|
-
<tr id='row-<%= c.name %>'>
|
28
|
-
<td><a href='javascript:void(0);' class='activate connection-name'><%= c.name %></a></td>
|
29
|
-
<td><%= c.protocol %></td>
|
30
|
-
<td><%= c.host %></td>
|
31
|
-
<td><%= c.port %></td>
|
32
|
-
<td><%= c.user %></td>
|
33
|
-
<td><%= c.path %></td>
|
34
|
-
<td>
|
35
|
-
<a href='javascript:void(0);' class='delete'">Delete</a>
|
36
|
-
<a href='javascript:void(0);' class='modify'">Modify</a>
|
37
|
-
</td>
|
38
|
-
</tr>
|
39
|
-
<% end %>
|
40
|
-
</table>
|
41
|
-
<% else %>
|
42
|
-
<p>No connections</p>
|
43
|
-
<% end %>
|
44
|
-
<p>
|
45
|
-
<input id='add' type='button' value='Add Connection'>
|
46
|
-
</p>
|
47
|
-
</div>
|
48
|
-
<p>
|
49
|
-
<div id='add_div' style='display:none;'>
|
50
|
-
<div id='error' style='display:none;color:red;text-weight:bold;margin-bottom:20px;'></div>
|
51
|
-
<form id='new_connection'>
|
52
|
-
<input type='hidden' name='operation' id='operation'>
|
53
|
-
<table>
|
54
|
-
<tr class='grey'>
|
55
|
-
<th colspan=2><b><span id='conn_name'>New Connection</span></b></th>
|
56
|
-
</tr>
|
57
|
-
<tr><td>Name: </td><td><input size='30' type='text' name='name' id='name'></td></tr>
|
58
|
-
<tr>
|
59
|
-
<td>Protocol: </td>
|
60
|
-
<td>
|
61
|
-
<select name='protocol' id='protocol'>
|
62
|
-
<option></option>
|
63
|
-
<option>SFTP</option>
|
64
|
-
<option>FTP</option>
|
65
|
-
</select>
|
66
|
-
</td>
|
67
|
-
</tr>
|
68
|
-
<tr><td>Host: </td><td><input size="30" type='text' name='host' id='host'></td></tr>
|
69
|
-
<tr><td>Port: </td><td><input type='text' name='port' id='port' size=2></td></tr>
|
70
|
-
<tr><td>User: </td><td><input size="30" type='text' name='user' id='user'></td></tr>
|
71
|
-
<tr><td>Remote Path: </td><td><input size="30" type='text' name='path' id='path'></td></tr>
|
72
|
-
<tr>
|
73
|
-
<td colspan=2>
|
74
|
-
<input id='save' type='submit' value='Save'>
|
75
|
-
<input id='cancel' type='button' value='Cancel'>
|
76
|
-
</td>
|
77
|
-
</tr>
|
78
|
-
</table>
|
79
|
-
</form>
|
80
|
-
</div>
|
81
|
-
</p>
|
82
|
-
</div>
|
83
|
-
|
84
|
-
<h4>Private Keys</h4>
|
85
|
-
<div class="inset">
|
86
|
-
<div id="private-keys">
|
87
|
-
<div class="list">
|
88
|
-
<% if (private_key_files + auto_detected_private_key_files).any? %>
|
89
|
-
<table>
|
90
|
-
<% auto_detected_private_key_files.each do |private_key| %>
|
91
|
-
<tr>
|
92
|
-
<td><%= private_key %></td>
|
93
|
-
</tr>
|
94
|
-
<% end %>
|
95
|
-
<% private_key_files.each do |private_key| %>
|
96
|
-
<tr>
|
97
|
-
<td><%= private_key %></td>
|
98
|
-
<td>
|
99
|
-
<a href='javascript:void(0);' class='delete-key' data-name="<%= private_key %>">Delete</a>
|
100
|
-
</td>
|
101
|
-
</tr>
|
102
|
-
<% end %>
|
103
|
-
</table>
|
104
|
-
<% else %>
|
105
|
-
No private keys.
|
106
|
-
<% end %>
|
107
|
-
</div>
|
108
|
-
<br />
|
109
|
-
<input id='add-private-key-button' type='button' value='Add Private Key'>
|
110
|
-
|
111
|
-
<div id='add-private-key' style='display:none;'>
|
112
|
-
<div class='error' style='display:none;color:red;text-weight:bold;margin-bottom:20px;'></div>
|
113
|
-
|
114
|
-
<form id='add-private-key-form'>
|
115
|
-
<input type='hidden' name='operation' class='operation'>
|
116
|
-
<table>
|
117
|
-
<tr class='grey'>
|
118
|
-
<td colspan=2><b><span>New Private Key</span></b></td>
|
119
|
-
</tr>
|
120
|
-
<tr><td>Key file: </td><td><input size="30" type='text' class="path" name='path'></td></tr>
|
121
|
-
<tr>
|
122
|
-
<td colspan=2>
|
123
|
-
<input class='save' type='submit' value='Save'>
|
124
|
-
<input class='cancel' type='button' value='Cancel'>
|
125
|
-
</td>
|
126
|
-
</tr>
|
127
|
-
</table>
|
128
|
-
</form>
|
129
|
-
</div>
|
130
|
-
</div>
|
131
|
-
</div>
|
132
|
-
</div>
|
133
|
-
|
134
|
-
<script type="text/javascript">
|
135
|
-
$(document).ready(function() {
|
136
|
-
function showMain() {
|
137
|
-
$(':input','#new_connection')
|
138
|
-
.not(':button, :submit, :reset, :hidden')
|
139
|
-
.val('')
|
140
|
-
.removeAttr('checked')
|
141
|
-
.removeAttr('selected');
|
142
|
-
|
143
|
-
$('#add_div').hide();
|
144
|
-
$('#connections').show();
|
145
|
-
};
|
146
|
-
|
147
|
-
var PORTS = {
|
148
|
-
'FTP': 21, 'SFTP': 22
|
149
|
-
};
|
150
|
-
|
151
|
-
$('.delete').live('click', function() {
|
152
|
-
var name = $(this).parent().parent().find(".connection-name").text();
|
153
|
-
try {
|
154
|
-
if (confirm('Do you really want to delete connection ' + name + '?')) {
|
155
|
-
Controller.deleteConnection(name);
|
156
|
-
Controller.reloadIndex();
|
157
|
-
}
|
158
|
-
}
|
159
|
-
catch(err) {
|
160
|
-
alert("Error: " + err.message);
|
161
|
-
}
|
162
|
-
});
|
163
|
-
|
164
|
-
$('.modify').live('click', function() {
|
165
|
-
var name = $(this).parent().parent().find(".connection-name").text();
|
166
|
-
$('#error').html("");
|
167
|
-
$('#conn_name').text('Editing ' + name);
|
168
|
-
$('#connections').hide();
|
169
|
-
$('#add_div').show();
|
170
|
-
$('#protocol').focus();
|
171
|
-
$('#name').attr('disabled', 'disabled');
|
172
|
-
|
173
|
-
var data = Controller.getConnection(name);
|
174
|
-
if (data) {
|
175
|
-
$('#operation').val('update');
|
176
|
-
$('#name').val(name);
|
177
|
-
$('#protocol').val(data.protocol);
|
178
|
-
$('#host').val(data.host);
|
179
|
-
$('#port').val(data.port);
|
180
|
-
$('#user').val(data.user);
|
181
|
-
$('#path').val(data.path);
|
182
|
-
}
|
183
|
-
});
|
184
|
-
|
185
|
-
$('#protocol').change(function(e) {
|
186
|
-
$('#port').val(PORTS[$(this).val()]);
|
187
|
-
});
|
188
|
-
|
189
|
-
$('#add').click(function() {
|
190
|
-
$('#error').html("");
|
191
|
-
$('#conn_name').text('New Connection');
|
192
|
-
$('#operation').val('insert');
|
193
|
-
$('#connections').hide();
|
194
|
-
$('#add_div').show();
|
195
|
-
$('#name').focus();
|
196
|
-
});
|
197
|
-
|
198
|
-
$('#cancel').click(function() {
|
199
|
-
$('#error').html("");
|
200
|
-
showMain();
|
201
|
-
});
|
202
|
-
|
203
|
-
$("#new_connection").submit(function(e) {
|
204
|
-
try {
|
205
|
-
$('#name').removeAttr('disabled');
|
206
|
-
var name = $('#name').val();
|
207
|
-
var protocol = $('#protocol').val();
|
208
|
-
var host = $('#host').val();
|
209
|
-
var port = $('#port').val();
|
210
|
-
var user = $('#user').val();
|
211
|
-
var path = $('#path').val();
|
212
|
-
|
213
|
-
if ($('#operation').val() == 'insert') {
|
214
|
-
result = Controller.addConnection(name, protocol, host, port, user, path);
|
215
|
-
}
|
216
|
-
else {
|
217
|
-
result = Controller.updateConnection(name, protocol, host, port, user, path);
|
218
|
-
}
|
219
|
-
|
220
|
-
if (result.success === false) {
|
221
|
-
$('#error').html(result.error);
|
222
|
-
$('#error').show();
|
223
|
-
$('#name').focus();
|
224
|
-
}
|
225
|
-
else {
|
226
|
-
Controller.reloadIndex();
|
227
|
-
}
|
228
|
-
}
|
229
|
-
catch(err) {
|
230
|
-
alert("Error: " + error.message);
|
231
|
-
}
|
232
|
-
return false;
|
233
|
-
});
|
234
|
-
|
235
|
-
$(".activate").click(function(e) {
|
236
|
-
var name = $(this).parent().parent().find(".connection-name").text();
|
237
|
-
Controller.activateConnection(name);
|
238
|
-
});
|
239
|
-
|
240
|
-
$("#add-private-key-button").click(function() {
|
241
|
-
$("#add-private-key-button").hide();
|
242
|
-
$("#add-private-key").show();
|
243
|
-
$("#private-keys .list").hide();
|
244
|
-
});
|
245
|
-
|
246
|
-
$("#add-private-key-form .cancel").click(function() {
|
247
|
-
$("#add-private-key-button").show();
|
248
|
-
$("#add-private-key").hide();
|
249
|
-
$("#private-keys .list").show();
|
250
|
-
});
|
251
|
-
|
252
|
-
$("#add-private-key-form").submit(function(e) {
|
253
|
-
try {
|
254
|
-
var result = Controller.addPrivateKeyFile($("#add-private-key-form .path").val());
|
255
|
-
|
256
|
-
if (result.success === false) {
|
257
|
-
$('#add-private-key .error').html(result.error);
|
258
|
-
$('#add-private-key .error').show();
|
259
|
-
$('#add-private-key-form .path').focus();
|
260
|
-
}
|
261
|
-
else {
|
262
|
-
Controller.reloadIndex();
|
263
|
-
}
|
264
|
-
}
|
265
|
-
catch(err) {
|
266
|
-
alert("Error: " + error.message);
|
267
|
-
}
|
268
|
-
return false;
|
269
|
-
});
|
270
|
-
|
271
|
-
$("#private-keys .list .delete-key").click(function() {
|
272
|
-
var path = $(this).attr('data-name');
|
273
|
-
try {
|
274
|
-
Controller.removePrivateKeyFile(path);
|
275
|
-
Controller.reloadIndex();
|
276
|
-
}
|
277
|
-
catch(err) {
|
278
|
-
alert("Error: " + err.message);
|
279
|
-
}
|
280
|
-
});
|
281
|
-
|
282
|
-
});
|
283
|
-
|
284
|
-
</script>
|