diff options
Diffstat (limited to 'RemoteDaemon')
-rw-r--r-- | RemoteDaemon/Transport/Tor.hs | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/RemoteDaemon/Transport/Tor.hs b/RemoteDaemon/Transport/Tor.hs index 0dd1d1ba2..5ea06ac2c 100644 --- a/RemoteDaemon/Transport/Tor.hs +++ b/RemoteDaemon/Transport/Tor.hs @@ -10,6 +10,7 @@ module RemoteDaemon.Transport.Tor (server) where import Common import qualified Annex import Annex.Concurrent +import Annex.ChangedRefs import RemoteDaemon.Types import RemoteDaemon.Common import Utility.Tor @@ -71,12 +72,18 @@ maxConnections :: Int maxConnections = 10 serveClient :: TransportHandle -> UUID -> Repo -> TBQueue Handle -> IO () -serveClient th u r q = bracket setup cleanup go +serveClient th u r q = bracket setup cleanup start where - setup = atomically $ readTBQueue q - cleanup = hClose - go h = do + setup = do + h <- atomically $ readTBQueue q debugM "remotedaemon" "serving a Tor connection" + return h + + cleanup h = do + debugM "remotedaemon" "done with Tor connection" + hClose h + + start h = do -- Avoid doing any work in the liftAnnex, since only one -- can run at a time. st <- liftAnnex th dupState @@ -92,16 +99,18 @@ serveClient th u r q = bracket setup cleanup go } v <- liftIO $ runNetProto conn $ serveAuth u case v of - Right (Just theiruuid) -> void $ do - v' <- runFullProto (Serving theiruuid) conn $ - serveAuthed u - case v' of - Right () -> return () - Left e -> liftIO $ debugM "remotedaemon" ("Tor connection error: " ++ e) + Right (Just theiruuid) -> authed conn theiruuid Right Nothing -> liftIO $ debugM "remotedaemon" "Tor connection failed to authenticate" Left e -> liftIO $ debugM "remotedaemon" ("Tor connection error before authentication: " ++ e) -- Merge the duplicated state back in. liftAnnex th $ mergeState st' - debugM "remotedaemon" "done with Tor connection" + + authed conn theiruuid = + bracket watchChangedRefs (liftIO . stopWatchingChangedRefs) $ \crh -> do + v' <- runFullProto (Serving theiruuid crh) conn $ + serveAuthed u + case v' of + Right () -> return () + Left e -> liftIO $ debugM "remotedaemon" ("Tor connection error: " ++ e) |