@@ -20,6 +20,7 @@ import Data.Either (Either(..))
20import Data.HCaptcha (bindHCaptchToken)
20import Data.HCaptcha (bindHCaptchToken)
21import Data.JNullable (jnull, nullify)
21import Data.JNullable (jnull, nullify)
22import Data.Maybe (Maybe(..))
22import Data.Maybe (Maybe(..))
23+import Data.Newtype (wrap)
23import Data.OpenURL (openURL)
24import Data.OpenURL (openURL)
24import Data.Ord.Down (Down(..))
25import Data.Ord.Down (Down(..))
25import Data.SymmetricCryptoKey (SymmetricCryptoKey)
26import Data.SymmetricCryptoKey (SymmetricCryptoKey)
@@ -38,6 +39,7 @@ import FFI as FFI
38import Localstorage (class StorageKey)
39import Localstorage (class StorageKey)
39import Localstorage as Storage
40import Localstorage as Storage
40import Storage (MasterPasswordHashKey(..), PreloginResponseKey(..), SyncKey(..), TokenKey(..), UrlsKey(..))
41import Storage (MasterPasswordHashKey(..), PreloginResponseKey(..), SyncKey(..), TokenKey(..), UrlsKey(..))
42+import Untagged.Union (toEither1)
41import Web.HTML as Html
43import Web.HTML as Html
42import Web.HTML.Window as Window
44import Web.HTML.Window as Window
43import Web.Storage.Storage (Storage)
45import Web.Storage.Storage (Storage)
@@ -49,7 +51,10 @@ main = do
49 storage <- Html.window >>= Window.localStorage
51 storage <- Html.window >>= Window.localStorage
50 services <- WB.getServices
52 services <- WB.getServices
51 masterKeyRef <- Ref.new Nothing
53 masterKeyRef <- Ref.new Nothing
54+ hCaptchaTokenRef <- Ref.new Nothing
52− bindHCaptchToken log
55+ bindHCaptchToken \captchaToken -> do
56+ Ref.write (Just captchaToken) hCaptchaTokenRef
57+ Elm.send app Bridge.CaptchaDone
54 run act = do
59 run act = do
55 maybeKey <- Ref.read masterKeyRef
60 maybeKey <- Ref.read masterKeyRef
@@ -69,6 +74,8 @@ main = do
69 Nothing -> requestMasterPassword
74 Nothing -> requestMasterPassword
70 Elm.subscribe app \cmd -> case cmd of
75 Elm.subscribe app \cmd -> case cmd of
71 Bridge.Login (Bridge.Cmd_Login { email, server, password }) -> do
76 Bridge.Login (Bridge.Cmd_Login { email, server, password }) -> do
77+ captchaToken <- Ref.read hCaptchaTokenRef
78+ Ref.write Nothing hCaptchaTokenRef
73 urls = baseUrl server
80 urls = baseUrl server
74 runElmAff app do
81 runElmAff app do
@@ -82,23 +89,28 @@ main = do
83 flip runReaderT env do
90 flip runReaderT env do
84 prelogin <- liftPromise $ unauthedApi.postPrelogin { email }
91 prelogin <- liftPromise $ unauthedApi.postPrelogin { email }
85− token <-
92+ loginResponse <-
86 catchError
93 catchError
87− (Logic.getLogInRequestToken prelogin (Email email) (Password password))
94+ (Logic.getLogInRequestToken prelogin (Email email) (Password password) captchaToken)
88 (const $ liftEffect $ Exc.throw "Could not log in. Please check your data and try again.")
95 (const $ liftEffect $ Exc.throw "Could not log in. Please check your data and try again.")
96+ case toEither1 loginResponse of
99+ Elm.send app $ Bridge.NeedsCaptcha siteKey
89− masterKey <- Logic.makePreloginKey prelogin (Email email) (Password password)
101+ masterKey <- Logic.makePreloginKey prelogin (Email email) (Password password)
90− api <- liftPromise $ services.getApi urls (nullify token)
102+ api <- liftPromise $ services.getApi urls (nullify token)
91− sync <- liftPromise $ api.getSync unit
103+ sync <- liftPromise $ api.getSync unit
92− hash <- hashPassword (Password password)
104+ hash <- hashPassword (Password password)
93− log $ show sync
105+ log $ show sync
94− liftEffect do
106+ liftEffect do
95− Ref.write (Just masterKey) masterKeyRef
107+ Ref.write (Just masterKey) masterKeyRef
96− Storage.store storage UrlsKey server
108+ Storage.store storage UrlsKey server
97− Storage.store storage MasterPasswordHashKey hash
109+ Storage.store storage MasterPasswordHashKey hash
98− Storage.store storage PreloginResponseKey prelogin
110+ Storage.store storage PreloginResponseKey prelogin
99− Storage.store storage SyncKey sync
111+ Storage.store storage SyncKey sync
100− Storage.store storage TokenKey token
112+ Storage.store storage TokenKey token
101− Elm.send app Bridge.LoginSuccessful
113+ Elm.send app Bridge.LoginSuccessful
102 Bridge.NeedCiphersList ->
114 Bridge.NeedCiphersList ->
104 sync <- getOrReset SyncKey
116 sync <- getOrReset SyncKey