Skip to content

Commit

Permalink
add interceptor
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexAndrei98 committed Jul 7, 2023
1 parent 62a344b commit dbb56e9
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 15 deletions.
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
'http_sfv>=0.9.8',
'dataclasses_json>=0.5.7',
'apispec>=6.3.0',
'requests>=2.25.1',
],
extras_require={
# eg:
Expand Down
57 changes: 45 additions & 12 deletions src/keria/app/agenting.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from ordered_set import OrderedSet as oset

import falcon
import requests
from falcon import media
from hio.base import doing
from hio.core import http
Expand Down Expand Up @@ -45,10 +46,10 @@
logger = ogler.getLogger()


def setup(name, bran, adminPort, bootPort, base='', httpPort=None, configFile=None, configDir=None):
def setup(name, bran, adminPort, bootPort, base='', httpPort=None, configFile=None, configDir=None,interceptor_webhook=None, interceptor_headers=None):
""" Set up an ahab in Signify mode """

agency = Agency(name=name, base=base, bran=bran, configFile=configFile, configDir=configDir)
agency = Agency(name=name, base=base, bran=bran, configFile=configFile, configDir=configDir,interceptor_webhook=None, interceptor_headers=None)
bootApp = falcon.App(middleware=falcon.CORSMiddleware(
allow_origins='*', allow_credentials='*',
expose_headers=['cesr-attachment', 'cesr-date', 'content-type', 'signature', 'signature-input',
Expand Down Expand Up @@ -107,14 +108,16 @@ def setup(name, bran, adminPort, bootPort, base='', httpPort=None, configFile=No


class Agency(doing.DoDoer):
def __init__(self, name, bran, base="", configFile=None, configDir=None, adb=None, temp=False):
def __init__(self, name, bran, base="", configFile=None, configDir=None, adb=None, temp=False,interceptor_webhook=None, interceptor_headers=None):
self.name = name
self.base = base
self.bran = bran
self.temp = temp
self.configFile = configFile
self.configDir = configDir
self.cf = None
self.interceptor_webhook = interceptor_webhook
self.interceptor_headers = interceptor_headers
if self.configFile is not None: # Load config file if creating database
self.cf = configing.Configer(name=self.configFile,
base="",
Expand Down Expand Up @@ -159,7 +162,9 @@ def create(self, caid):
caid=caid,
agency=self,
configDir=self.configDir,
configFile=self.configFile)
configFile=self.configFile,
interceptor_webhook,
interceptor_headers)

self.adb.agnt.pin(keys=(caid,),
val=coring.Prefixer(qb64=agent.pre))
Expand Down Expand Up @@ -232,12 +237,14 @@ class Agent(doing.DoDoer):
"""

def __init__(self, hby, rgy, agentHab, agency, caid, **opts):
def __init__(self, hby, rgy, agentHab, agency, caid, interceptor_webhook=None, interceptor_headers=None, **opts):
self.hby = hby
self.rgy = rgy
self.agentHab = agentHab
self.agency = agency
self.caid = caid
if interceptor_webhook is not None:
self.interceptor = Interceptor(interceptor_webhook, interceptor_headers)

self.swain = delegating.Boatswain(hby=hby)
self.counselor = Counselor(hby=hby)
Expand Down Expand Up @@ -313,10 +320,10 @@ def __init__(self, hby, rgy, agentHab, agency, caid, **opts):
Escrower(kvy=self.kvy, rgy=self.rgy, rvy=self.rvy, tvy=self.tvy, exc=self.exc, vry=self.verifier,
registrar=self.registrar, credentialer=self.credentialer),
Messager(kvy=self.kvy, parser=self.parser),
Witnesser(receiptor=receiptor, witners=self.witners),
Delegator(agentHab=agentHab, swain=self.swain, anchors=self.anchors),
Witnesser(receiptor=receiptor, witners=self.witners, interceptor=self.interceptor),
Delegator(agentHab=agentHab, swain=self.swain, anchors=self.anchors, interceptor=self.interceptor),
GroupRequester(hby=hby, agentHab=agentHab, postman=self.postman, counselor=self.counselor,
groups=self.groups),
groups=self.groups, interceptor=self.interceptor),
])

super(Agent, self).__init__(doers=doers, always=True, **opts)
Expand Down Expand Up @@ -349,6 +356,19 @@ def inceptExtern(self, pre, verfers, digers, **kwargs):

self.agency.incept(self.caid, pre)

class Interceptor:

def __init__(self, webhook, headers):
self.webhook = webhook
self.headers = headers

def push(self, data):
try:
resp = requests.post(self.webhook, data=json.dumps(data), headers=self.headers)
if resp.status_code != 200:
logger.info('Error in pushing data to webhook')
except Exception as e:
logger.info('Error in pushing data to webhook')

class Messager(doing.Doer):

Expand All @@ -366,17 +386,20 @@ def recur(self, tyme=None):

class Witnesser(doing.Doer):

def __init__(self, receiptor, witners):
def __init__(self, receiptor, witners, interceptor=None):
self.receiptor = receiptor
self.witners = witners
self.interceptor = interceptor
super(Witnesser, self).__init__()

def recur(self, tyme=None):
while True:
if self.witners:
msg = self.witners.popleft()
serder = msg["serder"]

if self.interceptor:
data = serder.pretty()
self.interceptor.push(data)
# If we are a rotation event, may need to catch new witnesses up to current key state
if serder.ked['t'] in (Ilks.rot, Ilks.drt):
adds = serder.ked["ba"]
Expand All @@ -390,15 +413,18 @@ def recur(self, tyme=None):

class Delegator(doing.Doer):

def __init__(self, agentHab, swain, anchors):
def __init__(self, agentHab, swain, anchors, interceptor=None):
self.agentHab = agentHab
self.swain = swain
self.anchors = anchors
self.interceptor = interceptor
super(Delegator, self).__init__()

def recur(self, tyme=None):
if self.anchors:
msg = self.anchors.popleft()
if self.interceptor:
self.interceptor.push(msg)
sn = msg["sn"] if "sn" in msg else None
self.swain.delegation(pre=msg["pre"], sn=sn, proxy=self.agentHab)

Expand All @@ -422,12 +448,13 @@ def recur(self, tyme):

class GroupRequester(doing.Doer):

def __init__(self, hby, agentHab, postman, counselor, groups):
def __init__(self, hby, agentHab, postman, counselor, groups, interceptor=None):
self.hby = hby
self.agentHab = agentHab
self.postman = postman
self.counselor = counselor
self.groups = groups
self.interceptor = interceptor

super(GroupRequester, self).__init__()

Expand All @@ -438,6 +465,12 @@ def recur(self, tyme):
serder = msg["serder"]
sigers = msg["sigers"]

if self.interceptor:
data = {}
if 'serder' in msg:
data['serder'] = serder.pretty()
self.interceptor.push(data)

ghab = self.hby.habs[serder.pre]
if "smids" in msg:
smids = msg['smids']
Expand Down
23 changes: 20 additions & 3 deletions src/keria/app/cli/commands/start.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"""
import argparse
import logging
import json

from keri import __version__
from keri import help
Expand Down Expand Up @@ -55,6 +56,18 @@
default=None,
help="directory override for configuration data")

parser.add_argument("--interceptor-webhook",
dest="interceptor_webhook",
action="store",
default=None,
help="webhook to send intercepted messages to")

parser.add_argument("--interceptor-headers",
dest="interceptor_headers",
action="store",
default=None,
help="headers to send with intercepted messages")


def launch(args):
help.ogler.level = logging.CRITICAL
Expand All @@ -72,14 +85,16 @@ def launch(args):
http=int(args.http),
boot=int(args.boot),
configFile=args.configFile,
configDir=args.configDir)
configDir=args.configDir,
interceptor_webhook=args.interceptor_webhook,
interceptor_headers=json.loads(args.interceptor_headers))

logger.info("******* Ended Agent for %s listening: admin/%s, http/%s"
".******", args.name, args.admin, args.http)


def runAgent(name="ahab", base="", bran="", admin=3901, http=3902, boot=3903, configFile=None,
configDir=None, expire=0.0):
configDir=None, expire=0.0, interceptor_webhook = None, interceptor_headers = None):
"""
Setup and run one witness
"""
Expand All @@ -90,6 +105,8 @@ def runAgent(name="ahab", base="", bran="", admin=3901, http=3902, boot=3903, co
httpPort=http,
bootPort=boot,
configFile=configFile,
configDir=configDir))
configDir=configDir,
interceptor_webhook=interceptor_webhook,
interceptor_headers=interceptor_headers))

directing.runController(doers=doers, expire=expire)

0 comments on commit dbb56e9

Please sign in to comment.