Software / code / prosody
Comparison
plugins/mod_authz_internal.lua @ 13170:082c7d856e61
core, plugins: Split prosody:user role into prosody:{guest,registered,member}
This gives us more granular control over different types of user account.
Accounts registered by IBR get assigned prosody:registered by default, while
accounts provisioned by an admin (e.g. via prosodyctl shell) will receive
prosody:member by default.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 29 Jun 2023 15:36:13 +0100 |
| parent | 12977:74b9e05af71e |
| child | 13232:e0ab20519ce5 |
comparison
equal
deleted
inserted
replaced
| 13169:7b6e7290265b | 13170:082c7d856e61 |
|---|---|
| 9 local config_admin_jids = module:get_option_inherited_set("admins", {}) / normalize; | 9 local config_admin_jids = module:get_option_inherited_set("admins", {}) / normalize; |
| 10 local host = module.host; | 10 local host = module.host; |
| 11 local host_suffix = host:gsub("^[^%.]+%.", ""); | 11 local host_suffix = host:gsub("^[^%.]+%.", ""); |
| 12 | 12 |
| 13 local hosts = prosody.hosts; | 13 local hosts = prosody.hosts; |
| 14 local is_anon_host = module:get_option_string("authentication") == "anonymous"; | |
| 15 local default_user_role = module:get_option_string("default_user_role", is_anon_host and "prosody:guest" or "prosody:registered"); | |
| 16 | |
| 14 local is_component = hosts[host].type == "component"; | 17 local is_component = hosts[host].type == "component"; |
| 15 local host_user_role, server_user_role, public_user_role; | 18 local host_user_role, server_user_role, public_user_role; |
| 16 if is_component then | 19 if is_component then |
| 17 host_user_role = module:get_option_string("host_user_role", "prosody:user"); | 20 host_user_role = module:get_option_string("host_user_role", "prosody:registered"); |
| 18 server_user_role = module:get_option_string("server_user_role"); | 21 server_user_role = module:get_option_string("server_user_role"); |
| 19 public_user_role = module:get_option_string("public_user_role"); | 22 public_user_role = module:get_option_string("public_user_role"); |
| 20 end | 23 end |
| 21 | 24 |
| 22 local role_store = module:open_store("account_roles"); | 25 local role_store = module:open_store("account_roles"); |
| 46 end | 49 end |
| 47 role_registry[role.name] = role; | 50 role_registry[role.name] = role; |
| 48 end | 51 end |
| 49 | 52 |
| 50 -- Default roles | 53 -- Default roles |
| 51 register_role { | 54 |
| 52 name = "prosody:restricted"; | 55 -- For untrusted guest/anonymous users |
| 56 register_role { | |
| 57 name = "prosody:guest"; | |
| 53 priority = 15; | 58 priority = 15; |
| 54 }; | 59 }; |
| 55 | 60 |
| 56 register_role { | 61 -- For e.g. self-registered accounts |
| 57 name = "prosody:user"; | 62 register_role { |
| 63 name = "prosody:registered"; | |
| 58 priority = 25; | 64 priority = 25; |
| 59 inherits = { "prosody:restricted" }; | 65 inherits = { "prosody:guest" }; |
| 60 }; | 66 }; |
| 61 | 67 |
| 68 | |
| 69 -- For trusted/provisioned accounts | |
| 70 register_role { | |
| 71 name = "prosody:member"; | |
| 72 priority = 35; | |
| 73 inherits = { "prosody:registered" }; | |
| 74 }; | |
| 75 | |
| 76 -- For administrators, e.g. of a host | |
| 62 register_role { | 77 register_role { |
| 63 name = "prosody:admin"; | 78 name = "prosody:admin"; |
| 64 priority = 50; | 79 priority = 50; |
| 65 inherits = { "prosody:user" }; | 80 inherits = { "prosody:member" }; |
| 66 }; | 81 }; |
| 67 | 82 |
| 83 -- For server operators (full access) | |
| 68 register_role { | 84 register_role { |
| 69 name = "prosody:operator"; | 85 name = "prosody:operator"; |
| 70 priority = 75; | 86 priority = 75; |
| 71 inherits = { "prosody:admin" }; | 87 inherits = { "prosody:admin" }; |
| 72 }; | 88 }; |
| 126 if err then | 142 if err then |
| 127 -- Unable to fetch role, fail | 143 -- Unable to fetch role, fail |
| 128 return nil, err; | 144 return nil, err; |
| 129 end | 145 end |
| 130 -- No role set, use default role | 146 -- No role set, use default role |
| 131 return role_registry["prosody:user"]; | 147 return role_registry[default_user_role]; |
| 132 end | 148 end |
| 133 if stored_roles._default == nil then | 149 if stored_roles._default == nil then |
| 134 -- No primary role explicitly set, return default | 150 -- No primary role explicitly set, return default |
| 135 return role_registry["prosody:user"]; | 151 return role_registry[default_user_role]; |
| 136 end | 152 end |
| 137 local primary_stored_role = role_registry[stored_roles._default]; | 153 local primary_stored_role = role_registry[stored_roles._default]; |
| 138 if not primary_stored_role then | 154 if not primary_stored_role then |
| 139 return nil, "unknown-role"; | 155 return nil, "unknown-role"; |
| 140 end | 156 end |
| 150 local keys_update = { | 166 local keys_update = { |
| 151 _default = role_name; | 167 _default = role_name; |
| 152 -- Primary role cannot be secondary role | 168 -- Primary role cannot be secondary role |
| 153 [role_name] = role_map_store.remove; | 169 [role_name] = role_map_store.remove; |
| 154 }; | 170 }; |
| 155 if role_name == "prosody:user" then | 171 if role_name == default_user_role then |
| 156 -- Don't store default | 172 -- Don't store default |
| 157 keys_update._default = role_map_store.remove; | 173 keys_update._default = role_map_store.remove; |
| 158 end | 174 end |
| 159 local ok, err = role_map_store:set_keys(user, keys_update); | 175 local ok, err = role_map_store:set_keys(user, keys_update); |
| 160 if not ok then | 176 if not ok then |