Support all common locations of the torrc file.

This commit is contained in:
Joey Hess 2016-12-28 15:12:31 -04:00
parent 924fdea53f
commit 10e4d93212
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
2 changed files with 16 additions and 4 deletions

View file

@ -30,6 +30,7 @@ git-annex (6.20170101) UNRELEASED; urgency=medium
* enable-tor: No longer needs to be run as root.
* enable-tor: When run as a regular user, test a connection back to
the hidden service over tor.
* Support all common locations of the torrc file.
* Always use filesystem encoding for all file and handle reads and
writes.
* Fix build with directory-1.3.

View file

@ -55,7 +55,7 @@ connectHiddenService (OnionAddress address) port = do
addHiddenService :: AppName -> UserID -> UniqueIdent -> IO (OnionAddress, OnionPort)
addHiddenService appname uid ident = do
prepHiddenServiceSocketDir appname uid ident
ls <- lines <$> readFile torrc
ls <- lines <$> (readFile =<< findTorrc)
let portssocks = mapMaybe (parseportsock . separate isSpace) ls
case filter (\(_, s) -> s == sockfile) portssocks of
((p, _s):_) -> waithiddenservice 1 p
@ -63,6 +63,7 @@ addHiddenService appname uid ident = do
highports <- R.getStdRandom mkhighports
let newport = Prelude.head $
filter (`notElem` map fst portssocks) highports
torrc <- findTorrc
writeFile torrc $ unlines $
ls ++
[ ""
@ -129,7 +130,7 @@ hiddenServiceSocketFile appname uid ident = varLibDir </> appname </> show uid +
-- the specified UniqueIdent.
getHiddenServiceSocketFile :: AppName -> UserID -> UniqueIdent -> IO (Maybe FilePath)
getHiddenServiceSocketFile _appname uid ident =
parse . map words . lines <$> catchDefaultIO "" (readFile torrc)
parse . map words . lines <$> catchDefaultIO "" (readFile =<< findTorrc)
where
parse [] = Nothing
parse (("HiddenServiceDir":hsdir:[]):("HiddenServicePort":_hsport:hsaddr:[]):rest)
@ -153,8 +154,18 @@ prepHiddenServiceSocketDir appname uid ident = do
where
d = takeDirectory $ hiddenServiceSocketFile appname uid ident
torrc :: FilePath
torrc = "/etc/tor/torrc"
-- | Finds the system's torrc file, in any of the typical locations of it.
-- Returns the first found. If there is no system torrc file, defaults to
-- /etc/tor/torrc.
findTorrc :: IO FilePath
findTorrc = fromMaybe "/etc/tor/torrc" <$> firstM doesFileExist
-- Debian
[ "/etc/tor/torrc"
-- Some systems put it here instead.
, "/etc/torrc"
-- Default when installed from source
, "/usr/local/etc/tor/torrc"
]
torLibDir :: FilePath
torLibDir = "/var/lib/tor"