Started building generation functionality, added useful haddock-style comments for several functions

This commit is contained in:
James Eversole 2022-07-22 12:27:35 -05:00
parent 10e3724a1a
commit b1a4251d95
11 changed files with 1703 additions and 34 deletions

View File

@ -25,6 +25,7 @@ library
Core.Templates
Core.Types
Feature.Generation.Links
Feature.Generation.Passwords
Feature.Generation.Shared
Feature.Sharing.HTTP
Feature.Sharing.SQLite

View File

@ -18,7 +18,7 @@ app = do
-- Core Routes
get "/" $ do
html $ renderIndex "/" Nothing
html $ renderIndex "/"
get "/style.css" $ do
setHeader "Content-Type" "text/css"

View File

@ -20,5 +20,5 @@ main db = do
dbPath :: PurrAction String
dbPath = do
conf <- lift ask
conf <- lift ask
return $ dbFile conf

View File

@ -13,8 +13,13 @@ import qualified Data.Text.Lazy as LT
import Prelude
renderIndex :: String -> Maybe T.Text -> LT.Text
renderIndex link password = renderHtml ( $(shamletFile "./views/index.hamlet") )
renderIndex :: String -> LT.Text
renderIndex link = renderHtml ( $(shamletFile "./views/index.hamlet") )
where
hsUserLink = userLinkAttr link
renderStyle :: LT.Text
renderStyle = renderCss ( $(cassiusFile "./views/cassius/style.cassius") "/style.css" )
userLinkAttr :: String -> (String, String)
userLinkAttr str = ("hx-vals", "{\"userLink\": \"" <> str <> "\"}")

View File

@ -20,4 +20,5 @@ data DhallConfig = DhallConfig
, applicationHost :: String
, applicationPort :: Int
, dbFile :: String
, linkLength :: Int
} deriving (Generic, Show)

View File

@ -5,30 +5,45 @@ import Feature.Generation.Shared (rIndex)
import Control.Monad.Reader (ask, lift, liftIO)
import Data.Char (toLower, toUpper)
import Data.List (foldl')
import System.IO
import System.Random
genLink :: Int -> [Char] -> IO [Char]
genLink 0 cs = return cs
genLink d cs = do
res <- rChar
fin <- rCap res
genLink (d - 1) (cs <> (fin:[]))
-- Generates a string containing randomly generated and capitalized
-- characters. The number of characters used is defined in the global config.dhall.
genLink :: PurrAction String
genLink = do
linkLength <- confLinkLength
genLink' linkLength ""
where
genLink' 0 cs = return cs
genLink' d cs = do
res <- liftIO $ randChar
fin <- liftIO $ randCapitalization res
genLink' (d - 1) (cs <> (fin:[]))
-- Defines the valid range of characters to be used when generating links.
-- This consists of all lowercase Latin alphabet characters and the
-- numbers 1 through 9.
validChars :: [Char]
validChars = ['a'..'z'] <> ['1'..'9']
rChar :: IO Char
rChar = rIndex validChars
randChar :: IO Char
randChar = rIndex validChars
rCap :: Char -> IO Char -- rCap takes a single character and returns it
rCap c = do -- capitalized or lowercased at random.
randCapitalization :: Char -> IO Char
randCapitalization c = do
capRand <- randomRIO (0,1)
return $ checkRand capRand c
return $ go capRand c
where
checkRand :: Int -> Char -> Char
checkRand r c
go :: Int -> Char -> Char
go r c
| r == 0 = toLower c
| r == 1 = toUpper c
| otherwise = c
-- Helper function in our PurrAction monad transformer stack to read
-- the desired length for generated links.
confLinkLength :: PurrAction Int
confLinkLength = do
conf <- lift ask
return $ linkLength conf

View File

@ -0,0 +1,25 @@
module Feature.Generation.Passwords where
import Core.Types
import Feature.Generation.Shared (rIndex)
import Control.Monad.Reader (ask, lift, liftIO)
import Data.Char (toLower, toUpper)
import System.IO
import System.Random
-- suggestedScheme and its helpers xkcd, oldschool, and gibberish are TODO.
suggestedScheme :: Int -> String
suggestedScheme i
| i > 23 = xkcd i
| i > 12 = oldschool i
| otherwise = gibberish i
xkcd :: Int -> String
xkcd i = take i "correcthorsebatterystaple"
oldschool :: Int -> String
oldschool i = take i "PowerProlonger2974!"
gibberish :: Int -> String
gibberish i = take i "TCYx#@z5zlgw1o"

View File

@ -21,8 +21,7 @@ routes = do
get "/pw/:id" $ do
reqId <- param "id"
res <- findByLink reqId
html $ renderIndex reqId (secret <$> res)
html $ renderIndex reqId
post "/pw" $ do
reqId <- param "userLink"
@ -31,6 +30,6 @@ routes = do
post "/new" $ do
reqSecret <- param "newSec"
link <- liftIO $ genLink 24 ""
link <- genLink
insertNewSecret reqSecret (T.pack link)
html $ renderPw link (Just reqSecret)

1618
src/wordlist Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
$doctype 5
<html>
<head>
<title>Purr
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -7,24 +8,28 @@ $doctype 5
<link rel="stylesheet" href="/style.css">
<body>
<div #logo .logo>
<img src="/purrlogo.png">
<div #content .content>
<div #title .title>
<h1>
<a #titleLink .titleLink href="/">Purr
<div #pwUtils .pwUtils>
$# Below needs to be replaced with an HTMX onload request to /pw/#{link} to DRY
<div #requestedPw .requestedPw>
$maybe pw <- password
<p>Here's the secret for <a href="/pw/#{link}">/pw/#{link}</a>:
<h2 .pwResult>#{pw}
$nothing
$if (link == "/")
<p .emptyReq>
$else
<p>No secret available at <a href="/pw/#{link}">/pw/#{link}</a>
$# Above needs to be replaced with an HTMX onload request to /pw/#{link} to DRY
$if (link == "/")
<div #requestedPw .requestedPw>
<p .emptyReq>
$else
<div #requestedPw .requestedPw
hx-trigger="load"
hx-post="/pw"
hx-target="#requestedPw"
hx-swap="outerHTML"
*{hsUserLink}
>
Loading... <img class="htmx-indicator" src="/loading.svg" />
<div #shareNew .shareNew>
<p>

View File

@ -1,6 +1,6 @@
<div #requestedPw .requestedPw>
$maybe pw <- password
<p>Here's the secret for <a href="/pw/#{link}">/pw/#{link}</a>:
<p>Here's the secret found at <a href="/pw/#{link}">/pw/#{link}</a>:
<h2 .pwResult>#{pw}
$nothing
<p>No secret available at <a href="/pw/#{link}">/pw/#{link}</a>
<p>No secret found at <a href="/pw/#{link}">/pw/#{link}</a>