Changed GET handlers to return recently fixed rule data.

Also wrapped all handlers in a begin/end block that catches
internal StandardError exceptions.
This commit is contained in:
soh_cah_toa
2013-06-05 15:56:33 -04:00
parent fce4c9196d
commit 2f5133e11a
3 changed files with 45 additions and 8 deletions

View File

@@ -93,7 +93,7 @@ module Dns
# * <code>:id</code> # * <code>:id</code>
# * <code>:pattern</code> # * <code>:pattern</code>
# * <code>:type</code> # * <code>:type</code>
# * <code>:block</code> # * <code>:response</code>
# #
# @return [Array<Hash>] DNS ruleset (empty if no rules are currently loaded) # @return [Array<Hash>] DNS ruleset (empty if no rules are currently loaded)
def get_ruleset def get_ruleset

View File

@@ -26,9 +26,14 @@ module Dns
# Returns the entire current DNS ruleset # Returns the entire current DNS ruleset
get '/rules' do get '/rules' do
result = {} begin
result[:rules] = BeEF::Extension::Dns::Server.instance.get_ruleset result = {}
result.to_json result[:rules] = BeEF::Extension::Dns::Server.instance.get_ruleset
result.to_json
rescue StandardError => e
print_error "Internal error while retrieving DNS ruleset (#{e.message})"
halt 500
end
end end
# Returns a specific rule given its id # Returns a specific rule given its id
@@ -45,6 +50,9 @@ module Dns
rescue InvalidJsonError => e rescue InvalidJsonError => e
print_error e.message print_error e.message
halt 400 halt 400
rescue StandardError => e
print_error "Internal error while retrieving DNS rule with id #{id} (#{e.message})"
halt 500
end end
end end
@@ -118,6 +126,9 @@ module Dns
rescue InvalidJsonError => e rescue InvalidJsonError => e
print_error e.message print_error e.message
halt 400 halt 400
rescue StandardError => e
print_error "Internal error while removing DNS rule with id #{id} (#{e.message})"
halt 500
end end
end end

View File

@@ -140,8 +140,8 @@ module RubyDNS
element[:id] = rule.id element[:id] = rule.id
element[:pattern] = rule.pattern element[:pattern] = rule.pattern
element[:type] = rule.type element[:type] = rule.type.to_s.split('::')[-1]
element[:block] = rule.block element[:response] = parse_response(rule.block)
result << element result << element
end end
@@ -158,8 +158,8 @@ module RubyDNS
result[:id] = rule.id result[:id] = rule.id
result[:pattern] = rule.pattern result[:pattern] = rule.pattern
result[:type] = rule.type result[:type] = rule.type.to_s.split('::')[-1]
result[:block] = rule.block result[:response] = parse_response(rule.block)
rescue DataMapper::ObjectNotFoundError => e rescue DataMapper::ObjectNotFoundError => e
@logger.error(e.message) @logger.error(e.message)
end end
@@ -183,6 +183,32 @@ module RubyDNS
id id
end end
# New method that parses response callback and returns RDATA as an array
def parse_response(block)
# Extract response arguments into an array
args = /(?<=respond!\().*(?=\))/.match(block).to_s.split(/,\s*/)
result = []
# Determine whether each argument is a domain name, integer, or IP address
args.each do |elem|
arg = nil
if /Name\.create\((.*)\)/.match(elem)
arg = $1
else
int_test = elem.to_i
arg = (int_test != 0 ? int_test : elem)
end
arg.gsub!('"', '') unless arg.is_a?(Integer)
result << arg
end
result
end
end end
class Transaction class Transaction