@@ -51,7 +51,6 @@ import qualified Data.ByteString.Base64 as BS
51import Data.Maybe
51import Data.Maybe
52import Server.Auth.Token
52import Server.Auth.Token
53import Server.Auth.Mail
53import Server.Auth.Mail
55import Web.UAParser
54import Web.UAParser
56import qualified Data.Text.Lazy as TL
55import qualified Data.Text.Lazy as TL
@@ -63,7 +62,7 @@ instance ToSample AuthenticationCredits where
63instance ToSample UserLoginResponse where
62instance ToSample UserLoginResponse where
64 toSamples _ = samples $ map UserLoginResponse [UserIsRegistered, UserCanRegister, InvalidUser]
63 toSamples _ = samples $ map UserLoginResponse [UserIsRegistered, UserCanRegister, InvalidUser]
66−instance ToSample Int32 where
65+instance ToSample Int where
67 toSamples _ = samples [382934, 103845, 294905]
66 toSamples _ = samples [382934, 103845, 294905]
69instance ToSample UserCreation where
68instance ToSample UserCreation where
@@ -90,7 +89,7 @@ type AuthenticationHandler =
90 :> Header "cookie" String
89 :> Header "cookie" String
91 :> PostNoContent '[JSON, PlainText, FormUrlEncoded] (Headers '[Header "Set-Cookie" String] NoContent) :<|>
90 :> PostNoContent '[JSON, PlainText, FormUrlEncoded] (Headers '[Header "Set-Cookie" String] NoContent) :<|>
92 "verify" :> VerifyDescription :>
91 "verify" :> VerifyDescription :>
93− Header "cookie" String :> ReqBody '[JSON] Int32 :> PostNoContent '[JSON, PlainText, FormUrlEncoded] NoContent :<|>
92+ Header "cookie" String :> ReqBody '[JSON] Int :> PostNoContent '[JSON, PlainText, FormUrlEncoded] NoContent :<|>
94 "register" :> RegisterDescription :>
93 "register" :> RegisterDescription :>
95 ReqBody '[JSON] UserCreation :>
94 ReqBody '[JSON] UserCreation :>
96 Header "User-Agent" String :>
95 Header "User-Agent" String :>
@@ -141,21 +140,16 @@ logIn (AuthenticationCredits email') ua' = do
141 Nothing -> return . noHeader $ UserLoginResponse UserCanRegister
140 Nothing -> return . noHeader $ UserLoginResponse UserCanRegister
142 Just User{..} -> do
141 Just User{..} -> do
143 let ua = getUserAgent ua'
142 let ua = getUserAgent ua'
144− token <- generateToken userId ua
143+ GeneratedToken token value code activation deactivation <- generateToken userId ua
145 runQerror . createToken $ token
144 runQerror . createToken $ token
146− let cookie = generateCookie token
145+ let cookie = generateCookie token value
147− case tokenVerificationCode token of
149− sendTokenVerificationEmail code (TL.fromStrict ua) email
146+ sendTokenVerificationEmail code (TL.fromStrict ua) email
150− return . addHeader cookie $ UserLoginResponse UserIsRegistered
147+ return . addHeader cookie $ UserLoginResponse UserIsRegistered
151− Nothing -> throwError err500
148+
153−generateCookie :: Token -> String
149+generateCookie :: Token -> BS.ByteString -> String
154−generateCookie token = L.unpack . toLazyByteString . renderSetCookie $ defaultSetCookie {
150+generateCookie token value = L.unpack . toLazyByteString . renderSetCookie $ defaultSetCookie {
155 setCookieName = cookieTokenKey,
151 setCookieName = cookieTokenKey,
156− setCookieValue = L.toStrict . encode $ AuthenticationCookieData
152+ setCookieValue = L.toStrict . encode $ AuthenticationCookieData (tokenUserId token) value,
159 setCookieExpires = Just (tokenExpiryDate token),
153 setCookieExpires = Just (tokenExpiryDate token),
160 setCookiePath = Just "/",
154 setCookiePath = Just "/",
161 setCookieHttpOnly = True,
155 setCookieHttpOnly = True,
@@ -171,7 +165,7 @@ checkCookie cookie = do
171 Nothing -> throwError err401
165 Nothing -> throwError err401
172 Just _ -> return NoContent
166 Just _ -> return NoContent
174−verifyToken :: Maybe String -> Int32 -> App NoContent
168+verifyToken :: Maybe String -> Int -> App NoContent
175verifyToken Nothing _ = throwError err400
169verifyToken Nothing _ = throwError err400
176verifyToken (Just cookie) code = do
170verifyToken (Just cookie) code = do
177 let mbToken = getCookie cookie
171 let mbToken = getCookie cookie
@@ -208,17 +202,14 @@ register creation' ua' = do
208 unless (validateUser creation) $ throwError err400
202 unless (validateUser creation) $ throwError err400
209 genToken <- generateTokenM
203 genToken <- generateTokenM
210 let ua = getUserAgent ua'
204 let ua = getUserAgent ua'
211− token <- runQ err409 . commitedTransactionallyUpdate $ do
205+ GeneratedToken token value code activation deactivation <- runQ err409 . commitedTransactionallyUpdate $ do
212 uId <- createUser creation
206 uId <- createUser creation
213− let token = genToken uId ua
207+ let gToken = genToken uId ua
214− createToken token
208+ createToken . generatedToken $ gToken
215− return token
209+ return gToken
216− case tokenVerificationCode token of
218− sendTokenVerificationEmail code (TL.fromStrict ua) (userCreationUserEmail creation)
210+ sendTokenVerificationEmail code (TL.fromStrict ua) (userCreationUserEmail creation)
219− let cookie = generateCookie token
211+ let cookie = generateCookie token value
220− return $ addHeader cookie NoContent
212+ return $ addHeader cookie NoContent
221− Nothing -> throwError err500
223getUserAgent :: Maybe String -> T.Text
214getUserAgent :: Maybe String -> T.Text
224getUserAgent uaData' = fromMaybe "Unknown" $ do
215getUserAgent uaData' = fromMaybe "Unknown" $ do