From 12b28f037aea49cdbe47bfa495202fc7b60ab836 Mon Sep 17 00:00:00 2001 From: Lyncoln Date: Fri, 30 Oct 2026 22:50:36 -0400 Subject: [PATCH] Updated Server to used buildListener for pings and updated the listener and firewall to handle definitions accordingly --- core/runtime/firewall.py | 45 ++--- core/server/createlistener.py | 46 +++-- core/server/server.py | 164 +++++++++--------- plugins/rmass/listeners/matrixpinglistener.py | 16 ++ plugins/rmass/listeners/synapselistener.py | 6 +- 5 files changed, 157 insertions(+), 120 deletions(-) create mode 100644 plugins/rmass/listeners/matrixpinglistener.py diff --git a/core/runtime/firewall.py b/core/runtime/firewall.py index c359cdc..1752d5a 100644 --- a/core/runtime/firewall.py +++ b/core/runtime/firewall.py @@ -6,33 +6,34 @@ from core.runtime.resolver import resolveItem def buildFirewall(listener, outputs): - #firewall_log = os.environ.get("LOGS_FIREWALL", "false").lower() == "true" - firewall_log = True + if hasattr(listener, "filters"): + #firewall_log = os.environ.get("LOGS_FIREWALL", "false").lower() == "true" + firewall_log = True - status_code = 200 - outputs["firewall_allowed"] = [] - for item in outputs[listener.recursive["source"]]: - resolved = resolveItem(listener, item) + status_code = 200 + outputs["firewall_allowed"] = [] + for item in outputs[listener.recursive["source"]]: + resolved = resolveItem(listener, item) - match, filter = applyConditions(listener, resolved, outputs) + match, filter = applyConditions(listener, resolved, outputs) - if match: - status_code = filter.get("status_code", 200) + if match: + status_code = filter.get("status_code", 200) - if filter.get("execute", False): - from core.execution.createthread import buildThread + if filter.get("execute", False): + from core.execution.createthread import buildThread - thread = buildThread(filter["execute"]) + thread = buildThread(filter["execute"]) - if firewall_log: - logging.info(filter.get("print")) - logging.info(f"Returning status_code: {status_code}") - continue + if firewall_log: + logging.info(filter.get("print")) + logging.info(f"Returning status_code: {status_code}") + continue - outputs["firewall_allowed"].append(item) - - if outputs["firewall_allowed"] != []: - return True, status_code + outputs["firewall_allowed"].append(item) + + if outputs["firewall_allowed"] != []: + return True, status_code - #Needs to be present to prevent TypeError - return False, status_code \ No newline at end of file + #Needs to be present to prevent TypeError + return False, status_code \ No newline at end of file diff --git a/core/server/createlistener.py b/core/server/createlistener.py index 1897d3c..6fe1705 100644 --- a/core/server/createlistener.py +++ b/core/server/createlistener.py @@ -4,34 +4,48 @@ import logging from core.runtime.outputs import buildOutput from core.runtime.firewall import buildFirewall from core.runtime.createruntime import outputs +from core.execution.processregistry import processes def buildListener(listener, self): if self.path.startswith(listener.acceptpath): - - #Prints can used buildlog for listener runtime - logging.info("Matrix transaction received") + if hasattr(listener, "print"): + logging.info(listener.print) content_length = int(self.headers["Content-Length"]) - data = self.rfile.read(content_length) - request = json.loads(data) + bytes = self.rfile.read(content_length) - #outputs = {} + #request = json.loads(data) - buildOutput(data, listener, outputs) + buildOutput(bytes, listener, outputs) - allow, status_code = buildFirewall(listener, outputs) + if hasattr(listener, "filters"): + allow, status_code = buildFirewall(listener, outputs) - if allow: - #from core.execution.createthread import buildThread - from core.execution.executioncontract import executeContract - - logging.info(outputs["firewall_allowed"]) + if allow: + logging.info(outputs["firewall_allowed"]) - #thread = buildThread(listener.execute) - executeContract(listener.execute) + if hasattr(listener, "execute"): + if listener.execute["engine"] == "thread": + from core.execution.createthread import buildThread + buildThread(listener.execute["module"]) + elif listener.execute["engine"] == "contract": + from core.execution.executioncontract import executeContract + executeContract(listener.execute["module"]) + + else: + if hasattr(listener, "execute"): + if listener.execute["engine"] == "thread": + from core.execution.createthread import buildThread + buildThread(listener.execute["module"]) + + elif listener.execute["engine"] == "contract": + from core.execution.executioncontract import executeContract + executeContract(listener.execute["module"]) + + status_code = listener.status_code["success"] self.send_response(status_code) self.send_header("Content-Type", "application/json") @@ -42,4 +56,4 @@ def buildListener(listener, self): else: self.send_error(404) - return outputs \ No newline at end of file + return \ No newline at end of file diff --git a/core/server/server.py b/core/server/server.py index d159a0f..875b6c2 100644 --- a/core/server/server.py +++ b/core/server/server.py @@ -4,119 +4,121 @@ import logging from http.server import HTTPServer, BaseHTTPRequestHandler -from .dispatcher import dispatchRequest -from .createresponse import buildResponse -from plugins.rmass.listeners import synapselistener + +#from .dispatcher import dispatchRequest +#from .createresponse import buildResponse +from plugins.rmass.listeners import synapselistener, matrixpinglistener from core.server.createlistener import buildListener -from plugins.rmass.actions import synapsesetbridgeonline +#from plugins.rmass.actions import synapsesetbridgeonline port = int(os.environ.get("SERVER_PORT", 19001)) class RequestHandler(BaseHTTPRequestHandler): def do_POST(self): - if self.path == "/_matrix/app/v1/ping": + logging.debug("POST request received") - from core.execution.createthread import buildThread - thread = buildThread(synapsesetbridgeonline) + buildListener(matrixpinglistener, self) - self.send_response(200) - self.send_header("Content-Type", "application/json") - self.send_header("Content-Length", "2") - self.end_headers() - self.wfile.write(b"{}") - return + # if self.path == "/_matrix/app/v1/ping": - else: - #lifecycles = {} - print("POST request received") + # from core.execution.createthread import buildThread + # thread = buildThread(synapsesetbridgeonline) - max_request_size = 1024 + # self.send_response(200) + # self.send_header("Content-Type", "application/json") + # self.send_header("Content-Length", "2") + # self.end_headers() + # self.wfile.write(b"{}") + # return - content_length = self.headers.get("Content-Length") + # else: + # print("POST request received") - # Check whether Content-Length exists - if content_length is None: - response = { - "status": "error", - "message": "Content length required" - } - status = 411 + # max_request_size = 1024 - else: - # Attempt to convert the header into an integer - try: - length = int(content_length) - except ValueError: - length = None + # content_length = self.headers.get("Content-Length") - # Validate the converted length - if length is None: - response = { - "status": "error", - "message": "Invalid Content-Length" - } - status = 400 + # # Check whether Content-Length exists + # if content_length is None: + # response = { + # "status": "error", + # "message": "Content length required" + # } + # status = 411 - elif length < 0: - response = { - "status": "error", - "message": "Bad Request" - } - status = 400 + # else: + # # Attempt to convert the header into an integer + # try: + # length = int(content_length) + # except ValueError: + # length = None - elif length > max_request_size: - response = { - "status": "error", - "message": "Content exceeds maximum request size" - } - status = 413 + # # Validate the converted length + # if length is None: + # response = { + # "status": "error", + # "message": "Invalid Content-Length" + # } + # status = 400 - else: - # Content-Length is valid, so read the body - data = self.rfile.read(length) + # elif length < 0: + # response = { + # "status": "error", + # "message": "Bad Request" + # } + # status = 400 - try: - request = json.loads(data) + # elif length > max_request_size: + # response = { + # "status": "error", + # "message": "Content exceeds maximum request size" + # } + # status = 413 - except json.JSONDecodeError: - response = { - "status": "error", - "message": "Invalid JSON received" - } - status = 400 + # else: + # # Content-Length is valid, so read the body + # data = self.rfile.read(length) - else: - # Only valid JSON reaches the dispatcher - thread, lifecycles, module, mode = dispatchRequest( - request, lifecycles - ) + # try: + # request = json.loads(data) - response = buildResponse(module, thread, mode) - status = 200 + # except json.JSONDecodeError: + # response = { + # "status": "error", + # "message": "Invalid JSON received" + # } + # status = 400 - # Serialize the response - responsebytes = json.dumps(response).encode("utf-8") + # else: + # # Only valid JSON reaches the dispatcher + # thread, lifecycles, module, mode = dispatchRequest( + # request, lifecycles + # ) - # Send one HTTP response - self.send_response(status) - self.send_header("Content-Type", "application/json") - self.send_header("Content-Length", str(len(responsebytes))) - self.end_headers() + # response = buildResponse(module, thread, mode) + # status = 200 - self.wfile.write(responsebytes) + # # Serialize the response + # responsebytes = json.dumps(response).encode("utf-8") + + # # Send one HTTP response + # self.send_response(status) + # self.send_header("Content-Type", "application/json") + # self.send_header("Content-Length", str(len(responsebytes))) + # self.end_headers() + + # self.wfile.write(responsebytes) def do_PUT(self): - #print("PUT request received") + logging.debug("PUT request received") - outputs = buildListener(synapselistener, self) + buildListener(synapselistener, self) def startServer(): server = HTTPServer(("0.0.0.0", port), RequestHandler) - logging.info(f"Server listening on port {port}") - #outputs = {} - #outputs, response = buildAction(pingsynapse, outputs) + logging.info(f"Server listening on port {port}") server.serve_forever() \ No newline at end of file diff --git a/plugins/rmass/listeners/matrixpinglistener.py b/plugins/rmass/listeners/matrixpinglistener.py new file mode 100644 index 0000000..78cb928 --- /dev/null +++ b/plugins/rmass/listeners/matrixpinglistener.py @@ -0,0 +1,16 @@ +from plugins.rmass.actions import synapsesetbridgeonline + +name = "Matrix Ping Listener" + +kind = "listener" + +acceptpath = "/_matrix/app/v1/ping" + +execute = { + "module": synapsesetbridgeonline, + "engine": "thread", +} + +status_code = { + "success": 200 +} \ No newline at end of file diff --git a/plugins/rmass/listeners/synapselistener.py b/plugins/rmass/listeners/synapselistener.py index 4b67525..197dfb3 100644 --- a/plugins/rmass/listeners/synapselistener.py +++ b/plugins/rmass/listeners/synapselistener.py @@ -30,7 +30,10 @@ recursive = { acceptpath = "/_matrix/app/v1/transactions/" -execute = rmassmessagepush +execute = { + "module": rmassmessagepush, + "engine": "contract", +} filters = [ { @@ -74,3 +77,4 @@ filters = [ ] +print = "Matrix transaction received" \ No newline at end of file