mod_pastebin/mod_pastebin.lua
author Matthew Wild <mwild1@gmail.com>
Tue, 18 Jan 2022 17:01:18 +0000
changeset 4880 0f5f2d4475b9
parent 4704 f821eeac0e50
child 5876 8aec430ba205
permissions -rw-r--r--
mod_http_xep227: Add support for import via APIs rather than direct store manipulation In particular this transitions PEP nodes and data to be imported via mod_pep's APIs, fixing issues with importing at runtime while PEP data may already be live in RAM. Next obvious candidate for this approach is rosters, so clients get immediate roster pushes and other special handling (such as emitting subscribes to reach the desired subscription state).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     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;
3036
0f2dd6397569 mod_pastebin: Remove unused locals [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3035
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;
2770
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;
3039
60ca0d03f3e3 mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
     9
60ca0d03f3e3 mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
    10
local function get_room_from_jid() end;
3031
ce34cbc10b5b mod_pastebin: Move result of host detection into a variable to improve readabily
Kim Alvefur <zash@zash.se>
parents: 3012
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: 3012
diff changeset
    12
if is_component then
3039
60ca0d03f3e3 mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3038
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: 3038
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: 3038
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: 3038
diff changeset
    16
		function (jid)
60ca0d03f3e3 mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
    17
			return muc_rooms[jid];
60ca0d03f3e3 mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
    18
		end
3012
26fe44c68791 mod_pastebin: Fix loading on normal hosts (thanks ppmathis)
Kim Alvefur <zash@zash.se>
parents: 2770
diff changeset
    19
end
5
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    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
3031
ce34cbc10b5b mod_pastebin: Move result of host detection into a variable to improve readabily
Kim Alvefur <zash@zash.se>
parents: 3012
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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
local pastes = {};
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
local xmlns_xhtmlim = "http://jabber.org/protocol/xhtml-im";
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
local xmlns_xhtml = "http://www.w3.org/1999/xhtml";
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
	local uuid = uuid_new();
3144
11087a72990b mod_pastebin: Remove reference to removed header table
Kim Alvefur <zash@zash.se>
parents: 3143
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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
	return base_url..uuid;
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
end
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    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)
3143
03cda95ae97a mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents: 3103
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: 3103
diff changeset
    70
03cda95ae97a mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents: 3103
diff changeset
    71
	if not pasteid then
03cda95ae97a mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents: 3103
diff changeset
    72
		return "Invalid paste id, perhaps it expired?";
5
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
	end
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1017
diff changeset
    74
5
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
	--module:log("debug", "Received request, replying: %s", pastes[pasteid].text);
3143
03cda95ae97a mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents: 3103
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
3143
03cda95ae97a mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents: 3103
diff changeset
    78
	if not paste then
03cda95ae97a mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents: 3103
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: 3103
diff changeset
    80
	end
03cda95ae97a mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents: 3103
diff changeset
    81
03cda95ae97a mod_pastebin: Prevent header table form being mutated
Kim Alvefur <zash@zash.se>
parents: 3103
diff changeset
    82
	return paste.body;
5
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
end
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
3032
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
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: 3031
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: 3031
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: 3031
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: 3031
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: 3031
diff changeset
    90
				once = true;
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
    91
				return replacement;
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
    92
			else
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
    93
				return nil;
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
    94
			end
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
    95
		end
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
    96
		return tag;
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
    97
	end);
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
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: 3031
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: 3031
diff changeset
   100
	end
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
   101
end
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
diff changeset
   102
3103
c88f91626e07 mod_pastebin: Off-by-one, the hardest problem known to man
Kim Alvefur <zash@zash.se>
parents: 3049
diff changeset
   103
local line_count_pattern = string.rep("[^\n]*\n", line_threshold + 1):sub(1,-2);
3035
040eaa3844f4 mod_pastebin: Check line length via preconstructed pattern instead of gsub
Kim Alvefur <zash@zash.se>
parents: 3034
diff changeset
   104
5
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
function check_message(data)
3036
0f2dd6397569 mod_pastebin: Remove unused locals [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3035
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
2770
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.
3031
ce34cbc10b5b mod_pastebin: Move result of host detection into a variable to improve readabily
Kim Alvefur <zash@zash.se>
parents: 3012
diff changeset
   109
	if is_component then
3039
60ca0d03f3e3 mod_pastebin: Support the new MUC API in Prosody trunk
Kim Alvefur <zash@zash.se>
parents: 3038
diff changeset
   110
		local room = get_room_from_jid(jid_bare(stanza.attr.to));
2770
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
4704
f821eeac0e50 mod_pastebin: Fix pasting when <body> is not the first tag (thanks thorsten)
Kim Alvefur <zash@zash.se>
parents: 3872
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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   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
3034
4a7f08fe793c mod_pastebin: Remove redundant check for non-empty body since it returns earlier in that case
Kim Alvefur <zash@zash.se>
parents: 3033
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
3035
040eaa3844f4 mod_pastebin: Check line length via preconstructed pattern instead of gsub
Kim Alvefur <zash@zash.se>
parents: 3034
diff changeset
   125
		body:find(line_count_pattern) then
3033
7878dc2dbf59 mod_pastebin: Avoid using pattern matching facilities for simple prefix removal
Kim Alvefur <zash@zash.se>
parents: 3032
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: 3032
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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   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("[,:]$");
3200
01503000d2f1 mod_pastebin: Make first line and URL more clearly separated
Kim Alvefur <zash@zash.se>
parents: 3144
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
3038
6e9096b66704 mod_pastebin: Add an OOB tag pointing to the pastebin URL
Kim Alvefur <zash@zash.se>
parents: 3037
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: 3037
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();
3032
ded630a87563 mod_pastebin: Replace tags using :maptags API instead of hacky direct manipulation
Kim Alvefur <zash@zash.se>
parents: 3031
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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   147
	end
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   148
end
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   149
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   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
9c1c6c5344dc mod_pastebin: Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   154
3349
4a12abccdbaf mod_pastebin: Advertise a disco feature and current thresholds
Kim Alvefur <zash@zash.se>
parents: 3200
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: 3200
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: 3200
diff changeset
   157
	reply:tag("feature", { var = "https://modules.prosody.im/mod_pastebin" }):up();
3872
09e7e880e056 mod_pastebin: Follow XEP-0068 and use Clark notation in disco#info
Kim Alvefur <zash@zash.se>
parents: 3350
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: 3350
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: 3350
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: 3350
diff changeset
   161
	formdata["{https://modules.prosody.im/mod_pastebin}max_characters"] = tostring(length_threshold);
3349
4a12abccdbaf mod_pastebin: Advertise a disco feature and current thresholds
Kim Alvefur <zash@zash.se>
parents: 3200
diff changeset
   162
end);
4a12abccdbaf mod_pastebin: Advertise a disco feature and current thresholds
Kim Alvefur <zash@zash.se>
parents: 3200
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()
3037
b2b129f699ed mod_pastebin: Silence some warnings [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3036
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