Skip to content

Commit 968c2de

Browse files
author
Jon Kristensen
committed
Add 0.0.0.6
1 parent 9ad199e commit 968c2de

File tree

4 files changed

+65
-4
lines changed

4 files changed

+65
-4
lines changed

src/Api.hs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Backend
1010
import Control.Monad.Trans
1111
import Control.Monad.Trans.Either
1212
import Data.Traversable
13+
import qualified Data.Traversable as Traversable
1314
import Data.Monoid
1415
import Data.Text (Text)
1516
import qualified Data.Text as Text
@@ -97,6 +98,19 @@ serveGetUserInstancesAPI :: ConnectionPool
9798
serveGetUserInstancesAPI pool conf user =
9899
lift . runAPI pool conf $ getUserInstances user
99100

101+
type GetUserInfoAPI = "user-info-by-token"
102+
:> Capture "token" B64Token
103+
:> Get '[JSON] ReturnUserInfo
104+
105+
serveGetUserInfoAPI :: ConnectionPool
106+
-> Config
107+
-> Server GetUserInfoAPI
108+
serveGetUserInfoAPI pool conf token = do
109+
mbRUI <- lift . runAPI pool conf $ getUserInfo token
110+
case mbRUI of
111+
Nothing -> left err403
112+
Just rui -> return rui
113+
100114
type UserMirrorAPI = "showUser"
101115
:> Header "X-User" Text
102116
:> Get '[JSON] Text
@@ -111,6 +125,7 @@ apiPrx :: Proxy ( LoginAPI
111125
:<|> PublicCheckTokenAPI
112126
:<|> LogoutAPI
113127
:<|> GetUserInstancesAPI
128+
:<|> GetUserInfoAPI
114129
:<|> UserMirrorAPI)
115130
apiPrx = Proxy
116131

@@ -120,4 +135,5 @@ serveAPI pool conf = serve apiPrx $ serveLogin pool conf
120135
:<|> servePublicCheckToken pool conf
121136
:<|> serveLogout pool conf
122137
:<|> serveGetUserInstancesAPI pool conf
138+
:<|> serveGetUserInfoAPI pool conf
123139
:<|> serveUserMirror

src/AuthServiceTypes.hs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,16 @@ makeLensesWith camelCaseFields ''ReturnInstance
170170
deriveJSON defaultOptions{fieldLabelModifier = dropPrefix "returnInstance"}
171171
''ReturnInstance
172172

173+
data ReturnUserInfo = ReturnUserInfo { returnUserInfoId :: !UserID
174+
, returnUserInfoEmail :: !Email
175+
, returnUserInfoName :: !Name
176+
, returnUserInfoPhone :: !(Maybe Phone)
177+
, returnUserInfoInstances :: ![ReturnInstance]
178+
}
179+
180+
deriveJSON defaultOptions{fieldLabelModifier = dropPrefix "returnUserInfo"}
181+
''ReturnUserInfo
182+
makeLensesWith camelCaseFields ''ReturnUserInfo
173183

174184
data Login = Login { loginUser :: !Email
175185
, loginPassword :: !Password

src/Backend.hs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Data.Text (Text)
1717
import qualified Data.Text as Text
1818
import qualified Data.Text.Encoding as Text
1919
import Data.Time.Clock
20+
import qualified Data.Traversable as Traversable
2021
import qualified Data.UUID.V4 as UUID
2122
import qualified Database.Esqueleto as E
2223
import Database.Esqueleto hiding ((^.), from)
@@ -210,12 +211,32 @@ login Login{ loginUser = userEmail
210211
sendOTP twilioConf userEmail p otp
211212
return ()
212213

214+
getUserByToken :: B64Token -> API (Maybe DB.User)
215+
getUserByToken tokenId = do
216+
-- Delete expired tokens
217+
now <- liftIO $ getCurrentTime
218+
runDB $ P.deleteWhere [DB.TokenExpires P.<=. Just now]
219+
220+
user <- runDB . select . E.from $ \(user `InnerJoin` token) -> do
221+
on (user E.^. DB.UserUuid ==. token E.^. DB.TokenUser)
222+
where_ (token E.^. DB.TokenToken ==. val tokenId)
223+
return user
224+
return . fmap entityVal $ listToMaybe user
225+
226+
getUserInfo :: B64Token -> API (Maybe ReturnUserInfo)
227+
getUserInfo token = do
228+
mbUser <- getUserByToken token
229+
Traversable.forM mbUser $ \user -> do
230+
instances <- getUserInstances (user ^. DB.uuid)
231+
return ReturnUserInfo { returnUserInfoId = user ^. DB.uuid
232+
, returnUserInfoEmail = user ^. email
233+
, returnUserInfoName = user ^. name
234+
, returnUserInfoPhone = user ^. phone
235+
, returnUserInfoInstances = instances
236+
}
213237

214238
checkToken :: B64Token -> API (Maybe UserID)
215-
checkToken tokenId = do
216-
now <- liftIO $ getCurrentTime
217-
runDB $ P.deleteWhere [DB.TokenExpires P.<=. Just now]
218-
fmap DB.tokenUser <$> (runDB $ P.get (DB.TokenKey tokenId))
239+
checkToken tokenId = fmap DB.userUuid <$> getUserByToken tokenId
219240

220241
checkInstance :: InstanceID -> UserID -> API (Maybe DB.UserInstance)
221242
checkInstance inst user = runDB $ P.get (DB.UserInstanceKey user inst)

web/nginx.conf.m4

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,20 @@ http {
9191
alias /www/auth-service.js;
9292
}
9393

94+
location = /user-info {
95+
set $token $cookie_token;
96+
if ($token = '') {
97+
set $token $http_x_token;
98+
}
99+
if ($token = '') {
100+
return 403;
101+
}
102+
proxy_pass http://AUTH_SERVICE/user-info-by-token/$token/;
103+
proxy_pass_request_body off;
104+
proxy_set_header Content-Length "";
105+
proxy_set_header X-Original-URI $request_uri;
106+
}
107+
94108
# Locations to redirect /auth.html
95109

96110
location = /auth.html {

0 commit comments

Comments
 (0)