Mercurial > prosody-modules
annotate mod_pastebin/mod_pastebin.lua @ 5193:2bb29ece216b
mod_http_oauth2: Implement stateless dynamic client registration
Replaces previous explicit registration that required either the
additional module mod_adhoc_oauth2_client or manually editing the
database. That method was enough to have something to test with, but
would not probably not scale easily.
Dynamic client registration allows creating clients on the fly, which
may be even easier in theory.
In order to not allow basically unauthenticated writes to the database,
we implement a stateless model here.
per_host_key := HMAC(config -> oauth2_registration_key, hostname)
client_id := JWT { client metadata } signed with per_host_key
client_secret := HMAC(per_host_key, client_id)
This should ensure everything we need to know is part of the client_id,
allowing redirects etc to be validated, and the client_secret can be
validated with only the client_id and the per_host_key.
A nonce injected into the client_id JWT should ensure nobody can submit
the same client metadata and retrieve the same client_secret
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 03 Mar 2023 21:14:19 +0100 |
parents | f821eeac0e50 |
children | 8aec430ba205 |
rev | line source |
---|---|
5 | 1 |
2 local st = require "util.stanza"; | |
654
7e444de959bb
mod_pastebin: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents:
565
diff
changeset
|
3 module:depends("http"); |
5 | 4 local uuid_new = require "util.uuid".generate; |
12
316e8437f233
mod_pastebin: Allow configurable message length threshold
Matthew Wild <mwild1@gmail.com>
parents:
5
diff
changeset
|
5 local os_time = os.time; |
3032
0f2dd6397569
mod_pastebin: Remove unused locals [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3031
diff
changeset
|
6 local t_remove = table.remove; |
24
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
7 local add_task = require "util.timer".add_task; |
2766
314cebb3071e
mod_pastebin: Check for MUC presence before handling a message.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
8 local jid_bare = require "util.jid".bare; |
3035
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
9 |
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
10 local function get_room_from_jid() end; |
3027
ce34cbc10b5b
mod_pastebin: Move result of host detection into a variable to improve readabily
Kim Alvefur <zash@zash.se>
parents:
3008
diff
changeset
|
11 local is_component = module:get_host_type() == "component"; |
ce34cbc10b5b
mod_pastebin: Move result of host detection into a variable to improve readabily
Kim Alvefur <zash@zash.se>
parents:
3008
diff
changeset
|
12 if is_component then |
3035
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
13 local mod_muc = module:depends "muc"; |
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
14 local muc_rooms = rawget(mod_muc, "rooms"); |
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
15 get_room_from_jid = rawget(mod_muc, "get_room_from_jid") or |
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
16 function (jid) |
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
17 return muc_rooms[jid]; |
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
18 end |
3008
26fe44c68791
mod_pastebin: Fix loading on normal hosts (thanks ppmathis)
Kim Alvefur <zash@zash.se>
parents:
2766
diff
changeset
|
19 end |
5 | 20 |
444
82ccfba5ac2f
mod_pastebin: Support for changing the summary length (pastebin_summary_length), and including it even in the plaintext version of the generated message
Matthew Wild <mwild1@gmail.com>
parents:
438
diff
changeset
|
21 local utf8_pattern = "[\194-\244][\128-\191]*$"; |
190
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
22 local function drop_invalid_utf8(seq) |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
23 local start = seq:byte(); |
934
15e2c4fd26a0
mod_pastebin: Fix invalid debug statement
Kim Alvefur <zash@zash.se>
parents:
852
diff
changeset
|
24 module:log("debug", "utf8: %d, %d", start, #seq); |
190
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
25 if (start <= 223 and #seq < 2) |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
26 or (start >= 224 and start <= 239 and #seq < 3) |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
27 or (start >= 240 and start <= 244 and #seq < 4) |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
28 or (start > 244) then |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
29 return ""; |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
30 end |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
31 return seq; |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
32 end |
7a695ee3884b
mod_pastebin: Better fix for stripping truncated UFT-8 sequences
Matthew Wild <mwild1@gmail.com>
parents:
189
diff
changeset
|
33 |
501
e851f386c904
mod_pastebin: Threshold is now UTF-8 characters (thanks Grom_PE for initial patch)
Matthew Wild <mwild1@gmail.com>
parents:
454
diff
changeset
|
34 local function utf8_length(str) |
e851f386c904
mod_pastebin: Threshold is now UTF-8 characters (thanks Grom_PE for initial patch)
Matthew Wild <mwild1@gmail.com>
parents:
454
diff
changeset
|
35 local _, count = string.gsub(str, "[^\128-\193]", ""); |
e851f386c904
mod_pastebin: Threshold is now UTF-8 characters (thanks Grom_PE for initial patch)
Matthew Wild <mwild1@gmail.com>
parents:
454
diff
changeset
|
36 return count; |
e851f386c904
mod_pastebin: Threshold is now UTF-8 characters (thanks Grom_PE for initial patch)
Matthew Wild <mwild1@gmail.com>
parents:
454
diff
changeset
|
37 end |
e851f386c904
mod_pastebin: Threshold is now UTF-8 characters (thanks Grom_PE for initial patch)
Matthew Wild <mwild1@gmail.com>
parents:
454
diff
changeset
|
38 |
3027
ce34cbc10b5b
mod_pastebin: Move result of host detection into a variable to improve readabily
Kim Alvefur <zash@zash.se>
parents:
3008
diff
changeset
|
39 local pastebin_private_messages = module:get_option_boolean("pastebin_private_messages", not is_component); |
445
66ca5e4d9f7b
mod_pastebin: Update to use module:get_option()
Matthew Wild <mwild1@gmail.com>
parents:
444
diff
changeset
|
40 local length_threshold = module:get_option_number("pastebin_threshold", 500); |
66ca5e4d9f7b
mod_pastebin: Update to use module:get_option()
Matthew Wild <mwild1@gmail.com>
parents:
444
diff
changeset
|
41 local line_threshold = module:get_option_number("pastebin_line_threshold", 4); |
446
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
42 local max_summary_length = module:get_option_number("pastebin_summary_length", 150); |
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
43 local html_preview = module:get_option_boolean("pastebin_html_preview", true); |
5 | 44 |
1017
28e3257d2ae5
mod_pastebin: Ensure base URL always has a trailing / (thanks Masin)
Matthew Wild <mwild1@gmail.com>
parents:
934
diff
changeset
|
45 local base_url = module:get_option_string("pastebin_url", module:http_url()):gsub("/$", "").."/"; |
5 | 46 |
24
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
47 -- Seconds a paste should live for in seconds (config is in hours), default 24 hours |
445
66ca5e4d9f7b
mod_pastebin: Update to use module:get_option()
Matthew Wild <mwild1@gmail.com>
parents:
444
diff
changeset
|
48 local expire_after = math.floor(module:get_option_number("pastebin_expire_after", 24) * 3600); |
24
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
49 |
445
66ca5e4d9f7b
mod_pastebin: Update to use module:get_option()
Matthew Wild <mwild1@gmail.com>
parents:
444
diff
changeset
|
50 local trigger_string = module:get_option_string("pastebin_trigger"); |
167
0d37d18ea073
mod_pastebin: Fix trigger_string matching when no trigger is set, and add support for counting lines (pastebin_line_threshold, default: 4)
Matthew Wild <mwild1@gmail.com>
parents:
156
diff
changeset
|
51 trigger_string = (trigger_string and trigger_string .. " "); |
156
b51741b7e86d
mod_pastebin: Optionally bin if message starts with a configurable trigger string
Florian Zeitz <florob@babelmonkeys.de>
parents:
76
diff
changeset
|
52 |
5 | 53 local pastes = {}; |
54 | |
55 local xmlns_xhtmlim = "http://jabber.org/protocol/xhtml-im"; | |
56 local xmlns_xhtml = "http://www.w3.org/1999/xhtml"; | |
57 | |
75
3c7189e26848
mod_pastebin: Rename pastebin_message() to pastebin_text() and make it global so it can be called by other plugins
Matthew Wild <mwild1@gmail.com>
parents:
71
diff
changeset
|
58 function pastebin_text(text) |
5 | 59 local uuid = uuid_new(); |
3140
11087a72990b
mod_pastebin: Remove reference to removed header table
Kim Alvefur <zash@zash.se>
parents:
3139
diff
changeset
|
60 pastes[uuid] = { body = text, time = os_time(), }; |
24
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
61 pastes[#pastes+1] = uuid; |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
62 if not pastes[2] then -- No other pastes, give the timer a kick |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
63 add_task(expire_after, expire_pastes); |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
64 end |
5 | 65 return base_url..uuid; |
66 end | |
67 | |
654
7e444de959bb
mod_pastebin: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents:
565
diff
changeset
|
68 function handle_request(event, pasteid) |
3139
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
69 event.response.headers.content_type = "text/plain; charset=utf-8"; |
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
70 |
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
71 if not pasteid then |
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
72 return "Invalid paste id, perhaps it expired?"; |
5 | 73 end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1017
diff
changeset
|
74 |
5 | 75 --module:log("debug", "Received request, replying: %s", pastes[pasteid].text); |
3139
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
76 local paste = pastes[pasteid]; |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1017
diff
changeset
|
77 |
3139
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
78 if not paste then |
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
79 return "Invalid paste id, perhaps it expired?"; |
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
80 end |
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
81 |
03cda95ae97a
mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents:
3099
diff
changeset
|
82 return paste.body; |
5 | 83 end |
84 | |
3028
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
85 local function replace_tag(s, replacement) |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
86 local once = false; |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
87 s:maptags(function (tag) |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
88 if tag.name == replacement.name and tag.attr.xmlns == replacement.attr.xmlns then |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
89 if not once then |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
90 once = true; |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
91 return replacement; |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
92 else |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
93 return nil; |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
94 end |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
95 end |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
96 return tag; |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
97 end); |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
98 if not once then |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
99 s:add_child(replacement); |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
100 end |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
101 end |
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
102 |
3099
c88f91626e07
mod_pastebin: Off-by-one, the hardest problem known to man
Kim Alvefur <zash@zash.se>
parents:
3045
diff
changeset
|
103 local line_count_pattern = string.rep("[^\n]*\n", line_threshold + 1):sub(1,-2); |
3031
040eaa3844f4
mod_pastebin: Check line length via preconstructed pattern instead of gsub
Kim Alvefur <zash@zash.se>
parents:
3030
diff
changeset
|
104 |
5 | 105 function check_message(data) |
3032
0f2dd6397569
mod_pastebin: Remove unused locals [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3031
diff
changeset
|
106 local stanza = data.stanza; |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1017
diff
changeset
|
107 |
2766
314cebb3071e
mod_pastebin: Check for MUC presence before handling a message.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
108 -- Only check for MUC presence when loaded on a component. |
3027
ce34cbc10b5b
mod_pastebin: Move result of host detection into a variable to improve readabily
Kim Alvefur <zash@zash.se>
parents:
3008
diff
changeset
|
109 if is_component then |
3035
60ca0d03f3e3
mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents:
3034
diff
changeset
|
110 local room = get_room_from_jid(jid_bare(stanza.attr.to)); |
2766
314cebb3071e
mod_pastebin: Check for MUC presence before handling a message.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
111 if not room then return; end |
314cebb3071e
mod_pastebin: Check for MUC presence before handling a message.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
112 |
314cebb3071e
mod_pastebin: Check for MUC presence before handling a message.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
113 local nick = room._jid_nick[stanza.attr.from]; |
314cebb3071e
mod_pastebin: Check for MUC presence before handling a message.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
114 if not nick then return; end |
314cebb3071e
mod_pastebin: Check for MUC presence before handling a message.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
115 end |
314cebb3071e
mod_pastebin: Check for MUC presence before handling a message.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
116 |
4700
f821eeac0e50
mod_pastebin: Fix pasting when <body> is not the first tag (thanks thorsten)
Kim Alvefur <zash@zash.se>
parents:
3868
diff
changeset
|
117 local body = stanza:get_child_text("body"); |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1017
diff
changeset
|
118 |
5 | 119 if not body then return; end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1017
diff
changeset
|
120 |
25
ea59a8d98b03
mod_pastebin: Comment some debug logging on every message
Matthew Wild <mwild1@gmail.com>
parents:
24
diff
changeset
|
121 --module:log("debug", "Body(%s) length: %d", type(body), #(body or "")); |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1017
diff
changeset
|
122 |
3030
4a7f08fe793c
mod_pastebin: Remove redundant check for non-empty body since it returns earlier in that case
Kim Alvefur <zash@zash.se>
parents:
3029
diff
changeset
|
123 if ( #body > length_threshold and utf8_length(body) > length_threshold ) or |
167
0d37d18ea073
mod_pastebin: Fix trigger_string matching when no trigger is set, and add support for counting lines (pastebin_line_threshold, default: 4)
Matthew Wild <mwild1@gmail.com>
parents:
156
diff
changeset
|
124 (trigger_string and body:find(trigger_string, 1, true) == 1) or |
3031
040eaa3844f4
mod_pastebin: Check line length via preconstructed pattern instead of gsub
Kim Alvefur <zash@zash.se>
parents:
3030
diff
changeset
|
125 body:find(line_count_pattern) then |
3029
7878dc2dbf59
mod_pastebin: Avoid using pattern matching facilities for simple prefix removal
Kim Alvefur <zash@zash.se>
parents:
3028
diff
changeset
|
126 if trigger_string and body:sub(1, #trigger_string) == trigger_string then |
7878dc2dbf59
mod_pastebin: Avoid using pattern matching facilities for simple prefix removal
Kim Alvefur <zash@zash.se>
parents:
3028
diff
changeset
|
127 body = body:sub(#trigger_string+1); |
167
0d37d18ea073
mod_pastebin: Fix trigger_string matching when no trigger is set, and add support for counting lines (pastebin_line_threshold, default: 4)
Matthew Wild <mwild1@gmail.com>
parents:
156
diff
changeset
|
128 end |
75
3c7189e26848
mod_pastebin: Rename pastebin_message() to pastebin_text() and make it global so it can be called by other plugins
Matthew Wild <mwild1@gmail.com>
parents:
71
diff
changeset
|
129 local url = pastebin_text(body); |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1017
diff
changeset
|
130 module:log("debug", "Pasted message as %s", url); |
5 | 131 --module:log("debug", " stanza[bodyindex] = %q", tostring( stanza[bodyindex])); |
446
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
132 local summary = (body:sub(1, max_summary_length):gsub(utf8_pattern, drop_invalid_utf8) or ""):match("[^\n]+") or ""; |
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
133 summary = summary:match("^%s*(.-)%s*$"); |
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
134 local summary_prefixed = summary:match("[,:]$"); |
3196
01503000d2f1
mod_pastebin: Make first line and URL more clearly separated
Kim Alvefur <zash@zash.se>
parents:
3140
diff
changeset
|
135 replace_tag(stanza, st.stanza("body"):text(summary .. "\n" .. url)); |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1017
diff
changeset
|
136 |
3034
6e9096b66704
mod_pastebin: Add an OOB tag pointing to the pastebin URL
Kim Alvefur <zash@zash.se>
parents:
3033
diff
changeset
|
137 stanza:add_child(st.stanza("query", { xmlns = "jabber:iq:oob" }):tag("url"):text(url)); |
6e9096b66704
mod_pastebin: Add an OOB tag pointing to the pastebin URL
Kim Alvefur <zash@zash.se>
parents:
3033
diff
changeset
|
138 |
446
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
139 if html_preview then |
513
5e8843a869a3
mod_pastebin: Fix off-by-one in line counting (display issue only)
Matthew Wild <mwild1@gmail.com>
parents:
512
diff
changeset
|
140 local line_count = select(2, body:gsub("\n", "%0")) + 1; |
446
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
141 local link_text = ("[view %spaste (%d line%s)]"):format(summary_prefixed and "" or "rest of ", line_count, line_count == 1 and "" or "s"); |
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
142 local html = st.stanza("html", { xmlns = xmlns_xhtmlim }):tag("body", { xmlns = xmlns_xhtml }); |
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
143 html:tag("p"):text(summary.." "):up(); |
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
144 html:tag("a", { href = url }):text(link_text):up(); |
3028
ded630a87563
mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents:
3027
diff
changeset
|
145 replace_tag(stanza, html); |
446
56f1c29ee7f1
mod_pastebin: Some experimental summary changes
Matthew Wild <mwild1@gmail.com>
parents:
445
diff
changeset
|
146 end |
5 | 147 end |
148 end | |
149 | |
150 module:hook("message/bare", check_message); | |
438
7f0cdde1e42a
mod_pastebin: Add option 'pastebin_private_messages', defaults to false for components and true for other hosts (thanks Kelden/Maranda)
Matthew Wild <mwild1@gmail.com>
parents:
190
diff
changeset
|
151 if pastebin_private_messages then |
7f0cdde1e42a
mod_pastebin: Add option 'pastebin_private_messages', defaults to false for components and true for other hosts (thanks Kelden/Maranda)
Matthew Wild <mwild1@gmail.com>
parents:
190
diff
changeset
|
152 module:hook("message/full", check_message); |
7f0cdde1e42a
mod_pastebin: Add option 'pastebin_private_messages', defaults to false for components and true for other hosts (thanks Kelden/Maranda)
Matthew Wild <mwild1@gmail.com>
parents:
190
diff
changeset
|
153 end |
5 | 154 |
3345
4a12abccdbaf
mod_pastebin: Advertise a disco feature and current thresholds
Kim Alvefur <zash@zash.se>
parents:
3196
diff
changeset
|
155 module:hook("muc-disco#info", function (event) |
4a12abccdbaf
mod_pastebin: Advertise a disco feature and current thresholds
Kim Alvefur <zash@zash.se>
parents:
3196
diff
changeset
|
156 local reply, form, formdata = event.reply, event.form, event.formdata; |
4a12abccdbaf
mod_pastebin: Advertise a disco feature and current thresholds
Kim Alvefur <zash@zash.se>
parents:
3196
diff
changeset
|
157 reply:tag("feature", { var = "https://modules.prosody.im/mod_pastebin" }):up(); |
3868
09e7e880e056
mod_pastebin: Follow XEP-0068 and use Clark notation in disco#info
Kim Alvefur <zash@zash.se>
parents:
3346
diff
changeset
|
158 table.insert(form, { name = "{https://modules.prosody.im/mod_pastebin}max_lines", datatype = "xs:integer" }); |
09e7e880e056
mod_pastebin: Follow XEP-0068 and use Clark notation in disco#info
Kim Alvefur <zash@zash.se>
parents:
3346
diff
changeset
|
159 table.insert(form, { name = "{https://modules.prosody.im/mod_pastebin}max_characters", datatype = "xs:integer" }); |
09e7e880e056
mod_pastebin: Follow XEP-0068 and use Clark notation in disco#info
Kim Alvefur <zash@zash.se>
parents:
3346
diff
changeset
|
160 formdata["{https://modules.prosody.im/mod_pastebin}max_lines"] = tostring(line_threshold); |
09e7e880e056
mod_pastebin: Follow XEP-0068 and use Clark notation in disco#info
Kim Alvefur <zash@zash.se>
parents:
3346
diff
changeset
|
161 formdata["{https://modules.prosody.im/mod_pastebin}max_characters"] = tostring(length_threshold); |
3345
4a12abccdbaf
mod_pastebin: Advertise a disco feature and current thresholds
Kim Alvefur <zash@zash.se>
parents:
3196
diff
changeset
|
162 end); |
4a12abccdbaf
mod_pastebin: Advertise a disco feature and current thresholds
Kim Alvefur <zash@zash.se>
parents:
3196
diff
changeset
|
163 |
24
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
164 function expire_pastes(time) |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
165 time = time or os_time(); -- COMPAT with 0.5 |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
166 if pastes[1] then |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
167 pastes[pastes[1]] = nil; |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
168 t_remove(pastes, 1); |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
169 if pastes[1] then |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
170 return (expire_after - (time - pastes[pastes[1]].time)) + 1; |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
171 end |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
172 end |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
173 end |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
174 |
72bcc0475e2f
mod_pastebin: Expire pastes after 'pastebin_expire_after' hours, 24 by default
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
175 |
654
7e444de959bb
mod_pastebin: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents:
565
diff
changeset
|
176 module:provides("http", { |
7e444de959bb
mod_pastebin: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents:
565
diff
changeset
|
177 route = { |
7e444de959bb
mod_pastebin: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents:
565
diff
changeset
|
178 ["GET /*"] = handle_request; |
7e444de959bb
mod_pastebin: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents:
565
diff
changeset
|
179 }; |
7e444de959bb
mod_pastebin: Update to the new HTTP API
Kim Alvefur <zash@zash.se>
parents:
565
diff
changeset
|
180 }); |
454
3f101f7a26d0
mod_pastebin: Preserve pastes through a reload
Matthew Wild <mwild1@gmail.com>
parents:
446
diff
changeset
|
181 |
517
f866325305ed
mod_pastebin: Make last commit work (also set on restore)
Matthew Wild <mwild1@gmail.com>
parents:
516
diff
changeset
|
182 local function set_pastes_metatable() |
3033
b2b129f699ed
mod_pastebin: Silence some warnings [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3032
diff
changeset
|
183 -- luacheck: ignore 212/pastes 431/pastes |
516
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
184 if expire_after == 0 then |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
185 local dm = require "util.datamanager"; |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
186 setmetatable(pastes, { |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
187 __index = function (pastes, id) |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
188 if type(id) == "string" then |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
189 return dm.load(id, module.host, "pastebin"); |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
190 end |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
191 end; |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
192 __newindex = function (pastes, id, data) |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
193 if type(id) == "string" then |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
194 dm.store(id, module.host, "pastebin", data); |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
195 end |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
196 end; |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
197 }); |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
198 else |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
199 setmetatable(pastes, nil); |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
200 end |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
201 end |
3d3687fef751
mod_pastebin: Fix issue with metatable not being set when a reload changes expires_after to 0
Matthew Wild <mwild1@gmail.com>
parents:
514
diff
changeset
|
202 |
517
f866325305ed
mod_pastebin: Make last commit work (also set on restore)
Matthew Wild <mwild1@gmail.com>
parents:
516
diff
changeset
|
203 module.load = set_pastes_metatable; |
f866325305ed
mod_pastebin: Make last commit work (also set on restore)
Matthew Wild <mwild1@gmail.com>
parents:
516
diff
changeset
|
204 |
454
3f101f7a26d0
mod_pastebin: Preserve pastes through a reload
Matthew Wild <mwild1@gmail.com>
parents:
446
diff
changeset
|
205 function module.save() |
3f101f7a26d0
mod_pastebin: Preserve pastes through a reload
Matthew Wild <mwild1@gmail.com>
parents:
446
diff
changeset
|
206 return { pastes = pastes }; |
3f101f7a26d0
mod_pastebin: Preserve pastes through a reload
Matthew Wild <mwild1@gmail.com>
parents:
446
diff
changeset
|
207 end |
3f101f7a26d0
mod_pastebin: Preserve pastes through a reload
Matthew Wild <mwild1@gmail.com>
parents:
446
diff
changeset
|
208 |
3f101f7a26d0
mod_pastebin: Preserve pastes through a reload
Matthew Wild <mwild1@gmail.com>
parents:
446
diff
changeset
|
209 function module.restore(data) |
3f101f7a26d0
mod_pastebin: Preserve pastes through a reload
Matthew Wild <mwild1@gmail.com>
parents:
446
diff
changeset
|
210 pastes = data.pastes or pastes; |
517
f866325305ed
mod_pastebin: Make last commit work (also set on restore)
Matthew Wild <mwild1@gmail.com>
parents:
516
diff
changeset
|
211 set_pastes_metatable(); |
454
3f101f7a26d0
mod_pastebin: Preserve pastes through a reload
Matthew Wild <mwild1@gmail.com>
parents:
446
diff
changeset
|
212 end |