omnizip 0.3.1

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.
Files changed (511) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +32 -0
  4. data/.rubocop_todo.yml +754 -0
  5. data/COPYING +502 -0
  6. data/Gemfile +17 -0
  7. data/LICENSE +12 -0
  8. data/README.adoc +1045 -0
  9. data/Rakefile +12 -0
  10. data/benchmark/README.md +260 -0
  11. data/benchmark/benchmark_suite.rb +125 -0
  12. data/benchmark/compression_bench.rb +181 -0
  13. data/benchmark/filter_bench.rb +180 -0
  14. data/benchmark/models/benchmark_result.rb +59 -0
  15. data/benchmark/models/comparison_result.rb +69 -0
  16. data/benchmark/profile_suite.rb +167 -0
  17. data/benchmark/reporter.rb +150 -0
  18. data/benchmark/run_benchmarks.rb +66 -0
  19. data/benchmark/test_data.rb +137 -0
  20. data/config/formats/rar3_spec.yml +91 -0
  21. data/config/formats/rar5_spec.yml +102 -0
  22. data/docs/.github/workflows/docs.yml +142 -0
  23. data/docs/.gitignore +21 -0
  24. data/docs/.lychee.toml +67 -0
  25. data/docs/Gemfile +13 -0
  26. data/docs/RAR_WRITE_SUPPORT.md +26 -0
  27. data/docs/README.md +101 -0
  28. data/docs/_config.yml +112 -0
  29. data/docs/assets/logo.svg +1 -0
  30. data/docs/assets/omnizip-logo.pdf +1540 -11
  31. data/docs/comparison/feature-matrix.adoc +694 -0
  32. data/docs/comparison/index.adoc +113 -0
  33. data/docs/comparison/vs-7zip.adoc +309 -0
  34. data/docs/comparison/vs-peazip.adoc +77 -0
  35. data/docs/comparison/vs-rubyzip.adoc +342 -0
  36. data/docs/comparison/vs-winrar.adoc +100 -0
  37. data/docs/compatibility.adoc +579 -0
  38. data/docs/concepts/index.adoc +129 -0
  39. data/docs/developer/architecture.adoc +256 -0
  40. data/docs/developer/contributing.adoc +158 -0
  41. data/docs/developer/index.adoc +25 -0
  42. data/docs/developer/testing.adoc +212 -0
  43. data/docs/getting-started/basic-usage.adoc +271 -0
  44. data/docs/getting-started/index.adoc +42 -0
  45. data/docs/getting-started/installation.adoc +138 -0
  46. data/docs/getting-started/quick-start.adoc +185 -0
  47. data/docs/getting-started/your-first-archive.adoc +218 -0
  48. data/docs/guides/advanced-features/encryption.adoc +300 -0
  49. data/docs/guides/advanced-features/index.adoc +49 -0
  50. data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
  51. data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
  52. data/docs/guides/advanced-features/streaming.adoc +212 -0
  53. data/docs/guides/archive-formats/gzip-format.adoc +107 -0
  54. data/docs/guides/archive-formats/index.adoc +130 -0
  55. data/docs/guides/archive-formats/rar-format.adoc +104 -0
  56. data/docs/guides/archive-formats/rar5.adoc +521 -0
  57. data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
  58. data/docs/guides/archive-formats/tar-format.adoc +106 -0
  59. data/docs/guides/archive-formats/xz-format.adoc +118 -0
  60. data/docs/guides/archive-formats/zip-format.adoc +35 -0
  61. data/docs/guides/compression-algorithms/bzip2.adoc +113 -0
  62. data/docs/guides/compression-algorithms/deflate.adoc +319 -0
  63. data/docs/guides/compression-algorithms/index.adoc +190 -0
  64. data/docs/guides/compression-algorithms/lzma.adoc +398 -0
  65. data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
  66. data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
  67. data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
  68. data/docs/guides/creating-archives.adoc +354 -0
  69. data/docs/guides/extracting-archives.adoc +53 -0
  70. data/docs/guides/format-conversion.adoc +64 -0
  71. data/docs/guides/index.adoc +49 -0
  72. data/docs/guides/migration-rubyzip.adoc +217 -0
  73. data/docs/guides/parity-archives.adoc +605 -0
  74. data/docs/guides/performance-tuning.adoc +88 -0
  75. data/docs/index.adoc +218 -0
  76. data/docs/lychee.toml +67 -0
  77. data/docs/reference/api/overview.adoc +188 -0
  78. data/docs/reference/cli/compress-command.adoc +114 -0
  79. data/docs/reference/cli/overview.adoc +140 -0
  80. data/docs/reference/index.adoc +26 -0
  81. data/docs/resources/faq.adoc +185 -0
  82. data/docs/resources/quick-reference.adoc +222 -0
  83. data/docs/troubleshooting/index.adoc +208 -0
  84. data/examples/api_comparison.rb +205 -0
  85. data/examples/deflate64_example.rb +96 -0
  86. data/examples/par2_demo.rb +121 -0
  87. data/examples/quick_start_native.rb +150 -0
  88. data/examples/quick_start_rubyzip.rb +115 -0
  89. data/examples/rubyzip_compatibility_demo.rb +194 -0
  90. data/exe/omnizip +27 -0
  91. data/lib/omnizip/algorithm.rb +130 -0
  92. data/lib/omnizip/algorithm_registry.rb +86 -0
  93. data/lib/omnizip/algorithms/.keep +0 -0
  94. data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
  95. data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
  96. data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
  97. data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
  98. data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
  99. data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
  100. data/lib/omnizip/algorithms/bzip2.rb +130 -0
  101. data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
  102. data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
  103. data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
  104. data/lib/omnizip/algorithms/deflate.rb +128 -0
  105. data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
  106. data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
  107. data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
  108. data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
  109. data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
  110. data/lib/omnizip/algorithms/deflate64.rb +109 -0
  111. data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
  112. data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
  113. data/lib/omnizip/algorithms/lzma/decoder.rb +148 -0
  114. data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
  115. data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
  116. data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
  117. data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
  118. data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
  119. data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
  120. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
  121. data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -0
  122. data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
  123. data/lib/omnizip/algorithms/lzma/match.rb +32 -0
  124. data/lib/omnizip/algorithms/lzma/match_finder.rb +205 -0
  125. data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
  126. data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
  127. data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
  128. data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
  129. data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
  130. data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
  131. data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
  132. data/lib/omnizip/algorithms/lzma/state.rb +127 -0
  133. data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
  134. data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
  135. data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
  136. data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
  137. data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
  138. data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
  139. data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
  140. data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
  141. data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
  142. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
  143. data/lib/omnizip/algorithms/lzma.rb +238 -0
  144. data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
  145. data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
  146. data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
  147. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
  148. data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
  149. data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
  150. data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
  151. data/lib/omnizip/algorithms/lzma2.rb +141 -0
  152. data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
  153. data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
  154. data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
  155. data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
  156. data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
  157. data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
  158. data/lib/omnizip/algorithms/ppmd7.rb +116 -0
  159. data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
  160. data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
  161. data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
  162. data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
  163. data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
  164. data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
  165. data/lib/omnizip/algorithms/ppmd8.rb +82 -0
  166. data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
  167. data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
  168. data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
  169. data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
  170. data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
  171. data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
  172. data/lib/omnizip/algorithms/zstandard.rb +138 -0
  173. data/lib/omnizip/buffer/memory_archive.rb +251 -0
  174. data/lib/omnizip/buffer/memory_extractor.rb +224 -0
  175. data/lib/omnizip/buffer.rb +176 -0
  176. data/lib/omnizip/checksum_registry.rb +114 -0
  177. data/lib/omnizip/checksums/crc32.rb +100 -0
  178. data/lib/omnizip/checksums/crc64.rb +101 -0
  179. data/lib/omnizip/checksums/crc_base.rb +158 -0
  180. data/lib/omnizip/checksums/verifier.rb +131 -0
  181. data/lib/omnizip/chunked/memory_manager.rb +194 -0
  182. data/lib/omnizip/chunked/reader.rb +78 -0
  183. data/lib/omnizip/chunked/writer.rb +120 -0
  184. data/lib/omnizip/chunked.rb +129 -0
  185. data/lib/omnizip/cli/output_formatter.rb +104 -0
  186. data/lib/omnizip/cli.rb +572 -0
  187. data/lib/omnizip/commands/.keep +0 -0
  188. data/lib/omnizip/commands/archive_create_command.rb +427 -0
  189. data/lib/omnizip/commands/archive_extract_command.rb +272 -0
  190. data/lib/omnizip/commands/archive_list_command.rb +218 -0
  191. data/lib/omnizip/commands/archive_repair_command.rb +131 -0
  192. data/lib/omnizip/commands/archive_verify_command.rb +117 -0
  193. data/lib/omnizip/commands/compress_command.rb +117 -0
  194. data/lib/omnizip/commands/decompress_command.rb +120 -0
  195. data/lib/omnizip/commands/list_command.rb +53 -0
  196. data/lib/omnizip/commands/metadata_command.rb +153 -0
  197. data/lib/omnizip/commands/parity_create_command.rb +122 -0
  198. data/lib/omnizip/commands/parity_repair_command.rb +122 -0
  199. data/lib/omnizip/commands/parity_verify_command.rb +124 -0
  200. data/lib/omnizip/commands/profile_list_command.rb +56 -0
  201. data/lib/omnizip/commands/profile_show_command.rb +44 -0
  202. data/lib/omnizip/convenience.rb +359 -0
  203. data/lib/omnizip/converter/conversion_registry.rb +49 -0
  204. data/lib/omnizip/converter/conversion_strategy.rb +121 -0
  205. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
  206. data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
  207. data/lib/omnizip/converter.rb +105 -0
  208. data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
  209. data/lib/omnizip/crypto/aes256/constants.rb +28 -0
  210. data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
  211. data/lib/omnizip/crypto/aes256.rb +102 -0
  212. data/lib/omnizip/error.rb +106 -0
  213. data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
  214. data/lib/omnizip/eta/moving_average_estimator.rb +99 -0
  215. data/lib/omnizip/eta/rate_calculator.rb +104 -0
  216. data/lib/omnizip/eta/sample_history.rb +143 -0
  217. data/lib/omnizip/eta/time_estimator.rb +106 -0
  218. data/lib/omnizip/eta.rb +63 -0
  219. data/lib/omnizip/extraction/filter_chain.rb +177 -0
  220. data/lib/omnizip/extraction/glob_pattern.rb +140 -0
  221. data/lib/omnizip/extraction/pattern_matcher.rb +70 -0
  222. data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
  223. data/lib/omnizip/extraction/regex_pattern.rb +50 -0
  224. data/lib/omnizip/extraction/selective_extractor.rb +240 -0
  225. data/lib/omnizip/extraction.rb +111 -0
  226. data/lib/omnizip/file_type/mime_classifier.rb +144 -0
  227. data/lib/omnizip/file_type.rb +113 -0
  228. data/lib/omnizip/filter.rb +139 -0
  229. data/lib/omnizip/filter_pipeline.rb +108 -0
  230. data/lib/omnizip/filter_registry.rb +166 -0
  231. data/lib/omnizip/filters/bcj.rb +279 -0
  232. data/lib/omnizip/filters/bcj2/constants.rb +53 -0
  233. data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
  234. data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
  235. data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
  236. data/lib/omnizip/filters/bcj2.rb +99 -0
  237. data/lib/omnizip/filters/bcj_arm.rb +176 -0
  238. data/lib/omnizip/filters/bcj_arm64.rb +244 -0
  239. data/lib/omnizip/filters/bcj_ia64.rb +196 -0
  240. data/lib/omnizip/filters/bcj_ppc.rb +190 -0
  241. data/lib/omnizip/filters/bcj_sparc.rb +176 -0
  242. data/lib/omnizip/filters/bcj_x86.rb +193 -0
  243. data/lib/omnizip/filters/delta.rb +196 -0
  244. data/lib/omnizip/filters/filter_base.rb +72 -0
  245. data/lib/omnizip/filters/registry.rb +123 -0
  246. data/lib/omnizip/filters/xz_delta.rb +258 -0
  247. data/lib/omnizip/format_detector.rb +162 -0
  248. data/lib/omnizip/format_registry.rb +59 -0
  249. data/lib/omnizip/formats/.keep +0 -0
  250. data/lib/omnizip/formats/bzip2_file.rb +172 -0
  251. data/lib/omnizip/formats/cpio/constants.rb +55 -0
  252. data/lib/omnizip/formats/cpio/entry.rb +385 -0
  253. data/lib/omnizip/formats/cpio/reader.rb +196 -0
  254. data/lib/omnizip/formats/cpio/writer.rb +234 -0
  255. data/lib/omnizip/formats/cpio.rb +140 -0
  256. data/lib/omnizip/formats/format_spec_loader.rb +230 -0
  257. data/lib/omnizip/formats/gzip.rb +238 -0
  258. data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
  259. data/lib/omnizip/formats/iso/directory_record.rb +152 -0
  260. data/lib/omnizip/formats/iso/joliet.rb +204 -0
  261. data/lib/omnizip/formats/iso/path_table.rb +125 -0
  262. data/lib/omnizip/formats/iso/reader.rb +197 -0
  263. data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
  264. data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
  265. data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
  266. data/lib/omnizip/formats/iso/writer.rb +530 -0
  267. data/lib/omnizip/formats/iso.rb +140 -0
  268. data/lib/omnizip/formats/lzip.rb +175 -0
  269. data/lib/omnizip/formats/lzma_alone.rb +171 -0
  270. data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
  271. data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
  272. data/lib/omnizip/formats/rar/block_parser.rb +243 -0
  273. data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
  274. data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
  275. data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
  276. data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -0
  277. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
  278. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
  279. data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
  280. data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
  281. data/lib/omnizip/formats/rar/compression/ppmd/context.rb +105 -0
  282. data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
  283. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
  284. data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
  285. data/lib/omnizip/formats/rar/constants.rb +82 -0
  286. data/lib/omnizip/formats/rar/decompressor.rb +238 -0
  287. data/lib/omnizip/formats/rar/external_writer.rb +312 -0
  288. data/lib/omnizip/formats/rar/header.rb +192 -0
  289. data/lib/omnizip/formats/rar/license_validator.rb +109 -0
  290. data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
  291. data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
  292. data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
  293. data/lib/omnizip/formats/rar/parity_handler.rb +292 -0
  294. data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
  295. data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -0
  296. data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
  297. data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
  298. data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +97 -0
  299. data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
  300. data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
  301. data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
  302. data/lib/omnizip/formats/rar/rar5/header.rb +187 -0
  303. data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
  304. data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
  305. data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
  306. data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
  307. data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
  308. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +264 -0
  309. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
  310. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +194 -0
  311. data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
  312. data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
  313. data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
  314. data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
  315. data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
  316. data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
  317. data/lib/omnizip/formats/rar/reader.rb +366 -0
  318. data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
  319. data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
  320. data/lib/omnizip/formats/rar/writer.rb +431 -0
  321. data/lib/omnizip/formats/rar.rb +205 -0
  322. data/lib/omnizip/formats/rar3/compressor.rb +73 -0
  323. data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
  324. data/lib/omnizip/formats/rar3/reader.rb +386 -0
  325. data/lib/omnizip/formats/rar3/writer.rb +219 -0
  326. data/lib/omnizip/formats/rar5/compressor.rb +73 -0
  327. data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
  328. data/lib/omnizip/formats/rar5/reader.rb +342 -0
  329. data/lib/omnizip/formats/rar5/writer.rb +214 -0
  330. data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
  331. data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
  332. data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
  333. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
  334. data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
  335. data/lib/omnizip/formats/seven_zip/header.rb +106 -0
  336. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
  337. data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
  338. data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
  339. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
  340. data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
  341. data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
  342. data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
  343. data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
  344. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
  345. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
  346. data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
  347. data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
  348. data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
  349. data/lib/omnizip/formats/seven_zip.rb +93 -0
  350. data/lib/omnizip/formats/tar/constants.rb +73 -0
  351. data/lib/omnizip/formats/tar/entry.rb +94 -0
  352. data/lib/omnizip/formats/tar/header.rb +168 -0
  353. data/lib/omnizip/formats/tar/reader.rb +121 -0
  354. data/lib/omnizip/formats/tar/writer.rb +216 -0
  355. data/lib/omnizip/formats/tar.rb +84 -0
  356. data/lib/omnizip/formats/xz/reader.rb +116 -0
  357. data/lib/omnizip/formats/xz.rb +237 -0
  358. data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
  359. data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
  360. data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
  361. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
  362. data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
  363. data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
  364. data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
  365. data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
  366. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
  367. data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
  368. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
  369. data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
  370. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
  371. data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
  372. data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
  373. data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
  374. data/lib/omnizip/formats/zip/constants.rb +69 -0
  375. data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
  376. data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
  377. data/lib/omnizip/formats/zip/reader.rb +250 -0
  378. data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
  379. data/lib/omnizip/formats/zip/writer.rb +375 -0
  380. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
  381. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
  382. data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
  383. data/lib/omnizip/formats/zip.rb +50 -0
  384. data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
  385. data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
  386. data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
  387. data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
  388. data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
  389. data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +421 -0
  390. data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
  391. data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
  392. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
  393. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
  394. data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
  395. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
  396. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
  397. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
  398. data/lib/omnizip/io/buffered_input.rb +146 -0
  399. data/lib/omnizip/io/buffered_output.rb +105 -0
  400. data/lib/omnizip/io/stream_manager.rb +115 -0
  401. data/lib/omnizip/link_handler/hard_link.rb +79 -0
  402. data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
  403. data/lib/omnizip/link_handler.rb +124 -0
  404. data/lib/omnizip/metadata/archive_metadata.rb +114 -0
  405. data/lib/omnizip/metadata/entry_metadata.rb +146 -0
  406. data/lib/omnizip/metadata/metadata_editor.rb +171 -0
  407. data/lib/omnizip/metadata/metadata_registry.rb +64 -0
  408. data/lib/omnizip/metadata/metadata_validator.rb +99 -0
  409. data/lib/omnizip/metadata.rb +57 -0
  410. data/lib/omnizip/models/.keep +0 -0
  411. data/lib/omnizip/models/algorithm_metadata.rb +73 -0
  412. data/lib/omnizip/models/compression_options.rb +71 -0
  413. data/lib/omnizip/models/conversion_options.rb +87 -0
  414. data/lib/omnizip/models/conversion_result.rb +135 -0
  415. data/lib/omnizip/models/eta_result.rb +46 -0
  416. data/lib/omnizip/models/extraction_rule.rb +115 -0
  417. data/lib/omnizip/models/filter_chain.rb +144 -0
  418. data/lib/omnizip/models/filter_config.rb +183 -0
  419. data/lib/omnizip/models/match_result.rb +124 -0
  420. data/lib/omnizip/models/optimization_suggestion.rb +91 -0
  421. data/lib/omnizip/models/parallel_options.rb +104 -0
  422. data/lib/omnizip/models/performance_result.rb +79 -0
  423. data/lib/omnizip/models/profile_report.rb +82 -0
  424. data/lib/omnizip/models/progress_options.rb +38 -0
  425. data/lib/omnizip/models/split_options.rb +116 -0
  426. data/lib/omnizip/optimization_registry.rb +81 -0
  427. data/lib/omnizip/parallel/job_queue.rb +209 -0
  428. data/lib/omnizip/parallel/job_scheduler.rb +203 -0
  429. data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
  430. data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
  431. data/lib/omnizip/parallel/worker_pool.rb +223 -0
  432. data/lib/omnizip/parallel.rb +149 -0
  433. data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
  434. data/lib/omnizip/parity/galois16.rb +145 -0
  435. data/lib/omnizip/parity/models/creator_packet.rb +73 -0
  436. data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
  437. data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
  438. data/lib/omnizip/parity/models/main_packet.rb +128 -0
  439. data/lib/omnizip/parity/models/packet.rb +156 -0
  440. data/lib/omnizip/parity/models/packet_registry.rb +109 -0
  441. data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
  442. data/lib/omnizip/parity/par2_creator.rb +531 -0
  443. data/lib/omnizip/parity/par2_repairer.rb +407 -0
  444. data/lib/omnizip/parity/par2_verifier.rb +364 -0
  445. data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
  446. data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
  447. data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
  448. data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
  449. data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
  450. data/lib/omnizip/parity.rb +186 -0
  451. data/lib/omnizip/password/encryption_registry.rb +65 -0
  452. data/lib/omnizip/password/encryption_strategy.rb +96 -0
  453. data/lib/omnizip/password/password_validator.rb +129 -0
  454. data/lib/omnizip/password/winzip_aes_strategy.rb +192 -0
  455. data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
  456. data/lib/omnizip/password.rb +87 -0
  457. data/lib/omnizip/pipe/stream_compressor.rb +124 -0
  458. data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
  459. data/lib/omnizip/pipe.rb +121 -0
  460. data/lib/omnizip/platform/ntfs_streams.rb +201 -0
  461. data/lib/omnizip/platform.rb +189 -0
  462. data/lib/omnizip/profile/archive_profile.rb +39 -0
  463. data/lib/omnizip/profile/balanced_profile.rb +33 -0
  464. data/lib/omnizip/profile/binary_profile.rb +36 -0
  465. data/lib/omnizip/profile/compression_profile.rb +158 -0
  466. data/lib/omnizip/profile/custom_profile.rb +157 -0
  467. data/lib/omnizip/profile/fast_profile.rb +33 -0
  468. data/lib/omnizip/profile/maximum_profile.rb +33 -0
  469. data/lib/omnizip/profile/profile_detector.rb +110 -0
  470. data/lib/omnizip/profile/profile_registry.rb +161 -0
  471. data/lib/omnizip/profile/text_profile.rb +36 -0
  472. data/lib/omnizip/profile.rb +190 -0
  473. data/lib/omnizip/profiler/memory_profiler.rb +66 -0
  474. data/lib/omnizip/profiler/method_profiler.rb +49 -0
  475. data/lib/omnizip/profiler/report_generator.rb +169 -0
  476. data/lib/omnizip/profiler.rb +204 -0
  477. data/lib/omnizip/progress/callback_reporter.rb +36 -0
  478. data/lib/omnizip/progress/console_reporter.rb +62 -0
  479. data/lib/omnizip/progress/log_reporter.rb +91 -0
  480. data/lib/omnizip/progress/operation_progress.rb +118 -0
  481. data/lib/omnizip/progress/progress_bar.rb +156 -0
  482. data/lib/omnizip/progress/progress_reporter.rb +40 -0
  483. data/lib/omnizip/progress/progress_tracker.rb +190 -0
  484. data/lib/omnizip/progress/silent_reporter.rb +24 -0
  485. data/lib/omnizip/progress.rb +127 -0
  486. data/lib/omnizip/rubyzip_compat.rb +63 -0
  487. data/lib/omnizip/temp/safe_extract.rb +168 -0
  488. data/lib/omnizip/temp/temp_file.rb +124 -0
  489. data/lib/omnizip/temp/temp_file_pool.rb +109 -0
  490. data/lib/omnizip/temp.rb +181 -0
  491. data/lib/omnizip/version.rb +5 -0
  492. data/lib/omnizip/zip/entry.rb +156 -0
  493. data/lib/omnizip/zip/file.rb +485 -0
  494. data/lib/omnizip/zip/input_stream.rb +273 -0
  495. data/lib/omnizip/zip/output_stream.rb +324 -0
  496. data/lib/omnizip.rb +156 -0
  497. data/readme-docs/advanced-features.adoc +515 -0
  498. data/readme-docs/api-usage.adoc +444 -0
  499. data/readme-docs/architecture.adoc +449 -0
  500. data/readme-docs/archive-formats.adoc +479 -0
  501. data/readme-docs/cli-usage.adoc +222 -0
  502. data/readme-docs/compression-algorithms.adoc +442 -0
  503. data/readme-docs/compression-profiles.adoc +247 -0
  504. data/readme-docs/encryption-checksums.adoc +328 -0
  505. data/readme-docs/format-converter.adoc +325 -0
  506. data/readme-docs/installation.adoc +228 -0
  507. data/readme-docs/par2-archives.adoc +608 -0
  508. data/readme-docs/performance-profiler.adoc +389 -0
  509. data/readme-docs/preprocessing-filters.adoc +280 -0
  510. data/xz-file-format-1.2.1.txt +1174 -0
  511. metadata +617 -0
