Software / code / prosody
Annotate
util/argparse.lua @ 13854:0b01f40df0f9 13.0
mod_http_file_share: Add media-src 'self' to Content-Security-Policy header
This allows certain media files to be loaded when navigated to directly in a
web browser.
Note that in some browsers (Chrome), the media gets transformed
internally into a HTML page with some basic styles, but these are blocked due
to our default-src policy of 'none' Although this could be unblocked with
style-src unsafe-inline, it is not our plan to fix this, because this would
have negative security implications.
The reason for our CSP is to prevent the file share service from being used to
host malicious HTML/CSS/JS. Yes, CSS can be malicious.
Our file share service is for uploading and downloading files, it is not a
substitute for website/content hosting.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 18 Apr 2025 12:25:06 +0100 |
| parent | 13762:81856814d74f |
| rev | line source |
|---|---|
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 local function parse(arg, config) |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 local short_params = config and config.short_params or {}; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 local value_params = config and config.value_params or {}; |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
4 local array_params = config and config.array_params or {}; |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
5 local kv_params = config and config.kv_params or {}; |
|
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
6 local strict = config and config.strict; |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
7 local stop_on_positional = not config or config.stop_on_positional ~= false; |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 local parsed_opts = {}; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 if #arg == 0 then |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
12 return parsed_opts; |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 while true do |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 local raw_param = arg[1]; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 if not raw_param then |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 break; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 local prefix = raw_param:match("^%-%-?"); |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
21 if not prefix and stop_on_positional then |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 break; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 elseif prefix == "--" and raw_param == "--" then |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 table.remove(arg, 1); |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 break; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
28 if prefix then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
29 local param = table.remove(arg, 1):sub(#prefix+1); |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
30 if #param == 1 and short_params then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
31 param = short_params[param]; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
32 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
34 if not param then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
35 return nil, "param-not-found", raw_param; |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
37 |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
38 local uparam = param:match("^[^=]*"):gsub("%-", "_"); |
|
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
39 |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
40 local param_k, param_v; |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
41 if value_params[uparam] or array_params[uparam] then |
|
13762
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
42 param_k = uparam; |
|
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
43 param_v = param:match("^=(.*)$", #uparam+1); |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
44 if not param_v then |
|
13762
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
45 param_v = table.remove(arg, 1); |
|
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
46 if not param_v then |
|
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
47 return nil, "missing-value", raw_param; |
|
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
48 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
50 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
51 param_k, param_v = param:match("^([^=]+)=(.+)$"); |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
52 if not param_k then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
53 if param:match("^no%-") then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
54 param_k, param_v = param:sub(4), false; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
55 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
56 param_k, param_v = param, true; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
57 end |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
58 end |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
59 param_k = param_k:gsub("%-", "_"); |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
60 if strict and not kv_params[param_k] then |
|
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
61 return nil, "param-not-found", raw_param; |
|
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
62 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 end |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
64 if array_params[uparam] then |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
65 if parsed_opts[param_k] then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
66 table.insert(parsed_opts[param_k], param_v); |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
67 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
68 parsed_opts[param_k] = { param_v }; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
69 end |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
70 else |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
71 parsed_opts[param_k] = param_v; |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
72 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
73 elseif not stop_on_positional then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
74 table.insert(parsed_opts, table.remove(arg, 1)); |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
75 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
77 |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
78 if stop_on_positional then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
79 for i = 1, #arg do |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
80 parsed_opts[i] = arg[i]; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
81 end |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
82 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
83 |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
84 return parsed_opts; |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 return { |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 parse = parse; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 } |