Browse Source

better invalid int errors

Guénaël Muller 6 years ago
parent
commit
4a63b69586
3 changed files with 40 additions and 10 deletions
  1. 2 0
      tracim/__init__.py
  2. 19 0
      tracim/exceptions.py
  3. 19 10
      tracim/lib/utils/request.py

+ 2 - 0
tracim/__init__.py View File

@@ -29,6 +29,7 @@ from tracim.views.core_api.workspace_controller import WorkspaceController
29 29
 from tracim.views.contents_api.comment_controller import CommentController
30 30
 from tracim.views.errors import ErrorSchema
31 31
 from tracim.exceptions import NotAuthenticated
32
+from tracim.exceptions import InvalidId
32 33
 from tracim.exceptions import InsufficientUserProfile
33 34
 from tracim.exceptions import InsufficientUserRoleInWorkspace
34 35
 from tracim.exceptions import WorkspaceNotFoundInTracimRequest
@@ -90,6 +91,7 @@ def web(global_config, **local_settings):
90 91
     context.handle_exception(UserDoesNotExist, HTTPStatus.BAD_REQUEST)
91 92
     context.handle_exception(ContentNotFound, HTTPStatus.BAD_REQUEST)
92 93
     context.handle_exception(ContentTypeNotAllowed, HTTPStatus.BAD_REQUEST)
94
+    context.handle_exception(InvalidId, HTTPStatus.BAD_REQUEST)
93 95
     # Auth exception
94 96
     context.handle_exception(NotAuthenticated, HTTPStatus.UNAUTHORIZED)
95 97
     context.handle_exception(AuthenticationFailed, HTTPStatus.FORBIDDEN)

+ 19 - 0
tracim/exceptions.py View File

@@ -121,6 +121,25 @@ class ContentNotFoundInTracimRequest(TracimException):
121 121
     pass
122 122
 
123 123
 
124
+class InvalidId(TracimException):
125
+    pass
126
+
127
+
128
+class InvalidContentId(InvalidId):
129
+    pass
130
+
131
+
132
+class InvalidCommentId(InvalidId):
133
+    pass
134
+
135
+
136
+class InvalidWorkspaceId(InvalidId):
137
+    pass
138
+
139
+
140
+class InvalidUserId(InvalidId):
141
+    pass
142
+
124 143
 class ContentNotFound(TracimException):
125 144
     pass
126 145
 

+ 19 - 10
tracim/lib/utils/request.py View File

@@ -2,7 +2,12 @@
2 2
 from pyramid.request import Request
3 3
 from sqlalchemy.orm.exc import NoResultFound
4 4
 
5
-from tracim.exceptions import NotAuthenticated, ContentNotFound
5
+from tracim.exceptions import NotAuthenticated
6
+from tracim.exceptions import ContentNotFound
7
+from tracim.exceptions import InvalidUserId
8
+from tracim.exceptions import InvalidWorkspaceId
9
+from tracim.exceptions import InvalidContentId
10
+from tracim.exceptions import InvalidCommentId
6 11
 from tracim.exceptions import ContentNotFoundInTracimRequest
7 12
 from tracim.exceptions import WorkspaceNotFoundInTracimRequest
8 13
 from tracim.exceptions import UserNotFoundInTracimRequest
@@ -214,8 +219,9 @@ class TracimRequest(Request):
214 219
         comment_id = ''
215 220
         try:
216 221
             if 'comment_id' in request.matchdict:
217
-                if not request.matchdict['comment_id'].isdecimal():
218
-                    raise ContentNotFoundInTracimRequest('comment_id is not a correct integer')  # nopep8
222
+                comment_id_str = request.matchdict['content_id']
223
+                if not isinstance(comment_id_str, str) or not comment_id_str.isdecimal():  # nopep8
224
+                    raise InvalidCommentId('comment_id is not a correct integer')  # nopep8
219 225
                 comment_id = int(request.matchdict['comment_id'])
220 226
             if not comment_id:
221 227
                 raise ContentNotFoundInTracimRequest('No comment_id property found in request')  # nopep8
@@ -253,8 +259,9 @@ class TracimRequest(Request):
253 259
         content_id = ''
254 260
         try:
255 261
             if 'content_id' in request.matchdict:
256
-                if not request.matchdict['content_id'].isdecimal():
257
-                    raise ContentNotFoundInTracimRequest('content_id is not a correct integer')  # nopep8
262
+                content_id_str = request.matchdict['content_id']
263
+                if not isinstance(content_id_str, str) or not content_id_str.isdecimal():  # nopep8
264
+                    raise InvalidContentId('content_id is not a correct integer')  # nopep8
258 265
                 content_id = int(request.matchdict['content_id'])
259 266
             if not content_id:
260 267
                 raise ContentNotFoundInTracimRequest('No content_id property found in request')  # nopep8
@@ -286,8 +293,9 @@ class TracimRequest(Request):
286 293
         try:
287 294
             login = None
288 295
             if 'user_id' in request.matchdict:
289
-                if not request.matchdict['user_id'].isdecimal():
290
-                    raise UserNotFoundInTracimRequest('user_id is not a correct integer')  # nopep8
296
+                user_id_str = request.matchdict['user_id']
297
+                if not isinstance(user_id_str, str) or not user_id_str.isdecimal():
298
+                    raise InvalidUserId('user_id is not a correct integer')  # nopep8
291 299
                 login = int(request.matchdict['user_id'])
292 300
             if not login:
293 301
                 raise UserNotFoundInTracimRequest('You request a candidate user but the context not permit to found one')  # nopep8
@@ -331,8 +339,9 @@ class TracimRequest(Request):
331 339
         workspace_id = ''
332 340
         try:
333 341
             if 'workspace_id' in request.matchdict:
334
-                if not request.matchdict['workspace_id'].isdecimal():
335
-                    raise WorkspaceNotFoundInTracimRequest('workspace_id is not a correct integer')  # nopep8
342
+                workspace_id_str = request.matchdict['workspace_id']
343
+                if not isinstance(workspace_id_str, str) or not workspace_id_str.isdecimal():  # nopep8
344
+                    raise InvalidWorkspaceId('workspace_id is not a correct integer')  # nopep8
336 345
                 workspace_id = int(request.matchdict['workspace_id'])
337 346
             if not workspace_id:
338 347
                 raise WorkspaceNotFoundInTracimRequest('No workspace_id property found in request')  # nopep8
@@ -368,7 +377,7 @@ class TracimRequest(Request):
368 377
                     if workspace_id.isdecimal():
369 378
                         workspace_id = int(workspace_id)
370 379
                     else:
371
-                        raise WorkspaceNotFoundInTracimRequest('workspace_id is not a correct integer')  # nopep8
380
+                        raise InvalidWorkspaceId('workspace_id is not a correct integer')  # nopep8
372 381
             if not workspace_id:
373 382
                 raise WorkspaceNotFoundInTracimRequest('No new_workspace_id property found in body')  # nopep8
374 383
             wapi = WorkspaceApi(