Annotate

mod_minimix/mod_minimix.lua @ 5255:001c8fdc91a4

mod_http_oauth2: Add support for the "openid" scope This "openid" scope is there to signal access to the userinfo endpoint, which is needed for OIDC support. We don't actually check this later because the userinfo endpoint only returns info embedded in the token itself, but in the future we may want to check this more carefully.
author Kim Alvefur <zash@zash.se>
date Thu, 16 Mar 2023 17:06:35 +0100
parent 3398:1745021c0a73
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- mod_minimix
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 --
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 -- Rewrite MUC stanzas suich that the account / bare JID joins rooms instead of clients / full JIDs
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 --
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local jid_split, jid_join, jid_node, jid_bare = import("util.jid", "split", "join", "node", "bare");
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local st = require "util.stanza";
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
7 local mt = require "util.multitable";
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 local users = prosody.hosts[module.host].sessions;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
11 local data = mt.new();
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 -- FIXME You can join but you can never leave.
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 module:hook("pre-presence/full", function (event)
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 local origin, stanza = event.origin, event.stanza;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 local room_node, room_host, nickname = jid_split(stanza.attr.to);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 local room_jid = jid_join(room_node, room_host);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 local username = origin.username;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 if stanza.attr.type == nil and stanza:get_child("x", "http://jabber.org/protocol/muc") then
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 module:log("debug", "Joining %s as %s", room_jid, nickname);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 -- TODO Should this be kept track of before the *initial* join has been confirmed or?
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 if origin.joined_rooms then
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 origin.joined_rooms[room_jid] = nickname;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 else
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 origin.joined_rooms = { [room_jid] = nickname };
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31
3122
c69f32c9c576 mod_minimix: Don't consider oneself fully joined until subject message
Kim Alvefur <zash@zash.se>
parents: 3120
diff changeset
32 if data:get(username, room_jid, "subject") then
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 module:log("debug", "Already joined to %s as %s", room_jid, nickname);
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
34 local presences = data:get(username, room_jid, "presence");
3123
f4e86d2662ec mod_minimix: Handle having received no presence (should not happen)
Kim Alvefur <zash@zash.se>
parents: 3122
diff changeset
35 if presences then
f4e86d2662ec mod_minimix: Handle having received no presence (should not happen)
Kim Alvefur <zash@zash.se>
parents: 3122
diff changeset
36 -- Joined but no presence? Weird
f4e86d2662ec mod_minimix: Handle having received no presence (should not happen)
Kim Alvefur <zash@zash.se>
parents: 3122
diff changeset
37 for _, pres in pairs(presences) do
3124
cabe58ae17c9 mod_minimix: Set full JID when dumping cached stanzas
Kim Alvefur <zash@zash.se>
parents: 3123
diff changeset
38 pres = st.clone(pres);
cabe58ae17c9 mod_minimix: Set full JID when dumping cached stanzas
Kim Alvefur <zash@zash.se>
parents: 3123
diff changeset
39 pres.attr.to = origin.full_jid;
cabe58ae17c9 mod_minimix: Set full JID when dumping cached stanzas
Kim Alvefur <zash@zash.se>
parents: 3123
diff changeset
40 origin.send(pres);
3123
f4e86d2662ec mod_minimix: Handle having received no presence (should not happen)
Kim Alvefur <zash@zash.se>
parents: 3122
diff changeset
41 end
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 end
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
43 -- FIXME should send ones own presence last
3119
f84a6ad72548 mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents: 3118
diff changeset
44 local subject = data:get(username, room_jid, "subject");
f84a6ad72548 mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents: 3118
diff changeset
45 if subject then
f84a6ad72548 mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents: 3118
diff changeset
46 origin.send(st.clone(subject));
f84a6ad72548 mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents: 3118
diff changeset
47 end
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 -- Send on-join stanzas from local state, somehow
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 -- Maybe tell them their nickname was changed if it doesn't match the account one
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 return true;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 local account_join = st.clone(stanza);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 account_join.attr.from = jid_join(origin.username, origin.host);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 module:send(account_join);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
57 data:set(username, room_jid, "joined", nickname);
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
58
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 return true;
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
60 elseif stanza.attr.type == "unavailable" then
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
61 if origin.joined_rooms and origin.joined_rooms[room_jid] then
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
62 origin.joined_rooms[room_jid] = nil;
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
63 end
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 origin.send(st.reply(stanza));
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 return true;
3120
b914ee44b49f mod_minimix: Drop presence updates for now (may be treated as GC 1.0 joins)
Kim Alvefur <zash@zash.se>
parents: 3119
diff changeset
66 elseif stanza.attr.type == nil and origin.joined_rooms and origin.joined_rooms[room_jid] then
3398
1745021c0a73 mod_minimix: Fix typo in comment
Kim Alvefur <zash@zash.se>
parents: 3124
diff changeset
67 return true; -- Suppress these
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 end);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 module:hook("pre-message/bare", function (event)
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 local origin, stanza = event.origin, event.stanza;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 local username = origin.username;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 local room_jid = jid_bare(stanza.attr.to);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 module:log("info", "%s", stanza)
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
77 if origin.joined_rooms and origin.joined_rooms[room_jid] then
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 local from_account = st.clone(stanza);
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
79 from_account.attr.from = jid_join(username, origin.host);
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 module:log("debug", "Sending:\n%s\nInstead of:\n%s", from_account, stanza);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 module:send(from_account, origin);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 return true;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 end);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 local function handle_to_bare_jid(event)
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
87 local stanza = event.stanza;
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 local username = jid_node(stanza.attr.to);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 local room_jid = jid_bare(stanza.attr.from);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
91 if data:get(username, room_jid) then
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 module:log("debug", "handle_to_bare_jid %q, %s", room_jid, stanza);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 -- Broadcast to clients
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 if stanza.name == "message" and stanza.attr.type == "groupchat"
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 and not stanza:get_child("body") and stanza:get_child("subject") then
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
97 data:set(username, room_jid, "subject", st.clone(stanza));
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 elseif stanza.name == "presence" then
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 if stanza.attr.type == nil then
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
100 data:set(username, room_jid, "presence", stanza.attr.from, st.clone(stanza));
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 elseif stanza.attr.type == "unavailable" then
3118
24e49391d4e8 mod_minimix: Change data model
Kim Alvefur <zash@zash.se>
parents: 2941
diff changeset
102 data:set(username, room_jid, "presence", stanza.attr.from, nil);
2941
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 if users[username] then
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 module:log("debug", "%s has sessions", username);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 for _, session in pairs(users[username].sessions) do
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 module:log("debug", "Session: %s", jid_join(session.username, session.host, session.resource));
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110 if session.joined_rooms and session.joined_rooms[room_jid] then
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 module:log("debug", "Is joined");
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 local s = st.clone(stanza);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 s.attr.to = session.full_jid;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 session.send(s);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115 else
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 module:log("debug", "session.joined_rooms = %s", session.joined_rooms);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 return true;
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
123 end
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
124
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 module:hook("presence/bare", handle_to_bare_jid);
a57ed544fece mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 module:hook("message/bare", handle_to_bare_jid);