Skip to content

Commit e24ca53

Browse files
authored
Merge pull request #53 from zfi/1.1
Patch to correct return payloads on failures
2 parents 3e41ca2 + ba1a256 commit e24ca53

File tree

4 files changed

+102
-69
lines changed

4 files changed

+102
-69
lines changed

Failures.py

Lines changed: 96 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,131 @@
11
import logging
2+
'''
3+
Failure messages
4+
5+
These functions provide for a standard return message for all known
6+
and expected error conditions.
7+
8+
The return payload is a JSON document and an HTTP error code. The JSON
9+
document includes these elements:
10+
11+
success - boolean
12+
message - a short message that uniquely identifies the error
13+
code - a distrinct return code that allows the client to act on
14+
then specic error condition encountered.
15+
field - optional data element that identified the name of the
16+
data element involved in the error.
17+
data - optional data element that provides an id or key value
18+
for the data set being processed when the error occurred.
19+
20+
The HTTP error code indicates whether the request succeeded or failed. If
21+
the call is successful, the service will return a code 200 and a message
22+
of "OK".
23+
24+
If the request is unsuccessful and the error is due to faulty client data,
25+
return an HTTP error code of 401 if the user is unknown or authentication fails.
26+
Return an HTTP 500 error if the failure is due to an issue within the server,
27+
such as unable to access the back-end database.
28+
29+
'''
230

331

432
def unknown_user_id(id_user):
533
logging.debug('Failures: Unknown user id: %s', id_user)
634
return {
7-
'success': False,
8-
'message': 'Unknown user',
9-
'code': 400,
10-
'data': id_user
11-
}, 500
35+
'success': False,
36+
'message': 'Unknown user',
37+
'code': 400,
38+
'data': id_user
39+
}, 400
1240

1341

1442
def unknown_user_email(email):
1543
logging.debug('Failures: Unknown user email: %s', email)
1644
return {
17-
'success': False,
18-
'message': 'Unknown user',
19-
'code': 400,
20-
'data': email
21-
}, 500
45+
'success': False,
46+
'message': 'Unknown user',
47+
'code': 400,
48+
'data': email
49+
}, 400
2250

2351

2452
def unknown_user_screen_name(screen_name):
2553
logging.debug('Failures: Unknown user by screen name: %s', screen_name)
2654
return {
27-
'success': False,
28-
'message': 'Unknown user screen name',
29-
'code': 400,
30-
'data': screen_name
31-
}, 500
55+
'success': False,
56+
'message': 'Unknown user screen name',
57+
'code': 400,
58+
'data': screen_name
59+
}, 400
3260

3361

3462
def email_already_in_use(email):
3563
logging.debug('Failures: Email already in use: %s', email)
3664
return {
37-
'success': False,
38-
'message': 'Email already in use',
39-
'code': 450,
40-
'data': email
41-
}, 500
65+
'success': False,
66+
'message': 'Email already in use',
67+
'code': 450,
68+
'data': email
69+
}, 400
4270

4371

4472
def email_not_confirmed(email):
4573
logging.debug('Failures: Email %s not confirmed', email)
4674
return {
47-
'success': False,
48-
'message': 'Email not confirmed',
49-
'code': 430
50-
}, 401
75+
'success': False,
76+
'message': 'Email not confirmed',
77+
'code': 430,
78+
'data': email
79+
}, 401
5180

5281

5382
def user_blocked(email):
5483
logging.debug('Failures: User %s blocked', email)
5584
return {
56-
'success': False,
57-
'message': 'User is blocked',
58-
'code': 420
59-
}, 401
85+
'success': False,
86+
'message': 'User is blocked',
87+
'code': 420,
88+
'data': email
89+
}, 403
6090

6191

6292
def not_a_number(field, value):
6393
logging.error('Failures: Not a valid number: %s -> %s', field, value)
6494
return {
65-
'success': False,
66-
'message': 'Not a valid number',
67-
'code': 310,
68-
'field': field,
69-
'value': value
70-
}, 400
95+
'success': False,
96+
'message': 'Not a valid number',
97+
'code': 310,
98+
'field': field,
99+
'value': value
100+
}, 400
71101

