Detect Tor IPs and shame them for having JS on

This commit is contained in:
mtgmonkey 2025-06-07 18:58:15 +00:00
parent 00b9d408cd
commit 93d8d14efb
2 changed files with 50 additions and 18 deletions

View file

@ -13,6 +13,8 @@
p.blaze-markup p.blaze-markup
p.directory p.directory
p.elm-street p.elm-street
p.http-client
p.http-client-tls
p.http-types p.http-types
p.scotty p.scotty
p.text p.text

View file

@ -5,6 +5,7 @@
module Main (main) where module Main (main) where
import Data.FileEmbed (embedStringFile) import Data.FileEmbed (embedStringFile)
import Data.Function ((&))
import Data.Text.Lazy (Text) import Data.Text.Lazy (Text)
import Network.Wai.Handler.Warp (Port) import Network.Wai.Handler.Warp (Port)
import Network.Wai.Middleware.RequestLogger (logStdoutDev) import Network.Wai.Middleware.RequestLogger (logStdoutDev)
@ -15,20 +16,27 @@ import Network.HTTP.Types
import Network.Wai.Middleware.Gzip import Network.Wai.Middleware.Gzip
import Web.Scotty as S import Web.Scotty as S
import qualified Data.List as List
import qualified Data.Maybe as Maybe
import qualified Network.HTTP.Client as Http
import qualified Network.HTTP.Client.TLS as Http
import qualified Control.Exception as E import qualified Control.Exception as E
import qualified Text.Blaze.Html5 as H import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A import qualified Text.Blaze.Html5.Attributes as A
-- HTML -- HTML
index :: H.Html -> Text index :: H.Html -> Text
index compiledElmApp = renderHtml $ do index body = renderHtml $ do
H.docTypeHtml $ do H.docTypeHtml $ do
H.head $ do H.head $ do
H.title "TESTING Scotty+Elm" H.title "TESTING Scotty+Elm"
H.meta ! A.charset "utf-8" H.meta ! A.charset "utf-8"
H.style "body{margin:0px;}" H.style "body{margin:0px;}"
(H.body ! A.id "body") $ do (H.body ! A.id "body") $ do
embedJs compiledElmApp H.noscript "You don't have Javascript enabled! This site doesn't work without it."
body
-- CONF -- CONF
port :: Port port :: Port
@ -37,15 +45,6 @@ port = 8080
adminContact :: String adminContact :: String
adminContact = "[Matrix] @mtgmonkey:calitabby.net" adminContact = "[Matrix] @mtgmonkey:calitabby.net"
compiledElmAppFile :: AssetPath
compiledElmAppFile = "/main.js"
boilerplateJsFile :: AssetPath
boilerplateJsFile = "/init.js"
assetsFolder :: FilePath
assetsFolder = "."
compiledElmApp :: H.Html compiledElmApp :: H.Html
compiledElmApp = H.toHtml ($(embedStringFile "./main.js") :: String) compiledElmApp = H.toHtml ($(embedStringFile "./main.js") :: String)
@ -55,6 +54,10 @@ boilerplateJs = H.toHtml ($(embedStringFile "./init.js") :: String)
-- MAIN -- MAIN
main :: IO () main :: IO ()
main = do main = do
httpman <- Http.newManager Http.tlsManagerSettings
let tor_ips_req = Http.setQueryString [] "https://raw.githubusercontent.com/7c/torfilter/refs/heads/main/lists/txt/torfilter-2d-flat.txt"
tor_ips_resp <- Http.httpLbs tor_ips_req httpman
let tor_ips = show tor_ips_resp
scotty port $ do scotty port $ do
middleware $ gzip $ def { gzipFiles = GzipCompress } middleware $ gzip $ def { gzipFiles = GzipCompress }
@ -62,16 +65,43 @@ main = do
-- GET requests -- GET requests
get "/" $ do get "/" $ do
h <- header "HTTP_CLIENT_IP" client_ip <- header "CLIENT_IP"
r <- header "REMOTE_ADDR" x_forwarded_for <- header "X_FORWARDED_FOR"
let fromMaybe d x = case x of {Nothing -> d;Just v -> v} x_forwarded_for_lower <- header "x-forwarded-for"
x_forwarded <- header "X_FORWARDED"
x_cluster_client_ip <- header "X_CLUSTER_CLIENT_IP"
forwarded_for <- header "FORWARDED_FOR"
forwarded <- header "FORWARDED"
via <- header "VIA"
remote_addr <- header "REMOTE_ADDR"
let ip = [ client_ip
, x_forwarded_for
, x_forwarded_for_lower
, x_forwarded
, x_cluster_client_ip
, forwarded_for
, forwarded
, via
, remote_addr
, Just "NO_IP"
]
& List.dropWhile ((==) Nothing)
& List.head
& Maybe.fromMaybe "0.0.0.0"
& show
& List.init
& List.tail
shortCache shortCache
status ok200 status ok200
S.html $ index $ do S.html $ index $ do
if List.isInfixOf ip tor_ips
then do
H.text "You are using Tor. I won't serve Javascript to Tor, because you should have it disabled. Go disable it now and leave :3"
H.text " (psst. The onionsite lets you use javascript. You can get it from the Onion-Location header)"
else
embedJs $ do
compiledElmApp compiledElmApp
boilerplateJs boilerplateJs
H.toHtml $ fromMaybe "HTTP_CLIENT_IP: Nothing" h
H.toHtml $ fromMaybe "REMOTE_ADDR: Nothing" r
get "/favicon.ico/" $ do get "/favicon.ico/" $ do
shortCache shortCache