class HrrRbSftp::Protocol::Version3::Extensions

This class implements SFTP protocol version 3 extension formats and responders.

Public Class Methods

extension_classes() click to toggle source

@return [Array<Class>] A list of classes that has EXTENSION_NAME constant.

# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 14
def self.extension_classes
  constants.map{|c| const_get(c)}.select{|c| c.respond_to?(:const_defined?) && c.const_defined?(:EXTENSION_NAME)}
end
extension_pairs() click to toggle source

@return [Array] A list of extension-pair that the library supports.

# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 21
def self.extension_pairs
  extension_classes.map{|c| {:"extension-name" => c::EXTENSION_NAME, :"extension-data" => c::EXTENSION_DATA}}
end
new(context, logger: nil) click to toggle source

@param context [Hash] Contextual variables.

- :version (Integer) - Negotiated protocol version.
- :handles (Hash\\{String=>File, Dir\}) - Opened handles.

@param logger [Logger] Logger.

# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 31
def initialize context, logger: nil
  self.logger = logger

  @conditional_request_format = conditional_request_format
  @conditional_reply_format   = conditional_reply_format
  @extensions = extension_classes.map{ |c|
                  extension = c.new(context, logger: logger)
                  (c::REQUEST_FORMAT[:"extended-request"] || {}).keys.map{|key| {key => extension} }.inject({}, :merge)
                }.inject({}, :merge)
end

Public Instance Methods

conditional_reply_format() click to toggle source

@return [Hash{Symbol=>Hash{String=>Array<Array(Object, Symbol)>}}] Conditional format used in extended-reply packet.

# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 68
def conditional_reply_format
  @conditional_reply_format ||= reply_formats.inject({}){|h1,h2| h1.merge(h2){|k,v1,v2| v1.merge(v2)}}
end
conditional_request_format() click to toggle source

@return [Hash{Symbol=>Hash{String=>Array<Array(Object, Symbol)>}}] Conditional format used in extended-request packet.

# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 61
def conditional_request_format
  @conditional_request_format ||= request_formats.inject({}){|h1,h2| h1.merge(h2){|k,v1,v2| v1.merge(v2)}}
end
respond_to(request) click to toggle source

@return [Hash{Symbol=>Object] Response represented in Hash.

# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 53
def respond_to request
  extended_request = request[:"extended-request"]
  @extensions[extended_request].respond_to request
end
respond_to?(request) click to toggle source

@return [Boolean] true if request's extended-request is supported. false if not.

# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 45
def respond_to? request
  extended_request = request[:"extended-request"]
  @extensions.has_key?(extended_request)
end

Private Instance Methods

extension_classes() click to toggle source
# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 74
def extension_classes
  self.class.constants.map{|c| self.class.const_get(c)}.select{|c| c.respond_to?(:const_defined?) && c.const_defined?(:EXTENSION_NAME)}
end
reply_formats() click to toggle source
# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 82
def reply_formats
  extension_classes.map{|c| c.const_defined?(:REPLY_FORMAT) ? c::REPLY_FORMAT : {}}
end
request_formats() click to toggle source
# File lib/hrr_rb_sftp/protocol/version3/extensions.rb, line 78
def request_formats
  extension_classes.map{|c| c.const_defined?(:REQUEST_FORMAT) ? c::REQUEST_FORMAT : {}}
end