mod_debug_omemo/mod_debug_omemo.lua
author Kim Alvefur <zash@zash.se>
Mon, 13 Sep 2021 21:47:01 +0200
changeset 4690 76af816739f3
parent 4689 07b6f444bafb
child 4691 41ddb782320c
permissions -rw-r--r--
mod_debug_omemo: Fix traceback in case of zero devices Turns out ipairs(nil) in Lua 5.4 does not throw until the first iterator.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4686
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
local array = require "util.array";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
local jid = require "util.jid";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
local set = require "util.set";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
local st = require "util.stanza";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
local url_escape = require "util.http".urlencode;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
local base_url = "https://"..module.host.."/";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
local render_html_template = require"util.interpolation".new("%b{}", st.xml_escape, {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
	urlescape = url_escape;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
	lower = string.lower;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
	classname = function (s) return (s:gsub("%W+", "-")); end;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
	relurl = function (s)
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
		if s:match("^%w+://") then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
			return s;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
		end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
		return base_url.."/"..s;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
	end;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
});
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
local render_url = require "util.interpolation".new("%b{}", url_escape, {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
	urlescape = url_escape;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
	noscheme = function (url)
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
		return (url:gsub("^[^:]+:", ""));
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
	end;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
});
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
local mod_pep = module:depends("pep");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
local mam = module:open_store("archive", "archive");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
local function get_user_omemo_info(username)
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
	local everything_valid = true;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
	local any_device = false;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
	local omemo_status = {};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
	local omemo_devices;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
	local pep_service = mod_pep.get_pep_service(username);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
	if pep_service and pep_service.nodes then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
		local ok, _, device_list = pep_service:get_last_item("eu.siacs.conversations.axolotl.devicelist", true);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
		if ok and device_list then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
			device_list = device_list:get_child("list", "eu.siacs.conversations.axolotl");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
		end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
		if device_list then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
			omemo_devices = {};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
			for device_entry in device_list:childtags("device") do
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
				any_device = true;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
				local device_info = {};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
				local device_id = tonumber(device_entry.attr.id or "");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
				if device_id then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
					device_info.id = device_id;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
					local bundle_id = ("eu.siacs.conversations.axolotl.bundles:%d"):format(device_id);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
					local have_bundle, _, bundle = pep_service:get_last_item(bundle_id, true);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
					if have_bundle and bundle and bundle:get_child("bundle", "eu.siacs.conversations.axolotl") then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
						device_info.have_bundle = true;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
						local config_ok, bundle_config = pep_service:get_node_config(bundle_id, true);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
						if config_ok and bundle_config then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
							device_info.bundle_config = bundle_config;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
							if bundle_config.max_items == 1
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
							and bundle_config.access_model == "open"
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
							and bundle_config.persist_items == true
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
							and bundle_config.publish_model == "publishers" then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
								device_info.valid = true;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
							end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
						end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
					end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
				end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
				if device_info.valid == nil then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
					device_info.valid = false;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
					everything_valid = false;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
				end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
				table.insert(omemo_devices, device_info);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
			end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
			local config_ok, list_config = pep_service:get_node_config("eu.siacs.conversations.axolotl.devicelist", true);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
			if config_ok and list_config then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
				omemo_status.config = list_config;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
				if list_config.max_items == 1
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
				and list_config.access_model == "open"
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
				and list_config.persist_items == true
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
				and list_config.publish_model == "publishers" then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
					omemo_status.config_valid = true;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
				end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
			end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
			if omemo_status.config_valid == nil then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
				omemo_status.config_valid = false;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
				everything_valid = false;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
			end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
		end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
	omemo_status.valid = everything_valid and any_device;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
	return {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
		status = omemo_status;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
		devices = omemo_devices;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
	};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    95
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    96
local access_model_text = {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    97
	open = "Public";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    98
	whitelist = "Private";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    99
	roster = "Contacts only";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
	presence = "Contacts only";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   103
local function render_message(event, path)
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   104
	local username, message_id = path:match("^([^/]+)/(.+)$");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
	if not username then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
		return 400;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   107
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   108
	local message;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   109
	for _, result in mam:find(username, { key = message_id }) do
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
		message = result;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   111
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   112
	if not message then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   113
		return 404;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   116
	local user_omemo_status = get_user_omemo_info(username);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   117
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   118
	local user_rids = set.new(array.pluck(user_omemo_status.devices or {}, "id")) / tostring;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   119
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   120
	local message_omemo_header = message:find("{eu.siacs.conversations.axolotl}encrypted/header");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   121
	local message_rids = set.new();
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   122
	local rid_info = {};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   123
	if message_omemo_header then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   124
		for key_el in message_omemo_header:childtags("key") do
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
			local rid = key_el.attr.rid;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   126
			if rid then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   127
				message_rids:add(rid);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   128
				local prekey = key_el.attr.prekey;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   129
				rid_info = {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   130
					prekey = prekey and (prekey == "1" or prekey:lower() == "true");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   131
				};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   132
			end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   133
		end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   134
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   135
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   136
	local rids = user_rids + message_rids;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   137
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   138
	local direction = jid.bare(message.attr.to) == (username.."@"..module.host) and "incoming" or "outgoing";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   139
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   140
	local is_encrypted = not not message_omemo_header;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   141
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   142
	local sender_id = message_omemo_header and message_omemo_header.attr.sid or nil;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   143
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   144
	local f = module:load_resource("view.tpl.html");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   145
	if not f then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   146
		return 500;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   147
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   148
	local tpl = f:read("*a");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   149
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
	local data = { user = username, rids = {} };
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   151
	for rid in rids do
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   152
		data.rids[rid] = {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   153
			status = message_rids:contains(rid) and "Encrypted" or user_rids:contains(rid) and "Missing" or nil;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   154
			prekey = rid_info.prekey;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   155
		};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   156
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   157
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   158
	data.message = {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   159
		type = message.attr.type or "normal";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   160
		direction = direction;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   161
		encryption = is_encrypted and "encrypted" or "unencrypted";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   162
	};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   163
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   164
	data.omemo = {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   165
		sender_id = sender_id;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   166
		status = user_omemo_status.status.valid and "no known issues" or "problems";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   167
	};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   168
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   169
	data.omemo.devices = {};
4690
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   170
	if user_omemo_status.devices then
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   171
		for _, device_info in ipairs(user_omemo_status.devices) do
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   172
			data.omemo.devices[("%d"):format(device_info.id)] = {
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   173
				status = device_info.valid and "OK" or "Problem";
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   174
				bundle = device_info.have_bundle and "Published" or "Missing";
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   175
				access_model = access_model_text[device_info.bundle_config and device_info.bundle_config.access_model or nil];
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   176
			};
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   177
		end
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   178
	else
76af816739f3 mod_debug_omemo: Fix traceback in case of zero devices
Kim Alvefur <zash@zash.se>
parents: 4689
diff changeset
   179
		data.omemo.devices[false] = { status = "No devices", };
4686
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   180
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   181
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   182
	event.response.headers.content_type = "text/html; charset=utf-8";
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   183
	return render_html_template(tpl, data);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   184
end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   185
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   186
local function check_omemo_fallback(event)
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   187
	local message = event.stanza;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   188
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   189
	local message_omemo_header = message:find("{eu.siacs.conversations.axolotl}encrypted/header");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   190
	if not message_omemo_header then return; end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   191
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   192
	local to_bare = jid.bare(message.attr.to);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   193
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   194
	local archive_stanza_id;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   195
	for stanza_id_tag in message:childtags("stanza-id", "urn:xmpp:sid:0") do
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   196
		if stanza_id_tag.attr.by == to_bare then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   197
			archive_stanza_id = stanza_id_tag.attr.id;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   198
		end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   199
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   200
	if not archive_stanza_id then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   201
		return;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   202
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   203
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   204
	local debug_url = render_url(module:http_url().."/view/{username}/{message_id}", {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   205
		username = jid.node(to_bare);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   206
		message_id = archive_stanza_id;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   207
	});
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   208
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   209
	local body = message:get_child("body");
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   210
	if not body then
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   211
		body = st.stanza("body")
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   212
			:text("This message is encrypted using OMEMO, but could not be decrypted by your device.\nFor more information see: "..debug_url);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   213
		message:reset():add_child(body);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   214
	else
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   215
		body:text("\n\nOMEMO debug information: "..debug_url);
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   216
	end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   217
end
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   218
4689
07b6f444bafb mod_debug_omemo: Adjust priority to act after mod_mam archived
Kim Alvefur <zash@zash.se>
parents: 4686
diff changeset
   219
module:hook("message/bare", check_omemo_fallback, -0.5);
07b6f444bafb mod_debug_omemo: Adjust priority to act after mod_mam archived
Kim Alvefur <zash@zash.se>
parents: 4686
diff changeset
   220
module:hook("message/full", check_omemo_fallback, -0.5);
4686
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   221
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   222
module:depends("http")
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   223
module:provides("http", {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   224
	route = {
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   225
		["GET /view/*"] = render_message;
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   226
	};
e4e5474420e6 mod_debug_omemo: OMEMO debugging tool
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   227
});