Software /
code /
prosody
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 |
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 }; |