Aucune description

case_timeline_routes.py 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. # IRIS Source Code
  2. # Copyright (C) 2021 - Airbus CyberSecurity (SAS) - DFIR-IRIS Team
  3. # ir@cyberactionlab.net - contact@dfir-iris.org
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU Lesser General Public
  7. # License as published by the Free Software Foundation; either
  8. # version 3 of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. # Lesser General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Lesser General Public License
  16. # along with this program; if not, write to the Free Software Foundation,
  17. # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. from flask import Blueprint
  19. from flask import redirect
  20. from flask import render_template
  21. from flask import url_for
  22. from flask_wtf import FlaskForm
  23. from app.datamgmt.case.case_events_db import get_case_assets_for_tm
  24. from app.datamgmt.case.case_events_db import get_case_event
  25. from app.datamgmt.case.case_events_db import get_case_events_comments_count
  26. from app.datamgmt.case.case_events_db import get_case_iocs_for_tm
  27. from app.datamgmt.case.case_events_db import get_default_cat
  28. from app.datamgmt.case.case_events_db import get_event_assets_ids
  29. from app.datamgmt.case.case_events_db import get_event_iocs_ids
  30. from app.datamgmt.case.case_events_db import get_events_categories
  31. from app.datamgmt.manage.manage_attribute_db import get_default_custom_attributes
  32. from app.forms import CaseEventForm
  33. from app.models.authorization import CaseAccessLevel
  34. from app.models.authorization import User
  35. from app.models.cases import Cases
  36. from app.models.cases import CasesEvent
  37. from app.blueprints.access_controls import ac_case_requires
  38. from app.blueprints.responses import response_error
  39. _EVENT_TAGS = ['Network', 'Server', 'ActiveDirectory', 'Computer', 'Malware', 'User Interaction']
  40. case_timeline_blueprint = Blueprint('case_timeline',
  41. __name__,
  42. template_folder='templates')
  43. @case_timeline_blueprint.route('/case/timeline', methods=['GET'])
  44. @ac_case_requires(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
  45. def case_timeline(caseid, url_redir):
  46. if url_redir:
  47. return redirect(url_for('case_timeline.case_timeline', cid=caseid, redirect=True))
  48. case = Cases.query.filter(Cases.case_id == caseid).first()
  49. form = FlaskForm()
  50. return render_template("case_timeline.html", case=case, form=form)
  51. @case_timeline_blueprint.route('/case/timeline/visualize', methods=['GET'])
  52. @ac_case_requires(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
  53. def case_getgraph_page(caseid, url_redir):
  54. if url_redir:
  55. return redirect(url_for('case_timeline.case_getgraph_page', cid=caseid, redirect=True))
  56. return render_template("case_graph_timeline.html")
  57. @case_timeline_blueprint.route('/case/timeline/events/<int:cur_id>/comments/modal', methods=['GET'])
  58. @ac_case_requires(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
  59. def case_comment_modal(cur_id, caseid, url_redir):
  60. if url_redir:
  61. return redirect(url_for('case_timeline.case_timeline', cid=caseid, redirect=True))
  62. event = get_case_event(cur_id, caseid=caseid)
  63. if not event:
  64. return response_error('Invalid event ID')
  65. return render_template("modal_conversation.html", element_id=cur_id, element_type='timeline/events',
  66. title=event.event_title)
  67. @case_timeline_blueprint.route('/case/timeline/events/<int:cur_id>/modal', methods=['GET'])
  68. @ac_case_requires(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
  69. def event_view_modal(cur_id, caseid, url_redir):
  70. if url_redir:
  71. return redirect(url_for('case_timeline.case_timeline', cid=caseid, redirect=True))
  72. event = get_case_event(cur_id, caseid)
  73. if not event:
  74. return response_error("Invalid event ID for this case")
  75. form = CaseEventForm()
  76. form.event_title.render_kw = {'value': event.event_title}
  77. form.event_content.data = event.event_content
  78. form.event_raw.data = event.event_raw
  79. form.event_source.render_kw = {'value': event.event_source}
  80. form.event_in_graph.data = event.event_in_graph
  81. form.event_in_summary.data = event.event_in_summary
  82. categories = get_events_categories()
  83. form.event_category_id.choices = [(c.id, c.name) for c in categories]
  84. assets = get_case_assets_for_tm(caseid)
  85. iocs = get_case_iocs_for_tm(caseid)
  86. assets_prefill = get_event_assets_ids(cur_id, caseid)
  87. iocs_prefill = get_event_iocs_ids(cur_id, caseid)
  88. comments_map = get_case_events_comments_count([cur_id])
  89. usr_name, = User.query.filter(User.id == event.user_id).with_entities(User.name).first()
  90. return render_template("modal_add_case_event.html", form=form, event=event, user_name=usr_name, tags=_EVENT_TAGS,
  91. assets=assets, iocs=iocs, comments_map=comments_map,
  92. assets_prefill=assets_prefill, iocs_prefill=iocs_prefill,
  93. category=event.category, attributes=event.custom_attributes)
  94. @case_timeline_blueprint.route('/case/timeline/filter-help/modal', methods=['GET'])
  95. @ac_case_requires(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
  96. def case_filter_help_modal(caseid, url_redir):
  97. if url_redir:
  98. return redirect(url_for('case_timeline.case_timeline', cid=caseid, redirect=True))
  99. return render_template("modal_help_filter_tm.html")
  100. @case_timeline_blueprint.route('/case/timeline/events/add/modal', methods=['GET'])
  101. @ac_case_requires(CaseAccessLevel.full_access)
  102. def case_add_event_modal(caseid, url_redir):
  103. if url_redir:
  104. return redirect(url_for('case_timeline.case_timeline', cid=caseid, redirect=True))
  105. event = CasesEvent()
  106. event.custom_attributes = get_default_custom_attributes('event')
  107. form = CaseEventForm()
  108. assets = get_case_assets_for_tm(caseid)
  109. iocs = get_case_iocs_for_tm(caseid)
  110. def_cat = get_default_cat()
  111. categories = get_events_categories()
  112. form.event_category_id.choices = [(c.id, c.name) for c in categories]
  113. form.event_in_graph.data = True
  114. return render_template("modal_add_case_event.html", form=form, event=event,
  115. tags=_EVENT_TAGS, assets=assets, iocs=iocs, assets_prefill=None, category=def_cat,
  116. attributes=event.custom_attributes)