@@ -0,0 +1,218 @@
1
+ ---
2
+ title: Your First Archive
3
+ nav_order: 4
4
+ parent: Getting Started
5
+ ---
6
+
7
+ == Your First Archive
8
+
9
+ === General
10
+
11
+ This guide walks you through creating your first archive with Omnizip, covering both .7z and ZIP formats.
12
+
13
+ === Creating a Simple 7z Archive
14
+
15
+ ==== Command Line
16
+
17
+ [source,bash]
18
+ ----
19
+ # Create a 7z archive with default settings
20
+ omnizip archive create backup.7z document.txt photo.jpg
21
+ ----
22
+
23
+ This creates a new archive using LZMA2 compression at level 5 (default).
24
+
25
+ ==== Ruby API
26
+
27
+ [source,ruby]
28
+ ----
29
+ require 'omnizip'
30
+
31
+ # Create archive with default settings
32
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z')
33
+ writer.add_file('document.txt')
34
+ writer.add_file('photo.jpg')
35
+ writer.close
36
+
37
+ puts "Archive created successfully!"
38
+ ----
39
+
40
+ === Customizing Compression
41
+
42
+ ==== Higher Compression
43
+
44
+ [source,bash]
45
+ ----
46
+ omnizip archive create backup.7z documents/ \
47
+ --algorithm lzma2 --level 9
48
+ ----
49
+
50
+ [source,ruby]
51
+ ----
52
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z',
53
+ algorithm: :lzma2,
54
+ level: 9
55
+ )
56
+ writer.add_directory('documents/')
57
+ writer.close
58
+ ----
59
+
60
+ ==== Faster Compression
61
+
62
+ [source,bash]
63
+ ----
64
+ omnizip archive create backup.7z data/ \
65
+ --algorithm lzma2 --level 1
66
+ ----
67
+
68
+ [source,ruby]
69
+ ----
70
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z',
71
+ algorithm: :lzma2,
72
+ level: 1
73
+ )
74
+ writer.add_directory('data/')
75
+ writer.close
76
+ ----
77
+
78
+ === Creating a ZIP Archive
79
+
80
+ ==== Command Line
81
+
82
+ [source,bash]
83
+ ----
84
+ # Create a ZIP archive
85
+ omnizip archive create backup.zip documents/ \
86
+ --format zip
87
+ ----
88
+
89
+ ==== Ruby API
90
+
91
+ [source,ruby]
92
+ ----
93
+ require 'omnizip'
94
+
95
+ writer = Omnizip::Formats::Zip::Writer.new('backup.zip')
96
+ writer.add_directory('documents/')
97
+ writer.close
98
+ ----
99
+
100
+ === Using Filters for Executables
101
+
102
+ BCJ filters improve compression of executable files:
103
+
104
+ [source,bash]
105
+ ----
106
+ omnizip archive create binaries.7z app.exe \
107
+ --filters bcj_x86
108
+ ----
109
+
110
+ [source,ruby]
111
+ ----
112
+ writer = Omnizip::Formats::SevenZip::Writer.new('binaries.7z',
113
+ filters: [:bcj_x86]
114
+ )
115
+ writer.add_file('app.exe')
116
+ writer.close
117
+ ----
118
+
119
+ === Creating Multi-Volume Archives
120
+
121
+ Split large archives into multiple volumes:
122
+
123
+ [source,bash]
124
+ ----
125
+ # Create volumes of 100MB each
126
+ omnizip archive create backup.7z.001 large_data/ \
127
+ --volume-size 100M
128
+ ----
129
+
130
+ [source,ruby]
131
+ ----
132
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z.001',
133
+ volume_size: 100 * 1024 * 1024
134
+ )
135
+ writer.add_directory('large_data/')
136
+ writer.close
137
+ ----
138
+
139
+ === Encrypting Archives
140
+
141
+ Protect your archives with a password:
142
+
143
+ [source,bash]
144
+ ----
145
+ omnizip archive create secure.7z documents/ \
146
+ --password "MySecurePassword123!"
147
+ ----
148
+
149
+ [source,ruby]
150
+ ----
151
+ writer = Omnizip::Formats::SevenZip::Writer.new('secure.7z',
152
+ password: 'MySecurePassword123!'
153
+ )
154
+ writer.add_directory('documents/')
155
+ writer.close
156
+ ----
157
+
158
+ === Complete Example
159
+
160
+ Here's a complete example that creates a backup archive:
161
+
162
+ [source,ruby]
163
+ ----
164
+ require 'omnizip'
165
+
166
+ # Create encrypted backup with high compression
167
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z',
168
+ algorithm: :lzma2,
169
+ level: 7,
170
+ password: ENV['BACKUP_PASSWORD'],
171
+ solid: true
172
+ )
173
+
174
+ # Add directories
175
+ writer.add_directory('/home/user/documents')
176
+ writer.add_directory('/home/user/projects')
177
+ writer.add_directory('/home/user/photos')
178
+
179
+ # Write the archive
180
+ writer.close
181
+
182
+ # Get statistics
183
+ info = Omnizip::Formats::SevenZip::Reader.info('backup.7z')
184
+ puts "Archive created:"
185
+ puts " Files: #{info.entry_count}"
186
+ puts " Size: #{info.uncompressed_size} bytes"
187
+ puts " Compressed: #{info.compressed_size} bytes"
188
+ puts " Ratio: #{(info.compressed_size.to_f / info.uncompressed_size * 100).round(1)}%"
189
+ ----
190
+
191
+ === Verifying Your Archive
192
+
193
+ Always verify your archive after creation:
194
+
195
+ [source,bash]
196
+ ----
197
+ omnizip archive list backup.7z
198
+ ----
199
+
200
+ [source,ruby]
201
+ ----
202
+ require 'omnizip'
203
+
204
+ reader = Omnizip::Formats::SevenZip::Reader.new('backup.7z')
205
+ reader.open
206
+ puts "Archive contents:"
207
+ reader.each_file do |entry|
208
+ puts " #{entry.name} (#{entry.size} bytes)"
209
+ end
210
+ reader.close
211
+ ----
212
+
213
+ === Next Steps
214
+
215
+ * link:../guides/basic-usage/creating-archives[Creating Archives Guide] - More archive options
216
+ * link:../guides/advanced-usage/solid-compression[Solid Archives] - Better compression for similar files
217
+ * link:../guides/advanced-usage/encryption[Encryption Guide] - Password protection details
218
+ * link:../guides/basic-usage/extracting-archives[Extracting Archives] - How to extract your archives
@@ -0,0 +1,300 @@
1
+ ---
2
+ title: Encryption
3
+ nav_order: 4
4
+ parent: Advanced Features
5
+ grand_parent: Guides
6
+ ---
7
+
8
+ == Purpose
9
+
10
+ Protect sensitive data in your archives with industry-standard AES-256 encryption. Omnizip supports multiple encryption methods across different archive formats.
11
+
12
+ == Benefits
13
+
14
+ * **Strong Security**: AES-256 encryption with secure key derivation
15
+ * **Format Flexibility**: Encryption available in both ZIP and 7z formats
16
+ * **Header Protection**: Encrypt filenames and metadata (7z format)
17
+ * **Password Validation**: Built-in password strength checking
18
+ * **Compatibility**: Works with archives from other tools
19
+
20
+ == Encryption Methods
21
+
22
+ === AES-256 (7z Format)
23
+
24
+ The strongest encryption option with header protection:
25
+
26
+ [source,ruby]
27
+ ----
28
+ # Create encrypted 7z archive
29
+ Omnizip::Archive.create(
30
+ 'secure.7z',
31
+ format: :seven_zip,
32
+ password: 'MyStr0ngP@ssw0rd',
33
+ encrypt_headers: true # Hide filenames
34
+ ) do |archive|
35
+ archive.add_file('confidential.pdf', 'documents/confidential.pdf')
36
+ archive.add_directory('sensitive_data/')
37
+ end
38
+ ----
39
+
40
+ **Features**:
41
+
42
+ * AES-256-CBC encryption
43
+ * PBKDF2-HMAC-SHA256 key derivation (524,288 iterations)
44
+ * Optional header encryption (hides filenames)
45
+ * HMAC-SHA-256 authentication
46
+
47
+ === WinZip AES (ZIP Format)
48
+
49
+ Industry-standard AES encryption for ZIP archives:
50
+
51
+ [source,ruby]
52
+ ----
53
+ # Create AES-encrypted ZIP
54
+ Omnizip::Zip::File.open('secure.zip', create: true) do |zip|
55
+ zip.password = 'SecurePassword123'
56
+ zip.encryption = :winzip_aes # AES-256
57
+ zip.add('private.doc', 'files/private.doc')
58
+ end
59
+ ----
60
+
61
+ **Features**:
62
+
63
+ * AES-256, AES-192, or AES-128
64
+ * Compatible with WinZip, 7-Zip, PeaZip
65
+ * HMAC-SHA-1 authentication
66
+ * Standard ZIP format
67
+
68
+ === Traditional ZIP Encryption
69
+
70
+ [WARNING]
71
+ Traditional ZIP encryption (ZipCrypto) is weak and should only be used for compatibility with legacy systems.
72
+
73
+ [source,ruby]
74
+ ----
75
+ # Only for compatibility - NOT RECOMMENDED
76
+ Omnizip::Zip::File.open('legacy.zip', create: true) do |zip|
77
+ zip.password = 'password'
78
+ zip.encryption = :traditional # Weak encryption
79
+ zip.add('file.txt', 'data.txt')
80
+ end
81
+ ----
82
+
83
+ == Decrypting Archives
84
+
85
+ === Provide Password at Open
86
+
87
+ [source,ruby]
88
+ ----
89
+ # Decrypt 7z archive
90
+ Omnizip::Archive.open('secure.7z', password: 'MyStr0ngP@ssw0rd') do |archive|
91
+ archive.extract_all('decrypted/')
92
+ end
93
+
94
+ # Decrypt ZIP archive
95
+ Omnizip::Zip::File.open('secure.zip', password: 'SecurePassword123') do |zip|
96
+ zip.extract_all('output/')
97
+ end
98
+ ----
99
+
100
+ === Password via Environment Variable
101
+
102
+ [source,ruby]
103
+ ----
104
+ # Set password in environment
105
+ ENV['OMNIZIP_PASSWORD'] = 'MyStr0ngP@ssw0rd'
106
+
107
+ # Opens without explicit password parameter
108
+ Omnizip::Archive.open('secure.7z') do |archive|
109
+ archive.extract_all('output/')
110
+ end
111
+ ----
112
+
113
+ == Password Management
114
+
115
+ === Password Strength Validation
116
+
117
+ Ensure strong passwords before encryption:
118
+
119
+ [source,ruby]
120
+ ----
121
+ validator = Omnizip::PasswordValidator.new(
122
+ min_length: 12,
123
+ require_uppercase: true,
124
+ require_lowercase: true,
125
+ require_numbers: true,
126
+ require_special: true
127
+ )
128
+
129
+ begin
130
+ validator.validate('weak')
131
+ rescue Omnizip::WeakPasswordError => e
132
+ puts "Password too weak: #{e.message}"
133
+ # Password must be at least 12 characters with uppercase, lowercase, numbers, and special characters
134
+ end
135
+
136
+ # Use validated password
137
+ validator.validate('MyStr0ng!P@ssw0rd2024') # ✅ Passes
138
+ ----
139
+
140
+ === Secure Password Input
141
+
142
+ Prompt for passwords without echo:
143
+
144
+ [source,ruby]
145
+ ----
146
+ require 'io/console'
147
+
148
+ def get_password
149
+ print "Enter password: "
150
+ password = STDIN.noecho(&:gets).chomp
151
+ puts # New line after password entry
152
+ password
153
+ end
154
+
155
+ password = get_password
156
+ Omnizip::Archive.create('secure.7z', password: password) do |archive|
157
+ # Create encrypted archive
158
+ end
159
+ ----
160
+
161
+ == Security Best Practices
162
+
163
+ . **Use Strong Passwords**: Minimum 12 characters with mixed case, numbers, and symbols
164
+ . **Prefer 7z Format**: Header encryption hides filenames and structure
165
+ . **Avoid Traditional Encryption**: Use WinZip AES or 7z AES-256 instead
166
+ . **Secure Password Storage**: Never hardcode passwords in source code
167
+ . **Key Derivation**: Use default iterations (524,288) or higher
168
+ . **Test Decryption**: Always verify encrypted archives can be decrypted
169
+
170
+ == Encryption Comparison
171
+
172
+ [cols="2,1,1,1,1"]
173
+ |===
174
+ |Feature |7z AES-256 |WinZip AES |Traditional |Recommendation
175
+
176
+ |**Security Level**
177
+ |Excellent
178
+ |Very Good
179
+ |Weak
180
+ |Use 7z or WinZip AES
181
+
182
+ |**Header Encryption**
183
+ |✅
184
+ |❌
185
+ |❌
186
+ |7z for privacy
187
+
188
+ |**Key Derivation**
189
+ |PBKDF2-SHA256
190
+ |PBKDF2-SHA1
191
+ |CRC check
192
+ |Modern algorithms
193
+
194
+ |**Authentication**
195
+ |HMAC-SHA-256
196
+ |HMAC-SHA-1
197
+ |None
198
+ |Detects tampering
199
+
200
+ |**Compatibility**
201
+ |7-Zip, PeaZip
202
+ |Most tools
203
+ |Universal
204
+ |Consider audience
205
+ |===
206
+
207
+ == Command-Line Usage
208
+
209
+ [source,bash]
210
+ ----
211
+ # Create encrypted archive
212
+ omnizip archive create secure.7z files/ \
213
+ --password 'MyStr0ngP@ssw0rd' \
214
+ --encrypt-headers
215
+
216
+ # Extract with password
217
+ omnizip archive extract secure.7z output/ \
218
+ --password 'MyStr0ngP@ssw0rd'
219
+
220
+ # Or prompt for password
221
+ omnizip archive create secure.7z files/ --password
222
+ Enter password: ********
223
+ ----
224
+
225
+ == Common Use Cases
226
+
227
+ === Protect Sensitive Documents
228
+
229
+ [source,ruby]
230
+ ----
231
+ # Encrypt sensitive files before cloud storage
232
+ Omnizip::Archive.create(
233
+ 'confidential-docs.7z',
234
+ format: :seven_zip,
235
+ password: secure_password,
236
+ encrypt_headers: true,
237
+ compression: :lzma2,
238
+ level: 9
239
+ ) do |archive|
240
+ archive.add_directory('contracts/')
241
+ archive.add_directory('financial-records/')
242
+ end
243
+
244
+ # Upload to cloud storage
245
+ cloud_storage.upload('confidential-docs.7z')
246
+ ----
247
+
248
+ === Secure Backups
249
+
250
+ [source,ruby]
251
+ ----
252
+ # Create encrypted backup with timestamp
253
+ timestamp = Time.now.strftime('%Y%m%d_%H%M%S')
254
+ backup_file = "backup_#{timestamp}.7z"
255
+
256
+ Omnizip::Archive.create(
257
+ backup_file,
258
+ format: :seven_zip,
259
+ password: ENV['BACKUP_PASSWORD'],
260
+ encrypt_headers: true
261
+ ) do |archive|
262
+ archive.add_directory('/var/www/app/')
263
+ archive.add_directory('/etc/app-config/')
264
+ end
265
+ ----
266
+
267
+ == Troubleshooting
268
+
269
+ === Wrong Password Error
270
+
271
+ [source,ruby]
272
+ ----
273
+ begin
274
+ Omnizip::Archive.open('secure.7z', password: 'wrong') do |archive|
275
+ archive.extract_all('output/')
276
+ end
277
+ rescue Omnizip::DecryptionError => e
278
+ puts "Incorrect password: #{e.message}"
279
+ end
280
+ ----
281
+
282
+ === Unsupported Encryption Method
283
+
284
+ Some older archives may use unsupported encryption:
285
+
286
+ [source,ruby]
287
+ ----
288
+ begin
289
+ Omnizip::Archive.open('old-archive.zip') do |archive|
290
+ # ...
291
+ end
292
+ rescue Omnizip::UnsupportedEncryptionError => e
293
+ puts "Encryption method not supported: #{e.message}"
294
+ puts "Try opening with 7-Zip or WinZip first"
295
+ end
296
+ ----
297
+
298
+ == See Also
299
+
300
+ * link:../../compatibility.html[Compatibility] - Encryption support across formats
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Advanced Features
3
+ nav_order: 30
4
+ parent: Guides
5
+ has_children: true
6
+ ---
7
+
8
+ == Advanced Features Overview
9
+
10
+ Omnizip provides several advanced features for power users and production deployments.
11
+
12
+ == Available Features
13
+
14
+ [cols="1,3"]
15
+ |===
16
+ |Feature |Description
17
+
18
+ |link:streaming.html[Streaming Operations]
19
+ |Process archives without loading entire files into memory
20
+
21
+ |link:parallel-processing.html[Parallel Processing]
22
+ |Leverage multiple CPU cores for faster compression
23
+
24
+ |link:progress-tracking.html[Progress Tracking]
25
+ |Real-time progress monitoring for long operations
26
+
27
+ |link:encryption.html[Encryption]
28
+ |AES-256 password protection for archives
29
+ |===
30
+
31
+ == Feature Combinations
32
+
33
+ These features can be combined for maximum efficiency:
34
+
35
+ [source,ruby]
36
+ ----
37
+ # Combine streaming + parallel + progress
38
+ Omnizip.compress_directory('large_data/', 'backup.7z',
39
+ parallel: true,
40
+ threads: 8
41
+ ) do |progress|
42
+ puts "#{progress.percentage}% - #{progress.throughput_mb_s} MB/s"
43
+ end
44
+ ----
45
+
46
+ == See Also
47
+
48
+ * link:../compression-algorithms/[Compression Algorithms] - Algorithm-specific features
49
+ * link:../performance-tuning.html[Performance Tuning] - Optimize for your workload