Skip to content

Commit 9833af3

Browse files
committed
Added CLI::Text#example_payload_command.
1 parent 1ad60f4 commit 9833af3

File tree

4 files changed

+187
-27
lines changed

4 files changed

+187
-27
lines changed

lib/ronin/payloads/cli/commands/show.rb

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -125,36 +125,21 @@ def print_payload(payload)
125125
def print_payload_usage(payload)
126126
puts "Usage:"
127127
puts
128-
puts " $ #{example_build_command(payload)}"
128+
puts " $ #{example_payload_command(payload)}"
129129
puts
130130
end
131131

132132
#
133133
# Builds an example `ronin-payloads build` command for the payload.
134134
#
135-
# @param [Class<Payload>] payload
135+
# @param [Class<Payload>] payload_class
136+
# The payload class.
136137
#
137138
# @return [String]
138139
# The example `ronin-payloads build` command.
139140
#
140-
# @since 0.2.0
141-
#
142-
def example_build_command(payload)
143-
command = ['ronin-payloads', 'build']
144-
145-
if options[:file]
146-
command << '-f' << options[:file]
147-
else
148-
command << payload.id
149-
end
150-
151-
payload.params.each_value do |param|
152-
if param.required? && !param.default
153-
command << '-p' << "#{param.name}=#{param_usage(param)}"
154-
end
155-
end
156-
157-
return command.join(' ')
141+
def example_payload_command(payload_class)
142+
super(payload_class, file: options[:file])
158143
end
159144

160145
end

lib/ronin/payloads/cli/text.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
# along with ronin-payloads. If not, see <https://www.gnu.org/licenses/>.
2020
#
2121

