Skip to content

Commit 933a50d

Browse files
committed
Moved callbacks in own function
1 parent f87cbf5 commit 933a50d

File tree

2 files changed

+109
-109
lines changed

2 files changed

+109
-109
lines changed

backend/PyMatcha/__init__.py

Lines changed: 1 addition & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
from PyMatcha.utils.tables import create_tables
3636
from pymysql.cursors import DictCursor
3737
from redis import StrictRedis
38-
from sentry_sdk import configure_scope
3938
from sentry_sdk.integrations.flask import FlaskIntegration
4039

4140

@@ -127,24 +126,6 @@
127126

128127
jwt = JWTManager(application)
129128

130-
logging.debug("Configuring JWT expired token handler callback")
131-
132-
133-
@jwt.expired_token_loader
134-
def expired_token_callback(expired_token):
135-
logging.debug("Token {} expired".format(expired_token))
136-
resp = {
137-
"code": 401,
138-
"error": {
139-
"message": f"The {expired_token['type']} token has expired",
140-
"name": "Unauthorized Error",
141-
"solution": "Try again when you have renewed your token",
142-
"type": "UnauthorizedError",
143-
},
144-
"success": False,
145-
}
146-
return jsonify(resp), 401
147-
148129

149130
logging.debug("Configuring CORS")
150131
CORS(application, expose_headers="Authorization", supports_credentials=True)
@@ -183,39 +164,6 @@ def expired_token_callback(expired_token):
183164

184165
redis.flushdb()
185166

186-
from PyMatcha.models.user import get_user
187-
188-
189-
logging.debug("Configuring JWT user callback loader")
190-
191-
192-
from PyMatcha.utils.errors import NotFoundError
193-
194-
195-
@jwt.user_loader_callback_loader
196-
def jwt_user_callback(identity):
197-
try:
198-
user = get_user(identity["id"])
199-
except NotFoundError:
200-
# The user who the server issues the token for was deleted in the db.
201-
return None
202-
203-
with configure_scope() as scope:
204-
scope.user = {"email": user.email, "id": user.id, "username": user.username}
205-
user.is_online = True
206-
user.date_lastseen = datetime.datetime.utcnow()
207-
user.save()
208-
return user
209-
210-
211-
@jwt.token_in_blacklist_loader
212-
def check_if_token_is_revoked(decrypted_token):
213-
jti = decrypted_token["jti"]
214-
entry = redis.get("is_revoked_jti:" + jti)
215-
if entry is None:
216-
return True
217-
return entry == "true"
218-
219167

220168
from PyMatcha.routes.api.user import user_bp
221169
from PyMatcha.routes.api.auth.email import auth_email_bp
@@ -257,66 +205,10 @@ def check_if_token_is_revoked(decrypted_token):
257205
application.register_blueprint(debug_bp)
258206

259207

260-
@jwt.revoked_token_loader
261-
def jwt_revoked_token_callback():
262-
return (
263-
jsonify(
264-
{
265-
"code": 401,
266-
"error": {
267-
"message": "Token has been revoked.",
268-
"name": "Unauthorized Error",
269-
"solution": "Please login again",
270-
"type": "UnauthorizedError",
271-
},
272-
"success": False,
273-
}
274-
),
275-
401,
276-
)
277-
278-
279-
@jwt.unauthorized_loader
280-
def no_jwt_callback(error_message):
281-
return (
282-
jsonify(
283-
{
284-
"code": 401,
285-
"error": {
286-
"message": error_message,
287-
"name": "Unauthorized Error",
288-
"solution": "Try again",
289-
"type": "UnauthorizedError",
290-
},
291-
"success": False,
292-
}
293-
),
294-
401,
295-
)
296-
297-
298-
@jwt.invalid_token_loader
299-
def jwt_invalid_token_callback(error_message):
300-
return (
301-
jsonify(
302-
{
303-
"code": 400,
304-
"error": {
305-
"message": error_message,
306-
"name": "Bad Request Error",
307-
"solution": "Try again (The token is invalid)",
308-
"type": "BadRequestError",
309-
},
310-
"success": False,
311-
}
312-
),
313-
400,
314-
)
315-
316-
317208
# import tasks here to be registered by celery
318209

319210
import PyMatcha.utils.tasks # noqa
211+
import PyMatcha.utils.jwt_callbacks # noqa
320212

321213

322214
@application.route("/")
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import datetime
2+
import logging
3+
4+
from flask import jsonify
5+
from PyMatcha import jwt
6+
from PyMatcha import redis
7+
from PyMatcha.models.user import get_user
8+
from PyMatcha.utils.errors import NotFoundError
9+
from sentry_sdk import configure_scope
10+
11+
logging.debug("Configuring JWT callbacks")
12+
13+
14+
@jwt.expired_token_loader
15+
def expired_token_callback(expired_token):
16+
resp = {
17+
"code": 401,
18+
"error": {
19+
"message": f"The {expired_token['type']} token has expired",
20+
"name": "Unauthorized Error",
21+
"solution": "Try again when you have renewed your token",
22+
"type": "UnauthorizedError",
23+
},
24+
"success": False,
25+
}
26+
return jsonify(resp), 401
27+
28+
29+
@jwt.user_loader_callback_loader
30+
def jwt_user_callback(identity):
31+
try:
32+
user = get_user(identity["id"])
33+
except NotFoundError:
34+
# The user who the server issues the token for was deleted in the db.
35+
return None
36+
37+
with configure_scope() as scope:
38+
scope.user = {"email": user.email, "id": user.id, "username": user.username}
39+
user.is_online = True
40+
user.date_lastseen = datetime.datetime.utcnow()
41+
user.save()
42+
return user
43+
44+
45+
@jwt.token_in_blacklist_loader
46+
def check_if_token_is_revoked(decrypted_token):
47+
jti = decrypted_token["jti"]
48+
entry = redis.get("is_revoked_jti:" + jti)
49+
if entry is None:
50+
return True
51+
return entry == "true"
52+
53+
54+
@jwt.revoked_token_loader
55+
def jwt_revoked_token_callback():
56+
return (
57+
jsonify(
58+
{
59+
"code": 401,
60+
"error": {
61+
"message": "Token has been revoked.",
62+
"name": "Unauthorized Error",
63+
"solution": "Please login again",
64+
"type": "UnauthorizedError",
65+
},
66+
"success": False,
67+
}
68+
),
69+
401,
70+
)
71+
72+
73+
@jwt.unauthorized_loader
74+
def no_jwt_callback(error_message):
75+
return (
76+
jsonify(
77+
{
78+
"code": 401,
79+
"error": {
80+
"message": error_message,
81+
"name": "Unauthorized Error",
82+
"solution": "Try again",
83+
"type": "UnauthorizedError",
84+
},
85+
"success": False,
86+
}
87+
),
88+
401,
89+
)
90+
91+
92+
@jwt.invalid_token_loader
93+
def jwt_invalid_token_callback(error_message):
94+
return (
95+
jsonify(
96+
{
97+
"code": 400,
98+
"error": {
99+
"message": error_message,
100+
"name": "Bad Request Error",
101+
"solution": "Try again (The token is invalid)",
102+
"type": "BadRequestError",
103+
},
104+
"success": False,
105+
}
106+
),
107+
400,
108+
)

0 commit comments

Comments
 (0)