Nessuna descrizione

manage_groups_db.py 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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 flask_login import current_user
  18. from sqlalchemy import and_
  19. from app import db
  20. from app.datamgmt.case.case_db import get_case
  21. from app.datamgmt.manage.manage_cases_db import list_cases_id
  22. from app.iris_engine.access_control.utils import ac_access_level_mask_from_val_list, ac_ldp_group_removal
  23. from app.iris_engine.access_control.utils import ac_access_level_to_list
  24. from app.iris_engine.access_control.utils import ac_auto_update_user_effective_access
  25. from app.iris_engine.access_control.utils import ac_permission_to_list
  26. from app.models.cases import Cases
  27. from app.models.authorization import Group
  28. from app.models.authorization import GroupCaseAccess
  29. from app.models.authorization import User
  30. from app.models.authorization import UserGroup
  31. from app.schema.marshables import AuthorizationGroupSchema
  32. def get_groups_list():
  33. groups = Group.query.all()
  34. return groups
  35. def get_groups_list_hr_perms():
  36. groups = get_groups_list()
  37. get_membership_list = UserGroup.query.with_entities(
  38. UserGroup.group_id,
  39. User.user,
  40. User.id,
  41. User.name
  42. ).join(UserGroup.user).all()
  43. membership_list = {}
  44. for member in get_membership_list:
  45. if member.group_id not in membership_list:
  46. membership_list[member.group_id] = [{
  47. 'user': member.user,
  48. 'name': member.name,
  49. 'id': member.id
  50. }]
  51. else:
  52. membership_list[member.group_id].append({
  53. 'user': member.user,
  54. 'name': member.name,
  55. 'id': member.id
  56. })
  57. groups = AuthorizationGroupSchema().dump(groups, many=True)
  58. for group in groups:
  59. perms = ac_permission_to_list(group['group_permissions'])
  60. group['group_permissions_list'] = perms
  61. group['group_members'] = membership_list.get(group['group_id'], [])
  62. return groups
  63. def get_group(group_id):
  64. group = Group.query.filter(Group.group_id == group_id).first()
  65. return group
  66. def get_group_by_name(group_name):
  67. groups = Group.query.filter(Group.group_name == group_name)
  68. return groups.first()
  69. def get_group_with_members(group_id):
  70. group = get_group(group_id)
  71. if not group:
  72. return None
  73. get_membership_list = UserGroup.query.with_entities(
  74. UserGroup.group_id,
  75. User.user,
  76. User.id,
  77. User.name
  78. ).join(
  79. UserGroup.user
  80. ).filter(
  81. UserGroup.group_id == group_id
  82. ).all()
  83. membership_list = {}
  84. for member in get_membership_list:
  85. if member.group_id not in membership_list:
  86. membership_list[member.group_id] = [{
  87. 'user': member.user,
  88. 'name': member.name,
  89. 'id': member.id
  90. }]
  91. else:
  92. membership_list[member.group_id].append({
  93. 'user': member.user,
  94. 'name': member.name,
  95. 'id': member.id
  96. })
  97. perms = ac_permission_to_list(group.group_permissions)
  98. setattr(group, 'group_permissions_list', perms)
  99. setattr(group, 'group_members', membership_list.get(group.group_id, []))
  100. return group
  101. def get_group_details(group_id):
  102. group = get_group_with_members(group_id)
  103. if not group:
  104. return group
  105. group_accesses = GroupCaseAccess.query.with_entities(
  106. GroupCaseAccess.access_level,
  107. GroupCaseAccess.case_id,
  108. Cases.name.label('case_name')
  109. ).join(
  110. GroupCaseAccess.case
  111. ).filter(
  112. GroupCaseAccess.group_id == group_id
  113. ).all()
  114. group_cases_access = []
  115. for kgroup in group_accesses:
  116. group_cases_access.append({
  117. "access_level": kgroup.access_level,
  118. "access_level_list": ac_access_level_to_list(kgroup.access_level),
  119. "case_id": kgroup.case_id,
  120. "case_name": kgroup.case_name
  121. })
  122. setattr(group, 'group_cases_access', group_cases_access)
  123. return group
  124. def update_group_members(group, members):
  125. if not group:
  126. return None
  127. cur_groups = UserGroup.query.with_entities(
  128. UserGroup.user_id
  129. ).filter(UserGroup.group_id == group.group_id).all()
  130. set_cur_groups = set([grp[0] for grp in cur_groups])
  131. set_members = set(int(mber) for mber in members)
  132. users_to_add = set_members - set_cur_groups
  133. users_to_remove = set_cur_groups - set_members
  134. for uid in users_to_add:
  135. user = User.query.filter(User.id == uid).first()
  136. if user:
  137. ug = UserGroup()
  138. ug.group_id = group.group_id
  139. ug.user_id = user.id
  140. db.session.add(ug)
  141. db.session.commit()
  142. ac_auto_update_user_effective_access(uid)
  143. for uid in users_to_remove:
  144. if current_user.id == uid and ac_ldp_group_removal(uid, group.group_id):
  145. continue
  146. UserGroup.query.filter(
  147. and_(UserGroup.group_id == group.group_id,
  148. UserGroup.user_id == uid)
  149. ).delete()
  150. db.session.commit()
  151. ac_auto_update_user_effective_access(uid)
  152. return group
  153. def remove_user_from_group(group, member):
  154. if not group:
  155. return None
  156. UserGroup.query.filter(
  157. and_(UserGroup.group_id == group.group_id,
  158. UserGroup.user_id == member.id)
  159. ).delete()
  160. db.session.commit()
  161. ac_auto_update_user_effective_access(member.id)
  162. return group
  163. def delete_group(group):
  164. if not group:
  165. return None
  166. UserGroup.query.filter(UserGroup.group_id == group.group_id).delete()
  167. GroupCaseAccess.query.filter(GroupCaseAccess.group_id == group.group_id).delete()
  168. db.session.delete(group)
  169. db.session.commit()
  170. def add_case_access_to_group(group, cases_list, access_level):
  171. if not group:
  172. return None, "Invalid group"
  173. for case_id in cases_list:
  174. case = get_case(case_id)
  175. if not case:
  176. return None, "Invalid case ID"
  177. access_level_mask = ac_access_level_mask_from_val_list([access_level])
  178. ocas = GroupCaseAccess.query.filter(
  179. and_(
  180. GroupCaseAccess.case_id == case_id,
  181. GroupCaseAccess.group_id == group.group_id
  182. )).all()
  183. if ocas:
  184. for oca in ocas:
  185. db.session.delete(oca)
  186. oca = GroupCaseAccess()
  187. oca.group_id = group.group_id
  188. oca.access_level = access_level_mask
  189. oca.case_id = case_id
  190. db.session.add(oca)
  191. db.session.commit()
  192. return group, "Updated"
  193. def add_all_cases_access_to_group(group, access_level):
  194. if not group:
  195. return None, "Invalid group"
  196. for case_id in list_cases_id():
  197. access_level_mask = ac_access_level_mask_from_val_list([access_level])
  198. ocas = GroupCaseAccess.query.filter(
  199. and_(
  200. GroupCaseAccess.case_id == case_id,
  201. GroupCaseAccess.group_id == group.group_id
  202. )).all()
  203. if ocas:
  204. for oca in ocas:
  205. db.session.delete(oca)
  206. oca = GroupCaseAccess()
  207. oca.group_id = group.group_id
  208. oca.access_level = access_level_mask
  209. oca.case_id = case_id
  210. db.session.add(oca)
  211. db.session.commit()
  212. return group, "Updated"
  213. def remove_case_access_from_group(group_id, case_id):
  214. if not group_id or type(group_id) is not int:
  215. return
  216. if not case_id or type(case_id) is not int:
  217. return
  218. GroupCaseAccess.query.filter(
  219. and_(
  220. GroupCaseAccess.case_id == case_id,
  221. GroupCaseAccess.group_id == group_id
  222. )).delete()
  223. db.session.commit()
  224. return
  225. def remove_cases_access_from_group(group_id, cases_list):
  226. if not group_id or type(group_id) is not int:
  227. return False, "Invalid group"
  228. if not cases_list or type(cases_list[0]) is not int:
  229. return False, "Invalid cases list"
  230. GroupCaseAccess.query.filter(
  231. and_(
  232. GroupCaseAccess.case_id.in_(cases_list),
  233. GroupCaseAccess.group_id == group_id
  234. )).delete()
  235. db.session.commit()
  236. return True, "Updated"