net-scp 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,10 @@
1
+ === 1.0.3 / 17 Aug 2010
2
+
3
+ * replace :sanitize_file_name with a call to String#shellescape [Sung Pae]
4
+ * Added gemspec file and removed echoe dependency [Miron Cuperman, Delano Mandelbaum]
5
+ * Removed Hanna dependency in Rakefile [Delano Mandelbaum]
6
+
7
+
1
8
  === 1.0.2 / 4 Feb 2009
2
9
 
3
10
  * Escape spaces in file names on remote server [Jamis Buck]
@@ -1,6 +1,6 @@
1
1
  = Net::SCP
2
2
 
3
- * http://net-ssh.rubyforge.org/scp
3
+ * http://github.com/net-ssh/net-scp
4
4
 
5
5
  == DESCRIPTION:
6
6
 
data/Rakefile CHANGED
@@ -1,30 +1,82 @@
1
- $LOAD_PATH.unshift "../net-ssh/lib"
2
- require './lib/net/scp/version'
1
+ require 'rubygems'
2
+ require 'rake/clean'
3
+ require 'rake/gempackagetask'
4
+ require 'fileutils'
5
+ include FileUtils
3
6
 
4
7
  begin
5
- require 'echoe'
8
+ require 'hanna/rdoctask'
6
9
  rescue LoadError
7
- abort "You'll need to have `echoe' installed to use Net::SCP's Rakefile"
10
+ require 'rake/rdoctask'
8
11
  end
9
12
 
