sftp_server 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6579fc72d42db229fdc52951724810a74e81661
4
- data.tar.gz: a73bb16cb690daa050997e727c195740e70c841b
3
+ metadata.gz: 445996399523862768032cf1c5792561c134ef29
4
+ data.tar.gz: f1b84c99308b24cd2403797ae69a2feb42856ad8
5
5
  SHA512:
6
- metadata.gz: c27a18a11ed53b0c762c48d6c43f2ba495bcb8ca18f85ce561ae8550be0d84df7d1220bd4ec0d1795dc32fb2abcd42cdacfc3ce20d4b346b574c456f20def542
7
- data.tar.gz: 840fa2cfe4cc9ae5de894a94b03e07d1d8b98679d1d8f996226db9ff382feb025fb5fd561555b79f3a278789e6e7807f72b25d18a6256ffac70babcdd2783d8b
6
+ metadata.gz: 917a9c983158448c44d5d240bab0fafd8002c7da1dad9f7b18a73630f74a3f7a8421fba51b881b0f3f7cfa01d3052e6b3febe956db242ee680dab08d040fdbac
7
+ data.tar.gz: d7f345a7112a144a2b2565099f501ae65476d311579fa0bd4d199d9edf8dd01ee5217e61b1def3959ec339eabb370b952d135b021b9f68c9e02c990382e8029f
data/README.md CHANGED
@@ -6,6 +6,20 @@ Uses libssh via FFI to create an SFTP server. Useful for testing interactions wi
6
6
 
7
7
  ## Installation
8
8
 
9
+ ### Installing libssh
10
+
11
+ This gem was developed against libssh 0.6.3. It will **not work** when using an older version.
12
+
13
+ To install libssh using Homebrew on Mac OS X:
14
+
15
+ ```
16
+ brew install libssh
17
+ ```
18
+
19
+ ~~To install on Ubuntu 12.04 or Ubuntu 14.04, you'll need to build the library from source, because the versions that are available in Ubuntu package repositories are too old.~~ To work on Linux, [a patched version of libssh is required](https://github.com/corgibytes/sftp_server/issues/1).
20
+
21
+ ### Installing the gem
22
+
9
23
  Add this line to your application's Gemfile:
10
24
 
11
25
  ```ruby
@@ -212,11 +212,27 @@ module SFTPServer
212
212
 
213
213
  if @handles[long_dir_name] == :open
214
214
  Dir.entries(long_dir_name).each do |entry|
215
+ file_stat = File.lstat(File.join(long_dir_name, entry))
216
+
217
+ attributes = SSH::API::SFTPAttributes.new
218
+
219
+ attributes[:flags] = 0
220
+ attributes[:flags] |= SSH::API::Attributes::SSH_FILEXFER_ATTR_SIZE
221
+ attributes[:size] = file_stat.size
222
+ attributes[:flags] |= SSH::API::Attributes::SSH_FILEXFER_ATTR_UIDGID
223
+ attributes[:uid] = file_stat.uid
224
+ attributes[:gid] = file_stat.gid
225
+ attributes[:flags] |= SSH::API::Attributes::SSH_FILEXFER_ATTR_PERMISSIONS
226
+ attributes[:permissions] = file_stat.mode
227
+ attributes[:flags] |= SSH::API::Attributes::SSH_FILEXFER_ATTR_ACMODTIME
228
+ attributes[:atime] = file_stat.atime.to_i
229
+ attributes[:mtime] = file_stat.mtime.to_i
230
+
215
231
  SSH::API.sftp_reply_names_add(
216
232
  client_message,
217
233
  entry,
218
234
  entry,
219
- SSH::API::SFTPAttributes.new.to_ptr
235
+ attributes.to_ptr
220
236
  )
221
237
  end
222
238
  @handles[long_dir_name] = :read
@@ -232,6 +248,11 @@ module SFTPServer
232
248
  long_dir_name = handle.read_string
233
249
  log "long_dir_name: #{long_dir_name}"
234
250
 
251
+ entry = @handles[long_dir_name]
252
+ if entry.respond_to?(:close)
253
+ entry.close
254
+ end
255
+
235
256
  @handles.delete(long_dir_name)
236
257
 
237
258
  SSH::API.sftp_reply_status(client_message, SSH::API::SFTPStatus::SSH_FX_OK, 'Success')
@@ -361,6 +382,16 @@ module SFTPServer
361
382
  file.write(buffer.read_string)
362
383
  SSH::API.sftp_reply_status(client_message, SSH::API::SFTPStatus::SSH_FX_OK, 'Success')
363
384
  end
385
+ when SSH::API::SFTPCommands::SSH_FXP_REMOVE
386
+ log 'remove'
387
+
388
+ file_name = SSH::API.sftp_client_message_get_filename(client_message)
389
+ long_file_name = File.expand_path(file_name)
390
+ log "long_file_name: #{long_file_name}"
391
+
392
+ File.unlink(long_file_name)
393
+
394
+ SSH::API.sftp_reply_status(client_message, SSH::API::SFTPStatus::SSH_FX_OK, 'Success')
364
395
  end
365
396
 
366
397
  SSH::API.sftp_client_message_free(client_message)
@@ -389,7 +420,6 @@ module SFTPServer
389
420
 
390
421
  def open
391
422
  ssh_bind = SSH::API.ssh_bind_new
392
- session = SSH::API.ssh_new
393
423
 
394
424
  set_bind_option(ssh_bind, :int, SSH::API::BindOptions::SSH_BIND_OPTIONS_BINDADDR, :string, listen_address) if listen_address
395
425
  set_bind_option(ssh_bind, :int, SSH::API::BindOptions::SSH_BIND_OPTIONS_BINDPORT_STR, :string, port) if port
@@ -397,20 +427,23 @@ module SFTPServer
397
427
  set_bind_option(ssh_bind, :int, SSH::API::BindOptions::SSH_BIND_OPTIONS_DSAKEY, :string, dsa_key) if dsa_key
398
428
 
399
429
  bind_listen(ssh_bind)
400
- bind_accept(ssh_bind, session)
401
- handle_key_exchange(session)
402
-
403
- if authenticate(session)
404
- channel = open_channel(session)
405
- if channel
406
- if sftp_channel_request(session)
407
- sftp_session = SSH::API.sftp_server_new(session, channel)
408
- init_sftp_session(sftp_session)
409
- sftp_message_loop(sftp_session)
430
+ loop do
431
+ session = SSH::API.ssh_new
432
+ bind_accept(ssh_bind, session)
433
+ handle_key_exchange(session)
434
+
435
+ if authenticate(session)
436
+ channel = open_channel(session)
437
+ if channel
438
+ if sftp_channel_request(session)
439
+ sftp_session = SSH::API.sftp_server_new(session, channel)
440
+ init_sftp_session(sftp_session)
441
+ sftp_message_loop(sftp_session)
442
+ end
410
443
  end
444
+ close_channel(channel)
445
+ free_channel(channel)
411
446
  end
412
- close_channel(channel)
413
- free_channel(channel)
414
447
  end
415
448
  end
416
449
  end
@@ -1,3 +1,3 @@
1
1
  module SFTPServer
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sftp_server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - M. Scott Ford
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-31 00:00:00.000000000 Z
11
+ date: 2015-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler