瀏覽代碼

better invalid int errors

Guénaël Muller 6 年之前
父節點
當前提交
4a63b69586
共有 3 個文件被更改,包括 40 次插入10 次删除
  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 查看文件

29
 from tracim.views.contents_api.comment_controller import CommentController
29
 from tracim.views.contents_api.comment_controller import CommentController
30
 from tracim.views.errors import ErrorSchema
30
 from tracim.views.errors import ErrorSchema
31
 from tracim.exceptions import NotAuthenticated
31
 from tracim.exceptions import NotAuthenticated
32
+from tracim.exceptions import InvalidId
32
 from tracim.exceptions import InsufficientUserProfile
33
 from tracim.exceptions import InsufficientUserProfile
33
 from tracim.exceptions import InsufficientUserRoleInWorkspace
34
 from tracim.exceptions import InsufficientUserRoleInWorkspace
34
 from tracim.exceptions import WorkspaceNotFoundInTracimRequest
35
 from tracim.exceptions import WorkspaceNotFoundInTracimRequest
90
     context.handle_exception(UserDoesNotExist, HTTPStatus.BAD_REQUEST)
91
     context.handle_exception(UserDoesNotExist, HTTPStatus.BAD_REQUEST)
91
     context.handle_exception(ContentNotFound, HTTPStatus.BAD_REQUEST)
92
     context.handle_exception(ContentNotFound, HTTPStatus.BAD_REQUEST)
92
     context.handle_exception(ContentTypeNotAllowed, HTTPStatus.BAD_REQUEST)
93
     context.handle_exception(ContentTypeNotAllowed, HTTPStatus.BAD_REQUEST)
94
+    context.handle_exception(InvalidId, HTTPStatus.BAD_REQUEST)
93
     # Auth exception
95
     # Auth exception
94
     context.handle_exception(NotAuthenticated, HTTPStatus.UNAUTHORIZED)
96
     context.handle_exception(NotAuthenticated, HTTPStatus.UNAUTHORIZED)
95
     context.handle_exception(AuthenticationFailed, HTTPStatus.FORBIDDEN)
97
     context.handle_exception(AuthenticationFailed, HTTPStatus.FORBIDDEN)

+ 19 - 0
tracim/exceptions.py 查看文件

121
     pass
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
 class ContentNotFound(TracimException):
143
 class ContentNotFound(TracimException):
125
     pass
144
     pass
126
 
145
 

+ 19 - 10
tracim/lib/utils/request.py 查看文件

2
 from pyramid.request import Request
2
 from pyramid.request import Request
3
 from sqlalchemy.orm.exc import NoResultFound
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
 from tracim.exceptions import ContentNotFoundInTracimRequest
11
 from tracim.exceptions import ContentNotFoundInTracimRequest
7
 from tracim.exceptions import WorkspaceNotFoundInTracimRequest
12
 from tracim.exceptions import WorkspaceNotFoundInTracimRequest
8
 from tracim.exceptions import UserNotFoundInTracimRequest
13
 from tracim.exceptions import UserNotFoundInTracimRequest
214
         comment_id = ''
219
         comment_id = ''
215
         try:
220
         try:
216
             if 'comment_id' in request.matchdict:
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
                 comment_id = int(request.matchdict['comment_id'])
225
                 comment_id = int(request.matchdict['comment_id'])
220
             if not comment_id:
226
             if not comment_id:
221
                 raise ContentNotFoundInTracimRequest('No comment_id property found in request')  # nopep8
227
                 raise ContentNotFoundInTracimRequest('No comment_id property found in request')  # nopep8
253
         content_id = ''
259
         content_id = ''
254
         try:
260
         try:
255
             if 'content_id' in request.matchdict:
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
                 content_id = int(request.matchdict['content_id'])
265
                 content_id = int(request.matchdict['content_id'])
259
             if not content_id:
266
             if not content_id:
260
                 raise ContentNotFoundInTracimRequest('No content_id property found in request')  # nopep8
267
                 raise ContentNotFoundInTracimRequest('No content_id property found in request')  # nopep8
286
         try:
293
         try:
287
             login = None
294
             login = None
288
             if 'user_id' in request.matchdict:
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
                 login = int(request.matchdict['user_id'])
299
                 login = int(request.matchdict['user_id'])
292
             if not login:
300
             if not login:
293
                 raise UserNotFoundInTracimRequest('You request a candidate user but the context not permit to found one')  # nopep8
301
                 raise UserNotFoundInTracimRequest('You request a candidate user but the context not permit to found one')  # nopep8
331
         workspace_id = ''
339
         workspace_id = ''
332
         try:
340
         try:
333
             if 'workspace_id' in request.matchdict:
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
                 workspace_id = int(request.matchdict['workspace_id'])
345
                 workspace_id = int(request.matchdict['workspace_id'])
337
             if not workspace_id:
346
             if not workspace_id:
338
                 raise WorkspaceNotFoundInTracimRequest('No workspace_id property found in request')  # nopep8
347
                 raise WorkspaceNotFoundInTracimRequest('No workspace_id property found in request')  # nopep8
368
                     if workspace_id.isdecimal():
377
                     if workspace_id.isdecimal():
369
                         workspace_id = int(workspace_id)
378
                         workspace_id = int(workspace_id)
370
                     else:
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
             if not workspace_id:
381
             if not workspace_id:
373
                 raise WorkspaceNotFoundInTracimRequest('No new_workspace_id property found in body')  # nopep8
382
                 raise WorkspaceNotFoundInTracimRequest('No new_workspace_id property found in body')  # nopep8
374
             wapi = WorkspaceApi(
383
             wapi = WorkspaceApi(