encryption key management working

Encrypted remotes don't yet encrypt data, but git annex initremote can
be used to generate a cipher and add additional gpg keys that can use it.
This commit is contained in:
Joey Hess 2011-04-16 13:25:27 -04:00
parent 480d780297
commit 7fdf20f577
4 changed files with 120 additions and 51 deletions

View file

@ -26,8 +26,9 @@ import Locations
import Config
import Utility
import Messages
import Remote.Special
import Ssh
import Remote.Special
import Remote.Encrypted
type BupRepo = String
@ -66,10 +67,7 @@ bupSetup u c = do
let buprepo = case M.lookup "buprepo" c of
Nothing -> error "Specify buprepo="
Just r -> r
case M.lookup "encryption" c of
Nothing -> error "Specify encryption=key or encryption=none"
Just "none" -> return ()
Just _ -> error "encryption keys not yet supported"
c' <- encryptionSetup c
-- bup init will create the repository.
-- (If the repository already exists, bup init again appears safe.)
@ -81,9 +79,9 @@ bupSetup u c = do
-- The buprepo is stored in git config, as well as this repo's
-- persistant state, so it can vary between hosts.
gitConfigSpecialRemote u c "buprepo" buprepo
gitConfigSpecialRemote u c' "buprepo" buprepo
return $ M.delete "directory" c
return c'
bupParams :: String -> BupRepo -> [CommandParam] -> [CommandParam]
bupParams command buprepo params =

31
Remote/Encrypted.hs Normal file
View file

@ -0,0 +1,31 @@
{- common functions for encrypted remotes
-
- Copyright 2011 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Remote.Encrypted where
import qualified Data.Map as M
import Control.Monad.State (liftIO)
import Types
import RemoteClass
import Crypto
{- Encryption setup for a remote. The user must specify whether to use
- an encryption key, or not encrypt. An encrypted cipher is created, or is
- updated to be accessible to an additional encryption key. -}
encryptionSetup :: RemoteConfig -> Annex RemoteConfig
encryptionSetup c =
case (M.lookup "encryption" c, extractCipher c) of
(Nothing, Nothing) -> error "Specify encryption=key or encryption=none"
(Just "none", _) -> return c
(Nothing, Just _) -> return c
(Just _, Nothing) -> use $ genCipher c
(Just _, Just v) -> use $ updateCipher c v
where
use a = do
cipher <- liftIO a
return $ M.delete "encryption" $ storeCipher c cipher

View file

@ -28,6 +28,7 @@ import Messages
import Locations
import Config
import Remote.Special
import Remote.Encrypted
remote :: RemoteType Annex
remote = RemoteType {
@ -81,11 +82,8 @@ s3Connection c = do
s3Setup :: UUID -> RemoteConfig -> Annex RemoteConfig
s3Setup u c = do
-- verify configuration is sane
case M.lookup "encryption" c of
Nothing -> error "Specify encryption=key or encryption=none"
Just "none" -> return ()
Just _ -> error "encryption keys not yet supported"
let fullconfig = M.union c defaults
c' <- encryptionSetup c
let fullconfig = M.union c' defaults
-- check bucket location to see if the bucket exists, and create it
let datacenter = fromJust $ M.lookup "datacenter" fullconfig