Software /
code /
prosody
Annotate
plugins/mod_http_errors.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 | 11820:0375ef78ed64 |
child | 12977:74b9e05af71e |
rev | line source |
---|---|
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 module:set_global(); |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 local server = require "net.http.server"; |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 local codes = require "net.http.codes"; |
8364
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
5 local xml_escape = require "util.stanza".xml_escape; |
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
6 local render = require "util.interpolation".new("%b{}", xml_escape); |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 local show_private = module:get_option_boolean("http_errors_detailed", false); |
4737
7b9e2a8c4710
mod_http_errors: Add two new config options, http_errors_always_show (show even for unknown errors) and http_errors_default_message (message for unknown errors)
Matthew Wild <mwild1@gmail.com>
parents:
4711
diff
changeset
|
9 local always_serve = module:get_option_boolean("http_errors_always_show", true); |
7b9e2a8c4710
mod_http_errors: Add two new config options, http_errors_always_show (show even for unknown errors) and http_errors_default_message (message for unknown errors)
Matthew Wild <mwild1@gmail.com>
parents:
4711
diff
changeset
|
10 local default_message = { module:get_option_string("http_errors_default_message", "That's all I know.") }; |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 local default_messages = { |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 [400] = { "What kind of request do you call that??" }; |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 [403] = { "You're not allowed to do that." }; |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 [404] = { "Whatever you were looking for is not here. %"; |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 "Where did you put it?", "It's behind you.", "Keep looking." }; |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 [500] = { "% Check your error log for more info."; |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 "Gremlins.", "It broke.", "Don't look at me." }; |
11403
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
18 ["/"] = { |
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
19 "A study in simplicity."; |
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
20 "Better catch it!"; |
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
21 "Don't just stand there, go after it!"; |
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
22 "Well, say something, before it runs too far!"; |
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
23 "Welcome to the world of XMPP!"; |
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
24 "You can do anything in XMPP!"; -- "The only limit is XML."; |
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
25 "You can do anything with Prosody!"; -- the only limit is memory? |
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
26 }; |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 }; |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 local messages = setmetatable(module:get_option("http_errors_messages", {}), { __index = default_messages }); |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 local html = [[ |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 <!DOCTYPE html> |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 <html> |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 <head> |
8364
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
35 <meta charset="utf-8"> |
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
36 <title>{title}</title> |
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
37 <style> |
11388 | 38 body{margin-top:14%;text-align:center;background-color:#f8f8f8;font-family:sans-serif} |
39 h1{font-size:xx-large} | |
40 p{font-size:x-large} | |
11395 | 41 p.warning>span{font-size:large;background-color:yellow} |
11388 | 42 p.extra{font-size:large;font-family:courier} |
43 @media(prefers-color-scheme:dark){ | |
44 body{background-color:#161616;color:#eee} | |
11395 | 45 p.warning>span{background-color:inherit;color:yellow} |
11154 | 46 } |
8364
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
47 </style> |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 </head> |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 <body> |
11662
a8798e04b5c8
mod_http_errors: Allow adding icons on error pages
Kim Alvefur <zash@zash.se>
parents:
11404
diff
changeset
|
50 <h1>{icon?{icon_raw!?}} {title}</h1> |
8364
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
51 <p>{message}</p> |
11395 | 52 {warning&<p class="warning"><span>⚠ {warning?} ⚠</span></p>} |
11155
8d692a8a8f48
mod_http_errors: Remove 'extra' element when empty
Kim Alvefur <zash@zash.se>
parents:
11154
diff
changeset
|
53 {extra&<p class="extra">{extra?}</p>} |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 </body> |
7492
9a749cf8c1ba
mod_http_errors: Add a newline after end of HTML
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
55 </html> |
9a749cf8c1ba
mod_http_errors: Add a newline after end of HTML
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
56 ]]; |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 local function get_page(code, extra) |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 local message = messages[code]; |
4737
7b9e2a8c4710
mod_http_errors: Add two new config options, http_errors_always_show (show even for unknown errors) and http_errors_default_message (message for unknown errors)
Matthew Wild <mwild1@gmail.com>
parents:
4711
diff
changeset
|
60 if always_serve or message then |
7b9e2a8c4710
mod_http_errors: Add two new config options, http_errors_always_show (show even for unknown errors) and http_errors_default_message (message for unknown errors)
Matthew Wild <mwild1@gmail.com>
parents:
4711
diff
changeset
|
61 message = message or default_message; |
8364
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
62 return render(html, { |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 title = rawget(codes, code) or ("Code "..tostring(code)); |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 message = message[1]:gsub("%%", function () |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 return message[math.random(2, math.max(#message,2))]; |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 end); |
8364
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
67 extra = extra; |
f91ab40a3105
mod_http_errors: Use util.interpolation to render HTML template
Kim Alvefur <zash@zash.se>
parents:
8363
diff
changeset
|
68 }); |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 end |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 end |
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 |
11404
f7704f987439
mod_http_errors: Add some comments
Kim Alvefur <zash@zash.se>
parents:
11403
diff
changeset
|
72 -- Main error page handler |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 module:hook_object_event(server, "http-error", function (event) |
8363
e2460edc2a2f
mod_http_errors: Set Content-Type header to HTML (fixes #1030)
Kim Alvefur <zash@zash.se>
parents:
7492
diff
changeset
|
74 if event.response then |
e2460edc2a2f
mod_http_errors: Set Content-Type header to HTML (fixes #1030)
Kim Alvefur <zash@zash.se>
parents:
7492
diff
changeset
|
75 event.response.headers.content_type = "text/html; charset=utf-8"; |
e2460edc2a2f
mod_http_errors: Set Content-Type header to HTML (fixes #1030)
Kim Alvefur <zash@zash.se>
parents:
7492
diff
changeset
|
76 end |
10574
f70c874b7936
mod_http_errors: Use text from util.errror object if included
Kim Alvefur <zash@zash.se>
parents:
10430
diff
changeset
|
77 return get_page(event.code, (show_private and event.private_message) or event.message or (event.error and event.error.text)); |
4711
4ddf3ba0c749
mod_http_errors: Module to handle HTTP errors with a HTML page
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 end); |
10430
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
79 |
11404
f7704f987439
mod_http_errors: Add some comments
Kim Alvefur <zash@zash.se>
parents:
11403
diff
changeset
|
80 -- Way to use the template for other things so to give a consistent appearance |
11389
29e7ed75ed3f
mod_http_errors: Add way to reuse the error page template
Kim Alvefur <zash@zash.se>
parents:
11388
diff
changeset
|
81 module:hook("http-message", function (event) |
29e7ed75ed3f
mod_http_errors: Add way to reuse the error page template
Kim Alvefur <zash@zash.se>
parents:
11388
diff
changeset
|
82 if event.response then |
29e7ed75ed3f
mod_http_errors: Add way to reuse the error page template
Kim Alvefur <zash@zash.se>
parents:
11388
diff
changeset
|
83 event.response.headers.content_type = "text/html; charset=utf-8"; |
29e7ed75ed3f
mod_http_errors: Add way to reuse the error page template
Kim Alvefur <zash@zash.se>
parents:
11388
diff
changeset
|
84 end |
29e7ed75ed3f
mod_http_errors: Add way to reuse the error page template
Kim Alvefur <zash@zash.se>
parents:
11388
diff
changeset
|
85 return render(html, event); |
11820
0375ef78ed64
mod_http_errors: Make it easier to override 'http-message' handler
Kim Alvefur <zash@zash.se>
parents:
11664
diff
changeset
|
86 end, -1); |
11389
29e7ed75ed3f
mod_http_errors: Add way to reuse the error page template
Kim Alvefur <zash@zash.se>
parents:
11388
diff
changeset
|
87 |
11663
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
88 local icon = [[ |
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
89 <svg xmlns="http://www.w3.org/2000/svg" height="0.7em" viewBox="0 0 480 480" width="0.7em"> |
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
90 <rect fill="#6197df" height="220" rx="60" ry="60" width="220" x="10" y="10"></rect> |
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
91 <rect fill="#f29b00" height="220" rx="60" ry="60" width="220" x="10" y="240"></rect> |
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
92 <rect fill="#f29b00" height="220" rx="60" ry="60" width="220" x="240" y="10"></rect> |
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
93 <rect fill="#6197df" height="220" rx="60" ry="60" width="220" x="240" y="240"></rect> |
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
94 </svg> |
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
95 ]]; |
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
96 |
11404
f7704f987439
mod_http_errors: Add some comments
Kim Alvefur <zash@zash.se>
parents:
11403
diff
changeset
|
97 -- Something nicer shown instead of 404 at the root path, if nothing else handles this path |
10430
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
98 module:hook_object_event(server, "http-error", function (event) |
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
99 local request, response = event.request, event.response; |
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
100 if request and response and request.path == "/" and response.status_code == 404 then |
11664
d83f8f44caea
mod_http_errors: Set status code 200 from root page
Kim Alvefur <zash@zash.se>
parents:
11663
diff
changeset
|
101 response.status_code = 200; |
10430
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
102 response.headers.content_type = "text/html; charset=utf-8"; |
11403
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
103 local message = messages["/"]; |
10430
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
104 return render(html, { |
11663
04fa947784bc
mod_http_errors: Add a Prosody logo to root page
Kim Alvefur <zash@zash.se>
parents:
11662
diff
changeset
|
105 icon_raw = icon, |
10430
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
106 title = "Prosody is running!"; |
11403
747e8245f180
mod_http_errors: Add some silly variations for the '/' page
Kim Alvefur <zash@zash.se>
parents:
11395
diff
changeset
|
107 message = message[math.random(#message)]; |
10430
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
108 }); |
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
109 end |
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
110 end, 1); |
46dd9df2db0c
mod_http_errors: Show a friendly page instead of 404 on top level
Kim Alvefur <zash@zash.se>
parents:
9760
diff
changeset
|
111 |