Class: Archive::Zip::Codec::TraditionalEncryption::Encrypt
- Includes:
- IO::Like
- Defined in:
- lib/archive/zip/codec/traditional_encryption.rb
Overview
Archive::Zip::Codec::TraditionalEncryption::Encrypt is a writable, IO-like object which encrypts data written to it using the traditional encryption algorithm as documented in the ZIP specification and writes the result to a delegate IO object. A close method is also provided which can optionally close the delegate object.
Instances of this class should only be accessed via the Archive::Zip::Codec::TraditionalEncryption#compressor method.
Class Method Summary collapse
-
.open(io, password, mtime) ⇒ Object
Creates a new instance of this class with the given argument using #new and then passes the instance to the given block.
Instance Method Summary collapse
-
#close(close_delegate = true) ⇒ Object
Closes the stream after flushing the encryption buffer to the delegate.
-
#initialize(io, password, mtime) ⇒ Encrypt
constructor
Creates a new instance of this class using io as a data sink.
Constructor Details
#initialize(io, password, mtime) ⇒ Encrypt
Creates a new instance of this class using io as a data sink. io must be writable and must provide a write method as IO does or errors will be raised when performing write operations. password should be the encryption key. mtime must be the last modified time of the entry to be encrypted/decrypted.
The flush_size attribute is set to 0
by default under the assumption that io is already buffered.
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/archive/zip/codec/traditional_encryption.rb', line 113 def initialize(io, password, mtime) # Keep track of the total number of bytes written. # Set this here so that the call to #initialize_keys caused by the call # to super below does not cause errors in #unbuffered_write due to this # attribute being uninitialized. @total_bytes_in = 0 # This buffer is used to hold the encrypted version of the string most # recently sent to #unbuffered_write. @encrypt_buffer = '' super(io, password, mtime) # Assume that the delegate IO object is already buffered. self.flush_size = 0 end |
Class Method Details
.open(io, password, mtime) ⇒ Object
Creates a new instance of this class with the given argument using #new and then passes the instance to the given block. The #close method is guaranteed to be called after the block completes.
Equivalent to #new if no block is given.
94 95 96 97 98 99 100 101 102 103 |
# File 'lib/archive/zip/codec/traditional_encryption.rb', line 94 def self.open(io, password, mtime) encrypt_io = new(io, password, mtime) return encrypt_io unless block_given? begin yield(encrypt_io) ensure encrypt_io.close unless encrypt_io.closed? end end |
Instance Method Details
#close(close_delegate = true) ⇒ Object
Closes the stream after flushing the encryption buffer to the delegate. If close_delegate is true
, the delegate object used as a data sink will also be closed using its close method.
Raises IOError if called more than once.
135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/archive/zip/codec/traditional_encryption.rb', line 135 def close(close_delegate = true) flush() begin until @encrypt_buffer.empty? do @encrypt_buffer.slice!(0, io.write(@encrypt_buffer)) end rescue Errno::EAGAIN, Errno::EINTR retry if write_ready? end super() io.close if close_delegate nil end |