Support all common locations of the torrc file.
authorJoey Hess <joeyh@joeyh.name>
Wed, 28 Dec 2016 19:12:31 +0000 (15:12 -0400)
committerJoey Hess <joeyh@joeyh.name>
Wed, 28 Dec 2016 19:12:31 +0000 (15:12 -0400)
CHANGELOG
Utility/Tor.hs

index 985b9965c430c95c914ad4891b3e7670963f5b12..338249ac6e4694f770459f23e76c5392e1ecf165 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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.
index 37fbabd402d44ee942d73edbf1d54d03332660c5..218a038df9810ccc03d4d026017da30cbb1dcd7b 100644 (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"