Sin descripción

manage_cases_routes.py 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. # IRIS Source Code
  2. # contact@dfir-iris.org
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU Lesser General Public
  6. # License as published by the Free Software Foundation; either
  7. # version 3 of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. # Lesser General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU Lesser General Public License
  15. # along with this program; if not, write to the Free Software Foundation,
  16. # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. from typing import Union
  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_login import current_user
  23. from flask_wtf import FlaskForm
  24. from werkzeug import Response
  25. from app.datamgmt.case.case_db import get_case
  26. from app.datamgmt.client.client_db import get_client_list
  27. from app.datamgmt.manage.manage_attribute_db import get_default_custom_attributes
  28. from app.datamgmt.manage.manage_case_classifications_db import get_case_classifications_list
  29. from app.datamgmt.manage.manage_case_state_db import get_case_states_list
  30. from app.datamgmt.manage.manage_case_templates_db import get_case_templates_list
  31. from app.datamgmt.manage.manage_cases_db import get_case_protagonists
  32. from app.datamgmt.manage.manage_common import get_severities_list
  33. from app.forms import AddCaseForm
  34. from app.iris_engine.access_control.utils import ac_fast_check_current_user_has_case_access
  35. from app.iris_engine.access_control.utils import ac_current_user_has_permission
  36. from app.models.authorization import CaseAccessLevel
  37. from app.models.authorization import Permissions
  38. from app.schema.marshables import CaseDetailsSchema
  39. from app.blueprints.access_controls import ac_api_return_access_denied
  40. from app.blueprints.access_controls import ac_requires
  41. from app.blueprints.responses import response_error
  42. manage_cases_blueprint = Blueprint('manage_case',
  43. __name__,
  44. template_folder='templates')
  45. @manage_cases_blueprint.route('/manage/cases', methods=['GET'])
  46. @ac_requires(Permissions.standard_user, no_cid_required=True)
  47. def manage_index_cases(caseid, url_redir):
  48. if url_redir:
  49. return redirect(url_for('manage_case.manage_index_cases', cid=caseid))
  50. return render_template('manage_cases.html')
  51. def _details_case(cur_id: int, caseid: int, url_redir: bool) -> Union[str, Response]:
  52. """
  53. Get case details
  54. Args:
  55. cur_id (int): case id
  56. caseid (int): case id
  57. url_redir (bool): url redirection
  58. Returns:
  59. Union[str, Response]: The case details
  60. """
  61. if url_redir:
  62. return response_error("Invalid request")
  63. if not ac_fast_check_current_user_has_case_access(cur_id, [CaseAccessLevel.read_only, CaseAccessLevel.full_access]):
  64. return ac_api_return_access_denied(caseid=cur_id)
  65. res = get_case(cur_id)
  66. res = CaseDetailsSchema().dump(res)
  67. if not res:
  68. return response_error("Unknown case")
  69. case_classifications = get_case_classifications_list()
  70. case_states = get_case_states_list()
  71. user_is_server_administrator = ac_current_user_has_permission(Permissions.server_administrator)
  72. customers = get_client_list(current_user_id=current_user.id,
  73. is_server_administrator=user_is_server_administrator)
  74. severities = get_severities_list()
  75. protagonists = [r._asdict() for r in get_case_protagonists(cur_id)]
  76. form = FlaskForm()
  77. return render_template("modal_case_info_from_case.html", data=res, form=form, protagonists=protagonists,
  78. case_classifications=case_classifications, case_states=case_states, customers=customers,
  79. severities=severities)
  80. @manage_cases_blueprint.route('/case/details/<int:cur_id>', methods=['GET'])
  81. @ac_requires(no_cid_required=True)
  82. def details_case_from_case_modal(cur_id: int, caseid: int, url_redir: bool) -> Union[str, Response]:
  83. return _details_case(cur_id, caseid, url_redir)
  84. @manage_cases_blueprint.route('/manage/cases/details/<int:cur_id>', methods=['GET'])
  85. @ac_requires(no_cid_required=True)
  86. def manage_details_case(cur_id: int, caseid: int, url_redir: bool) -> Union[Response, str]:
  87. return _details_case(cur_id, caseid, url_redir)
  88. @manage_cases_blueprint.route('/manage/cases/add/modal', methods=['GET'])
  89. @ac_requires(Permissions.standard_user)
  90. def add_case_modal(caseid: int, url_redir: bool):
  91. if url_redir:
  92. return redirect(url_for('manage_case.manage_index_cases', cid=caseid))
  93. form = AddCaseForm()
  94. # Show only clients that the user has access to
  95. client_list = get_client_list(current_user_id=current_user.id,
  96. is_server_administrator=ac_current_user_has_permission(
  97. Permissions.server_administrator))
  98. form.case_customer.choices = [(c['customer_id'], c['customer_name']) for c in client_list]
  99. form.classification_id.choices = [(clc['id'], clc['name_expanded']) for clc in get_case_classifications_list()]
  100. form.case_template_id.choices = [(ctp['id'], ctp['display_name']) for ctp in get_case_templates_list()]
  101. attributes = get_default_custom_attributes('case')
  102. return render_template('modal_add_case.html', form=form, attributes=attributes)