lua - now we have a plugin manager which works relativley cool!
This commit is contained in:
71
webserver.py
71
webserver.py
@@ -5,14 +5,19 @@ import subprocess
|
||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||
import mimetypes
|
||||
from jsmin import jsmin # pip install jsmin
|
||||
from pathlib import Path
|
||||
|
||||
from log.Logger import *
|
||||
from lua import plugin_manager
|
||||
logger = Logger()
|
||||
plugin_manager = plugin_manager.PluginManager()
|
||||
plugin_manager.load_all() # load all plugins
|
||||
|
||||
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
|
||||
HTML_DIR = os.path.join(PROJECT_ROOT, "html")
|
||||
MARKDOWN_DIR = os.path.join(PROJECT_ROOT, "markdown")
|
||||
BASE_FILE = os.path.join(HTML_DIR, "base", "index.html")
|
||||
LUA_DIR = Path(PROJECT_ROOT) / "lua" / "plugins"
|
||||
|
||||
def get_html_files(directory=HTML_DIR):
|
||||
html_files = []
|
||||
@@ -87,8 +92,8 @@ def index_footer():
|
||||
|
||||
class MyHandler(BaseHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
req_path = self.path.lstrip("/")
|
||||
|
||||
req_path = self.path.lstrip("/") # normalize leading /
|
||||
|
||||
# Handle root/index
|
||||
if req_path == "" or req_path == "index.html":
|
||||
content = build_index_page()
|
||||
@@ -98,11 +103,22 @@ class MyHandler(BaseHTTPRequestHandler):
|
||||
self.wfile.write(content.encode("utf-8"))
|
||||
return
|
||||
|
||||
# CHECK PLUGIN ROUTES FIRST
|
||||
plugin_result = plugin_manager.handle_request("/" + req_path, {"path": self.path})
|
||||
if plugin_result is not None:
|
||||
status, headers, body = plugin_result
|
||||
self.send_response(status)
|
||||
for key, value in headers.items():
|
||||
self.send_header(key, value)
|
||||
self.end_headers()
|
||||
self.wfile.write(body.encode("utf-8") if isinstance(body, str) else body)
|
||||
return
|
||||
|
||||
# Handle markdown file downloads
|
||||
if req_path.startswith("markdown/"):
|
||||
markdown_filename = req_path[9:] # Remove "markdown/" prefix
|
||||
|
||||
# Security check: only allow .md files and prevent directory traversal
|
||||
# Security check
|
||||
if not markdown_filename.endswith(".md") or ".." in markdown_filename or "/" in markdown_filename:
|
||||
self.send_response(403)
|
||||
self.end_headers()
|
||||
@@ -111,14 +127,12 @@ class MyHandler(BaseHTTPRequestHandler):
|
||||
|
||||
markdown_file_path = os.path.join(MARKDOWN_DIR, markdown_filename)
|
||||
|
||||
# Check if file exists and is within markdown directory
|
||||
if not os.path.exists(markdown_file_path) or not os.path.isfile(markdown_file_path):
|
||||
self.send_response(404)
|
||||
self.end_headers()
|
||||
self.wfile.write(b"404 - Markdown file not found")
|
||||
return
|
||||
|
||||
# Verify the resolved path is still within the markdown directory (extra security)
|
||||
resolved_path = os.path.realpath(markdown_file_path)
|
||||
resolved_markdown_dir = os.path.realpath(MARKDOWN_DIR)
|
||||
if not resolved_path.startswith(resolved_markdown_dir):
|
||||
@@ -146,6 +160,52 @@ class MyHandler(BaseHTTPRequestHandler):
|
||||
self.wfile.write(b"500 - Internal Server Error")
|
||||
return
|
||||
|
||||
# Handle Lua file downloads
|
||||
if req_path.startswith("lua/"):
|
||||
lua_filename = req_path[4:] # Remove "lua/" prefix
|
||||
|
||||
# Security check
|
||||
if not lua_filename.endswith(".lua") or ".." in lua_filename or "/" in lua_filename:
|
||||
self.send_response(403)
|
||||
self.end_headers()
|
||||
self.wfile.write(b"403 - Forbidden: Only .lua files allowed")
|
||||
return
|
||||
|
||||
lua_file_path = os.path.join(LUA_DIR, lua_filename)
|
||||
|
||||
if not os.path.exists(lua_file_path) or not os.path.isfile(lua_file_path):
|
||||
self.send_response(404)
|
||||
self.end_headers()
|
||||
self.wfile.write(b"404 - Lua file not found")
|
||||
return
|
||||
|
||||
resolved_path = os.path.realpath(lua_file_path)
|
||||
resolved_lua_dir = os.path.realpath(LUA_DIR)
|
||||
if not resolved_path.startswith(resolved_lua_dir):
|
||||
self.send_response(403)
|
||||
self.end_headers()
|
||||
self.wfile.write(b"403 - Forbidden")
|
||||
return
|
||||
|
||||
try:
|
||||
with open(lua_file_path, "rb") as f:
|
||||
content = f.read()
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header("Content-type", "text/x-lua")
|
||||
self.send_header("Content-Disposition", f'attachment; filename="{lua_filename}"')
|
||||
self.end_headers()
|
||||
self.wfile.write(content)
|
||||
logger.log_info(f"Served Lua file: {lua_filename}")
|
||||
return
|
||||
|
||||
except Exception as err:
|
||||
logger.log_error(f"Error serving Lua file {lua_filename}: {err}")
|
||||
self.send_response(500)
|
||||
self.end_headers()
|
||||
self.wfile.write(b"500 - Internal Server Error")
|
||||
return
|
||||
|
||||
# Handle other files (existing functionality)
|
||||
file_path = os.path.normpath(os.path.join(PROJECT_ROOT, req_path))
|
||||
if not file_path.startswith(PROJECT_ROOT):
|
||||
@@ -179,6 +239,7 @@ class MyHandler(BaseHTTPRequestHandler):
|
||||
self.end_headers()
|
||||
self.wfile.write(b"404 - Not Found")
|
||||
|
||||
|
||||
def run_pypost():
|
||||
"""Run PyPost.py in a separate process."""
|
||||
script = os.path.join(PROJECT_ROOT, "PyPost.py")
|
||||
|
||||
Reference in New Issue
Block a user