Class: HrrRbSftp::Protocol::Version1::Packet::SSH_FXP_OPEN

Inherits:
Object
  • Object
show all
Includes:
Common::Packetable
Defined in:
lib/hrr_rb_sftp/protocol/version1/packet/003_ssh_fxp_open.rb

Defined Under Namespace

Classes: Error

Constant Summary collapse

TYPE =
3
FORMAT =
[
  [DataType::Byte,   :"type"      ],
  [DataType::Uint32, :"request-id"],
  [DataType::String, :"filename"  ],
  [DataType::Uint32, :"pflags"    ],
  [DataType::Attrs,  :"attrs"     ],
]
SSH_FXF_READ =
0x00000001
SSH_FXF_WRITE =
0x00000002
SSH_FXF_APPEND =
0x00000004
SSH_FXF_CREAT =
0x00000008
SSH_FXF_TRUNC =
0x00000010
SSH_FXF_EXCL =
0x00000020

Instance Attribute Summary

Attributes included from Loggable

#logger

Instance Method Summary collapse

Methods included from Common::Packetable

#decode, #encode, #initialize

Methods included from Loggable

#log_debug, #log_error, #log_fatal, #log_info, #log_warn

Instance Method Details

#convert_pflags_to_flags(pflags) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/hrr_rb_sftp/protocol/version1/packet/003_ssh_fxp_open.rb', line 28

def convert_pflags_to_flags pflags
  flags = 0
  if ((pflags & SSH_FXF_READ) == SSH_FXF_READ) && ((pflags & SSH_FXF_WRITE) == SSH_FXF_WRITE)
    flags |= ::File::RDWR
  elsif (pflags & SSH_FXF_READ) == SSH_FXF_READ
    flags |= ::File::RDONLY
  elsif (pflags & SSH_FXF_WRITE) == SSH_FXF_WRITE
    flags |= ::File::WRONLY
  else
    raise Error, "At least SSH_FXF_READ or SSH_FXF_READ must be specified"
  end
  if (pflags & SSH_FXF_APPEND) == SSH_FXF_APPEND
    flags |= ::File::APPEND
  end
  if (pflags & SSH_FXF_CREAT) == SSH_FXF_CREAT
    flags |= ::File::CREAT
    flags |= ::File::TRUNC if (pflags & SSH_FXF_TRUNC) == SSH_FXF_TRUNC
    flags |= ::File::EXCL  if (pflags & SSH_FXF_EXCL ) == SSH_FXF_EXCL
  elsif (pflags & SSH_FXF_TRUNC) == SSH_FXF_TRUNC
    raise Error, "SSH_FXF_CREAT MUST also be specified when SSH_FXF_TRUNC is specified"
  elsif (pflags & SSH_FXF_EXCL) == SSH_FXF_EXCL
    raise Error, "SSH_FXF_CREAT MUST also be specified when SSH_FXF_EXCL is specified"
  end
  flags |= ::File::BINARY
  flags
end

#respond_to(request) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/hrr_rb_sftp/protocol/version1/packet/003_ssh_fxp_open.rb', line 55

def respond_to request
  begin
    flags = convert_pflags_to_flags request[:"pflags"]
    args = [request[:"filename"], flags]
    if request[:"attrs"].has_key?(:"permissions")
      args.push request[:"attrs"][:"permissions"]
    end
    file = ::File.open(*args)
    handle = file.object_id.to_s(16)
    @handles[handle] = file
    {
      :"type"       => SSH_FXP_HANDLE::TYPE,
      :"request-id" => request[:"request-id"],
      :"handle"     => handle,
    }
  rescue Error => e
    {
      :"type"          => SSH_FXP_STATUS::TYPE,
      :"request-id"    => request[:"request-id"],
      :"code"          => SSH_FXP_STATUS::SSH_FX_FAILURE,
      :"error message" => e.message,
      :"language tag"  => "",
    }
  rescue Errno::ENOENT
    {
      :"type"          => SSH_FXP_STATUS::TYPE,
      :"request-id"    => request[:"request-id"],
      :"code"          => SSH_FXP_STATUS::SSH_FX_NO_SUCH_FILE,
      :"error message" => "No such file or directory",
      :"language tag"  => "",
    }
  rescue Errno::EACCES
    {
      :"type"          => SSH_FXP_STATUS::TYPE,
      :"request-id"    => request[:"request-id"],
      :"code"          => SSH_FXP_STATUS::SSH_FX_PERMISSION_DENIED,
      :"error message" => "Permission denied",
      :"language tag"  => "",
    }
  rescue => e
    log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
    {
      :"type"          => SSH_FXP_STATUS::TYPE,
      :"request-id"    => request[:"request-id"],
      :"code"          => SSH_FXP_STATUS::SSH_FX_FAILURE,
      :"error message" => e.message,
      :"language tag"  => "",
    }
  end
end