Started building generation functionality, added useful haddock-style comments for several functions
This commit is contained in:
		| @ -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> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user