11
22from flask import request , jsonify , make_response
33from flask_restful import Resource , abort
4- from pbench .server .api import app , bcrypt , db
4+ from pbench .server .api import app , bcrypt , db , blacklist
55from pbench .server .api .resources .db_models import UserModel
6+ from flask_jwt_extended import jwt_required
67
78
89class RegisterUser (Resource ):
@@ -91,3 +92,91 @@ def post(self):
9192 'message' : 'Try again'
9293 }
9394 return make_response (jsonify (response_object ))
95+
96+
97+ class LogoutAPI (Resource ):
98+ """
99+ Abstracted pbench API for User Logout
100+ """
101+ @jwt_required
102+ def post (self ):
103+ # get auth token
104+ auth_header = request .headers .get ('X-Auth-Token' )
105+ if auth_header :
106+ auth_token = auth_header .split (" " )[1 ]
107+
108+ resp = UserModel .decode_auth_token (auth_token )
109+ if not isinstance (resp , str ):
110+ # Add the token to the blacklist
111+ blacklist .add (auth_token )
112+ response_object = {
113+ 'status' : 'success' ,
114+ 'message' : 'Successfully logged out.' ,
115+ 'status_code' : 200
116+ }
117+ return make_response (jsonify (response_object ))
118+ else :
119+ response_object = {
120+ 'status' : 'fail' ,
121+ 'message' : resp ,
122+ 'status_code' : 401
123+ }
124+ return make_response (jsonify (response_object ))
125+ else :
126+ response_object = {
127+ 'status' : 'fail' ,
128+ 'message' : 'Provide a valid auth token.' ,
129+ 'status_code' : 403
130+ }
131+ return make_response (jsonify (response_object ))
132+
133+
134+ class GetUser (Resource ):
135+ """
136+ Abstracted pbench API to get user metadata information
137+ """
138+ # TODO: We can implement the graphql query to get specific metadata related to a user
139+ # We dont need to pass user_id to get the user, user id will be retrieved from the jwt encoded auth header
140+ @jwt_required
141+ def get (self ):
142+ # get the auth token
143+ auth_header = request .headers .get ('X-Auth-Token' )
144+ auth_token = ''
145+ if auth_header :
146+ try :
147+ auth_token = auth_header .split (" " )[1 ]
148+ except IndexError :
149+ response_object = {
150+ 'status' : 'fail' ,
151+ 'message' : 'Bearer token malformed.' ,
152+ 'status_code' : 401
153+ }
154+ return make_response (jsonify (response_object ))
155+
156+ if auth_token :
157+ resp = UserModel .decode_auth_token (auth_token )
158+ if not isinstance (resp , str ):
159+ user = UserModel .query .filter_by (id = resp ).first ()
160+ response_object = {
161+ 'status' : 'success' ,
162+ 'data' : {
163+ 'user_id' : user .id ,
164+ 'username' : user .username ,
165+ 'registered_on' : user .registered_on
166+ },
167+ 'status_code' : 200
168+ }
169+ return make_response (jsonify (response_object ))
170+ response_object = {
171+ 'status' : 'fail' ,
172+ 'message' : resp ,
173+ 'status_code' : 403
174+ }
175+ return make_response (jsonify (response_object ))
176+ else :
177+ response_object = {
178+ 'status' : 'fail' ,
179+ 'message' : 'Provide a valid auth token.' ,
180+ 'status_code' : 401
181+ }
182+ return make_response (jsonify (response_object ))
0 commit comments