remotedaemon: serve tor hidden service
This commit is contained in:
parent
a101b8de37
commit
74691ddf0e
8 changed files with 83 additions and 11 deletions
|
@ -45,7 +45,9 @@ runInteractive = do
|
|||
let controller = runController ichan ochan
|
||||
|
||||
-- If any thread fails, the rest will be killed.
|
||||
void $ tryIO $ reader `concurrently` writer `concurrently` controller
|
||||
void $ tryIO $ reader
|
||||
`concurrently` writer
|
||||
`concurrently` controller
|
||||
|
||||
runNonInteractive :: IO ()
|
||||
runNonInteractive = do
|
||||
|
@ -59,7 +61,9 @@ runNonInteractive = do
|
|||
void $ atomically $ readTChan ochan
|
||||
let controller = runController ichan ochan
|
||||
|
||||
void $ tryIO $ reader `concurrently` writer `concurrently` controller
|
||||
void $ tryIO $ reader
|
||||
`concurrently` writer
|
||||
`concurrently` controller
|
||||
|
||||
type RemoteMap = M.Map Git.Repo (IO (), TChan Consumed)
|
||||
|
||||
|
@ -70,6 +74,7 @@ runController ichan ochan = do
|
|||
h <- genTransportHandle
|
||||
m <- genRemoteMap h ochan
|
||||
startrunning m
|
||||
mapM_ (\s -> async (s h)) remoteServers
|
||||
go h False m
|
||||
where
|
||||
go h paused m = do
|
||||
|
|
|
@ -10,6 +10,7 @@ module RemoteDaemon.Transport where
|
|||
import RemoteDaemon.Types
|
||||
import qualified RemoteDaemon.Transport.Ssh
|
||||
import qualified RemoteDaemon.Transport.GCrypt
|
||||
import qualified RemoteDaemon.Transport.Tor
|
||||
import qualified Git.GCrypt
|
||||
|
||||
import qualified Data.Map as M
|
||||
|
@ -22,3 +23,6 @@ remoteTransports = M.fromList
|
|||
[ ("ssh:", RemoteDaemon.Transport.Ssh.transport)
|
||||
, (Git.GCrypt.urlScheme, RemoteDaemon.Transport.GCrypt.transport)
|
||||
]
|
||||
|
||||
remoteServers :: [TransportHandle -> IO ()]
|
||||
remoteServers = [RemoteDaemon.Transport.Tor.server]
|
||||
|
|
51
RemoteDaemon/Transport/Tor.hs
Normal file
51
RemoteDaemon/Transport/Tor.hs
Normal file
|
@ -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
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue