summaryrefslogtreecommitdiff
path: root/Remote
diff options
context:
space:
mode:
authorGravatar guilhem <guilhem@fripost.org>2013-08-28 04:24:14 +0200
committerGravatar Joey Hess <joey@kitenet.net>2013-08-29 14:31:33 -0400
commitd9fcbfa495a981ce0afc0d66560bd90eff8559bf (patch)
treefe2acb468ac8e2c70726a0153bb52b4044c9ec68 /Remote
parentc0a39909829a131e4216b2f6021430fcbdad30b4 (diff)
Allow revocation of OpenPGP keys.
/!\ It is to be noted that revoking a key does NOT necessarily prevent the owner of its private part from accessing data on the remote /!\ The only sound use of `keyid-=` is probably to replace a (sub-)key by another, where the private part of both is owned by the same person/entity: git annex enableremote myremote keyid-=2512E3C7 keyid+=788A3F4C Reference: http://git-annex.branchable.com/bugs/Using_a_revoked_GPG_key/ * Other change introduced by this patch: New keys now need to be added with option `keyid+=`, and the scheme specified (upon initremote only) with `encryption=`. The motivation for this change is to open for new schemes, e.g., strict asymmetric encryption. git annex initremote myremote encryption=hybrid keyid=2512E3C7 git annex enableremote myremote keyid+=788A3F4C
Diffstat (limited to 'Remote')
-rw-r--r--Remote/Helper/Encryptable.hs42
1 files changed, 26 insertions, 16 deletions
diff --git a/Remote/Helper/Encryptable.hs b/Remote/Helper/Encryptable.hs
index 22e1c9fc0..63efcb378 100644
--- a/Remote/Helper/Encryptable.hs
+++ b/Remote/Helper/Encryptable.hs
@@ -23,27 +23,37 @@ import Utility.Metered
- updated to be accessible to an additional encryption key. Or the user
- could opt to use a shared cipher, which is stored unencrypted. -}
encryptionSetup :: RemoteConfig -> Annex RemoteConfig
-encryptionSetup c = case (M.lookup "encryption" c, extractCipher c) of
- (Nothing, Nothing) -> error "Specify encryption=key or encryption=none or encryption=shared"
- (Just "none", Nothing) -> return c
- (Nothing, Just _) -> return c
- (Just "shared", Just (SharedCipher _)) -> return c
- (Just "none", Just _) -> cannotchange
- (Just "shared", Just (EncryptedCipher _ _)) -> cannotchange
- (Just _, Just (SharedCipher _)) -> cannotchange
- (Just "shared", Nothing) -> use "encryption setup" . genSharedCipher
- =<< highRandomQuality
- (Just keyid, Nothing) -> use "encryption setup" . genEncryptedCipher keyid
- =<< highRandomQuality
- (Just keyid, Just v) -> use "encryption update" $ updateEncryptedCipher keyid v
+encryptionSetup c = maybe genCipher updateCipher $ extractCipher c
where
- cannotchange = error "Cannot change encryption type of existing remote."
+ -- The type of encryption
+ encryption = M.lookup "encryption" c
+ -- Generate a new cipher, depending on the chosen encryption scheme
+ genCipher = case encryption of
+ Just "none" -> return c
+ Just "shared" -> use "encryption setup" . genSharedCipher
+ =<< highRandomQuality
+ -- hybrid encryption by default
+ _ | maybe True (== "hybrid") encryption ->
+ use "encryption setup" . genEncryptedCipher key
+ =<< highRandomQuality
+ _ -> error "Specify encryption=none or encryption=shared or encryption=hybrid (default)."
+ key = fromMaybe (error "Specifiy keyid=...") $ M.lookup "keyid" c
+ newkeys = maybe [] (\k -> [(True,k)]) (M.lookup "keyid+" c) ++
+ maybe [] (\k -> [(False,k)]) (M.lookup "keyid-" c)
+ -- Update an existing cipher if possible.
+ updateCipher v
+ | isJust encryption = error "Cannot set encryption type of existing remote."
+ | otherwise = case v of
+ SharedCipher{} -> return c
+ EncryptedCipher{} ->
+ use "encryption update" $ updateEncryptedCipher newkeys v
use m a = do
showNote m
cipher <- liftIO a
showNote $ describeCipher cipher
- return $ M.delete "encryption" $ M.delete "highRandomQuality" $
- storeCipher c cipher
+ return $ flip storeCipher cipher $ foldr M.delete c
+ [ "keyid", "keyid+", "keyid-"
+ , "encryption", "highRandomQuality" ]
highRandomQuality =
(&&) (maybe True ( /= "false") $ M.lookup "highRandomQuality" c)
<$> fmap not (Annex.getState Annex.fast)