-------------------------------------------------------------------------------- -- rofi-bw - a rofi prompt for a bitwarden vault -- -- This is basically a wrapper around the 'bw' command, which is assumed to be -- properly configured before running this command. This shows a system of -- menus that allows easy lookup of data associated with a vault entry. For now -- only lookups (no edits or creation) are supported, and only logins can be -- searched. Any searched entry can be copied to the clipboard -- -- In order to manage the session keys, this utility is split into a daemon and -- client (the former holds the session keys between calls with the latter). -- They communicate via dbus. -- -- Most of the heavy-lifting code for this executable is in Bitwarden.Internal -- to allow parts of this greater rofi library to use the DBus API module Main (main) where import Bitwarden.Internal import RIO import RIO.Directory import qualified RIO.Text as T import UnliftIO.Environment main :: IO () main = runSimpleApp $ runChecks >> getArgs >>= parse -- TODO check if daemon is running when running client parse :: HasLogFunc c => [String] -> RIO c () parse ["-d", t] = case readMaybe t of Just t' -> runDaemon t'; _ -> usage parse ("-c" : args) = runClient $ fmap T.pack args parse _ = usage usage :: (HasLogFunc c, MonadReader c m, MonadUnliftIO m) => m () usage = logInfo $ displayBytesUtf8 $ encodeUtf8 $ T.unlines [ "daemon mode: rofi-bw -d TIMEOUT" , "client mode: rofi-bw -c [ROFI-ARGS]" ] runChecks :: (HasLogFunc c, MonadReader c m, MonadUnliftIO m) => m () runChecks = checkExe "bw" >> checkExe "rofi" -- TODO not DRY checkExe :: (HasLogFunc c, MonadReader c m, MonadUnliftIO m) => String -> m () checkExe cmd = do res <- findExecutable cmd unless (isJust res) $ do logError $ displayBytesUtf8 $ encodeUtf8 $ T.append "Could not find executable: " $ T.pack cmd exitWith $ ExitFailure 1