Skip to content
Open
Show file tree
Hide file tree
Changes from 18 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
138 changes: 138 additions & 0 deletions spec/beef/core/filter/base_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -307,4 +307,142 @@
end
end
end

describe '.is_valid_ip?' do
it 'returns false for nil, empty, or non-string' do
expect(BeEF::Filters.is_valid_ip?(nil)).to be(false)
expect(BeEF::Filters.is_valid_ip?('')).to be(false)
end

it 'returns true for valid IPv4' do
expect(BeEF::Filters.is_valid_ip?('127.0.0.1')).to be(true)
expect(BeEF::Filters.is_valid_ip?('192.168.1.1')).to be(true)
expect(BeEF::Filters.is_valid_ip?('10.0.0.1')).to be(true)
expect(BeEF::Filters.is_valid_ip?('0.0.0.0')).to be(true)
end

it 'returns false for invalid IPv4' do
expect(BeEF::Filters.is_valid_ip?('256.1.1.1')).to be(false)
expect(BeEF::Filters.is_valid_ip?('1.2.3')).to be(false)
expect(BeEF::Filters.is_valid_ip?('not.an.ip')).to be(false)
end

it 'accepts :ipv4 version' do
expect(BeEF::Filters.is_valid_ip?('127.0.0.1', :ipv4)).to be(true)
expect(BeEF::Filters.is_valid_ip?('256.1.1.1', :ipv4)).to be(false)
end

it 'accepts :both version (default)' do
expect(BeEF::Filters.is_valid_ip?('127.0.0.1')).to be(true)
end
end

describe '.is_valid_private_ip?' do
it 'returns false when ip is not valid' do
expect(BeEF::Filters.is_valid_private_ip?(nil)).to be(false)
expect(BeEF::Filters.is_valid_private_ip?('8.8.8.8')).to be(false)
end

it 'returns true for 127.x (localhost)' do
expect(BeEF::Filters.is_valid_private_ip?('127.0.0.1')).to be(true)
end

it 'returns true for 192.168.x' do
expect(BeEF::Filters.is_valid_private_ip?('192.168.1.1')).to be(true)
end

it 'returns true for 10.x' do
expect(BeEF::Filters.is_valid_private_ip?('10.0.0.1')).to be(true)
end

it 'returns false for public IPv4' do
expect(BeEF::Filters.is_valid_private_ip?('8.8.8.8')).to be(false)
end
end

describe '.is_valid_port?' do
it 'returns true for valid port range' do
expect(BeEF::Filters.is_valid_port?(1)).to be(true)
expect(BeEF::Filters.is_valid_port?('80')).to be(true)
expect(BeEF::Filters.is_valid_port?(65535)).to be(true)
end

it 'returns false for 0 or negative' do
expect(BeEF::Filters.is_valid_port?(0)).to be(false)
expect(BeEF::Filters.is_valid_port?('0')).to be(false)
end

it 'returns false for port above 65535' do
expect(BeEF::Filters.is_valid_port?(65536)).to be(false)
end
end

describe '.is_valid_domain?' do
it 'returns false for nil or empty' do
expect(BeEF::Filters.is_valid_domain?(nil)).to be(false)
expect(BeEF::Filters.is_valid_domain?('')).to be(false)
end

it 'returns true for valid domain format' do
expect(BeEF::Filters.is_valid_domain?('example.com')).to be(true)
expect(BeEF::Filters.is_valid_domain?('sub.example.co.uk')).to be(true)
end

it 'returns false for invalid domain format' do
expect(BeEF::Filters.is_valid_domain?('no-tld')).to be(false)
expect(BeEF::Filters.is_valid_domain?('.leading')).to be(false)
end
end

describe '.has_valid_browser_details_chars?' do
it 'returns false for nil or empty' do
expect(BeEF::Filters.has_valid_browser_details_chars?(nil)).to be(false)
expect(BeEF::Filters.has_valid_browser_details_chars?('')).to be(false)
end

it 'returns false when string only has allowed chars' do
# Method returns true when regex matches (invalid char found); false when only valid chars
expect(BeEF::Filters.has_valid_browser_details_chars?('abc')).to be(false)
expect(BeEF::Filters.has_valid_browser_details_chars?('a-b (c)')).to be(false)
end

