flowchart TD
    %% Define Styles
    classDef client fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
    classDef sensor fill:#fff9c4,stroke:#fbc02d,stroke-width:2px;
    classDef action fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px;
    classDef captive fill:#ffe0b2,stroke:#ef6c00,stroke-width:2px,stroke-dasharray: 5 5;

    subgraph User_Action [User Action]
        Start((User Opens Browser
Enters URL)) --> GenDNS["Client Sends DNS Query
e.g. query www.google.com"] end subgraph Sensor_Interception [Sensor Interception & Response] GenDNS -- Packet passes through Sensor --> DetectDNS["Sensor Intercepts DNS Packet"] DetectDNS --> DNSHijack["Sensor Performs DNS Hijacking
Replies A Record = Sensor IP"] DNSHijack -- DNS Response --> ClientRecv["Client Receives Sensor IP"] end subgraph Connection_Handling [Connection Setup & Redirection] ClientRecv --> EstConn["Client Connects to Sensor IP
Initiates TCP Connection"] EstConn --> CheckPort{"Check Port Type"} CheckPort -- Port 80 HTTP --> Redir80["Sensor Web Server
Replies HTTP 302 Redirect"] CheckPort -- Port 443 HTTPS --> Handshake443["Poseidon Takes Over Port 443
SSL Handshake (Self-signed Cert)"] end subgraph Browser_Reaction [Browser Reaction & Captive Portal] Handshake443 -- "Certificate Error (HSTS or HTTPS)" --> TriggerCP["Trigger Captive Portal Detection
(Connects to connectivitycheck...)"] TriggerCP -- "Send HTTP Probe Packet" --> RedirCP["Sensor Intercepts HTTP
Replies 302 Redirect"] end subgraph Result [Final Result] Redir80 --> ShowBlock["Display Block Page"] RedirCP --> ShowBlock end class Start,GenDNS,ClientRecv,EstConn client class DetectDNS,DNSHijack,Redir80,Handshake443,RedirCP sensor class ShowBlock action class TriggerCP captive