Skip to content

Commit d0585e0

Browse files
committed
Added unit tests
1 parent 8ce3280 commit d0585e0

File tree

2 files changed

+116
-1
lines changed

2 files changed

+116
-1
lines changed

lib/rex/proto/dns/cached_resolver.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class CachedResolver < Resolver
2121
#
2222
# @return [nil]
2323
def initialize(config = {})
24+
dns_cache_no_start = config.delete(:dns_cache_no_start)
2425
super(config)
2526
self.cache = Rex::Proto::DNS::Cache.new
2627
# Read hostsfile into cache
@@ -72,7 +73,7 @@ def initialize(config = {})
7273
end
7374
end
7475
# TODO: inotify or similar on hostsfile for live updates? Easy-button functionality
75-
self.cache.start unless config[:dns_cache_no_start]
76+
self.cache.start unless dns_cache_no_start
7677
return
7778
end
7879

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# -*- coding:binary -*-
2+
require 'spec_helper'
3+
require 'net/dns'
4+
5+
6+
RSpec.describe Rex::Proto::DNS::CustomNameserverProvider do
7+
def packet_for(name)
8+
packet = Net::DNS::Packet.new(name, Net::DNS::A, Net::DNS::IN)
9+
Rex::Proto::DNS::Packet.encode_drb(packet)
10+
end
11+
12+
let(:base_nameserver) do
13+
'1.2.3.4'
14+
end
15+
16+
let(:ruleless_nameserver) do
17+
'1.2.3.5'
18+
end
19+
20+
let(:ruled_nameserver) do
21+
'1.2.3.6'
22+
end
23+
24+
let(:ruled_nameserver2) do
25+
'1.2.3.7'
26+
end
27+
28+
let(:ruled_nameserver3) do
29+
'1.2.3.8'
30+
end
31+
32+
let (:config) do
33+
{:dns_cache_no_start => true}
34+
end
35+
36+
subject(:many_ruled_provider) do
37+
dns_resolver = Rex::Proto::DNS::CachedResolver.new(config)
38+
dns_resolver.extend(Rex::Proto::DNS::CustomNameserverProvider)
39+
dns_resolver.nameservers = [base_nameserver]
40+
dns_resolver.add_nameserver([], ruleless_nameserver, nil)
41+
dns_resolver.add_nameserver(['*.metasploit.com'], ruled_nameserver, nil)
42+
dns_resolver.add_nameserver(['*.metasploit.com'], ruled_nameserver2, nil)
43+
dns_resolver.add_nameserver(['*.notmetasploit.com'], ruled_nameserver3, nil)
44+
45+
dns_resolver
46+
end
47+
48+
subject(:ruled_provider) do
49+
dns_resolver = Rex::Proto::DNS::CachedResolver.new(config)
50+
dns_resolver.extend(Rex::Proto::DNS::CustomNameserverProvider)
51+
dns_resolver.nameservers = [base_nameserver]
52+
dns_resolver.add_nameserver([], ruleless_nameserver, nil)
53+
dns_resolver.add_nameserver(['*.metasploit.com'], ruled_nameserver, nil)
54+
55+
dns_resolver
56+
end
57+
58+
subject(:ruleless_provider) do
59+
dns_resolver = Rex::Proto::DNS::CachedResolver.new(config)
60+
dns_resolver.extend(Rex::Proto::DNS::CustomNameserverProvider)
61+
dns_resolver.nameservers = [base_nameserver]
62+
dns_resolver.add_nameserver([], ruleless_nameserver, nil)
63+
64+
dns_resolver
65+
end
66+
67+
subject(:empty_provider) do
68+
dns_resolver = Rex::Proto::DNS::CachedResolver.new(config)
69+
dns_resolver.extend(Rex::Proto::DNS::CustomNameserverProvider)
70+
dns_resolver.nameservers = [base_nameserver]
71+
72+
dns_resolver
73+
end
74+
75+
context 'When no nameserver is configured' do
76+
it 'The resolver base is returned' do
77+
packet = packet_for('subdomain.metasploit.com')
78+
ns = empty_provider.nameservers_for_packet(packet)
79+
expect(ns).to eq([[base_nameserver, {}]])
80+
end
81+
end
82+
83+
context 'When a base nameserver is configured' do
84+
it 'The base nameserver is returned' do
85+
packet = packet_for('subdomain.metasploit.com')
86+
ns = ruleless_provider.nameservers_for_packet(packet)
87+
expect(ns).to eq([[ruleless_nameserver, {}]])
88+
end
89+
end
90+
91+
context 'When a nameserver rule is configured and a rule entry matches' do
92+
it 'The correct nameserver is returned' do
93+
packet = packet_for('subdomain.metasploit.com')
94+
ns = ruled_provider.nameservers_for_packet(packet)
95+
expect(ns).to eq([[ruled_nameserver, {}]])
96+
end
97+
end
98+
99+
context 'When a nameserver rule is configured and no rule entry is applicable' do
100+
it 'The base nameserver is returned when no rule entry' do
101+
packet = packet_for('subdomain.notmetasploit.com')
102+
ns = ruled_provider.nameservers_for_packet(packet)
103+
expect(ns).to eq([[ruleless_nameserver, {}]])
104+
end
105+
end
106+
107+
context 'When many rules are configured' do
108+
it 'Returns multiple entries if multiple rules match' do
109+
packet = packet_for('subdomain.metasploit.com')
110+
ns = many_ruled_provider.nameservers_for_packet(packet)
111+
expect(ns).to eq([[ruled_nameserver, {}], [ruled_nameserver2, {}]])
112+
end
113+
end
114+
end

0 commit comments

Comments
 (0)