{-# LANGUAGE OverloadedStrings #-}
import System.Environment (getArgs)
import Control.Concurrent (threadDelay)
import Network (withSocketsDo)
import qualified Network.Anonymous.Tor as Tor
import qualified Network.Socks5.Types as SocksT
getPortmap :: IO (Integer, Integer)
getPortmap = do
[pub, priv] <- getArgs
return (read pub, read priv)
whichControlPort :: IO Integer
whichControlPort = do
ports <- Tor.detectPort [9051, 9151]
return (head ports)
main = withSocketsDo $ do
torPort <- whichControlPort
portmap <- getPortmap
Tor.withSession torPort (withinSession portmap)
return ()
where
withinSession (publicPort, privatePort) controlSock = do
onion <- Tor.accept controlSock publicPort (newConnection privatePort)
putStrLn ("hidden service descriptor: " ++ show onion)
-- If we would leave this function at this point, our connection with
-- the Tor control service would be lost, which would cause Tor to clean
-- up any mappings and hidden services we have registered.
--
-- Since this is just an example, we will now wait for 5 minutes and then
-- exit.
threadDelay 300000000
newConnection privatePort sock = do
putStrLn "Got new connection!"
return ()