2013-03-19 20:58:36 +00:00
|
|
|
{- git-annex command, used internally by assistant
|
|
|
|
-
|
2015-01-21 16:50:09 +00:00
|
|
|
- Copyright 2012, 2013 Joey Hess <id@joeyh.name>
|
2013-03-19 20:58:36 +00:00
|
|
|
-
|
2019-03-13 19:48:14 +00:00
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2013-03-19 20:58:36 +00:00
|
|
|
-}
|
|
|
|
|
|
|
|
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
|
|
|
|
|
|
|
|
module Command.TransferKeys where
|
|
|
|
|
|
|
|
import Command
|
|
|
|
import Annex.Content
|
|
|
|
import Logs.Location
|
2014-03-22 14:42:38 +00:00
|
|
|
import Annex.Transfer
|
2013-03-19 20:58:36 +00:00
|
|
|
import qualified Remote
|
2015-04-03 19:33:28 +00:00
|
|
|
import Utility.SimpleProtocol (dupIoHandles)
|
2014-05-19 20:19:33 +00:00
|
|
|
import Git.Types (RemoteName)
|
2016-05-16 18:49:12 +00:00
|
|
|
import qualified Database.Keys
|
2020-04-09 17:54:43 +00:00
|
|
|
import Annex.BranchState
|
2013-03-19 20:58:36 +00:00
|
|
|
|
|
|
|
data TransferRequest = TransferRequest Direction Remote Key AssociatedFile
|
|
|
|
|
2015-07-08 16:33:27 +00:00
|
|
|
cmd :: Command
|
2015-07-08 19:08:02 +00:00
|
|
|
cmd = command "transferkeys" SectionPlumbing "transfers keys"
|
|
|
|
paramNothing (withParams seek)
|
2013-03-19 20:58:36 +00:00
|
|
|
|
2015-07-08 19:08:02 +00:00
|
|
|
seek :: CmdParams -> CommandSeek
|
2018-10-01 18:12:06 +00:00
|
|
|
seek = withNothing (commandAction start)
|
2013-03-19 20:58:36 +00:00
|
|
|
|
2013-12-11 03:19:18 +00:00
|
|
|
start :: CommandStart
|
2014-04-08 18:02:25 +00:00
|
|
|
start = do
|
2020-04-09 17:54:43 +00:00
|
|
|
enableInteractiveJournalAccess
|
2015-04-03 19:33:28 +00:00
|
|
|
(readh, writeh) <- liftIO dupIoHandles
|
2013-12-11 03:19:18 +00:00
|
|
|
runRequests readh writeh runner
|
2013-03-19 20:58:36 +00:00
|
|
|
stop
|
|
|
|
where
|
|
|
|
runner (TransferRequest direction remote key file)
|
2014-03-22 14:42:38 +00:00
|
|
|
| direction == Upload = notifyTransfer direction file $
|
2018-03-29 17:04:07 +00:00
|
|
|
upload (Remote.uuid remote) key file stdRetry $ \p -> do
|
2020-05-13 18:03:00 +00:00
|
|
|
tryNonAsync (Remote.storeKey remote key file p) >>= \case
|
|
|
|
Left e -> do
|
|
|
|
warning (show e)
|
|
|
|
return False
|
|
|
|
Right () -> do
|
|
|
|
Remote.logStatus remote key InfoPresent
|
|
|
|
return True
|
2014-03-22 14:42:38 +00:00
|
|
|
| otherwise = notifyTransfer direction file $
|
2018-03-29 17:04:07 +00:00
|
|
|
download (Remote.uuid remote) key file stdRetry $ \p ->
|
2018-06-21 17:34:11 +00:00
|
|
|
getViaTmp (Remote.retrievalSecurityPolicy remote) (RemoteVerify remote) key $ \t -> do
|
2020-05-13 21:05:56 +00:00
|
|
|
r <- tryNonAsync (Remote.retrieveKeyFile remote key file t p) >>= \case
|
|
|
|
Left e -> do
|
|
|
|
warning (show e)
|
|
|
|
return (False, UnVerified)
|
|
|
|
Right v -> return (True, v)
|
2016-05-16 18:49:12 +00:00
|
|
|
-- Make sure we get the current
|
|
|
|
-- associated files data for the key,
|
|
|
|
-- not old cached data.
|
|
|
|
Database.Keys.closeDb
|
|
|
|
return r
|
2013-03-19 20:58:36 +00:00
|
|
|
|
|
|
|
runRequests
|
|
|
|
:: Handle
|
|
|
|
-> Handle
|
|
|
|
-> (TransferRequest -> Annex Bool)
|
|
|
|
-> Annex ()
|
2013-03-20 17:18:12 +00:00
|
|
|
runRequests readh writeh a = do
|
2016-12-24 18:46:31 +00:00
|
|
|
liftIO $ hSetBuffering readh NoBuffering
|
2013-03-20 17:18:12 +00:00
|
|
|
go =<< readrequests
|
2013-03-19 20:58:36 +00:00
|
|
|
where
|
2014-10-09 18:53:13 +00:00
|
|
|
go (d:rn:k:f:rest) = do
|
2014-05-19 20:19:33 +00:00
|
|
|
case (deserialize d, deserialize rn, deserialize k, deserialize f) of
|
|
|
|
(Just direction, Just remotename, Just key, Just file) -> do
|
|
|
|
mremote <- Remote.byName' remotename
|
2013-03-19 20:58:36 +00:00
|
|
|
case mremote of
|
2014-05-19 20:19:33 +00:00
|
|
|
Left _ -> sendresult False
|
|
|
|
Right remote -> sendresult =<< a
|
2013-03-19 20:58:36 +00:00
|
|
|
(TransferRequest direction remote key file)
|
|
|
|
_ -> sendresult False
|
|
|
|
go rest
|
2013-04-02 19:18:03 +00:00
|
|
|
go [] = noop
|
|
|
|
go [""] = noop
|
|
|
|
go v = error $ "transferkeys protocol error: " ++ show v
|
2013-03-19 20:58:36 +00:00
|
|
|
|
|
|
|
readrequests = liftIO $ split fieldSep <$> hGetContents readh
|
|
|
|
sendresult b = liftIO $ do
|
|
|
|
hPutStrLn writeh $ serialize b
|
|
|
|
hFlush writeh
|
|
|
|
|
2014-05-19 20:19:33 +00:00
|
|
|
sendRequest :: Transfer -> TransferInfo -> Handle -> IO ()
|
2015-07-09 20:05:45 +00:00
|
|
|
sendRequest t tinfo h = do
|
2013-04-23 00:24:53 +00:00
|
|
|
hPutStr h $ intercalate fieldSep
|
2013-03-19 22:46:29 +00:00
|
|
|
[ serialize (transferDirection t)
|
2019-01-01 17:49:19 +00:00
|
|
|
, maybe (serialize ((fromUUID (transferUUID t)) :: String))
|
2014-05-19 20:19:33 +00:00
|
|
|
(serialize . Remote.name)
|
2015-07-09 20:05:45 +00:00
|
|
|
(transferRemote tinfo)
|
2013-03-19 22:46:29 +00:00
|
|
|
, serialize (transferKey t)
|
2015-07-09 20:05:45 +00:00
|
|
|
, serialize (associatedFile tinfo)
|
2013-03-20 17:18:12 +00:00
|
|
|
, "" -- adds a trailing null
|
2013-03-19 20:58:36 +00:00
|
|
|
]
|
|
|
|
hFlush h
|
|
|
|
|
2013-03-19 22:46:29 +00:00
|
|
|
readResponse :: Handle -> IO Bool
|
|
|
|
readResponse h = fromMaybe False . deserialize <$> hGetLine h
|
|
|
|
|
2013-03-19 20:58:36 +00:00
|
|
|
fieldSep :: String
|
|
|
|
fieldSep = "\0"
|
|
|
|
|
2014-01-21 20:08:19 +00:00
|
|
|
class TCSerialized a where
|
2013-03-19 20:58:36 +00:00
|
|
|
serialize :: a -> String
|
|
|
|
deserialize :: String -> Maybe a
|
|
|
|
|
2014-01-21 20:08:19 +00:00
|
|
|
instance TCSerialized Bool where
|
2013-03-19 20:58:36 +00:00
|
|
|
serialize True = "1"
|
|
|
|
serialize False = "0"
|
|
|
|
deserialize "1" = Just True
|
|
|
|
deserialize "0" = Just False
|
|
|
|
deserialize _ = Nothing
|
|
|
|
|
2014-01-21 20:08:19 +00:00
|
|
|
instance TCSerialized Direction where
|
2013-03-19 20:58:36 +00:00
|
|
|
serialize Upload = "u"
|
|
|
|
serialize Download = "d"
|
|
|
|
deserialize "u" = Just Upload
|
|
|
|
deserialize "d" = Just Download
|
|
|
|
deserialize _ = Nothing
|
|
|
|
|
2014-01-21 20:08:19 +00:00
|
|
|
instance TCSerialized AssociatedFile where
|
2019-12-05 15:40:10 +00:00
|
|
|
serialize (AssociatedFile (Just f)) = fromRawFilePath f
|
2017-03-10 17:12:24 +00:00
|
|
|
serialize (AssociatedFile Nothing) = ""
|
|
|
|
deserialize "" = Just (AssociatedFile Nothing)
|
2019-12-05 15:40:10 +00:00
|
|
|
deserialize f = Just (AssociatedFile (Just (toRawFilePath f)))
|
2013-03-19 20:58:36 +00:00
|
|
|
|
2014-05-19 20:19:33 +00:00
|
|
|
instance TCSerialized RemoteName where
|
|
|
|
serialize n = n
|
|
|
|
deserialize n = Just n
|
2013-03-19 20:58:36 +00:00
|
|
|
|
2014-01-21 20:08:19 +00:00
|
|
|
instance TCSerialized Key where
|
2019-01-14 17:03:35 +00:00
|
|
|
serialize = serializeKey
|
|
|
|
deserialize = deserializeKey
|