64 lines
2.1 KiB
Haskell
64 lines
2.1 KiB
Haskell
{-# Language OverloadedStrings, MultiParamTypeClasses, FlexibleInstances, QuasiQuotes #-}
|
|
|
|
module LoginForm (HTML(..), Html, loginPage) where
|
|
|
|
import Prelude hiding (head)
|
|
|
|
import qualified Data.Map as M
|
|
import Data.Aeson (encode)
|
|
import qualified Data.String.Interpolate as I
|
|
import Data.String (IsString(..))
|
|
import Data.Text (Text)
|
|
|
|
import Network.HTTP.Media ((//), (/:))
|
|
|
|
import Servant.API
|
|
|
|
-- import Text.Blaze
|
|
import Text.Blaze.Html.Renderer.Utf8 (renderHtml)
|
|
import Text.Blaze.Html5
|
|
import qualified Text.Blaze.Html5.Attributes as A
|
|
|
|
data HTML
|
|
|
|
instance Accept HTML where
|
|
contentType _ = "text" // "html" /: ("charset", "utf-8")
|
|
|
|
instance MimeRender HTML Html where
|
|
mimeRender _ = renderHtml
|
|
|
|
loginPage :: M.Map Text Text -> Html
|
|
loginPage headers = docTypeHtml $ head' >> body'
|
|
where
|
|
headers' = encode headers
|
|
formID = "loginForm" :: String
|
|
emailID = "email" :: String
|
|
buttonID = "loginButton" :: String
|
|
head' = head $ do
|
|
meta ! A.charset "UTF-8"
|
|
meta ! A.name "viewport" ! A.content "width=device-width, initial-scale=1.0"
|
|
title "UniWorX Oauth2 Mock Server"
|
|
body' = body $ do
|
|
h1 "UniWorX Oauth2 Mock Server"
|
|
form ! A.id (fromString formID) ! A.autocomplete "on" $ do
|
|
label ! A.for "email" $ "User"
|
|
input ! A.type_ "email" ! A.name "email" ! A.id (fromString emailID) ! A.autocomplete "email"
|
|
button ! A.type_ "button" ! A.id (fromString buttonID) $ "Login"
|
|
script $
|
|
[I.i|
|
|
#{buttonID}.onclick = async (e) => {
|
|
const headers = new Headers(#{headers'});
|
|
const formData = new FormData(#{formID});
|
|
const creds = formData.get('#{emailID}') + ':' + '';
|
|
headers.append('Authorization', btoa(creds));
|
|
alert(creds);
|
|
e.preventDefault();
|
|
fetch('../code', {
|
|
method: 'GET',
|
|
headers: headers
|
|
})
|
|
.then(response => response.text())
|
|
.then(url => window.location.replace(url.substring(1, url.length - 1)));
|
|
// Response.redirect(url);
|
|
};
|
|
|] |