Procházet zdrojové kódy

handle exception for non-integer id in path/body error + remove uneeded jsondecodeerror

Guénaël Muller před 6 roky
rodič
revize
292738b14e

+ 15 - 8
tracim/lib/utils/request.py Zobrazit soubor

@@ -214,6 +214,8 @@ class TracimRequest(Request):
214 214
         comment_id = ''
215 215
         try:
216 216
             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
217 219
                 comment_id = int(request.matchdict['comment_id'])
218 220
             if not comment_id:
219 221
                 raise ContentNotFoundInTracimRequest('No comment_id property found in request')  # nopep8
@@ -228,8 +230,6 @@ class TracimRequest(Request):
228 230
                 workspace=workspace,
229 231
                 parent=content,
230 232
             )
231
-        except JSONDecodeError as exc:
232
-            raise ContentNotFound('Invalid JSON content') from exc
233 233
         except NoResultFound as exc:
234 234
             raise ContentNotFound(
235 235
                 'Comment {} does not exist '
@@ -253,6 +253,8 @@ class TracimRequest(Request):
253 253
         content_id = ''
254 254
         try:
255 255
             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
256 258
                 content_id = int(request.matchdict['content_id'])
257 259
             if not content_id:
258 260
                 raise ContentNotFoundInTracimRequest('No content_id property found in request')  # nopep8
@@ -262,8 +264,6 @@ class TracimRequest(Request):
262 264
                 config=request.registry.settings['CFG']
263 265
             )
264 266
             content = api.get_one(content_id=content_id, workspace=workspace, content_type=ContentType.Any)  # nopep8
265
-        except JSONDecodeError as exc:
266
-            raise ContentNotFound('Invalid JSON content') from exc
267 267
         except NoResultFound as exc:
268 268
             raise ContentNotFound(
269 269
                 'Content {} does not exist '
@@ -286,7 +286,9 @@ class TracimRequest(Request):
286 286
         try:
287 287
             login = None
288 288
             if 'user_id' in request.matchdict:
289
-                login = request.matchdict['user_id']
289
+                if not request.matchdict['user_id'].isdecimal():
290
+                    raise UserNotFoundInTracimRequest('user_id is not a correct integer')  # nopep8
291
+                login = int(request.matchdict['user_id'])
290 292
             if not login:
291 293
                 raise UserNotFoundInTracimRequest('You request a candidate user but the context not permit to found one')  # nopep8
292 294
             user = uapi.get_one(login)
@@ -329,7 +331,9 @@ class TracimRequest(Request):
329 331
         workspace_id = ''
330 332
         try:
331 333
             if 'workspace_id' in request.matchdict:
332
-                workspace_id = request.matchdict['workspace_id']
334
+                if not request.matchdict['workspace_id'].isdecimal():
335
+                    raise WorkspaceNotFoundInTracimRequest('workspace_id is not a correct integer')  # nopep8
336
+                workspace_id = int(request.matchdict['workspace_id'])
333 337
             if not workspace_id:
334 338
                 raise WorkspaceNotFoundInTracimRequest('No workspace_id property found in request')  # nopep8
335 339
             wapi = WorkspaceApi(
@@ -338,8 +342,6 @@ class TracimRequest(Request):
338 342
                 config=request.registry.settings['CFG']
339 343
             )
340 344
             workspace = wapi.get_one(workspace_id)
341
-        except JSONDecodeError as exc:
342
-            raise WorkspaceNotFound('Invalid JSON content') from exc
343 345
         except NoResultFound as exc:
344 346
             raise WorkspaceNotFound(
345 347
                 'Workspace {} does not exist '
@@ -362,6 +364,11 @@ class TracimRequest(Request):
362 364
         try:
363 365
             if 'new_workspace_id' in request.json_body:
364 366
                 workspace_id = request.json_body['new_workspace_id']
367
+                if not isinstance(workspace_id, int):
368
+                    if workspace_id.isdecimal():
369
+                        workspace_id = int(workspace_id)
370
+                    else:
371
+                        raise WorkspaceNotFoundInTracimRequest('workspace_id is not a correct integer')  # nopep8
365 372
             if not workspace_id:
366 373
                 raise WorkspaceNotFoundInTracimRequest('No new_workspace_id property found in body')  # nopep8
367 374
             wapi = WorkspaceApi(

+ 64 - 0
tracim/tests/functional/test_contents.py Zobrazit soubor

@@ -160,6 +160,38 @@ class TestHtmlDocuments(FunctionalTest):
160 160
             status=400
161 161
         )
162 162
 
163
+    def test_api__get_html_document__err_400__workspace_id_is_not_int(self) -> None:  # nopep8
164
+        """
165
+        Get one html document of a content, workspace id is not int
166
+        """
167
+        self.testapp.authorization = (
168
+            'Basic',
169
+            (
170
+                'admin@admin.admin',
171
+                'admin@admin.admin'
172
+            )
173
+        )
174
+        res = self.testapp.get(
175
+            '/api/v2/workspaces/coucou/html-documents/6',
176
+            status=400
177
+        )
178
+
179
+    def test_api__get_html_document__err_400__content_id_is_not_int(self) -> None:  # nopep8
180
+        """
181
+        Get one html document of a content, content_id is not int
182
+        """
183
+        self.testapp.authorization = (
184
+            'Basic',
185
+            (
186
+                'admin@admin.admin',
187
+                'admin@admin.admin'
188
+            )
189
+        )
190
+        res = self.testapp.get(
191
+            '/api/v2/workspaces/2/html-documents/coucou',
192
+            status=400
193
+        )
194
+
163 195
     def test_api__update_html_document__ok_200__nominal_case(self) -> None:
164 196
         """
165 197
         Update(put) one html document of a content
@@ -469,6 +501,38 @@ class TestThreads(FunctionalTest):
469 501
             status=400
470 502
         )
471 503
 
504
+    def test_api__get_thread__err_400__workspace_id_is_not_int(self) -> None:  # nopep8
505
+        """
506
+        Get one thread, workspace id is not int
507
+        """
508
+        self.testapp.authorization = (
509
+            'Basic',
510
+            (
511
+                'admin@admin.admin',
512
+                'admin@admin.admin'
513
+            )
514
+        )
515
+        res = self.testapp.get(
516
+            '/api/v2/workspaces/coucou/threads/7',
517
+            status=400
518
+        )
519
+
520
+    def test_api__get_thread__err_400_content_id_is_not_int(self) -> None:  # nopep8
521
+        """
522
+        Get one thread, content id is not int
523
+        """
524
+        self.testapp.authorization = (
525
+            'Basic',
526
+            (
527
+                'admin@admin.admin',
528
+                'admin@admin.admin'
529
+            )
530
+        )
531
+        res = self.testapp.get(
532
+            '/api/v2/workspaces/2/threads/coucou',
533
+            status=400
534
+        )
535
+
472 536
     def test_api__update_thread__ok_200__nominal_case(self) -> None:
473 537
         """
474 538
         Update(put) thread