Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ronin compress command #184

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions lib/ronin/cli/commands/compress.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# frozen_string_literal: true
#
# Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
#
# Ronin is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ronin is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ronin. If not, see <https://www.gnu.org/licenses/>.
#

require 'ronin/cli/string_methods_command'
require 'ronin/support/compression'
require 'ronin/support/archive'

module Ronin
class CLI
module Commands
#
# Compress the files.
#
# ## Usage
#
# ronin compress [option] [FILE ...]
#
# ## Options
#
# -f, --file FILE Optional file to process
# --string STRING Optional string to process
# --format gzip|zlib Compression format
#
# ## Arguments
#
# [FILE ...] Optional file(s) to compress
#
class Compress < StringMethodsCommand
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we only want to support processing files, then probably want to inherit from FileProcessorCommand, and define a process_input(io) method to compress the input File or from stdin.

If we do want to support accepting arbitrary Strings (ex: ronin compress --string "hello world"), then we should inherit from StringProcessorCommand.

StringMethodsCommand is more meant to be used by commands which simply map options to certain monkey-patch methods that are added to String (ex: ronin decode --base64 -> String#base64_decode).

usage '[options] [FILE ...]'

option :format, value: {
type: [:gzip, :zlib_deflate]
},
desc: 'Compression format'

description 'Compress the data'

man_page 'ronin-compress.1'

#
# Size of file read at one time.
#
CHUNK_SIZE = 4096

#
# Reads and processes file.
#
# @param [String] path
# The path to the file.
#
def process_file(file)
case format
when :gzip
Ronin::Support::Compression.gzip("#{file}.gz") do |gzip|
File.open(file, 'rb') do |f|
gzip.write(f.readpartial(CHUNK_SIZE)) until f.eof?
end
end
when :zlib_deflate
content = File.read(file)
compressed_content = Ronin::Support::Compression.zlib_deflate(content)
File.binwrite("#{file}.zlib", compressed_content)
end
end

#
# Compress the string.
#
# @param [String] string
# The input string.
#
# @return [String]
# The compressed string.
#
def process_string(string)
case format
when :gzip
buffer = StringIO.new(encoding: Encoding::ASCII_8BIT)

Ronin::Support::Compression::Gzip::Writer.wrap(buffer) do |gz|
gz.write(string)
end

buffer.string
when :zlib_deflate
Ronin::Support::Compression.zlib_deflate(string)
end
end
postmodern marked this conversation as resolved.
Show resolved Hide resolved

#
# Returns format option
#
# @api private
#
def format
options.fetch(:format) do
print_error "must specify the --format option"
exit(1)
end
end
end
end
end
end