Skip to content

Commit dad1ccf

Browse files
authored
Merge pull request #917 from dfir-iris/api_v2_get_object_comment
Api v2 get object comment
2 parents 33e4d63 + 4a7ac3e commit dad1ccf

19 files changed

Lines changed: 303 additions & 24 deletions

File tree

source/app/blueprints/rest/alerts_routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,7 @@ def alert_comment_delete(alert_id, com_id):
966966

967967

968968
@alerts_rest_blueprint.route('/alerts/<int:alert_id>/comments/<int:com_id>', methods=['GET'])
969+
@endpoint_deprecated('GET', '/api/v2/alerts/{alert_identifier}/comments/{identifier}')
969970
@ac_api_requires(Permissions.alerts_read)
970971
def alert_comment_get(alert_id, com_id):
971972
"""

source/app/blueprints/rest/case/case_assets_routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ def case_comment_asset_add(cur_id, caseid):
386386

387387

388388
@case_assets_rest_blueprint.route('/case/assets/<int:cur_id>/comments/<int:com_id>', methods=['GET'])
389+
@endpoint_deprecated('GET', '/api/v2/assets/{asset_identifier}/comments/{identifier}')
389390
@ac_requires_case_identifier(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
390391
@ac_api_requires()
391392
def case_comment_asset_get(cur_id, com_id, caseid):

source/app/blueprints/rest/case/case_evidences_routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ def case_comment_evidence_add(cur_id, caseid):
189189

190190

191191
@case_evidences_rest_blueprint.route('/case/evidences/<int:cur_id>/comments/<int:com_id>', methods=['GET'])
192+
@endpoint_deprecated('GET', '/api/v2/evidences/{evidence_identifier}/comments/{identifier}')
192193
@ac_requires_case_identifier(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
193194
@ac_api_requires()
194195
def case_comment_evidence_get(cur_id, com_id, caseid):

source/app/blueprints/rest/case/case_ioc_routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ def case_comment_ioc_add(cur_id, caseid):
296296

297297

298298
@case_ioc_rest_blueprint.route('/case/ioc/<int:cur_id>/comments/<int:com_id>', methods=['GET'])
299+
@endpoint_deprecated('GET', '/api/v2/iocs/{ioc_identifier}/comments/{identifier}')
299300
@ac_requires_case_identifier(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
300301
@ac_api_requires()
301302
def case_comment_ioc_get(cur_id, com_id, caseid):

source/app/blueprints/rest/case/case_notes_routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,7 @@ def case_comment_note_add(cur_id, caseid):
441441

442442

443443
@case_notes_rest_blueprint.route('/case/notes/<int:cur_id>/comments/<int:com_id>', methods=['GET'])
444+
@endpoint_deprecated('GET', '/api/v2/notes/{note_identifier}/comments/{identifier}')
444445
@ac_requires_case_identifier(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
445446
@ac_api_requires()
446447
def case_comment_note_get(cur_id, com_id, caseid):

source/app/blueprints/rest/case/case_tasks_routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ def case_comment_task_add(cur_id: int, caseid: int):
215215

216216

217217
@case_tasks_rest_blueprint.route('/case/tasks/<int:cur_id>/comments/<int:com_id>', methods=['GET'])
218+
@endpoint_deprecated('GET', '/api/v2/tasks/{task_identifier}/comments/{identifier}')
218219
@ac_requires_case_identifier(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
219220
@ac_api_requires()
220221
def case_comment_task_get(cur_id: int, com_id: int, caseid: int):

source/app/blueprints/rest/case/case_timeline_routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def case_comment_delete(cur_id, com_id, caseid):
107107

108108

109109
@case_timeline_rest_blueprint.route('/case/timeline/events/<int:cur_id>/comments/<int:com_id>', methods=['GET'])
110+
@endpoint_deprecated('GET', '/api/v2/events/{event_identifier}/comments/{identifier}')
110111
@ac_requires_case_identifier(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
111112
@ac_api_requires()
112113
def case_comment_get(cur_id, com_id, caseid):

source/app/blueprints/rest/v2/alerts_routes/comments.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@
2323
from app.blueprints.access_controls import ac_api_requires
2424
from app.models.authorization import Permissions
2525
from app.blueprints.rest.endpoints import response_api_paginated
26+
from app.blueprints.rest.endpoints import response_api_success
2627
from app.blueprints.rest.endpoints import response_api_not_found
2728
from app.blueprints.rest.endpoints import response_api_created
2829
from app.blueprints.rest.endpoints import response_api_error
2930
from app.blueprints.rest.parsing import parse_pagination_parameters
3031
from app.schema.marshables import CommentSchema
3132
from app.business.comments import comments_get_filtered_by_alert
3233
from app.business.comments import comments_create_for_alert
34+
from app.business.comments import comments_get_for_alert
35+
from app.business.alerts import alerts_get
3336
from app.iris_engine.access_control.iris_user import iris_current_user
3437
from app.business.errors import ObjectNotFoundError
3538

@@ -58,6 +61,17 @@ def create(self, alert_identifier):
5861
except ObjectNotFoundError:
5962
return response_api_not_found()
6063

64+
def read(self, alert_identifier, identifier):
65+
try:
66+
alert = alerts_get(iris_current_user, alert_identifier)
67+
comment = comments_get_for_alert(alert, identifier)
68+
result = self._schema.dump(comment)
69+
return response_api_success(result)
70+
except ValidationError as e:
71+
return response_api_error('Data error', data=e.normalized_messages())
72+
except ObjectNotFoundError:
73+
return response_api_not_found()
74+
6175

6276
alerts_comments_blueprint = Blueprint('alerts_comments', __name__, url_prefix='/<int:alert_identifier>/comments')
6377
comments_operations = CommentsOperations()
@@ -73,3 +87,9 @@ def get_alerts_comments(alert_identifier):
7387
@ac_api_requires(Permissions.alerts_write)
7488
def create_alerts_comment(alert_identifier):
7589
return comments_operations.create(alert_identifier)
90+
91+
92+
@alerts_comments_blueprint.get('/<int:identifier>')
93+
@ac_api_requires(Permissions.alerts_read)
94+
def get_alerts_comment(alert_identifier, identifier):
95+
return comments_operations.read(alert_identifier, identifier)

source/app/blueprints/rest/v2/assets_routes/comments.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525
from app.blueprints.rest.endpoints import response_api_not_found
2626
from app.blueprints.rest.endpoints import response_api_created
2727
from app.blueprints.rest.endpoints import response_api_error
28+
from app.blueprints.rest.endpoints import response_api_success
2829
from app.blueprints.rest.parsing import parse_pagination_parameters
2930
from app.business.comments import comments_get_filtered_by_asset
3031
from app.business.comments import comments_create_for_asset
32+
from app.business.comments import comments_get_for_asset
3133
from app.business.assets import assets_get
3234
from app.business.errors import ObjectNotFoundError
3335
from app.schema.marshables import CommentSchema
@@ -48,7 +50,7 @@ def _get_asset(asset_identifier, possible_case_access_levels):
4850
raise ObjectNotFoundError()
4951
return asset
5052

51-
def get(self, asset_identifier):
53+
def search(self, asset_identifier):
5254
try:
5355
asset = self._get_asset(asset_identifier, [CaseAccessLevel.read_only, CaseAccessLevel.full_access])
5456

@@ -72,6 +74,17 @@ def create(self, asset_identifier):
7274
except ObjectNotFoundError:
7375
return response_api_not_found()
7476

77+
def read(self, asset_identifier, identifier):
78+
try:
79+
asset = self._get_asset(asset_identifier, [CaseAccessLevel.read_only, CaseAccessLevel.full_access])
80+
comment = comments_get_for_asset(asset, identifier)
81+
result = self._schema.dump(comment)
82+
return response_api_success(result)
83+
except ValidationError as e:
84+
return response_api_error('Data error', data=e.normalized_messages())
85+
except ObjectNotFoundError:
86+
return response_api_not_found()
87+
7588

7689
assets_comments_blueprint = Blueprint('assets_comments', __name__, url_prefix='/<int:asset_identifier>/comments')
7790
comments_operations = CommentsOperations()
@@ -80,10 +93,16 @@ def create(self, asset_identifier):
8093
@assets_comments_blueprint.get('')
8194
@ac_api_requires()
8295
def get_assets_comments(asset_identifier):
83-
return comments_operations.get(asset_identifier)
96+
return comments_operations.search(asset_identifier)
8497

8598

8699
@assets_comments_blueprint.post('')
87100
@ac_api_requires()
88101
def create_assets_comment(asset_identifier):
89102
return comments_operations.create(asset_identifier)
103+
104+
105+
@assets_comments_blueprint.get('/<int:identifier>')
106+
@ac_api_requires()
107+
def get_assets_comment(asset_identifier, identifier):
108+
return comments_operations.read(asset_identifier, identifier)

source/app/blueprints/rest/v2/events_routes/comments.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525
from app.blueprints.rest.endpoints import response_api_not_found
2626
from app.blueprints.rest.endpoints import response_api_created
2727
from app.blueprints.rest.endpoints import response_api_error
28+
from app.blueprints.rest.endpoints import response_api_success
2829
from app.blueprints.rest.parsing import parse_pagination_parameters
2930
from app.iris_engine.access_control.iris_user import iris_current_user
3031
from app.business.comments import comments_get_filtered_by_event
3132
from app.business.comments import comments_create_for_event
33+
from app.business.comments import comments_get_for_event
3234
from app.business.events import events_get
3335
from app.business.errors import ObjectNotFoundError
3436
from app.models.cases import CasesEvent
@@ -49,7 +51,7 @@ def _get_event(event_identifier, possible_case_access_levels) -> CasesEvent:
4951
raise ObjectNotFoundError()
5052
return event
5153

52-
def get(self, event_identifier):
54+
def search(self, event_identifier):
5355
try:
5456
event = self._get_event(event_identifier, [CaseAccessLevel.read_only, CaseAccessLevel.full_access])
5557

@@ -73,6 +75,17 @@ def create(self, event_identifier):
7375
except ObjectNotFoundError:
7476
return response_api_not_found()
7577

78+
def read(self, event_identifier, identifier):
79+
try:
80+
event = self._get_event(event_identifier, [CaseAccessLevel.read_only, CaseAccessLevel.full_access])
81+
comment = comments_get_for_event(event, identifier)
82+
result = self._schema.dump(comment)
83+
return response_api_success(result)
84+
except ValidationError as e:
85+
return response_api_error('Data error', data=e.normalized_messages())
86+
except ObjectNotFoundError:
87+
return response_api_not_found()
88+
7689

7790
events_comments_blueprint = Blueprint('events_comments', __name__, url_prefix='/<int:event_identifier>/comments')
7891
comments_operations = CommentsOperations()
@@ -81,10 +94,16 @@ def create(self, event_identifier):
8194
@events_comments_blueprint.get('')
8295
@ac_api_requires()
8396
def get_event_comments(event_identifier):
84-
return comments_operations.get(event_identifier)
97+
return comments_operations.search(event_identifier)
8598

8699

87100
@events_comments_blueprint.post('')
88101
@ac_api_requires()
89102
def create_event_comment(event_identifier):
90103
return comments_operations.create(event_identifier)
104+
105+
106+
@events_comments_blueprint.get('/<int:identifier>')
107+
@ac_api_requires()
108+
def get_event_comment(event_identifier, identifier):
109+
return comments_operations.read(event_identifier, identifier)

0 commit comments

Comments
 (0)