from flask import Flask, request, render_template, Response import os import base64 app = Flask(__name__) USERNAME = "admin" PASSWORD = "changeme" KEYBOARD = "/dev/hidg0" MOUSE = "/dev/hidg1" # ------------------------- # Authentication # ------------------------- def check_auth(auth_header): if not auth_header: return False try: scheme, encoded = auth_header.split() if scheme.lower() != "basic": return False decoded = base64.b64decode(encoded).decode() user, pw = decoded.split(":", 1) return user == USERNAME and pw == PASSWORD except: return False def require_auth(): return Response( "Authentication required", 401, {"WWW-Authenticate": 'Basic realm="Pi Zero HID"'} ) @app.before_request def before_request(): if request.path.startswith("/static"): return auth = request.headers.get("Authorization") if not check_auth(auth): return require_auth() # ------------------------- # HID functions # ------------------------- def send_keyboard(code): report = bytes([0, 0, code, 0, 0, 0, 0, 0]) release = bytes([0] * 8) with open(KEYBOARD, "wb") as f: f.write(report) f.write(release) def send_mouse(dx, dy, buttons, wheel): # 4-byte HID mouse report: [buttons, dx, dy, wheel] report = bytes([ buttons & 0x07, dx & 0xFF, dy & 0xFF, wheel & 0xFF ]) with open(MOUSE, "wb") as f: f.write(report) # ------------------------- # Routes # ------------------------- @app.route("/") def index(): return render_template("index.html") @app.route("/key", methods=["POST"]) def key(): code = int(request.form["code"]) send_keyboard(code) return "OK" @app.route("/mouse", methods=["POST"]) def mouse(): dx = int(request.form.get("dx", 0)) dy = int(request.form.get("dy", 0)) buttons = int(request.form.get("buttons", 0)) wheel = int(request.form.get("wheel", 0)) send_mouse(dx, dy, buttons, wheel) return "OK" if __name__ == "__main__": app.run(host="0.0.0.0", port=80)