|
@@ -3,15 +3,8 @@ import typing
|
3
|
3
|
|
4
|
4
|
import jwt
|
5
|
5
|
|
6
|
|
-JITSI_DOMAIN = "prosody"
|
7
|
|
-JWT_APP_ID = "test"
|
8
|
|
-JWT_SECRET = "secret"
|
9
|
|
-JWT_ALG = 'HS256'
|
10
|
|
-JWT_DURATION = 60*1 # duration in second
|
11
|
|
-JITSI_USE_TOKEN = True
|
12
|
6
|
|
13
|
|
-
|
14
|
|
-class JitsiTokenConfig:
|
|
7
|
+class JitsiTokenConfig(object):
|
15
|
8
|
|
16
|
9
|
def __init__(self,
|
17
|
10
|
app_id: str,
|
|
@@ -19,25 +12,40 @@ class JitsiTokenConfig:
|
19
|
12
|
alg: str,
|
20
|
13
|
duration: int,
|
21
|
14
|
)-> None:
|
|
15
|
+ """
|
|
16
|
+ JWT token generator config for JitsiMeet,
|
|
17
|
+ :param app_id: application identifier
|
|
18
|
+ :param secret: secret share between token generator and XMPP server
|
|
19
|
+ :param alg: algorithm used
|
|
20
|
+ :param duration: duration of token
|
|
21
|
+ """
|
22
|
22
|
self.app_id = app_id
|
23
|
23
|
self.secret = secret
|
24
|
24
|
self.alg = alg
|
25
|
25
|
self.duration = duration
|
26
|
26
|
|
27
|
27
|
|
28
|
|
-class JitsiMeetRoomHandler:
|
|
28
|
+class JitsiMeetRoom(object):
|
29
|
29
|
|
30
|
30
|
def __init__(self,
|
31
|
31
|
domain: str,
|
|
32
|
+ room: str,
|
32
|
33
|
token_config: typing.Optional[JitsiTokenConfig],
|
33
|
34
|
) -> None:
|
|
35
|
+ """
|
|
36
|
+ JitsiMeet room Parameters
|
|
37
|
+ :param domain: jitsi-meet domain
|
|
38
|
+ :param room: room name
|
|
39
|
+ :param token_config: token config, None if token not used.
|
|
40
|
+ """
|
34
|
41
|
self.domain = domain
|
|
42
|
+ self.room = room
|
35
|
43
|
self.token_config = token_config
|
36
|
44
|
|
37
|
|
- def generate_token(self, room: str)->str:
|
|
45
|
+ def generate_token(self) -> str:
|
38
|
46
|
"""
|
39
|
47
|
Create jwt token according to room name and config
|
40
|
|
- :param room: room name
|
|
48
|
+ see https://github.com/jitsi/lib-jitsi-meet/blob/master/doc/tokens.md
|
41
|
49
|
:return: jwt encoded token as string
|
42
|
50
|
"""
|
43
|
51
|
assert self.token_config
|
|
@@ -45,7 +53,7 @@ class JitsiMeetRoomHandler:
|
45
|
53
|
exp = now+datetime.timedelta(seconds=self.token_config.duration)
|
46
|
54
|
data = {
|
47
|
55
|
"iss": self.token_config.app_id, # Issuer
|
48
|
|
- "room": room, # Custom-param for jitsi_meet
|
|
56
|
+ "room": self.room, # Custom-param for jitsi_meet
|
49
|
57
|
"aud": "*", # TODO: Understood this param
|
50
|
58
|
"exp": exp, # Expiration date
|
51
|
59
|
"nbf": now, # NotBefore
|
|
@@ -56,36 +64,17 @@ class JitsiMeetRoomHandler:
|
56
|
64
|
algorithm=self.token_config.alg)
|
57
|
65
|
return jwt_token.decode("utf-8")
|
58
|
66
|
|
59
|
|
- def generate_url(self, room: str)->str:
|
|
67
|
+ def generate_url(self) -> str:
|
60
|
68
|
"""
|
61
|
69
|
Generate url with or without token
|
62
|
|
- :param room: room name
|
63
|
70
|
:return: url as string
|
64
|
71
|
"""
|
65
|
72
|
if self.token_config:
|
66
|
|
- token = self.generate_token(room)
|
|
73
|
+ token = self.generate_token()
|
67
|
74
|
url = "{}/{}?jwt={}".format(self.domain,
|
68
|
|
- room,
|
|
75
|
+ self.room,
|
69
|
76
|
token,)
|
70
|
77
|
else:
|
71
|
78
|
url = "{}/{}".format(self.domain,
|
72
|
|
- room,)
|
|
79
|
+ self.room,)
|
73
|
80
|
return "https://{}".format(url)
|
74
|
|
-
|
75
|
|
-if JITSI_USE_TOKEN:
|
76
|
|
- defaultTokenConfig = JitsiTokenConfig(
|
77
|
|
- app_id=JWT_APP_ID,
|
78
|
|
- secret=JWT_SECRET,
|
79
|
|
- alg=JWT_ALG,
|
80
|
|
- duration=JWT_DURATION,
|
81
|
|
- )
|
82
|
|
-else:
|
83
|
|
- defaultTokenConfig = None
|
84
|
|
-
|
85
|
|
-JitsiMeetRoom = JitsiMeetRoomHandler(
|
86
|
|
- domain=JITSI_DOMAIN,
|
87
|
|
- token_config= defaultTokenConfig
|
88
|
|
-)
|
89
|
|
-
|
90
|
|
-if __name__ == '__main__' :
|
91
|
|
- print(JitsiMeetRoom.generate_url('test'))
|