diff options
author | Joey Hess <joey@kitenet.net> | 2013-09-18 15:30:53 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-09-18 15:55:31 -0400 |
commit | 4c86cf524c7a6161af3c9fbb56f61c3cb6305fef (patch) | |
tree | 745db48f9b7a2fa42894ed7f3182408ba3cc2e72 /Remote | |
parent | ba037cce74469e7e28019b63cdea55e8400bc5e7 (diff) |
webapp: support adding existing gcrypt special remotes from removable drives
When adding a removable drive, it's now detected if the drive contains
a gcrypt special remote, and that's all handled nicely. This includes
fetching the git-annex branch from the gcrypt repo in order to find
out how to set up the special remote.
Note that gcrypt repos that are not git-annex special remotes are not
supported. It will attempt to detect such a gcrypt repo and refuse
to use it. (But this is hard to do any may fail; see
https://github.com/blake2-ppc/git-remote-gcrypt/issues/6)
The problem with supporting regular gcrypt repos is that we don't know
what the gcrypt.participants setting is intended to be for the repo.
So even if we can decrypt it, if we push changes to it they might not be
visible to other participants.
Anyway, encrypted sneakernet (or mailnet) is now fully possible with the
git-annex assistant! Assuming that the gpg key distribution is handled
somehow, which the assistant doesn't yet help with.
This commit was sponsored by Navishkar Rao.
Diffstat (limited to 'Remote')
-rw-r--r-- | Remote/GCrypt.hs | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/Remote/GCrypt.hs b/Remote/GCrypt.hs index 70f82f667..d5448ca64 100644 --- a/Remote/GCrypt.hs +++ b/Remote/GCrypt.hs @@ -5,7 +5,7 @@ - Licensed under the GNU GPL version 3 or higher. -} -module Remote.GCrypt (remote, gen) where +module Remote.GCrypt (remote, gen, getGCryptId) where import qualified Data.Map as M import qualified Data.ByteString.Lazy as L @@ -52,13 +52,10 @@ gen gcryptr u c gc = do -- get underlying git repo with real path, not gcrypt path r <- liftIO $ Git.GCrypt.encryptedRepo g gcryptr let r' = r { Git.remoteName = Git.remoteName gcryptr } - -- read config of underlying repo if it's local - r'' <- if Git.repoIsLocalUnknown r' - then liftIO $ catchDefaultIO r' $ Git.Config.read r' - else return r' + (mgcryptid, r'') <- liftIO $ getGCryptId r' -- doublecheck that local cache matches underlying repo's gcrypt-id -- (which might not be set) - case (Git.Config.getMaybe "core.gcrypt-id" r'', Git.GCrypt.remoteRepoId g (Git.remoteName gcryptr)) of + case (mgcryptid, Git.GCrypt.remoteRepoId g (Git.remoteName gcryptr)) of (Just gcryptid, Just cachedgcryptid) | gcryptid /= cachedgcryptid -> resetup gcryptid r'' _ -> gen' r'' u c gc @@ -81,6 +78,17 @@ gen gcryptr u c gc = do warning $ "not using unknown gcrypt repository pointed to by remote " ++ Git.repoDescribe r return Nothing +{- gcrypt repos set up by git-annex as special remotes have a + - core.gcrypt-id setting in their config, which can be mapped back to + - the remote's UUID. This only works for local repos. + - (Also returns a version of input repo with its config read.) -} +getGCryptId :: Git.Repo -> IO (Maybe Git.GCrypt.GCryptId, Git.Repo) +getGCryptId r + | Git.repoIsLocalUnknown r = do + r' <- catchDefaultIO r $ Git.Config.read r + return (Git.Config.getMaybe "core.gcrypt-id" r', r') + | otherwise = return (Nothing, r) + gen' :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) gen' r u c gc = do cst <- remoteCost gc $ |