Annotate

plugins/muc/password.lib.lua @ 12642:9061f9621330

Switch to a new role-based authorization framework, removing is_admin() We began moving away from simple "is this user an admin?" permission checks before 0.12, with the introduction of mod_authz_internal and the ability to dynamically change the roles of individual users. The approach in 0.12 still had various limitations however, and apart from the introduction of roles other than "admin" and the ability to pull that info from storage, not much actually changed. This new framework shakes things up a lot, though aims to maintain the same functionality and behaviour on the surface for a default Prosody configuration. That is, if you don't take advantage of any of the new features, you shouldn't notice any change. The biggest change visible to developers is that usermanager.is_admin() (and the auth provider is_admin() method) have been removed. Gone. Completely. Permission checks should now be performed using a new module API method: module:may(action_name, context) This method accepts an action name, followed by either a JID (string) or (preferably) a table containing 'origin'/'session' and 'stanza' fields (e.g. the standard object passed to most events). It will return true if the action should be permitted, or false/nil otherwise. Modules should no longer perform permission checks based on the role name. E.g. a lot of code previously checked if the user's role was prosody:admin before permitting some action. Since many roles might now exist with similar permissions, and the permissions of prosody:admin may be redefined dynamically, it is no longer suitable to use this method for permission checks. Use module:may(). If you start an action name with ':' (recommended) then the current module's name will automatically be used as a prefix. To define a new permission, use the new module API: module:default_permission(role_name, action_name) module:default_permissions(role_name, { action_name[, action_name...] }) This grants the specified role permission to execute the named action(s) by default. This may be overridden via other mechanisms external to your module. The built-in roles that developers should use are: - prosody:user (normal user) - prosody:admin (host admin) - prosody:operator (global admin) The new prosody:operator role is intended for server-wide actions (such as shutting down Prosody). Finally, all usage of is_admin() in modules has been fixed by this commit. Some of these changes were trickier than others, but no change is expected to break existing deployments. EXCEPT: mod_auth_ldap no longer supports the ldap_admin_filter option. It's very possible nobody is using this, but if someone is then we can later update it to pull roles from LDAP somehow.
author Matthew Wild <mwild1@gmail.com>
date Wed, 15 Jun 2022 12:15:01 +0100
parent 12029:631b2afa7bc1
child 12977:74b9e05af71e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6208
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
1 -- Prosody IM
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
4 -- Copyright (C) 2014 Daurnimator
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
5 --
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
6 -- This project is MIT/X11 licensed. Please see the
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
7 -- COPYING file in the source package for more information.
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
8 --
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
9
6329
6b3eb1611587 mod_muc: Import util.stanza into the config handler modules that need it. Fixes #432.
Matthew Wild <mwild1@gmail.com>
parents: 6208
diff changeset
10 local st = require "util.stanza";
6b3eb1611587 mod_muc: Import util.stanza into the config handler modules that need it. Fixes #432.
Matthew Wild <mwild1@gmail.com>
parents: 6208
diff changeset
11
6208
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
12 local function get_password(room)
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
13 return room._data.password;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
14 end
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
15
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
16 local function set_password(room, password)
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
17 if password == "" then password = nil; end
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
18 if room._data.password == password then return false; end
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
19 room._data.password = password;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
20 return true;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
21 end
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
22
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
23 module:hook("muc-disco#info", function(event)
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
24 event.reply:tag("feature", {var = get_password(event.room) and "muc_passwordprotected" or "muc_unsecured"}):up();
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
25 end);
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
26
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
27 module:hook("muc-config-form", function(event)
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
28 table.insert(event.form, {
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
29 name = "muc#roomconfig_roomsecret";
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
30 type = "text-private";
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
31 label = "Password";
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
32 value = get_password(event.room) or "";
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
33 });
9035
173c0e16e704 MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents: 8997
diff changeset
34 end, 90-2);
6208
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
35
6991
84e01dbb739e MUC: Update all config form handlers to take advantage of the new per-option events
Matthew Wild <mwild1@gmail.com>
parents: 6329
diff changeset
36 module:hook("muc-config-submitted/muc#roomconfig_roomsecret", function(event)
84e01dbb739e MUC: Update all config form handlers to take advantage of the new per-option events
Matthew Wild <mwild1@gmail.com>
parents: 6329
diff changeset
37 if set_password(event.room, event.value) then
6208
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
38 event.status_codes["104"] = true;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
39 end
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
40 end);
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
41
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
42 -- Don't allow anyone to join room unless they provide the password
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
43 module:hook("muc-occupant-pre-join", function(event)
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
44 local room, stanza = event.room, event.stanza;
9455
c62c983b8be3 MUC: Check that a room password is set before verifying password supplied by user
Michel Le Bihan <michel@lebihan.pl>
parents: 9035
diff changeset
45 if not get_password(room) then return end
8996
2df7dc99566a MUC/password: Rename variable for clarity [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7401
diff changeset
46 local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc");
2df7dc99566a MUC/password: Rename variable for clarity [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7401
diff changeset
47 if not muc_x then return end
2df7dc99566a MUC/password: Rename variable for clarity [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7401
diff changeset
48 local password = muc_x:get_child_text("password", "http://jabber.org/protocol/muc");
6208
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
49 if not password or password == "" then password = nil; end
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
50 if get_password(room) ~= password then
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
51 local from, to = stanza.attr.from, stanza.attr.to;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
52 module:log("debug", "%s couldn't join due to invalid password: %s", from, to);
10447
b5fd1637f15c MUC: Indicate origin of password related errors
Kim Alvefur <zash@zash.se>
parents: 9455
diff changeset
53 local reply = st.error_reply(stanza, "auth", "not-authorized", nil, room.jid):up();
12029
631b2afa7bc1 MUC: Remove <{muc}x> tags in some errors
Kim Alvefur <zash@zash.se>
parents: 12027
diff changeset
54 event.origin.send(reply);
6208
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
55 return true;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
56 end
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
57 end, -20);
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
58
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
59 -- Add password to outgoing invite
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
60 module:hook("muc-invite", function(event)
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
61 local password = get_password(event.room);
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
62 if password then
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
63 local x = event.stanza:get_child("x", "http://jabber.org/protocol/muc#user");
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
64 x:tag("password"):text(password):up();
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
65 end
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
66 end);
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
67
8997
8c4dd4375823 MUC/password: Set room password on creation if included in join stanza
Kim Alvefur <zash@zash.se>
parents: 8996
diff changeset
68 module:hook("muc-room-pre-create", function (event)
8c4dd4375823 MUC/password: Set room password on creation if included in join stanza
Kim Alvefur <zash@zash.se>
parents: 8996
diff changeset
69 local stanza, room = event.stanza, event.room;
8c4dd4375823 MUC/password: Set room password on creation if included in join stanza
Kim Alvefur <zash@zash.se>
parents: 8996
diff changeset
70 local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc");
8c4dd4375823 MUC/password: Set room password on creation if included in join stanza
Kim Alvefur <zash@zash.se>
parents: 8996
diff changeset
71 if not muc_x then return end
8c4dd4375823 MUC/password: Set room password on creation if included in join stanza
Kim Alvefur <zash@zash.se>
parents: 8996
diff changeset
72 local password = muc_x:get_child_text("password", "http://jabber.org/protocol/muc");
8c4dd4375823 MUC/password: Set room password on creation if included in join stanza
Kim Alvefur <zash@zash.se>
parents: 8996
diff changeset
73 set_password(room, password);
8c4dd4375823 MUC/password: Set room password on creation if included in join stanza
Kim Alvefur <zash@zash.se>
parents: 8996
diff changeset
74 end);
8c4dd4375823 MUC/password: Set room password on creation if included in join stanza
Kim Alvefur <zash@zash.se>
parents: 8996
diff changeset
75
6208
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
76 return {
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
77 get = get_password;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
78 set = set_password;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff changeset
79 };