{-# LANGUAGE OverloadedStrings #-} module Main (main) where import Data.ByteString.UTF8 (fromString) import Database.SQLite.Simple import System.Hclip import qualified UserInterface as Ui import qualified Database as Db import qualified Crypto as Cr import qualified Utils as Ut main :: IO () main = do conn <- Db.init_connection Ut.clear_screen putStrLn "Welcome to Hassword Manager!!!" welcome_screen conn mpass <- open_hassword_book conn putStrLn mpass setClipboard mpass -- application_loop conn Db.close_connection conn welcome_screen :: Connection -> IO () welcome_screen conn = do first <- Db.is_it_first_app_usage conn if first then do Ut.set_green putStrLn "It seems like you are using this application for the first time." Ut.reset_color create_mpass conn else return () create_mpass :: Connection -> IO () create_mpass conn = do res <- input_new_valid_mpass case res of Ut.Valid mpass -> do Db.insert_new_mpass conn (Cr.hash' $ fromString mpass) Ut.DoNotMatch -> do Ut.set_red putStrLn "Passwords do not match!!!\n" Ut.reset_color create_mpass conn Ut.TooShort -> do Ut.set_red putStrLn "Password is too short!!!\n" Ut.reset_color create_mpass conn Ut.Empty -> do Ut.set_red putStrLn "Password cannot be empty!!!\n" Ut.reset_color create_mpass conn input_new_valid_mpass :: IO (Ut.MasterPasswordValidationCases) input_new_valid_mpass = do (password1:password2:_) <- sequence [putStrLn "Please Enter new MASTER PASSWORD:" >> Ut.get_password, putStrLn "Confirm password:" >> Ut.get_password] return $ Ut.validate_password password1 password2 open_hassword_book :: Connection -> IO (String) open_hassword_book conn = do putStrLn "Please Enter your MASTER PASSWORD:" mpass <- Ut.get_password res <- Db.check_if_mpass_valid conn (Cr.hash' $ fromString mpass) if res then return mpass else do Ut.set_red putStrLn "Invalid MASTER PASSWORD!!!\n" Ut.reset_color open_hassword_book conn application_loop :: Connection -> IO () application_loop conn = do putStrLn "What would you like to do?" application_loop conn