2022-01-24 01:17:27 +01:00
|
|
|
# standard imports
|
|
|
|
import logging
|
2022-02-27 12:48:15 +01:00
|
|
|
import uuid
|
2022-01-24 01:17:27 +01:00
|
|
|
|
|
|
|
# external imports
|
|
|
|
from chainlib.eth.address import is_same_address
|
|
|
|
|
|
|
|
logg = logging.getLogger()
|
|
|
|
|
|
|
|
|
2022-02-27 12:48:15 +01:00
|
|
|
class RuleSimple:
|
|
|
|
|
|
|
|
def __init__(self, outputs, inputs, executables, description=None):
|
|
|
|
self.description = description
|
|
|
|
if self.description == None:
|
|
|
|
self.description = str(uuid.uuid4())
|
|
|
|
self.outputs = outputs
|
|
|
|
self.inputs = inputs
|
|
|
|
self.executables = executables
|
|
|
|
|
|
|
|
|
|
|
|
def check(self, sender, recipient, tx_hash):
|
|
|
|
for rule in self.outputs:
|
|
|
|
if rule != None and is_same_address(sender, rule):
|
|
|
|
logg.debug('tx {} rule INCLUDE match in SENDER {}'.format(tx_hash, sender))
|
|
|
|
return True
|
|
|
|
for rule in self.inputs:
|
|
|
|
if rule != None and is_same_address(recipient, rule):
|
|
|
|
logg.debug('tx {} rule INCLUDE match in RECIPIENT {}'.format(tx_hash, recipient))
|
|
|
|
return True
|
|
|
|
for rule in self.executables:
|
|
|
|
if rule != None and is_same_address(recipient, rule):
|
|
|
|
logg.debug('tx {} rule INCLUDE match in ExECUTABLE {}'.format(tx_hash, recipient))
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return 'Simple ' + self.description + ' outputs {} inputs {} execs {}'.format(
|
|
|
|
self.outputs,
|
|
|
|
self.inputs,
|
|
|
|
self.executables,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-01-23 18:49:04 +01:00
|
|
|
class AddressRules:
|
|
|
|
|
|
|
|
def __init__(self, include_by_default=False):
|
|
|
|
self.excludes = []
|
|
|
|
self.includes = []
|
|
|
|
self.include_by_default = include_by_default
|
|
|
|
|
|
|
|
|
2022-02-27 12:48:15 +01:00
|
|
|
def exclude(self, rule):
|
|
|
|
self.excludes.append(rule)
|
|
|
|
logg.info('cache filter added EXCLUDE rule {}'.format(rule))
|
2022-01-23 18:49:04 +01:00
|
|
|
|
2022-02-27 12:48:15 +01:00
|
|
|
|
|
|
|
def include(self, rule):
|
|
|
|
self.includes.append(rule)
|
|
|
|
logg.info('cache filter added EXCLUDE rule {}'.format(rule))
|
2022-01-23 18:49:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
def apply_rules(self, tx):
|
2022-01-24 01:17:27 +01:00
|
|
|
return self.apply_rules_addresses(tx.outputs[0], tx.inputs[0], tx.hash)
|
|
|
|
|
|
|
|
|
|
|
|
def apply_rules_addresses(self, sender, recipient, tx_hash):
|
|
|
|
v = self.include_by_default
|
2022-01-23 18:49:04 +01:00
|
|
|
|
|
|
|
for rule in self.includes:
|
2022-02-27 12:48:15 +01:00
|
|
|
if rule.check(sender, recipient, tx_hash):
|
2022-01-23 18:49:04 +01:00
|
|
|
v = True
|
2022-02-27 12:48:15 +01:00
|
|
|
logg.info('match in includes rule: {}'.format(rule))
|
|
|
|
break
|
|
|
|
|
2022-01-23 18:49:04 +01:00
|
|
|
for rule in self.excludes:
|
2022-02-27 12:48:15 +01:00
|
|
|
if rule.check(sender, recipient, tx_hash):
|
2022-01-23 18:49:04 +01:00
|
|
|
v = False
|
2022-02-27 12:48:15 +01:00
|
|
|
logg.info('match in excludes rule: {}'.format(rule))
|
|
|
|
break
|
|
|
|
|
2022-01-23 18:49:04 +01:00
|
|
|
return v
|