
On Thu, 2014-12-18 at 23:25 +0100, Joachim Breitner wrote:
Dear ardumont,
Hi,
I started using pass and was about to implement a prompt on my own when I noticed that you already did something in that direction. But from reading the code, I have a some worries:
I’d expect the getPasswords :: String -> IO [String] getPasswords passwordStoreDir = liftM (map takeBaseName) $ getDirectoryContents passwordStoreDir to break if the passwords are stored in subdirectories. I believe you need to recursively traverse the directory.
It would be cleaner if you could simply ask pass for the list of passwords, but that does not seem to be possible. Maybe you should contact the author and suggest a new parameter to "pass list" that would change the output to be a simple list, instead of the tree output.
I use something like this to get a list of all passwords: getPasswords :: String -> IO [String] getPasswords passwordStoreDir = do files <- runProcessWithInput "find" [ passwordStoreDir, "-type", "f", "-name", "*.gpg", "-printf", "%P\n"] [] return $ map removeGpgExtension $ lines files removeGpgExtension :: String -> String removeGpgExtension file = if isSuffixOf ".gpg" file then reverse $ drop 4 $ reverse file else file It is not relay nice, but it works.
Also, code like selectPassword passLabel = spawn $ "pass --clip " ++ passLabel could be a problem if the password label contains shell characters. You probably want to use safeSpawn from XMonad.Util.Run.
Greetings, Joachim
Alex