packages feed

yesod-auth-hmac-keccak-0.0.0.1: src/Activate.purs

module Activate where

import Prelude (Unit, bind, not, pure, show, unit, ($), (&&), (<>), (=<<), (==), discard)
import Control.Monad.Aff (runAff)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Control.Monad.Eff.JQuery (JQuery, JQueryEvent, display, hide, getValue, on, preventDefault, ready, select)

import DOM (DOM)

import Data.Function.Uncurried (runFn2)
import Data.Maybe (Maybe(..), fromJust, isNothing)
import Data.Tuple (Tuple(..))

import Network.HTTP.Affjax (AJAX, post)

import Data.FormURLEncoded as UE

import Partial.Unsafe (unsafePartial)

import Common (Elem(..), fail, fromForeign, fromHex, fromUtf8, getAttr, hmacSha3, progress, welcome)

-- main :: forall e. Eff (console :: CONSOLE | e) Unit
-- main = do
--   log "Hello sailor!"

-- main :: forall eff. Eff ( ajax :: AJAX
--                         , dom :: DOM
--                         , console :: CONSOLE
--                         | eff
--                         ) Unit
-- main =
--   ready $ do
--     log "activating"
--     display =<< select ".js-hidden"
--     hide =<< select ".noscript"
--     activate <- select "#activate"
--     on "click" (onActivateClick activate) activate

onActivateClick
  :: forall eff. JQuery
  -> JQueryEvent
  -> JQuery
  -> Eff (dom :: DOM
    , console :: CONSOLE
    , ajax :: AJAX
    | eff
    ) Unit
onActivateClick activate ev _ = unsafePartial $ do
  preventDefault ev
  token <- getAttr "data-token" activate
  -- log $ "token: " <> token
  salt <- getAttr "data-salt" activate
  -- log $ "salt: " <> salt
  fpassword1 <- getValue =<< select "#password1"
  fpassword2 <- getValue =<< select "#password2"
  formAction <- getAttr "action" =<< select "#activateform"
  log formAction
  let password1 = fromForeign fpassword1
      password2 = fromForeign fpassword2
  if not (isNothing password1 && isNothing password2)
    then
      if password1 == password2
        then do
          progress "Salting password"
          -- log $ fromJust password1 <> " " <> salt
          let salted = runFn2 hmacSha3 (fromUtf8 $ fromJust password1) (fromHex salt)
          -- log salted
          progress "Requesting account activation..."
          let dat = UE.fromArray [ Tuple "salted" (Just salted) ]
          _ <- runAff
              (\e -> fail Activate $ show e)
              (\x -> welcome x.response Activate)
              $ post formAction dat
          pure unit
        else
          fail Activate "Passwords must match"
    else
      fail Activate "Passwords error"