66 lines
3.3 KiB
Python
66 lines
3.3 KiB
Python
import unittest
|
|
|
|
from rpcscope.models import HostEvidence, RpcInterface, Share
|
|
|
|
|
|
class ModelTests(unittest.TestCase):
|
|
def test_share_merge_retains_richer_permissions_and_deduplicates(self):
|
|
host = HostEvidence("10.10.10.25", shares=[Share("Data", ["READ"])])
|
|
other = HostEvidence("10.10.10.25", shares=[Share("data", ["WRITE"]),
|
|
Share("Public", ["READ"]),
|
|
Share("PUBLIC", ["WRITE"])])
|
|
host.merge(other)
|
|
self.assertEqual(len(host.shares), 2)
|
|
self.assertEqual(host.shares[0].access, ["READ", "WRITE"])
|
|
self.assertEqual(host.shares[1].access, ["READ", "WRITE"])
|
|
self.assertEqual(other.shares[0].access, ["WRITE"])
|
|
|
|
def test_rpc_merge_retains_bindings_and_metadata(self):
|
|
host = HostEvidence("10.10.10.25", rpc_interfaces=[
|
|
RpcInterface("12345678-1234-ABCD-EF00-0123456789AB", "1.0",
|
|
endpoint="ncalrpc:[spooler]")
|
|
])
|
|
other = HostEvidence("10.10.10.25", rpc_interfaces=[
|
|
RpcInterface("12345678-1234-abcd-ef00-0123456789ab", "1.0",
|
|
endpoint="ncacn_ip_tcp:10.10.10.25[49665]", provider="spoolsv.exe"),
|
|
RpcInterface("12345678-1234-abcd-ef00-0123456789ab", "1.0",
|
|
endpoint="ncacn_ip_tcp:10.10.10.25[49665]"),
|
|
])
|
|
host.merge(other)
|
|
self.assertEqual(len(host.rpc_interfaces), 1)
|
|
self.assertEqual(len(host.rpc_interfaces[0].bindings), 2)
|
|
self.assertEqual(host.rpc_interfaces[0].provider, "spoolsv.exe")
|
|
|
|
def test_conflicting_boolean_stays_unknown_across_later_merges(self):
|
|
host = HostEvidence("10.10.10.25", signing=False)
|
|
host.merge(HostEvidence("10.10.10.25", signing=True))
|
|
host.merge(HostEvidence("10.10.10.25", signing=False))
|
|
self.assertIsNone(host.signing)
|
|
self.assertEqual(len(host.notes), 1)
|
|
copied = HostEvidence("10.10.10.25", signing=True)
|
|
copied.merge(host)
|
|
self.assertIsNone(copied.signing)
|
|
|
|
def test_confirmed_positive_survives_weaker_results(self):
|
|
host = HostEvidence("10.10.10.25", checks={"ms17-010": "vulnerable"},
|
|
check_details={"ms17-010": "positive evidence"})
|
|
host.merge(HostEvidence("10.10.10.25", checks={"ms17-010": "inconclusive"},
|
|
check_details={"ms17-010": "timeout"}))
|
|
self.assertEqual(host.checks["ms17-010"], "vulnerable")
|
|
self.assertEqual(host.check_details["ms17-010"], "positive evidence")
|
|
host.merge(HostEvidence("10.10.10.25", checks={"ms17-010": "not-vulnerable"}))
|
|
self.assertEqual(host.checks["ms17-010"], "vulnerable")
|
|
self.assertIn("Conflicting", host.notes[0])
|
|
|
|
def test_suspected_survives_negative_and_collection_updates(self):
|
|
host = HostEvidence("10.10.10.25", checks={"check": "suspected"},
|
|
collection={"rpcdump": "pending"})
|
|
host.merge(HostEvidence("10.10.10.25", checks={"check": "not-vulnerable"},
|
|
collection={"rpcdump": "success"}))
|
|
self.assertEqual(host.checks["check"], "suspected")
|
|
self.assertEqual(host.collection["rpcdump"], "success")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|