it 'returns true when string contains disallowed character' do
expect(BeEF::Filters.has_valid_browser_details_chars?('ab@c')).to be(true)
end
end

describe '.has_valid_base_chars?' do
it 'returns false for nil or empty' do
expect(BeEF::Filters.has_valid_base_chars?(nil)).to be(false)
expect(BeEF::Filters.has_valid_base_chars?('')).to be(false)
end

it 'returns true when string only has printable (and registered symbol)' do
expect(BeEF::Filters.has_valid_base_chars?('abc')).to be(true)
expect(BeEF::Filters.has_valid_base_chars?('Hello 123')).to be(true)
end

it 'returns false when string has non-printable character' do
expect(BeEF::Filters.has_valid_base_chars?("ab\x00c")).to be(false)
end
end

describe '.is_valid_yes_no?' do
it 'returns true for Yes and No (case insensitive)' do
expect(BeEF::Filters.is_valid_yes_no?('Yes')).to be(true)
expect(BeEF::Filters.is_valid_yes_no?('No')).to be(true)
expect(BeEF::Filters.is_valid_yes_no?('yes')).to be(true)
expect(BeEF::Filters.is_valid_yes_no?('no')).to be(true)
end

it 'returns false for other values' do
expect(BeEF::Filters.is_valid_yes_no?('')).to be(false)
expect(BeEF::Filters.is_valid_yes_no?('maybe')).to be(false)
expect(BeEF::Filters.is_valid_yes_no?('1')).to be(false)
end

it 'returns false when string has non-printable character' do
expect(BeEF::Filters.is_valid_yes_no?("Yes\x00")).to be(false)
end
end
end
15 changes: 13 additions & 2 deletions spec/beef/core/filter/command_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
expect(BeEF::Filters.is_valid_path_info?("\x00")).to be(false)
expect(BeEF::Filters.is_valid_path_info?(nil)).to be(false)
end

it 'returns false when argument is not a String' do
expect(BeEF::Filters.is_valid_path_info?(123)).to be(false)
end
end

describe '.is_valid_hook_session_id?' do
Expand Down Expand Up @@ -43,15 +47,22 @@
end

describe '.has_valid_param_chars?' do
it 'false' do
it 'returns false for nil, empty, or invalid chars' do
chars = [nil, '', '+']
chars.each do |c|
expect(BeEF::Filters.has_valid_param_chars?(c)).to be(false)
end
end

it 'true' do
it 'returns true for word, underscore, and colon' do
expect(BeEF::Filters.has_valid_param_chars?('A')).to be(true)
expect(BeEF::Filters.has_valid_param_chars?('key_name')).to be(true)
expect(BeEF::Filters.has_valid_param_chars?('a:1')).to be(true)
end

it 'returns false for string with spaces or special chars' do
expect(BeEF::Filters.has_valid_param_chars?('a b')).to be(false)
expect(BeEF::Filters.has_valid_param_chars?('a-b')).to be(false)
end
end
end
41 changes: 41 additions & 0 deletions spec/beef/core/hbmanager_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#
# Copyright (c) 2006-2026 Wade Alcorn - wade@bindshell.net
# Browser Exploitation Framework (BeEF) - https://beefproject.com
# See the file 'doc/COPYING' for copying permission
#

require 'spec_helper'

RSpec.describe BeEF::HBManager do
describe '.get_by_session' do
it 'returns the hooked browser when session exists' do
hb = BeEF::Core::Models::HookedBrowser.create!(session: 'hb_session_123', ip: '127.0.0.1')

result = described_class.get_by_session('hb_session_123')

expect(result).to eq(hb)
expect(result.session).to eq('hb_session_123')
end

it 'returns nil when no hooked browser has the session' do
result = described_class.get_by_session('nonexistent_session')

expect(result).to be_nil
end
end

describe '.get_by_id' do
it 'returns the hooked browser when id exists' do
hb = BeEF::Core::Models::HookedBrowser.create!(session: 'hb_by_id', ip: '127.0.0.1')

result = described_class.get_by_id(hb.id)

expect(result).to eq(hb)
expect(result.id).to eq(hb.id)
end

it 'raises when id does not exist' do
expect { described_class.get_by_id(999_999) }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end
Loading
Loading