Skip to content

Commit 5f7a3e8

Browse files
committed
Added Network::Defang.defang (closes #547).
1 parent c25c9ba commit 5f7a3e8

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

lib/ronin/support/network/defang.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
# along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
1717
#
1818

19+
require_relative 'url'
20+
require_relative 'ip'
21+
1922
module Ronin
2023
module Support
2124
module Network
@@ -159,6 +162,31 @@ def self.refang_url(url)
159162
end
160163
end
161164

165+
#
166+
# Defangs a URL, IP address, or host name.
167+
#
168+
# @param [String] string
169+
# The URL, IP address, or host name.
170+
#
171+
# @return [String]
172+
# The defanged URL, IP address, or host name.
173+
#
174+
# @example
175+
# Defang.defang("https://www.example.com:8080/foo?q=1")
176+
# # => "hxxps[://]www[.]example[.]com[:]8080/foo?q=1"
177+
# Defang.defang("192.168.1.1")
178+
# # => "192[.]168[.]1[.]1"
179+
# Defang.defang("www.example.com")
180+
# # => "www[.]example[.]com"
181+
#
182+
def self.defang(string)
183+
case string
184+
when IP::REGEX then defang_ip(string)
185+
when URL::REGEX then defang_url(string)
186+
else defang_host(string)
187+
end
188+
end
189+
162190
#
163191
# Refangs a defanged URL, IP address, or host name.
164192
#

spec/network/defang_spec.rb

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,44 @@
190190
end
191191
end
192192

193+
describe ".defang" do
194+
context "when given a defanged URL" do
195+
let(:url) { 'http://www.example.com/foo?q=1' }
196+
let(:defanged) { 'hxxp[://]www[.]example[.]com/foo?q=1' }
197+
198+
it "must return the defanged URL" do
199+
expect(subject.defang(url)).to eq(defanged)
200+
end
201+
end
202+
203+
context "when given a defanged IPv4 address" do
204+
let(:ip) { '192.168.1.1' }
205+
let(:defanged) { '192[.]168[.]1[.]1' }
206+
207+
it "must return the defanged IPv4 address" do
208+
expect(subject.defang(ip)).to eq(defanged)
209+
end
210+
end
211+
212+
context "when given a defanged IPv6 address" do
213+
let(:ip) { '2606:2800:21f:cb07:6820:80da:af6b:8b2c' }
214+
let(:defanged) { '2606[:]2800[:]21f[:]cb07[:]6820[:]80da[:]af6b[:]8b2c' }
215+
216+
it "must return the defanged IPv6 address" do
217+
expect(subject.defang(ip)).to eq(defanged)
218+
end
219+
end
220+
221+
context "when given a defanged host name" do
222+
let(:host) { 'www.example.com' }
223+
let(:defanged) { 'www[.]example[.]com' }
224+
225+
it "must return the defanged host name" do
226+
expect(subject.defang(host)).to eq(defanged)
227+
end
228+
end
229+
end
230+
193231
describe ".refang" do
194232
context "when given a defanged URL" do
195233
let(:defanged) { 'hxxp[://]www[.]example[.]com/foo?q=1' }

0 commit comments

Comments
 (0)