10
- version = Net::SCP::Version::STRING.dup
11
- if ENV['SNAPSHOT'].to_i == 1
12
- version << "." << Time.now.utc.strftime("%Y%m%d%H%M%S")
13
+ task :default => :package
14
+
15
+ # CONFIG =============================================================
16
+
17
+ # Change the following according to your needs
18
+ README = "README.rdoc"
19
+ CHANGES = "CHANGELOG.rdoc"
20
+
21
+ # Files and directories to be deleted when you run "rake clean"
22
+ CLEAN.include [ 'pkg', '*.gem', '.config', 'doc']
23
+
24
+ name = 'net-scp'
25
+
26
+ load "#{name}.gemspec"
27
+ version = @spec.version
28
+
29
+ # That's it! The following defaults should allow you to get started
30
+ # on other things.
31
+
32
+
33
+ # TESTS/SPECS =========================================================
34
+
35
+
36
+
37
+ # INSTALL =============================================================
38
+
39
+ Rake::GemPackageTask.new(@spec) do |p|
40
+ p.need_tar = true if RUBY_PLATFORM !~ /mswin/
41
+ end
42
+
43
+ task :release => [ :rdoc, :package ]
44
+ task :install => [ :rdoc, :package ] do
45
+ sh %{sudo gem install pkg/#{name}-#{version}.gem}
46
+ end
47
+ task :uninstall => [ :clean ] do
48
+ sh %{sudo gem uninstall #{name}}
49
+ end
50
+
51
+
52
+ # RUBYFORGE RELEASE / PUBLISH TASKS ==================================
53
+
54
+ if @spec.rubyforge_project
55
+ desc 'Publish website to rubyforge'
56
+ task 'publish:rdoc' => 'doc/index.html' do
57
+ sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/ssh/v2/api/"
58
+ end
59
+
60
+ desc 'Public release to rubyforge'
61
+ task 'publish:gem' => [:package] do |t|
62
+ sh <<-end
63
+ rubyforge add_release -o Any -a #{CHANGES} -f -n #{README} #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
64
+ rubyforge add_file -o Any -a #{CHANGES} -f -n #{README} #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
65
+ end
66
+ end
13
67
  end
14
68
 
15
- Echoe.new('net-scp', version) do |p|
16
- p.project = "net-ssh"
17
- p.changelog = "CHANGELOG.rdoc"
18
69
 
19
- p.author = "Jamis Buck"
20
- p.email = "jamis@jamisbuck.org"
21
- p.summary = "A pure Ruby implementation of the SCP client protocol"
22
- p.url = "http://net-ssh.rubyforge.org/scp"
23
70
 
24
- p.dependencies = ["net-ssh >=1.99.1"]
71
+ # RUBY DOCS TASK ==================================
25
72
 
26
- p.need_zip = true
27
- p.include_rakefile = true
73
+ Rake::RDocTask.new do |t|
74
+ t.rdoc_dir = 'doc'
75
+ t.title = @spec.summary
76
+ t.options << '--line-numbers' << '-A cattr_accessor=object'
77
+ t.options << '--charset' << 'utf-8'
78
+ t.rdoc_files.include(README)
79
+ t.rdoc_files.include(CHANGES)
80
+ t.rdoc_files.include('lib/**/*.rb')
81
+ end
28
82
 
29
- p.rdoc_pattern = /^(lib|README.rdoc|CHANGELOG.rdoc)/
30
- end
@@ -1,4 +1,5 @@
1
1
  require 'stringio'
2
+ require 'shellwords'
2
3
 
3
4
  require 'net/ssh'
4
5
  require 'net/scp/errors'
@@ -337,7 +338,7 @@ module Net
337
338
  # (See Net::SCP::Upload and Net::SCP::Download).
338
339
  def start_command(mode, local, remote, options={}, &callback)
339
340
  session.open_channel do |channel|
340
- command = "#{scp_command(mode, options)} #{sanitize_file_name(remote)}"
341
+ command = "#{scp_command(mode, options)} #{remote.shellescape}"
341
342
  channel.exec(command) do |ch, success|
342
343
  if success
343
344
  channel[:local ] = local
@@ -398,10 +399,6 @@ module Net
398
399
  def progress_callback(channel, name, sent, total)
399
400
  channel[:callback].call(channel, name, sent, total) if channel[:callback]
400
401
  end
401
-
402
- def sanitize_file_name(file_name)
403
- file_name.gsub(/[ ]/) { |m| "\\#{m}" }
404
- end
405
402
  end
406
403
  end
407
404
 
@@ -6,7 +6,7 @@ module Net; class SCP
6
6
  class Version < Net::SSH::Version
7
7
  MAJOR = 1
8
8
  MINOR = 0
9
- TINY = 2
9
+ TINY = 3
10
10
 
11
11
  # The current version, as a Version instance
12
12
  CURRENT = new(MAJOR, MINOR, TINY)
@@ -1,12 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- Gem::Specification.new do |s|
3
+ @spec = Gem::Specification.new do |s|
4
4
  s.name = %q{net-scp}
5
- s.version = "1.0.2"
5
+ s.version = "1.0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Jamis Buck"]
9
- s.date = %q{2009-11-23}
8
+ s.authors = ["Jamis Buck", "Delano Mandelbaum"]
9
+ s.date = %q{2010-08-17}
10
10
  s.description = %q{A pure Ruby implementation of the SCP client protocol}
11
11
  s.email = %q{jamis@jamisbuck.org}
12
12
  s.extra_rdoc_files = ["CHANGELOG.rdoc", "lib/net/scp/download.rb", "lib/net/scp/errors.rb", "lib/net/scp/upload.rb", "lib/net/scp/version.rb", "lib/net/scp.rb", "lib/uri/open-scp.rb", "lib/uri/scp.rb", "README.rdoc"]
@@ -54,6 +54,21 @@ class Net::SCP::TestCase < Test::Unit::TestCase
54
54
  directory.stub!
55
55
  end
56
56
 
57
+ # The POSIX spec unfortunately allows all characters in file names except
58
+ # ASCII 0x00(NUL) and 0x2F(/)
59
+ #
60
+ # Ideally, we should be testing filenames with newlines, but Mocha doesn't
61
+ # like this at all, so we leave them out. However, the Shellwords module
62
+ # handles newlines just fine, so we can be reasonably confident that they
63
+ # will work in practice
64
+ def awful_file_name
65
+ (((0x00..0x7f).to_a - [0x00, 0x0a, 0x2f]).map { |n| n.chr }).join + '.txt'
66
+ end
67
+
68
+ def escaped_file_name
69
+ "\\\001\\\002\\\003\\\004\\\005\\\006\\\a\\\b\\\t\\\v\\\f\\\r\\\016\\\017\\\020\\\021\\\022\\\023\\\024\\\025\\\026\\\027\\\030\\\031\\\032\\\e\\\034\\\035\\\036\\\037\\ \\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+,-.0123456789:\\;\\<\\=\\>\\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\[\\\\\\]\\^_\\`abcdefghijklmnopqrstuvwxyz\\{\\|\\}\\~\\\177.txt"
70
+ end
71
+
57
72
  class FileEntry
58
73
  attr_reader :path, :contents, :mode, :mtime, :atime, :io
59
74
 
@@ -11,7 +11,7 @@ class TestDownload < Net::SCP::TestCase
11
11
  assert_scripted { scp.download!("/path/to/remote.txt", "/path/to/local.txt") }
12
12
  assert_equal "a" * 1234, file.io.string
13
13
  end
14
-
14
+
15
15
  def test_download_file_with_spaces_in_name_should_escape_remote_file_name
16
16
  file = prepare_file("/path/to/local file.txt", "")
17
17
 
@@ -25,6 +25,20 @@ class TestDownload < Net::SCP::TestCase
25
25
 
26
26
  assert_scripted { scp.download!("/path/to/remote file.txt", "/path/to/local file.txt") }
27
27
  end
28
+
29
+ def test_download_file_with_metacharacters_in_name_should_escape_remote_file_name
30
+ file = prepare_file("/path/to/local/#{awful_file_name}", "")
31
+
32
+ expect_scp_session "-f /path/to/remote/#{escaped_file_name}" do |channel|
33
+ channel.sends_ok
34
+ channel.gets_data "C0666 0 #{awful_file_name}\n"
35
+ channel.sends_ok
36
+ channel.gets_ok
37
+ channel.sends_ok
38
+ end
39
+
40
+ assert_scripted { scp.download!("/path/to/remote/#{awful_file_name}", "/path/to/local/#{awful_file_name}") }
41
+ end
28
42
 
29
43
  def test_download_with_preserve_should_send_times
30
44
  file = prepare_file("/path/to/local.txt", "a" * 1234, 0644, Time.at(1234567890, 123456), Time.at(12121212, 232323))
@@ -15,7 +15,7 @@ class TestUpload < Net::SCP::TestCase
15
15
 
16
16
  assert_scripted { scp.upload!("/path/to/local.txt", "/path/to/remote.txt") }
17
17
  end
18
-
18
+
19
19
  def test_upload_file_with_spaces_in_name_should_escape_remote_file_name
20
20
  prepare_file("/path/to/local file.txt", "")
21
21
 
@@ -29,6 +29,20 @@ class TestUpload < Net::SCP::TestCase
29
29
 
30
30
  assert_scripted { scp.upload!("/path/to/local file.txt", "/path/to/remote file.txt") }
31
31
  end
32
+
33
+ def test_upload_file_with_metacharacters_in_name_should_escape_remote_file_name
34
+ prepare_file("/path/to/local/#{awful_file_name}", "")
35
+
36
+ expect_scp_session "-t /path/to/remote/#{escaped_file_name}" do |channel|
37
+ channel.gets_ok
38
+ channel.sends_data "C0666 0 #{awful_file_name}\n"
39
+ channel.gets_ok
40
+ channel.sends_ok
41
+ channel.gets_ok
42
+ end
43
+
44
+ assert_scripted { scp.upload!("/path/to/local/#{awful_file_name}", "/path/to/remote/#{awful_file_name}") }
45
+ end
32
46
 
33
47
  def test_upload_file_with_preserve_should_send_times
34
48
  prepare_file("/path/to/local.txt", "a" * 1234, 0666, Time.at(1234567890, 123456), Time.at(1234543210, 345678))
metadata CHANGED
@@ -1,27 +1,40 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-scp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ hash: 17
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 3
10
+ version: 1.0.3
5
11
  platform: ruby
6
12
  authors:
7
13
  - Jamis Buck
14
+ - Delano Mandelbaum
8
15
  autorequire:
9
16
  bindir: bin
10
17
  cert_chain: []
11
18
 
12
- date: 2009-11-23 00:00:00 -05:00
19
+ date: 2010-08-17 00:00:00 -04:00
13
20
  default_executable:
14
21
  dependencies:
15
22
  - !ruby/object:Gem::Dependency
16
23
  name: net-ssh
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
20
27
  requirements:
21
28
  - - ">="
22
29
  - !ruby/object:Gem::Version
30
+ hash: 409
31
+ segments:
32
+ - 1
33
+ - 99
34
+ - 1
23
35
  version: 1.99.1
24
- version:
36
+ type: :runtime
37
+ version_requirements: *id001
25
38
  description: A pure Ruby implementation of the SCP client protocol
26
39
  email: jamis@jamisbuck.org
27
40
  executables: []
@@ -72,21 +85,28 @@ rdoc_options:
72
85
  require_paths:
73
86
  - lib
74
87
  required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
75
89
  requirements:
76
90
  - - ">="
77
91
  - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
78
95
  version: "0"
79
- version:
80
96
  required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
81
98
  requirements:
82
99
  - - ">="
83
100
  - !ruby/object:Gem::Version
101
+ hash: 11
102
+ segments:
103
+ - 1
104
+ - 2
84
105
  version: "1.2"
85
- version:
86
106
  requirements: []
87
107
 
88
108
  rubyforge_project: net-ssh
89
- rubygems_version: 1.3.5
109
+ rubygems_version: 1.3.7
90
110
  signing_key:
91
111
  specification_version: 3
92
112
  summary: A pure Ruby implementation of the SCP client protocol