aboutsummaryrefslogtreecommitdiff
path: root/RemoteDaemon/Transport
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-11-20 15:45:01 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-11-20 15:48:12 -0400
commitdce8e76ef443e33d88b8301c86ebf080fceff511 (patch)
tree204d7f7b2eaaeaa4acd7ed2e1182fb208b829c2c /RemoteDaemon/Transport
parent8e28135b26db1c920ebde7438db9bad87d3026ee (diff)
remotedaemon: serve tor hidden service
Diffstat (limited to 'RemoteDaemon/Transport')
-rw-r--r--RemoteDaemon/Transport/Tor.hs51
1 files changed, 51 insertions, 0 deletions
diff --git a/RemoteDaemon/Transport/Tor.hs b/RemoteDaemon/Transport/Tor.hs
new file mode 100644
index 000000000..1527939b1
--- /dev/null
+++ b/RemoteDaemon/Transport/Tor.hs
@@ -0,0 +1,51 @@
+{- git-remote-daemon, tor hidden service transport
+ -
+ - Copyright 2016 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module RemoteDaemon.Transport.Tor (server) where
+
+import Common
+import RemoteDaemon.Types
+import RemoteDaemon.Common
+import Utility.Tor
+import Utility.FileMode
+import Remote.Helper.P2P
+import Remote.Helper.P2P.IO
+import Annex.UUID
+import Types.UUID
+
+import System.PosixCompat.User
+import Network.Socket
+import Control.Concurrent
+import System.Log.Logger (debugM)
+
+-- Run tor hidden service.
+server :: TransportHandle -> IO ()
+server th@(TransportHandle (LocalRepo r) _) = do
+ u <- liftAnnex th getUUID
+ uid <- getRealUserID
+ let ident = fromUUID u
+ let sock = socketFile uid ident
+ nukeFile sock
+ soc <- socket AF_UNIX Stream defaultProtocol
+ bind soc (SockAddrUnix sock)
+ -- Allow everyone to read and write to the socket; tor is probably
+ -- running as a different user. Connections have to authenticate
+ -- to do anything, so it's fine that other local users can connect.
+ modifyFileMode sock $ addModes
+ [groupReadMode, groupWriteMode, otherReadMode, otherWriteMode]
+ listen soc 2
+ debugM "remotedaemon" "tor hidden service running"
+ forever $ do
+ (conn, _) <- accept soc
+ forkIO $ do
+ debugM "remotedaemon" "handling a connection"
+ h <- socketToHandle conn ReadWriteMode
+ hSetBuffering h LineBuffering
+ hSetBinaryMode h False
+ runNetProtoHandle h r (serve u)
+ hClose h
+