Class: NetConfGen::Handler::RWSimple
- Defined in:
- lib/netconfgen/netconfgen.rb
Overview
Basic read-write session over a ‘physical’ directory.
Instance Method Summary collapse
-
#initialize(path, opts = {}) ⇒ RWSimple
constructor
Initialize the handler.
-
#run!(tag, req, sock, src) ⇒ Object
Handle a session.
Methods inherited from Base
Constructor Details
#initialize(path, opts = {}) ⇒ RWSimple
Initialize the handler.
Options:
- :no_read => deny read access if true
- :no_write => deny write access if true
293 294 295 296 |
# File 'lib/netconfgen/netconfgen.rb', line 293 def initialize(path, opts = {}) @path = path super(opts) end |
Instance Method Details
#run!(tag, req, sock, src) ⇒ Object
Handle a session.
Has to close the socket (and any other resources). Note that the current version ‘guards’ against path traversal by a simple substitution of ‘..’ with ‘__’.
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 |
# File 'lib/netconfgen/netconfgen.rb', line 308 def run!(tag, req, sock, src) name = req.filename.gsub('..', '__') path = File.join(@path, name) case req when Packet::RRQ if @opts[:no_read] log :info, "#{tag} Denied read request for #{req.filename}" sock.send(Packet::ERROR.new(2, 'Access denied.').encode, 0) sock.close return end log :info, "#{tag} Read request for #{req.filename} (#{req.mode})" unless File.exist? path log :warn, "#{tag} File not found" sock.send(Packet::ERROR.new(1, 'File not found.').encode, 0) sock.close return end mode = 'r' mode += 'b' if req.mode == :octet io = File.open(path, mode) send(tag, sock, io) sock.close io.close when Packet::WRQ if @opts[:no_write] log :info, "#{tag} Denied write request for #{req.filename}" sock.send(Packet::ERROR.new(2, 'Access denied.').encode, 0) sock.close return end log :info, "#{tag} Write request for #{req.filename} (#{req.mode})" mode = 'w' mode += 'b' if req.mode == :octet io = File.open(path, mode) ok = recv(tag, sock, io) sock.close io.close unless ok log :warn, "#{tag} Removing partial file #{req.filename}" File.delete(path) end end end |