{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} module Authenticator.Common ( hlSettings , decodePad ) where import Control.Monad.IO.Class import Data.Char import Data.Semigroup import qualified Codec.Binary.Base32 as B32 import qualified Data.ByteString as BS import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified System.Console.Haskeline as L hlSettings :: forall m. MonadIO m => L.Settings m hlSettings = (L.defaultSettings @m) { L.complete = L.noCompletion , L.autoAddHistory = False } decodePad :: T.Text -> Maybe BS.ByteString decodePad = either (const Nothing) Just . B32.decode . (\s' -> s' <> BS.replicate ((8 - BS.length s') `mod` 8) p) . T.encodeUtf8 . T.map toUpper . T.filter isAlphaNum where p = fromIntegral $ ord '='