file_pool 0.3.8 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/file_pool/version.rb +1 -1
- data/lib/file_pool.rb +97 -16
- metadata +4 -4
data/lib/file_pool/version.rb
CHANGED
data/lib/file_pool.rb
CHANGED
@@ -167,7 +167,7 @@ module FilePool
|
|
167
167
|
if @@crypted_mode
|
168
168
|
if options[:decrypt]
|
169
169
|
# return path of decrypted file (tmp path)
|
170
|
-
|
170
|
+
decrypt_to_file id2dir_secured(fid) + "/#{fid}"
|
171
171
|
else
|
172
172
|
id2dir_secured(fid) + "/#{fid}"
|
173
173
|
end
|
@@ -187,6 +187,33 @@ module FilePool
|
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
190
|
+
# Returns an IO object providing an (unencrypted) stream of data of the given file ID
|
191
|
+
# To get the stream of the encrypted data pass :decrypt => false, as an option.
|
192
|
+
#
|
193
|
+
# === Parameters:
|
194
|
+
#
|
195
|
+
# fid (String)::
|
196
|
+
# File ID which was generated by a previous #add operation.
|
197
|
+
#
|
198
|
+
# options (Hash)::
|
199
|
+
# :decrypt (true,false) In encryption mode don't decrypt, but prioved the encrypted data. Defaults to +true+.
|
200
|
+
#
|
201
|
+
# === Return Value:
|
202
|
+
#
|
203
|
+
# :: *IO*, IO stream open for reading
|
204
|
+
#
|
205
|
+
def self.stream fid, options={}
|
206
|
+
options[:decrypt] = true unless options[:decrypt] == false
|
207
|
+
|
208
|
+
if path = path(fid, :decrypt => false)
|
209
|
+
if @@crypted_mode and options[:decrypt]
|
210
|
+
decrypt_to_stream path
|
211
|
+
else
|
212
|
+
open(path)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
190
217
|
#
|
191
218
|
# Remove a previously added file by its ID. Same as FilePool.remove,
|
192
219
|
# but throws exceptions on failure.
|
@@ -298,7 +325,7 @@ module FilePool
|
|
298
325
|
#
|
299
326
|
# === Return Value:
|
300
327
|
#
|
301
|
-
# :: *String*Path and name of the crypted file.
|
328
|
+
# :: *String* Path and name of the crypted file.
|
302
329
|
def self.crypt path
|
303
330
|
# Crypt the file in the temp folder and copy after
|
304
331
|
cipher = create_cipher
|
@@ -320,7 +347,7 @@ module FilePool
|
|
320
347
|
end
|
321
348
|
|
322
349
|
#
|
323
|
-
# Decrypt
|
350
|
+
# Decrypt file to a file in /tmp
|
324
351
|
#
|
325
352
|
# Returns the path to the decrypted file.
|
326
353
|
#
|
@@ -330,26 +357,80 @@ module FilePool
|
|
330
357
|
# path of the file to decrypt.
|
331
358
|
#
|
332
359
|
# === Return Value:
|
360
|
+
#
|
361
|
+
# :: *String* Path and name of the decrypted file.
|
362
|
+
def self.decrypt_to_file path
|
363
|
+
tmpfile = Tempfile.new 'FilePool-decrypt'
|
364
|
+
|
365
|
+
File.open(path) do |crpt|
|
366
|
+
decrypt_io crpt, tmpfile
|
367
|
+
end
|
368
|
+
|
369
|
+
tmpfile.open # re-open for reading, prevents early deletion of tempfile
|
370
|
+
tmpfile.path
|
371
|
+
end
|
372
|
+
|
333
373
|
#
|
334
|
-
#
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
374
|
+
# Decrypt file to a stream (IO) non-blocking by forking a child process.
|
375
|
+
#
|
376
|
+
# === Parameters:
|
377
|
+
#
|
378
|
+
# path (String)::
|
379
|
+
# path of the file to decrypt.
|
380
|
+
#
|
381
|
+
# === Return Value:
|
382
|
+
#
|
383
|
+
# :: *IO* decrypted data as stream
|
384
|
+
def self.decrypt_to_stream path
|
339
385
|
|
386
|
+
pipe_read, pipe_write = IO.pipe
|
387
|
+
|
388
|
+
child = fork do
|
389
|
+
# in child process: decrypting
|
390
|
+
pipe_read.close
|
391
|
+
|
392
|
+
# open encrypted file
|
393
|
+
File.open(path) do |crpt|
|
394
|
+
decrypt_io crpt, pipe_write
|
395
|
+
end
|
396
|
+
|
397
|
+
pipe_write.close
|
398
|
+
end
|
399
|
+
|
400
|
+
# in parent
|
401
|
+
Process.detach(child) # not waiting for it
|
402
|
+
pipe_write.close
|
403
|
+
pipe_read
|
404
|
+
end
|
405
|
+
|
406
|
+
#
|
407
|
+
# Decrypts given IO blockwise and returns IO of decrypted data
|
408
|
+
#
|
409
|
+
# === Parameters:
|
410
|
+
#
|
411
|
+
# in_io (IO)::
|
412
|
+
# provide encrypted data, must be open for reading
|
413
|
+
# out_io (IO)::
|
414
|
+
# provides decrypted data, must be open for writing
|
415
|
+
#
|
416
|
+
# === Retrun value:
|
417
|
+
#
|
418
|
+
# nil
|
419
|
+
def self.decrypt_io in_io, out_io
|
420
|
+
decipher = create_decipher
|
340
421
|
buf = ''
|
341
422
|
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
423
|
+
while in_io.read(@@block_size, buf)
|
424
|
+
out_io << decipher.update(buf)
|
425
|
+
if out_io.is_a?(File)
|
426
|
+
# avoid memory buffering
|
427
|
+
out_io.flush
|
428
|
+
out_io.fsync
|
347
429
|
end
|
348
|
-
output << decipher.final
|
349
430
|
end
|
350
431
|
|
351
|
-
|
352
|
-
|
432
|
+
out_io << decipher.final
|
433
|
+
nil
|
353
434
|
end
|
354
435
|
|
355
436
|
#
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: file_pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 9
|
10
|
+
version: 0.3.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "robokopp (Robert Anni\xC3\xA9s)"
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2018-10-
|
18
|
+
date: 2018-10-23 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|