From 68f5d56115c2e4011b9a9be7c2585c1fe43f4957 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 28 Dec 2016 12:21:52 -0400 Subject: remotedaemon: notice on RELOAD when tor hidden service has been enabled and start serving it. This makes the webapp wormhole tor pairing work 100%! This commit was sponsored by Andrea Rota. --- RemoteDaemon/Transport/Tor.hs | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'RemoteDaemon/Transport') diff --git a/RemoteDaemon/Transport/Tor.hs b/RemoteDaemon/Transport/Tor.hs index e7d3794d6..2a2ceccca 100644 --- a/RemoteDaemon/Transport/Tor.hs +++ b/RemoteDaemon/Transport/Tor.hs @@ -34,14 +34,25 @@ import Control.Concurrent.STM.TBMQueue import Control.Concurrent.Async -- Run tor hidden service. -server :: TransportHandle -> IO () -server th@(TransportHandle (LocalRepo r) _) = do - u <- liftAnnex th getUUID - uid <- getRealUserID - let ident = fromUUID u - go u =<< getHiddenServiceSocketFile torAppName uid ident +server :: Server +server ichan th@(TransportHandle (LocalRepo r) _) = go where - go u (Just sock) = do + go = checkstartservice >>= handlecontrol + + checkstartservice = do + u <- liftAnnex th getUUID + uid <- getRealUserID + let ident = fromUUID u + msock <- getHiddenServiceSocketFile torAppName uid ident + case msock of + Nothing -> do + debugM "remotedaemon" "Tor hidden service not enabled" + return False + Just sock -> do + void $ async $ startservice sock u + return True + + startservice sock u = do q <- newTBMQueueIO maxConnections replicateM_ maxConnections $ forkIO $ forever $ serveClient th u r q @@ -57,7 +68,18 @@ server th@(TransportHandle (LocalRepo r) _) = do unless ok $ do hClose conn warningIO "dropped Tor connection, too busy" - go _ Nothing = debugM "remotedaemon" "Tor hidden service not enabled" + + handlecontrol servicerunning = do + msg <- atomically $ readTChan ichan + case msg of + -- On reload, the configuration may have changed to + -- enable the tor hidden service. If it was not + -- enabled before, start it, + RELOAD | not servicerunning -> go + -- We can ignore all other messages; no need + -- to restart the hidden service when the network + -- changes as tor takes care of all that. + _ -> handlecontrol servicerunning -- How many clients to serve at a time, maximum. This is to avoid DOS attacks. maxConnections :: Int -- cgit v1.2.3