else:
# If matcher is an IdRuleMatcher
if isinstance(matcher, matchers_mod.IdRuleMatcher):
- for (gid, sid) in matcher.signatureIds:
- id_set_matcher.add(gid, sid)
+ for sig in matcher.signatureIds:
+ if len(sig) == 2:
+ # The "set" matcher only supports gid:sid.
+ id_set_matcher.add(sig[0], sig[1])
+ elif len(sig) == 3:
+ # This must also have a rev, don't add to set,
+ # but add as its own IdSetRuleMatcher.
+ matchers.append(
+ matchers_mod.IdRuleMatcher(sig[0], sig[1], sig[2]))
else:
matchers.append(matcher)
"""Matcher object to match an idstools rule object by its signature
ID."""
- def __init__(self, generatorId=None, signatureId=None):
+ def __init__(self, generatorId=None, signatureId=None, rev=None):
self.signatureIds = []
- if generatorId and signatureId:
+ if generatorId and signatureId and rev:
+ self.signatureIds.append((generatorId, signatureId, rev))
+ elif generatorId and signatureId:
self.signatureIds.append((generatorId, signatureId))
def match(self, rule):
- for (generatorId, signatureId) in self.signatureIds:
- if generatorId == rule.gid and signatureId == rule.sid:
- return True
+ for sig in self.signatureIds:
+ if len(sig) == 3:
+ if sig[0] == rule.gid and sig[1] == rule.sid and sig[2] == rule.rev:
+ return True
+ elif len(sig) == 2:
+ if sig[0] == rule.gid and sig[1] == rule.sid:
+ return True
return False
@classmethod
for entry in buf.split(","):
entry = entry.strip()
- parts = entry.split(":", 1)
+ parts = entry.split(":")
if not parts:
return None
if len(parts) == 1:
matcher.signatureIds.append((1, signatureId))
except:
return None
- else:
+ elif len(parts) == 2:
try:
generatorId = int(parts[0])
signatureId = int(parts[1])
matcher.signatureIds.append((generatorId, signatureId))
except:
return None
+ elif len(parts) == 3:
+ try:
+ generatorId = int(parts[0])
+ signatureId = int(parts[1])
+ rev = int(parts[2])
+ matcher.signatureIds.append((generatorId, signatureId, rev))
+ except:
+ return None
return matcher
matcher = matchers_mod.IdRuleMatcher.parse("1:a")
self.assertIsNone(matcher)
+ def test_parse_gid_sid_rev(self):
+ matcher = matchers_mod.IdRuleMatcher.parse("1:234:5")
+ self.assertIsNotNone(matcher)
+ self.assertEqual(1, len(matcher.signatureIds))
+ self.assertEqual(matcher.signatureIds[0], (1, 234, 5))
+
+
class MetadataAddTestCase(unittest.TestCase):
def test_metadata_add(self):