22+
require 'ronin/core/cli/text/params'
23+
2224
module Ronin
2325
module Payloads
2426
class CLI
@@ -28,6 +30,8 @@ class CLI
2830
# @since 0.3.0
2931
#
3032
module Text
33+
include Core::CLI::Text::Params
34+
3135
# Known payload types and their display names.
3236
PAYLOAD_TYPE_NAMES = {
3337
payload: 'Custom',
@@ -77,6 +81,36 @@ module Text
7781
def payload_type_name(payload_class)
7882
PAYLOAD_TYPE_NAMES.fetch(payload_class.payload_type,'Unknown')
7983
end
84+
85+
#
86+
# Builds an example `ronin-payloads build` command for the payload.
87+
#
88+
# @param [Class<Payload>] payload_class
89+
# The payload class.
90+
#
91+
# @param [String, nil] file
92+
# The optional file that the payload was loaded from.
93+
#
94+
# @return [String]
95+
# The example `ronin-payloads build` command.
96+
#
97+
def example_payload_command(payload_class, file: nil)
98+
command = ['ronin-payloads', 'build']
99+
100+
if file
101+
command << '-f' << file
102+
else
103+
command << payload_class.id
104+
end
105+
106+
payload_class.params.each_value do |param|
107+
if param.required? && !param.default
108+
command << '-p' << "#{param.name}=#{param_usage(param)}"
109+
end
110+
end
111+
112+
return command.join(' ')
113+
end
80114
end
81115
end
82116
end

spec/cli/commands/show_spec.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class ExamplePayload < Ronin::Payloads::Payload
5151
end
5252
end
5353

54-
describe "#example_build_command" do
54+
describe "#example_payload_command" do
5555
context "when given a payload class with no params" do
5656
module TestShowCommand
5757
class PayloadWithNoParams < Ronin::Payloads::Payload
@@ -64,7 +64,7 @@ class PayloadWithNoParams < Ronin::Payloads::Payload
6464
let(:payload_class) { TestShowCommand::PayloadWithNoParams }
6565

6666
it "must return 'ronin-payloads build ...' with the payload class ID" do
67-
expect(subject.example_build_command(payload_class)).to eq(
67+
expect(subject.example_payload_command(payload_class)).to eq(
6868
"ronin-payloads build #{payload_class.id}"
6969
)
7070
end
@@ -86,7 +86,7 @@ class PayloadWithOptionalParams < Ronin::Payloads::Payload
8686
let(:payload_class) { TestShowCommand::PayloadWithOptionalParams }
8787

8888
it "must not add any '-p' flags to the 'ronin-payloads build' command" do
89-
expect(subject.example_build_command(payload_class)).to eq(
89+
expect(subject.example_payload_command(payload_class)).to eq(
9090
"ronin-payloads build #{payload_class.id}"
9191
)
9292
end
@@ -110,7 +110,7 @@ class PayloadWithDefaultParams < Ronin::Payloads::Payload
110110
let(:payload_class) { TestShowCommand::PayloadWithDefaultParams }
111111

112112
it "must not add any '-p' flags to the 'ronin-payloads build' command" do
113-
expect(subject.example_build_command(payload_class)).to eq(
113+
expect(subject.example_payload_command(payload_class)).to eq(
114114
"ronin-payloads build #{payload_class.id}"
115115
)
116116
end
@@ -137,7 +137,7 @@ class PayloadWithRequiredAndDefaultParams < Ronin::Payloads::Payload
137137
let(:payload_class) { TestShowCommand::PayloadWithRequiredAndDefaultParams }
138138

139139
it "must not add any '-p' flags to the 'ronin-payloads build' command" do
140-
expect(subject.example_build_command(payload_class)).to eq(
140+
expect(subject.example_payload_command(payload_class)).to eq(
141141
"ronin-payloads build #{payload_class.id}"
142142
)
143143
end
@@ -159,7 +159,7 @@ class PayloadWithRequiredParams < Ronin::Payloads::Payload
159159
let(:payload_class) { TestShowCommand::PayloadWithRequiredParams }
160160

161161
it "must add '-p' flags followed by the param name and usage to the 'ronin-payloads build' command" do
162-
expect(subject.example_build_command(payload_class)).to eq(
162+
expect(subject.example_payload_command(payload_class)).to eq(
163163
"ronin-payloads build #{payload_class.id} -p foo=FOO -p bar=NUM"
164164
)
165165
end
@@ -173,7 +173,7 @@ class PayloadWithRequiredParams < Ronin::Payloads::Payload
173173
before { subject.options[:file] = payload_file }
174174

175175
it "must return a 'ronin-payloads build --file ...' command with the payload file" do
176-
expect(subject.example_build_command(payload_class)).to eq(
176+
expect(subject.example_payload_command(payload_class)).to eq(
177177
"ronin-payloads build -f #{payload_file} -p foo=FOO -p bar=NUM"
178178
)
179179
end

spec/cli/text_spec.rb

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,145 @@ class TestCommand < Ronin::Payloads::CLI::Command
7070
end
7171
end
7272
end
73+
74+
module TestCLIText
75+
class ExamplePayload < Ronin::Payloads::Payload
76+
77+
id 'exaple_payload'
78+
79+
param :foo, String, required: true, desc: 'Foo param'
80+
param :bar, Integer, required: true, desc: 'Bar param'
81+
param :baz, Integer, desc: 'Baz param'
82+
83+
end
84+
end
85+
86+
let(:payload_class) { TestCLIText::ExamplePayload }
87+
88+
describe "#example_payload_command" do
89+
context "when given a payload class with no params" do
90+
module TestShowCommand
91+
class PayloadWithNoParams < Ronin::Payloads::Payload
92+
93+
id 'payload_with_no_params'
94+
95+
end
96+
end
97+
98+
let(:payload_class) { TestShowCommand::PayloadWithNoParams }
99+
100+
it "must return 'ronin-payloads build ...' with the payload class ID" do
101+
expect(subject.example_payload_command(payload_class)).to eq(
102+
"ronin-payloads build #{payload_class.id}"
103+
)
104+
end
105+
end
106+
107+
context "but the payload class does have params" do
108+
context "and none of them are required" do
109+
module TestShowCommand
110+
class PayloadWithOptionalParams < Ronin::Payloads::Payload
111+
112+
id 'payload_with_optional_params'
113+
114+
param :foo, String, desc: 'Foo param'
115+
param :bar, Integer, desc: 'Bar param'
116+
117+
end
118+
end
119+
120+
let(:payload_class) { TestShowCommand::PayloadWithOptionalParams }
121+
122+
it "must not add any '-p' flags to the 'ronin-payloads build' command" do
123+
expect(subject.example_payload_command(payload_class)).to eq(
124+
"ronin-payloads build #{payload_class.id}"
125+
)
126+
end
127+
end
128+
129+
context "and they all have default values" do
130+
module TestShowCommand
131+
class PayloadWithDefaultParams < Ronin::Payloads::Payload
132+
133+
id 'payload_with_default_params'
134+
135+
param :foo, String, default: 'foo',
136+
desc: 'Foo param'
137+
138+
param :bar, Integer, default: 42,
139+
desc: 'Bar param'
140+
141+
end
142+
end
143+
144+
let(:payload_class) { TestShowCommand::PayloadWithDefaultParams }
145+
146+
it "must not add any '-p' flags to the 'ronin-payloads build' command" do
147+
expect(subject.example_payload_command(payload_class)).to eq(
148+
"ronin-payloads build #{payload_class.id}"
149+
)
150+
end
151+
end
152+
153+
context "and some are required" do
154+
context "but they also have default values" do
155+
module TestShowCommand
156+
class PayloadWithRequiredAndDefaultParams < Ronin::Payloads::Payload
157+
158+
id 'payload_with_required_and_default_params'
159+
160+
param :foo, String, required: true,
161+
default: 'foo',
162+
desc: 'Foo param'
163+
164+
param :bar, Integer, required: true,
165+
default: 42,
166+
desc: 'Bar param'
167+
168+
end
169+
end
170+
171+
let(:payload_class) { TestShowCommand::PayloadWithRequiredAndDefaultParams }
172+
173+
it "must not add any '-p' flags to the 'ronin-payloads build' command" do
174+
expect(subject.example_payload_command(payload_class)).to eq(
175+
"ronin-payloads build #{payload_class.id}"
176+
)
177+
end
178+
end
179+
180+
context "but some are required and have no default values" do
181+
module TestShowCommand
182+
class PayloadWithRequiredParams < Ronin::Payloads::Payload
183+
184+
id 'payload_with_required_params'
185+
186+
param :foo, String, required: true, desc: 'Foo param'
187+
param :bar, Integer, required: true, desc: 'Bar param'
188+
param :baz, Integer, desc: 'Baz param'
189+
190+
end
191+
end
192+
193+
let(:payload_class) { TestShowCommand::PayloadWithRequiredParams }
194+
195+
it "must add '-p' flags followed by the param name and usage to the 'ronin-payloads build' command" do
196+
expect(subject.example_payload_command(payload_class)).to eq(
197+
"ronin-payloads build #{payload_class.id} -p foo=FOO -p bar=NUM"
198+
)
199+
end
200+
end
201+
end
202+
end
203+
204+
context "when given the file: keyword argument" do
205+
let(:file) { 'path/to/payload.rb' }
206+
207+
it "must return a 'ronin-payloads build --file ...' command with the payload file" do
208+
expect(subject.example_payload_command(payload_class, file: file)).to eq(
209+
"ronin-payloads build -f #{file} -p foo=FOO -p bar=NUM"
210+
)
211+
end
212+
end
213+
end
73214
end

0 commit comments

Comments
 (0)