2023-08-09 12:19:54 -04:00
|
|
|
import logging
|
|
|
|
import json
|
2023-08-10 14:27:33 -04:00
|
|
|
from synapse.module_api import ModuleApi
|
2023-08-09 12:19:54 -04:00
|
|
|
from twisted.web import http
|
2023-08-10 13:09:20 -04:00
|
|
|
from twisted.internet import defer
|
|
|
|
from twisted.internet.defer import inlineCallbacks
|
2023-08-10 13:39:45 -04:00
|
|
|
from twisted.web.server import NOT_DONE_YET
|
2023-08-10 14:27:33 -04:00
|
|
|
from twisted.web.http import OK, NO_CONTENT
|
2023-08-09 12:19:54 -04:00
|
|
|
|
2023-08-13 10:59:19 -04:00
|
|
|
# Define a handler and set its level and format
|
|
|
|
file_handler = logging.FileHandler('/var/log/matrix-synapse/redlight.log')
|
|
|
|
file_handler.setLevel(logging.INFO)
|
|
|
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
|
|
file_handler.setFormatter(formatter)
|
|
|
|
|
|
|
|
# Get your logger
|
2023-08-09 12:19:54 -04:00
|
|
|
logger = logging.getLogger(__name__)
|
2023-08-13 10:59:19 -04:00
|
|
|
logger.setLevel(logging.INFO)
|
|
|
|
logger.addHandler(file_handler)
|
|
|
|
|
|
|
|
# Ensure that this logger's messages don't propagate to the root logger
|
|
|
|
logger.propagate = False
|
2023-08-09 12:19:54 -04:00
|
|
|
|
2023-08-10 14:27:33 -04:00
|
|
|
class RedlightServerModule:
|
2023-08-09 12:19:54 -04:00
|
|
|
def __init__(self, config: dict, api: ModuleApi):
|
|
|
|
self._api = api
|
2023-08-10 14:27:33 -04:00
|
|
|
|
2023-08-09 12:19:54 -04:00
|
|
|
# Register the abuse_lookup endpoint
|
|
|
|
api.register_web_resource(
|
|
|
|
"/_matrix/loj/v1/abuse_lookup",
|
2023-08-10 14:27:33 -04:00
|
|
|
RedlightServerResource(self)
|
2023-08-09 12:19:54 -04:00
|
|
|
)
|
|
|
|
|
2023-08-10 14:27:33 -04:00
|
|
|
logger.info("RedlightServerModule initialized.")
|
|
|
|
|
|
|
|
class RedlightServerResource:
|
2023-08-10 13:09:20 -04:00
|
|
|
|
|
|
|
isLeaf = True
|
|
|
|
|
2023-08-09 12:19:54 -04:00
|
|
|
def __init__(self, module):
|
|
|
|
self._module = module
|
|
|
|
|
2023-08-10 13:09:20 -04:00
|
|
|
def render(self, request):
|
|
|
|
method = request.method.decode('ascii')
|
|
|
|
handler = getattr(self, f"on_{method}", None)
|
2023-08-09 12:19:54 -04:00
|
|
|
|
2023-08-10 13:09:20 -04:00
|
|
|
if handler:
|
2023-08-10 13:39:45 -04:00
|
|
|
def _respond(result):
|
|
|
|
request.write(result)
|
|
|
|
request.finish()
|
|
|
|
|
|
|
|
def _error(failure):
|
|
|
|
logger.error(f"Error processing abuse lookup request: {failure}")
|
|
|
|
request.setResponseCode(500)
|
|
|
|
request.write(json.dumps({"error": "Internal Server Error"}).encode("utf-8"))
|
|
|
|
request.finish()
|
|
|
|
|
|
|
|
d = handler(request)
|
|
|
|
d.addCallbacks(_respond, _error)
|
|
|
|
return NOT_DONE_YET
|
2023-08-10 13:09:20 -04:00
|
|
|
else:
|
|
|
|
return self.method_not_allowed(request)
|
|
|
|
|
|
|
|
@inlineCallbacks
|
|
|
|
def on_PUT(self, request):
|
2023-08-09 12:19:54 -04:00
|
|
|
try:
|
2023-08-10 13:09:20 -04:00
|
|
|
# Extract body from the request
|
|
|
|
body = yield request.content.read()
|
|
|
|
content = body.decode("utf-8")
|
2023-08-10 14:27:33 -04:00
|
|
|
|
2023-08-10 13:09:20 -04:00
|
|
|
# Log the request to Synapse's log
|
|
|
|
logger.info(f"Received abuse lookup request: {content}")
|
|
|
|
|
2023-08-12 06:09:42 -04:00
|
|
|
# Extract room_id_hash and user_id_hash from the content
|
2023-08-09 12:19:54 -04:00
|
|
|
data = json.loads(content)
|
2023-08-12 06:09:42 -04:00
|
|
|
room_id_hash = data["room_id_hash"]
|
|
|
|
user_id_hash = data["user_id_hash"]
|
2023-08-10 14:27:33 -04:00
|
|
|
|
2023-08-12 06:09:42 -04:00
|
|
|
# Check the room_id_hash against your list/database or hardcoded value
|
2023-08-13 10:29:02 -04:00
|
|
|
is_abuse = room_id_hash == "ee180279a57f716e5801335a2914e228667f363e460ccabcc49e8fd879e1be4a"
|
2023-08-09 12:19:54 -04:00
|
|
|
|
|
|
|
if is_abuse:
|
2023-08-10 13:09:20 -04:00
|
|
|
request.setResponseCode(http.OK)
|
|
|
|
defer.returnValue(json.dumps({
|
2023-08-09 12:19:54 -04:00
|
|
|
"error": None,
|
|
|
|
"report_id": "b973d82a-6932-4cad-ac9f-f647a3a9d204",
|
|
|
|
}).encode("utf-8"))
|
|
|
|
else:
|
2023-08-10 13:09:20 -04:00
|
|
|
request.setResponseCode(http.NO_CONTENT)
|
|
|
|
defer.returnValue(b"")
|
2023-08-09 12:19:54 -04:00
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"Error processing abuse lookup request: {e}")
|
2023-08-10 13:09:20 -04:00
|
|
|
request.setResponseCode(400)
|
|
|
|
defer.returnValue(json.dumps({"error": "Bad Request"}).encode("utf-8"))
|
|
|
|
|
|
|
|
def on_GET(self, request):
|
|
|
|
return self.method_not_allowed(request)
|
|
|
|
|
|
|
|
def on_POST(self, request):
|
|
|
|
return self.method_not_allowed(request)
|
2023-08-09 12:19:54 -04:00
|
|
|
|
2023-08-10 13:09:20 -04:00
|
|
|
# And similarly for other methods you want to block like DELETE, HEAD, etc.
|
2023-08-09 12:19:54 -04:00
|
|
|
|
2023-08-10 13:09:20 -04:00
|
|
|
def method_not_allowed(self, request):
|
|
|
|
request.setResponseCode(405)
|
|
|
|
return json.dumps({"error": "Method Not Allowed"}).encode("utf-8")
|
2023-08-09 12:19:54 -04:00
|
|
|
|
|
|
|
def parse_config(config: dict) -> dict:
|
|
|
|
return config
|
|
|
|
|
2023-08-10 14:27:33 -04:00
|
|
|
def create_module(api: ModuleApi, config: dict) -> RedlightServerModule:
|
|
|
|
return RedlightServerModule(config, api)
|