Нет описания

authorization.py 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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 enum
  19. import secrets
  20. import uuid
  21. from flask_login import UserMixin
  22. from sqlalchemy import BigInteger, JSON
  23. from sqlalchemy import Boolean
  24. from sqlalchemy import Column
  25. from sqlalchemy import ForeignKey
  26. from sqlalchemy import Integer
  27. from sqlalchemy import String
  28. from sqlalchemy import Text
  29. from sqlalchemy import UniqueConstraint
  30. from sqlalchemy import text
  31. from sqlalchemy.dialects.postgresql import UUID
  32. from sqlalchemy.orm import relationship
  33. from app import db
  34. class CaseAccessLevel(enum.Enum):
  35. deny_all = 0x1
  36. read_only = 0x2
  37. full_access = 0x4
  38. @classmethod
  39. def has_value(cls, value):
  40. return value in cls._value2member_map_
  41. class Permissions(enum.Enum):
  42. standard_user = 0x1
  43. server_administrator = 0x2
  44. alerts_read = 0x4
  45. alerts_write = 0x8
  46. alerts_delete = 0x10
  47. search_across_cases = 0x20
  48. customers_read = 0x40
  49. customers_write = 0x80
  50. case_templates_read = 0x100
  51. case_templates_write = 0x200
  52. activities_read = 0x400
  53. all_activities_read = 0x800
  54. class Organisation(db.Model):
  55. __tablename__ = 'organisations'
  56. org_id = Column(BigInteger, primary_key=True)
  57. org_uuid = Column(UUID(as_uuid=True), default=uuid.uuid4, nullable=False,
  58. server_default=text('gen_random_uuid()'), unique=True)
  59. org_name = Column(Text, nullable=False, unique=True)
  60. org_description = Column(Text)
  61. org_url = Column(Text)
  62. org_logo = Column(Text)
  63. org_email = Column(Text)
  64. org_nationality = Column(Text)
  65. org_sector = Column(Text)
  66. org_type = Column(Text)
  67. UniqueConstraint('org_name')
  68. class OrganisationCaseAccess(db.Model):
  69. __tablename__ = "organisation_case_access"
  70. id = Column(BigInteger, primary_key=True)
  71. org_id = Column(BigInteger, ForeignKey('organisations.org_id'), nullable=False)
  72. case_id = Column(BigInteger, ForeignKey('cases.case_id'), nullable=False)
  73. access_level = Column(BigInteger, nullable=False)
  74. org = relationship('Organisation')
  75. case = relationship('Cases')
  76. UniqueConstraint('case_id', 'org_id')
  77. class Group(db.Model):
  78. __tablename__ = 'groups'
  79. group_id = Column(BigInteger, primary_key=True)
  80. group_uuid = Column(UUID(as_uuid=True), default=uuid.uuid4, nullable=False,
  81. server_default=text('gen_random_uuid()'), unique=True)
  82. group_name = Column(Text, nullable=False, unique=True)
  83. group_description = Column(Text)
  84. group_permissions = Column(BigInteger, nullable=False)
  85. group_auto_follow = Column(Boolean, nullable=False, default=False)
  86. group_auto_follow_access_level = Column(BigInteger, nullable=False, default=0)
  87. UniqueConstraint('group_name')
  88. class GroupCaseAccess(db.Model):
  89. __tablename__ = "group_case_access"
  90. id = Column(BigInteger, primary_key=True)
  91. group_id = Column(BigInteger, ForeignKey('groups.group_id'), nullable=False)
  92. case_id = Column(BigInteger, ForeignKey('cases.case_id'), nullable=False)
  93. access_level = Column(BigInteger, nullable=False)
  94. group = relationship('Group')
  95. case = relationship('Cases')
  96. UniqueConstraint('case_id', 'group_id')
  97. class UserCaseAccess(db.Model):
  98. __tablename__ = "user_case_access"
  99. id = Column(BigInteger, primary_key=True, nullable=False)
  100. user_id = Column(BigInteger, ForeignKey('user.id'), nullable=False)
  101. case_id = Column(BigInteger, ForeignKey('cases.case_id'), nullable=False)
  102. access_level = Column(BigInteger, nullable=False)
  103. user = relationship('User')
  104. case = relationship('Cases')
  105. UniqueConstraint('case_id', 'user_id')
  106. class UserCaseEffectiveAccess(db.Model):
  107. __tablename__ = "user_case_effective_access"
  108. id = Column(BigInteger, primary_key=True, nullable=False)
  109. user_id = Column(BigInteger, ForeignKey('user.id'), nullable=False)
  110. case_id = Column(BigInteger, ForeignKey('cases.case_id'), nullable=False)
  111. access_level = Column(BigInteger, nullable=False)
  112. user = relationship('User')
  113. case = relationship('Cases')
  114. UniqueConstraint('case_id', 'user_id')
  115. class UserOrganisation(db.Model):
  116. __tablename__ = "user_organisation"
  117. id = Column(BigInteger, primary_key=True, nullable=False)
  118. user_id = Column(BigInteger, ForeignKey('user.id'), nullable=False)
  119. org_id = Column(BigInteger, ForeignKey('organisations.org_id'), nullable=False)
  120. is_primary_org = Column(Boolean, nullable=False)
  121. user = relationship('User')
  122. org = relationship('Organisation')
  123. UniqueConstraint('user_id', 'org_id')
  124. class UserGroup(db.Model):
  125. __tablename__ = "user_group"
  126. id = Column(BigInteger, primary_key=True, nullable=False)
  127. user_id = Column(BigInteger, ForeignKey('user.id'), nullable=False)
  128. group_id = Column(BigInteger, ForeignKey('groups.group_id'), nullable=False)
  129. user = relationship('User')
  130. group = relationship('Group')
  131. UniqueConstraint('user_id', 'group_id')
  132. class UserClient(db.Model):
  133. __tablename__ = "user_client"
  134. id = Column(BigInteger, primary_key=True, nullable=False)
  135. user_id = Column(BigInteger, ForeignKey('user.id'), nullable=False)
  136. client_id = Column(BigInteger, ForeignKey('client.client_id'), nullable=False)
  137. access_level = Column(BigInteger, nullable=False)
  138. allow_alerts = Column(Boolean, nullable=False)
  139. user = relationship('User')
  140. client = relationship('Client')
  141. UniqueConstraint('user_id', 'client_id')
  142. class User(UserMixin, db.Model):
  143. __tablename__ = 'user'
  144. id = Column(BigInteger, primary_key=True)
  145. user = Column(String(64), unique=True)
  146. name = Column(String(64), unique=False)
  147. email = Column(String(120), unique=True)
  148. uuid = Column(UUID(as_uuid=True), default=uuid.uuid4, nullable=False,
  149. server_default=text('gen_random_uuid()'), unique=True)
  150. password = Column(String(500))
  151. ctx_case = Column(Integer)
  152. ctx_human_case = Column(String(256))
  153. active = Column(Boolean())
  154. api_key = Column(Text(), unique=True)
  155. external_id = Column(Text, unique=True)
  156. in_dark_mode = Column(Boolean())
  157. has_mini_sidebar = Column(Boolean(), default=False)
  158. has_deletion_confirmation = Column(Boolean(), default=False)
  159. is_service_account = Column(Boolean(), default=False)
  160. mfa_secrets = Column(Text, nullable=True)
  161. webauthn_credentials = Column(JSON, nullable=True)
  162. mfa_setup_complete = Column(Boolean(), default=False)
  163. def __init__(self, user: str, name: str, email: str, password: str, active: bool,
  164. external_id: str = None, is_service_account: bool = False, mfa_secret: str = None,
  165. webauthn_credentials: list = None):
  166. self.user = user
  167. self.name = name
  168. self.password = password
  169. self.email = email
  170. self.active = active
  171. self.external_id = external_id
  172. self.is_service_account = is_service_account
  173. self.mfa_secrets = mfa_secret
  174. self.mfa_setup_complete = False
  175. self.webauthn_credentials = webauthn_credentials or []
  176. def __repr__(self):
  177. return str(self.id) + ' - ' + str(self.user)
  178. def save(self):
  179. self.api_key = secrets.token_urlsafe(nbytes=64)
  180. # inject self into db session
  181. db.session.add(self)
  182. db.session.commit()
  183. return self