diff options
| author | Joey Hess <joeyh@joeyh.name> | 2015-09-14 20:11:25 -0400 |
|---|---|---|
| committer | Joey Hess <joeyh@joeyh.name> | 2015-09-14 20:11:25 -0400 |
| commit | 9a0169f0cbdf2470e149a32f5fab8ec2369686f3 (patch) | |
| tree | c8d4dc9f3a970b7ce3622370a8ff8ee8869b413c /src/Propellor/PrivData.hs | |
| parent | 115baccc7761356ec6633202e69dfff65f53a993 (diff) | |
clean up privdata excess/lacking newline issue
* PrivData converted to newtype (API change).
* Stopped stripping trailing newlines when setting PrivData;
this was previously done to avoid mistakes when pasting eg passwords
with an unwanted newline. Instead, PrivData consumers should use either
privDataLines or privDataVal, to extract respectively lines or a
value (without internal newlines) from PrivData.
Diffstat (limited to 'src/Propellor/PrivData.hs')
| -rw-r--r-- | src/Propellor/PrivData.hs | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/Propellor/PrivData.hs b/src/Propellor/PrivData.hs index cbb296ce..b7932518 100644 --- a/src/Propellor/PrivData.hs +++ b/src/Propellor/PrivData.hs @@ -132,7 +132,7 @@ getLocalPrivData field context = where localcache = catchDefaultIO Nothing $ readish <$> readFile privDataLocal -type PrivMap = M.Map (PrivDataField, Context) PrivData +type PrivMap = M.Map (PrivDataField, Context) String -- | Get only the set of PrivData that the Host's Info says it uses. filterPrivData :: Host -> PrivMap -> PrivMap @@ -142,12 +142,14 @@ filterPrivData host = M.filterWithKey (\k _v -> S.member k used) fromPrivInfo $ getInfo $ hostInfo host getPrivData :: PrivDataField -> Context -> PrivMap -> Maybe PrivData -getPrivData field context = M.lookup (field, context) +getPrivData field context m = do + s <- M.lookup (field, context) m + return (PrivData s) setPrivData :: PrivDataField -> Context -> IO () setPrivData field context = do putStrLn "Enter private data on stdin; ctrl-D when done:" - setPrivDataTo field context =<< hGetContentsStrict stdin + setPrivDataTo field context . PrivData =<< hGetContentsStrict stdin unsetPrivData :: PrivDataField -> Context -> IO () unsetPrivData field context = do @@ -156,7 +158,8 @@ unsetPrivData field context = do dumpPrivData :: PrivDataField -> Context -> IO () dumpPrivData field context = - maybe (error "Requested privdata is not set.") putStrLn + maybe (error "Requested privdata is not set.") + (mapM_ putStrLn . privDataLines) =<< (getPrivData field context <$> decryptPrivData) editPrivData :: PrivDataField -> Context -> IO () @@ -164,11 +167,11 @@ editPrivData field context = do v <- getPrivData field context <$> decryptPrivData v' <- withTmpFile "propellorXXXX" $ \f h -> do hClose h - maybe noop (writeFileProtected f) v + maybe noop (writeFileProtected f . unlines . privDataLines) v editor <- getEnvDefault "EDITOR" "vi" unlessM (boolSystem editor [File f]) $ error "Editor failed; aborting." - readFile f + PrivData <$> readFile f setPrivDataTo field context v' listPrivDataFields :: [Host] -> IO () @@ -202,14 +205,11 @@ listPrivDataFields hosts = do putStr $ unlines $ formatTable $ tableWithHeader header rows setPrivDataTo :: PrivDataField -> Context -> PrivData -> IO () -setPrivDataTo field context value = do +setPrivDataTo field context (PrivData value) = do modifyPrivData set putStrLn "Private data set." where - set = M.insert (field, context) (chomp value) - chomp s - | end s == "\n" = chomp (beginning s) - | otherwise = s + set = M.insert (field, context) value modifyPrivData :: (PrivMap -> PrivMap) -> IO () modifyPrivData f = do |
