summaryrefslogtreecommitdiff
path: root/Command
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-10-01 14:10:45 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-10-01 14:19:24 -0400
commit36d4d018420da4c515a8b6e4a8a7ba1caee0c6a7 (patch)
treef5906d4c0cda37136240232329e5e08a497b27c4 /Command
parent8cc8977ecce88853d2fa185e2372c412308b112f (diff)
fix transferring to gcrypt repo from direct mode repo
recvkey was told it was receiving a HMAC key from a direct mode repo, and that confused it into rejecting the transfer, since it has no way to verify a key using that backend, since there is no HMAC backend. I considered making recvkey skip verification in the case of an unknown backend. However, that could lead to bad results; a key can legitimately be in the annex with a backend that the remote git-annex-shell doesn't know about. Better to keep it rejecting if it cannot verify. Instead, made the gcrypt special remote not set the direct mode flag when sending (and receiving) files. Also, added some recvkey messages when its checks fail, since otherwise all that is shown is a confusing error message from rsync when the remote git-annex-shell exits nonzero.
Diffstat (limited to 'Command')
-rw-r--r--Command/RecvKey.hs17
1 files changed, 14 insertions, 3 deletions
diff --git a/Command/RecvKey.hs b/Command/RecvKey.hs
index eb2c88ca9..3b2a8c496 100644
--- a/Command/RecvKey.hs
+++ b/Command/RecvKey.hs
@@ -72,7 +72,18 @@ start key = ifM (inAnnex key)
return $ size == size'
if oksize
then case Backend.maybeLookupBackendName (Types.Key.keyBackendName key) of
- Nothing -> return False
- Just backend -> maybe (return True) (\a -> a key tmp)
+ Nothing -> do
+ warning "recvkey: received key from direct mode repository using unknown backend; cannot check; discarding"
+ return False
+ Just backend -> maybe (return True) runfsck
(Types.Backend.fsckKey backend)
- else return False
+ else do
+ warning "recvkey: received key with wrong size; discarding"
+ return False
+ where
+ runfsck check = ifM (check key tmp)
+ ( return True
+ , do
+ warning "recvkey: received key from direct mode repository seems to have changed as it was transferred; discarding"
+ return False
+ )