72102

73103
def passwords_do_not_match():
74104
logging.debug('Failures: Passwords do not match')
75105
return {
76-
'success': False,
77-
'message': "Password confirm doesn't match",
78-
'code': 460
79-
}, 500
106+
'success': False,
107+
'message': "Password confirm doesn't match",
108+
'code': 460
109+
}, 400
80110

81111

82112
def password_complexity():
83113
logging.debug('Failures: Password is not complex enough')
84114
return {
85-
'success': False,
86-
'message': "Password is not complex enough",
87-
'code': 490
88-
}, 500
115+
'success': False,
116+
'message': "Password is not complex enough",
117+
'code': 490
118+
}, 400
89119

90120

91121
def screen_name_already_in_use(screen_name):
92122
logging.debug('Failures: Screen name already in use: %s', screen_name)
93123
return {
94-
'success': False,
95-
'message': "Screenname already in use",
96-
'data': screen_name,
97-
'code': 500
98-
}, 500
124+
'success': False,
125+
'message': "Screenname already in use",
126+
'code': 500,
127+
'data': screen_name
128+
}, 400
99129

100130

101131
def rate_exceeded(time):
@@ -106,37 +136,38 @@ def rate_exceeded(time):
106136
"""
107137
logging.debug('Failures: Rate exceeded')
108138
return {
109-
'success': False,
110-
'message': 'Insufficient bucket tokens',
111-
'data': time,
112-
'code': 470
113-
}, 500
139+
'success': False,
140+
'message': 'Insufficient bucket tokens',
141+
'code': 470,
142+
'data': time
143+
}, 400
114144

115145

116146
def wrong_password(email):
117147
logging.debug('Failures: Wrong password for %s', email)
118148
return {
119-
'success': False,
120-
'message': 'Wrong password',
121-
'code': 410
149+
'success': False,
150+
'message': 'Wrong password',
151+
'code': 410,
152+
'data': email
122153
}, 401
123154

124155

125156
def unknown_bucket_type(bucket_type):
126157
logging.debug('Failures: Unknown bucket type: %s', bucket_type)
127158
return {
128-
'success': False,
129-
'message': 'Unknown bucket type',
130-
'code': 180,
131-
'data': bucket_type
132-
}, 500
159+
'success': False,
160+
'message': 'Unknown bucket type',
161+
'code': 180,
162+
'data': bucket_type
163+
}, 400
133164

134165

135166
def wrong_auth_source(auth_source):
136167
logging.debug('Failures: Wrong auth source: %s', auth_source)
137168
return {
138-
'success': False,
139-
'message': 'Wrong auth source',
140-
'code': 480,
141-
'data': auth_source
142-
}, 500
169+
'success': False,
170+
'message': 'Wrong auth source',
171+
'code': 480,
172+
'data': auth_source
173+
}, 500

app/AuthToken/controllers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def post(self):
3939
# Parse numbers
4040
try:
4141
id_user = int(id_user)
42-
except:
42+
except ValueError:
4343
return Failures.not_a_number('idUser', id_user)
4444

4545
# Validate user exists, is validated and is not blocked

app/RateLimiting/controllers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,12 @@ def get(self, bucket_type, id_user, count):
7676
# Parse numbers
7777
try:
7878
id_user = int(id_user)
79-
except:
79+
except ValueError:
8080
return Failures.not_a_number('idUser', id_user)
8181

8282
try:
8383
count = int(count)
84-
except:
84+
except ValueError:
8585
return Failures.not_a_number('count', count)
8686

8787
# Validate user exists, is validated and is not blocked

app/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@
2424
app = Flask(__name__)
2525

2626
# Application version (major,minor,patch-level)
27-
version = "1.1.8"
27+
version = "1.1.9"
2828

2929
"""
3030
Change Log
3131
32+
1.1.9 Update failure module to include missing return elements.
33+
3234
1.1.8 Fail any attempt to reset an account password is the account
3335
email address has not yet been confirmed.
3436

0 commit comments

Comments
 (0)