"Fossies" - the Fresh Open Source Software Archive 
Member "jitsi-meet-7693/resources/prosody-plugins/mod_auth_token.lua" (8 Dec 2023, 4600 Bytes) of package /linux/misc/jitsi-meet-7693.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Lua source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
1 -- Token authentication
2 -- Copyright (C) 2021-present 8x8, Inc.
3
4 local formdecode = require "util.http".formdecode;
5 local generate_uuid = require "util.uuid".generate;
6 local new_sasl = require "util.sasl".new;
7 local sasl = require "util.sasl";
8 local token_util = module:require "token/util".new(module);
9 local sessions = prosody.full_sessions;
10
11 -- no token configuration
12 if token_util == nil then
13 return;
14 end
15
16 module:depends("jitsi_session");
17
18 -- define auth provider
19 local provider = {};
20
21 local host = module.host;
22
23 -- Extract 'token' param from URL when session is created
24 function init_session(event)
25 local session, request = event.session, event.request;
26 local query = request.url.query;
27
28 if query ~= nil then
29 local params = formdecode(query);
30
31 -- The following fields are filled in the session, by extracting them
32 -- from the query and no validation is being done.
33 -- After validating auth_token will be cleaned in case of error and few
34 -- other fields will be extracted from the token and set in the session
35
36 session.auth_token = query and params.token or nil;
37 end
38 end
39
40 module:hook_global("bosh-session", init_session);
41 module:hook_global("websocket-session", init_session);
42
43 function provider.test_password(username, password)
44 return nil, "Password based auth not supported";
45 end
46
47 function provider.get_password(username)
48 return nil;
49 end
50
51 function provider.set_password(username, password)
52 return nil, "Set password not supported";
53 end
54
55 function provider.user_exists(username)
56 return nil;
57 end
58
59 function provider.create_user(username, password)
60 return nil;
61 end
62
63 function provider.delete_user(username)
64 return nil;
65 end
66
67 function provider.get_sasl_handler(session)
68
69 local function get_username_from_token(self, message)
70
71 -- retrieve custom public key from server and save it on the session
72 local pre_event_result = prosody.events.fire_event("pre-jitsi-authentication-fetch-key", session);
73 if pre_event_result ~= nil and pre_event_result.res == false then
74 module:log("warn",
75 "Error verifying token on pre authentication stage:%s, reason:%s", pre_event_result.error, pre_event_result.reason);
76 session.auth_token = nil;
77 return pre_event_result.res, pre_event_result.error, pre_event_result.reason;
78 end
79
80 local res, error, reason = token_util:process_and_verify_token(session);
81 if res == false then
82 module:log("warn",
83 "Error verifying token err:%s, reason:%s", error, reason);
84 session.auth_token = nil;
85 return res, error, reason;
86 end
87
88 local shouldAllow = prosody.events.fire_event("jitsi-access-ban-check", session);
89 if shouldAllow == false then
90 module:log("warn", "user is banned")
91 return false, "not-allowed", "user is banned";
92 end
93
94 local customUsername
95 = prosody.events.fire_event("pre-jitsi-authentication", session);
96
97 if (customUsername) then
98 self.username = customUsername;
99 elseif (session.previd ~= nil) then
100 for _, session1 in pairs(sessions) do
101 if (session1.resumption_token == session.previd) then
102 self.username = session1.username;
103 break;
104 end
105 end
106 else
107 self.username = message;
108 end
109
110 local post_event_result = prosody.events.fire_event("post-jitsi-authentication", session);
111 if post_event_result ~= nil and post_event_result.res == false then
112 module:log("warn",
113 "Error verifying token on post authentication stage :%s, reason:%s", post_event_result.error, post_event_result.reason);
114 session.auth_token = nil;
115 return post_event_result.res, post_event_result.error, post_event_result.reason;
116 end
117
118 return res;
119 end
120
121 return new_sasl(host, { anonymous = get_username_from_token });
122 end
123
124 module:provides("auth", provider);
125
126 local function anonymous(self, message)
127
128 local username = generate_uuid();
129
130 -- This calls the handler created in 'provider.get_sasl_handler(session)'
131 local result, err, msg = self.profile.anonymous(self, username, self.realm);
132
133 if result == true then
134 if (self.username == nil) then
135 self.username = username;
136 end
137 return "success";
138 else
139 return "failure", err, msg;
140 end
141 end
142
143 sasl.registerMechanism("ANONYMOUS", {"anonymous"}, anonymous);