Aucune description

profile_routes.py 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. # IRIS Source Code
  2. # Copyright (C) 2024 - DFIR-IRIS
  3. # 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. import marshmallow
  19. import secrets
  20. from flask import Blueprint
  21. from flask import request
  22. from flask import session
  23. from flask_login import current_user
  24. from app import db
  25. from app.datamgmt.manage.manage_users_db import get_user
  26. from app.datamgmt.manage.manage_users_db import get_user_primary_org
  27. from app.datamgmt.manage.manage_users_db import update_user
  28. from app.iris_engine.access_control.utils import ac_current_user_has_permission
  29. from app.iris_engine.access_control.utils import ac_get_effective_permissions_of_user
  30. from app.iris_engine.access_control.utils import ac_recompute_effective_ac
  31. from app.iris_engine.utils.tracker import track_activity
  32. from app.models.authorization import Permissions
  33. from app.schema.marshables import UserSchema
  34. from app.schema.marshables import BasicUserSchema
  35. from app.blueprints.access_controls import ac_api_requires
  36. from app.blueprints.responses import response_error
  37. from app.blueprints.responses import response_success
  38. from app.blueprints.rest.endpoints import endpoint_removed
  39. profile_rest_blueprint = Blueprint('profile_rest', __name__)
  40. @profile_rest_blueprint.route('/user/token/renew', methods=['GET'])
  41. @ac_api_requires()
  42. def user_renew_api():
  43. user = get_user(current_user.id)
  44. user.api_key = secrets.token_urlsafe(nbytes=64)
  45. db.session.commit()
  46. return response_success("Token renewed")
  47. @profile_rest_blueprint.route('/user/has-permission', methods=['POST'])
  48. @ac_api_requires()
  49. def user_has_permission():
  50. req_js = request.json
  51. if not req_js:
  52. return response_error('Invalid request')
  53. if not req_js.get('permission_name') or not \
  54. req_js.get('permission_value'):
  55. return response_error('Invalid request')
  56. if req_js.get('permission_value') not in Permissions._value2member_map_:
  57. return response_error('Invalid permission')
  58. if Permissions(req_js.get('permission_value')).name.lower() != req_js.get('permission_name').lower():
  59. return response_error('Permission value-name mismatch')
  60. if ac_current_user_has_permission(Permissions(req_js.get('permission_value'))):
  61. return response_success('User has permission')
  62. return response_error('User does not have permission', status=403)
  63. @profile_rest_blueprint.route('/user/update', methods=['POST'])
  64. @ac_api_requires()
  65. def update_user_view():
  66. try:
  67. user = get_user(current_user.id)
  68. if not user:
  69. return response_error("Invalid user ID for this case")
  70. # validate before saving
  71. user_schema = UserSchema()
  72. jsdata = request.get_json()
  73. jsdata['user_id'] = current_user.id
  74. puo = get_user_primary_org(current_user.id)
  75. jsdata['user_primary_organisation_id'] = puo.org_id
  76. cuser = user_schema.load(jsdata, instance=user, partial=True)
  77. update_user(password=jsdata.get('user_password'),
  78. user=user)
  79. db.session.commit()
  80. if cuser:
  81. track_activity("user {} updated itself".format(user.user))
  82. return response_success("User updated", data=user_schema.dump(user))
  83. return response_error("Unable to update user for internal reasons")
  84. except marshmallow.exceptions.ValidationError as e:
  85. return response_error(msg="Data error", data=e.messages)
  86. @profile_rest_blueprint.route('/user/theme/set/<string:theme>', methods=['GET'])
  87. @ac_api_requires()
  88. def profile_set_theme(theme):
  89. if theme not in ['dark', 'light']:
  90. return response_error('Invalid data')
  91. user = get_user(current_user.id)
  92. if not user:
  93. return response_error("Invalid user ID")
  94. user.in_dark_mode = (theme == 'dark')
  95. db.session.commit()
  96. return response_success('Theme changed')
  97. @profile_rest_blueprint.route('/user/deletion-prompt/set/<string:val>', methods=['GET'])
  98. @ac_api_requires()
  99. def profile_set_deletion_prompt(val):
  100. if val not in ['true', 'false']:
  101. return response_error('Invalid data')
  102. user = get_user(current_user.id)
  103. if not user:
  104. return response_error("Invalid user ID")
  105. user.has_deletion_confirmation = (val == 'true')
  106. db.session.commit()
  107. return response_success('Deletion prompt {}'.format('enabled' if val == 'true' else 'disabled'))
  108. @profile_rest_blueprint.route('/user/mini-sidebar/set/<string:val>', methods=['GET'])
  109. @ac_api_requires()
  110. def profile_set_minisidebar(val):
  111. if val not in ['true', 'false']:
  112. return response_error('Invalid data')
  113. user = get_user(current_user.id)
  114. if not user:
  115. return response_error("Invalid user ID")
  116. user.has_mini_sidebar = (val == 'true')
  117. db.session.commit()
  118. return response_success('Mini sidebar {}'.format('enabled' if val == 'true' else 'disabled'))
  119. @profile_rest_blueprint.route('/user/refresh-permissions', methods=['GET'])
  120. @ac_api_requires()
  121. def profile_refresh_permissions_and_ac():
  122. user = get_user(current_user.id)
  123. if not user:
  124. return response_error("Invalid user ID")
  125. ac_recompute_effective_ac(current_user.id)
  126. session['permissions'] = ac_get_effective_permissions_of_user(user)
  127. return response_success('Access control and permissions refreshed')
  128. @profile_rest_blueprint.route('/user/whoami', methods=['GET'])
  129. @ac_api_requires()
  130. def profile_whoami():
  131. """Returns the current user's profile"""
  132. user = get_user(current_user.id)
  133. if not user:
  134. return response_error("Invalid user ID")
  135. user_schema = BasicUserSchema()
  136. return response_success(data=user_schema.dump(user))
  137. @profile_rest_blueprint.route('/user/is-admin', methods=['GET'])
  138. @endpoint_removed('Use /user/has-permission to check permission', 'v1.5.0')
  139. def user_is_admin(caseid):
  140. pass