room.py 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import typing
  2. from tracim.lib.jitsi_meet.token import JitsiMeetToken
  3. from tracim.lib.jitsi_meet.token import JitsiMeetUser
  4. from tracim.lib.jitsi_meet.token import JitsiMeetContext
  5. from tracim.lib.utils import str_as_alpha_num_str
  6. from tracim.config.app_cfg import CFG
  7. from tracim.model.data import Workspace
  8. from tracim.model.data import User
  9. import uuid
  10. class JitsiMeetRoom(object):
  11. def __init__(
  12. self,
  13. receivers: Workspace,
  14. issuer: typing.Union[User, JitsiMeetUser, None]=None,
  15. ) -> None:
  16. """
  17. This class set all to create a JitsiMeetRoom according
  18. to current config.
  19. :param issuer: user who initiated Jitsi Meet talk
  20. if None, default user is created. Can be both Tracim User or
  21. JitsiMeetUser.
  22. :param receivers: User or Room who can talk with sender. Now, only
  23. Workspace are supported.
  24. """
  25. self.tracim_cfg = CFG.get_instance()
  26. self._set_domain()
  27. self._set_token_params()
  28. self._set_context(
  29. workspace=receivers,
  30. issuer=issuer,
  31. )
  32. self.room = self._generate_room_name(receivers)
  33. def _set_domain(self) -> None:
  34. """
  35. Set domain according to config
  36. :return:
  37. """
  38. self.domain = self.tracim_cfg.JITSI_MEET_DOMAIN
  39. def _set_token_params(self) -> None:
  40. """
  41. Set params related to token according to config.
  42. :return: nothing
  43. """
  44. self.use_token = self.tracim_cfg.JITSI_MEET_USE_TOKEN
  45. if self.use_token:
  46. if self.tracim_cfg.JITSI_MEET_TOKEN_GENERATOR != 'local':
  47. raise JitsiMeetNoTokenGenerator
  48. self.token_app_id = self.tracim_cfg.JITSI_MEET_TOKEN_GENERATOR_LOCAL_APP_ID # nopep8
  49. self.token_secret = self.tracim_cfg.JITSI_MEET_TOKEN_GENERATOR_LOCAL_SECRET # nopep8
  50. self.token_alg = self.tracim_cfg.JITSI_MEET_TOKEN_GENERATOR_LOCAL_ALGORITHM # nopep8
  51. self.token_duration = self.tracim_cfg.JITSI_MEET_TOKEN_GENERATOR_LOCAL_DURATION # nopep8
  52. def _set_context(
  53. self,
  54. workspace: Workspace,
  55. issuer: typing.Union[User, JitsiMeetUser, None],
  56. ) -> None:
  57. """
  58. Set context of JWT token for Jitsi Meet
  59. :param issuer: user who initiated Jitsi Meet talk
  60. if None, default user is created. Can be both Tracim User or
  61. JitsiMeetUser.
  62. :param workspace: User or Room who can talk with sender. Now, only
  63. Workspace are supported.
  64. :return: nothing.
  65. """
  66. # INFO - G.M - 13-02-2018 - Convert all issuers values as JitsiMeetUser
  67. if isinstance(issuer, JitsiMeetUser):
  68. user = issuer
  69. elif isinstance(issuer, User):
  70. user = JitsiMeetUser(
  71. name=issuer.display_name,
  72. avatar_url=None,
  73. jitsi_meet_user_id=issuer.display_name,
  74. )
  75. else:
  76. user = JitsiMeetUser(
  77. # INFO - G.M - 13-02-2018 - create unique id for anonymous user
  78. jitsi_meet_user_id=str(uuid.uuid4()),
  79. )
  80. # INFO - G.M - 13-02-2018 - Associate
  81. group = workspace.label
  82. self.context = JitsiMeetContext(
  83. user=user,
  84. group=group,
  85. )
  86. def _generate_room_name(self, workspace: Workspace) -> str:
  87. """
  88. Generate Jitsi-Meet room name related to workspace
  89. that should be unique, always the same for same workspace in same Tracim
  90. instance but should also no contains any special characters
  91. :param workspace: Tracim Workspace
  92. :return: room name as str.
  93. """
  94. room = "{uuid}{workspace_id}{workspace_label}".format(
  95. uuid=self.tracim_cfg.TRACIM_INSTANCE_UUID,
  96. workspace_id=workspace.workspace_id,
  97. workspace_label=workspace.label)
  98. # Jitsi-Meet doesn't like specials_characters
  99. return str_as_alpha_num_str(room)
  100. def generate_jwt_token(self) -> str:
  101. """
  102. Generate Jitsi-Meet related JWT token
  103. :return: JWT token as str
  104. """
  105. if not self.use_token:
  106. raise JitsiMeetTokenNotActivated
  107. token = JitsiMeetToken(
  108. domain=self.domain,
  109. room=self.room,
  110. app_id=self.token_app_id,
  111. secret=self.token_secret,
  112. alg=self.token_alg,
  113. duration=self.token_duration,
  114. context=self.context,
  115. )
  116. return token.generate()
  117. def generate_url(self, token=None) -> str:
  118. """
  119. Generate Jitsi-Meet url with or without token
  120. examples :
  121. - https://myjitsiinstance/myroom
  122. - https://mysecurejitsiinstance/myroom?jwt=[very_long_jwt_token]
  123. :return: url as string
  124. """
  125. if token:
  126. url = "{}/{}?jwt={}".format(self.domain,
  127. self.room,
  128. token)
  129. else:
  130. url = "{}/{}".format(self.domain,
  131. self.room,
  132. )
  133. return "https://{}".format(url)
  134. class JitsiMeetNoTokenGenerator(Exception):
  135. pass
  136. class JitsiMeetTokenNotActivated(Exception):
  137. pass