Started building generation functionality, added useful haddock-style comments for several functions
This commit is contained in:
parent
10e3724a1a
commit
b1a4251d95
@ -25,6 +25,7 @@ library
|
||||
Core.Templates
|
||||
Core.Types
|
||||
Feature.Generation.Links
|
||||
Feature.Generation.Passwords
|
||||
Feature.Generation.Shared
|
||||
Feature.Sharing.HTTP
|
||||
Feature.Sharing.SQLite
|
||||
|
@ -18,7 +18,7 @@ app = do
|
||||
|
||||
-- Core Routes
|
||||
get "/" $ do
|
||||
html $ renderIndex "/" Nothing
|
||||
html $ renderIndex "/"
|
||||
|
||||
get "/style.css" $ do
|
||||
setHeader "Content-Type" "text/css"
|
||||
|
@ -20,5 +20,5 @@ main db = do
|
||||
|
||||
dbPath :: PurrAction String
|
||||
dbPath = do
|
||||
conf <- lift ask
|
||||
conf <- lift ask
|
||||
return $ dbFile conf
|
||||
|
@ -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 <> "\"}")
|
||||
|
@ -20,4 +20,5 @@ data DhallConfig = DhallConfig
|
||||
, applicationHost :: String
|
||||
, applicationPort :: Int
|
||||
, dbFile :: String
|
||||
, linkLength :: Int
|
||||
} deriving (Generic, Show)
|
||||
|
@ -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
|
||||
|
25
src/Feature/Generation/Passwords.hs
Normal file
25
src/Feature/Generation/Passwords.hs
Normal 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"
|
@ -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
1618
src/wordlist
Normal file
File diff suppressed because it is too large
Load Diff
@ -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>
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user